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->SetCannotReachTarget(false);
if (CreatureGroup* formation = me->GetFormation())
{
formation->MemberEvaded(me);
}
if (me->IsInEvadeMode())
{
return false;
}
else if (CreatureGroup* formation = me->GetFormation())
{
formation->MemberEvaded(me);
}
return true;
}

View File

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