diff options
| author | Rushor <Rushor@users.noreply.github.com> | 2017-06-25 12:29:05 +0200 |
|---|---|---|
| committer | Treeston <treeston.mmoc@gmail.com> | 2017-06-25 12:29:05 +0200 |
| commit | 07708483227f3dbd2c9554abab2cba475a602018 (patch) | |
| tree | 71af600813206f913745f2a2c53bef09cd2ada22 /src | |
| parent | 489478b74d96c2ea940a2316fd11f8e81991cf07 (diff) | |
Core/Creature: Implement Mangos GroupAI flags (allows formation without following) (#18733)
Diffstat (limited to 'src')
| -rw-r--r-- | src/server/game/Entities/Creature/CreatureGroups.cpp | 8 | ||||
| -rw-r--r-- | src/server/game/Entities/Creature/CreatureGroups.h | 8 |
2 files changed, 11 insertions, 5 deletions
diff --git a/src/server/game/Entities/Creature/CreatureGroups.cpp b/src/server/game/Entities/Creature/CreatureGroups.cpp index 0c19bdb502d..f534db8759c 100644 --- a/src/server/game/Entities/Creature/CreatureGroups.cpp +++ b/src/server/game/Entities/Creature/CreatureGroups.cpp @@ -179,9 +179,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. @@ -199,7 +196,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); } } @@ -234,7 +231,8 @@ void CreatureGroup::LeaderMoveTo(Position const& destination, uint32 id /*= 0*/, 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 ddb8b6876ec..f0ce2677dc8 100644 --- a/src/server/game/Entities/Creature/CreatureGroups.h +++ b/src/server/game/Entities/Creature/CreatureGroups.h @@ -24,6 +24,14 @@ #include <unordered_map> #include <map> +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; class Unit; |
