Example #1
0
        public void AddMember(Creature member)
        {
            Log.outDebug(LogFilter.Unit, "CreatureGroup.AddMember: Adding unit GUID: {0}.", member.GetGUID().ToString());

            //Check if it is a leader
            if (member.GetSpawnId() == m_groupID)
            {
                Log.outDebug(LogFilter.Unit, "Unit GUID: {0} is formation leader. Adding group.", member.GetGUID().ToString());
                m_leader = member;
            }

            m_members[member] = FormationMgr.CreatureGroupMap.LookupByKey(member.GetSpawnId());
            member.SetFormation(this);
        }
Example #2
0
        public void MemberAttackStart(Creature member, Unit target)
        {
            GroupAIFlags groupAI = (GroupAIFlags)FormationMgr.CreatureGroupMap[member.GetSpawnId()].groupAI;

            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.
                {
                    Log.outDebug(LogFilter.Unit, "GROUP ATTACK: group instance id {0} calls member instid {1}", m_leader.GetInstanceId(), member.GetInstanceId());
                }

                Creature other = pair.Key;

                // Skip self
                if (other == member)
                {
                    continue;
                }

                if (!other.IsAlive())
                {
                    continue;
                }

                if (other.GetVictim())
                {
                    continue;
                }

                if (((other != m_leader && groupAI.HasAnyFlag(GroupAIFlags.MembersAssistLeader)) || (other == m_leader && groupAI.HasAnyFlag(GroupAIFlags.LeaderAssistsMember))) && other.IsValidAttackTarget(target))
                {
                    other.GetAI().AttackStart(target);
                }
            }
        }
Example #3
0
        public void MemberEngagingTarget(Creature member, Unit target)
        {
            GroupAIFlags groupAI = (GroupAIFlags)FormationMgr.CreatureGroupMap[member.GetSpawnId()].groupAI;

            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)
            {
                Creature other = pair.Key;

                // Skip self
                if (other == member)
                {
                    continue;
                }

                if (!other.IsAlive())
                {
                    continue;
                }

                if (((other != m_leader && groupAI.HasAnyFlag(GroupAIFlags.MembersAssistLeader)) || (other == m_leader && groupAI.HasAnyFlag(GroupAIFlags.LeaderAssistsMember))) && other.IsValidAttackTarget(target))
                {
                    other.EngageWithTarget(target);
                }
            }
        }
Example #4
0
        public static void RemoveCreatureFromGroup(CreatureGroup group, Creature member)
        {
            Log.outDebug(LogFilter.Unit, "Deleting member GUID: {0} from group {1}", group.GetId(), member.GetSpawnId());
            group.RemoveMember(member);

            if (group.isEmpty())
            {
                Map map = member.GetMap();
                if (!map)
                {
                    return;
                }

                Log.outDebug(LogFilter.Unit, "Deleting group with InstanceID {0}", member.GetInstanceId());
                map.CreatureGroupHolder.Remove(group.GetId());
            }
        }