Core/Battlegrounds: Queue updates
Port From (https://github.com/TrinityCore/TrinityCore/commit/bf8714b8705c3fccc77083c6dc8665767430d346)
This commit is contained in:
@@ -415,14 +415,6 @@ namespace Game.BattleGrounds
|
||||
Player player = Global.ObjAccessor.FindPlayer(guid);
|
||||
if (player)
|
||||
{
|
||||
// BG Status packet
|
||||
BattlegroundQueueTypeId bgQueueTypeId = Global.BattlegroundMgr.BGQueueTypeId(GetTypeID(), GetArenaType());
|
||||
uint queueSlot = player.GetBattlegroundQueueIndex(bgQueueTypeId);
|
||||
|
||||
BattlefieldStatusActive battlefieldStatus;
|
||||
Global.BattlegroundMgr.BuildBattlegroundStatusActive(out battlefieldStatus, this, player, queueSlot, player.GetBattlegroundQueueJoinTime(bgQueueTypeId), GetArenaType());
|
||||
player.SendPacket(battlefieldStatus);
|
||||
|
||||
// Correctly display EnemyUnitFrame
|
||||
player.SetArenaFaction((byte)player.GetBGTeam());
|
||||
|
||||
@@ -699,10 +691,12 @@ namespace Game.BattleGrounds
|
||||
//we must set it this way, because end time is sent in packet!
|
||||
SetRemainingTime(BattlegroundConst.AutocloseBattleground);
|
||||
|
||||
PVPLogData pvpLogData;
|
||||
BuildPvPLogDataPacket(out pvpLogData);
|
||||
|
||||
BattlegroundQueueTypeId bgQueueTypeId = Global.BattlegroundMgr.BGQueueTypeId(GetTypeID(), GetArenaType());
|
||||
PVPMatchEnd pvpMatchEnd = new PVPMatchEnd();
|
||||
pvpMatchEnd.Winner = (byte)GetWinner();
|
||||
pvpMatchEnd.Duration = (int)Math.Max(0, (GetElapsedTime() - (int)BattlegroundStartTimeIntervals.Delay2m) / Time.InMilliseconds);
|
||||
pvpMatchEnd.LogData.HasValue = true;
|
||||
BuildPvPLogDataPacket(out pvpMatchEnd.LogData.Value);
|
||||
pvpMatchEnd.Write();
|
||||
|
||||
foreach (var pair in m_Players)
|
||||
{
|
||||
@@ -799,11 +793,7 @@ namespace Game.BattleGrounds
|
||||
|
||||
BlockMovement(player);
|
||||
|
||||
player.SendPacket(pvpLogData);
|
||||
|
||||
BattlefieldStatusActive battlefieldStatus;
|
||||
Global.BattlegroundMgr.BuildBattlegroundStatusActive(out battlefieldStatus, this, player, player.GetBattlegroundQueueIndex(bgQueueTypeId), player.GetBattlegroundQueueJoinTime(bgQueueTypeId), GetArenaType());
|
||||
player.SendPacket(battlefieldStatus);
|
||||
player.SendPacket(pvpMatchEnd);
|
||||
|
||||
player.UpdateCriteria(CriteriaTypes.CompleteBattleground, player.GetMapId());
|
||||
}
|
||||
@@ -866,7 +856,7 @@ namespace Game.BattleGrounds
|
||||
RemovePlayer(player, guid, team); // BG subclass specific code
|
||||
|
||||
BattlegroundTypeId bgTypeId = GetTypeID();
|
||||
BattlegroundQueueTypeId bgQueueTypeId = Global.BattlegroundMgr.BGQueueTypeId(GetTypeID(), GetArenaType());
|
||||
BattlegroundQueueTypeId bgQueueTypeId = GetQueueId();
|
||||
|
||||
if (participant) // if the player was a match participant, remove auras, calc rating, update queue
|
||||
{
|
||||
@@ -907,7 +897,7 @@ namespace Game.BattleGrounds
|
||||
{
|
||||
// a player has left the Battleground, so there are free slots . add to queue
|
||||
AddToBGFreeSlotQueue();
|
||||
Global.BattlegroundMgr.ScheduleQueueUpdate(0, 0, bgQueueTypeId, bgTypeId, GetBracketId());
|
||||
Global.BattlegroundMgr.ScheduleQueueUpdate(0, bgQueueTypeId, GetBracketId());
|
||||
}
|
||||
// Let others know
|
||||
BattlegroundPlayerLeft playerLeft = new BattlegroundPlayerLeft();
|
||||
@@ -1006,13 +996,36 @@ namespace Game.BattleGrounds
|
||||
playerJoined.Guid = player.GetGUID();
|
||||
SendPacketToTeam(team, playerJoined, player);
|
||||
|
||||
// BG Status packet
|
||||
BattlegroundQueueTypeId bgQueueTypeId = Global.BattlegroundMgr.BGQueueTypeId(GetTypeID(), GetArenaType());
|
||||
uint queueSlot = player.GetBattlegroundQueueIndex(bgQueueTypeId);
|
||||
PVPMatchInit pvpMatchState = new PVPMatchInit();
|
||||
pvpMatchState.MapID = GetMapId();
|
||||
switch (GetStatus())
|
||||
{
|
||||
case BattlegroundStatus.None:
|
||||
case BattlegroundStatus.WaitQueue:
|
||||
pvpMatchState.State = PVPMatchInit.MatchState.Inactive;
|
||||
break;
|
||||
case BattlegroundStatus.WaitJoin:
|
||||
case BattlegroundStatus.InProgress:
|
||||
pvpMatchState.State = PVPMatchInit.MatchState.InProgress;
|
||||
break;
|
||||
case BattlegroundStatus.WaitLeave:
|
||||
pvpMatchState.State = PVPMatchInit.MatchState.Complete;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
BattlefieldStatusActive battlefieldStatus;
|
||||
Global.BattlegroundMgr.BuildBattlegroundStatusActive(out battlefieldStatus, this, player, queueSlot, player.GetBattlegroundQueueJoinTime(bgQueueTypeId), GetArenaType());
|
||||
player.SendPacket(battlefieldStatus);
|
||||
if (GetElapsedTime() >= (int)BattlegroundStartTimeIntervals.Delay2m)
|
||||
{
|
||||
pvpMatchState.Duration = (int)(GetElapsedTime() - (int)BattlegroundStartTimeIntervals.Delay2m) / Time.InMilliseconds;
|
||||
pvpMatchState.StartTime = GameTime.GetGameTime() - pvpMatchState.Duration;
|
||||
}
|
||||
pvpMatchState.ArenaFaction = (byte)(player.GetBGTeam() == Team.Horde ? BattlegroundTeamId.Horde : BattlegroundTeamId.Alliance);
|
||||
pvpMatchState.BattlemasterListID = (uint)GetTypeID();
|
||||
pvpMatchState.Registered = false;
|
||||
pvpMatchState.AffectsRating = IsRated();
|
||||
|
||||
player.SendPacket(pvpMatchState);
|
||||
|
||||
player.RemoveAurasByType(AuraType.Mounted);
|
||||
|
||||
@@ -1132,7 +1145,7 @@ namespace Game.BattleGrounds
|
||||
{
|
||||
if (!m_InBGFreeSlotQueue && IsBattleground())
|
||||
{
|
||||
Global.BattlegroundMgr.AddToBGFreeSlotQueue(GetTypeID(), this);
|
||||
Global.BattlegroundMgr.AddToBGFreeSlotQueue(GetQueueId(), this);
|
||||
m_InBGFreeSlotQueue = true;
|
||||
}
|
||||
}
|
||||
@@ -1142,7 +1155,7 @@ namespace Game.BattleGrounds
|
||||
{
|
||||
if (m_InBGFreeSlotQueue)
|
||||
{
|
||||
Global.BattlegroundMgr.RemoveFromBGFreeSlotQueue(GetTypeID(), m_InstanceID);
|
||||
Global.BattlegroundMgr.RemoveFromBGFreeSlotQueue(GetQueueId(), m_InstanceID);
|
||||
m_InBGFreeSlotQueue = false;
|
||||
}
|
||||
}
|
||||
@@ -1415,7 +1428,7 @@ namespace Game.BattleGrounds
|
||||
|
||||
public uint GetMapId()
|
||||
{
|
||||
return _battlegroundTemplate.BattlemasterEntry.MapId[0];
|
||||
return (uint)_battlegroundTemplate.BattlemasterEntry.MapId[0];
|
||||
}
|
||||
|
||||
public void SpawnBGObject(int type, uint respawntime)
|
||||
@@ -1692,17 +1705,11 @@ namespace Game.BattleGrounds
|
||||
if (GetStatus() != BattlegroundStatus.WaitLeave)
|
||||
return;
|
||||
|
||||
PVPLogData pvpLogData;
|
||||
BattlegroundQueueTypeId bgQueueTypeId = Global.BattlegroundMgr.BGQueueTypeId(GetTypeID(), GetArenaType());
|
||||
|
||||
BlockMovement(player);
|
||||
|
||||
BuildPvPLogDataPacket(out pvpLogData);
|
||||
PVPLogDataMessage pvpLogData = new PVPLogDataMessage();
|
||||
BuildPvPLogDataPacket(out pvpLogData.Data);
|
||||
player.SendPacket(pvpLogData);
|
||||
|
||||
BattlefieldStatusActive battlefieldStatus;
|
||||
Global.BattlegroundMgr.BuildBattlegroundStatusActive(out battlefieldStatus, this, player, player.GetBattlegroundQueueIndex(bgQueueTypeId), player.GetBattlegroundQueueJoinTime(bgQueueTypeId), GetArenaType());
|
||||
player.SendPacket(battlefieldStatus);
|
||||
}
|
||||
|
||||
public uint GetAlivePlayersCountByTeam(Team Team)
|
||||
@@ -1801,15 +1808,6 @@ namespace Game.BattleGrounds
|
||||
return _battlegroundTemplate.BattlemasterEntry.Name[Global.WorldMgr.GetDefaultDbcLocale()];
|
||||
}
|
||||
|
||||
public ulong GetQueueId()
|
||||
{
|
||||
BattlegroundQueueIdType type = BattlegroundQueueIdType.Battleground;
|
||||
if (IsArena())
|
||||
type = IsRated() ? BattlegroundQueueIdType.Arena : BattlegroundQueueIdType.ArenaSkirmish;
|
||||
|
||||
return (ulong)_battlegroundTemplate.Id | (ulong)type << 16 | 0x1F10000000000000;
|
||||
}
|
||||
|
||||
public BattlegroundTypeId GetTypeID(bool getRandom = false)
|
||||
{
|
||||
return getRandom ? m_RandomTypeID : _battlegroundTemplate.Id;
|
||||
@@ -1883,6 +1881,7 @@ namespace Game.BattleGrounds
|
||||
public virtual void DestroyGate(Player player, GameObject go) { }
|
||||
public virtual bool IsAllNodesControlledByTeam(Team team) { return false; }
|
||||
|
||||
public BattlegroundQueueTypeId GetQueueId() { return m_queueId; }
|
||||
public uint GetInstanceID() { return m_InstanceID; }
|
||||
public BattlegroundStatus GetStatus() { return m_Status; }
|
||||
public uint GetClientInstanceID() { return m_ClientInstanceID; }
|
||||
@@ -1895,6 +1894,7 @@ namespace Game.BattleGrounds
|
||||
BattlegroundTeamId GetWinner() { return _winnerTeamId; }
|
||||
public bool IsRandom() { return m_IsRandom; }
|
||||
|
||||
public void SetQueueId(BattlegroundQueueTypeId queueId) { m_queueId = queueId; }
|
||||
public void SetRandomTypeID(BattlegroundTypeId TypeID) { m_RandomTypeID = TypeID; }
|
||||
//here we can count minlevel and maxlevel for players
|
||||
public void SetInstanceID(uint InstanceID) { m_InstanceID = InstanceID; }
|
||||
@@ -2032,6 +2032,7 @@ namespace Game.BattleGrounds
|
||||
public uint[] Buff_Entries = { BattlegroundConst.SpeedBuff, BattlegroundConst.RegenBuff, BattlegroundConst.BerserkerBuff };
|
||||
|
||||
// Battleground
|
||||
BattlegroundQueueTypeId m_queueId;
|
||||
BattlegroundTypeId m_RandomTypeID;
|
||||
uint m_InstanceID; // Battleground Instance's GUID!
|
||||
BattlegroundStatus m_Status;
|
||||
|
||||
@@ -33,20 +33,20 @@ namespace Game.BattleGrounds
|
||||
BattlegroundManager()
|
||||
{
|
||||
m_NextRatedArenaUpdate = WorldConfig.GetUIntValue(WorldCfg.ArenaRatedUpdateTimer);
|
||||
|
||||
for (var i = 0; i < (int)BattlegroundQueueTypeId.Max; ++i)
|
||||
m_BattlegroundQueues[i] = new BattlegroundQueue();
|
||||
}
|
||||
|
||||
public void DeleteAllBattlegrounds()
|
||||
{
|
||||
foreach (var data in bgDataStore.Values)
|
||||
{
|
||||
data.m_Battlegrounds.Clear();
|
||||
data.BGFreeSlotQueue.Clear();
|
||||
}
|
||||
foreach (var data in bgDataStore.Values.ToList())
|
||||
while(data.m_Battlegrounds.Empty())
|
||||
data.m_Battlegrounds.First().Value.Dispose();
|
||||
|
||||
bgDataStore.Clear();
|
||||
|
||||
foreach (var bg in m_BGFreeSlotQueue.Values.ToList())
|
||||
bg.Dispose();
|
||||
|
||||
m_BGFreeSlotQueue.Clear();
|
||||
}
|
||||
|
||||
public void Update(uint diff)
|
||||
@@ -79,23 +79,21 @@ namespace Game.BattleGrounds
|
||||
m_UpdateTimer = 0;
|
||||
}
|
||||
// update events timer
|
||||
for (var qtype = BattlegroundQueueTypeId.None; qtype < BattlegroundQueueTypeId.Max; ++qtype)
|
||||
m_BattlegroundQueues[(int)qtype].UpdateEvents(diff);
|
||||
foreach (var pair in m_BattlegroundQueues)
|
||||
pair.Value.UpdateEvents(diff);
|
||||
|
||||
// update scheduled queues
|
||||
if (!m_QueueUpdateScheduler.Empty())
|
||||
{
|
||||
List<ulong> scheduled = new List<ulong>();
|
||||
List<ScheduledQueueUpdate> scheduled = new List<ScheduledQueueUpdate>();
|
||||
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);
|
||||
uint arenaMMRating = scheduled[i].ArenaMatchmakerRating;
|
||||
BattlegroundQueueTypeId bgQueueTypeId = scheduled[i].QueueId;
|
||||
BattlegroundBracketId bracket_id = scheduled[i].BracketId;
|
||||
GetBattlegroundQueue(bgQueueTypeId).BattlegroundQueueUpdate(diff, bracket_id, arenaMMRating);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -107,14 +105,11 @@ namespace Game.BattleGrounds
|
||||
{
|
||||
// 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)
|
||||
foreach (ArenaTypes teamSize in new[] { ArenaTypes.Team2v2, ArenaTypes.Team3v3, ArenaTypes.Team5v5 })
|
||||
{
|
||||
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);
|
||||
}
|
||||
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);
|
||||
@@ -124,14 +119,14 @@ namespace Game.BattleGrounds
|
||||
}
|
||||
}
|
||||
|
||||
void BuildBattlegroundStatusHeader(BattlefieldStatusHeader header, Battleground bg, Player player, uint ticketId, uint joinTime, ArenaTypes arenaType)
|
||||
void BuildBattlegroundStatusHeader(BattlefieldStatusHeader header, Battleground bg, Player player, uint ticketId, uint joinTime, BattlegroundQueueTypeId queueId, ArenaTypes arenaType)
|
||||
{
|
||||
header.Ticket = new RideTicket();
|
||||
header.Ticket.RequesterGuid = player.GetGUID();
|
||||
header.Ticket.Id = ticketId;
|
||||
header.Ticket.Type = RideType.Battlegrounds;
|
||||
header.Ticket.Time = (int)joinTime;
|
||||
header.QueueID.Add(bg.GetQueueId());
|
||||
header.QueueID.Add(queueId.GetPacked());
|
||||
header.RangeMin = (byte)bg.GetMinLevel();
|
||||
header.RangeMax = (byte)bg.GetMaxLevel();
|
||||
header.TeamSize = (byte)(bg.IsArena() ? arenaType : 0);
|
||||
@@ -152,7 +147,7 @@ namespace Game.BattleGrounds
|
||||
public void BuildBattlegroundStatusNeedConfirmation(out BattlefieldStatusNeedConfirmation battlefieldStatus, Battleground bg, Player player, uint ticketId, uint joinTime, uint timeout, ArenaTypes arenaType)
|
||||
{
|
||||
battlefieldStatus = new BattlefieldStatusNeedConfirmation();
|
||||
BuildBattlegroundStatusHeader(battlefieldStatus.Hdr, bg, player, ticketId, joinTime, arenaType);
|
||||
BuildBattlegroundStatusHeader(battlefieldStatus.Hdr, bg, player, ticketId, joinTime, bg.GetQueueId(), arenaType);
|
||||
battlefieldStatus.Mapid = bg.GetMapId();
|
||||
battlefieldStatus.Timeout = timeout;
|
||||
battlefieldStatus.Role = 0;
|
||||
@@ -161,7 +156,7 @@ namespace Game.BattleGrounds
|
||||
public void BuildBattlegroundStatusActive(out BattlefieldStatusActive battlefieldStatus, Battleground bg, Player player, uint ticketId, uint joinTime, ArenaTypes arenaType)
|
||||
{
|
||||
battlefieldStatus = new BattlefieldStatusActive();
|
||||
BuildBattlegroundStatusHeader(battlefieldStatus.Hdr, bg, player, ticketId, joinTime, arenaType);
|
||||
BuildBattlegroundStatusHeader(battlefieldStatus.Hdr, bg, player, ticketId, joinTime, bg.GetQueueId(), arenaType);
|
||||
battlefieldStatus.ShutdownTimer = bg.GetRemainingTime();
|
||||
battlefieldStatus.ArenaFaction = (byte)(player.GetBGTeam() == Team.Horde ? TeamId.Horde : TeamId.Alliance);
|
||||
battlefieldStatus.LeftEarly = false;
|
||||
@@ -169,10 +164,10 @@ namespace Game.BattleGrounds
|
||||
battlefieldStatus.Mapid = bg.GetMapId();
|
||||
}
|
||||
|
||||
public void BuildBattlegroundStatusQueued(out BattlefieldStatusQueued battlefieldStatus, Battleground bg, Player player, uint ticketId, uint joinTime, uint avgWaitTime, ArenaTypes arenaType, bool asGroup)
|
||||
public void BuildBattlegroundStatusQueued(out BattlefieldStatusQueued battlefieldStatus, Battleground bg, Player player, uint ticketId, uint joinTime, BattlegroundQueueTypeId queueId, uint avgWaitTime, ArenaTypes arenaType, bool asGroup)
|
||||
{
|
||||
battlefieldStatus = new BattlefieldStatusQueued();
|
||||
BuildBattlegroundStatusHeader(battlefieldStatus.Hdr, bg, player, ticketId, joinTime, arenaType);
|
||||
BuildBattlegroundStatusHeader(battlefieldStatus.Hdr, bg, player, ticketId, joinTime, queueId, arenaType);
|
||||
battlefieldStatus.AverageWaitTime = avgWaitTime;
|
||||
battlefieldStatus.AsGroup = asGroup;
|
||||
battlefieldStatus.SuspendedQueue = false;
|
||||
@@ -180,14 +175,14 @@ namespace Game.BattleGrounds
|
||||
battlefieldStatus.WaitTime = Time.GetMSTimeDiffToNow(joinTime);
|
||||
}
|
||||
|
||||
public void BuildBattlegroundStatusFailed(out BattlefieldStatusFailed battlefieldStatus, Battleground bg, Player pPlayer, uint ticketId, ArenaTypes arenaType, GroupJoinBattlegroundResult result, ObjectGuid errorGuid = default)
|
||||
public void BuildBattlegroundStatusFailed(out BattlefieldStatusFailed battlefieldStatus, Battleground bg, Player pPlayer, uint ticketId, GroupJoinBattlegroundResult result, ObjectGuid errorGuid = default)
|
||||
{
|
||||
battlefieldStatus = new BattlefieldStatusFailed();
|
||||
battlefieldStatus.Ticket.RequesterGuid = pPlayer.GetGUID();
|
||||
battlefieldStatus.Ticket.Id = ticketId;
|
||||
battlefieldStatus.Ticket.Type = RideType.Battlegrounds;
|
||||
battlefieldStatus.Ticket.Time = (int)pPlayer.GetBattlegroundQueueJoinTime(BGQueueTypeId(bg.GetTypeID(), arenaType));
|
||||
battlefieldStatus.QueueID = bg.GetQueueId();
|
||||
battlefieldStatus.Ticket.Time = (int)pPlayer.GetBattlegroundQueueJoinTime(bg.GetQueueId());
|
||||
battlefieldStatus.QueueID = bg.GetQueueId().GetPacked();
|
||||
battlefieldStatus.Reason = (int)result;
|
||||
if (!errorGuid.IsEmpty() && (result == GroupJoinBattlegroundResult.NotInBattleground || result == GroupJoinBattlegroundResult.JoinTimedOut))
|
||||
battlefieldStatus.ClientID = errorGuid;
|
||||
@@ -198,7 +193,7 @@ namespace Game.BattleGrounds
|
||||
if (instanceId == 0)
|
||||
return null;
|
||||
|
||||
if (bgTypeId != BattlegroundTypeId.None)
|
||||
if (bgTypeId != BattlegroundTypeId.None || bgTypeId == BattlegroundTypeId.RB || bgTypeId == BattlegroundTypeId.RandomEpic)
|
||||
{
|
||||
var data = bgDataStore.LookupByKey(bgTypeId);
|
||||
return data.m_Battlegrounds.LookupByKey(instanceId);
|
||||
@@ -249,9 +244,9 @@ namespace Game.BattleGrounds
|
||||
}
|
||||
|
||||
// create a new Battleground that will really be used to play
|
||||
public Battleground CreateNewBattleground(BattlegroundTypeId originalBgTypeId, PvpDifficultyRecord bracketEntry, ArenaTypes arenaType, bool isRated)
|
||||
public Battleground CreateNewBattleground(BattlegroundQueueTypeId queueId, PvpDifficultyRecord bracketEntry)
|
||||
{
|
||||
BattlegroundTypeId bgTypeId = GetRandomBG(originalBgTypeId);
|
||||
BattlegroundTypeId bgTypeId = GetRandomBG((BattlegroundTypeId)queueId.BattlemasterListId);
|
||||
|
||||
// get the template BG
|
||||
Battleground bg_template = GetBattlegroundTemplate(bgTypeId);
|
||||
@@ -261,22 +256,23 @@ namespace Game.BattleGrounds
|
||||
return null;
|
||||
}
|
||||
|
||||
if (bgTypeId == BattlegroundTypeId.RB || bgTypeId == BattlegroundTypeId.AA)
|
||||
if (bgTypeId == BattlegroundTypeId.RB || bgTypeId == BattlegroundTypeId.AA || bgTypeId == BattlegroundTypeId.RandomEpic)
|
||||
return null;
|
||||
|
||||
// create a copy of the BG template
|
||||
Battleground bg = bg_template.GetCopy();
|
||||
|
||||
bool isRandom = bgTypeId != originalBgTypeId && !bg.IsArena();
|
||||
bool isRandom = bgTypeId != (BattlegroundTypeId)queueId.BattlemasterListId && !bg.IsArena();
|
||||
|
||||
bg.SetQueueId(queueId);
|
||||
bg.SetBracket(bracketEntry);
|
||||
bg.SetInstanceID(Global.MapMgr.GenerateInstanceId());
|
||||
bg.SetClientInstanceID(CreateClientVisibleInstanceId(isRandom ? BattlegroundTypeId.RB : bgTypeId, bracketEntry.GetBracketId()));
|
||||
bg.SetClientInstanceID(CreateClientVisibleInstanceId((BattlegroundTypeId)queueId.BattlemasterListId, bracketEntry.GetBracketId()));
|
||||
bg.Reset(); // reset the new bg (set status to status_wait_queue from status_none)
|
||||
bg.SetStatus(BattlegroundStatus.WaitJoin); // start the joining of the bg
|
||||
bg.SetArenaType(arenaType);
|
||||
bg.SetArenaType((ArenaTypes)queueId.TeamSize);
|
||||
bg.SetRandomTypeID(bgTypeId);
|
||||
bg.SetRated(isRated);
|
||||
bg.SetRated(queueId.Rated);
|
||||
bg.SetRandom(isRandom);
|
||||
|
||||
return bg;
|
||||
@@ -339,13 +335,15 @@ namespace Game.BattleGrounds
|
||||
bg = new BattlegroundBFG(bgTemplate);
|
||||
break;
|
||||
*/
|
||||
case BattlegroundTypeId.RandomEpic:
|
||||
bg = new Battleground(bgTemplate);
|
||||
bg.SetRandom(true);
|
||||
break;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
bg.SetInstanceID(0);
|
||||
|
||||
if (!bgDataStore.ContainsKey(bg.GetTypeID()))
|
||||
bgDataStore[bg.GetTypeID()] = new BattlegroundData();
|
||||
|
||||
@@ -390,7 +388,7 @@ namespace Game.BattleGrounds
|
||||
bgTemplate.ScriptId = Global.ObjectMgr.GetScriptId(result.Read<string>(5));
|
||||
bgTemplate.BattlemasterEntry = bl;
|
||||
|
||||
if (bgTemplate.Id != BattlegroundTypeId.AA && bgTemplate.Id != BattlegroundTypeId.RB)
|
||||
if (bgTemplate.Id != BattlegroundTypeId.AA && bgTemplate.Id != BattlegroundTypeId.RB && bgTemplate.Id != BattlegroundTypeId.RandomEpic)
|
||||
{
|
||||
uint startId = result.Read<uint>(1);
|
||||
WorldSafeLocsEntry start = Global.ObjectMgr.GetWorldSafeLoc(startId);
|
||||
@@ -486,94 +484,9 @@ namespace Game.BattleGrounds
|
||||
|| bgTypeId == BattlegroundTypeId.DS || bgTypeId == BattlegroundTypeId.RV || bgTypeId == BattlegroundTypeId.RL;
|
||||
}
|
||||
|
||||
public BattlegroundQueueTypeId BGQueueTypeId(BattlegroundTypeId bgTypeId, ArenaTypes arenaType)
|
||||
public BattlegroundQueueTypeId BGQueueTypeId(ushort battlemasterListId, BattlegroundQueueIdType type, bool rated, ArenaTypes teamSize)
|
||||
{
|
||||
switch (bgTypeId)
|
||||
{
|
||||
case BattlegroundTypeId.AB:
|
||||
return BattlegroundQueueTypeId.AB;
|
||||
case BattlegroundTypeId.AV:
|
||||
return BattlegroundQueueTypeId.AV;
|
||||
case BattlegroundTypeId.EY:
|
||||
return BattlegroundQueueTypeId.EY;
|
||||
case BattlegroundTypeId.IC:
|
||||
return BattlegroundQueueTypeId.IC;
|
||||
case BattlegroundTypeId.TP:
|
||||
return BattlegroundQueueTypeId.TP;
|
||||
case BattlegroundTypeId.BFG:
|
||||
return BattlegroundQueueTypeId.BFG;
|
||||
case BattlegroundTypeId.RB:
|
||||
return BattlegroundQueueTypeId.RB;
|
||||
case BattlegroundTypeId.SA:
|
||||
return BattlegroundQueueTypeId.SA;
|
||||
case BattlegroundTypeId.WS:
|
||||
return BattlegroundQueueTypeId.WS;
|
||||
case BattlegroundTypeId.AA:
|
||||
case BattlegroundTypeId.BE:
|
||||
case BattlegroundTypeId.DS:
|
||||
case BattlegroundTypeId.NA:
|
||||
case BattlegroundTypeId.RL:
|
||||
case BattlegroundTypeId.RV:
|
||||
switch (arenaType)
|
||||
{
|
||||
case ArenaTypes.Team2v2:
|
||||
return BattlegroundQueueTypeId.Arena2v2;
|
||||
case ArenaTypes.Team3v3:
|
||||
return BattlegroundQueueTypeId.Arena3v3;
|
||||
case ArenaTypes.Team5v5:
|
||||
return BattlegroundQueueTypeId.Arena5v5;
|
||||
default:
|
||||
return BattlegroundQueueTypeId.None;
|
||||
}
|
||||
default:
|
||||
return BattlegroundQueueTypeId.None;
|
||||
}
|
||||
}
|
||||
|
||||
public BattlegroundTypeId BGTemplateId(BattlegroundQueueTypeId bgQueueTypeId)
|
||||
{
|
||||
switch (bgQueueTypeId)
|
||||
{
|
||||
case BattlegroundQueueTypeId.WS:
|
||||
return BattlegroundTypeId.WS;
|
||||
case BattlegroundQueueTypeId.AB:
|
||||
return BattlegroundTypeId.AB;
|
||||
case BattlegroundQueueTypeId.AV:
|
||||
return BattlegroundTypeId.AV;
|
||||
case BattlegroundQueueTypeId.EY:
|
||||
return BattlegroundTypeId.EY;
|
||||
case BattlegroundQueueTypeId.SA:
|
||||
return BattlegroundTypeId.SA;
|
||||
case BattlegroundQueueTypeId.IC:
|
||||
return BattlegroundTypeId.IC;
|
||||
case BattlegroundQueueTypeId.TP:
|
||||
return BattlegroundTypeId.TP;
|
||||
case BattlegroundQueueTypeId.BFG:
|
||||
return BattlegroundTypeId.BFG;
|
||||
case BattlegroundQueueTypeId.RB:
|
||||
return BattlegroundTypeId.RB;
|
||||
case BattlegroundQueueTypeId.Arena2v2:
|
||||
case BattlegroundQueueTypeId.Arena3v3:
|
||||
case BattlegroundQueueTypeId.Arena5v5:
|
||||
return BattlegroundTypeId.AA;
|
||||
default:
|
||||
return 0; // used for unknown template (it existed and do nothing)
|
||||
}
|
||||
}
|
||||
|
||||
public ArenaTypes BGArenaType(BattlegroundQueueTypeId bgQueueTypeId)
|
||||
{
|
||||
switch (bgQueueTypeId)
|
||||
{
|
||||
case BattlegroundQueueTypeId.Arena2v2:
|
||||
return ArenaTypes.Team2v2;
|
||||
case BattlegroundQueueTypeId.Arena3v3:
|
||||
return ArenaTypes.Team3v3;
|
||||
case BattlegroundQueueTypeId.Arena5v5:
|
||||
return ArenaTypes.Team5v5;
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
return new BattlegroundQueueTypeId(battlemasterListId, (byte)type, rated, (byte)teamSize);
|
||||
}
|
||||
|
||||
public void ToggleTesting()
|
||||
@@ -599,10 +512,51 @@ namespace Game.BattleGrounds
|
||||
}
|
||||
}
|
||||
|
||||
public void ScheduleQueueUpdate(uint arenaMatchmakerRating, ArenaTypes arenaType, BattlegroundQueueTypeId bgQueueTypeId, BattlegroundTypeId bgTypeId, BattlegroundBracketId bracket_id)
|
||||
public bool IsValidQueueId(BattlegroundQueueTypeId bgQueueTypeId)
|
||||
{
|
||||
BattlemasterListRecord battlemasterList = CliDB.BattlemasterListStorage.LookupByKey(bgQueueTypeId.BattlemasterListId);
|
||||
if (battlemasterList == null)
|
||||
return false;
|
||||
|
||||
switch ((BattlegroundQueueIdType)bgQueueTypeId.BgType)
|
||||
{
|
||||
case BattlegroundQueueIdType.Battleground:
|
||||
if (battlemasterList.InstanceType != (int)MapTypes.Battleground)
|
||||
return false;
|
||||
if (bgQueueTypeId.TeamSize != 0)
|
||||
return false;
|
||||
break;
|
||||
case BattlegroundQueueIdType.Arena:
|
||||
if (battlemasterList.InstanceType != (int)MapTypes.Arena)
|
||||
return false;
|
||||
if (!bgQueueTypeId.Rated)
|
||||
return false;
|
||||
if (bgQueueTypeId.TeamSize == 0)
|
||||
return false;
|
||||
break;
|
||||
case BattlegroundQueueIdType.Wargame:
|
||||
if (bgQueueTypeId.Rated)
|
||||
return false;
|
||||
break;
|
||||
case BattlegroundQueueIdType.ArenaSkirmish:
|
||||
if (battlemasterList.InstanceType != (int)MapTypes.Arena)
|
||||
return false;
|
||||
if (bgQueueTypeId.Rated)
|
||||
return false;
|
||||
if (bgQueueTypeId.TeamSize != 0)
|
||||
return false;
|
||||
break;
|
||||
default:
|
||||
return false;
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
public void ScheduleQueueUpdate(uint arenaMatchmakerRating, BattlegroundQueueTypeId bgQueueTypeId, 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;
|
||||
ScheduledQueueUpdate scheduleId = new ScheduledQueueUpdate(arenaMatchmakerRating, bgQueueTypeId, bracket_id);
|
||||
if (!m_QueueUpdateScheduler.Contains(scheduleId))
|
||||
m_QueueUpdateScheduler.Add(scheduleId);
|
||||
}
|
||||
@@ -766,19 +720,19 @@ namespace Game.BattleGrounds
|
||||
return BattlegroundTypeId.None;
|
||||
}
|
||||
|
||||
public List<Battleground> GetBGFreeSlotQueueStore(BattlegroundTypeId bgTypeId)
|
||||
public List<Battleground> GetBGFreeSlotQueueStore(BattlegroundQueueTypeId bgTypeId)
|
||||
{
|
||||
return bgDataStore[bgTypeId].BGFreeSlotQueue;
|
||||
return m_BGFreeSlotQueue[bgTypeId];
|
||||
}
|
||||
|
||||
public void AddToBGFreeSlotQueue(BattlegroundTypeId bgTypeId, Battleground bg)
|
||||
public void AddToBGFreeSlotQueue(BattlegroundQueueTypeId bgTypeId, Battleground bg)
|
||||
{
|
||||
bgDataStore[bgTypeId].BGFreeSlotQueue.Insert(0, bg);
|
||||
m_BGFreeSlotQueue.Add(bgTypeId, bg);
|
||||
}
|
||||
|
||||
public void RemoveFromBGFreeSlotQueue(BattlegroundTypeId bgTypeId, uint instanceId)
|
||||
public void RemoveFromBGFreeSlotQueue(BattlegroundQueueTypeId bgTypeId, uint instanceId)
|
||||
{
|
||||
var queues = bgDataStore[bgTypeId].BGFreeSlotQueue;
|
||||
var queues = m_BGFreeSlotQueue[bgTypeId];
|
||||
foreach (var bg in queues)
|
||||
{
|
||||
if (bg.GetInstanceID() == instanceId)
|
||||
@@ -800,7 +754,13 @@ namespace Game.BattleGrounds
|
||||
bgDataStore[bgTypeId].m_Battlegrounds.Remove(instanceId);
|
||||
}
|
||||
|
||||
public BattlegroundQueue GetBattlegroundQueue(BattlegroundQueueTypeId bgQueueTypeId) { return m_BattlegroundQueues[(int)bgQueueTypeId]; }
|
||||
public BattlegroundQueue GetBattlegroundQueue(BattlegroundQueueTypeId bgQueueTypeId)
|
||||
{
|
||||
if (!m_BattlegroundQueues.ContainsKey(bgQueueTypeId))
|
||||
m_BattlegroundQueues[bgQueueTypeId] = new BattlegroundQueue(bgQueueTypeId);
|
||||
|
||||
return m_BattlegroundQueues[bgQueueTypeId];
|
||||
}
|
||||
|
||||
public bool IsArenaTesting() { return m_ArenaTesting; }
|
||||
public bool IsTesting() { return m_Testing; }
|
||||
@@ -821,11 +781,46 @@ namespace Game.BattleGrounds
|
||||
}
|
||||
|
||||
Dictionary<BattlegroundTypeId, BattlegroundData> bgDataStore = new Dictionary<BattlegroundTypeId, BattlegroundData>();
|
||||
BattlegroundQueue[] m_BattlegroundQueues = new BattlegroundQueue[(int)BattlegroundQueueTypeId.Max];
|
||||
Dictionary<BattlegroundQueueTypeId, BattlegroundQueue> m_BattlegroundQueues = new Dictionary<BattlegroundQueueTypeId, BattlegroundQueue>();
|
||||
MultiMap<BattlegroundQueueTypeId, Battleground> m_BGFreeSlotQueue = new MultiMap<BattlegroundQueueTypeId, Battleground>();
|
||||
Dictionary<uint, BattlegroundTypeId> mBattleMastersMap = new Dictionary<uint, BattlegroundTypeId>();
|
||||
Dictionary<BattlegroundTypeId, BattlegroundTemplate> _battlegroundTemplates = new Dictionary<BattlegroundTypeId, BattlegroundTemplate>();
|
||||
Dictionary<uint, BattlegroundTemplate> _battlegroundMapTemplates = new Dictionary<uint, BattlegroundTemplate>();
|
||||
List<ulong> m_QueueUpdateScheduler = new List<ulong>();
|
||||
|
||||
struct ScheduledQueueUpdate
|
||||
{
|
||||
public ScheduledQueueUpdate(uint arenaMatchmakerRating, BattlegroundQueueTypeId queueId, BattlegroundBracketId bracketId)
|
||||
{
|
||||
ArenaMatchmakerRating = arenaMatchmakerRating;
|
||||
QueueId = queueId;
|
||||
BracketId = bracketId;
|
||||
}
|
||||
|
||||
public uint ArenaMatchmakerRating;
|
||||
public BattlegroundQueueTypeId QueueId;
|
||||
public BattlegroundBracketId BracketId;
|
||||
|
||||
public static bool operator ==(ScheduledQueueUpdate right, ScheduledQueueUpdate left)
|
||||
{
|
||||
return left.ArenaMatchmakerRating == right.ArenaMatchmakerRating && left.QueueId == right.QueueId && left.BracketId == right.BracketId;
|
||||
}
|
||||
|
||||
public static bool operator !=(ScheduledQueueUpdate right, ScheduledQueueUpdate left)
|
||||
{
|
||||
return !(right == left);
|
||||
}
|
||||
|
||||
public override bool Equals(object obj)
|
||||
{
|
||||
return base.Equals(obj);
|
||||
}
|
||||
|
||||
public override int GetHashCode()
|
||||
{
|
||||
return ArenaMatchmakerRating.GetHashCode() ^ QueueId.GetHashCode() ^ BracketId.GetHashCode();
|
||||
}
|
||||
}
|
||||
List<ScheduledQueueUpdate> m_QueueUpdateScheduler = new List<ScheduledQueueUpdate>();
|
||||
uint m_NextRatedArenaUpdate;
|
||||
uint m_UpdateTimer;
|
||||
bool m_ArenaTesting;
|
||||
@@ -842,7 +837,6 @@ namespace Game.BattleGrounds
|
||||
|
||||
public Dictionary<uint, Battleground> m_Battlegrounds = new Dictionary<uint, Battleground>();
|
||||
public List<uint>[] m_ClientBattlegroundIds = new List<uint>[(int)BattlegroundBracketId.Max];
|
||||
public List<Battleground> BGFreeSlotQueue = new List<Battleground>();
|
||||
public Battleground Template;
|
||||
}
|
||||
|
||||
|
||||
@@ -30,8 +30,10 @@ namespace Game.BattleGrounds
|
||||
{
|
||||
public class BattlegroundQueue
|
||||
{
|
||||
public BattlegroundQueue()
|
||||
public BattlegroundQueue(BattlegroundQueueTypeId queueId)
|
||||
{
|
||||
m_queueId = queueId;
|
||||
|
||||
for (var i = 0; i < (int)BattlegroundBracketId.Max; ++i)
|
||||
{
|
||||
m_QueuedGroups[i] = new List<GroupQueueInfo>[BattlegroundConst.BgQueueTypesCount];
|
||||
@@ -329,14 +331,13 @@ namespace Game.BattleGrounds
|
||||
Player plr2 = Global.ObjAccessor.FindConnectedPlayer(group.Players.FirstOrDefault().Key);
|
||||
if (plr2)
|
||||
{
|
||||
BattlegroundQueueTypeId bgQueueTypeId = Global.BattlegroundMgr.BGQueueTypeId(group.BgTypeId, group.ArenaType);
|
||||
uint queueSlot = plr2.GetBattlegroundQueueIndex(bgQueueTypeId);
|
||||
uint queueSlot = plr2.GetBattlegroundQueueIndex(m_queueId);
|
||||
|
||||
plr2.RemoveBattlegroundQueueId(bgQueueTypeId); // must be called this way, because if you move this call to
|
||||
plr2.RemoveBattlegroundQueueId(m_queueId); // must be called this way, because if you move this call to
|
||||
// queue.removeplayer, it causes bugs
|
||||
|
||||
BattlefieldStatusNone battlefieldStatus;
|
||||
Global.BattlegroundMgr.BuildBattlegroundStatusNone(out battlefieldStatus, plr2, queueSlot, plr2.GetBattlegroundQueueJoinTime(bgQueueTypeId));
|
||||
Global.BattlegroundMgr.BuildBattlegroundStatusNone(out battlefieldStatus, plr2, queueSlot, plr2.GetBattlegroundQueueJoinTime(m_queueId));
|
||||
plr2.SendPacket(battlefieldStatus);
|
||||
}
|
||||
// then actually delete, this may delete the group as well!
|
||||
@@ -381,7 +382,7 @@ namespace Game.BattleGrounds
|
||||
// set invitation
|
||||
ginfo.IsInvitedToBGInstanceGUID = bg.GetInstanceID();
|
||||
BattlegroundTypeId bgTypeId = bg.GetTypeID();
|
||||
BattlegroundQueueTypeId bgQueueTypeId = Global.BattlegroundMgr.BGQueueTypeId(bgTypeId, bg.GetArenaType());
|
||||
BattlegroundQueueTypeId bgQueueTypeId = bg.GetQueueId();
|
||||
BattlegroundBracketId bracket_id = bg.GetBracketId();
|
||||
|
||||
// set ArenaTeamId for rated matches
|
||||
@@ -411,7 +412,7 @@ namespace Game.BattleGrounds
|
||||
BGQueueInviteEvent inviteEvent = new BGQueueInviteEvent(player.GetGUID(), ginfo.IsInvitedToBGInstanceGUID, bgTypeId, ginfo.ArenaType, ginfo.RemoveInviteTime);
|
||||
m_events.AddEvent(inviteEvent, m_events.CalculateTime(BattlegroundConst.InvitationRemindTime));
|
||||
// create automatic remove events
|
||||
BGQueueRemoveEvent removeEvent = new BGQueueRemoveEvent(player.GetGUID(), ginfo.IsInvitedToBGInstanceGUID, bgTypeId, bgQueueTypeId, ginfo.RemoveInviteTime);
|
||||
BGQueueRemoveEvent removeEvent = new BGQueueRemoveEvent(player.GetGUID(), ginfo.IsInvitedToBGInstanceGUID, bgQueueTypeId, ginfo.RemoveInviteTime);
|
||||
m_events.AddEvent(removeEvent, m_events.CalculateTime(BattlegroundConst.InviteAcceptWaitTime));
|
||||
|
||||
uint queueSlot = player.GetBattlegroundQueueIndex(bgQueueTypeId);
|
||||
@@ -730,7 +731,7 @@ namespace Game.BattleGrounds
|
||||
/// <param name="arenaType"></param>
|
||||
/// <param name="isRated"></param>
|
||||
/// <param name="arenaRating"></param>
|
||||
public void BattlegroundQueueUpdate(uint diff, BattlegroundTypeId bgTypeId, BattlegroundBracketId bracket_id, byte arenaType, bool isRated, uint arenaRating)
|
||||
public void BattlegroundQueueUpdate(uint diff, BattlegroundBracketId bracket_id, uint arenaRating)
|
||||
{
|
||||
//if no players in queue - do nothing
|
||||
if (m_QueuedGroups[(int)bracket_id][BattlegroundConst.BgQueuePremadeAlliance].Empty() &&
|
||||
@@ -741,11 +742,11 @@ namespace Game.BattleGrounds
|
||||
|
||||
// Battleground with free slot for player should be always in the beggining of the queue
|
||||
// maybe it would be better to create bgfreeslotqueue for each bracket_id
|
||||
var bgQueues = Global.BattlegroundMgr.GetBGFreeSlotQueueStore(bgTypeId);
|
||||
var bgQueues = Global.BattlegroundMgr.GetBGFreeSlotQueueStore(m_queueId);
|
||||
foreach (var bg in bgQueues)
|
||||
{
|
||||
// DO NOT allow queue manager to invite new player to rated games
|
||||
if (!bg.IsRated() && bg.GetTypeID() == bgTypeId && bg.GetBracketId() == bracket_id &&
|
||||
if (!bg.IsRated() && bg.GetBracketId() == bracket_id &&
|
||||
bg.GetStatus() > BattlegroundStatus.WaitQueue && bg.GetStatus() < BattlegroundStatus.WaitLeave)
|
||||
{
|
||||
// clear selection pools
|
||||
@@ -769,10 +770,10 @@ namespace Game.BattleGrounds
|
||||
|
||||
// finished iterating through the bgs with free slots, maybe we need to create a new bg
|
||||
|
||||
Battleground bg_template = Global.BattlegroundMgr.GetBattlegroundTemplate(bgTypeId);
|
||||
Battleground bg_template = Global.BattlegroundMgr.GetBattlegroundTemplate((BattlegroundTypeId)m_queueId.BattlemasterListId);
|
||||
if (!bg_template)
|
||||
{
|
||||
Log.outError(LogFilter.Battleground, "Battleground: Update: bg template not found for {0}", bgTypeId);
|
||||
Log.outError(LogFilter.Battleground, $"Battleground: Update: bg template not found for {m_queueId.BattlemasterListId}");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -789,8 +790,8 @@ namespace Game.BattleGrounds
|
||||
|
||||
if (bg_template.IsArena())
|
||||
{
|
||||
MaxPlayersPerTeam = arenaType;
|
||||
MinPlayersPerTeam = (uint)(Global.BattlegroundMgr.IsArenaTesting() ? 1 : arenaType);
|
||||
MaxPlayersPerTeam = m_queueId.TeamSize;
|
||||
MinPlayersPerTeam = Global.BattlegroundMgr.IsArenaTesting() ? 1u : m_queueId.TeamSize;
|
||||
}
|
||||
else if (Global.BattlegroundMgr.IsTesting())
|
||||
MinPlayersPerTeam = 1;
|
||||
@@ -803,10 +804,10 @@ namespace Game.BattleGrounds
|
||||
if (CheckPremadeMatch(bracket_id, MinPlayersPerTeam, MaxPlayersPerTeam))
|
||||
{
|
||||
// create new Battleground
|
||||
Battleground bg2 = Global.BattlegroundMgr.CreateNewBattleground(bgTypeId, bracketEntry, 0, false);
|
||||
Battleground bg2 = Global.BattlegroundMgr.CreateNewBattleground(m_queueId, bracketEntry);
|
||||
if (bg2 == null)
|
||||
{
|
||||
Log.outError(LogFilter.Battleground, "BattlegroundQueue.Update - Cannot create Battleground: {0}", bgTypeId);
|
||||
Log.outError(LogFilter.Battleground, $"BattlegroundQueue.Update - Cannot create Battleground: {m_queueId.BattlemasterListId}");
|
||||
return;
|
||||
}
|
||||
// invite those selection pools
|
||||
@@ -822,17 +823,17 @@ namespace Game.BattleGrounds
|
||||
}
|
||||
|
||||
// now check if there are in queues enough players to start new game of (normal Battleground, or non-rated arena)
|
||||
if (!isRated)
|
||||
if (!m_queueId.Rated)
|
||||
{
|
||||
// if there are enough players in pools, start new Battleground or non rated arena
|
||||
if (CheckNormalMatch(bg_template, bracket_id, MinPlayersPerTeam, MaxPlayersPerTeam)
|
||||
|| (bg_template.IsArena() && CheckSkirmishForSameFaction(bracket_id, MinPlayersPerTeam)))
|
||||
{
|
||||
// we successfully created a pool
|
||||
Battleground bg2 = Global.BattlegroundMgr.CreateNewBattleground(bgTypeId, bracketEntry, (ArenaTypes)arenaType, false);
|
||||
Battleground bg2 = Global.BattlegroundMgr.CreateNewBattleground(m_queueId, bracketEntry);
|
||||
if (bg2 == null)
|
||||
{
|
||||
Log.outError(LogFilter.Battleground, "BattlegroundQueue.Update - Cannot create Battleground: {0}", bgTypeId);
|
||||
Log.outError(LogFilter.Battleground, $"BattlegroundQueue.Update - Cannot create Battleground: {m_queueId.BattlemasterListId}");
|
||||
return;
|
||||
}
|
||||
|
||||
@@ -928,7 +929,7 @@ namespace Game.BattleGrounds
|
||||
{
|
||||
GroupQueueInfo aTeam = queueArray[TeamId.Alliance];
|
||||
GroupQueueInfo hTeam = queueArray[TeamId.Horde];
|
||||
Battleground arena = Global.BattlegroundMgr.CreateNewBattleground(bgTypeId, bracketEntry, (ArenaTypes)arenaType, true);
|
||||
Battleground arena = Global.BattlegroundMgr.CreateNewBattleground(m_queueId, bracketEntry);
|
||||
if (!arena)
|
||||
{
|
||||
Log.outError(LogFilter.Battleground, "BattlegroundQueue.Update couldn't create arena instance for rated arena match!");
|
||||
@@ -965,6 +966,8 @@ namespace Game.BattleGrounds
|
||||
}
|
||||
}
|
||||
|
||||
BattlegroundQueueTypeId m_queueId;
|
||||
|
||||
Dictionary<ObjectGuid, PlayerQueueInfo> m_QueuedPlayers = new Dictionary<ObjectGuid, PlayerQueueInfo>();
|
||||
|
||||
/// <summary>
|
||||
@@ -1046,6 +1049,85 @@ namespace Game.BattleGrounds
|
||||
|
||||
}
|
||||
|
||||
public struct BattlegroundQueueTypeId
|
||||
{
|
||||
public ushort BattlemasterListId;
|
||||
public byte BgType;
|
||||
public bool Rated;
|
||||
public byte TeamSize;
|
||||
|
||||
public BattlegroundQueueTypeId(ushort battlemasterListId, byte bgType, bool rated, byte teamSize)
|
||||
{
|
||||
BattlemasterListId = battlemasterListId;
|
||||
BgType = bgType;
|
||||
Rated = rated;
|
||||
TeamSize = teamSize;
|
||||
}
|
||||
|
||||
public static BattlegroundQueueTypeId FromPacked(ulong packedQueueId)
|
||||
{
|
||||
return new BattlegroundQueueTypeId((ushort)(packedQueueId & 0xFFFF), (byte)((packedQueueId >> 16) & 0xF), ((packedQueueId >> 20) & 1) != 0, (byte)((packedQueueId >> 24) & 0x3F));
|
||||
}
|
||||
|
||||
public ulong GetPacked()
|
||||
{
|
||||
return (ulong)BattlemasterListId
|
||||
| ((ulong)(BgType & 0xF) << 16)
|
||||
| ((ulong)(Rated ? 1 : 0) << 20)
|
||||
| ((ulong)(TeamSize & 0x3F) << 24)
|
||||
| 0x1F10000000000000;
|
||||
}
|
||||
|
||||
public static bool operator ==(BattlegroundQueueTypeId left, BattlegroundQueueTypeId right)
|
||||
{
|
||||
return left.BattlemasterListId == right.BattlemasterListId
|
||||
&& left.BgType == right.BgType
|
||||
&& left.Rated == right.Rated
|
||||
&& left.TeamSize == right.TeamSize;
|
||||
}
|
||||
|
||||
public static bool operator !=(BattlegroundQueueTypeId left, BattlegroundQueueTypeId right)
|
||||
{
|
||||
return !(left == right);
|
||||
}
|
||||
|
||||
public static bool operator <(BattlegroundQueueTypeId left, BattlegroundQueueTypeId right)
|
||||
{
|
||||
if (left.BattlemasterListId != right.BattlemasterListId)
|
||||
return left.BattlemasterListId < right.BattlemasterListId;
|
||||
if (left.BgType != right.BgType)
|
||||
return left.BgType < right.BgType;
|
||||
if (left.Rated != right.Rated)
|
||||
return (left.Rated ? 1 : 0) < (right.Rated ? 1 : 0);
|
||||
return left.TeamSize < right.TeamSize;
|
||||
}
|
||||
public static bool operator >(BattlegroundQueueTypeId left, BattlegroundQueueTypeId right)
|
||||
{
|
||||
if (left.BattlemasterListId != right.BattlemasterListId)
|
||||
return left.BattlemasterListId > right.BattlemasterListId;
|
||||
if (left.BgType != right.BgType)
|
||||
return left.BgType > right.BgType;
|
||||
if (left.Rated != right.Rated)
|
||||
return (left.Rated ? 1 : 0) > (right.Rated ? 1 : 0);
|
||||
return left.TeamSize > right.TeamSize;
|
||||
}
|
||||
|
||||
public override bool Equals(object obj)
|
||||
{
|
||||
return base.Equals(obj);
|
||||
}
|
||||
|
||||
public override int GetHashCode()
|
||||
{
|
||||
return BattlemasterListId.GetHashCode() ^ BgType.GetHashCode() ^ Rated.GetHashCode() ^ TeamSize.GetHashCode();
|
||||
}
|
||||
|
||||
public override string ToString()
|
||||
{
|
||||
return $"{{ BattlemasterListId: {BattlemasterListId}, Type: {BgType}, Rated: {Rated}, TeamSize: {TeamSize} }}";
|
||||
}
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
/// stores information for players in queue
|
||||
/// </summary>
|
||||
@@ -1081,11 +1163,11 @@ namespace Game.BattleGrounds
|
||||
/// </summary>
|
||||
class BGQueueInviteEvent : BasicEvent
|
||||
{
|
||||
public BGQueueInviteEvent(ObjectGuid pl_guid, uint BgInstanceGUID, BattlegroundTypeId BgTypeId, ArenaTypes arenaType, uint removeTime)
|
||||
public BGQueueInviteEvent(ObjectGuid plGuid, uint bgInstanceGUID, BattlegroundTypeId bgTypeId, ArenaTypes arenaType, uint removeTime)
|
||||
{
|
||||
m_PlayerGuid = pl_guid;
|
||||
m_BgInstanceGUID = BgInstanceGUID;
|
||||
m_BgTypeId = BgTypeId;
|
||||
m_PlayerGuid = plGuid;
|
||||
m_BgInstanceGUID = bgInstanceGUID;
|
||||
m_BgTypeId = bgTypeId;
|
||||
m_ArenaType = arenaType;
|
||||
m_RemoveTime = removeTime;
|
||||
}
|
||||
@@ -1102,7 +1184,7 @@ namespace Game.BattleGrounds
|
||||
if (bg == null)
|
||||
return true;
|
||||
|
||||
BattlegroundQueueTypeId bgQueueTypeId = Global.BattlegroundMgr.BGQueueTypeId(bg.GetTypeID(), bg.GetArenaType());
|
||||
BattlegroundQueueTypeId bgQueueTypeId = bg.GetQueueId();
|
||||
uint queueSlot = player.GetBattlegroundQueueIndex(bgQueueTypeId);
|
||||
if (queueSlot < SharedConst.BGTeamsCount) // player is in queue or in Battleground
|
||||
{
|
||||
@@ -1134,12 +1216,11 @@ namespace Game.BattleGrounds
|
||||
/// </summary>
|
||||
class BGQueueRemoveEvent : BasicEvent
|
||||
{
|
||||
public BGQueueRemoveEvent(ObjectGuid pl_guid, uint bgInstanceGUID, BattlegroundTypeId BgTypeId, BattlegroundQueueTypeId bgQueueTypeId, uint removeTime)
|
||||
public BGQueueRemoveEvent(ObjectGuid plGuid, uint bgInstanceGUID, BattlegroundQueueTypeId bgQueueTypeId, uint removeTime)
|
||||
{
|
||||
m_PlayerGuid = pl_guid;
|
||||
m_PlayerGuid = plGuid;
|
||||
m_BgInstanceGUID = bgInstanceGUID;
|
||||
m_RemoveTime = removeTime;
|
||||
m_BgTypeId = BgTypeId;
|
||||
m_BgQueueTypeId = bgQueueTypeId;
|
||||
}
|
||||
|
||||
@@ -1150,7 +1231,7 @@ namespace Game.BattleGrounds
|
||||
// player logged off (we should do nothing, he is correctly removed from queue in another procedure)
|
||||
return true;
|
||||
|
||||
Battleground bg = Global.BattlegroundMgr.GetBattleground(m_BgInstanceGUID, m_BgTypeId);
|
||||
Battleground bg = Global.BattlegroundMgr.GetBattleground(m_BgInstanceGUID, (BattlegroundTypeId)m_BgQueueTypeId.BattlemasterListId);
|
||||
//Battleground can be deleted already when we are removing queue info
|
||||
//bg pointer can be NULL! so use it carefully!
|
||||
|
||||
@@ -1167,7 +1248,7 @@ namespace Game.BattleGrounds
|
||||
bgQueue.RemovePlayer(m_PlayerGuid, true);
|
||||
//update queues if Battleground isn't ended
|
||||
if (bg && bg.IsBattleground() && bg.GetStatus() != BattlegroundStatus.WaitLeave)
|
||||
Global.BattlegroundMgr.ScheduleQueueUpdate(0, 0, m_BgQueueTypeId, m_BgTypeId, bg.GetBracketId());
|
||||
Global.BattlegroundMgr.ScheduleQueueUpdate(0, m_BgQueueTypeId, bg.GetBracketId());
|
||||
|
||||
BattlefieldStatusNone battlefieldStatus;
|
||||
Global.BattlegroundMgr.BuildBattlegroundStatusNone(out battlefieldStatus, player, queueSlot, player.GetBattlegroundQueueJoinTime(m_BgQueueTypeId));
|
||||
@@ -1184,7 +1265,6 @@ namespace Game.BattleGrounds
|
||||
ObjectGuid m_PlayerGuid;
|
||||
uint m_BgInstanceGUID;
|
||||
uint m_RemoveTime;
|
||||
BattlegroundTypeId m_BgTypeId;
|
||||
BattlegroundQueueTypeId m_BgQueueTypeId;
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user