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

#include "GroupMgr.h"

Public Types

typedef std::map< uint32, Group * > GroupContainer
 

Public Member Functions

GroupGetGroupByGUID (ObjectGuid::LowType guid) const
 
void InitGroupIds ()
 
void RegisterGroupId (ObjectGuid::LowType groupId)
 
ObjectGuid::LowType GenerateGroupId ()
 
void LoadGroups ()
 
void AddGroup (Group *group)
 
void RemoveGroup (Group *group)
 

Static Public Member Functions

static GroupMgrinstance ()
 

Protected Types

typedef std::vector< bool > GroupIds
 

Protected Attributes

GroupIds _groupIds
 
ObjectGuid::LowType _nextGroupId
 
GroupContainer GroupStore
 

Private Member Functions

 GroupMgr ()
 
 ~GroupMgr ()
 

Detailed Description

Member Typedef Documentation

◆ GroupContainer

typedef std::map<uint32, Group*> GroupMgr::GroupContainer

◆ GroupIds

typedef std::vector<bool> GroupMgr::GroupIds
protected

Constructor & Destructor Documentation

◆ GroupMgr()

GroupMgr::GroupMgr ( )
private
26{
27 _nextGroupId = 0;
28}
ObjectGuid::LowType _nextGroupId
Definition GroupMgr.h:47

References _nextGroupId.

◆ ~GroupMgr()

GroupMgr::~GroupMgr ( )
private
31{
32 for (GroupContainer::iterator itr = GroupStore.begin(); itr != GroupStore.end(); ++itr)
33 delete itr->second;
34}
GroupContainer GroupStore
Definition GroupMgr.h:48

References GroupStore.

Member Function Documentation

◆ AddGroup()

void GroupMgr::AddGroup ( Group group)
95{
96 GroupStore[group->GetGUID().GetCounter()] = group;
97}
ObjectGuid GetGUID() const
Definition Group.cpp:2512
LowType GetCounter() const
Definition ObjectGuid.h:149

References ObjectGuid::GetCounter(), Group::GetGUID(), and GroupStore.

Referenced by LoadGroups().

◆ GenerateGroupId()

ObjectGuid::LowType GroupMgr::GenerateGroupId ( )
70{
72
73 // find the lowest available id starting from the current _nextGroupId
74 while (_nextGroupId < 0xFFFFFFFF && ++_nextGroupId < _groupIds.size() && _groupIds[_nextGroupId]);
75
76 if (_nextGroupId == 0xFFFFFFFF)
77 {
78 LOG_ERROR("server.worldserver", "Group ID overflow!! Can't continue, shutting down server.");
80 }
81
82 return newGroupId;
83}
#define LOG_ERROR(filterType__,...)
Definition Log.h:145
GroupIds _groupIds
Definition GroupMgr.h:46
uint32 LowType
Definition ObjectGuid.h:125
static void StopNow(uint8 exitcode)
Definition World.h:188
@ ERROR_EXIT_CODE
Definition World.h:54

References _groupIds, _nextGroupId, ERROR_EXIT_CODE, LOG_ERROR, and World::StopNow().

◆ GetGroupByGUID()

Group * GroupMgr::GetGroupByGUID ( ObjectGuid::LowType  guid) const
86{
87 GroupContainer::const_iterator itr = GroupStore.find(groupId);
88 if (itr != GroupStore.end())
89 return itr->second;
90
91 return nullptr;
92}

References GroupStore.

Referenced by LoadGroups().

◆ InitGroupIds()

void GroupMgr::InitGroupIds ( )
43{
44 _nextGroupId = 1;
45
46 QueryResult result = CharacterDatabase.Query("SELECT MAX(guid) FROM `groups`");
47 if (result)
48 {
49 uint32 maxId = (*result)[0].Get<uint32>();
50 _groupIds.resize(maxId + 1);
51 }
52}
std::shared_ptr< ResultSet > QueryResult
Definition DatabaseEnvFwd.h:27
DatabaseWorkerPool< CharacterDatabaseConnection > CharacterDatabase
Accessor to the character database.
Definition DatabaseEnv.cpp:21
std::uint32_t uint32
Definition Define.h:107

References _groupIds, _nextGroupId, and CharacterDatabase.

Referenced by LoadGroups().

◆ instance()

GroupMgr * GroupMgr::instance ( )
static
37{
38 static GroupMgr instance;
39 return &instance;
40}
Definition GroupMgr.h:24
static GroupMgr * instance()
Definition GroupMgr.cpp:36

References instance().

Referenced by instance().

◆ LoadGroups()

void GroupMgr::LoadGroups ( )
105{
106 {
107 uint32 oldMSTime = getMSTime();
108
109 // Delete all groups whose leader does not exist
110 CharacterDatabase.DirectExecute("DELETE FROM `groups` WHERE leaderGuid NOT IN (SELECT guid FROM characters)");
111
112 // Delete all groups with less than 2 members
113 CharacterDatabase.DirectExecute("DELETE FROM `groups` WHERE guid NOT IN (SELECT guid FROM group_member GROUP BY guid HAVING COUNT(guid) > 1)");
114
115 // Delete invalid lfg_data
116 CharacterDatabase.DirectExecute("DELETE lfg_data FROM lfg_data LEFT JOIN `groups` ON lfg_data.guid = groups.guid WHERE groups.guid IS NULL OR groups.groupType <> 12");
117 // CharacterDatabase.DirectExecute("DELETE `groups` FROM `groups` LEFT JOIN lfg_data ON groups.guid = lfg_data.guid WHERE groups.groupType=12 AND lfg_data.guid IS NULL"); // group should be left so binds are cleared when disbanded
118
119 InitGroupIds();
120
121 // 0 1 2 3 4 5 6 7 8 9
122 QueryResult result = CharacterDatabase.Query("SELECT g.leaderGuid, g.lootMethod, g.looterGuid, g.lootThreshold, g.icon1, g.icon2, g.icon3, g.icon4, g.icon5, g.icon6"
123 // 10 11 12 13 14 15 16 17 18
124 ", g.icon7, g.icon8, g.groupType, g.difficulty, g.raidDifficulty, g.masterLooterGuid, g.guid, lfg.dungeon, lfg.state FROM `groups` g LEFT JOIN lfg_data lfg ON lfg.guid = g.guid ORDER BY g.guid ASC");
125
126 if (!result)
127 {
128 LOG_WARN("server.loading", ">> Loaded 0 group definitions. DB table `groups` is empty!");
129 LOG_INFO("server.loading", " ");
130 }
131 else
132 {
133 uint32 count = 0;
134 do
135 {
136 Field* fields = result->Fetch();
137 Group* group = new Group;
138 if (!group->LoadGroupFromDB(fields))
139 {
140 delete group;
141 continue;
142 }
143 AddGroup(group);
144
146
147 ++count;
148 } while (result->NextRow());
149
150 LOG_INFO("server.loading", ">> Loaded {} group definitions in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
151 LOG_INFO("server.loading", " ");
152 }
153 }
154
155 LOG_INFO("server.loading", "Loading Group Members...");
156 {
157 uint32 oldMSTime = getMSTime();
158
159 // Delete all rows from group_member with no group
160 CharacterDatabase.DirectExecute("DELETE FROM group_member WHERE guid NOT IN (SELECT guid FROM `groups`)");
161 // Delete all members that does not exist
162 CharacterDatabase.DirectExecute("DELETE FROM group_member WHERE memberGuid NOT IN (SELECT guid FROM characters)");
163
164 // 0 1 2 3 4
165 QueryResult result = CharacterDatabase.Query("SELECT guid, memberGuid, memberFlags, subgroup, roles FROM group_member ORDER BY guid");
166 if (!result)
167 {
168 LOG_WARN("server.loading", ">> Loaded 0 group members. DB table `group_member` is empty!");
169 LOG_INFO("server.loading", " ");
170 }
171 else
172 {
173 uint32 count = 0;
174 do
175 {
176 Field* fields = result->Fetch();
177 Group* group = GetGroupByGUID(fields[0].Get<uint32>());
178
179 if (group)
180 group->LoadMemberFromDB(fields[1].Get<uint32>(), fields[2].Get<uint8>(), fields[3].Get<uint8>(), fields[4].Get<uint8>());
181
182 ++count;
183 } while (result->NextRow());
184
185 LOG_INFO("server.loading", ">> Loaded {} group members in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
186 LOG_INFO("server.loading", " ");
187 }
188 }
189}
#define LOG_INFO(filterType__,...)
Definition Log.h:153
#define LOG_WARN(filterType__,...)
Definition Log.h:149
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
Group * GetGroupByGUID(ObjectGuid::LowType guid) const
Definition GroupMgr.cpp:85
void InitGroupIds()
Definition GroupMgr.cpp:42
void RegisterGroupId(ObjectGuid::LowType groupId)
Definition GroupMgr.cpp:54
void AddGroup(Group *group)
Definition GroupMgr.cpp:94
Definition Group.h:177
void LoadMemberFromDB(ObjectGuid::LowType guidLow, uint8 memberFlags, uint8 subgroup, uint8 roles)
Definition Group.cpp:264
bool LoadGroupFromDB(Field *field)
Definition Group.cpp:209

References AddGroup(), CharacterDatabase, ObjectGuid::GetCounter(), GetGroupByGUID(), Group::GetGUID(), getMSTime(), GetMSTimeDiffToNow(), InitGroupIds(), Group::LoadGroupFromDB(), Group::LoadMemberFromDB(), LOG_INFO, LOG_WARN, and RegisterGroupId().

◆ RegisterGroupId()

void GroupMgr::RegisterGroupId ( ObjectGuid::LowType  groupId)
55{
56 // InitGroupIds() sizes the bitmap to the local MAX(guid) at startup. In cluster mode the
57 // group service assigns ids (auto-increment), which can exceed that bound, so grow on demand.
58 if (groupId >= _groupIds.size())
59 _groupIds.resize(groupId + 1);
60
61 _groupIds[groupId] = true;
62
63 // Groups are pulled in ascending order from db and _nextGroupId is initialized with 1,
64 // so if the instance id is used, increment
65 if (_nextGroupId == groupId)
67}

References _groupIds, and _nextGroupId.

Referenced by LoadGroups().

◆ RemoveGroup()

void GroupMgr::RemoveGroup ( Group group)
100{
101 GroupStore.erase(group->GetGUID().GetCounter());
102}

References ObjectGuid::GetCounter(), Group::GetGUID(), and GroupStore.

Member Data Documentation

◆ _groupIds

GroupIds GroupMgr::_groupIds
protected

◆ _nextGroupId

ObjectGuid::LowType GroupMgr::_nextGroupId
protected

◆ GroupStore

GroupContainer GroupMgr::GroupStore
protected

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