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

#include "ArenaSeasonMgr.h"

Public Types

using ArenaSeasonRewardGroupsBySeasonContainer = std::unordered_map< uint8, std::vector< ArenaSeasonRewardGroup > >
 

Public Member Functions

void LoadRewards ()
 
void LoadActiveSeason ()
 
void ChangeCurrentSeason (uint8 season)
 
uint8 GetCurrentSeason ()
 
void SetSeasonState (ArenaSeasonState state)
 
ArenaSeasonState GetSeasonState ()
 
void RewardTeamsForTheSeason (std::shared_ptr< ArenaTeamFilter > teamsFilter)
 
bool CanDeleteArenaTeams ()
 
void DeleteArenaTeams ()
 

Static Public Member Functions

static ArenaSeasonMgrinstance ()
 

Private Member Functions

uint16 GameEventForArenaSeason (uint8 season)
 
void BroadcastUpdatedWorldState ()
 

Private Attributes

ArenaSeasonRewardGroupsBySeasonContainer _arenaSeasonRewardGroupsStore
 
uint8 _currentSeason {}
 
ArenaSeasonState _currentSeasonState {}
 

Detailed Description

Member Typedef Documentation

◆ ArenaSeasonRewardGroupsBySeasonContainer

Member Function Documentation

◆ BroadcastUpdatedWorldState()

void ArenaSeasonMgr::BroadcastUpdatedWorldState ( )
private
210{
211 sMapMgr->DoForAllMaps([](Map* map)
212 {
213 // Ignore instanceable maps, players will get a fresh state once they change the map.
214 if (map->Instanceable())
215 return;
216
217 map->DoForAllPlayers([&](Player* player)
218 {
219 uint32 currZone, currArea;
220 player->GetZoneAndAreaId(currZone, currArea);
221 player->SendInitWorldStates(currZone, currArea);
222 });
223 });
224}
std::uint32_t uint32
Definition Define.h:107
#define sMapMgr
Definition MapMgr.h:220
Definition Map.h:156
void DoForAllPlayers(std::function< void(Player *)> exec)
Definition Map.cpp:3008
bool Instanceable() const
Definition Map.h:294
Definition Player.h:1081
void SendInitWorldStates(uint32 zoneId, uint32 areaId)
Definition Player.cpp:8231
void GetZoneAndAreaId(uint32 &zoneid, uint32 &areaid) const
Definition Object.cpp:3164

References Map::DoForAllPlayers(), WorldObject::GetZoneAndAreaId(), Map::Instanceable(), Player::SendInitWorldStates(), and sMapMgr.

Referenced by ChangeCurrentSeason(), and SetSeasonState().

◆ CanDeleteArenaTeams()

bool ArenaSeasonMgr::CanDeleteArenaTeams ( )
135{
136 std::vector<ArenaSeasonRewardGroup> rewards = _arenaSeasonRewardGroupsStore[GetCurrentSeason()];
137 if (rewards.empty())
138 return false;
139
140 for (auto const& bg : sBattlegroundMgr->GetActiveBattlegrounds())
141 if (bg->isRated())
142 return false;
143
144 return true;
145}
#define sBattlegroundMgr
Definition BattlegroundMgr.h:187
ArenaSeasonRewardGroupsBySeasonContainer _arenaSeasonRewardGroupsStore
Definition ArenaSeasonMgr.h:118
uint8 GetCurrentSeason()
Definition ArenaSeasonMgr.h:104

References _arenaSeasonRewardGroupsStore, GetCurrentSeason(), and sBattlegroundMgr.

Referenced by DeleteArenaTeams().

◆ ChangeCurrentSeason()

void ArenaSeasonMgr::ChangeCurrentSeason ( uint8  season)
165{
166 if (_currentSeason == season)
167 return;
168
170 sGameEventMgr->StopEvent(currentEventID, true);
171
172 uint16 newEventID = GameEventForArenaSeason(season);
173 sGameEventMgr->StartEvent(newEventID, true);
174
175 _currentSeason = season;
177
178 CharacterDatabase.Execute("UPDATE active_arena_season SET season_id = {}, season_state = {}", _currentSeason, _currentSeasonState);
179
181}
@ ARENA_SEASON_STATE_IN_PROGRESS
Definition ArenaSeasonMgr.h:29
DatabaseWorkerPool< CharacterDatabaseConnection > CharacterDatabase
Accessor to the character database.
Definition DatabaseEnv.cpp:21
std::uint16_t uint16
Definition Define.h:108
#define sGameEventMgr
Definition GameEventMgr.h:201
uint8 _currentSeason
Definition ArenaSeasonMgr.h:120
uint16 GameEventForArenaSeason(uint8 season)
Definition ArenaSeasonMgr.cpp:195
void BroadcastUpdatedWorldState()
Definition ArenaSeasonMgr.cpp:209
ArenaSeasonState _currentSeasonState
Definition ArenaSeasonMgr.h:121

References _currentSeason, _currentSeasonState, ARENA_SEASON_STATE_IN_PROGRESS, BroadcastUpdatedWorldState(), CharacterDatabase, GameEventForArenaSeason(), and sGameEventMgr.

◆ DeleteArenaTeams()

void ArenaSeasonMgr::DeleteArenaTeams ( )
148{
149 if (!CanDeleteArenaTeams())
150 return;
151
152 // Cleanup queue first.
153 std::vector<BattlegroundQueueTypeId> arenasQueueTypes = {BATTLEGROUND_QUEUE_2v2, BATTLEGROUND_QUEUE_3v3, BATTLEGROUND_QUEUE_5v5};
154 for (BattlegroundQueueTypeId queueType : arenasQueueTypes)
155 {
156 auto queue = sBattlegroundMgr->GetBattlegroundQueue(queueType);
157 for (auto const& [playerGUID, other] : queue.m_QueuedPlayers)
158 queue.RemovePlayer(playerGUID, true);
159 }
160
161 sArenaTeamMgr->DeleteAllArenaTeams();
162}
#define sArenaTeamMgr
Definition ArenaTeamMgr.h:69
BattlegroundQueueTypeId
Definition SharedDefines.h:3619
@ BATTLEGROUND_QUEUE_2v2
Definition SharedDefines.h:3628
@ BATTLEGROUND_QUEUE_5v5
Definition SharedDefines.h:3630
@ BATTLEGROUND_QUEUE_3v3
Definition SharedDefines.h:3629
bool CanDeleteArenaTeams()
Definition ArenaSeasonMgr.cpp:134

References BATTLEGROUND_QUEUE_2v2, BATTLEGROUND_QUEUE_3v3, BATTLEGROUND_QUEUE_5v5, CanDeleteArenaTeams(), sArenaTeamMgr, and sBattlegroundMgr.

◆ GameEventForArenaSeason()

uint16 ArenaSeasonMgr::GameEventForArenaSeason ( uint8  season)
private
196{
197 QueryResult result = WorldDatabase.Query("SELECT eventEntry FROM game_event_arena_seasons WHERE season = '{}'", season);
198
199 if (!result)
200 {
201 LOG_ERROR("arenaseasonmgr", "ArenaSeason ({}) must be an existant Arena Season", season);
202 return 0;
203 }
204
205 Field* fields = result->Fetch();
206 return fields[0].Get<uint16>();
207}
std::shared_ptr< ResultSet > QueryResult
Definition DatabaseEnvFwd.h:27
DatabaseWorkerPool< WorldDatabaseConnection > WorldDatabase
Accessor to the world database.
Definition DatabaseEnv.cpp:20
#define LOG_ERROR(filterType__,...)
Definition Log.h:157
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

References Field::Get(), LOG_ERROR, and WorldDatabase.

Referenced by ChangeCurrentSeason(), and LoadActiveSeason().

◆ GetCurrentSeason()

uint8 ArenaSeasonMgr::GetCurrentSeason ( )
inline
104{ return _currentSeason; }

References _currentSeason.

Referenced by CanDeleteArenaTeams(), and RewardTeamsForTheSeason().

◆ GetSeasonState()

ArenaSeasonState ArenaSeasonMgr::GetSeasonState ( )
inline
107{ return _currentSeasonState; }

References _currentSeasonState.

◆ instance()

ArenaSeasonMgr * ArenaSeasonMgr::instance ( )
static
27{
29 return &instance;
30}
Definition ArenaSeasonMgr.h:92
static ArenaSeasonMgr * instance()
Definition ArenaSeasonMgr.cpp:26

References instance().

Referenced by instance().

◆ LoadActiveSeason()

void ArenaSeasonMgr::LoadActiveSeason ( )
110{
111 QueryResult result = CharacterDatabase.Query("SELECT season_id, season_state FROM active_arena_season");
112 ASSERT(result, "active_arena_season can't be empty");
113
114 Field* fields = result->Fetch();
115 _currentSeason = fields[0].Get<uint8>();
116 _currentSeasonState = static_cast<ArenaSeasonState>(fields[1].Get<uint8>());
117
119 sGameEventMgr->StartEvent(eventID, true);
120
121 LOG_INFO("server.loading", "Arena Season {} loaded...", _currentSeason);
122 LOG_INFO("server.loading", " ");
123}
ArenaSeasonState
Definition ArenaSeasonMgr.h:27
std::uint8_t uint8
Definition Define.h:109
#define ASSERT
Definition Errors.h:68
#define LOG_INFO(filterType__,...)
Definition Log.h:165

References _currentSeason, _currentSeasonState, ASSERT, CharacterDatabase, GameEventForArenaSeason(), Field::Get(), LOG_INFO, and sGameEventMgr.

◆ LoadRewards()

void ArenaSeasonMgr::LoadRewards ( )
33{
34 uint32 oldMSTime = getMSTime();
35
36 std::unordered_map<std::string, ArenaSeasonRewardGroupCriteriaType> stringToArenaSeasonRewardGroupCriteriaType = {
39 };
40
41 QueryResult result = WorldDatabase.Query("SELECT id, arena_season, criteria_type, min_criteria, max_criteria, reward_mail_template_id, reward_mail_subject, reward_mail_body, gold_reward FROM arena_season_reward_group");
42
43 if (!result)
44 {
45 LOG_WARN("server.loading", ">> Loaded 0 arena season rewards. DB table `arena_season_reward_group` is empty.");
46 LOG_INFO("server.loading", " ");
47 return;
48 }
49
50 std::unordered_map<uint32, ArenaSeasonRewardGroup> groupsMap;
51
52 do
53 {
54 Field* fields = result->Fetch();
55 uint32 id = fields[0].Get<uint32>();
56
58 group.season = fields[1].Get<uint8>();
59 group.criteriaType = stringToArenaSeasonRewardGroupCriteriaType[fields[2].Get<std::string>()];
60 group.minCriteria = fields[3].Get<float>();
61 group.maxCriteria = fields[4].Get<float>();
62 group.rewardMailTemplateID = fields[5].Get<uint32>();
63 group.rewardMailSubject = fields[6].Get<std::string>();
64 group.rewardMailBody = fields[7].Get<std::string>();
65 group.goldReward = fields[8].Get<uint32>();
66
67 groupsMap[id] = group;
68 } while (result->NextRow());
69
70 std::unordered_map<std::string, ArenaSeasonRewardType> stringToArenaSeasonRewardType = {
73 };
74
75 result = WorldDatabase.Query("SELECT group_id, type, entry FROM arena_season_reward");
76
77 if (!result)
78 {
79 LOG_WARN("server.loading", ">> Loaded 0 arena season rewards. DB table `arena_season_reward` is empty.");
80 LOG_INFO("server.loading", " ");
81 return;
82 }
83
84 do
85 {
86 Field* fields = result->Fetch();
87 uint32 groupId = fields[0].Get<uint32>();
88
89 ArenaSeasonReward reward;
90 reward.type = stringToArenaSeasonRewardType[fields[1].Get<std::string>()];
91 reward.entry = fields[2].Get<uint32>();
92
93 auto itr = groupsMap.find(groupId);
94 ASSERT(itr != groupsMap.end(), "Unknown arena_season_reward_group ({}) in arena_season_reward", groupId);
95
96 (reward.type == ARENA_SEASON_REWARD_TYPE_ITEM) ?
97 groupsMap[groupId].itemRewards.push_back(reward) :
98 groupsMap[groupId].achievementRewards.push_back(reward);
99
100 } while (result->NextRow());
101
102 for (auto const& itr : groupsMap)
103 _arenaSeasonRewardGroupsStore[itr.second.season].push_back(itr.second);
104
105 LOG_INFO("server.loading", ">> Loaded {} arena season rewards in {} ms", (uint32)groupsMap.size(), GetMSTimeDiffToNow(oldMSTime));
106 LOG_INFO("server.loading", " ");
107}
@ ARENA_SEASON_REWARD_TYPE_ITEM
Definition ArenaSeasonMgr.h:34
@ ARENA_SEASON_REWARD_TYPE_ACHIEVEMENT
Definition ArenaSeasonMgr.h:35
@ ARENA_SEASON_REWARD_CRITERIA_TYPE_PERCENT_VALUE
Definition ArenaSeasonMgr.h:40
@ ARENA_SEASON_REWARD_CRITERIA_TYPE_ABSOLUTE_VALUE
Definition ArenaSeasonMgr.h:41
#define LOG_WARN(filterType__,...)
Definition Log.h:161
uint32 GetMSTimeDiffToNow(uint32 oldMSTime)
Definition Timer.h:131
uint32 getMSTime()
Definition Timer.h:103
Definition ArenaSeasonMgr.h:62
uint8 season
Definition ArenaSeasonMgr.h:65
Definition ArenaSeasonMgr.h:46
ArenaSeasonRewardType type
Definition ArenaSeasonMgr.h:52

References _arenaSeasonRewardGroupsStore, ARENA_SEASON_REWARD_CRITERIA_TYPE_ABSOLUTE_VALUE, ARENA_SEASON_REWARD_CRITERIA_TYPE_PERCENT_VALUE, ARENA_SEASON_REWARD_TYPE_ACHIEVEMENT, ARENA_SEASON_REWARD_TYPE_ITEM, ASSERT, Field::Get(), getMSTime(), GetMSTimeDiffToNow(), LOG_INFO, LOG_WARN, ArenaSeasonRewardGroup::season, ArenaSeasonReward::type, and WorldDatabase.

◆ RewardTeamsForTheSeason()

void ArenaSeasonMgr::RewardTeamsForTheSeason ( std::shared_ptr< ArenaTeamFilter teamsFilter)
126{
129 std::vector<ArenaSeasonRewardGroup> rewards = _arenaSeasonRewardGroupsStore[GetCurrentSeason()];
130 ArenaTeamMgr::ArenaTeamContainer filteredTeams = teamsFilter->Filter(sArenaTeamMgr->GetArenaTeams());
131 distributor.DistributeRewards(filteredTeams, rewards);
132}
Definition ArenaSeasonRewardsDistributor.h:44
void DistributeRewards(ArenaTeamMgr::ArenaTeamContainer &arenaTeams, std::vector< ArenaSeasonRewardGroup > &rewardGroups)
Definition ArenaSeasonRewardsDistributor.cpp:109
Definition ArenaSeasonRewardsDistributor.h:34
std::unordered_map< uint32, ArenaTeam * > ArenaTeamContainer
Definition ArenaTeamMgr.h:34

References _arenaSeasonRewardGroupsStore, ArenaSeasonRewardDistributor::DistributeRewards(), GetCurrentSeason(), and sArenaTeamMgr.

◆ SetSeasonState()

void ArenaSeasonMgr::SetSeasonState ( ArenaSeasonState  state)
184{
185 if (_currentSeasonState == state)
186 return;
187
188 _currentSeasonState = state;
189
190 CharacterDatabase.Execute("UPDATE active_arena_season SET season_state = {}", _currentSeasonState);
191
193}

References _currentSeasonState, BroadcastUpdatedWorldState(), and CharacterDatabase.

Member Data Documentation

◆ _arenaSeasonRewardGroupsStore

ArenaSeasonRewardGroupsBySeasonContainer ArenaSeasonMgr::_arenaSeasonRewardGroupsStore
private

◆ _currentSeason

uint8 ArenaSeasonMgr::_currentSeason {}
private

◆ _currentSeasonState

ArenaSeasonState ArenaSeasonMgr::_currentSeasonState {}
private

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