From 36fc50e1a8b95202d5be2ede4ac21fb52dfada5a Mon Sep 17 00:00:00 2001 From: Andrius Peleckas <32540208+sanctum32@users.noreply.github.com> Date: Fri, 26 Nov 2021 04:46:12 +0200 Subject: [PATCH] fix(Core/Formations): fixed possible finite loop related to GROUP_AI_FLAG_EVADE_TOGETHER (#9279) --- .../rev_1637549244654096226.sql | 3 +++ src/server/game/AI/CreatureAI.cpp | 9 ++++---- .../game/Entities/Creature/CreatureGroups.cpp | 22 ++++++------------- 3 files changed, 14 insertions(+), 20 deletions(-) create mode 100644 data/sql/updates/pending_db_world/rev_1637549244654096226.sql diff --git a/data/sql/updates/pending_db_world/rev_1637549244654096226.sql b/data/sql/updates/pending_db_world/rev_1637549244654096226.sql new file mode 100644 index 000000000..f3a5b7a62 --- /dev/null +++ b/data/sql/updates/pending_db_world/rev_1637549244654096226.sql @@ -0,0 +1,3 @@ +INSERT INTO `version_db_world` (`sql_rev`) VALUES ('1637549244654096226'); + +UPDATE `creature_formations` SET `groupAI` = `groupAI`|4 WHERE `leaderGUID` = 202212; diff --git a/src/server/game/AI/CreatureAI.cpp b/src/server/game/AI/CreatureAI.cpp index 4e2c04e52..1d523f334 100644 --- a/src/server/game/AI/CreatureAI.cpp +++ b/src/server/game/AI/CreatureAI.cpp @@ -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; } diff --git a/src/server/game/Entities/Creature/CreatureGroups.cpp b/src/server/game/Entities/Creature/CreatureGroups.cpp index 783a10788..973809c5e 100644 --- a/src/server/game/Entities/Creature/CreatureGroups.cpp +++ b/src/server/game/Entities/Creature/CreatureGroups.cpp @@ -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::GROUP_AI_FLAG_EVADE_TOGETHER))) { continue; } - if (pMember->IsInEvadeMode()) + if (pMember->IsAIEnabled) { - continue; - } - - if (itr.second.HasGroupFlag(std::underlying_type_t(GroupAIFlags::GROUP_AI_FLAG_EVADE_TOGETHER))) - { - if (pMember->IsAIEnabled) + if (CreatureAI* pMemberAI = pMember->AI()) { - if (CreatureAI* pMemberAI = pMember->AI()) - { - pMemberAI->EnterEvadeMode(); - } + pMemberAI->EnterEvadeMode(); } } }