AzerothCore 3.3.5a
OpenSource WoW Emulator
Loading...
Searching...
No Matches
CreatureGroup Class Reference

#include "CreatureGroups.h"

Public Types

typedef std::map< Creature *, FormationInfoCreatureGroupMemberType
 

Public Member Functions

 CreatureGroup (uint32 id)
 
 ~CreatureGroup ()
 
CreatureGetLeader () const
 
uint32 GetId () const
 
bool IsEmpty () const
 
bool IsFormed () const
 
const CreatureGroupMemberTypeGetMembers () const
 
void AddMember (Creature *member)
 
void RemoveMember (Creature *member)
 
void FormationReset (bool dismiss, bool initMotionMaster)
 
void LeaderStartedMoving ()
 
bool CanLeaderStartMoving () const
 
void RemoveFormationMovement ()
 
void MemberEngagingTarget (Creature *member, Unit *target)
 
UnitGetNewTargetForMember (Creature *member)
 
void MemberEvaded (Creature *member)
 
void DespawnFormation (Milliseconds timeToDespawn=0ms, Seconds forcedRespawnTimer=0s)
 
void RespawnFormation (bool force=false)
 
bool IsFormationInCombat ()
 
bool IsAnyMemberAlive (bool ignoreLeader=false)
 

Private Attributes

Creaturem_leader
 
CreatureGroupMemberType m_members
 
uint32 m_groupID
 
bool m_Formed
 

Detailed Description

Member Typedef Documentation

◆ CreatureGroupMemberType

Constructor & Destructor Documentation

◆ CreatureGroup()

CreatureGroup::CreatureGroup ( uint32  id)
inlineexplicit
96: m_leader(nullptr), m_groupID(id), m_Formed(false) {}
bool m_Formed
Definition CreatureGroups.h:127
Creature * m_leader
Definition CreatureGroups.h:123
uint32 m_groupID
Definition CreatureGroups.h:126

◆ ~CreatureGroup()

CreatureGroup::~CreatureGroup ( )
inline
97{}

Member Function Documentation

◆ AddMember()

void CreatureGroup::AddMember ( Creature member)
171{
172 LOG_DEBUG("entities.unit", "CreatureGroup::AddMember: Adding unit {}.", member->GetGUID().ToString());
173
174 //Check if it is a leader
175 if (member->GetSpawnId() == m_groupID)
176 {
177 LOG_DEBUG("entities.unit", "Unit {} is formation leader. Adding group.", member->GetGUID().ToString());
178 m_leader = member;
179 }
180
181 m_members[member] = sFormationMgr->CreatureGroupMap.find(member->GetSpawnId())->second;
182 member->SetFormation(this);
183}
#define sFormationMgr
Definition CreatureGroups.h:130
#define LOG_DEBUG(filterType__,...)
Definition Log.h:170
CreatureGroupMemberType m_members
Definition CreatureGroups.h:124
ObjectGuid::LowType GetSpawnId() const
Definition Creature.h:69
void SetFormation(CreatureGroup *formation)
Definition Creature.h:372
std::string ToString() const
Definition ObjectGuid.cpp:47
static ObjectGuid GetGUID(Object const *o)
Definition Object.h:114

References Object::GetGUID(), Creature::GetSpawnId(), LOG_DEBUG, m_groupID, m_leader, m_members, Creature::SetFormation(), sFormationMgr, and ObjectGuid::ToString().

Referenced by FormationMgr::AddCreatureToGroup().

◆ CanLeaderStartMoving()

bool CreatureGroup::CanLeaderStartMoving ( ) const
372{
373 for (auto const& itr : m_members)
374 {
375 if (itr.first && itr.first != m_leader && itr.first->IsAlive())
376 if (itr.first->IsEngaged() || itr.first->IsInEvadeMode())
377 return false;
378 }
379
380 return true;
381}
bool IsAlive() const
Definition Unit.h:1793

References Unit::IsAlive(), m_leader, and m_members.

Referenced by RandomMovementGenerator< T >::_setRandomLocation(), and Creature::IsFormationLeaderMoveAllowed().

◆ DespawnFormation()

void CreatureGroup::DespawnFormation ( Milliseconds  timeToDespawn = 0ms,
Seconds  forcedRespawnTimer = 0s 
)
397{
398 for (auto const& itr : m_members)
399 {
400 if (itr.first)
401 itr.first->DespawnOrUnsummon(timeToDespawn, forcedRespawnTimer);
402 }
403}

References m_members.

◆ FormationReset()

void CreatureGroup::FormationReset ( bool  dismiss,
bool  initMotionMaster 
)
325{
326 if (m_members.size() && !(m_members.begin()->second.HasGroupFlag(std::underlying_type_t<GroupAIFlags>(GroupAIFlags::GROUP_AI_FLAG_FOLLOW_LEADER))))
327 return;
328
329 for (auto const& itr : m_members)
330 {
331 Creature* member = itr.first;
332 if (member && member != m_leader && member->IsAlive())
333 {
334 if (initMotionMaster)
335 {
336 if (dismiss)
338 else
339 member->GetMotionMaster()->MoveIdle();
340
341 LOG_DEBUG("entities.unit", "Set {} movement for member {}", dismiss ? "default" : "idle", member->GetGUID().ToString());
342 }
343 }
344 }
345 m_Formed = !dismiss;
346}
@ GROUP_AI_FLAG_FOLLOW_LEADER
@ MOTION_SLOT_IDLE
Definition MotionMaster.h:64
Definition Creature.h:47
void MovementExpiredOnSlot(MovementSlot slot, bool reset=true)
Definition MotionMaster.h:220
void MoveIdle()
Definition MotionMaster.cpp:234
MotionMaster * GetMotionMaster()
Definition Unit.h:1758
std::string ToString(Type &&val, Params &&... params)
Definition StringConvert.h:250

References Object::GetGUID(), Unit::GetMotionMaster(), GROUP_AI_FLAG_FOLLOW_LEADER, Unit::IsAlive(), LOG_DEBUG, m_Formed, m_leader, m_members, MOTION_SLOT_IDLE, MotionMaster::MoveIdle(), MotionMaster::MovementExpiredOnSlot(), and ObjectGuid::ToString().

Referenced by Creature::Motion_Initialize(), and Creature::setDeathState().

◆ GetId()

uint32 CreatureGroup::GetId ( ) const
inline

◆ GetLeader()

◆ GetMembers()

const CreatureGroupMemberType & CreatureGroup::GetMembers ( ) const
inline
105{ return m_members; }

References m_members.

◆ GetNewTargetForMember()

Unit * CreatureGroup::GetNewTargetForMember ( Creature member)
238{
239 uint8 const groupAI = sFormationMgr->CreatureGroupMap[member->GetSpawnId()].groupAI;
240 if (!(groupAI & std::underlying_type_t<GroupAIFlags>(GroupAIFlags::GROUP_AI_FLAG_ACQUIRE_NEW_TARGET_ON_EVADE)))
241 {
242 return nullptr;
243 }
244
245 if (member == m_leader)
246 {
247 if (!(groupAI & std::underlying_type_t<GroupAIFlags>(GroupAIFlags::GROUP_AI_FLAG_MEMBER_ASSIST_LEADER)))
248 {
249 return nullptr;
250 }
251 }
252 else if (!(groupAI & std::underlying_type_t<GroupAIFlags>(GroupAIFlags::GROUP_AI_FLAG_LEADER_ASSIST_MEMBER)))
253 {
254 return nullptr;
255 }
256
257 for (auto const& itr : m_members)
258 {
259 Creature* pMember = itr.first;
260 if (!pMember)
261 {
262 continue;
263 }
264
265 if (pMember == member || !pMember->IsAlive() || !pMember->GetVictim())
266 {
267 continue;
268 }
269
270 if (pMember == m_leader && !(groupAI & std::underlying_type_t<GroupAIFlags>(GroupAIFlags::GROUP_AI_FLAG_MEMBER_ASSIST_LEADER)))
271 {
272 continue;
273 }
274
275 if (member->IsValidAttackTarget(pMember->GetVictim()))
276 {
277 return pMember->GetVictim();
278 }
279 }
280
281 return nullptr;
282}
@ GROUP_AI_FLAG_ACQUIRE_NEW_TARGET_ON_EVADE
@ GROUP_AI_FLAG_LEADER_ASSIST_MEMBER
@ GROUP_AI_FLAG_MEMBER_ASSIST_LEADER
std::uint8_t uint8
Definition Define.h:109
Unit * GetVictim() const
Definition Unit.h:903
bool IsValidAttackTarget(Unit const *target, SpellInfo const *bySpell=nullptr) const
Definition Unit.cpp:10705

References Creature::GetSpawnId(), Unit::GetVictim(), GROUP_AI_FLAG_ACQUIRE_NEW_TARGET_ON_EVADE, GROUP_AI_FLAG_LEADER_ASSIST_MEMBER, GROUP_AI_FLAG_MEMBER_ASSIST_LEADER, Unit::IsAlive(), Unit::IsValidAttackTarget(), m_leader, m_members, and sFormationMgr.

◆ IsAnyMemberAlive()

bool CreatureGroup::IsAnyMemberAlive ( bool  ignoreLeader = false)
430{
431 for (auto const& itr : m_members)
432 {
433 if (itr.first && itr.first->IsAlive())
434 {
435 if (!ignoreLeader || itr.first != m_leader)
436 {
437 return true;
438 }
439 }
440 }
441
442 return false;
443}

References m_leader, and m_members.

Referenced by instance_azjol_nerub::instance_azjol_nerub_InstanceScript::OnUnitDeath().

◆ IsEmpty()

bool CreatureGroup::IsEmpty ( ) const
inline
102{ return m_members.empty(); }

References m_members.

Referenced by FormationMgr::RemoveCreatureFromGroup().

◆ IsFormationInCombat()

bool CreatureGroup::IsFormationInCombat ( )
417{
418 for (auto const& itr : m_members)
419 {
420 if (itr.first && itr.first->IsInCombat())
421 {
422 return true;
423 }
424 }
425
426 return false;
427}

References m_members.

◆ IsFormed()

bool CreatureGroup::IsFormed ( ) const
inline
103{ return m_Formed; }

References m_Formed.

Referenced by Creature::Motion_Initialize(), and npc_cameron::UpdateAI().

◆ LeaderStartedMoving()

void CreatureGroup::LeaderStartedMoving ( )
349{
350 if (!m_leader)
351 return;
352
353 for (auto const& itr : m_members)
354 {
355 Creature* member = itr.first;
356 FormationInfo const& pFormationInfo = itr.second;
357 if (member == m_leader || !member->IsAlive() || member->GetVictim() || !pFormationInfo.HasGroupFlag(std::underlying_type_t<GroupAIFlags>(GroupAIFlags::GROUP_AI_FLAG_FOLLOW_LEADER)))
358 continue;
359
361 continue;
362
363 float const followAngle = pFormationInfo.follow_angle;
364 float const followDist = pFormationInfo.follow_dist;
365
367 member->GetMotionMaster()->MoveFormation(m_leader, followDist, followAngle, pFormationInfo.point_1, pFormationInfo.point_2);
368 }
369}
@ UNIT_STATE_NOT_MOVE
Definition UnitDefines.h:225
@ UNIT_STATE_FOLLOW_MOVE
Definition UnitDefines.h:199
@ UNIT_FLAG_PLAYER_CONTROLLED
Definition UnitDefines.h:260
void MoveFormation(Unit *leader, float dist, float angle, uint32 point1, uint32 point2)
Definition MotionMaster.cpp:470
bool HasUnitFlag(UnitFlags flags) const
Definition Unit.h:747
bool isPossessed() const
Definition Unit.h:1311
bool HasUnitState(const uint32 f) const
Definition Unit.h:736
Definition CreatureGroups.h:52
float follow_dist
Definition CreatureGroups.h:64
uint32 point_1
Definition CreatureGroups.h:67
float follow_angle
Definition CreatureGroups.h:65
uint32 point_2
Definition CreatureGroups.h:68
bool HasGroupFlag(uint16 flag) const
Definition CreatureGroups.h:70

References FormationInfo::follow_angle, FormationInfo::follow_dist, Unit::GetMotionMaster(), Unit::GetVictim(), GROUP_AI_FLAG_FOLLOW_LEADER, FormationInfo::HasGroupFlag(), Unit::HasUnitFlag(), Unit::HasUnitState(), Unit::IsAlive(), Unit::isPossessed(), m_leader, m_members, MotionMaster::MoveFormation(), FormationInfo::point_1, FormationInfo::point_2, UNIT_FLAG_PLAYER_CONTROLLED, UNIT_STATE_FOLLOW_MOVE, and UNIT_STATE_NOT_MOVE.

Referenced by RandomMovementGenerator< T >::_setRandomLocation(), Creature::Motion_Initialize(), and Creature::SignalFormationMovement().

◆ MemberEngagingTarget()

void CreatureGroup::MemberEngagingTarget ( Creature member,
Unit target 
)
198{
199 uint8 const groupAI = sFormationMgr->CreatureGroupMap[member->GetSpawnId()].groupAI;
200 if (member == m_leader)
201 {
202 if (!(groupAI & std::underlying_type_t<GroupAIFlags>(GroupAIFlags::GROUP_AI_FLAG_MEMBER_ASSIST_LEADER)))
203 {
204 return;
205 }
206 }
207 else if (!(groupAI & std::underlying_type_t<GroupAIFlags>(GroupAIFlags::GROUP_AI_FLAG_LEADER_ASSIST_MEMBER)))
208 {
209 return;
210 }
211
212 for (auto const& itr : m_members)
213 {
214 Creature* pMember = itr.first;
215 if (!pMember)
216 {
217 continue;
218 }
219
220 if (pMember == member || !pMember->IsAlive() || pMember->GetVictim())
221 {
222 continue;
223 }
224
225 if (pMember == m_leader && !(groupAI & std::underlying_type_t<GroupAIFlags>(GroupAIFlags::GROUP_AI_FLAG_LEADER_ASSIST_MEMBER)))
226 {
227 continue;
228 }
229
230 if (pMember->IsValidAttackTarget(target))
231 {
232 pMember->EngageWithTarget(target);
233 }
234 }
235}
void EngageWithTarget(Unit *who)
Definition Unit.cpp:7502

References Unit::EngageWithTarget(), Creature::GetSpawnId(), Unit::GetVictim(), GROUP_AI_FLAG_LEADER_ASSIST_MEMBER, GROUP_AI_FLAG_MEMBER_ASSIST_LEADER, Unit::IsAlive(), Unit::IsValidAttackTarget(), m_leader, m_members, and sFormationMgr.

◆ MemberEvaded()

void CreatureGroup::MemberEvaded ( Creature member)
285{
286 uint8 const groupAI = sFormationMgr->CreatureGroupMap[member->GetSpawnId()].groupAI;
287 if (!(groupAI & std::underlying_type_t<GroupAIFlags>(GroupAIFlags::GROUP_AI_FLAG_EVADE_MASK)))
288 {
289 return;
290 }
291
292 for (auto const& itr : m_members)
293 {
294 Creature* pMember = itr.first;
295 // This should never happen
296 if (!pMember)
297 continue;
298
299 if (pMember == member || pMember->IsInEvadeMode() || !itr.second.HasGroupFlag(std::underlying_type_t<GroupAIFlags>(GroupAIFlags::GROUP_AI_FLAG_EVADE_MASK)))
300 continue;
301
302 if (itr.second.HasGroupFlag(std::underlying_type_t<GroupAIFlags>(GroupAIFlags::GROUP_AI_FLAG_EVADE_TOGETHER)))
303 {
304 if (!pMember->IsAlive() || !pMember->IsInCombat())
305 continue;
306
307 if (pMember->IsAIEnabled)
308 if (CreatureAI* pMemberAI = pMember->AI())
309 pMemberAI->EnterEvadeMode();
310 }
311 else
312 {
313 if (pMember->IsAlive())
314 continue;
315
316 if (itr.second.HasGroupFlag(std::underlying_type_t<GroupAIFlags>(GroupAIFlags::GROUP_AI_FLAG_DONT_RESPAWN_LEADER_ON_EVADE)) && pMember == m_leader)
317 continue;
318
319 pMember->Respawn();
320 }
321 }
322}
@ GROUP_AI_FLAG_EVADE_MASK
@ GROUP_AI_FLAG_EVADE_TOGETHER
@ GROUP_AI_FLAG_DONT_RESPAWN_LEADER_ON_EVADE
Definition CreatureAI.h:69
void Respawn(bool force=false)
Definition Creature.cpp:1987
bool IsInEvadeMode() const
Definition Creature.h:137
CreatureAI * AI() const
Definition Creature.h:143
bool IsAIEnabled
Definition Unit.h:2097
bool IsInCombat() const
Definition Unit.h:935

References Creature::AI(), Creature::GetSpawnId(), GROUP_AI_FLAG_DONT_RESPAWN_LEADER_ON_EVADE, GROUP_AI_FLAG_EVADE_MASK, GROUP_AI_FLAG_EVADE_TOGETHER, Unit::IsAIEnabled, Unit::IsAlive(), Unit::IsInCombat(), Creature::IsInEvadeMode(), m_leader, m_members, Creature::Respawn(), and sFormationMgr.

◆ RemoveFormationMovement()

void CreatureGroup::RemoveFormationMovement ( )
384{
385 for (auto const& itr : m_members)
386 {
387 Creature* member = itr.first;
388 if (!member || member == m_leader)
389 continue;
390
393 }
394}
@ FORMATION_MOTION_TYPE
Definition MotionMaster.h:58
MovementGeneratorType GetMotionSlotType(int slot) const
Definition MotionMaster.cpp:969

References FORMATION_MOTION_TYPE, Unit::GetMotionMaster(), MotionMaster::GetMotionSlotType(), m_leader, m_members, MOTION_SLOT_IDLE, and MotionMaster::MovementExpiredOnSlot().

Referenced by RemoveMember().

◆ RemoveMember()

void CreatureGroup::RemoveMember ( Creature member)
186{
187 if (m_leader == member)
188 {
190 m_leader = nullptr;
191 }
192
193 m_members.erase(member);
194 member->SetFormation(nullptr);
195}
void RemoveFormationMovement()
Definition CreatureGroups.cpp:383

References m_leader, m_members, RemoveFormationMovement(), and Creature::SetFormation().

Referenced by FormationMgr::RemoveCreatureFromGroup().

◆ RespawnFormation()

void CreatureGroup::RespawnFormation ( bool  force = false)
406{
407 for (auto const& itr : m_members)
408 {
409 if (itr.first && !itr.first->IsAlive())
410 {
411 itr.first->Respawn(force);
412 }
413 }
414}

References m_members.

Referenced by boss_krik_thir::boss_krik_thirAI::Reset().

Member Data Documentation

◆ m_Formed

bool CreatureGroup::m_Formed
private

Referenced by FormationReset(), and IsFormed().

◆ m_groupID

uint32 CreatureGroup::m_groupID
private

Referenced by AddMember(), and GetId().

◆ m_leader

◆ m_members


The documentation for this class was generated from the following files: