aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Battlegrounds/BattlegroundMgr.cpp
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2025-02-08 19:58:34 +0100
committerShauren <shauren.trinity@gmail.com>2025-02-08 19:58:34 +0100
commitde9340ccec2d53d4b090bc6ebfadd67cc77d7f5a (patch)
treeab3a8dd6c8e3395b6519820cead0d793ac8dcb40 /src/server/game/Battlegrounds/BattlegroundMgr.cpp
parentb4adab5515f4c9445957184d48e3cd2da9b9f0f1 (diff)
Core/Battlegrounds: Port BattlegroundQueueTypeId changes from master branch
Diffstat (limited to 'src/server/game/Battlegrounds/BattlegroundMgr.cpp')
-rw-r--r--src/server/game/Battlegrounds/BattlegroundMgr.cpp173
1 files changed, 58 insertions, 115 deletions
diff --git a/src/server/game/Battlegrounds/BattlegroundMgr.cpp b/src/server/game/Battlegrounds/BattlegroundMgr.cpp
index e5af279050c..5659e75fe04 100644
--- a/src/server/game/Battlegrounds/BattlegroundMgr.cpp
+++ b/src/server/game/Battlegrounds/BattlegroundMgr.cpp
@@ -113,24 +113,17 @@ void BattlegroundMgr::Update(uint32 diff)
}
// update events timer
- for (int qtype = BATTLEGROUND_QUEUE_NONE; qtype < MAX_BATTLEGROUND_QUEUE_TYPES; ++qtype)
- m_BattlegroundQueues[qtype].UpdateEvents(diff);
+ for (std::pair<BattlegroundQueueTypeId const, BattlegroundQueue>& pair : m_BattlegroundQueues)
+ pair.second.UpdateEvents(diff);
// update scheduled queues
if (!m_QueueUpdateScheduler.empty())
{
- std::vector<uint64> scheduled;
+ std::vector<ScheduledQueueUpdate> scheduled;
std::swap(scheduled, m_QueueUpdateScheduler);
- for (uint8 i = 0; i < scheduled.size(); i++)
- {
- uint32 arenaMMRating = scheduled[i] >> 32;
- uint8 arenaType = scheduled[i] >> 24 & 255;
- BattlegroundQueueTypeId bgQueueTypeId = BattlegroundQueueTypeId(scheduled[i] >> 16 & 255);
- BattlegroundTypeId bgTypeId = BattlegroundTypeId((scheduled[i] >> 8) & 255);
- BattlegroundBracketId bracket_id = BattlegroundBracketId(scheduled[i] & 255);
- m_BattlegroundQueues[bgQueueTypeId].BattlegroundQueueUpdate(diff, bgTypeId, bracket_id, arenaType, arenaMMRating > 0, arenaMMRating);
- }
+ for (auto& [arenaMMRating, bgQueueTypeId] : scheduled)
+ GetBattlegroundQueue(bgQueueTypeId).BattlegroundQueueUpdate(diff, arenaMMRating > 0, arenaMMRating);
}
// if rating difference counts, maybe force-update queues
@@ -141,11 +134,15 @@ void BattlegroundMgr::Update(uint32 diff)
{
// forced update for rated arenas (scan all, but skipped non rated)
TC_LOG_TRACE("bg.arena", "BattlegroundMgr: UPDATING ARENA QUEUES");
- for (int qtype = BATTLEGROUND_QUEUE_2v2; qtype <= BATTLEGROUND_QUEUE_5v5; ++qtype)
+ for (uint8 teamSize : { ARENA_TYPE_2v2, ARENA_TYPE_3v3, ARENA_TYPE_5v5 })
+ {
for (int bracket = BG_BRACKET_ID_FIRST; bracket < MAX_BATTLEGROUND_BRACKETS; ++bracket)
- m_BattlegroundQueues[qtype].BattlegroundQueueUpdate(diff,
- BATTLEGROUND_AA, BattlegroundBracketId(bracket),
- BattlegroundMgr::BGArenaType(BattlegroundQueueTypeId(qtype)), true, 0);
+ {
+ BattlegroundQueueTypeId ratedArenaQueueId = BGQueueTypeId(BATTLEGROUND_AA, bracket, teamSize);
+ if (BattlegroundQueue* arenaQueue = Trinity::Containers::MapGetValuePtr(m_BattlegroundQueues, ratedArenaQueueId))
+ arenaQueue->BattlegroundQueueUpdate(diff, true, 0);
+ }
+ }
m_NextRatedArenaUpdate = sWorld->getIntConfig(CONFIG_ARENA_RATED_UPDATE_TIMER);
}
@@ -488,7 +485,7 @@ bool BattlegroundMgr::CreateBattleground(BattlegroundTemplate const* bgTemplate)
AddBattleground(bg);
}
- bg->SetMapId(bgTemplate->BattlemasterEntry->MapID[0]);
+ bg->SetMapId(!bgTemplate->MapIDs.empty() ? bgTemplate->MapIDs.front() : -1);
bg->SetName(bgTemplate->BattlemasterEntry->Name[sWorld->GetDefaultDbcLocale()]);
bg->SetArenaorBGType(bgTemplate->IsArena());
bg->SetMinPlayersPerTeam(bgTemplate->MinPlayersPerTeam);
@@ -549,6 +546,9 @@ void BattlegroundMgr::LoadBattlegroundTemplates()
bgTemplate.Weight = fields[10].GetUInt8();
bgTemplate.ScriptId = sObjectMgr->GetScriptId(fields[11].GetString());
bgTemplate.BattlemasterEntry = bl;
+ for (int32 mapId : bl->MapID)
+ if (sMapStore.LookupEntry(mapId))
+ bgTemplate.MapIDs.push_back(mapId);
if (bgTemplate.MaxPlayersPerTeam == 0 || bgTemplate.MinPlayersPerTeam > bgTemplate.MaxPlayersPerTeam)
{
@@ -594,8 +594,8 @@ void BattlegroundMgr::LoadBattlegroundTemplates()
_battlegroundTemplates[bgTypeId] = bgTemplate;
- if (bgTemplate.BattlemasterEntry->MapID[1] == -1) // in this case we have only one mapId
- _battlegroundMapTemplates[bgTemplate.BattlemasterEntry->MapID[0]] = &_battlegroundTemplates[bgTypeId];
+ if (bgTemplate.MapIDs.size() == 1)
+ _battlegroundMapTemplates[bgTemplate.MapIDs[0]] = &_battlegroundTemplates[bgTypeId];
++count;
}
@@ -723,86 +723,9 @@ bool BattlegroundMgr::IsArenaType(BattlegroundTypeId bgTypeId)
|| bgTypeId == BATTLEGROUND_RL;
}
-BattlegroundQueueTypeId BattlegroundMgr::BGQueueTypeId(BattlegroundTypeId bgTypeId, uint8 arenaType)
+BattlegroundQueueTypeId BattlegroundMgr::BGQueueTypeId(BattlegroundTypeId bgTypeId, uint8 bracketId, uint8 arenaType)
{
- switch (bgTypeId)
- {
- case BATTLEGROUND_AB:
- return BATTLEGROUND_QUEUE_AB;
- case BATTLEGROUND_AV:
- return BATTLEGROUND_QUEUE_AV;
- case BATTLEGROUND_EY:
- return BATTLEGROUND_QUEUE_EY;
- case BATTLEGROUND_IC:
- return BATTLEGROUND_QUEUE_IC;
- case BATTLEGROUND_RB:
- return BATTLEGROUND_QUEUE_RB;
- case BATTLEGROUND_SA:
- return BATTLEGROUND_QUEUE_SA;
- case BATTLEGROUND_WS:
- return BATTLEGROUND_QUEUE_WS;
- case BATTLEGROUND_AA:
- case BATTLEGROUND_BE:
- case BATTLEGROUND_DS:
- case BATTLEGROUND_NA:
- case BATTLEGROUND_RL:
- case BATTLEGROUND_RV:
- switch (arenaType)
- {
- case ARENA_TYPE_2v2:
- return BATTLEGROUND_QUEUE_2v2;
- case ARENA_TYPE_3v3:
- return BATTLEGROUND_QUEUE_3v3;
- case ARENA_TYPE_5v5:
- return BATTLEGROUND_QUEUE_5v5;
- default:
- return BATTLEGROUND_QUEUE_NONE;
- }
- default:
- return BATTLEGROUND_QUEUE_NONE;
- }
-}
-
-BattlegroundTypeId BattlegroundMgr::BGTemplateId(BattlegroundQueueTypeId bgQueueTypeId)
-{
- switch (bgQueueTypeId)
- {
- case BATTLEGROUND_QUEUE_WS:
- return BATTLEGROUND_WS;
- case BATTLEGROUND_QUEUE_AB:
- return BATTLEGROUND_AB;
- case BATTLEGROUND_QUEUE_AV:
- return BATTLEGROUND_AV;
- case BATTLEGROUND_QUEUE_EY:
- return BATTLEGROUND_EY;
- case BATTLEGROUND_QUEUE_SA:
- return BATTLEGROUND_SA;
- case BATTLEGROUND_QUEUE_IC:
- return BATTLEGROUND_IC;
- case BATTLEGROUND_QUEUE_RB:
- return BATTLEGROUND_RB;
- case BATTLEGROUND_QUEUE_2v2:
- case BATTLEGROUND_QUEUE_3v3:
- case BATTLEGROUND_QUEUE_5v5:
- return BATTLEGROUND_AA;
- default:
- return BattlegroundTypeId(0); // used for unknown template (it exists and does nothing)
- }
-}
-
-uint8 BattlegroundMgr::BGArenaType(BattlegroundQueueTypeId bgQueueTypeId)
-{
- switch (bgQueueTypeId)
- {
- case BATTLEGROUND_QUEUE_2v2:
- return ARENA_TYPE_2v2;
- case BATTLEGROUND_QUEUE_3v3:
- return ARENA_TYPE_3v3;
- case BATTLEGROUND_QUEUE_5v5:
- return ARENA_TYPE_5v5;
- default:
- return 0;
- }
+ return { .BattlemasterListId = uint16(bgTypeId), .BracketId = bracketId, .TeamSize = arenaType };
}
void BattlegroundMgr::ToggleTesting()
@@ -830,11 +753,40 @@ void BattlegroundMgr::SetHolidayActive(uint32 battlegroundId)
bg->SetHoliday(true);
}
-void BattlegroundMgr::ScheduleQueueUpdate(uint32 arenaMatchmakerRating, uint8 arenaType, BattlegroundQueueTypeId bgQueueTypeId, BattlegroundTypeId bgTypeId, BattlegroundBracketId bracket_id)
+bool BattlegroundMgr::IsValidQueueId(BattlegroundQueueTypeId bgQueueTypeId)
+{
+ BattlegroundTemplate const* battlemasterList = GetBattlegroundTemplateByTypeId(BattlegroundTypeId(bgQueueTypeId.BattlemasterListId));
+ if (!battlemasterList)
+ return false;
+
+ switch (battlemasterList->BattlemasterEntry->InstanceType)
+ {
+ case MAP_BATTLEGROUND:
+ if (bgQueueTypeId.TeamSize)
+ return false;
+ break;
+ case MAP_ARENA:
+ if (!bgQueueTypeId.TeamSize)
+ return false;
+ break;
+ default:
+ break;
+ }
+
+ if (battlemasterList->MapIDs.empty())
+ return false;
+
+ if (!GetBattlegroundBracketById(battlemasterList->MapIDs[0], BattlegroundBracketId(bgQueueTypeId.BracketId)))
+ return false;
+
+ return true;
+}
+
+void BattlegroundMgr::ScheduleQueueUpdate(uint32 arenaMatchmakerRating, BattlegroundQueueTypeId bgQueueTypeId)
{
//This method must be atomic, @todo add mutex
//we will use only 1 number created of bgTypeId and bracket_id
- uint64 const scheduleId = ((uint64)arenaMatchmakerRating << 32) | ((uint64)arenaType << 24) | ((uint64)bgQueueTypeId << 16) | ((uint64)bgTypeId << 8) | (uint64)bracket_id;
+ ScheduledQueueUpdate scheduleId{ arenaMatchmakerRating, bgQueueTypeId };
if (std::find(m_QueueUpdateScheduler.begin(), m_QueueUpdateScheduler.end(), scheduleId) == m_QueueUpdateScheduler.end())
m_QueueUpdateScheduler.push_back(scheduleId);
}
@@ -958,23 +910,14 @@ BattlegroundTypeId BattlegroundMgr::GetRandomBG(BattlegroundTypeId bgTypeId)
{
if (BattlegroundTemplate const* bgTemplate = GetBattlegroundTemplateByTypeId(bgTypeId))
{
- std::vector<BattlegroundTypeId> ids;
- ids.reserve(16);
- std::vector<double> weights;
- weights.reserve(16);
- for (int32 mapId : bgTemplate->BattlemasterEntry->MapID)
- {
- if (mapId == -1)
- break;
-
+ std::vector<BattlegroundTemplate const*> ids;
+ ids.reserve(bgTemplate->MapIDs.size());
+ for (int32 mapId : bgTemplate->MapIDs)
if (BattlegroundTemplate const* bg = GetBattlegroundTemplateByMapId(mapId))
- {
- ids.push_back(bg->Id);
- weights.push_back(bg->Weight);
- }
- }
+ ids.push_back(bg);
- return *Trinity::Containers::SelectRandomWeightedContainerElement(ids, weights);
+ if (!ids.empty())
+ return (*Trinity::Containers::SelectRandomWeightedContainerElement(ids, [](BattlegroundTemplate const* bg) { return bg->Weight; }))->Id;
}
return BATTLEGROUND_TYPE_NONE;