Fix Crashs Formation Arrow (#708)

* Fix crash in formations

* Crash fix: Arrow formation

* Crash fix: Arrow formation looking for member information in different maps/instances.

* Loop fix: arrow formation

* Crash fix: Arrow formation when group isn't all in 1 place.

* Fix Build
This commit is contained in:
EricksOliveira
2024-11-14 14:23:07 +00:00
committed by GitHub
parent ff5ad54f91
commit af0a6b73e1
2 changed files with 16 additions and 10 deletions

View File

@@ -22,10 +22,9 @@ WorldLocation ArrowFormation::GetLocationInternal()
float offset = 0.f; float offset = 0.f;
Player* master = botAI->GetMaster(); Player* master = botAI->GetMaster();
if (!master) if (!botAI->IsSafe(master))
{
return Formation::NullLocation; return Formation::NullLocation;
}
float orientation = master->GetOrientation(); float orientation = master->GetOrientation();
MultiLineUnitPlacer placer(orientation); MultiLineUnitPlacer placer(orientation);
@@ -44,6 +43,9 @@ WorldLocation ArrowFormation::GetLocationInternal()
healers.PlaceUnits(&placer); healers.PlaceUnits(&placer);
healers.Move(-cos(orientation) * offset, -sin(orientation) * offset); healers.Move(-cos(orientation) * offset, -sin(orientation) * offset);
if (!masterUnit || !botUnit)
return Formation::NullLocation;
float x = master->GetPositionX() - masterUnit->GetX() + botUnit->GetX(); float x = master->GetPositionX() - masterUnit->GetX() + botUnit->GetX();
float y = master->GetPositionY() - masterUnit->GetY() + botUnit->GetY(); float y = master->GetPositionY() - masterUnit->GetY() + botUnit->GetY();
float z = master->GetPositionZ() + master->GetHoverHeight(); float z = master->GetPositionZ() + master->GetHoverHeight();
@@ -89,14 +91,15 @@ void ArrowFormation::FillSlotsExceptMaster()
while (gref) while (gref)
{ {
Player* member = gref->GetSource(); Player* member = gref->GetSource();
if (botAI->IsSafe(member))
if (member == bot) {
FindSlot(member)->AddLast(botUnit = new FormationUnit(index, false)); if (member == bot)
else if (member != botAI->GetMaster()) FindSlot(member)->AddLast(botUnit = new FormationUnit(index, false));
FindSlot(member)->AddLast(new FormationUnit(index, false)); else if (member != botAI->GetMaster())
FindSlot(member)->AddLast(new FormationUnit(index, false));
++index;
}
gref = gref->next(); gref = gref->next();
++index;
} }
} }

View File

@@ -437,6 +437,7 @@ float Formation::GetFollowAngle()
{ {
if (Player* member = ref->GetSource()) if (Player* member = ref->GetSource())
{ {
if (!member || member == bot || !member->IsAlive() || bot->GetMapId() != member->GetMapId()) continue;
if (member != master && !botAI->IsTank(member) && !botAI->IsHeal(member)) if (member != master && !botAI->IsTank(member) && !botAI->IsHeal(member))
{ {
roster.insert(roster.begin() + roster.size() / 2, member); roster.insert(roster.begin() + roster.size() / 2, member);
@@ -448,6 +449,7 @@ float Formation::GetFollowAngle()
{ {
if (Player* member = ref->GetSource()) if (Player* member = ref->GetSource())
{ {
if (!member || member == bot || !member->IsAlive() || bot->GetMapId() != member->GetMapId()) continue;
if (member != master && botAI->IsHeal(member)) if (member != master && botAI->IsHeal(member))
{ {
roster.insert(roster.begin() + roster.size() / 2, member); roster.insert(roster.begin() + roster.size() / 2, member);
@@ -460,6 +462,7 @@ float Formation::GetFollowAngle()
{ {
if (Player* member = ref->GetSource()) if (Player* member = ref->GetSource())
{ {
if (!member || member == bot || !member->IsAlive() || bot->GetMapId() != member->GetMapId()) continue;
if (member != master && botAI->IsTank(member)) if (member != master && botAI->IsTank(member))
{ {
if (left) if (left)