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

#include "CreatureGroups.h"

Public Member Functions

 FormationMgr ()
 
 ~FormationMgr ()
 
void AddCreatureToGroup (uint32 group_id, Creature *creature)
 
void RemoveCreatureFromGroup (CreatureGroup *group, Creature *creature)
 
void LoadCreatureFormations ()
 

Static Public Member Functions

static FormationMgrinstance ()
 

Public Attributes

CreatureGroupInfoType CreatureGroupMap
 

Detailed Description

Constructor & Destructor Documentation

◆ FormationMgr()

FormationMgr::FormationMgr ( )
inline
77{ }

◆ ~FormationMgr()

FormationMgr::~FormationMgr ( )
26{
27}

Member Function Documentation

◆ AddCreatureToGroup()

void FormationMgr::AddCreatureToGroup ( uint32  group_id,
Creature creature 
)
36{
37 Map* map = member->FindMap();
38 if (!map)
39 {
40 return;
41 }
42
43 CreatureGroupHolderType::iterator itr = map->CreatureGroupHolder.find(groupId);
44
45 //Add member to an existing group
46 if (itr != map->CreatureGroupHolder.end())
47 {
48 LOG_DEBUG("entities.unit", "Group found: {}, inserting creature {}, Group InstanceID {}", groupId, member->GetGUID().ToString(), member->GetInstanceId());
49 itr->second->AddMember(member);
50 }
51 //Create new group
52 else
53 {
54 LOG_DEBUG("entities.unit", "Group not found: {}. Creating new group.", groupId);
55 CreatureGroup* group = new CreatureGroup(groupId);
56 map->CreatureGroupHolder[groupId] = group;
57 group->AddMember(member);
58 }
59}
#define LOG_DEBUG(filterType__,...)
Definition: Log.h:169
Definition: CreatureGroups.h:89
void AddMember(Creature *member)
Definition: CreatureGroups.cpp:167
Definition: Map.h:313
CreatureGroupHolderType CreatureGroupHolder
Definition: Map.h:500

References CreatureGroup::AddMember(), Map::CreatureGroupHolder, WorldObject::FindMap(), Object::GetGUID(), WorldObject::GetInstanceId(), LOG_DEBUG, and ObjectGuid::ToString().

◆ instance()

FormationMgr * FormationMgr::instance ( )
static
30{
32 return &instance;
33}
Definition: CreatureGroups.h:75
static FormationMgr * instance()
Definition: CreatureGroups.cpp:29

References instance().

Referenced by instance().

◆ LoadCreatureFormations()

void FormationMgr::LoadCreatureFormations ( )
81{
82 uint32 const oldMSTime = getMSTime();
83 CreatureGroupMap.clear();
84
85 //Get group data
86 QueryResult result = WorldDatabase.Query("SELECT leaderGUID, memberGUID, dist, angle, groupAI, point_1, point_2 FROM creature_formations ORDER BY leaderGUID");
87 if (!result)
88 {
89 LOG_WARN("server.loading", ">> Loaded 0 creatures in formations. DB table `creature_formations` is empty!");
90 LOG_INFO("server.loading", " ");
91 return;
92 }
93
94 uint32 count = 0;
95 do
96 {
97 Field const* fields = result->Fetch();
98
99 //Load group member data
100 FormationInfo group_member;
101 group_member.leaderGUID = fields[0].Get<uint32>();
102 ObjectGuid::LowType const memberGUID = fields[1].Get<uint32>();
103 float const follow_dist = fields[2].Get<float>();
104 float const follow_angle = fields[3].Get<float>() * (static_cast<float>(M_PI) / 180);
105 group_member.groupAI = fields[4].Get<uint16>();
106 group_member.point_1 = fields[5].Get<uint16>();
107 group_member.point_2 = fields[6].Get<uint16>();
108
109 //If creature is group leader we may skip loading of dist/angle
110 if (group_member.leaderGUID != memberGUID)
111 {
112 if (!group_member.HasGroupFlag(std::underlying_type_t<GroupAIFlags>(GroupAIFlags::GROUP_AI_FLAG_SUPPORTED)))
113 {
114 LOG_ERROR("sql.sql", "creature_formations table leader guid {} and member guid {} has unsupported GroupAI flag value ({}). Skipped", group_member.leaderGUID, memberGUID, group_member.groupAI);
115 continue;
116 }
117
118 if (!group_member.HasGroupFlag(std::underlying_type_t<GroupAIFlags>(GroupAIFlags::GROUP_AI_FLAG_FOLLOW_LEADER)) && (follow_dist > 0.0f || follow_angle > 0.0f))
119 {
120 LOG_ERROR("sql.sql", "creature_formations table member guid {} and leader guid {} cannot have follow distance or follow angle because don't have GROUP_AI_FLAG_FOLLOW_LEADER flag. Values are not gonna be used", memberGUID, group_member.leaderGUID);
121 group_member.follow_dist = 0.0f;
122 group_member.follow_angle = 0.0f;
123 }
124 else
125 {
126 group_member.follow_dist = follow_dist;
127 group_member.follow_angle = follow_angle;
128 }
129 }
130 else
131 {
132 // Leader can have 0 AI flags - its allowed
133 if (group_member.groupAI && !group_member.HasGroupFlag(std::underlying_type_t<GroupAIFlags>(GroupAIFlags::GROUP_AI_FLAG_SUPPORTED)))
134 {
135 LOG_ERROR("sql.sql", "creature_formations table leader guid {} and member guid {} has unsupported GroupAI flag value ({}). Skipped", group_member.leaderGUID, memberGUID, group_member.groupAI);
136 continue;
137 }
138
139 group_member.follow_dist = 0.0f;
140 group_member.follow_angle = 0.0f;
141 if (follow_dist > 0.0f || follow_angle > 0.0f)
142 {
143 LOG_ERROR("sql.sql", "creature_formations table member guid {} and leader guid {} cannot have follow distance or follow angle. Values are not gonna be used", memberGUID, group_member.leaderGUID);
144 }
145 }
146
147 if (!sObjectMgr->GetCreatureData(group_member.leaderGUID))
148 {
149 LOG_ERROR("sql.sql", "creature_formations table leader guid {} incorrect (does not exist). Skipped", group_member.leaderGUID);
150 continue;
151 }
152
153 if (!sObjectMgr->GetCreatureData(memberGUID))
154 {
155 LOG_ERROR("sql.sql", "creature_formations table member guid {} incorrect (does not exist). Skipped", memberGUID);
156 continue;
157 }
158
159 CreatureGroupMap[memberGUID] = group_member;
160 ++count;
161 } while (result->NextRow());
162
163 LOG_INFO("server.loading", ">> Loaded {} Creatures In Formations in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
164 LOG_INFO("server.loading", " ");
165}
std::uint32_t uint32
Definition: Define.h:108
std::uint16_t uint16
Definition: Define.h:109
#define LOG_INFO(filterType__,...)
Definition: Log.h:165
#define LOG_ERROR(filterType__,...)
Definition: Log.h:157
#define LOG_WARN(filterType__,...)
Definition: Log.h:161
uint32 GetMSTimeDiffToNow(uint32 oldMSTime)
Definition: Timer.h:131
uint32 getMSTime()
Definition: Timer.h:103
DatabaseWorkerPool< WorldDatabaseConnection > WorldDatabase
Accessor to the world database.
Definition: DatabaseEnv.cpp:20
std::shared_ptr< ResultSet > QueryResult
Definition: DatabaseEnvFwd.h:28
#define sObjectMgr
Definition: ObjectMgr.h:1640
Class used to access individual fields of database query result.
Definition: Field.h:99
std::enable_if_t< std::is_arithmetic_v< T >, T > Get() const
Definition: Field.h:113
Definition: CreatureGroups.h:51
float follow_dist
Definition: CreatureGroups.h:63
uint32 point_1
Definition: CreatureGroups.h:66
float follow_angle
Definition: CreatureGroups.h:64
uint32 point_2
Definition: CreatureGroups.h:67
ObjectGuid::LowType leaderGUID
Definition: CreatureGroups.h:62
uint16 groupAI
Definition: CreatureGroups.h:65
bool HasGroupFlag(uint16 flag) const
Definition: CreatureGroups.h:69
CreatureGroupInfoType CreatureGroupMap
Definition: CreatureGroups.h:85
uint32 LowType
Definition: ObjectGuid.h:124

References CreatureGroupMap, FormationInfo::follow_angle, FormationInfo::follow_dist, Field::Get(), getMSTime(), GetMSTimeDiffToNow(), FormationInfo::groupAI, FormationInfo::HasGroupFlag(), FormationInfo::leaderGUID, LOG_ERROR, LOG_INFO, LOG_WARN, FormationInfo::point_1, FormationInfo::point_2, sObjectMgr, and WorldDatabase.

◆ RemoveCreatureFromGroup()

void FormationMgr::RemoveCreatureFromGroup ( CreatureGroup group,
Creature creature 
)
62{
63 LOG_DEBUG("entities.unit", "Deleting member pointer to spawnId: {} from group {}", member->GetSpawnId(), group->GetId());
64 group->RemoveMember(member);
65
66 if (group->IsEmpty())
67 {
68 Map* map = member->FindMap();
69 if (!map)
70 {
71 return;
72 }
73
74 LOG_DEBUG("entities.unit", "Deleting group with InstanceID {}", member->GetInstanceId());
75 map->CreatureGroupHolder.erase(group->GetId());
76 delete group;
77 }
78}
uint32 GetId() const
Definition: CreatureGroups.h:99
void RemoveMember(Creature *member)
Definition: CreatureGroups.cpp:182
bool IsEmpty() const
Definition: CreatureGroups.h:101

References Map::CreatureGroupHolder, WorldObject::FindMap(), CreatureGroup::GetId(), WorldObject::GetInstanceId(), Creature::GetSpawnId(), CreatureGroup::IsEmpty(), LOG_DEBUG, and CreatureGroup::RemoveMember().

Member Data Documentation

◆ CreatureGroupMap

CreatureGroupInfoType FormationMgr::CreatureGroupMap

Referenced by LoadCreatureFormations().