Skip to content

Commit de9340c

Browse files
committed
Core/Battlegrounds: Port BattlegroundQueueTypeId changes from master branch
1 parent b4adab5 commit de9340c

File tree

14 files changed

+353
-375
lines changed

14 files changed

+353
-375
lines changed

src/server/game/Battlegrounds/ArenaTeam.cpp

Lines changed: 20 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -326,16 +326,20 @@ void ArenaTeam::DelMember(ObjectGuid guid, bool cleanDb)
326326
{
327327
if (group && playerMember->GetGroup() && group->GetGUID() == playerMember->GetGroup()->GetGUID())
328328
{
329-
if (BattlegroundQueueTypeId bgQueue = BattlegroundMgr::BGQueueTypeId(BATTLEGROUND_AA, GetType()))
329+
for (uint32 i = 0; i < PLAYER_MAX_BATTLEGROUND_QUEUES; ++i)
330330
{
331+
BattlegroundQueueTypeId bgQueue = playerMember->GetBattlegroundQueueTypeId(i);
332+
if (bgQueue.BattlemasterListId != BATTLEGROUND_AA || bgQueue.TeamSize != GetType())
333+
continue;
334+
331335
GroupQueueInfo ginfo;
332336
BattlegroundQueue& queue = sBattlegroundMgr->GetBattlegroundQueue(bgQueue);
333337
if (queue.GetPlayerGroupInfoData(playerMember->GetGUID(), &ginfo))
334338
if (!ginfo.IsInvitedToBGInstanceGUID)
335339
{
336340
WorldPacket data;
337341
playerMember->RemoveBattlegroundQueueId(bgQueue);
338-
sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, nullptr, playerMember->GetBattlegroundQueueIndex(bgQueue), STATUS_NONE, 0, 0, 0, 0);
342+
sBattlegroundMgr->BuildBattlegroundStatusPacket(&data, nullptr, i, STATUS_NONE, 0, 0, 0, 0);
339343
queue.RemovePlayer(playerMember->GetGUID(), true);
340344
playerMember->GetSession()->SendPacket(&data);
341345
}
@@ -604,6 +608,20 @@ uint8 ArenaTeam::GetSlotByType(uint32 type)
604608
return 0xFF;
605609
}
606610

611+
uint8 ArenaTeam::GetTypeBySlot(uint8 slot)
612+
{
613+
switch (slot)
614+
{
615+
case 0: return ARENA_TEAM_2v2;
616+
case 1: return ARENA_TEAM_3v3;
617+
case 2: return ARENA_TEAM_5v5;
618+
default:
619+
break;
620+
}
621+
TC_LOG_ERROR("bg.arena", "FATAL: Unknown arena team slot {} for some arena team", slot);
622+
return 0xFF;
623+
}
624+
607625
bool ArenaTeam::IsMember(ObjectGuid guid) const
608626
{
609627
for (MemberList::const_iterator itr = Members.begin(); itr != Members.end(); ++itr)

src/server/game/Battlegrounds/ArenaTeam.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -129,6 +129,7 @@ class TC_GAME_API ArenaTeam
129129
uint32 GetType() const { return Type; }
130130
uint8 GetSlot() const { return GetSlotByType(GetType()); }
131131
static uint8 GetSlotByType(uint32 type);
132+
static uint8 GetTypeBySlot(uint8 slot);
132133
ObjectGuid GetCaptain() const { return CaptainGuid; }
133134
std::string const& GetName() const { return TeamName; }
134135
ArenaTeamStats const& GetStats() const { return Stats; }

src/server/game/Battlegrounds/Battleground.cpp

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -462,7 +462,7 @@ inline void Battleground::_ProcessJoin(uint32 diff)
462462
{
463463
// BG Status packet
464464
WorldPacket status;
465-
BattlegroundQueueTypeId bgQueueTypeId = sBattlegroundMgr->BGQueueTypeId(m_TypeID, GetArenaType());
465+
BattlegroundQueueTypeId bgQueueTypeId = BattlegroundMgr::BGQueueTypeId(m_TypeID, GetBracketId(), GetArenaType());
466466
uint32 queueSlot = player->GetBattlegroundQueueIndex(bgQueueTypeId);
467467
sBattlegroundMgr->BuildBattlegroundStatusPacket(&status, this, queueSlot, STATUS_IN_PROGRESS, 0, GetStartTime(), GetArenaType(), player->GetBGTeam());
468468
player->SendDirectMessage(&status);
@@ -719,7 +719,7 @@ void Battleground::EndBattleground(uint32 winner)
719719
WorldPacket pvpLogData;
720720
BuildPvPLogDataPacket(pvpLogData);
721721

722-
BattlegroundQueueTypeId bgQueueTypeId = BattlegroundMgr::BGQueueTypeId(GetTypeID(), GetArenaType());
722+
BattlegroundQueueTypeId bgQueueTypeId = BattlegroundMgr::BGQueueTypeId(GetTypeID(), GetBracketId(), GetArenaType());
723723

724724
for (BattlegroundPlayerMap::iterator itr = m_Players.begin(); itr != m_Players.end(); ++itr)
725725
{
@@ -869,16 +869,15 @@ void Battleground::RemovePlayerAtLeave(ObjectGuid guid, bool Transport, bool Sen
869869

870870
if (participant) // if the player was a match participant, remove auras, calc rating, update queue
871871
{
872-
BattlegroundTypeId bgTypeId = GetTypeID();
873-
BattlegroundQueueTypeId bgQueueTypeId = BattlegroundMgr::BGQueueTypeId(GetTypeID(), GetArenaType());
872+
BattlegroundQueueTypeId bgQueueTypeId = BattlegroundMgr::BGQueueTypeId(GetTypeID(), GetBracketId(), GetArenaType());
874873
if (player)
875874
{
876875
player->ClearAfkReports();
877876

878877
// if arena, remove the specific arena auras
879878
if (isArena())
880879
{
881-
bgTypeId = BATTLEGROUND_AA; // set the bg type to all arenas (it will be used for queue refreshing)
880+
bgQueueTypeId.BattlemasterListId = BATTLEGROUND_AA; // set the bg type to all arenas (it will be used for queue refreshing)
882881

883882
// unsummon current and summon old pet if there was one and there isn't a current pet
884883
player->RemovePet(nullptr, PET_SAVE_NOT_IN_SLOT);
@@ -908,7 +907,7 @@ void Battleground::RemovePlayerAtLeave(ObjectGuid guid, bool Transport, bool Sen
908907
{
909908
// a player has left the battleground, so there are free slots -> add to queue
910909
AddToBGFreeSlotQueue();
911-
sBattlegroundMgr->ScheduleQueueUpdate(0, 0, bgQueueTypeId, bgTypeId, GetBracketId());
910+
sBattlegroundMgr->ScheduleQueueUpdate(0, bgQueueTypeId);
912911
}
913912
// Let others know
914913
WorldPacket data;
@@ -1731,7 +1730,7 @@ void Battleground::PlayerAddedToBGCheckIfBGIsRunning(Player* player)
17311730
return;
17321731

17331732
WorldPacket data;
1734-
BattlegroundQueueTypeId bgQueueTypeId = BattlegroundMgr::BGQueueTypeId(GetTypeID(), GetArenaType());
1733+
BattlegroundQueueTypeId bgQueueTypeId = BattlegroundMgr::BGQueueTypeId(GetTypeID(), GetBracketId(), GetArenaType());
17351734

17361735
BlockMovement(player);
17371736

src/server/game/Battlegrounds/Battleground.h

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -497,6 +497,15 @@ class TC_GAME_API Battleground
497497
// because BattleGrounds with different types and same level range has different m_BracketId
498498
uint8 GetUniqueBracketId() const;
499499

500+
BattlegroundPlayer const* GetBattlegroundPlayerData(ObjectGuid const& playerGuid) const
501+
{
502+
auto itr = m_Players.find(playerGuid);
503+
if (itr == m_Players.end())
504+
return nullptr;
505+
506+
return &itr->second;
507+
}
508+
500509
Trinity::unique_weak_ptr<Battleground> GetWeakPtr() const { return m_weakRef; }
501510
void SetWeakPtr(Trinity::unique_weak_ptr<Battleground> weakRef) { m_weakRef = std::move(weakRef); }
502511

src/server/game/Battlegrounds/BattlegroundMgr.cpp

Lines changed: 58 additions & 115 deletions
Original file line numberDiff line numberDiff line change
@@ -113,24 +113,17 @@ void BattlegroundMgr::Update(uint32 diff)
113113
}
114114

115115
// update events timer
116-
for (int qtype = BATTLEGROUND_QUEUE_NONE; qtype < MAX_BATTLEGROUND_QUEUE_TYPES; ++qtype)
117-
m_BattlegroundQueues[qtype].UpdateEvents(diff);
116+
for (std::pair<BattlegroundQueueTypeId const, BattlegroundQueue>& pair : m_BattlegroundQueues)
117+
pair.second.UpdateEvents(diff);
118118

119119
// update scheduled queues
120120
if (!m_QueueUpdateScheduler.empty())
121121
{
122-
std::vector<uint64> scheduled;
122+
std::vector<ScheduledQueueUpdate> scheduled;
123123
std::swap(scheduled, m_QueueUpdateScheduler);
124124

125-
for (uint8 i = 0; i < scheduled.size(); i++)
126-
{
127-
uint32 arenaMMRating = scheduled[i] >> 32;
128-
uint8 arenaType = scheduled[i] >> 24 & 255;
129-
BattlegroundQueueTypeId bgQueueTypeId = BattlegroundQueueTypeId(scheduled[i] >> 16 & 255);
130-
BattlegroundTypeId bgTypeId = BattlegroundTypeId((scheduled[i] >> 8) & 255);
131-
BattlegroundBracketId bracket_id = BattlegroundBracketId(scheduled[i] & 255);
132-
m_BattlegroundQueues[bgQueueTypeId].BattlegroundQueueUpdate(diff, bgTypeId, bracket_id, arenaType, arenaMMRating > 0, arenaMMRating);
133-
}
125+
for (auto& [arenaMMRating, bgQueueTypeId] : scheduled)
126+
GetBattlegroundQueue(bgQueueTypeId).BattlegroundQueueUpdate(diff, arenaMMRating > 0, arenaMMRating);
134127
}
135128

136129
// if rating difference counts, maybe force-update queues
@@ -141,11 +134,15 @@ void BattlegroundMgr::Update(uint32 diff)
141134
{
142135
// forced update for rated arenas (scan all, but skipped non rated)
143136
TC_LOG_TRACE("bg.arena", "BattlegroundMgr: UPDATING ARENA QUEUES");
144-
for (int qtype = BATTLEGROUND_QUEUE_2v2; qtype <= BATTLEGROUND_QUEUE_5v5; ++qtype)
137+
for (uint8 teamSize : { ARENA_TYPE_2v2, ARENA_TYPE_3v3, ARENA_TYPE_5v5 })
138+
{
145139
for (int bracket = BG_BRACKET_ID_FIRST; bracket < MAX_BATTLEGROUND_BRACKETS; ++bracket)
146-
m_BattlegroundQueues[qtype].BattlegroundQueueUpdate(diff,
147-
BATTLEGROUND_AA, BattlegroundBracketId(bracket),
148-
BattlegroundMgr::BGArenaType(BattlegroundQueueTypeId(qtype)), true, 0);
140+
{
141+
BattlegroundQueueTypeId ratedArenaQueueId = BGQueueTypeId(BATTLEGROUND_AA, bracket, teamSize);
142+
if (BattlegroundQueue* arenaQueue = Trinity::Containers::MapGetValuePtr(m_BattlegroundQueues, ratedArenaQueueId))
143+
arenaQueue->BattlegroundQueueUpdate(diff, true, 0);
144+
}
145+
}
149146

150147
m_NextRatedArenaUpdate = sWorld->getIntConfig(CONFIG_ARENA_RATED_UPDATE_TIMER);
151148
}
@@ -488,7 +485,7 @@ bool BattlegroundMgr::CreateBattleground(BattlegroundTemplate const* bgTemplate)
488485
AddBattleground(bg);
489486
}
490487

491-
bg->SetMapId(bgTemplate->BattlemasterEntry->MapID[0]);
488+
bg->SetMapId(!bgTemplate->MapIDs.empty() ? bgTemplate->MapIDs.front() : -1);
492489
bg->SetName(bgTemplate->BattlemasterEntry->Name[sWorld->GetDefaultDbcLocale()]);
493490
bg->SetArenaorBGType(bgTemplate->IsArena());
494491
bg->SetMinPlayersPerTeam(bgTemplate->MinPlayersPerTeam);
@@ -549,6 +546,9 @@ void BattlegroundMgr::LoadBattlegroundTemplates()
549546
bgTemplate.Weight = fields[10].GetUInt8();
550547
bgTemplate.ScriptId = sObjectMgr->GetScriptId(fields[11].GetString());
551548
bgTemplate.BattlemasterEntry = bl;
549+
for (int32 mapId : bl->MapID)
550+
if (sMapStore.LookupEntry(mapId))
551+
bgTemplate.MapIDs.push_back(mapId);
552552

553553
if (bgTemplate.MaxPlayersPerTeam == 0 || bgTemplate.MinPlayersPerTeam > bgTemplate.MaxPlayersPerTeam)
554554
{
@@ -594,8 +594,8 @@ void BattlegroundMgr::LoadBattlegroundTemplates()
594594

595595
_battlegroundTemplates[bgTypeId] = bgTemplate;
596596

597-
if (bgTemplate.BattlemasterEntry->MapID[1] == -1) // in this case we have only one mapId
598-
_battlegroundMapTemplates[bgTemplate.BattlemasterEntry->MapID[0]] = &_battlegroundTemplates[bgTypeId];
597+
if (bgTemplate.MapIDs.size() == 1)
598+
_battlegroundMapTemplates[bgTemplate.MapIDs[0]] = &_battlegroundTemplates[bgTypeId];
599599

600600
++count;
601601
}
@@ -723,86 +723,9 @@ bool BattlegroundMgr::IsArenaType(BattlegroundTypeId bgTypeId)
723723
|| bgTypeId == BATTLEGROUND_RL;
724724
}
725725

726-
BattlegroundQueueTypeId BattlegroundMgr::BGQueueTypeId(BattlegroundTypeId bgTypeId, uint8 arenaType)
726+
BattlegroundQueueTypeId BattlegroundMgr::BGQueueTypeId(BattlegroundTypeId bgTypeId, uint8 bracketId, uint8 arenaType)
727727
{
728-
switch (bgTypeId)
729-
{
730-
case BATTLEGROUND_AB:
731-
return BATTLEGROUND_QUEUE_AB;
732-
case BATTLEGROUND_AV:
733-
return BATTLEGROUND_QUEUE_AV;
734-
case BATTLEGROUND_EY:
735-
return BATTLEGROUND_QUEUE_EY;
736-
case BATTLEGROUND_IC:
737-
return BATTLEGROUND_QUEUE_IC;
738-
case BATTLEGROUND_RB:
739-
return BATTLEGROUND_QUEUE_RB;
740-
case BATTLEGROUND_SA:
741-
return BATTLEGROUND_QUEUE_SA;
742-
case BATTLEGROUND_WS:
743-
return BATTLEGROUND_QUEUE_WS;
744-
case BATTLEGROUND_AA:
745-
case BATTLEGROUND_BE:
746-
case BATTLEGROUND_DS:
747-
case BATTLEGROUND_NA:
748-
case BATTLEGROUND_RL:
749-
case BATTLEGROUND_RV:
750-
switch (arenaType)
751-
{
752-
case ARENA_TYPE_2v2:
753-
return BATTLEGROUND_QUEUE_2v2;
754-
case ARENA_TYPE_3v3:
755-
return BATTLEGROUND_QUEUE_3v3;
756-
case ARENA_TYPE_5v5:
757-
return BATTLEGROUND_QUEUE_5v5;
758-
default:
759-
return BATTLEGROUND_QUEUE_NONE;
760-
}
761-
default:
762-
return BATTLEGROUND_QUEUE_NONE;
763-
}
764-
}
765-
766-
BattlegroundTypeId BattlegroundMgr::BGTemplateId(BattlegroundQueueTypeId bgQueueTypeId)
767-
{
768-
switch (bgQueueTypeId)
769-
{
770-
case BATTLEGROUND_QUEUE_WS:
771-
return BATTLEGROUND_WS;
772-
case BATTLEGROUND_QUEUE_AB:
773-
return BATTLEGROUND_AB;
774-
case BATTLEGROUND_QUEUE_AV:
775-
return BATTLEGROUND_AV;
776-
case BATTLEGROUND_QUEUE_EY:
777-
return BATTLEGROUND_EY;
778-
case BATTLEGROUND_QUEUE_SA:
779-
return BATTLEGROUND_SA;
780-
case BATTLEGROUND_QUEUE_IC:
781-
return BATTLEGROUND_IC;
782-
case BATTLEGROUND_QUEUE_RB:
783-
return BATTLEGROUND_RB;
784-
case BATTLEGROUND_QUEUE_2v2:
785-
case BATTLEGROUND_QUEUE_3v3:
786-
case BATTLEGROUND_QUEUE_5v5:
787-
return BATTLEGROUND_AA;
788-
default:
789-
return BattlegroundTypeId(0); // used for unknown template (it exists and does nothing)
790-
}
791-
}
792-
793-
uint8 BattlegroundMgr::BGArenaType(BattlegroundQueueTypeId bgQueueTypeId)
794-
{
795-
switch (bgQueueTypeId)
796-
{
797-
case BATTLEGROUND_QUEUE_2v2:
798-
return ARENA_TYPE_2v2;
799-
case BATTLEGROUND_QUEUE_3v3:
800-
return ARENA_TYPE_3v3;
801-
case BATTLEGROUND_QUEUE_5v5:
802-
return ARENA_TYPE_5v5;
803-
default:
804-
return 0;
805-
}
728+
return { .BattlemasterListId = uint16(bgTypeId), .BracketId = bracketId, .TeamSize = arenaType };
806729
}
807730

808731
void BattlegroundMgr::ToggleTesting()
@@ -830,11 +753,40 @@ void BattlegroundMgr::SetHolidayActive(uint32 battlegroundId)
830753
bg->SetHoliday(true);
831754
}
832755

833-
void BattlegroundMgr::ScheduleQueueUpdate(uint32 arenaMatchmakerRating, uint8 arenaType, BattlegroundQueueTypeId bgQueueTypeId, BattlegroundTypeId bgTypeId, BattlegroundBracketId bracket_id)
756+
bool BattlegroundMgr::IsValidQueueId(BattlegroundQueueTypeId bgQueueTypeId)
757+
{
758+
BattlegroundTemplate const* battlemasterList = GetBattlegroundTemplateByTypeId(BattlegroundTypeId(bgQueueTypeId.BattlemasterListId));
759+
if (!battlemasterList)
760+
return false;
761+
762+
switch (battlemasterList->BattlemasterEntry->InstanceType)
763+
{
764+
case MAP_BATTLEGROUND:
765+
if (bgQueueTypeId.TeamSize)
766+
return false;
767+
break;
768+
case MAP_ARENA:
769+
if (!bgQueueTypeId.TeamSize)
770+
return false;
771+
break;
772+
default:
773+
break;
774+
}
775+
776+
if (battlemasterList->MapIDs.empty())
777+
return false;
778+
779+
if (!GetBattlegroundBracketById(battlemasterList->MapIDs[0], BattlegroundBracketId(bgQueueTypeId.BracketId)))
780+
return false;
781+
782+
return true;
783+
}
784+
785+
void BattlegroundMgr::ScheduleQueueUpdate(uint32 arenaMatchmakerRating, BattlegroundQueueTypeId bgQueueTypeId)
834786
{
835787
//This method must be atomic, @todo add mutex
836788
//we will use only 1 number created of bgTypeId and bracket_id
837-
uint64 const scheduleId = ((uint64)arenaMatchmakerRating << 32) | ((uint64)arenaType << 24) | ((uint64)bgQueueTypeId << 16) | ((uint64)bgTypeId << 8) | (uint64)bracket_id;
789+
ScheduledQueueUpdate scheduleId{ arenaMatchmakerRating, bgQueueTypeId };
838790
if (std::find(m_QueueUpdateScheduler.begin(), m_QueueUpdateScheduler.end(), scheduleId) == m_QueueUpdateScheduler.end())
839791
m_QueueUpdateScheduler.push_back(scheduleId);
840792
}
@@ -958,23 +910,14 @@ BattlegroundTypeId BattlegroundMgr::GetRandomBG(BattlegroundTypeId bgTypeId)
958910
{
959911
if (BattlegroundTemplate const* bgTemplate = GetBattlegroundTemplateByTypeId(bgTypeId))
960912
{
961-
std::vector<BattlegroundTypeId> ids;
962-
ids.reserve(16);
963-
std::vector<double> weights;
964-
weights.reserve(16);
965-
for (int32 mapId : bgTemplate->BattlemasterEntry->MapID)
966-
{
967-
if (mapId == -1)
968-
break;
969-
913+
std::vector<BattlegroundTemplate const*> ids;
914+
ids.reserve(bgTemplate->MapIDs.size());
915+
for (int32 mapId : bgTemplate->MapIDs)
970916
if (BattlegroundTemplate const* bg = GetBattlegroundTemplateByMapId(mapId))
971-
{
972-
ids.push_back(bg->Id);
973-
weights.push_back(bg->Weight);
974-
}
975-
}
917+
ids.push_back(bg);
976918

977-
return *Trinity::Containers::SelectRandomWeightedContainerElement(ids, weights);
919+
if (!ids.empty())
920+
return (*Trinity::Containers::SelectRandomWeightedContainerElement(ids, [](BattlegroundTemplate const* bg) { return bg->Weight; }))->Id;
978921
}
979922

980923
return BATTLEGROUND_TYPE_NONE;

0 commit comments

Comments
 (0)