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
78{ }

◆ ~FormationMgr()

FormationMgr::~FormationMgr ( )
29{
30}

Member Function Documentation

◆ AddCreatureToGroup()

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

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

◆ instance()

FormationMgr * FormationMgr::instance ( )
static
33{
35 return &instance;
36}
Definition CreatureGroups.h:76
static FormationMgr * instance()
Definition CreatureGroups.cpp:32

References instance().

Referenced by instance().

◆ LoadCreatureFormations()

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

References CreatureGroupMap, FormationInfo::follow_angle, FormationInfo::follow_dist, Field::Get(), getMSTime(), GetMSTimeDiffToNow(), GROUP_AI_FLAG_FOLLOW_LEADER, GROUP_AI_FLAG_SUPPORTED, 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 
)
65{
66 LOG_DEBUG("entities.unit", "Deleting member pointer to spawnId: {} from group {}", member->GetSpawnId(), group->GetId());
67 group->RemoveMember(member);
68
69 if (group->IsEmpty())
70 {
71 Map* map = member->FindMap();
72 if (!map)
73 {
74 return;
75 }
76
77 LOG_DEBUG("entities.unit", "Deleting group with InstanceID {}", member->GetInstanceId());
78 map->CreatureGroupHolder.erase(group->GetId());
79 delete group;
80 }
81}
uint32 GetId() const
Definition CreatureGroups.h:100
void RemoveMember(Creature *member)
Definition CreatureGroups.cpp:185
bool IsEmpty() const
Definition CreatureGroups.h:102

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().


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