aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRushor <Rushor@users.noreply.github.com>2017-06-25 12:29:05 +0200
committerAokromes <aokromes@gmail.com>2017-06-25 18:05:26 +0200
commitee253e05334664a8bb68025dadfa8c3ef94ed3a6 (patch)
tree6be8bdacdb82713fccbe506b56880825b16defab
parentff46a8fe626d53da3043b81a21fe73e005c1d82a (diff)
Core/Creature: Implement Mangos GroupAI flags (allows formation without following) (#18733)
-rw-r--r--sql/updates/world/3.3.5/2017_12_18_00_world.sql4
-rw-r--r--src/server/game/Entities/Creature/CreatureGroups.cpp8
-rw-r--r--src/server/game/Entities/Creature/CreatureGroups.h8
3 files changed, 15 insertions, 5 deletions
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 de677d44329..2760601835a 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);
}
}
@@ -232,7 +229,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 c4746f181c6..598690124eb 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;