fix(Core/Formations): Implemented GROUP_AI_FLAG_RESPAWN_ON_EVADE flag. (#11512)

Fixes #11364
This commit is contained in:
UltraNix
2022-04-25 14:24:46 +02:00
committed by GitHub
parent 7dc494bd55
commit 54ebdfcfc1
3 changed files with 34 additions and 13 deletions

View File

@@ -0,0 +1,3 @@
INSERT INTO `version_db_world` (`sql_rev`) VALUES ('1650793587179586100');
UPDATE `creature_formations` SET `groupAI`=`groupAI`|0x8 WHERE `leaderGuid` IN (84634,84648);

View File

@@ -229,7 +229,7 @@ void CreatureGroup::MemberAttackStart(Creature* member, Unit* target)
void CreatureGroup::MemberEvaded(Creature* member) void CreatureGroup::MemberEvaded(Creature* member)
{ {
uint8 const groupAI = sFormationMgr->CreatureGroupMap[member->GetSpawnId()].groupAI; uint8 const groupAI = sFormationMgr->CreatureGroupMap[member->GetSpawnId()].groupAI;
if (!(groupAI & std::underlying_type_t<GroupAIFlags>(GroupAIFlags::GROUP_AI_FLAG_EVADE_TOGETHER))) if (!(groupAI & std::underlying_type_t<GroupAIFlags>(GroupAIFlags::GROUP_AI_FLAG_EVADE_MASK)))
{ {
return; return;
} }
@@ -243,18 +243,34 @@ void CreatureGroup::MemberEvaded(Creature* member)
continue; continue;
} }
if (pMember == member || pMember->isDead() || pMember->IsInEvadeMode() || !pMember->IsInCombat() || if (pMember == member || pMember->IsInEvadeMode() || !itr.second.HasGroupFlag(std::underlying_type_t<GroupAIFlags>(GroupAIFlags::GROUP_AI_FLAG_EVADE_MASK)))
!itr.second.HasGroupFlag(std::underlying_type_t<GroupAIFlags>(GroupAIFlags::GROUP_AI_FLAG_EVADE_TOGETHER)))
{ {
continue; continue;
} }
if (pMember->IsAIEnabled) if (itr.second.HasGroupFlag(std::underlying_type_t<GroupAIFlags>(GroupAIFlags::GROUP_AI_FLAG_EVADE_TOGETHER)))
{ {
if (CreatureAI* pMemberAI = pMember->AI()) if (!pMember->IsAlive() || !pMember->IsInCombat())
{ {
pMemberAI->EnterEvadeMode(); continue;
} }
if (pMember->IsAIEnabled)
{
if (CreatureAI* pMemberAI = pMember->AI())
{
pMemberAI->EnterEvadeMode();
}
}
}
else
{
if (pMember->IsAlive())
{
continue;
}
pMember->Respawn();
} }
} }
} }

View File

@@ -31,16 +31,18 @@ enum class GroupAIFlags : uint16
GROUP_AI_FLAG_MEMBER_ASSIST_LEADER = 0x001, GROUP_AI_FLAG_MEMBER_ASSIST_LEADER = 0x001,
GROUP_AI_FLAG_LEADER_ASSIST_MEMBER = 0x002, GROUP_AI_FLAG_LEADER_ASSIST_MEMBER = 0x002,
GROUP_AI_FLAG_EVADE_TOGETHER = 0x004, GROUP_AI_FLAG_EVADE_TOGETHER = 0x004,
//GROUP_AI_FLAG_UNK2 = 0x008, GROUP_AI_FLAG_RESPAWN_ON_EVADE = 0x008,
//GROUP_AI_FLAG_UNK3 = 0x010, //GROUP_AI_FLAG_UNK3 = 0x010,
//GROUP_AI_FLAG_UNK4 = 0x020, //GROUP_AI_FLAG_UNK4 = 0x020,
//GROUP_AI_FLAG_UNK5 = 0x040, //GROUP_AI_FLAG_UNK5 = 0x040,
//GROUP_AI_FLAG_UNK6 = 0x080, //GROUP_AI_FLAG_UNK6 = 0x080,
//GROUP_AI_FLAG_UNK7 = 0x100, //GROUP_AI_FLAG_UNK7 = 0x100,
GROUP_AI_FLAG_FOLLOW_LEADER = 0x200, GROUP_AI_FLAG_FOLLOW_LEADER = 0x200,
GROUP_AI_FLAG_EVADE_MASK = GROUP_AI_FLAG_EVADE_TOGETHER | GROUP_AI_FLAG_RESPAWN_ON_EVADE,
// Used to verify valid and usable flags // Used to verify valid and usable flags
GROUP_AI_FLAG_SUPPORTED = GROUP_AI_FLAG_MEMBER_ASSIST_LEADER | GROUP_AI_FLAG_LEADER_ASSIST_MEMBER | GROUP_AI_FLAG_EVADE_TOGETHER | GROUP_AI_FLAG_FOLLOW_LEADER GROUP_AI_FLAG_SUPPORTED = GROUP_AI_FLAG_MEMBER_ASSIST_LEADER | GROUP_AI_FLAG_LEADER_ASSIST_MEMBER | GROUP_AI_FLAG_EVADE_MASK | GROUP_AI_FLAG_FOLLOW_LEADER
}; };
struct FormationInfo struct FormationInfo