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

#include "ArenaTeamMgr.h"

Public Types

typedef std::unordered_map< uint32, ArenaTeam * > ArenaTeamContainer
 

Public Member Functions

ArenaTeam * GetArenaTeamById (uint32 arenaTeamId) const
 
ArenaTeam * GetArenaTeamByName (std::string const &arenaTeamName) const
 
ArenaTeam * GetArenaTeamByCaptain (ObjectGuid guid) const
 
ArenaTeam * GetArenaTeamByName (std::string const &arenaTeamName, const uint32 type) const
 
ArenaTeam * GetArenaTeamByCaptain (ObjectGuid guid, const uint32 type) const
 
void LoadArenaTeams ()
 
void AddArenaTeam (ArenaTeam *arenaTeam)
 
void RemoveArenaTeam (uint32 Id)
 
void DeleteAllArenaTeams ()
 
ArenaTeamContainer::iterator GetArenaTeamMapBegin ()
 
ArenaTeamContainer::iterator GetArenaTeamMapEnd ()
 
ArenaTeamContainer & GetArenaTeams ()
 
void DistributeArenaPoints ()
 
uint32 GenerateArenaTeamId ()
 
void SetNextArenaTeamId (uint32 Id)
 
uint32 GetNextArenaLogId ()
 
void SetLastArenaLogId (uint32 id)
 
uint32 GenerateTempArenaTeamId ()
 

Static Public Member Functions

static ArenaTeamMgr * instance ()
 

Protected Attributes

uint32 NextArenaTeamId
 
uint32 NextTempArenaTeamId
 
ArenaTeamContainer ArenaTeamStore
 
uint32 LastArenaLogId
 

Private Member Functions

 ArenaTeamMgr ()
 
 ~ArenaTeamMgr ()
 

Detailed Description

Member Typedef Documentation

◆ ArenaTeamContainer

typedef std::unordered_map<uint32, ArenaTeam*> ArenaTeamMgr::ArenaTeamContainer

Constructor & Destructor Documentation

◆ ArenaTeamMgr()

ArenaTeamMgr::ArenaTeamMgr ( )
private
30{
33 NextTempArenaTeamId = 0xFFF00000;
34}
uint32 NextArenaTeamId
Definition ArenaTeamMgr.h:63
uint32 NextTempArenaTeamId
Definition ArenaTeamMgr.h:64
uint32 LastArenaLogId
Definition ArenaTeamMgr.h:66

References LastArenaLogId, NextArenaTeamId, and NextTempArenaTeamId.

◆ ~ArenaTeamMgr()

ArenaTeamMgr::~ArenaTeamMgr ( )
private
37{
38 for (ArenaTeamContainer::iterator itr = ArenaTeamStore.begin(); itr != ArenaTeamStore.end(); ++itr)
39 delete itr->second;
40}
ArenaTeamContainer ArenaTeamStore
Definition ArenaTeamMgr.h:65

References ArenaTeamStore.

Member Function Documentation

◆ AddArenaTeam()

void ArenaTeamMgr::AddArenaTeam ( ArenaTeam *  arenaTeam)
119{
120 ArenaTeamStore[arenaTeam->GetId()] = arenaTeam;
121}
uint32 GetId() const
Definition ArenaTeam.h:148

References ArenaTeamStore, and ArenaTeam::GetId().

Referenced by LoadArenaTeams().

◆ DeleteAllArenaTeams()

void ArenaTeamMgr::DeleteAllArenaTeams ( )
129{
130 for (auto const& [id, team] : ArenaTeamStore)
131 {
132 while (team->GetMembersSize() > 0)
133 team->DelMember(team->GetMembers().front().Guid, false);
134
135 delete team;
136 }
137
138 ArenaTeamStore.clear();
139
140 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
141 trans->Append("DELETE FROM arena_team_member");
142 trans->Append("DELETE FROM arena_team");
143 trans->Append("DELETE FROM character_arena_stats");
144 CharacterDatabase.CommitTransaction(trans);
145
146 NextArenaTeamId = 1;
147}
SQLTransaction< CharacterDatabaseConnection > CharacterDatabaseTransaction
Definition DatabaseEnvFwd.h:69
DatabaseWorkerPool< CharacterDatabaseConnection > CharacterDatabase
Accessor to the character database.
Definition DatabaseEnv.cpp:21

References ArenaTeamStore, CharacterDatabase, ArenaTeam::DelMember(), and NextArenaTeamId.

◆ DistributeArenaPoints()

void ArenaTeamMgr::DistributeArenaPoints ( )
217{
218 // Used to distribute arena points based on last week's stats
220
222
223 // Temporary structure for storing maximum points to add values for all players
224 std::map<ObjectGuid, uint32> PlayerPoints;
225
226 // At first update all points for all team members
227 for (ArenaTeamContainer::iterator teamItr = GetArenaTeamMapBegin(); teamItr != GetArenaTeamMapEnd(); ++teamItr)
228 if (ArenaTeam* at = teamItr->second)
229 {
230 at->UpdateArenaPointsHelper(PlayerPoints);
231 sScriptMgr->OnBeforeUpdateArenaPoints(at, PlayerPoints);
232 }
233
234 CharacterDatabaseTransaction trans = CharacterDatabase.BeginTransaction();
235
237
238 // Cycle that gives points to all players
239 for (std::map<ObjectGuid, uint32>::iterator playerItr = PlayerPoints.begin(); playerItr != PlayerPoints.end(); ++playerItr)
240 {
241 // Add points to player if online
242 if (Player* player = ObjectAccessor::FindPlayer(playerItr->first))
243 player->ModifyArenaPoints(playerItr->second, trans);
244 else // Update database
245 {
246 stmt = CharacterDatabase.GetPreparedStatement(CHAR_UPD_CHAR_ARENA_POINTS);
247 stmt->SetData(0, playerItr->second);
248 stmt->SetData(1, playerItr->first.GetCounter());
249 trans->Append(stmt);
250 }
251 }
252
253 CharacterDatabase.CommitTransaction(trans);
254
255 PlayerPoints.clear();
256
258
260 for (ArenaTeamContainer::iterator titr = GetArenaTeamMapBegin(); titr != GetArenaTeamMapEnd(); ++titr)
261 {
262 if (ArenaTeam* at = titr->second)
263 {
264 if (at->FinishWeek())
265 at->SaveToDB(true);
266
267 at->NotifyStatsChanged();
268 }
269 }
270
271 sScriptMgr->OnArenaWeekReset();
272
274
276}
@ CHAR_UPD_CHAR_ARENA_POINTS
Definition CharacterDatabase.h:381
@ LANG_DIST_ARENA_POINTS_TEAM_START
Definition Language.h:726
@ LANG_DIST_ARENA_POINTS_ONLINE_START
Definition Language.h:724
@ LANG_DIST_ARENA_POINTS_START
Definition Language.h:723
@ LANG_DIST_ARENA_POINTS_TEAM_END
Definition Language.h:727
@ LANG_DIST_ARENA_POINTS_END
Definition Language.h:728
@ LANG_DIST_ARENA_POINTS_ONLINE_END
Definition Language.h:725
#define sScriptMgr
Definition ScriptMgr.h:766
ArenaTeamContainer::iterator GetArenaTeamMapBegin()
Definition ArenaTeamMgr.h:48
ArenaTeamContainer::iterator GetArenaTeamMapEnd()
Definition ArenaTeamMgr.h:49
Definition ArenaTeam.h:137
Definition Chat.h:37
void SendWorldText(std::string_view str)
Definition Chat.cpp:139
Definition Player.h:1086
Acore::Types::is_default< T > SetData(const uint8 index, T value)
Definition PreparedStatement.h:77
Definition PreparedStatement.h:157
Player * FindPlayer(ObjectGuid const guid)
Definition ObjectAccessor.cpp:269

References CHAR_UPD_CHAR_ARENA_POINTS, CharacterDatabase, ObjectAccessor::FindPlayer(), GetArenaTeamMapBegin(), GetArenaTeamMapEnd(), LANG_DIST_ARENA_POINTS_END, LANG_DIST_ARENA_POINTS_ONLINE_END, LANG_DIST_ARENA_POINTS_ONLINE_START, LANG_DIST_ARENA_POINTS_START, LANG_DIST_ARENA_POINTS_TEAM_END, LANG_DIST_ARENA_POINTS_TEAM_START, ChatHandler::SendWorldText(), PreparedStatementBase::SetData(), and sScriptMgr.

◆ GenerateArenaTeamId()

uint32 ArenaTeamMgr::GenerateArenaTeamId ( )
150{
152 {
153 LOG_ERROR("bg.arena", "Arena team ids overflow!! Can't continue, shutting down server. ");
155 }
156
157 return NextArenaTeamId++;
158}
constexpr uint32 MAX_ARENA_TEAM_ID
Definition ArenaTeamMgr.h:23
#define LOG_ERROR(filterType__,...)
Definition Log.h:145
static void StopNow(uint8 exitcode)
Definition World.h:188
@ ERROR_EXIT_CODE
Definition World.h:54

References ERROR_EXIT_CODE, LOG_ERROR, MAX_ARENA_TEAM_ID, NextArenaTeamId, and World::StopNow().

◆ GenerateTempArenaTeamId()

uint32 ArenaTeamMgr::GenerateTempArenaTeamId ( )
161{
164
165 return NextTempArenaTeamId++;
166}
constexpr uint32 MAX_TEMP_ARENA_TEAM_ID
Definition ArenaTeamMgr.h:24

References MAX_ARENA_TEAM_ID, MAX_TEMP_ARENA_TEAM_ID, and NextTempArenaTeamId.

◆ GetArenaTeamByCaptain() [1/2]

ArenaTeam * ArenaTeamMgr::GetArenaTeamByCaptain ( ObjectGuid  guid) const
95{
96 for (ArenaTeamContainer::const_iterator itr = ArenaTeamStore.begin(); itr != ArenaTeamStore.end(); ++itr)
97 {
98 if (itr->second->GetCaptain() == guid)
99 {
100 return itr->second;
101 }
102 }
103 return nullptr;
104}

References ArenaTeamStore.

◆ GetArenaTeamByCaptain() [2/2]

ArenaTeam * ArenaTeamMgr::GetArenaTeamByCaptain ( ObjectGuid  guid,
const uint32  type 
) const
107{
108 for (ArenaTeamContainer::const_iterator itr = ArenaTeamStore.begin(); itr != ArenaTeamStore.end(); ++itr)
109 {
110 if (itr->second->GetCaptain() == guid && itr->second->GetType() == type)
111 {
112 return itr->second;
113 }
114 }
115 return nullptr;
116}

References ArenaTeamStore.

◆ GetArenaTeamById()

ArenaTeam * ArenaTeamMgr::GetArenaTeamById ( uint32  arenaTeamId) const
50{
51 ArenaTeamContainer::const_iterator itr = ArenaTeamStore.find(arenaTeamId);
52 if (itr != ArenaTeamStore.end())
53 return itr->second;
54
55 return nullptr;
56}

References ArenaTeamStore.

◆ GetArenaTeamByName() [1/2]

ArenaTeam * ArenaTeamMgr::GetArenaTeamByName ( std::string const &  arenaTeamName) const
59{
60 std::string search = arenaTeamName;
61 std::transform(search.begin(), search.end(), search.begin(), ::toupper);
62 for (ArenaTeamContainer::const_iterator itr = ArenaTeamStore.begin(); itr != ArenaTeamStore.end(); ++itr)
63 {
64 std::string teamName = itr->second->GetName();
65 std::transform(teamName.begin(), teamName.end(), teamName.begin(), ::toupper);
66 if (search == teamName)
67 {
68 return itr->second;
69 }
70 }
71 return nullptr;
72}

References ArenaTeamStore.

◆ GetArenaTeamByName() [2/2]

ArenaTeam * ArenaTeamMgr::GetArenaTeamByName ( std::string const &  arenaTeamName,
const uint32  type 
) const
75{
76 std::string search = arenaTeamName;
77 std::transform(search.begin(), search.end(), search.begin(), ::toupper);
78 for (auto itr = ArenaTeamStore.begin(); itr != ArenaTeamStore.end(); ++itr)
79 {
80 if (itr->second->GetType() != type)
81 {
82 continue;
83 }
84 std::string teamName = itr->second->GetName();
85 std::transform(teamName.begin(), teamName.end(), teamName.begin(), ::toupper);
86 if (search == teamName)
87 {
88 return itr->second;
89 }
90 }
91 return nullptr;
92}

References ArenaTeamStore.

◆ GetArenaTeamMapBegin()

ArenaTeamContainer::iterator ArenaTeamMgr::GetArenaTeamMapBegin ( )
inline
48{ return ArenaTeamStore.begin(); }

References ArenaTeamStore.

Referenced by DistributeArenaPoints().

◆ GetArenaTeamMapEnd()

ArenaTeamContainer::iterator ArenaTeamMgr::GetArenaTeamMapEnd ( )
inline
49{ return ArenaTeamStore.end(); }

References ArenaTeamStore.

Referenced by DistributeArenaPoints().

◆ GetArenaTeams()

ArenaTeamContainer & ArenaTeamMgr::GetArenaTeams ( )
inline
50{ return ArenaTeamStore; }

References ArenaTeamStore.

◆ GetNextArenaLogId()

uint32 ArenaTeamMgr::GetNextArenaLogId ( )
inline
57{ return ++LastArenaLogId; }

References LastArenaLogId.

◆ instance()

ArenaTeamMgr * ArenaTeamMgr::instance ( )
static
43{
45 return &instance;
46}
Definition ArenaTeamMgr.h:27
static ArenaTeamMgr * instance()
Definition ArenaTeamMgr.cpp:42

References instance().

Referenced by instance().

◆ LoadArenaTeams()

void ArenaTeamMgr::LoadArenaTeams ( )
169{
170 uint32 oldMSTime = getMSTime();
171
172 // Clean out the trash before loading anything
173 CharacterDatabase.Execute("DELETE FROM arena_team_member WHERE arenaTeamId NOT IN (SELECT arenaTeamId FROM arena_team)"); // One-time query
174
175 // 0 1 2 3 4 5 6 7 8
176 QueryResult result = CharacterDatabase.Query("SELECT arenaTeamId, name, captainGuid, type, backgroundColor, emblemStyle, emblemColor, borderStyle, borderColor, "
177 // 9 10 11 12 13 14
178 "rating, weekGames, weekWins, seasonGames, seasonWins, `rank` FROM arena_team ORDER BY arenaTeamId ASC");
179
180 if (!result)
181 {
182 LOG_WARN("server.loading", ">> Loaded 0 arena teams. DB table `arena_team` is empty!");
183 LOG_INFO("server.loading", " ");
184 return;
185 }
186
187 QueryResult result2 = CharacterDatabase.Query(
188 // 0 1 2 3 4 5 6 7 8 9 10
189 "SELECT arenaTeamId, atm.guid, atm.weekGames, atm.weekWins, atm.seasonGames, atm.seasonWins, c.name, class, personalRating, matchMakerRating, maxMMR FROM arena_team_member atm"
190 " INNER JOIN arena_team ate USING (arenaTeamId)"
191 " LEFT JOIN characters AS c ON atm.guid = c.guid"
192 " LEFT JOIN character_arena_stats AS cas ON c.guid = cas.guid AND (cas.slot = 0 AND ate.type = 2 OR cas.slot = 1 AND ate.type = 3 OR cas.slot = 2 AND ate.type = 5)"
193 " ORDER BY atm.arenateamid ASC");
194
195 uint32 count = 0;
196 do
197 {
198 ArenaTeam* newArenaTeam = new ArenaTeam;
199
200 if (!newArenaTeam->LoadArenaTeamFromDB(result) || !newArenaTeam->LoadMembersFromDB(result2))
201 {
202 newArenaTeam->Disband(nullptr);
203 delete newArenaTeam;
204 continue;
205 }
206
207 AddArenaTeam(newArenaTeam);
208
209 ++count;
210 } while (result->NextRow());
211
212 LOG_INFO("server.loading", ">> Loaded {} arena teams in {} ms", count, GetMSTimeDiffToNow(oldMSTime));
213 LOG_INFO("server.loading", " ");
214}
std::shared_ptr< ResultSet > QueryResult
Definition DatabaseEnvFwd.h:27
std::uint32_t uint32
Definition Define.h:107
#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
void AddArenaTeam(ArenaTeam *arenaTeam)
Definition ArenaTeamMgr.cpp:118
void Disband(WorldSession *session)
Definition ArenaTeam.cpp:395
bool LoadArenaTeamFromDB(QueryResult arenaTeamDataResult)
Definition ArenaTeam.cpp:208
bool LoadMembersFromDB(QueryResult arenaTeamMembersResult)
Definition ArenaTeam.cpp:234

References AddArenaTeam(), CharacterDatabase, ArenaTeam::Disband(), getMSTime(), GetMSTimeDiffToNow(), ArenaTeam::LoadArenaTeamFromDB(), ArenaTeam::LoadMembersFromDB(), LOG_INFO, and LOG_WARN.

◆ RemoveArenaTeam()

void ArenaTeamMgr::RemoveArenaTeam ( uint32  Id)
124{
125 ArenaTeamStore.erase(arenaTeamId);
126}

References ArenaTeamStore.

◆ SetLastArenaLogId()

void ArenaTeamMgr::SetLastArenaLogId ( uint32  id)
inline
58{ LastArenaLogId = id; }

References LastArenaLogId.

◆ SetNextArenaTeamId()

void ArenaTeamMgr::SetNextArenaTeamId ( uint32  Id)
inline
55{ NextArenaTeamId = Id; }

References NextArenaTeamId.

Member Data Documentation

◆ ArenaTeamStore

◆ LastArenaLogId

uint32 ArenaTeamMgr::LastArenaLogId
protected

◆ NextArenaTeamId

uint32 ArenaTeamMgr::NextArenaTeamId
protected

◆ NextTempArenaTeamId

uint32 ArenaTeamMgr::NextTempArenaTeamId
protected

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