From ab6ea7ba0458d71efed29d65c2b0aff0fb65ea6f Mon Sep 17 00:00:00 2001 From: Aokromes Date: Mon, 3 Jul 2017 19:49:50 +0200 Subject: [PATCH] Fix an issue that was causing all creature group members to assist each other, even if only one of the aggro flags was set. Also refactor enum values to be readable. --- src/server/game/Entities/Creature/CreatureGroups.cpp | 12 ++++++++++-- src/server/game/Entities/Creature/CreatureGroups.h | 9 +++++---- 2 files changed, 15 insertions(+), 6 deletions(-) diff --git a/src/server/game/Entities/Creature/CreatureGroups.cpp b/src/server/game/Entities/Creature/CreatureGroups.cpp index fc60d3b3bec..9b6e5ea934c 100644 --- a/src/server/game/Entities/Creature/CreatureGroups.cpp +++ b/src/server/game/Entities/Creature/CreatureGroups.cpp @@ -176,6 +176,14 @@ void CreatureGroup::MemberAttackStart(Creature* member, Unit* target) if (!groupAI) return; + if (member == m_leader) + { + if (!(groupAI & FLAG_MEMBERS_ASSIST_LEADER)) + return; + } + else if (!(groupAI & FLAG_LEADER_ASSISTS_MEMBER)) + return; + for (CreatureGroupMemberType::iterator itr = m_members.begin(); itr != m_members.end(); ++itr) { if (m_leader) // avoid crash if leader was killed and reset. @@ -193,7 +201,7 @@ void CreatureGroup::MemberAttackStart(Creature* member, Unit* target) if (other->GetVictim()) continue; - if (((other != m_leader && groupAI & FLAG_AGGRO_ON_AGGRO) || (other == m_leader && groupAI & FLAG_TO_AGGRO_ON_AGGRO)) && other->IsValidAttackTarget(target)) + if (((other != m_leader && (groupAI & FLAG_MEMBERS_ASSIST_LEADER)) || (other == m_leader && (groupAI & FLAG_LEADER_ASSISTS_MEMBER))) && other->IsValidAttackTarget(target)) other->AI()->AttackStart(target); } } @@ -227,7 +235,7 @@ void CreatureGroup::LeaderMoveTo(float x, float y, float z) { Creature* member = itr->first; uint8 groupAI = sFormationMgr->CreatureGroupMap[member->GetSpawnId()]->groupAI; - if (member == m_leader || !member->IsAlive() || member->GetVictim() || !(groupAI & FLAG_FOLLOW)) + if (member == m_leader || !member->IsAlive() || member->GetVictim() || !(groupAI & FLAG_IDLE_IN_FORMATION)) 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 0de06e11c2b..0cc0e44f04d 100644 --- a/src/server/game/Entities/Creature/CreatureGroups.h +++ b/src/server/game/Entities/Creature/CreatureGroups.h @@ -25,10 +25,11 @@ 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 + FLAG_AGGRO_NONE = 0, // No creature group behavior + FLAG_MEMBERS_ASSIST_LEADER = 0x00000001, // The member aggroes if the leader aggroes + FLAG_LEADER_ASSISTS_MEMBER = 0x00000002, // The leader aggroes if the member aggroes + FLAG_MEMBERS_ASSIST_MEMBER = (FLAG_MEMBERS_ASSIST_LEADER | FLAG_LEADER_ASSISTS_MEMBER), // every member will assist if any member is attacked + FLAG_IDLE_IN_FORMATION = 0x00000004, // The member will follow the leader when pathing idly }; class Creature;