uint CreateClientVisibleInstanceId(BattlegroundTypeId bgTypeId, BattlegroundBracketId bracket_id) { if (IsArenaType(bgTypeId)) { return(0); //arenas don't have client-instanceids } // we create here an instanceid, which is just for // displaying this to the client and without any other use.. // the client-instanceIds are unique for each Battleground-type // the instance-id just needs to be as low as possible, beginning with 1 // the following works, because std.set is default ordered with "<" // the optimalization would be to use as bitmask std.vector<uint32> - but that would only make code unreadable var clientIds = bgDataStore[bgTypeId].m_ClientBattlegroundIds[(int)bracket_id]; uint lastId = 0; foreach (var id in clientIds) { if (++lastId != id) //if there is a gap between the ids, we will break.. { break; } lastId = id; } clientIds.Add(++lastId); return(lastId); }
public void ScheduleQueueUpdate(uint arenaMatchmakerRating, ArenaTypes arenaType, BattlegroundQueueTypeId bgQueueTypeId, BattlegroundTypeId bgTypeId, BattlegroundBracketId bracket_id) { //we will use only 1 number created of bgTypeId and bracket_id ulong scheduleId = ((ulong)arenaMatchmakerRating << 32) | ((uint)arenaType << 24) | ((uint)bgQueueTypeId << 16) | ((uint)bgTypeId << 8) | (uint)bracket_id; if (!m_QueueUpdateScheduler.Contains(scheduleId)) { m_QueueUpdateScheduler.Add(scheduleId); } }
public void Update(uint diff) { m_UpdateTimer += diff; if (m_UpdateTimer > 1000) { foreach (var data in bgDataStore.Values) { var bgs = data.m_Battlegrounds; // first one is template and should not be deleted foreach (var pair in bgs.ToList()) { Battleground bg = pair.Value; bg.Update(m_UpdateTimer); if (bg.ToBeDeleted()) { bgs.Remove(pair.Key); var clients = data.m_ClientBattlegroundIds[(int)bg.GetBracketId()]; if (!clients.Empty()) { clients.Remove(bg.GetClientInstanceID()); } bg.Dispose(); } } } m_UpdateTimer = 0; } // update events timer for (var qtype = BattlegroundQueueTypeId.None; qtype < BattlegroundQueueTypeId.Max; ++qtype) { m_BattlegroundQueues[(int)qtype].UpdateEvents(diff); } // update scheduled queues if (!m_QueueUpdateScheduler.Empty()) { List <ulong> scheduled = new List <ulong>(); Extensions.Swap(ref scheduled, ref m_QueueUpdateScheduler); for (byte i = 0; i < scheduled.Count; i++) { uint arenaMMRating = (uint)(scheduled[i] >> 32); byte arenaType = (byte)(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[(int)bgQueueTypeId].BattlegroundQueueUpdate(diff, bgTypeId, bracket_id, arenaType, arenaMMRating > 0, arenaMMRating); } } // if rating difference counts, maybe force-update queues if (WorldConfig.GetIntValue(WorldCfg.ArenaMaxRatingDifference) != 0 && WorldConfig.GetIntValue(WorldCfg.ArenaRatedUpdateTimer) != 0) { // it's time to force update if (m_NextRatedArenaUpdate < diff) { // forced update for rated arenas (scan all, but skipped non rated) Log.outDebug(LogFilter.Arena, "BattlegroundMgr: UPDATING ARENA QUEUES"); for (var qtype = BattlegroundQueueTypeId.Arena2v2; qtype <= BattlegroundQueueTypeId.Arena5v5; ++qtype) { for (int bracket = (int)BattlegroundBracketId.First; bracket < (int)BattlegroundBracketId.Max; ++bracket) { m_BattlegroundQueues[(int)qtype].BattlegroundQueueUpdate(diff, BattlegroundTypeId.AA, (BattlegroundBracketId)bracket, (byte)BGArenaType(qtype), true, 0); } } m_NextRatedArenaUpdate = WorldConfig.GetUIntValue(WorldCfg.ArenaRatedUpdateTimer); } else { m_NextRatedArenaUpdate -= diff; } } }
public ScheduledQueueUpdate(uint arenaMatchmakerRating, BattlegroundQueueTypeId queueId, BattlegroundBracketId bracketId) { ArenaMatchmakerRating = arenaMatchmakerRating; QueueId = queueId; BracketId = bracketId; }
public void ScheduleQueueUpdate(uint arenaMatchmakerRating, BattlegroundQueueTypeId bgQueueTypeId, BattlegroundBracketId bracket_id) { //we will use only 1 number created of bgTypeId and bracket_id ScheduledQueueUpdate scheduleId = new(arenaMatchmakerRating, bgQueueTypeId, bracket_id); if (!m_QueueUpdateScheduler.Contains(scheduleId)) { m_QueueUpdateScheduler.Add(scheduleId); } }
public void Update(uint diff) { m_UpdateTimer += diff; if (m_UpdateTimer > 1000) { foreach (var data in bgDataStore.Values) { var bgs = data.m_Battlegrounds; // first one is template and should not be deleted foreach (var pair in bgs.ToList()) { Battleground bg = pair.Value; bg.Update(m_UpdateTimer); if (bg.ToBeDeleted()) { bgs.Remove(pair.Key); var clients = data.m_ClientBattlegroundIds[(int)bg.GetBracketId()]; if (!clients.Empty()) { clients.Remove(bg.GetClientInstanceID()); } bg.Dispose(); } } } m_UpdateTimer = 0; } // update events timer foreach (var pair in m_BattlegroundQueues) { pair.Value.UpdateEvents(diff); } // update scheduled queues if (!m_QueueUpdateScheduler.Empty()) { List <ScheduledQueueUpdate> scheduled = new(); Extensions.Swap(ref scheduled, ref m_QueueUpdateScheduler); for (byte i = 0; i < scheduled.Count; i++) { uint arenaMMRating = scheduled[i].ArenaMatchmakerRating; BattlegroundQueueTypeId bgQueueTypeId = scheduled[i].QueueId; BattlegroundBracketId bracket_id = scheduled[i].BracketId; GetBattlegroundQueue(bgQueueTypeId).BattlegroundQueueUpdate(diff, bracket_id, arenaMMRating); } } // if rating difference counts, maybe force-update queues if (WorldConfig.GetIntValue(WorldCfg.ArenaMaxRatingDifference) != 0 && WorldConfig.GetIntValue(WorldCfg.ArenaRatedUpdateTimer) != 0) { // it's time to force update if (m_NextRatedArenaUpdate < diff) { // forced update for rated arenas (scan all, but skipped non rated) Log.outDebug(LogFilter.Arena, "BattlegroundMgr: UPDATING ARENA QUEUES"); foreach (ArenaTypes teamSize in new[] { ArenaTypes.Team2v2, ArenaTypes.Team3v3, ArenaTypes.Team5v5 }) { BattlegroundQueueTypeId ratedArenaQueueId = BGQueueTypeId((ushort)BattlegroundTypeId.AA, BattlegroundQueueIdType.Arena, true, teamSize); for (var bracket = BattlegroundBracketId.First; bracket < BattlegroundBracketId.Max; ++bracket) { GetBattlegroundQueue(ratedArenaQueueId).BattlegroundQueueUpdate(diff, bracket, 0); } } m_NextRatedArenaUpdate = WorldConfig.GetUIntValue(WorldCfg.ArenaRatedUpdateTimer); } else { m_NextRatedArenaUpdate -= diff; } } }