fix(Core/Formations): fixed possible finite loop related to GROUP_AI_FLAG_EVADE_TOGETHER (#9279)

This commit is contained in:
Andrius Peleckas
2021-11-26 04:46:12 +02:00
committed by GitHub
parent 4942012db9
commit 36fc50e1a8
3 changed files with 14 additions and 20 deletions

View File

@@ -0,0 +1,3 @@
INSERT INTO `version_db_world` (`sql_rev`) VALUES ('1637549244654096226');
UPDATE `creature_formations` SET `groupAI` = `groupAI`|4 WHERE `leaderGUID` = 202212;

View File

@@ -314,15 +314,14 @@ bool CreatureAI::_EnterEvadeMode()
me->SetLastDamagedTime(0); me->SetLastDamagedTime(0);
me->SetCannotReachTarget(false); me->SetCannotReachTarget(false);
if (CreatureGroup* formation = me->GetFormation())
{
formation->MemberEvaded(me);
}
if (me->IsInEvadeMode()) if (me->IsInEvadeMode())
{ {
return false; return false;
} }
else if (CreatureGroup* formation = me->GetFormation())
{
formation->MemberEvaded(me);
}
return true; return true;
} }

View File

@@ -237,31 +237,23 @@ void CreatureGroup::MemberEvaded(Creature* member)
for (auto const& itr : m_members) for (auto const& itr : m_members)
{ {
Creature* pMember = itr.first; Creature* pMember = itr.first;
// This should never happen
//Skip one check if (!pMember)
if (pMember == member)
{ {
continue; continue;
} }
if (!pMember->IsAlive()) if (pMember == member || pMember->isDead() || pMember->IsInEvadeMode() || !pMember->IsInCombat() ||
!itr.second.HasGroupFlag(std::underlying_type_t<GroupAIFlags>(GroupAIFlags::GROUP_AI_FLAG_EVADE_TOGETHER)))
{ {
continue; continue;
} }
if (pMember->IsInEvadeMode()) if (pMember->IsAIEnabled)
{ {
continue; if (CreatureAI* pMemberAI = pMember->AI())
}
if (itr.second.HasGroupFlag(std::underlying_type_t<GroupAIFlags>(GroupAIFlags::GROUP_AI_FLAG_EVADE_TOGETHER)))
{
if (pMember->IsAIEnabled)
{ {
if (CreatureAI* pMemberAI = pMember->AI()) pMemberAI->EnterEvadeMode();
{
pMemberAI->EnterEvadeMode();
}
} }
} }
} }