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 FormationMgr * instance ()
 

Public Attributes

CreatureGroupInfoType CreatureGroupMap
 
CreatureGroupMembersType CreatureGroupMembers
 

Detailed Description

Constructor & Destructor Documentation

◆ FormationMgr()

FormationMgr::FormationMgr ( )
inline
82{ }

◆ ~FormationMgr()

FormationMgr::~FormationMgr ( )
32{
33}

Member Function Documentation

◆ AddCreatureToGroup()

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

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

◆ instance()

FormationMgr * FormationMgr::instance ( )
static
36{
38 return &instance;
39}
Definition CreatureGroups.h:80
static FormationMgr * instance()
Definition CreatureGroups.cpp:35

References instance().

Referenced by instance().

◆ LoadCreatureFormations()

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

References CreatureGroupMap, CreatureGroupMembers, 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 
)
68{
69 LOG_DEBUG("entities.unit", "Deleting member pointer to spawnId: {} from group {}", member->GetSpawnId(), group->GetId());
70 group->RemoveMember(member);
71
72 if (group->IsEmpty())
73 {
74 Map* map = member->FindMap();
75 if (!map)
76 {
77 return;
78 }
79
80 LOG_DEBUG("entities.unit", "Deleting group with InstanceID {}", member->GetInstanceId());
81 map->CreatureGroupHolder.erase(group->GetId());
82 delete group;
83 }
84}
uint32 GetId() const
Definition CreatureGroups.h:105
void RemoveMember(Creature *member)
Definition CreatureGroups.cpp:190
bool IsEmpty() const
Definition CreatureGroups.h:107

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

◆ CreatureGroupMembers

CreatureGroupMembersType FormationMgr::CreatureGroupMembers

Referenced by LoadCreatureFormations().


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