From d693bdb95dfd7a4c84f3c04813aaa713ece24dfd Mon Sep 17 00:00:00 2001 From: Rushor Date: Sun, 25 Jun 2017 12:29:05 +0200 Subject: [PATCH] Core/Creature: Implement Mangos GroupAI flags (allows formation without following) (#18733) --- sql/updates/world/3.3.5/2017_12_18_00_world.sql | 4 ++++ src/server/game/Entities/Creature/CreatureGroups.cpp | 8 +++----- src/server/game/Entities/Creature/CreatureGroups.h | 8 ++++++++ 3 files changed, 15 insertions(+), 5 deletions(-) create mode 100644 sql/updates/world/3.3.5/2017_12_18_00_world.sql diff --git a/sql/updates/world/3.3.5/2017_12_18_00_world.sql b/sql/updates/world/3.3.5/2017_12_18_00_world.sql new file mode 100644 index 00000000000..6741d0c96bc --- /dev/null +++ b/sql/updates/world/3.3.5/2017_12_18_00_world.sql @@ -0,0 +1,4 @@ +-- +UPDATE `creature_formations` SET `groupAI`=7 WHERE `groupAI`=2; -- members attack and members follow the leader +UPDATE `creature_formations` SET `groupAI`=4 WHERE `groupAI`=0; -- members follow the leader +UPDATE `creature_formations` SET `groupAI`=5 WHERE `groupAI`=1; -- The members aggroes if the leader aggroes and members follow the leader diff --git a/src/server/game/Entities/Creature/CreatureGroups.cpp b/src/server/game/Entities/Creature/CreatureGroups.cpp index 1abbd1c6f6e..fc60d3b3bec 100644 --- a/src/server/game/Entities/Creature/CreatureGroups.cpp +++ b/src/server/game/Entities/Creature/CreatureGroups.cpp @@ -176,9 +176,6 @@ void CreatureGroup::MemberAttackStart(Creature* member, Unit* target) if (!groupAI) return; - if (groupAI == 1 && member != m_leader) - return; - for (CreatureGroupMemberType::iterator itr = m_members.begin(); itr != m_members.end(); ++itr) { if (m_leader) // avoid crash if leader was killed and reset. @@ -196,7 +193,7 @@ void CreatureGroup::MemberAttackStart(Creature* member, Unit* target) if (other->GetVictim()) continue; - if (other->IsValidAttackTarget(target)) + if (((other != m_leader && groupAI & FLAG_AGGRO_ON_AGGRO) || (other == m_leader && groupAI & FLAG_TO_AGGRO_ON_AGGRO)) && other->IsValidAttackTarget(target)) other->AI()->AttackStart(target); } } @@ -229,7 +226,8 @@ void CreatureGroup::LeaderMoveTo(float x, float y, float z) for (CreatureGroupMemberType::iterator itr = m_members.begin(); itr != m_members.end(); ++itr) { Creature* member = itr->first; - if (member == m_leader || !member->IsAlive() || member->GetVictim()) + uint8 groupAI = sFormationMgr->CreatureGroupMap[member->GetSpawnId()]->groupAI; + if (member == m_leader || !member->IsAlive() || member->GetVictim() || !(groupAI & FLAG_FOLLOW)) continue; if (itr->second->point_1) diff --git a/src/server/game/Entities/Creature/CreatureGroups.h b/src/server/game/Entities/Creature/CreatureGroups.h index 67164cee91c..0de06e11c2b 100644 --- a/src/server/game/Entities/Creature/CreatureGroups.h +++ b/src/server/game/Entities/Creature/CreatureGroups.h @@ -23,6 +23,14 @@ #include #include +enum GroupAIFlags +{ + FLAG_AGGRO_NONE = 0, // If any creature from group is attacked, members won't assist and won't follow + FLAG_AGGRO_ON_AGGRO = 0x00000001, // The member aggroes if the leader aggroes + FLAG_TO_AGGRO_ON_AGGRO = 0x00000002, // The leader aggroes if the member aggroes + FLAG_FOLLOW = 0x00000004, // The member will follow the leader +}; + class Creature; class CreatureGroup;