diff --git a/Framework/Constants/CreatureConst.cs b/Framework/Constants/CreatureConst.cs index 7d170cc27..1023dba5e 100644 --- a/Framework/Constants/CreatureConst.cs +++ b/Framework/Constants/CreatureConst.cs @@ -338,9 +338,10 @@ namespace Framework.Constants public enum GroupAIFlags { - None = 0, // If any creature from group is attacked, members won't assist and won't follow - LeaderAggro = 0x00000001, // The member aggroes if the leader aggroes - MemberAggro = 0x00000002, // The leader aggroes if the member aggroes - Follow = 0x00000004, // The member will follow the leader + None = 0, // No creature group behavior + MembersAssistLeader = 0x01, // The member aggroes if the leader aggroes + LeaderAssistsMember = 0x02, // The leader aggroes if the member aggroes + MembersAssistMember = (MembersAssistLeader | LeaderAssistsMember), // every member will assist if any member is attacked + IdleInFormation = 0x200, // The member will follow the leader when pathing idly } } diff --git a/Game/Entities/Creature/CreatureGroups.cs b/Game/Entities/Creature/CreatureGroups.cs index 1c412e749..b419d31cd 100644 --- a/Game/Entities/Creature/CreatureGroups.cs +++ b/Game/Entities/Creature/CreatureGroups.cs @@ -178,6 +178,14 @@ namespace Game.Entities if (groupAI == 0) return; + if (member == m_leader) + { + if (!groupAI.HasAnyFlag(GroupAIFlags.MembersAssistLeader)) + return; + } + else if (!groupAI.HasAnyFlag(GroupAIFlags.LeaderAssistsMember)) + return; + foreach (var pair in m_members) { if (m_leader) // avoid crash if leader was killed and reset. @@ -195,7 +203,7 @@ namespace Game.Entities if (other.GetVictim()) continue; - if (((other != m_leader && groupAI.HasAnyFlag(GroupAIFlags.LeaderAggro)) || (other == m_leader && groupAI.HasAnyFlag(GroupAIFlags.MemberAggro))) && other.IsValidAttackTarget(target)) + if (((other != m_leader && groupAI.HasAnyFlag(GroupAIFlags.MembersAssistLeader)) || (other == m_leader && groupAI.HasAnyFlag(GroupAIFlags.LeaderAssistsMember))) && other.IsValidAttackTarget(target)) other.GetAI().AttackStart(target); } } @@ -228,8 +236,7 @@ namespace Game.Entities foreach (var pair in m_members) { Creature member = pair.Key; - GroupAIFlags groupAI = (GroupAIFlags)FormationMgr.CreatureGroupMap[member.GetSpawnId()].groupAI; - if (member == m_leader || !member.IsAlive() || member.GetVictim() || !groupAI.HasAnyFlag(GroupAIFlags.Follow)) + if (member == m_leader || !member.IsAlive() || member.GetVictim() || !pair.Value.groupAI.HasAnyFlag((uint)GroupAIFlags.IdleInFormation)) continue; if (pair.Value.point_1 != 0)