Core/Battlegrounds: Queue updates
Port From (https://github.com/TrinityCore/TrinityCore/commit/bf8714b8705c3fccc77083c6dc8665767430d346)
This commit is contained in:
@@ -134,25 +134,8 @@ namespace Framework.Constants
|
|||||||
// 809 = "New Nagrand Arena (Legion)"
|
// 809 = "New Nagrand Arena (Legion)"
|
||||||
AF = 816, // Ashamane'S Fall
|
AF = 816, // Ashamane'S Fall
|
||||||
// 844 = "New Blade'S Edge Arena (Legion)"
|
// 844 = "New Blade'S Edge Arena (Legion)"
|
||||||
Max = 845
|
RandomEpic = 901,
|
||||||
}
|
Max = 902
|
||||||
|
|
||||||
public enum BattlegroundQueueTypeId
|
|
||||||
{
|
|
||||||
None = 0,
|
|
||||||
AV = 1,
|
|
||||||
WS = 2,
|
|
||||||
AB = 3,
|
|
||||||
EY = 4,
|
|
||||||
SA = 5,
|
|
||||||
IC = 6,
|
|
||||||
TP = 7,
|
|
||||||
BFG = 8,
|
|
||||||
RB = 9,
|
|
||||||
Arena2v2 = 10,
|
|
||||||
Arena3v3 = 11,
|
|
||||||
Arena5v5 = 12,
|
|
||||||
Max
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public enum BattlegroundQueueIdType
|
public enum BattlegroundQueueIdType
|
||||||
|
|||||||
@@ -799,8 +799,6 @@ namespace Framework.Constants
|
|||||||
AreaTriggerRePath = 0x263f,
|
AreaTriggerRePath = 0x263f,
|
||||||
AreaTriggerReShape = 0x2644,
|
AreaTriggerReShape = 0x2644,
|
||||||
ArenaCrowdControlSpells = 0x2652,
|
ArenaCrowdControlSpells = 0x2652,
|
||||||
ArenaMatchEnd = 0x28a7,
|
|
||||||
ArenaMatchStart = 0x28a6,
|
|
||||||
ArenaPrepOpponentSpecializations = 0x2668,
|
ArenaPrepOpponentSpecializations = 0x2668,
|
||||||
ArtifactForgeOpened = 0x27e8,
|
ArtifactForgeOpened = 0x27e8,
|
||||||
ArtifactRespecConfirm = 0x27eb,
|
ArtifactRespecConfirm = 0x27eb,
|
||||||
@@ -1517,7 +1515,9 @@ namespace Framework.Constants
|
|||||||
PushSpellToActionBar = 0x2c51,
|
PushSpellToActionBar = 0x2c51,
|
||||||
PvpCredit = 0x271f,
|
PvpCredit = 0x271f,
|
||||||
PvpLogData = 0x25b4,
|
PvpLogData = 0x25b4,
|
||||||
PvpMatchStart = 0x28ac,
|
PvpMatchEnd = 0x28a7,
|
||||||
|
PvpMatchInit = 0x28ac,
|
||||||
|
PvpMatchStart = 0x28a6,
|
||||||
PvpOptionsEnabled = 0x25b7,
|
PvpOptionsEnabled = 0x25b7,
|
||||||
PvpSeason = 0x25d4,
|
PvpSeason = 0x25d4,
|
||||||
QueryBattlePetNameResponse = 0x270e,
|
QueryBattlePetNameResponse = 0x270e,
|
||||||
|
|||||||
@@ -472,7 +472,7 @@ namespace Framework.Constants
|
|||||||
InvisibilityGlow = 0x40
|
InvisibilityGlow = 0x40
|
||||||
}
|
}
|
||||||
|
|
||||||
public enum AreaTeams
|
public enum ArenaTeams
|
||||||
{
|
{
|
||||||
None = 0,
|
None = 0,
|
||||||
Ally = 2,
|
Ally = 2,
|
||||||
|
|||||||
@@ -415,14 +415,6 @@ namespace Game.BattleGrounds
|
|||||||
Player player = Global.ObjAccessor.FindPlayer(guid);
|
Player player = Global.ObjAccessor.FindPlayer(guid);
|
||||||
if (player)
|
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
|
// Correctly display EnemyUnitFrame
|
||||||
player.SetArenaFaction((byte)player.GetBGTeam());
|
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!
|
//we must set it this way, because end time is sent in packet!
|
||||||
SetRemainingTime(BattlegroundConst.AutocloseBattleground);
|
SetRemainingTime(BattlegroundConst.AutocloseBattleground);
|
||||||
|
|
||||||
PVPLogData pvpLogData;
|
PVPMatchEnd pvpMatchEnd = new PVPMatchEnd();
|
||||||
BuildPvPLogDataPacket(out pvpLogData);
|
pvpMatchEnd.Winner = (byte)GetWinner();
|
||||||
|
pvpMatchEnd.Duration = (int)Math.Max(0, (GetElapsedTime() - (int)BattlegroundStartTimeIntervals.Delay2m) / Time.InMilliseconds);
|
||||||
BattlegroundQueueTypeId bgQueueTypeId = Global.BattlegroundMgr.BGQueueTypeId(GetTypeID(), GetArenaType());
|
pvpMatchEnd.LogData.HasValue = true;
|
||||||
|
BuildPvPLogDataPacket(out pvpMatchEnd.LogData.Value);
|
||||||
|
pvpMatchEnd.Write();
|
||||||
|
|
||||||
foreach (var pair in m_Players)
|
foreach (var pair in m_Players)
|
||||||
{
|
{
|
||||||
@@ -799,11 +793,7 @@ namespace Game.BattleGrounds
|
|||||||
|
|
||||||
BlockMovement(player);
|
BlockMovement(player);
|
||||||
|
|
||||||
player.SendPacket(pvpLogData);
|
player.SendPacket(pvpMatchEnd);
|
||||||
|
|
||||||
BattlefieldStatusActive battlefieldStatus;
|
|
||||||
Global.BattlegroundMgr.BuildBattlegroundStatusActive(out battlefieldStatus, this, player, player.GetBattlegroundQueueIndex(bgQueueTypeId), player.GetBattlegroundQueueJoinTime(bgQueueTypeId), GetArenaType());
|
|
||||||
player.SendPacket(battlefieldStatus);
|
|
||||||
|
|
||||||
player.UpdateCriteria(CriteriaTypes.CompleteBattleground, player.GetMapId());
|
player.UpdateCriteria(CriteriaTypes.CompleteBattleground, player.GetMapId());
|
||||||
}
|
}
|
||||||
@@ -866,7 +856,7 @@ namespace Game.BattleGrounds
|
|||||||
RemovePlayer(player, guid, team); // BG subclass specific code
|
RemovePlayer(player, guid, team); // BG subclass specific code
|
||||||
|
|
||||||
BattlegroundTypeId bgTypeId = GetTypeID();
|
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
|
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
|
// a player has left the Battleground, so there are free slots . add to queue
|
||||||
AddToBGFreeSlotQueue();
|
AddToBGFreeSlotQueue();
|
||||||
Global.BattlegroundMgr.ScheduleQueueUpdate(0, 0, bgQueueTypeId, bgTypeId, GetBracketId());
|
Global.BattlegroundMgr.ScheduleQueueUpdate(0, bgQueueTypeId, GetBracketId());
|
||||||
}
|
}
|
||||||
// Let others know
|
// Let others know
|
||||||
BattlegroundPlayerLeft playerLeft = new BattlegroundPlayerLeft();
|
BattlegroundPlayerLeft playerLeft = new BattlegroundPlayerLeft();
|
||||||
@@ -1006,13 +996,36 @@ namespace Game.BattleGrounds
|
|||||||
playerJoined.Guid = player.GetGUID();
|
playerJoined.Guid = player.GetGUID();
|
||||||
SendPacketToTeam(team, playerJoined, player);
|
SendPacketToTeam(team, playerJoined, player);
|
||||||
|
|
||||||
// BG Status packet
|
PVPMatchInit pvpMatchState = new PVPMatchInit();
|
||||||
BattlegroundQueueTypeId bgQueueTypeId = Global.BattlegroundMgr.BGQueueTypeId(GetTypeID(), GetArenaType());
|
pvpMatchState.MapID = GetMapId();
|
||||||
uint queueSlot = player.GetBattlegroundQueueIndex(bgQueueTypeId);
|
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;
|
if (GetElapsedTime() >= (int)BattlegroundStartTimeIntervals.Delay2m)
|
||||||
Global.BattlegroundMgr.BuildBattlegroundStatusActive(out battlefieldStatus, this, player, queueSlot, player.GetBattlegroundQueueJoinTime(bgQueueTypeId), GetArenaType());
|
{
|
||||||
player.SendPacket(battlefieldStatus);
|
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);
|
player.RemoveAurasByType(AuraType.Mounted);
|
||||||
|
|
||||||
@@ -1132,7 +1145,7 @@ namespace Game.BattleGrounds
|
|||||||
{
|
{
|
||||||
if (!m_InBGFreeSlotQueue && IsBattleground())
|
if (!m_InBGFreeSlotQueue && IsBattleground())
|
||||||
{
|
{
|
||||||
Global.BattlegroundMgr.AddToBGFreeSlotQueue(GetTypeID(), this);
|
Global.BattlegroundMgr.AddToBGFreeSlotQueue(GetQueueId(), this);
|
||||||
m_InBGFreeSlotQueue = true;
|
m_InBGFreeSlotQueue = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1142,7 +1155,7 @@ namespace Game.BattleGrounds
|
|||||||
{
|
{
|
||||||
if (m_InBGFreeSlotQueue)
|
if (m_InBGFreeSlotQueue)
|
||||||
{
|
{
|
||||||
Global.BattlegroundMgr.RemoveFromBGFreeSlotQueue(GetTypeID(), m_InstanceID);
|
Global.BattlegroundMgr.RemoveFromBGFreeSlotQueue(GetQueueId(), m_InstanceID);
|
||||||
m_InBGFreeSlotQueue = false;
|
m_InBGFreeSlotQueue = false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1415,7 +1428,7 @@ namespace Game.BattleGrounds
|
|||||||
|
|
||||||
public uint GetMapId()
|
public uint GetMapId()
|
||||||
{
|
{
|
||||||
return _battlegroundTemplate.BattlemasterEntry.MapId[0];
|
return (uint)_battlegroundTemplate.BattlemasterEntry.MapId[0];
|
||||||
}
|
}
|
||||||
|
|
||||||
public void SpawnBGObject(int type, uint respawntime)
|
public void SpawnBGObject(int type, uint respawntime)
|
||||||
@@ -1692,17 +1705,11 @@ namespace Game.BattleGrounds
|
|||||||
if (GetStatus() != BattlegroundStatus.WaitLeave)
|
if (GetStatus() != BattlegroundStatus.WaitLeave)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
PVPLogData pvpLogData;
|
|
||||||
BattlegroundQueueTypeId bgQueueTypeId = Global.BattlegroundMgr.BGQueueTypeId(GetTypeID(), GetArenaType());
|
|
||||||
|
|
||||||
BlockMovement(player);
|
BlockMovement(player);
|
||||||
|
|
||||||
BuildPvPLogDataPacket(out pvpLogData);
|
PVPLogDataMessage pvpLogData = new PVPLogDataMessage();
|
||||||
|
BuildPvPLogDataPacket(out pvpLogData.Data);
|
||||||
player.SendPacket(pvpLogData);
|
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)
|
public uint GetAlivePlayersCountByTeam(Team Team)
|
||||||
@@ -1801,15 +1808,6 @@ namespace Game.BattleGrounds
|
|||||||
return _battlegroundTemplate.BattlemasterEntry.Name[Global.WorldMgr.GetDefaultDbcLocale()];
|
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)
|
public BattlegroundTypeId GetTypeID(bool getRandom = false)
|
||||||
{
|
{
|
||||||
return getRandom ? m_RandomTypeID : _battlegroundTemplate.Id;
|
return getRandom ? m_RandomTypeID : _battlegroundTemplate.Id;
|
||||||
@@ -1883,6 +1881,7 @@ namespace Game.BattleGrounds
|
|||||||
public virtual void DestroyGate(Player player, GameObject go) { }
|
public virtual void DestroyGate(Player player, GameObject go) { }
|
||||||
public virtual bool IsAllNodesControlledByTeam(Team team) { return false; }
|
public virtual bool IsAllNodesControlledByTeam(Team team) { return false; }
|
||||||
|
|
||||||
|
public BattlegroundQueueTypeId GetQueueId() { return m_queueId; }
|
||||||
public uint GetInstanceID() { return m_InstanceID; }
|
public uint GetInstanceID() { return m_InstanceID; }
|
||||||
public BattlegroundStatus GetStatus() { return m_Status; }
|
public BattlegroundStatus GetStatus() { return m_Status; }
|
||||||
public uint GetClientInstanceID() { return m_ClientInstanceID; }
|
public uint GetClientInstanceID() { return m_ClientInstanceID; }
|
||||||
@@ -1895,6 +1894,7 @@ namespace Game.BattleGrounds
|
|||||||
BattlegroundTeamId GetWinner() { return _winnerTeamId; }
|
BattlegroundTeamId GetWinner() { return _winnerTeamId; }
|
||||||
public bool IsRandom() { return m_IsRandom; }
|
public bool IsRandom() { return m_IsRandom; }
|
||||||
|
|
||||||
|
public void SetQueueId(BattlegroundQueueTypeId queueId) { m_queueId = queueId; }
|
||||||
public void SetRandomTypeID(BattlegroundTypeId TypeID) { m_RandomTypeID = TypeID; }
|
public void SetRandomTypeID(BattlegroundTypeId TypeID) { m_RandomTypeID = TypeID; }
|
||||||
//here we can count minlevel and maxlevel for players
|
//here we can count minlevel and maxlevel for players
|
||||||
public void SetInstanceID(uint InstanceID) { m_InstanceID = InstanceID; }
|
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 };
|
public uint[] Buff_Entries = { BattlegroundConst.SpeedBuff, BattlegroundConst.RegenBuff, BattlegroundConst.BerserkerBuff };
|
||||||
|
|
||||||
// Battleground
|
// Battleground
|
||||||
|
BattlegroundQueueTypeId m_queueId;
|
||||||
BattlegroundTypeId m_RandomTypeID;
|
BattlegroundTypeId m_RandomTypeID;
|
||||||
uint m_InstanceID; // Battleground Instance's GUID!
|
uint m_InstanceID; // Battleground Instance's GUID!
|
||||||
BattlegroundStatus m_Status;
|
BattlegroundStatus m_Status;
|
||||||
|
|||||||
@@ -33,20 +33,20 @@ namespace Game.BattleGrounds
|
|||||||
BattlegroundManager()
|
BattlegroundManager()
|
||||||
{
|
{
|
||||||
m_NextRatedArenaUpdate = WorldConfig.GetUIntValue(WorldCfg.ArenaRatedUpdateTimer);
|
m_NextRatedArenaUpdate = WorldConfig.GetUIntValue(WorldCfg.ArenaRatedUpdateTimer);
|
||||||
|
|
||||||
for (var i = 0; i < (int)BattlegroundQueueTypeId.Max; ++i)
|
|
||||||
m_BattlegroundQueues[i] = new BattlegroundQueue();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void DeleteAllBattlegrounds()
|
public void DeleteAllBattlegrounds()
|
||||||
{
|
{
|
||||||
foreach (var data in bgDataStore.Values)
|
foreach (var data in bgDataStore.Values.ToList())
|
||||||
{
|
while(data.m_Battlegrounds.Empty())
|
||||||
data.m_Battlegrounds.Clear();
|
data.m_Battlegrounds.First().Value.Dispose();
|
||||||
data.BGFreeSlotQueue.Clear();
|
|
||||||
}
|
|
||||||
|
|
||||||
bgDataStore.Clear();
|
bgDataStore.Clear();
|
||||||
|
|
||||||
|
foreach (var bg in m_BGFreeSlotQueue.Values.ToList())
|
||||||
|
bg.Dispose();
|
||||||
|
|
||||||
|
m_BGFreeSlotQueue.Clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
public void Update(uint diff)
|
public void Update(uint diff)
|
||||||
@@ -79,23 +79,21 @@ namespace Game.BattleGrounds
|
|||||||
m_UpdateTimer = 0;
|
m_UpdateTimer = 0;
|
||||||
}
|
}
|
||||||
// update events timer
|
// update events timer
|
||||||
for (var qtype = BattlegroundQueueTypeId.None; qtype < BattlegroundQueueTypeId.Max; ++qtype)
|
foreach (var pair in m_BattlegroundQueues)
|
||||||
m_BattlegroundQueues[(int)qtype].UpdateEvents(diff);
|
pair.Value.UpdateEvents(diff);
|
||||||
|
|
||||||
// update scheduled queues
|
// update scheduled queues
|
||||||
if (!m_QueueUpdateScheduler.Empty())
|
if (!m_QueueUpdateScheduler.Empty())
|
||||||
{
|
{
|
||||||
List<ulong> scheduled = new List<ulong>();
|
List<ScheduledQueueUpdate> scheduled = new List<ScheduledQueueUpdate>();
|
||||||
Extensions.Swap(ref scheduled, ref m_QueueUpdateScheduler);
|
Extensions.Swap(ref scheduled, ref m_QueueUpdateScheduler);
|
||||||
|
|
||||||
for (byte i = 0; i < scheduled.Count; i++)
|
for (byte i = 0; i < scheduled.Count; i++)
|
||||||
{
|
{
|
||||||
uint arenaMMRating = (uint)(scheduled[i] >> 32);
|
uint arenaMMRating = scheduled[i].ArenaMatchmakerRating;
|
||||||
byte arenaType = (byte)(scheduled[i] >> 24 & 255);
|
BattlegroundQueueTypeId bgQueueTypeId = scheduled[i].QueueId;
|
||||||
BattlegroundQueueTypeId bgQueueTypeId = (BattlegroundQueueTypeId)(scheduled[i] >> 16 & 255);
|
BattlegroundBracketId bracket_id = scheduled[i].BracketId;
|
||||||
BattlegroundTypeId bgTypeId = (BattlegroundTypeId)((scheduled[i] >> 8) & 255);
|
GetBattlegroundQueue(bgQueueTypeId).BattlegroundQueueUpdate(diff, bracket_id, arenaMMRating);
|
||||||
BattlegroundBracketId bracket_id = (BattlegroundBracketId)(scheduled[i] & 255);
|
|
||||||
m_BattlegroundQueues[(int)bgQueueTypeId].BattlegroundQueueUpdate(diff, bgTypeId, bracket_id, arenaType, arenaMMRating > 0, arenaMMRating);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -107,14 +105,11 @@ namespace Game.BattleGrounds
|
|||||||
{
|
{
|
||||||
// forced update for rated arenas (scan all, but skipped non rated)
|
// forced update for rated arenas (scan all, but skipped non rated)
|
||||||
Log.outDebug(LogFilter.Arena, "BattlegroundMgr: UPDATING ARENA QUEUES");
|
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)
|
BattlegroundQueueTypeId ratedArenaQueueId = BGQueueTypeId((ushort)BattlegroundTypeId.AA, BattlegroundQueueIdType.Arena, true, teamSize);
|
||||||
{
|
for (var bracket = BattlegroundBracketId.First; bracket < BattlegroundBracketId.Max; ++bracket)
|
||||||
m_BattlegroundQueues[(int)qtype].BattlegroundQueueUpdate(diff,
|
GetBattlegroundQueue(ratedArenaQueueId).BattlegroundQueueUpdate(diff, bracket, 0);
|
||||||
BattlegroundTypeId.AA, (BattlegroundBracketId)bracket,
|
|
||||||
(byte)BGArenaType(qtype), true, 0);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
m_NextRatedArenaUpdate = WorldConfig.GetUIntValue(WorldCfg.ArenaRatedUpdateTimer);
|
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 = new RideTicket();
|
||||||
header.Ticket.RequesterGuid = player.GetGUID();
|
header.Ticket.RequesterGuid = player.GetGUID();
|
||||||
header.Ticket.Id = ticketId;
|
header.Ticket.Id = ticketId;
|
||||||
header.Ticket.Type = RideType.Battlegrounds;
|
header.Ticket.Type = RideType.Battlegrounds;
|
||||||
header.Ticket.Time = (int)joinTime;
|
header.Ticket.Time = (int)joinTime;
|
||||||
header.QueueID.Add(bg.GetQueueId());
|
header.QueueID.Add(queueId.GetPacked());
|
||||||
header.RangeMin = (byte)bg.GetMinLevel();
|
header.RangeMin = (byte)bg.GetMinLevel();
|
||||||
header.RangeMax = (byte)bg.GetMaxLevel();
|
header.RangeMax = (byte)bg.GetMaxLevel();
|
||||||
header.TeamSize = (byte)(bg.IsArena() ? arenaType : 0);
|
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)
|
public void BuildBattlegroundStatusNeedConfirmation(out BattlefieldStatusNeedConfirmation battlefieldStatus, Battleground bg, Player player, uint ticketId, uint joinTime, uint timeout, ArenaTypes arenaType)
|
||||||
{
|
{
|
||||||
battlefieldStatus = new BattlefieldStatusNeedConfirmation();
|
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.Mapid = bg.GetMapId();
|
||||||
battlefieldStatus.Timeout = timeout;
|
battlefieldStatus.Timeout = timeout;
|
||||||
battlefieldStatus.Role = 0;
|
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)
|
public void BuildBattlegroundStatusActive(out BattlefieldStatusActive battlefieldStatus, Battleground bg, Player player, uint ticketId, uint joinTime, ArenaTypes arenaType)
|
||||||
{
|
{
|
||||||
battlefieldStatus = new BattlefieldStatusActive();
|
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.ShutdownTimer = bg.GetRemainingTime();
|
||||||
battlefieldStatus.ArenaFaction = (byte)(player.GetBGTeam() == Team.Horde ? TeamId.Horde : TeamId.Alliance);
|
battlefieldStatus.ArenaFaction = (byte)(player.GetBGTeam() == Team.Horde ? TeamId.Horde : TeamId.Alliance);
|
||||||
battlefieldStatus.LeftEarly = false;
|
battlefieldStatus.LeftEarly = false;
|
||||||
@@ -169,10 +164,10 @@ namespace Game.BattleGrounds
|
|||||||
battlefieldStatus.Mapid = bg.GetMapId();
|
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();
|
battlefieldStatus = new BattlefieldStatusQueued();
|
||||||
BuildBattlegroundStatusHeader(battlefieldStatus.Hdr, bg, player, ticketId, joinTime, arenaType);
|
BuildBattlegroundStatusHeader(battlefieldStatus.Hdr, bg, player, ticketId, joinTime, queueId, arenaType);
|
||||||
battlefieldStatus.AverageWaitTime = avgWaitTime;
|
battlefieldStatus.AverageWaitTime = avgWaitTime;
|
||||||
battlefieldStatus.AsGroup = asGroup;
|
battlefieldStatus.AsGroup = asGroup;
|
||||||
battlefieldStatus.SuspendedQueue = false;
|
battlefieldStatus.SuspendedQueue = false;
|
||||||
@@ -180,14 +175,14 @@ namespace Game.BattleGrounds
|
|||||||
battlefieldStatus.WaitTime = Time.GetMSTimeDiffToNow(joinTime);
|
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 = new BattlefieldStatusFailed();
|
||||||
battlefieldStatus.Ticket.RequesterGuid = pPlayer.GetGUID();
|
battlefieldStatus.Ticket.RequesterGuid = pPlayer.GetGUID();
|
||||||
battlefieldStatus.Ticket.Id = ticketId;
|
battlefieldStatus.Ticket.Id = ticketId;
|
||||||
battlefieldStatus.Ticket.Type = RideType.Battlegrounds;
|
battlefieldStatus.Ticket.Type = RideType.Battlegrounds;
|
||||||
battlefieldStatus.Ticket.Time = (int)pPlayer.GetBattlegroundQueueJoinTime(BGQueueTypeId(bg.GetTypeID(), arenaType));
|
battlefieldStatus.Ticket.Time = (int)pPlayer.GetBattlegroundQueueJoinTime(bg.GetQueueId());
|
||||||
battlefieldStatus.QueueID = bg.GetQueueId();
|
battlefieldStatus.QueueID = bg.GetQueueId().GetPacked();
|
||||||
battlefieldStatus.Reason = (int)result;
|
battlefieldStatus.Reason = (int)result;
|
||||||
if (!errorGuid.IsEmpty() && (result == GroupJoinBattlegroundResult.NotInBattleground || result == GroupJoinBattlegroundResult.JoinTimedOut))
|
if (!errorGuid.IsEmpty() && (result == GroupJoinBattlegroundResult.NotInBattleground || result == GroupJoinBattlegroundResult.JoinTimedOut))
|
||||||
battlefieldStatus.ClientID = errorGuid;
|
battlefieldStatus.ClientID = errorGuid;
|
||||||
@@ -198,7 +193,7 @@ namespace Game.BattleGrounds
|
|||||||
if (instanceId == 0)
|
if (instanceId == 0)
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
if (bgTypeId != BattlegroundTypeId.None)
|
if (bgTypeId != BattlegroundTypeId.None || bgTypeId == BattlegroundTypeId.RB || bgTypeId == BattlegroundTypeId.RandomEpic)
|
||||||
{
|
{
|
||||||
var data = bgDataStore.LookupByKey(bgTypeId);
|
var data = bgDataStore.LookupByKey(bgTypeId);
|
||||||
return data.m_Battlegrounds.LookupByKey(instanceId);
|
return data.m_Battlegrounds.LookupByKey(instanceId);
|
||||||
@@ -249,9 +244,9 @@ namespace Game.BattleGrounds
|
|||||||
}
|
}
|
||||||
|
|
||||||
// create a new Battleground that will really be used to play
|
// 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
|
// get the template BG
|
||||||
Battleground bg_template = GetBattlegroundTemplate(bgTypeId);
|
Battleground bg_template = GetBattlegroundTemplate(bgTypeId);
|
||||||
@@ -261,22 +256,23 @@ namespace Game.BattleGrounds
|
|||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (bgTypeId == BattlegroundTypeId.RB || bgTypeId == BattlegroundTypeId.AA)
|
if (bgTypeId == BattlegroundTypeId.RB || bgTypeId == BattlegroundTypeId.AA || bgTypeId == BattlegroundTypeId.RandomEpic)
|
||||||
return null;
|
return null;
|
||||||
|
|
||||||
// create a copy of the BG template
|
// create a copy of the BG template
|
||||||
Battleground bg = bg_template.GetCopy();
|
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.SetBracket(bracketEntry);
|
||||||
bg.SetInstanceID(Global.MapMgr.GenerateInstanceId());
|
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.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.SetStatus(BattlegroundStatus.WaitJoin); // start the joining of the bg
|
||||||
bg.SetArenaType(arenaType);
|
bg.SetArenaType((ArenaTypes)queueId.TeamSize);
|
||||||
bg.SetRandomTypeID(bgTypeId);
|
bg.SetRandomTypeID(bgTypeId);
|
||||||
bg.SetRated(isRated);
|
bg.SetRated(queueId.Rated);
|
||||||
bg.SetRandom(isRandom);
|
bg.SetRandom(isRandom);
|
||||||
|
|
||||||
return bg;
|
return bg;
|
||||||
@@ -339,13 +335,15 @@ namespace Game.BattleGrounds
|
|||||||
bg = new BattlegroundBFG(bgTemplate);
|
bg = new BattlegroundBFG(bgTemplate);
|
||||||
break;
|
break;
|
||||||
*/
|
*/
|
||||||
|
case BattlegroundTypeId.RandomEpic:
|
||||||
|
bg = new Battleground(bgTemplate);
|
||||||
|
bg.SetRandom(true);
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
bg.SetInstanceID(0);
|
|
||||||
|
|
||||||
if (!bgDataStore.ContainsKey(bg.GetTypeID()))
|
if (!bgDataStore.ContainsKey(bg.GetTypeID()))
|
||||||
bgDataStore[bg.GetTypeID()] = new BattlegroundData();
|
bgDataStore[bg.GetTypeID()] = new BattlegroundData();
|
||||||
|
|
||||||
@@ -390,7 +388,7 @@ namespace Game.BattleGrounds
|
|||||||
bgTemplate.ScriptId = Global.ObjectMgr.GetScriptId(result.Read<string>(5));
|
bgTemplate.ScriptId = Global.ObjectMgr.GetScriptId(result.Read<string>(5));
|
||||||
bgTemplate.BattlemasterEntry = bl;
|
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);
|
uint startId = result.Read<uint>(1);
|
||||||
WorldSafeLocsEntry start = Global.ObjectMgr.GetWorldSafeLoc(startId);
|
WorldSafeLocsEntry start = Global.ObjectMgr.GetWorldSafeLoc(startId);
|
||||||
@@ -486,94 +484,9 @@ namespace Game.BattleGrounds
|
|||||||
|| bgTypeId == BattlegroundTypeId.DS || bgTypeId == BattlegroundTypeId.RV || bgTypeId == BattlegroundTypeId.RL;
|
|| 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)
|
return new BattlegroundQueueTypeId(battlemasterListId, (byte)type, rated, (byte)teamSize);
|
||||||
{
|
|
||||||
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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public void ToggleTesting()
|
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
|
//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))
|
if (!m_QueueUpdateScheduler.Contains(scheduleId))
|
||||||
m_QueueUpdateScheduler.Add(scheduleId);
|
m_QueueUpdateScheduler.Add(scheduleId);
|
||||||
}
|
}
|
||||||
@@ -766,19 +720,19 @@ namespace Game.BattleGrounds
|
|||||||
return BattlegroundTypeId.None;
|
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)
|
foreach (var bg in queues)
|
||||||
{
|
{
|
||||||
if (bg.GetInstanceID() == instanceId)
|
if (bg.GetInstanceID() == instanceId)
|
||||||
@@ -800,7 +754,13 @@ namespace Game.BattleGrounds
|
|||||||
bgDataStore[bgTypeId].m_Battlegrounds.Remove(instanceId);
|
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 IsArenaTesting() { return m_ArenaTesting; }
|
||||||
public bool IsTesting() { return m_Testing; }
|
public bool IsTesting() { return m_Testing; }
|
||||||
@@ -821,11 +781,46 @@ namespace Game.BattleGrounds
|
|||||||
}
|
}
|
||||||
|
|
||||||
Dictionary<BattlegroundTypeId, BattlegroundData> bgDataStore = new Dictionary<BattlegroundTypeId, BattlegroundData>();
|
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<uint, BattlegroundTypeId> mBattleMastersMap = new Dictionary<uint, BattlegroundTypeId>();
|
||||||
Dictionary<BattlegroundTypeId, BattlegroundTemplate> _battlegroundTemplates = new Dictionary<BattlegroundTypeId, BattlegroundTemplate>();
|
Dictionary<BattlegroundTypeId, BattlegroundTemplate> _battlegroundTemplates = new Dictionary<BattlegroundTypeId, BattlegroundTemplate>();
|
||||||
Dictionary<uint, BattlegroundTemplate> _battlegroundMapTemplates = new Dictionary<uint, 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_NextRatedArenaUpdate;
|
||||||
uint m_UpdateTimer;
|
uint m_UpdateTimer;
|
||||||
bool m_ArenaTesting;
|
bool m_ArenaTesting;
|
||||||
@@ -842,7 +837,6 @@ namespace Game.BattleGrounds
|
|||||||
|
|
||||||
public Dictionary<uint, Battleground> m_Battlegrounds = new Dictionary<uint, Battleground>();
|
public Dictionary<uint, Battleground> m_Battlegrounds = new Dictionary<uint, Battleground>();
|
||||||
public List<uint>[] m_ClientBattlegroundIds = new List<uint>[(int)BattlegroundBracketId.Max];
|
public List<uint>[] m_ClientBattlegroundIds = new List<uint>[(int)BattlegroundBracketId.Max];
|
||||||
public List<Battleground> BGFreeSlotQueue = new List<Battleground>();
|
|
||||||
public Battleground Template;
|
public Battleground Template;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -30,8 +30,10 @@ namespace Game.BattleGrounds
|
|||||||
{
|
{
|
||||||
public class BattlegroundQueue
|
public class BattlegroundQueue
|
||||||
{
|
{
|
||||||
public BattlegroundQueue()
|
public BattlegroundQueue(BattlegroundQueueTypeId queueId)
|
||||||
{
|
{
|
||||||
|
m_queueId = queueId;
|
||||||
|
|
||||||
for (var i = 0; i < (int)BattlegroundBracketId.Max; ++i)
|
for (var i = 0; i < (int)BattlegroundBracketId.Max; ++i)
|
||||||
{
|
{
|
||||||
m_QueuedGroups[i] = new List<GroupQueueInfo>[BattlegroundConst.BgQueueTypesCount];
|
m_QueuedGroups[i] = new List<GroupQueueInfo>[BattlegroundConst.BgQueueTypesCount];
|
||||||
@@ -329,14 +331,13 @@ namespace Game.BattleGrounds
|
|||||||
Player plr2 = Global.ObjAccessor.FindConnectedPlayer(group.Players.FirstOrDefault().Key);
|
Player plr2 = Global.ObjAccessor.FindConnectedPlayer(group.Players.FirstOrDefault().Key);
|
||||||
if (plr2)
|
if (plr2)
|
||||||
{
|
{
|
||||||
BattlegroundQueueTypeId bgQueueTypeId = Global.BattlegroundMgr.BGQueueTypeId(group.BgTypeId, group.ArenaType);
|
uint queueSlot = plr2.GetBattlegroundQueueIndex(m_queueId);
|
||||||
uint queueSlot = plr2.GetBattlegroundQueueIndex(bgQueueTypeId);
|
|
||||||
|
|
||||||
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
|
// queue.removeplayer, it causes bugs
|
||||||
|
|
||||||
BattlefieldStatusNone battlefieldStatus;
|
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);
|
plr2.SendPacket(battlefieldStatus);
|
||||||
}
|
}
|
||||||
// then actually delete, this may delete the group as well!
|
// then actually delete, this may delete the group as well!
|
||||||
@@ -381,7 +382,7 @@ namespace Game.BattleGrounds
|
|||||||
// set invitation
|
// set invitation
|
||||||
ginfo.IsInvitedToBGInstanceGUID = bg.GetInstanceID();
|
ginfo.IsInvitedToBGInstanceGUID = bg.GetInstanceID();
|
||||||
BattlegroundTypeId bgTypeId = bg.GetTypeID();
|
BattlegroundTypeId bgTypeId = bg.GetTypeID();
|
||||||
BattlegroundQueueTypeId bgQueueTypeId = Global.BattlegroundMgr.BGQueueTypeId(bgTypeId, bg.GetArenaType());
|
BattlegroundQueueTypeId bgQueueTypeId = bg.GetQueueId();
|
||||||
BattlegroundBracketId bracket_id = bg.GetBracketId();
|
BattlegroundBracketId bracket_id = bg.GetBracketId();
|
||||||
|
|
||||||
// set ArenaTeamId for rated matches
|
// 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);
|
BGQueueInviteEvent inviteEvent = new BGQueueInviteEvent(player.GetGUID(), ginfo.IsInvitedToBGInstanceGUID, bgTypeId, ginfo.ArenaType, ginfo.RemoveInviteTime);
|
||||||
m_events.AddEvent(inviteEvent, m_events.CalculateTime(BattlegroundConst.InvitationRemindTime));
|
m_events.AddEvent(inviteEvent, m_events.CalculateTime(BattlegroundConst.InvitationRemindTime));
|
||||||
// create automatic remove events
|
// 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));
|
m_events.AddEvent(removeEvent, m_events.CalculateTime(BattlegroundConst.InviteAcceptWaitTime));
|
||||||
|
|
||||||
uint queueSlot = player.GetBattlegroundQueueIndex(bgQueueTypeId);
|
uint queueSlot = player.GetBattlegroundQueueIndex(bgQueueTypeId);
|
||||||
@@ -730,7 +731,7 @@ namespace Game.BattleGrounds
|
|||||||
/// <param name="arenaType"></param>
|
/// <param name="arenaType"></param>
|
||||||
/// <param name="isRated"></param>
|
/// <param name="isRated"></param>
|
||||||
/// <param name="arenaRating"></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 no players in queue - do nothing
|
||||||
if (m_QueuedGroups[(int)bracket_id][BattlegroundConst.BgQueuePremadeAlliance].Empty() &&
|
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
|
// 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
|
// 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)
|
foreach (var bg in bgQueues)
|
||||||
{
|
{
|
||||||
// DO NOT allow queue manager to invite new player to rated games
|
// 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)
|
bg.GetStatus() > BattlegroundStatus.WaitQueue && bg.GetStatus() < BattlegroundStatus.WaitLeave)
|
||||||
{
|
{
|
||||||
// clear selection pools
|
// 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
|
// 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)
|
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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -789,8 +790,8 @@ namespace Game.BattleGrounds
|
|||||||
|
|
||||||
if (bg_template.IsArena())
|
if (bg_template.IsArena())
|
||||||
{
|
{
|
||||||
MaxPlayersPerTeam = arenaType;
|
MaxPlayersPerTeam = m_queueId.TeamSize;
|
||||||
MinPlayersPerTeam = (uint)(Global.BattlegroundMgr.IsArenaTesting() ? 1 : arenaType);
|
MinPlayersPerTeam = Global.BattlegroundMgr.IsArenaTesting() ? 1u : m_queueId.TeamSize;
|
||||||
}
|
}
|
||||||
else if (Global.BattlegroundMgr.IsTesting())
|
else if (Global.BattlegroundMgr.IsTesting())
|
||||||
MinPlayersPerTeam = 1;
|
MinPlayersPerTeam = 1;
|
||||||
@@ -803,10 +804,10 @@ namespace Game.BattleGrounds
|
|||||||
if (CheckPremadeMatch(bracket_id, MinPlayersPerTeam, MaxPlayersPerTeam))
|
if (CheckPremadeMatch(bracket_id, MinPlayersPerTeam, MaxPlayersPerTeam))
|
||||||
{
|
{
|
||||||
// create new Battleground
|
// create new Battleground
|
||||||
Battleground bg2 = Global.BattlegroundMgr.CreateNewBattleground(bgTypeId, bracketEntry, 0, false);
|
Battleground bg2 = Global.BattlegroundMgr.CreateNewBattleground(m_queueId, bracketEntry);
|
||||||
if (bg2 == null)
|
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;
|
return;
|
||||||
}
|
}
|
||||||
// invite those selection pools
|
// 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)
|
// 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 there are enough players in pools, start new Battleground or non rated arena
|
||||||
if (CheckNormalMatch(bg_template, bracket_id, MinPlayersPerTeam, MaxPlayersPerTeam)
|
if (CheckNormalMatch(bg_template, bracket_id, MinPlayersPerTeam, MaxPlayersPerTeam)
|
||||||
|| (bg_template.IsArena() && CheckSkirmishForSameFaction(bracket_id, MinPlayersPerTeam)))
|
|| (bg_template.IsArena() && CheckSkirmishForSameFaction(bracket_id, MinPlayersPerTeam)))
|
||||||
{
|
{
|
||||||
// we successfully created a pool
|
// 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)
|
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;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -928,7 +929,7 @@ namespace Game.BattleGrounds
|
|||||||
{
|
{
|
||||||
GroupQueueInfo aTeam = queueArray[TeamId.Alliance];
|
GroupQueueInfo aTeam = queueArray[TeamId.Alliance];
|
||||||
GroupQueueInfo hTeam = queueArray[TeamId.Horde];
|
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)
|
if (!arena)
|
||||||
{
|
{
|
||||||
Log.outError(LogFilter.Battleground, "BattlegroundQueue.Update couldn't create arena instance for rated arena match!");
|
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>();
|
Dictionary<ObjectGuid, PlayerQueueInfo> m_QueuedPlayers = new Dictionary<ObjectGuid, PlayerQueueInfo>();
|
||||||
|
|
||||||
/// <summary>
|
/// <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>
|
/// <summary>
|
||||||
/// stores information for players in queue
|
/// stores information for players in queue
|
||||||
/// </summary>
|
/// </summary>
|
||||||
@@ -1081,11 +1163,11 @@ namespace Game.BattleGrounds
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
class BGQueueInviteEvent : BasicEvent
|
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_PlayerGuid = plGuid;
|
||||||
m_BgInstanceGUID = BgInstanceGUID;
|
m_BgInstanceGUID = bgInstanceGUID;
|
||||||
m_BgTypeId = BgTypeId;
|
m_BgTypeId = bgTypeId;
|
||||||
m_ArenaType = arenaType;
|
m_ArenaType = arenaType;
|
||||||
m_RemoveTime = removeTime;
|
m_RemoveTime = removeTime;
|
||||||
}
|
}
|
||||||
@@ -1102,7 +1184,7 @@ namespace Game.BattleGrounds
|
|||||||
if (bg == null)
|
if (bg == null)
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
BattlegroundQueueTypeId bgQueueTypeId = Global.BattlegroundMgr.BGQueueTypeId(bg.GetTypeID(), bg.GetArenaType());
|
BattlegroundQueueTypeId bgQueueTypeId = bg.GetQueueId();
|
||||||
uint queueSlot = player.GetBattlegroundQueueIndex(bgQueueTypeId);
|
uint queueSlot = player.GetBattlegroundQueueIndex(bgQueueTypeId);
|
||||||
if (queueSlot < SharedConst.BGTeamsCount) // player is in queue or in Battleground
|
if (queueSlot < SharedConst.BGTeamsCount) // player is in queue or in Battleground
|
||||||
{
|
{
|
||||||
@@ -1134,12 +1216,11 @@ namespace Game.BattleGrounds
|
|||||||
/// </summary>
|
/// </summary>
|
||||||
class BGQueueRemoveEvent : BasicEvent
|
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_BgInstanceGUID = bgInstanceGUID;
|
||||||
m_RemoveTime = removeTime;
|
m_RemoveTime = removeTime;
|
||||||
m_BgTypeId = BgTypeId;
|
|
||||||
m_BgQueueTypeId = bgQueueTypeId;
|
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)
|
// player logged off (we should do nothing, he is correctly removed from queue in another procedure)
|
||||||
return true;
|
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
|
//Battleground can be deleted already when we are removing queue info
|
||||||
//bg pointer can be NULL! so use it carefully!
|
//bg pointer can be NULL! so use it carefully!
|
||||||
|
|
||||||
@@ -1167,7 +1248,7 @@ namespace Game.BattleGrounds
|
|||||||
bgQueue.RemovePlayer(m_PlayerGuid, true);
|
bgQueue.RemovePlayer(m_PlayerGuid, true);
|
||||||
//update queues if Battleground isn't ended
|
//update queues if Battleground isn't ended
|
||||||
if (bg && bg.IsBattleground() && bg.GetStatus() != BattlegroundStatus.WaitLeave)
|
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;
|
BattlefieldStatusNone battlefieldStatus;
|
||||||
Global.BattlegroundMgr.BuildBattlegroundStatusNone(out battlefieldStatus, player, queueSlot, player.GetBattlegroundQueueJoinTime(m_BgQueueTypeId));
|
Global.BattlegroundMgr.BuildBattlegroundStatusNone(out battlefieldStatus, player, queueSlot, player.GetBattlegroundQueueJoinTime(m_BgQueueTypeId));
|
||||||
@@ -1184,7 +1265,6 @@ namespace Game.BattleGrounds
|
|||||||
ObjectGuid m_PlayerGuid;
|
ObjectGuid m_PlayerGuid;
|
||||||
uint m_BgInstanceGUID;
|
uint m_BgInstanceGUID;
|
||||||
uint m_RemoveTime;
|
uint m_RemoveTime;
|
||||||
BattlegroundTypeId m_BgTypeId;
|
|
||||||
BattlegroundQueueTypeId m_BgQueueTypeId;
|
BattlegroundQueueTypeId m_BgQueueTypeId;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -101,7 +101,7 @@ namespace Game.DataStorage
|
|||||||
public BattlemasterListFlags Flags;
|
public BattlemasterListFlags Flags;
|
||||||
public int IconFileDataID;
|
public int IconFileDataID;
|
||||||
public short RequiredPlayerConditionID;
|
public short RequiredPlayerConditionID;
|
||||||
public ushort[] MapId = new ushort[16];
|
public short[] MapId = new short[16];
|
||||||
}
|
}
|
||||||
|
|
||||||
public sealed class BroadcastTextRecord
|
public sealed class BroadcastTextRecord
|
||||||
|
|||||||
@@ -881,7 +881,7 @@ namespace Game.Entities
|
|||||||
if (questBit != 0)
|
if (questBit != 0)
|
||||||
SetQuestCompletedBit(questBit, true);
|
SetQuestCompletedBit(questBit, true);
|
||||||
|
|
||||||
Log.outDebug(LogFilter.Player, "Weekly quest {{0}} cooldown for player (GUID: {1})", quest_id, GetGUID().ToString());
|
Log.outDebug(LogFilter.Player, "Weekly quest {0} cooldown for player (GUID: {1})", quest_id, GetGUID().ToString());
|
||||||
}
|
}
|
||||||
while (result.NextRow());
|
while (result.NextRow());
|
||||||
}
|
}
|
||||||
@@ -907,7 +907,7 @@ namespace Game.Entities
|
|||||||
if (questBit != 0)
|
if (questBit != 0)
|
||||||
SetQuestCompletedBit(questBit, true);
|
SetQuestCompletedBit(questBit, true);
|
||||||
|
|
||||||
Log.outDebug(LogFilter.Player, "Seasonal quest {{0}} cooldown for player (GUID: {1})", quest_id, GetGUID().ToString());
|
Log.outDebug(LogFilter.Player, "Seasonal quest {0} cooldown for player (GUID: {1})", quest_id, GetGUID().ToString());
|
||||||
}
|
}
|
||||||
while (result.NextRow());
|
while (result.NextRow());
|
||||||
}
|
}
|
||||||
@@ -936,7 +936,7 @@ namespace Game.Entities
|
|||||||
if (questBit != 0)
|
if (questBit != 0)
|
||||||
SetQuestCompletedBit(questBit, true);
|
SetQuestCompletedBit(questBit, true);
|
||||||
|
|
||||||
Log.outDebug(LogFilter.Player, "Monthly quest {{0}} cooldown for player (GUID: {1})", quest_id, GetGUID().ToString());
|
Log.outDebug(LogFilter.Player, "Monthly quest {0} cooldown for player (GUID: {1})", quest_id, GetGUID().ToString());
|
||||||
}
|
}
|
||||||
while (result.NextRow());
|
while (result.NextRow());
|
||||||
}
|
}
|
||||||
@@ -2600,7 +2600,7 @@ namespace Game.Entities
|
|||||||
{
|
{
|
||||||
map = currentBg.GetBgMap();
|
map = currentBg.GetBgMap();
|
||||||
|
|
||||||
BattlegroundQueueTypeId bgQueueTypeId = Global.BattlegroundMgr.BGQueueTypeId(currentBg.GetTypeID(), currentBg.GetArenaType());
|
BattlegroundQueueTypeId bgQueueTypeId = currentBg.GetQueueId();
|
||||||
AddBattlegroundQueueId(bgQueueTypeId);
|
AddBattlegroundQueueId(bgQueueTypeId);
|
||||||
|
|
||||||
m_bgData.bgTypeID = currentBg.GetTypeID();
|
m_bgData.bgTypeID = currentBg.GetTypeID();
|
||||||
|
|||||||
@@ -27,6 +27,7 @@ using Game.Misc;
|
|||||||
using Game.Spells;
|
using Game.Spells;
|
||||||
using System.Collections;
|
using System.Collections;
|
||||||
using System.Collections.Generic;
|
using System.Collections.Generic;
|
||||||
|
using Game.BattleGrounds;
|
||||||
|
|
||||||
namespace Game.Entities
|
namespace Game.Entities
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -188,15 +188,15 @@ namespace Game.Entities
|
|||||||
|
|
||||||
// in PvP, any not controlled zone (except zone.team == 6, default case)
|
// in PvP, any not controlled zone (except zone.team == 6, default case)
|
||||||
// in PvE, only opposition team capital
|
// in PvE, only opposition team capital
|
||||||
switch ((AreaTeams)zone.FactionGroupMask)
|
switch ((ArenaTeams)zone.FactionGroupMask)
|
||||||
{
|
{
|
||||||
case AreaTeams.Ally:
|
case ArenaTeams.Ally:
|
||||||
pvpInfo.IsInHostileArea = GetTeam() != Team.Alliance && (Global.WorldMgr.IsPvPRealm() || zone.Flags[0].HasAnyFlag(AreaFlags.Capital));
|
pvpInfo.IsInHostileArea = GetTeam() != Team.Alliance && (Global.WorldMgr.IsPvPRealm() || zone.Flags[0].HasAnyFlag(AreaFlags.Capital));
|
||||||
break;
|
break;
|
||||||
case AreaTeams.Horde:
|
case ArenaTeams.Horde:
|
||||||
pvpInfo.IsInHostileArea = GetTeam() != Team.Horde && (Global.WorldMgr.IsPvPRealm() || zone.Flags[0].HasAnyFlag(AreaFlags.Capital));
|
pvpInfo.IsInHostileArea = GetTeam() != Team.Horde && (Global.WorldMgr.IsPvPRealm() || zone.Flags[0].HasAnyFlag(AreaFlags.Capital));
|
||||||
break;
|
break;
|
||||||
case AreaTeams.None:
|
case ArenaTeams.None:
|
||||||
// overwrite for Battlegrounds, maybe batter some zone flags but current known not 100% fit to this
|
// overwrite for Battlegrounds, maybe batter some zone flags but current known not 100% fit to this
|
||||||
pvpInfo.IsInHostileArea = Global.WorldMgr.IsPvPRealm() || InBattleground() || zone.Flags[0].HasAnyFlag(AreaFlags.Wintergrasp);
|
pvpInfo.IsInHostileArea = Global.WorldMgr.IsPvPRealm() || InBattleground() || zone.Flags[0].HasAnyFlag(AreaFlags.Wintergrasp);
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -534,7 +534,7 @@ namespace Game.Entities
|
|||||||
public bool InBattlegroundQueue()
|
public bool InBattlegroundQueue()
|
||||||
{
|
{
|
||||||
for (byte i = 0; i < SharedConst.MaxPlayerBGQueues; ++i)
|
for (byte i = 0; i < SharedConst.MaxPlayerBGQueues; ++i)
|
||||||
if (m_bgBattlegroundQueueID[i].bgQueueTypeId != BattlegroundQueueTypeId.None)
|
if (m_bgBattlegroundQueueID[i].bgQueueTypeId != default)
|
||||||
return true;
|
return true;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -544,7 +544,7 @@ namespace Game.Entities
|
|||||||
if (index < SharedConst.MaxPlayerBGQueues)
|
if (index < SharedConst.MaxPlayerBGQueues)
|
||||||
return m_bgBattlegroundQueueID[index].bgQueueTypeId;
|
return m_bgBattlegroundQueueID[index].bgQueueTypeId;
|
||||||
|
|
||||||
return BattlegroundQueueTypeId.None;
|
return default;
|
||||||
}
|
}
|
||||||
|
|
||||||
public uint GetBattlegroundQueueIndex(BattlegroundQueueTypeId bgQueueTypeId)
|
public uint GetBattlegroundQueueIndex(BattlegroundQueueTypeId bgQueueTypeId)
|
||||||
@@ -578,11 +578,11 @@ namespace Game.Entities
|
|||||||
{
|
{
|
||||||
for (byte i = 0; i < SharedConst.MaxPlayerBGQueues; ++i)
|
for (byte i = 0; i < SharedConst.MaxPlayerBGQueues; ++i)
|
||||||
{
|
{
|
||||||
if (m_bgBattlegroundQueueID[i].bgQueueTypeId == BattlegroundQueueTypeId.None || m_bgBattlegroundQueueID[i].bgQueueTypeId == val)
|
if (m_bgBattlegroundQueueID[i].bgQueueTypeId == default || m_bgBattlegroundQueueID[i].bgQueueTypeId == val)
|
||||||
{
|
{
|
||||||
m_bgBattlegroundQueueID[i].bgQueueTypeId = val;
|
m_bgBattlegroundQueueID[i].bgQueueTypeId = val;
|
||||||
m_bgBattlegroundQueueID[i].invitedToInstance = 0;
|
m_bgBattlegroundQueueID[i].invitedToInstance = 0;
|
||||||
m_bgBattlegroundQueueID[i].joinTime = Time.GetMSTime();
|
m_bgBattlegroundQueueID[i].joinTime = (uint)GameTime.GetGameTime();
|
||||||
return i;
|
return i;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -592,7 +592,7 @@ namespace Game.Entities
|
|||||||
public bool HasFreeBattlegroundQueueId()
|
public bool HasFreeBattlegroundQueueId()
|
||||||
{
|
{
|
||||||
for (byte i = 0; i < SharedConst.MaxPlayerBGQueues; ++i)
|
for (byte i = 0; i < SharedConst.MaxPlayerBGQueues; ++i)
|
||||||
if (m_bgBattlegroundQueueID[i].bgQueueTypeId == BattlegroundQueueTypeId.None)
|
if (m_bgBattlegroundQueueID[i].bgQueueTypeId == default)
|
||||||
return true;
|
return true;
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
@@ -603,7 +603,7 @@ namespace Game.Entities
|
|||||||
{
|
{
|
||||||
if (m_bgBattlegroundQueueID[i].bgQueueTypeId == val)
|
if (m_bgBattlegroundQueueID[i].bgQueueTypeId == val)
|
||||||
{
|
{
|
||||||
m_bgBattlegroundQueueID[i].bgQueueTypeId = BattlegroundQueueTypeId.None;
|
m_bgBattlegroundQueueID[i].bgQueueTypeId = default;
|
||||||
m_bgBattlegroundQueueID[i].invitedToInstance = 0;
|
m_bgBattlegroundQueueID[i].invitedToInstance = 0;
|
||||||
m_bgBattlegroundQueueID[i].joinTime = 0;
|
m_bgBattlegroundQueueID[i].joinTime = 0;
|
||||||
return;
|
return;
|
||||||
|
|||||||
@@ -1736,8 +1736,6 @@ namespace Game.Groups
|
|||||||
uint arenaTeamId = reference.GetArenaTeamId((byte)arenaSlot);
|
uint arenaTeamId = reference.GetArenaTeamId((byte)arenaSlot);
|
||||||
Team team = reference.GetTeam();
|
Team team = reference.GetTeam();
|
||||||
|
|
||||||
BattlegroundQueueTypeId bgQueueTypeIdRandom = Global.BattlegroundMgr.BGQueueTypeId(BattlegroundTypeId.RB, 0);
|
|
||||||
|
|
||||||
// check every member of the group to be able to join
|
// check every member of the group to be able to join
|
||||||
memberscount = 0;
|
memberscount = 0;
|
||||||
for (GroupReference refe = GetFirstMember(); refe != null; refe = refe.Next(), ++memberscount)
|
for (GroupReference refe = GetFirstMember(); refe != null; refe = refe.Next(), ++memberscount)
|
||||||
@@ -1762,11 +1760,13 @@ namespace Game.Groups
|
|||||||
// don't let join if someone from the group is already in that bg queue
|
// don't let join if someone from the group is already in that bg queue
|
||||||
if (member.InBattlegroundQueueForBattlegroundQueueType(bgQueueTypeId))
|
if (member.InBattlegroundQueueForBattlegroundQueueType(bgQueueTypeId))
|
||||||
return GroupJoinBattlegroundResult.JoinFailed; // not blizz-like
|
return GroupJoinBattlegroundResult.JoinFailed; // not blizz-like
|
||||||
// don't let join if someone from the group is in bg queue random
|
// don't let join if someone from the group is in bg queue random
|
||||||
if (member.InBattlegroundQueueForBattlegroundQueueType(bgQueueTypeIdRandom))
|
bool isInRandomBgQueue = member.InBattlegroundQueueForBattlegroundQueueType(Global.BattlegroundMgr.BGQueueTypeId((ushort)BattlegroundTypeId.RB, BattlegroundQueueIdType.Battleground, false, 0))
|
||||||
|
|| member.InBattlegroundQueueForBattlegroundQueueType(Global.BattlegroundMgr.BGQueueTypeId((ushort)BattlegroundTypeId.RandomEpic, BattlegroundQueueIdType.Battleground, false, 0));
|
||||||
|
if (isInRandomBgQueue)
|
||||||
return GroupJoinBattlegroundResult.InRandomBg;
|
return GroupJoinBattlegroundResult.InRandomBg;
|
||||||
// don't let join to bg queue random if someone from the group is already in bg queue
|
// don't let join to bg queue random if someone from the group is already in bg queue
|
||||||
if (bgOrTemplate.GetTypeID() == BattlegroundTypeId.RB && member.InBattlegroundQueue())
|
if ((bgOrTemplate.GetTypeID() == BattlegroundTypeId.RB || bgOrTemplate.GetTypeID() == BattlegroundTypeId.RandomEpic) && member.InBattlegroundQueue() && !isInRandomBgQueue)
|
||||||
return GroupJoinBattlegroundResult.InNonRandomBg;
|
return GroupJoinBattlegroundResult.InNonRandomBg;
|
||||||
// check for deserter debuff in case not arena queue
|
// check for deserter debuff in case not arena queue
|
||||||
if (bgOrTemplate.GetTypeID() != BattlegroundTypeId.AA && !member.CanJoinToBattleground(bgOrTemplate))
|
if (bgOrTemplate.GetTypeID() != BattlegroundTypeId.AA && !member.CanJoinToBattleground(bgOrTemplate))
|
||||||
|
|||||||
@@ -64,23 +64,21 @@ namespace Game
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
BattlegroundTypeId bgTypeId = (BattlegroundTypeId)(battlemasterJoin.QueueIDs[0] & 0xFFFF);
|
BattlegroundQueueTypeId bgQueueTypeId = BattlegroundQueueTypeId.FromPacked(battlemasterJoin.QueueIDs[0]);
|
||||||
BattlemasterListRecord battlemasterListEntry = CliDB.BattlemasterListStorage.LookupByKey(bgTypeId);
|
if (!Global.BattlegroundMgr.IsValidQueueId(bgQueueTypeId))
|
||||||
if (battlemasterListEntry == null)
|
|
||||||
{
|
{
|
||||||
Log.outError(LogFilter.Network, "Battleground: invalid bgtype ({0}) received. possible cheater? player guid {1}", bgTypeId, GetPlayer().GetGUID().ToString());
|
Log.outError(LogFilter.Network, $"Battleground: invalid bg queue {bgQueueTypeId} received. possible cheater? {_player.GetGUID()}");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (Global.DisableMgr.IsDisabledFor(DisableType.Battleground, (uint)bgTypeId, null) || battlemasterListEntry.Flags.HasAnyFlag(BattlemasterListFlags.Disabled))
|
BattlemasterListRecord battlemasterListEntry = CliDB.BattlemasterListStorage.LookupByKey(bgQueueTypeId.BattlemasterListId);
|
||||||
|
if (Global.DisableMgr.IsDisabledFor(DisableType.Battleground, bgQueueTypeId.BattlemasterListId, null) || battlemasterListEntry.Flags.HasAnyFlag(BattlemasterListFlags.Disabled))
|
||||||
{
|
{
|
||||||
GetPlayer().SendSysMessage(CypherStrings.BgDisabled);
|
GetPlayer().SendSysMessage(CypherStrings.BgDisabled);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
// can do this, since it's Battleground, not arena
|
BattlegroundTypeId bgTypeId = (BattlegroundTypeId)bgQueueTypeId.BattlemasterListId;
|
||||||
BattlegroundQueueTypeId bgQueueTypeId = Global.BattlegroundMgr.BGQueueTypeId(bgTypeId, 0);
|
|
||||||
BattlegroundQueueTypeId bgQueueTypeIdRandom = Global.BattlegroundMgr.BGQueueTypeId(BattlegroundTypeId.RB, 0);
|
|
||||||
|
|
||||||
// ignore if player is already in BG
|
// ignore if player is already in BG
|
||||||
if (GetPlayer().InBattleground())
|
if (GetPlayer().InBattleground())
|
||||||
@@ -106,7 +104,7 @@ namespace Game
|
|||||||
{
|
{
|
||||||
if (GetPlayer().IsUsingLfg())
|
if (GetPlayer().IsUsingLfg())
|
||||||
{
|
{
|
||||||
Global.BattlegroundMgr.BuildBattlegroundStatusFailed(out battlefieldStatusFailed, bg, GetPlayer(), 0, 0, GroupJoinBattlegroundResult.LfgCantUseBattleground);
|
Global.BattlegroundMgr.BuildBattlegroundStatusFailed(out battlefieldStatusFailed, bg, GetPlayer(), 0, GroupJoinBattlegroundResult.LfgCantUseBattleground);
|
||||||
SendPacket(battlefieldStatusFailed);
|
SendPacket(battlefieldStatusFailed);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -114,23 +112,25 @@ namespace Game
|
|||||||
// check Deserter debuff
|
// check Deserter debuff
|
||||||
if (!GetPlayer().CanJoinToBattleground(bg))
|
if (!GetPlayer().CanJoinToBattleground(bg))
|
||||||
{
|
{
|
||||||
Global.BattlegroundMgr.BuildBattlegroundStatusFailed(out battlefieldStatusFailed, bg, GetPlayer(), 0, 0, GroupJoinBattlegroundResult.Deserters);
|
Global.BattlegroundMgr.BuildBattlegroundStatusFailed(out battlefieldStatusFailed, bg, GetPlayer(), 0, GroupJoinBattlegroundResult.Deserters);
|
||||||
SendPacket(battlefieldStatusFailed);
|
SendPacket(battlefieldStatusFailed);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (GetPlayer().GetBattlegroundQueueIndex(bgQueueTypeIdRandom) < SharedConst.MaxPlayerBGQueues)
|
bool isInRandomBgQueue = _player.InBattlegroundQueueForBattlegroundQueueType(Global.BattlegroundMgr.BGQueueTypeId((ushort)BattlegroundTypeId.RB, BattlegroundQueueIdType.Battleground, false, 0))
|
||||||
|
|| _player.InBattlegroundQueueForBattlegroundQueueType(Global.BattlegroundMgr.BGQueueTypeId((ushort)BattlegroundTypeId.RandomEpic, BattlegroundQueueIdType.Battleground, false, 0));
|
||||||
|
if (bgTypeId != BattlegroundTypeId.RB && bgTypeId != BattlegroundTypeId.RandomEpic && isInRandomBgQueue)
|
||||||
{
|
{
|
||||||
// player is already in random queue
|
// player is already in random queue
|
||||||
Global.BattlegroundMgr.BuildBattlegroundStatusFailed(out battlefieldStatusFailed, bg, GetPlayer(), 0, 0, GroupJoinBattlegroundResult.InRandomBg);
|
Global.BattlegroundMgr.BuildBattlegroundStatusFailed(out battlefieldStatusFailed, bg, GetPlayer(), 0, GroupJoinBattlegroundResult.InRandomBg);
|
||||||
SendPacket(battlefieldStatusFailed);
|
SendPacket(battlefieldStatusFailed);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (GetPlayer().InBattlegroundQueue() && bgTypeId == BattlegroundTypeId.RB)
|
if (_player.InBattlegroundQueue() && !isInRandomBgQueue && (bgTypeId == BattlegroundTypeId.RB || bgTypeId == BattlegroundTypeId.RandomEpic))
|
||||||
{
|
{
|
||||||
// player is already in queue, can't start random queue
|
// player is already in queue, can't start random queue
|
||||||
Global.BattlegroundMgr.BuildBattlegroundStatusFailed(out battlefieldStatusFailed, bg, GetPlayer(), 0, 0, GroupJoinBattlegroundResult.InNonRandomBg);
|
Global.BattlegroundMgr.BuildBattlegroundStatusFailed(out battlefieldStatusFailed, bg, GetPlayer(), 0, GroupJoinBattlegroundResult.InNonRandomBg);
|
||||||
SendPacket(battlefieldStatusFailed);
|
SendPacket(battlefieldStatusFailed);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -142,7 +142,7 @@ namespace Game
|
|||||||
// check if has free queue slots
|
// check if has free queue slots
|
||||||
if (!GetPlayer().HasFreeBattlegroundQueueId())
|
if (!GetPlayer().HasFreeBattlegroundQueueId())
|
||||||
{
|
{
|
||||||
Global.BattlegroundMgr.BuildBattlegroundStatusFailed(out battlefieldStatusFailed, bg, GetPlayer(), 0, 0, GroupJoinBattlegroundResult.TooManyQueues);
|
Global.BattlegroundMgr.BuildBattlegroundStatusFailed(out battlefieldStatusFailed, bg, GetPlayer(), 0, GroupJoinBattlegroundResult.TooManyQueues);
|
||||||
SendPacket(battlefieldStatusFailed);
|
SendPacket(battlefieldStatusFailed);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -157,12 +157,10 @@ namespace Game
|
|||||||
uint avgTime = bgQueue.GetAverageQueueWaitTime(ginfo, bracketEntry.GetBracketId());
|
uint avgTime = bgQueue.GetAverageQueueWaitTime(ginfo, bracketEntry.GetBracketId());
|
||||||
uint queueSlot = GetPlayer().AddBattlegroundQueueId(bgQueueTypeId);
|
uint queueSlot = GetPlayer().AddBattlegroundQueueId(bgQueueTypeId);
|
||||||
|
|
||||||
BattlefieldStatusQueued battlefieldStatusQueued;
|
Global.BattlegroundMgr.BuildBattlegroundStatusQueued(out BattlefieldStatusQueued battlefieldStatusQueued, bg, GetPlayer(), queueSlot, ginfo.JoinTime, bgQueueTypeId, avgTime, ginfo.ArenaType, false);
|
||||||
Global.BattlegroundMgr.BuildBattlegroundStatusQueued(out battlefieldStatusQueued, bg, GetPlayer(), queueSlot, ginfo.JoinTime, avgTime, ginfo.ArenaType, false);
|
|
||||||
SendPacket(battlefieldStatusQueued);
|
SendPacket(battlefieldStatusQueued);
|
||||||
|
|
||||||
Log.outDebug(LogFilter.Battleground, "Battleground: player joined queue for bg queue type {0} bg type {1}: GUID {2}, NAME {3}",
|
Log.outDebug(LogFilter.Battleground, $"Battleground: player joined queue for bg queue {bgQueueTypeId}, {_player.GetGUID()}, NAME {_player.GetName()}");
|
||||||
bgQueueTypeId, bgTypeId, GetPlayer().GetGUID().ToString(), GetPlayer().GetName());
|
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
@@ -193,7 +191,7 @@ namespace Game
|
|||||||
if (err != 0)
|
if (err != 0)
|
||||||
{
|
{
|
||||||
BattlefieldStatusFailed battlefieldStatus;
|
BattlefieldStatusFailed battlefieldStatus;
|
||||||
Global.BattlegroundMgr.BuildBattlegroundStatusFailed(out battlefieldStatus, bg, GetPlayer(), 0, 0, err, errorGuid);
|
Global.BattlegroundMgr.BuildBattlegroundStatusFailed(out battlefieldStatus, bg, GetPlayer(), 0, err, errorGuid);
|
||||||
member.SendPacket(battlefieldStatus);
|
member.SendPacket(battlefieldStatus);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -201,16 +199,14 @@ namespace Game
|
|||||||
// add to queue
|
// add to queue
|
||||||
uint queueSlot = member.AddBattlegroundQueueId(bgQueueTypeId);
|
uint queueSlot = member.AddBattlegroundQueueId(bgQueueTypeId);
|
||||||
|
|
||||||
BattlefieldStatusQueued battlefieldStatusQueued;
|
Global.BattlegroundMgr.BuildBattlegroundStatusQueued(out BattlefieldStatusQueued battlefieldStatusQueued, bg, member, queueSlot, ginfo.JoinTime, bgQueueTypeId, avgTime, ginfo.ArenaType, true);
|
||||||
Global.BattlegroundMgr.BuildBattlegroundStatusQueued(out battlefieldStatusQueued, bg, member, queueSlot, ginfo.JoinTime, avgTime, ginfo.ArenaType, true);
|
|
||||||
member.SendPacket(battlefieldStatusQueued);
|
member.SendPacket(battlefieldStatusQueued);
|
||||||
Log.outDebug(LogFilter.Battleground, "Battleground: player joined queue for bg queue type {0} bg type {1}: GUID {2}, NAME {3}",
|
Log.outDebug(LogFilter.Battleground, $"Battleground: player joined queue for bg queue {bgQueueTypeId}, {member.GetGUID()}, NAME {member.GetName()}");
|
||||||
bgQueueTypeId, bgTypeId, member.GetGUID().ToString(), member.GetName());
|
|
||||||
}
|
}
|
||||||
Log.outDebug(LogFilter.Battleground, "Battleground: group end");
|
Log.outDebug(LogFilter.Battleground, "Battleground: group end");
|
||||||
}
|
}
|
||||||
|
|
||||||
Global.BattlegroundMgr.ScheduleQueueUpdate(0, 0, bgQueueTypeId, bgTypeId, bracketEntry.GetBracketId());
|
Global.BattlegroundMgr.ScheduleQueueUpdate(0, bgQueueTypeId, bracketEntry.GetBracketId());
|
||||||
}
|
}
|
||||||
|
|
||||||
[WorldPacketHandler(ClientOpcodes.PvpLogData)]
|
[WorldPacketHandler(ClientOpcodes.PvpLogData)]
|
||||||
@@ -224,8 +220,8 @@ namespace Game
|
|||||||
if (bg.IsArena())
|
if (bg.IsArena())
|
||||||
return;
|
return;
|
||||||
|
|
||||||
PVPLogData pvpLogData;
|
PVPLogDataMessage pvpLogData = new PVPLogDataMessage();
|
||||||
bg.BuildPvPLogDataPacket(out pvpLogData);
|
bg.BuildPvPLogDataPacket(out pvpLogData.Data);
|
||||||
SendPacket(pvpLogData);
|
SendPacket(pvpLogData);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -253,7 +249,7 @@ namespace Game
|
|||||||
}
|
}
|
||||||
|
|
||||||
BattlegroundQueueTypeId bgQueueTypeId = GetPlayer().GetBattlegroundQueueTypeId(battlefieldPort.Ticket.Id);
|
BattlegroundQueueTypeId bgQueueTypeId = GetPlayer().GetBattlegroundQueueTypeId(battlefieldPort.Ticket.Id);
|
||||||
if (bgQueueTypeId == BattlegroundQueueTypeId.None)
|
if (bgQueueTypeId == default)
|
||||||
{
|
{
|
||||||
Log.outDebug(LogFilter.Battleground, "CMSG_BATTLEFIELD_PORT {0} Slot: {1}, Unk: {2}, Time: {3}, AcceptedInvite: {4}. Invalid queueSlot!",
|
Log.outDebug(LogFilter.Battleground, "CMSG_BATTLEFIELD_PORT {0} Slot: {1}, Unk: {2}, Time: {3}, AcceptedInvite: {4}. Invalid queueSlot!",
|
||||||
GetPlayerInfo(), battlefieldPort.Ticket.Id, battlefieldPort.Ticket.Type, battlefieldPort.Ticket.Time, battlefieldPort.AcceptedInvite);
|
GetPlayerInfo(), battlefieldPort.Ticket.Id, battlefieldPort.Ticket.Type, battlefieldPort.Ticket.Time, battlefieldPort.AcceptedInvite);
|
||||||
@@ -278,7 +274,7 @@ namespace Game
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
BattlegroundTypeId bgTypeId = Global.BattlegroundMgr.BGTemplateId(bgQueueTypeId);
|
BattlegroundTypeId bgTypeId = (BattlegroundTypeId)bgQueueTypeId.BattlemasterListId;
|
||||||
// BGTemplateId returns Battleground_AA when it is arena queue.
|
// BGTemplateId returns Battleground_AA when it is arena queue.
|
||||||
// Do instance id search as there is no AA bg instances.
|
// Do instance id search as there is no AA bg instances.
|
||||||
Battleground bg = Global.BattlegroundMgr.GetBattleground(ginfo.IsInvitedToBGInstanceGUID, bgTypeId == BattlegroundTypeId.AA ? BattlegroundTypeId.None : bgTypeId);
|
Battleground bg = Global.BattlegroundMgr.GetBattleground(ginfo.IsInvitedToBGInstanceGUID, bgTypeId == BattlegroundTypeId.AA ? BattlegroundTypeId.None : bgTypeId);
|
||||||
@@ -315,7 +311,7 @@ namespace Game
|
|||||||
{
|
{
|
||||||
// send bg command result to show nice message
|
// send bg command result to show nice message
|
||||||
BattlefieldStatusFailed battlefieldStatus;
|
BattlefieldStatusFailed battlefieldStatus;
|
||||||
Global.BattlegroundMgr.BuildBattlegroundStatusFailed(out battlefieldStatus, bg, GetPlayer(), battlefieldPort.Ticket.Id, 0, GroupJoinBattlegroundResult.Deserters);
|
Global.BattlegroundMgr.BuildBattlegroundStatusFailed(out battlefieldStatus, bg, GetPlayer(), battlefieldPort.Ticket.Id, GroupJoinBattlegroundResult.Deserters);
|
||||||
SendPacket(battlefieldStatus);
|
SendPacket(battlefieldStatus);
|
||||||
battlefieldPort.AcceptedInvite = false;
|
battlefieldPort.AcceptedInvite = false;
|
||||||
Log.outDebug(LogFilter.Battleground, "Player {0} ({1}) has a deserter debuff, do not port him to Battleground!", GetPlayer().GetName(), GetPlayer().GetGUID().ToString());
|
Log.outDebug(LogFilter.Battleground, "Player {0} ({1}) has a deserter debuff, do not port him to Battleground!", GetPlayer().GetName(), GetPlayer().GetGUID().ToString());
|
||||||
@@ -372,7 +368,7 @@ namespace Game
|
|||||||
GetPlayer().SetBGTeam(ginfo.Team);
|
GetPlayer().SetBGTeam(ginfo.Team);
|
||||||
|
|
||||||
Global.BattlegroundMgr.SendToBattleground(GetPlayer(), ginfo.IsInvitedToBGInstanceGUID, bgTypeId);
|
Global.BattlegroundMgr.SendToBattleground(GetPlayer(), ginfo.IsInvitedToBGInstanceGUID, bgTypeId);
|
||||||
Log.outDebug(LogFilter.Battleground, "Battleground: player {0} ({1}) joined battle for bg {2}, bgtype {3}, queue type {4}.", GetPlayer().GetName(), GetPlayer().GetGUID().ToString(), bg.GetInstanceID(), bg.GetTypeID(), bgQueueTypeId);
|
Log.outDebug(LogFilter.Battleground, $"Battleground: player {_player.GetName()} ({_player.GetGUID()}) joined battle for bg {bg.GetInstanceID()}, bgtype {bg.GetTypeID()}, queue {bgQueueTypeId}.");
|
||||||
}
|
}
|
||||||
else // leave queue
|
else // leave queue
|
||||||
{
|
{
|
||||||
@@ -395,9 +391,9 @@ namespace Game
|
|||||||
bgQueue.RemovePlayer(GetPlayer().GetGUID(), true);
|
bgQueue.RemovePlayer(GetPlayer().GetGUID(), true);
|
||||||
// player left queue, we should update it - do not update Arena Queue
|
// player left queue, we should update it - do not update Arena Queue
|
||||||
if (ginfo.ArenaType == 0)
|
if (ginfo.ArenaType == 0)
|
||||||
Global.BattlegroundMgr.ScheduleQueueUpdate(ginfo.ArenaMatchmakerRating, ginfo.ArenaType, bgQueueTypeId, bgTypeId, bracketEntry.GetBracketId());
|
Global.BattlegroundMgr.ScheduleQueueUpdate(ginfo.ArenaMatchmakerRating, bgQueueTypeId, bracketEntry.GetBracketId());
|
||||||
|
|
||||||
Log.outDebug(LogFilter.Battleground, "Battleground: player {0} ({1}) left queue for bgtype {2}, queue type {3}.", GetPlayer().GetName(), GetPlayer().GetGUID().ToString(), bg.GetTypeID(), bgQueueTypeId);
|
Log.outDebug(LogFilter.Battleground, $"Battleground: player {_player.GetName()} ({_player.GetGUID()}) left queue for bgtype { bg.GetTypeID()}, queue {bgQueueTypeId}.");
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -424,23 +420,19 @@ namespace Game
|
|||||||
for (byte i = 0; i < SharedConst.MaxPlayerBGQueues; ++i)
|
for (byte i = 0; i < SharedConst.MaxPlayerBGQueues; ++i)
|
||||||
{
|
{
|
||||||
BattlegroundQueueTypeId bgQueueTypeId = GetPlayer().GetBattlegroundQueueTypeId(i);
|
BattlegroundQueueTypeId bgQueueTypeId = GetPlayer().GetBattlegroundQueueTypeId(i);
|
||||||
if (bgQueueTypeId == 0)
|
if (bgQueueTypeId == default)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
BattlegroundTypeId bgTypeId = Global.BattlegroundMgr.BGTemplateId(bgQueueTypeId);
|
BattlegroundTypeId bgTypeId = (BattlegroundTypeId)bgQueueTypeId.BattlemasterListId;
|
||||||
ArenaTypes arenaType = Global.BattlegroundMgr.BGArenaType(bgQueueTypeId);
|
ArenaTypes arenaType = (ArenaTypes)bgQueueTypeId.TeamSize;
|
||||||
if (bgTypeId == GetPlayer().GetBattlegroundTypeId())
|
bg = _player.GetBattleground();
|
||||||
|
if (bg && bg.GetQueueId() == bgQueueTypeId)
|
||||||
{
|
{
|
||||||
bg = GetPlayer().GetBattleground();
|
|
||||||
//i cannot check any variable from player class because player class doesn't know if player is in 2v2 / 3v3 or 5v5 arena
|
//i cannot check any variable from player class because player class doesn't know if player is in 2v2 / 3v3 or 5v5 arena
|
||||||
//so i must use bg pointer to get that information
|
//so i must use bg pointer to get that information
|
||||||
if (bg && bg.GetArenaType() == arenaType)
|
Global.BattlegroundMgr.BuildBattlegroundStatusActive(out BattlefieldStatusActive battlefieldStatus, bg, _player, i, _player.GetBattlegroundQueueJoinTime(bgQueueTypeId), arenaType);
|
||||||
{
|
SendPacket(battlefieldStatus);
|
||||||
BattlefieldStatusActive battlefieldStatus;
|
continue;
|
||||||
Global.BattlegroundMgr.BuildBattlegroundStatusActive(out battlefieldStatus, bg, GetPlayer(), i, GetPlayer().GetBattlegroundQueueJoinTime(bgQueueTypeId), arenaType);
|
|
||||||
SendPacket(battlefieldStatus);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//we are sending update to player about queue - he can be invited there!
|
//we are sending update to player about queue - he can be invited there!
|
||||||
@@ -473,7 +465,7 @@ namespace Game
|
|||||||
|
|
||||||
uint avgTime = bgQueue.GetAverageQueueWaitTime(ginfo, bracketEntry.GetBracketId());
|
uint avgTime = bgQueue.GetAverageQueueWaitTime(ginfo, bracketEntry.GetBracketId());
|
||||||
BattlefieldStatusQueued battlefieldStatus;
|
BattlefieldStatusQueued battlefieldStatus;
|
||||||
Global.BattlegroundMgr.BuildBattlegroundStatusQueued(out battlefieldStatus, bg, GetPlayer(), i, GetPlayer().GetBattlegroundQueueJoinTime(bgQueueTypeId), avgTime, arenaType, ginfo.Players.Count > 1);
|
Global.BattlegroundMgr.BuildBattlegroundStatusQueued(out battlefieldStatus, bg, GetPlayer(), i, GetPlayer().GetBattlegroundQueueJoinTime(bgQueueTypeId), bgQueueTypeId, avgTime, arenaType, ginfo.Players.Count > 1);
|
||||||
SendPacket(battlefieldStatus);
|
SendPacket(battlefieldStatus);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -503,7 +495,7 @@ namespace Game
|
|||||||
}
|
}
|
||||||
|
|
||||||
BattlegroundTypeId bgTypeId = bg.GetTypeID();
|
BattlegroundTypeId bgTypeId = bg.GetTypeID();
|
||||||
BattlegroundQueueTypeId bgQueueTypeId = Global.BattlegroundMgr.BGQueueTypeId(bgTypeId, arenatype);
|
BattlegroundQueueTypeId bgQueueTypeId = Global.BattlegroundMgr.BGQueueTypeId((ushort)bgTypeId, BattlegroundQueueIdType.Arena, true, arenatype);
|
||||||
PvpDifficultyRecord bracketEntry = Global.DB2Mgr.GetBattlegroundBracketByLevel(bg.GetMapId(), GetPlayer().GetLevel());
|
PvpDifficultyRecord bracketEntry = Global.DB2Mgr.GetBattlegroundBracketByLevel(bg.GetMapId(), GetPlayer().GetLevel());
|
||||||
if (bracketEntry == null)
|
if (bracketEntry == null)
|
||||||
return;
|
return;
|
||||||
@@ -553,7 +545,7 @@ namespace Game
|
|||||||
if (err != 0)
|
if (err != 0)
|
||||||
{
|
{
|
||||||
BattlefieldStatusFailed battlefieldStatus;
|
BattlefieldStatusFailed battlefieldStatus;
|
||||||
Global.BattlegroundMgr.BuildBattlegroundStatusFailed(out battlefieldStatus, bg, GetPlayer(), 0, arenatype, err, errorGuid);
|
Global.BattlegroundMgr.BuildBattlegroundStatusFailed(out battlefieldStatus, bg, GetPlayer(), 0, err, errorGuid);
|
||||||
member.SendPacket(battlefieldStatus);
|
member.SendPacket(battlefieldStatus);
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@@ -561,14 +553,13 @@ namespace Game
|
|||||||
// add to queue
|
// add to queue
|
||||||
uint queueSlot = member.AddBattlegroundQueueId(bgQueueTypeId);
|
uint queueSlot = member.AddBattlegroundQueueId(bgQueueTypeId);
|
||||||
|
|
||||||
BattlefieldStatusQueued battlefieldStatusQueued;
|
Global.BattlegroundMgr.BuildBattlegroundStatusQueued(out BattlefieldStatusQueued battlefieldStatusQueued, bg, member, queueSlot, ginfo.JoinTime, bgQueueTypeId, avgTime, arenatype, true);
|
||||||
Global.BattlegroundMgr.BuildBattlegroundStatusQueued(out battlefieldStatusQueued, bg, member, queueSlot, ginfo.JoinTime, avgTime, arenatype, true);
|
|
||||||
member.SendPacket(battlefieldStatusQueued);
|
member.SendPacket(battlefieldStatusQueued);
|
||||||
|
|
||||||
Log.outDebug(LogFilter.Battleground, "Battleground: player joined queue for arena as group bg queue type {0} bg type {1}: GUID {2}, NAME {3}", bgQueueTypeId, bgTypeId, member.GetGUID().ToString(), member.GetName());
|
Log.outDebug(LogFilter.Battleground, $"Battleground: player joined queue for arena as group bg queue {bgQueueTypeId}, {member.GetGUID()}, NAME {member.GetName()}");
|
||||||
}
|
}
|
||||||
|
|
||||||
Global.BattlegroundMgr.ScheduleQueueUpdate(matchmakerRating, arenatype, bgQueueTypeId, bgTypeId, bracketEntry.GetBracketId());
|
Global.BattlegroundMgr.ScheduleQueueUpdate(matchmakerRating, bgQueueTypeId, bracketEntry.GetBracketId());
|
||||||
}
|
}
|
||||||
|
|
||||||
[WorldPacketHandler(ClientOpcodes.ReportPvpPlayerAfk)]
|
[WorldPacketHandler(ClientOpcodes.ReportPvpPlayerAfk)]
|
||||||
|
|||||||
@@ -305,7 +305,7 @@ namespace Game
|
|||||||
|
|
||||||
if (log && packet.Info.SendMoney > 0)
|
if (log && packet.Info.SendMoney > 0)
|
||||||
{
|
{
|
||||||
Log.outCommand(GetAccountId(), "GM {0} ({1}) (Account: {{2}) mail money: {3} to player: {4} ({5}) (Account: {6})",
|
Log.outCommand(GetAccountId(), "GM {0} ({1}) (Account: {2}) mail money: {3} to player: {4} ({5}) (Account: {6})",
|
||||||
GetPlayerName(), GetPlayer().GetGUID().ToString(), GetAccountId(), packet.Info.SendMoney, packet.Info.Target, receiverGuid.ToString(), receiverAccountId);
|
GetPlayerName(), GetPlayer().GetGUID().ToString(), GetAccountId(), packet.Info.SendMoney, packet.Info.Target, receiverGuid.ToString(), receiverAccountId);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -420,9 +420,6 @@ namespace Game.Maps
|
|||||||
if (GridMaps[gx][gy] == null)
|
if (GridMaps[gx][gy] == null)
|
||||||
{
|
{
|
||||||
Map rootParentTerrainMap = m_parentMap.GetRootParentTerrainMap();
|
Map rootParentTerrainMap = m_parentMap.GetRootParentTerrainMap();
|
||||||
// because LoadMapAndVMap is always entered using rootParentTerrainMap, we can only lock that once and not have to do it for every child map
|
|
||||||
if (this != rootParentTerrainMap)
|
|
||||||
Monitor.Enter(rootParentTerrainMap._gridLock);
|
|
||||||
|
|
||||||
if (m_parentMap.GridMaps[gx][gy] == null)
|
if (m_parentMap.GridMaps[gx][gy] == null)
|
||||||
rootParentTerrainMap.LoadMapAndVMap(gx, gy);
|
rootParentTerrainMap.LoadMapAndVMap(gx, gy);
|
||||||
|
|||||||
@@ -80,143 +80,16 @@ namespace Game.Network.Packets
|
|||||||
public override void Read() { }
|
public override void Read() { }
|
||||||
}
|
}
|
||||||
|
|
||||||
public class PVPLogData : ServerPacket
|
public class PVPLogDataMessage : ServerPacket
|
||||||
{
|
{
|
||||||
public PVPLogData() : base(ServerOpcodes.PvpLogData, ConnectionType.Instance) { }
|
public PVPLogDataMessage() : base(ServerOpcodes.PvpLogData, ConnectionType.Instance) { }
|
||||||
|
|
||||||
public override void Write()
|
public override void Write()
|
||||||
{
|
{
|
||||||
_worldPacket.WriteBit(Ratings.HasValue);
|
Data.Write(_worldPacket);
|
||||||
_worldPacket.WriteInt32(Statistics.Count);
|
|
||||||
foreach (var id in PlayerCount)
|
|
||||||
_worldPacket.WriteInt8(id);
|
|
||||||
|
|
||||||
if (Ratings.HasValue)
|
|
||||||
Ratings.Value.Write(_worldPacket);
|
|
||||||
|
|
||||||
foreach (PVPMatchPlayerStatistics player in Statistics)
|
|
||||||
player.Write(_worldPacket);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<PVPMatchPlayerStatistics> Statistics = new List<PVPMatchPlayerStatistics>();
|
public PVPLogData Data;
|
||||||
public Optional<RatingData> Ratings;
|
|
||||||
public sbyte[] PlayerCount = new sbyte[2];
|
|
||||||
|
|
||||||
public class RatingData
|
|
||||||
{
|
|
||||||
public void Write(WorldPacket data)
|
|
||||||
{
|
|
||||||
foreach (var id in Prematch)
|
|
||||||
data.WriteUInt32(id);
|
|
||||||
|
|
||||||
foreach (var id in Postmatch)
|
|
||||||
data.WriteUInt32(id);
|
|
||||||
|
|
||||||
foreach (var id in PrematchMMR)
|
|
||||||
data.WriteUInt32(id);
|
|
||||||
}
|
|
||||||
|
|
||||||
public uint[] Prematch = new uint[2];
|
|
||||||
public uint[] Postmatch = new uint[2];
|
|
||||||
public uint[] PrematchMMR = new uint[2];
|
|
||||||
}
|
|
||||||
|
|
||||||
public struct HonorData
|
|
||||||
{
|
|
||||||
public void Write(WorldPacket data)
|
|
||||||
{
|
|
||||||
data.WriteUInt32(HonorKills);
|
|
||||||
data.WriteUInt32(Deaths);
|
|
||||||
data.WriteUInt32(ContributionPoints);
|
|
||||||
}
|
|
||||||
|
|
||||||
public uint HonorKills;
|
|
||||||
public uint Deaths;
|
|
||||||
public uint ContributionPoints;
|
|
||||||
}
|
|
||||||
|
|
||||||
public struct PVPMatchPlayerPVPStat
|
|
||||||
{
|
|
||||||
public int PvpStatID;
|
|
||||||
public uint PvpStatValue;
|
|
||||||
|
|
||||||
public PVPMatchPlayerPVPStat(int pvpStatID, uint pvpStatValue)
|
|
||||||
{
|
|
||||||
PvpStatID = pvpStatID;
|
|
||||||
PvpStatValue = pvpStatValue;
|
|
||||||
}
|
|
||||||
|
|
||||||
public void Write(WorldPacket data)
|
|
||||||
{
|
|
||||||
data.WriteInt32(PvpStatID);
|
|
||||||
data.WriteUInt32(PvpStatValue);
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
|
|
||||||
public class PVPMatchPlayerStatistics
|
|
||||||
{
|
|
||||||
public void Write(WorldPacket data)
|
|
||||||
{
|
|
||||||
data.WritePackedGuid(PlayerGUID);
|
|
||||||
data.WriteUInt32(Kills);
|
|
||||||
data.WriteUInt32(DamageDone);
|
|
||||||
data.WriteUInt32(HealingDone);
|
|
||||||
data.WriteInt32(Stats.Count);
|
|
||||||
data.WriteInt32(PrimaryTalentTree);
|
|
||||||
data.WriteInt32(Sex);
|
|
||||||
data.WriteUInt32((uint)PlayerRace);
|
|
||||||
data.WriteInt32(PlayerClass);
|
|
||||||
data.WriteInt32(CreatureID);
|
|
||||||
data.WriteInt32(HonorLevel);
|
|
||||||
|
|
||||||
foreach (var pvpStat in Stats)
|
|
||||||
pvpStat.Write(data);
|
|
||||||
|
|
||||||
data.WriteBit(Faction);
|
|
||||||
data.WriteBit(IsInWorld);
|
|
||||||
data.WriteBit(Honor.HasValue);
|
|
||||||
data.WriteBit(PreMatchRating.HasValue);
|
|
||||||
data.WriteBit(RatingChange.HasValue);
|
|
||||||
data.WriteBit(PreMatchMMR.HasValue);
|
|
||||||
data.WriteBit(MmrChange.HasValue);
|
|
||||||
data.FlushBits();
|
|
||||||
|
|
||||||
if (Honor.HasValue)
|
|
||||||
Honor.Value.Write(data);
|
|
||||||
|
|
||||||
if (PreMatchRating.HasValue)
|
|
||||||
data.WriteUInt32(PreMatchRating.Value);
|
|
||||||
|
|
||||||
if (RatingChange.HasValue)
|
|
||||||
data.WriteInt32(RatingChange.Value);
|
|
||||||
|
|
||||||
if (PreMatchMMR.HasValue)
|
|
||||||
data.WriteUInt32(PreMatchMMR.Value);
|
|
||||||
|
|
||||||
if (MmrChange.HasValue)
|
|
||||||
data.WriteInt32(MmrChange.Value);
|
|
||||||
}
|
|
||||||
|
|
||||||
public ObjectGuid PlayerGUID;
|
|
||||||
public uint Kills;
|
|
||||||
public byte Faction;
|
|
||||||
public bool IsInWorld;
|
|
||||||
public Optional<HonorData> Honor;
|
|
||||||
public uint DamageDone;
|
|
||||||
public uint HealingDone;
|
|
||||||
public Optional<uint> PreMatchRating;
|
|
||||||
public Optional<int> RatingChange;
|
|
||||||
public Optional<uint> PreMatchMMR;
|
|
||||||
public Optional<int> MmrChange;
|
|
||||||
public List<PVPMatchPlayerPVPStat> Stats = new List<PVPMatchPlayerPVPStat>();
|
|
||||||
public int PrimaryTalentTree;
|
|
||||||
public int Sex;
|
|
||||||
public Race PlayerRace;
|
|
||||||
public int PlayerClass;
|
|
||||||
public int CreatureID;
|
|
||||||
public int HonorLevel;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public class BattlefieldStatusNone : ServerPacket
|
public class BattlefieldStatusNone : ServerPacket
|
||||||
@@ -569,7 +442,198 @@ namespace Game.Network.Packets
|
|||||||
public override void Read() { }
|
public override void Read() { }
|
||||||
}
|
}
|
||||||
|
|
||||||
|
class PVPMatchInit : ServerPacket
|
||||||
|
{
|
||||||
|
public PVPMatchInit() : base(ServerOpcodes.PvpMatchInit, ConnectionType.Instance) { }
|
||||||
|
|
||||||
|
public override void Write()
|
||||||
|
{
|
||||||
|
_worldPacket.WriteUInt32(MapID);
|
||||||
|
_worldPacket.WriteUInt8((byte)State);
|
||||||
|
_worldPacket.WriteInt32((int)StartTime);
|
||||||
|
_worldPacket.WriteInt32(Duration);
|
||||||
|
_worldPacket.WriteUInt8(ArenaFaction);
|
||||||
|
_worldPacket.WriteUInt32(BattlemasterListID);
|
||||||
|
_worldPacket.WriteBit(Registered);
|
||||||
|
_worldPacket.WriteBit(AffectsRating);
|
||||||
|
_worldPacket.FlushBits();
|
||||||
|
}
|
||||||
|
|
||||||
|
public enum MatchState
|
||||||
|
{
|
||||||
|
InProgress = 1,
|
||||||
|
Complete = 3,
|
||||||
|
Inactive = 4
|
||||||
|
}
|
||||||
|
|
||||||
|
public uint MapID;
|
||||||
|
public MatchState State = MatchState.Inactive;
|
||||||
|
public long StartTime;
|
||||||
|
public int Duration;
|
||||||
|
public byte ArenaFaction;
|
||||||
|
public uint BattlemasterListID;
|
||||||
|
public bool Registered;
|
||||||
|
public bool AffectsRating;
|
||||||
|
}
|
||||||
|
|
||||||
|
class PVPMatchEnd : ServerPacket
|
||||||
|
{
|
||||||
|
public PVPMatchEnd() : base(ServerOpcodes.PvpMatchEnd, ConnectionType.Instance) { }
|
||||||
|
|
||||||
|
public override void Write()
|
||||||
|
{
|
||||||
|
_worldPacket.WriteUInt8(Winner);
|
||||||
|
_worldPacket.WriteInt32(Duration);
|
||||||
|
_worldPacket.WriteBit(LogData.HasValue);
|
||||||
|
_worldPacket.FlushBits();
|
||||||
|
|
||||||
|
if (LogData.HasValue)
|
||||||
|
LogData.Value.Write(_worldPacket);
|
||||||
|
}
|
||||||
|
|
||||||
|
public byte Winner;
|
||||||
|
public int Duration;
|
||||||
|
public Optional<PVPLogData> LogData;
|
||||||
|
}
|
||||||
|
|
||||||
//Structs
|
//Structs
|
||||||
|
public class PVPLogData
|
||||||
|
{
|
||||||
|
public List<PVPMatchPlayerStatistics> Statistics = new List<PVPMatchPlayerStatistics>();
|
||||||
|
public Optional<RatingData> Ratings;
|
||||||
|
public sbyte[] PlayerCount = new sbyte[2];
|
||||||
|
|
||||||
|
public class RatingData
|
||||||
|
{
|
||||||
|
public void Write(WorldPacket data)
|
||||||
|
{
|
||||||
|
foreach (var id in Prematch)
|
||||||
|
data.WriteUInt32(id);
|
||||||
|
|
||||||
|
foreach (var id in Postmatch)
|
||||||
|
data.WriteUInt32(id);
|
||||||
|
|
||||||
|
foreach (var id in PrematchMMR)
|
||||||
|
data.WriteUInt32(id);
|
||||||
|
}
|
||||||
|
|
||||||
|
public uint[] Prematch = new uint[2];
|
||||||
|
public uint[] Postmatch = new uint[2];
|
||||||
|
public uint[] PrematchMMR = new uint[2];
|
||||||
|
}
|
||||||
|
|
||||||
|
public struct HonorData
|
||||||
|
{
|
||||||
|
public void Write(WorldPacket data)
|
||||||
|
{
|
||||||
|
data.WriteUInt32(HonorKills);
|
||||||
|
data.WriteUInt32(Deaths);
|
||||||
|
data.WriteUInt32(ContributionPoints);
|
||||||
|
}
|
||||||
|
|
||||||
|
public uint HonorKills;
|
||||||
|
public uint Deaths;
|
||||||
|
public uint ContributionPoints;
|
||||||
|
}
|
||||||
|
|
||||||
|
public struct PVPMatchPlayerPVPStat
|
||||||
|
{
|
||||||
|
public int PvpStatID;
|
||||||
|
public uint PvpStatValue;
|
||||||
|
|
||||||
|
public PVPMatchPlayerPVPStat(int pvpStatID, uint pvpStatValue)
|
||||||
|
{
|
||||||
|
PvpStatID = pvpStatID;
|
||||||
|
PvpStatValue = pvpStatValue;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Write(WorldPacket data)
|
||||||
|
{
|
||||||
|
data.WriteInt32(PvpStatID);
|
||||||
|
data.WriteUInt32(PvpStatValue);
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
public class PVPMatchPlayerStatistics
|
||||||
|
{
|
||||||
|
public void Write(WorldPacket data)
|
||||||
|
{
|
||||||
|
data.WritePackedGuid(PlayerGUID);
|
||||||
|
data.WriteUInt32(Kills);
|
||||||
|
data.WriteUInt32(DamageDone);
|
||||||
|
data.WriteUInt32(HealingDone);
|
||||||
|
data.WriteInt32(Stats.Count);
|
||||||
|
data.WriteInt32(PrimaryTalentTree);
|
||||||
|
data.WriteInt32(Sex);
|
||||||
|
data.WriteUInt32((uint)PlayerRace);
|
||||||
|
data.WriteInt32(PlayerClass);
|
||||||
|
data.WriteInt32(CreatureID);
|
||||||
|
data.WriteInt32(HonorLevel);
|
||||||
|
|
||||||
|
foreach (var pvpStat in Stats)
|
||||||
|
pvpStat.Write(data);
|
||||||
|
|
||||||
|
data.WriteBit(Faction);
|
||||||
|
data.WriteBit(IsInWorld);
|
||||||
|
data.WriteBit(Honor.HasValue);
|
||||||
|
data.WriteBit(PreMatchRating.HasValue);
|
||||||
|
data.WriteBit(RatingChange.HasValue);
|
||||||
|
data.WriteBit(PreMatchMMR.HasValue);
|
||||||
|
data.WriteBit(MmrChange.HasValue);
|
||||||
|
data.FlushBits();
|
||||||
|
|
||||||
|
if (Honor.HasValue)
|
||||||
|
Honor.Value.Write(data);
|
||||||
|
|
||||||
|
if (PreMatchRating.HasValue)
|
||||||
|
data.WriteUInt32(PreMatchRating.Value);
|
||||||
|
|
||||||
|
if (RatingChange.HasValue)
|
||||||
|
data.WriteInt32(RatingChange.Value);
|
||||||
|
|
||||||
|
if (PreMatchMMR.HasValue)
|
||||||
|
data.WriteUInt32(PreMatchMMR.Value);
|
||||||
|
|
||||||
|
if (MmrChange.HasValue)
|
||||||
|
data.WriteInt32(MmrChange.Value);
|
||||||
|
}
|
||||||
|
|
||||||
|
public ObjectGuid PlayerGUID;
|
||||||
|
public uint Kills;
|
||||||
|
public byte Faction;
|
||||||
|
public bool IsInWorld;
|
||||||
|
public Optional<HonorData> Honor;
|
||||||
|
public uint DamageDone;
|
||||||
|
public uint HealingDone;
|
||||||
|
public Optional<uint> PreMatchRating;
|
||||||
|
public Optional<int> RatingChange;
|
||||||
|
public Optional<uint> PreMatchMMR;
|
||||||
|
public Optional<int> MmrChange;
|
||||||
|
public List<PVPMatchPlayerPVPStat> Stats = new List<PVPMatchPlayerPVPStat>();
|
||||||
|
public int PrimaryTalentTree;
|
||||||
|
public int Sex;
|
||||||
|
public Race PlayerRace;
|
||||||
|
public int PlayerClass;
|
||||||
|
public int CreatureID;
|
||||||
|
public int HonorLevel;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void Write(WorldPacket data)
|
||||||
|
{
|
||||||
|
data.WriteBit(Ratings.HasValue);
|
||||||
|
data.WriteInt32(Statistics.Count);
|
||||||
|
foreach (var count in PlayerCount)
|
||||||
|
data.WriteInt8(count);
|
||||||
|
|
||||||
|
if (Ratings.HasValue)
|
||||||
|
Ratings.Value.Write(data);
|
||||||
|
|
||||||
|
foreach (var player in Statistics)
|
||||||
|
player.Write(data);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public class BattlefieldStatusHeader
|
public class BattlefieldStatusHeader
|
||||||
{
|
{
|
||||||
public void Write(WorldPacket data)
|
public void Write(WorldPacket data)
|
||||||
|
|||||||
@@ -132,8 +132,8 @@ namespace Game
|
|||||||
|
|
||||||
for (uint i = 0; i < SharedConst.MaxPlayerBGQueues; ++i)
|
for (uint i = 0; i < SharedConst.MaxPlayerBGQueues; ++i)
|
||||||
{
|
{
|
||||||
BattlegroundQueueTypeId bgQueueTypeId = GetPlayer().GetBattlegroundQueueTypeId(i);
|
BattlegroundQueueTypeId bgQueueTypeId = _player.GetBattlegroundQueueTypeId(i);
|
||||||
if (bgQueueTypeId != 0)
|
if (bgQueueTypeId != default)
|
||||||
{
|
{
|
||||||
_player.RemoveBattlegroundQueueId(bgQueueTypeId);
|
_player.RemoveBattlegroundQueueId(bgQueueTypeId);
|
||||||
BattlegroundQueue queue = Global.BattlegroundMgr.GetBattlegroundQueue(bgQueueTypeId);
|
BattlegroundQueue queue = Global.BattlegroundMgr.GetBattlegroundQueue(bgQueueTypeId);
|
||||||
|
|||||||
Reference in New Issue
Block a user