@@ -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
808731void 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