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()); } }
public static void AddCreatureToGroup(uint groupId, Creature member) { Map map = member.GetMap(); if (!map) { return; } var creatureGroup = map.CreatureGroupHolder.LookupByKey(groupId); //Add member to an existing group if (creatureGroup != null) { Log.outDebug(LogFilter.Unit, "Group found: {0}, inserting creature GUID: {1}, Group InstanceID {2}", groupId, member.GetGUID().ToString(), member.GetInstanceId()); creatureGroup.AddMember(member); } //Create new group else { Log.outDebug(LogFilter.Unit, "Group not found: {0}. Creating new group.", groupId); CreatureGroup group = new CreatureGroup(groupId); map.CreatureGroupHolder[groupId] = group; group.AddMember(member); } }
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); } } }