Core/Battlegrounds: Rework queues

* No more copies of Battleground classes
* FreesSlotQueues now have as key the MapId instead of queue id
* Random queues can now popup already busy specific battelgrounds (queues are NOT merged)
* Removed Holiday handling, this should already be handled in BattlegroundMgr::IsBGWeekend
Port From (https://github.com/TrinityCore/TrinityCore/commit/0ede6c155605da602b3bafaa3a1212d9f924759b)
This commit is contained in:
hondacrx
2023-09-14 06:16:30 -04:00
parent bad3e89ee6
commit 4134796f1b
35 changed files with 364 additions and 418 deletions
@@ -278,13 +278,6 @@ namespace Framework.Constants
WaitLeave = 4 // means some faction has won BG and it is ending WaitLeave = 4 // means some faction has won BG and it is ending
} }
public enum BGHonorMode
{
Normal = 0,
Holiday,
HonorModeNum
}
public enum GroupJoinBattlegroundResult public enum GroupJoinBattlegroundResult
{ {
None = 0, None = 0,
+1 -1
View File
@@ -113,7 +113,7 @@ namespace Framework.Constants
/// </summary> /// </summary>
public const int PvpTeamsCount = 2; public const int PvpTeamsCount = 2;
public const uint CountOfPlayersToAverageWaitTime = 10; public const uint CountOfPlayersToAverageWaitTime = 10;
public const uint MaxPlayerBGQueues = 2; public const uint MaxPlayerBGQueues = 3;
public const uint BGAwardArenaPointsMinLevel = 71; public const uint BGAwardArenaPointsMinLevel = 71;
public const int ArenaTimeLimitPointsLoss = -16; public const int ArenaTimeLimitPointsLoss = -16;
public const int MaxArenaSlot = 3; public const int MaxArenaSlot = 3;
@@ -121,7 +121,7 @@ namespace Framework.Database
PrepareStatement(CharStatements.SEL_CHARACTER_TRANSMOG_OUTFITS, "SELECT setguid, setindex, name, iconname, ignore_mask, appearance0, appearance1, appearance2, appearance3, appearance4, " + PrepareStatement(CharStatements.SEL_CHARACTER_TRANSMOG_OUTFITS, "SELECT setguid, setindex, name, iconname, ignore_mask, appearance0, appearance1, appearance2, appearance3, appearance4, " +
"appearance5, appearance6, appearance7, appearance8, appearance9, appearance10, appearance11, appearance12, appearance13, appearance14, appearance15, appearance16, " + "appearance5, appearance6, appearance7, appearance8, appearance9, appearance10, appearance11, appearance12, appearance13, appearance14, appearance15, appearance16, " +
"appearance17, appearance18, mainHandEnchant, offHandEnchant FROM character_transmog_outfits WHERE guid = ? ORDER BY setindex"); "appearance17, appearance18, mainHandEnchant, offHandEnchant FROM character_transmog_outfits WHERE guid = ? ORDER BY setindex");
PrepareStatement(CharStatements.SEL_CHARACTER_BGDATA, "SELECT instanceId, team, joinX, joinY, joinZ, joinO, joinMapId, taxiStart, taxiEnd, mountSpell FROM character_battleground_data WHERE guid = ?"); PrepareStatement(CharStatements.SEL_CHARACTER_BGDATA, "SELECT instanceId, team, joinX, joinY, joinZ, joinO, joinMapId, taxiStart, taxiEnd, mountSpell, queueId FROM character_battleground_data WHERE guid = ?");
PrepareStatement(CharStatements.SEL_CHARACTER_GLYPHS, "SELECT talentGroup, glyphId FROM character_glyphs WHERE guid = ?"); PrepareStatement(CharStatements.SEL_CHARACTER_GLYPHS, "SELECT talentGroup, glyphId FROM character_glyphs WHERE guid = ?");
PrepareStatement(CharStatements.SEL_CHARACTER_TALENTS, "SELECT talentId, talentGroup FROM character_talent WHERE guid = ?"); PrepareStatement(CharStatements.SEL_CHARACTER_TALENTS, "SELECT talentId, talentGroup FROM character_talent WHERE guid = ?");
PrepareStatement(CharStatements.SEL_CHARACTER_PVP_TALENTS, "SELECT talentId0, talentId1, talentId2, talentId3, talentGroup FROM character_pvp_talent WHERE guid = ?"); PrepareStatement(CharStatements.SEL_CHARACTER_PVP_TALENTS, "SELECT talentId0, talentId1, talentId2, talentId3, talentGroup FROM character_pvp_talent WHERE guid = ?");
@@ -387,7 +387,7 @@ namespace Framework.Database
PrepareStatement(CharStatements.UPD_ARENA_TEAM_NAME, "UPDATE arena_team SET name = ? WHERE arenaTeamId = ?"); PrepareStatement(CharStatements.UPD_ARENA_TEAM_NAME, "UPDATE arena_team SET name = ? WHERE arenaTeamId = ?");
// Character battleground data // Character battleground data
PrepareStatement(CharStatements.INS_PLAYER_BGDATA, "INSERT INTO character_battleground_data (guid, instanceId, team, joinX, joinY, joinZ, joinO, joinMapId, taxiStart, taxiEnd, mountSpell) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)"); PrepareStatement(CharStatements.INS_PLAYER_BGDATA, "INSERT INTO character_battleground_data (guid, instanceId, team, joinX, joinY, joinZ, joinO, joinMapId, taxiStart, taxiEnd, mountSpell, queueId) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
PrepareStatement(CharStatements.DEL_PLAYER_BGDATA, "DELETE FROM character_battleground_data WHERE guid = ?"); PrepareStatement(CharStatements.DEL_PLAYER_BGDATA, "DELETE FROM character_battleground_data WHERE guid = ?");
// Character homebind // Character homebind
+2 -2
View File
@@ -29,10 +29,10 @@ namespace Game.Arenas
StartMessageIds[BattlegroundConst.EventIdFourth] = ArenaBroadcastTexts.HasBegun; StartMessageIds[BattlegroundConst.EventIdFourth] = ArenaBroadcastTexts.HasBegun;
} }
public override void AddPlayer(Player player) public override void AddPlayer(Player player, BattlegroundQueueTypeId queueId)
{ {
bool isInBattleground = IsPlayerInBattleground(player.GetGUID()); bool isInBattleground = IsPlayerInBattleground(player.GetGUID());
base.AddPlayer(player); base.AddPlayer(player, queueId);
if (!isInBattleground) if (!isInBattleground)
PlayerScores[player.GetGUID()] = new ArenaScore(player.GetGUID(), player.GetBGTeam()); PlayerScores[player.GetGUID()] = new ArenaScore(player.GetGUID(), player.GetBGTeam());
+45 -44
View File
@@ -24,12 +24,9 @@ namespace Game.BattleGrounds
public Battleground(BattlegroundTemplate battlegroundTemplate) public Battleground(BattlegroundTemplate battlegroundTemplate)
{ {
_battlegroundTemplate = battlegroundTemplate; _battlegroundTemplate = battlegroundTemplate;
m_RandomTypeID = BattlegroundTypeId.None;
m_Status = BattlegroundStatus.None; m_Status = BattlegroundStatus.None;
_winnerTeamId = PvPTeamId.Neutral; _winnerTeamId = PvPTeamId.Neutral;
m_HonorMode = BGHonorMode.Normal;
StartDelayTimes[BattlegroundConst.EventIdFirst] = BattlegroundStartTimeIntervals.Delay2m; StartDelayTimes[BattlegroundConst.EventIdFirst] = BattlegroundStartTimeIntervals.Delay2m;
StartDelayTimes[BattlegroundConst.EventIdSecond] = BattlegroundStartTimeIntervals.Delay1m; StartDelayTimes[BattlegroundConst.EventIdSecond] = BattlegroundStartTimeIntervals.Delay1m;
StartDelayTimes[BattlegroundConst.EventIdThird] = BattlegroundStartTimeIntervals.Delay30s; StartDelayTimes[BattlegroundConst.EventIdThird] = BattlegroundStartTimeIntervals.Delay30s;
@@ -632,7 +629,7 @@ namespace Game.BattleGrounds
stmt.AddValue(0, battlegroundId); stmt.AddValue(0, battlegroundId);
stmt.AddValue(1, (byte)GetWinner()); stmt.AddValue(1, (byte)GetWinner());
stmt.AddValue(2, GetUniqueBracketId()); stmt.AddValue(2, GetUniqueBracketId());
stmt.AddValue(3, (byte)GetTypeID(true)); stmt.AddValue(3, (uint)GetTypeID());
DB.Characters.Execute(stmt); DB.Characters.Execute(stmt);
} }
@@ -702,18 +699,23 @@ namespace Game.BattleGrounds
// Reward winner team // Reward winner team
if (team == winner) if (team == winner)
{ {
if (IsRandom() || Global.BattlegroundMgr.IsBGWeekend(GetTypeID())) BattlegroundPlayer bgPlayer = GetBattlegroundPlayerData(player.GetGUID());
if (bgPlayer != null)
{ {
UpdatePlayerScore(player, ScoreType.BonusHonor, GetBonusHonorFromKill(winnerKills)); if (Global.BattlegroundMgr.IsRandomBattleground((BattlegroundTypeId)bgPlayer.queueTypeId.BattlemasterListId)
if (!player.GetRandomWinner()) || Global.BattlegroundMgr.IsBGWeekend((BattlegroundTypeId)bgPlayer.queueTypeId.BattlemasterListId))
{ {
player.SetRandomWinner(true); UpdatePlayerScore(player, ScoreType.BonusHonor, GetBonusHonorFromKill(winnerKills));
// TODO: win honor xp if (!player.GetRandomWinner())
{
player.SetRandomWinner(true);
// TODO: win honor xp
}
}
else
{
// TODO: loss honor xp
} }
}
else
{
// TODO: lose honor xp
} }
player.UpdateCriteria(CriteriaType.WinBattleground, player.GetMapId()); player.UpdateCriteria(CriteriaType.WinBattleground, player.GetMapId());
@@ -731,8 +733,13 @@ namespace Game.BattleGrounds
} }
else else
{ {
if (IsRandom() || Global.BattlegroundMgr.IsBGWeekend(GetTypeID())) BattlegroundPlayer bgPlayer = GetBattlegroundPlayerData(player.GetGUID());
UpdatePlayerScore(player, ScoreType.BonusHonor, GetBonusHonorFromKill(loserKills)); if (bgPlayer != null)
{
if (Global.BattlegroundMgr.IsRandomBattleground((BattlegroundTypeId)bgPlayer.queueTypeId.BattlemasterListId)
|| Global.BattlegroundMgr.IsBGWeekend((BattlegroundTypeId)bgPlayer.queueTypeId.BattlemasterListId))
UpdatePlayerScore(player, ScoreType.BonusHonor, GetBonusHonorFromKill(loserKills));
}
} }
player.ResetAllPowers(); player.ResetAllPowers();
@@ -770,8 +777,10 @@ namespace Game.BattleGrounds
bool participant = false; bool participant = false;
// Remove from lists/maps // Remove from lists/maps
var bgPlayer = m_Players.LookupByKey(guid); var bgPlayer = m_Players.LookupByKey(guid);
BattlegroundQueueTypeId? bgQueueTypeId = null;
if (bgPlayer != null) if (bgPlayer != null)
{ {
bgQueueTypeId = bgPlayer.queueTypeId;
UpdatePlayersCountByTeam(team, true); // -1 player UpdatePlayersCountByTeam(team, true); // -1 player
m_Players.Remove(guid); m_Players.Remove(guid);
// check if the player was a participant of the match, or only entered through gm command (goname) // check if the player was a participant of the match, or only entered through gm command (goname)
@@ -811,8 +820,6 @@ namespace Game.BattleGrounds
RemovePlayer(player, guid, team); // BG subclass specific code RemovePlayer(player, guid, team); // BG subclass specific code
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
{ {
if (player) if (player)
@@ -826,15 +833,16 @@ namespace Game.BattleGrounds
player.RemovePet(null, PetSaveMode.NotInSlot); player.RemovePet(null, PetSaveMode.NotInSlot);
player.ResummonPetTemporaryUnSummonedIfAny(); player.ResummonPetTemporaryUnSummonedIfAny();
} }
if (SendPacket) if (SendPacket && bgQueueTypeId.HasValue)
{ {
BattlefieldStatusNone battlefieldStatus; BattlefieldStatusNone battlefieldStatus;
Global.BattlegroundMgr.BuildBattlegroundStatusNone(out battlefieldStatus, player, player.GetBattlegroundQueueIndex(bgQueueTypeId), player.GetBattlegroundQueueJoinTime(bgQueueTypeId)); Global.BattlegroundMgr.BuildBattlegroundStatusNone(out battlefieldStatus, player, player.GetBattlegroundQueueIndex(bgQueueTypeId.Value), player.GetBattlegroundQueueJoinTime(bgQueueTypeId.Value));
player.SendPacket(battlefieldStatus); player.SendPacket(battlefieldStatus);
} }
// this call is important, because player, when joins to Battleground, this method is not called, so it must be called when leaving bg // this call is important, because player, when joins to Battleground, this method is not called, so it must be called when leaving bg
player.RemoveBattlegroundQueueId(bgQueueTypeId); if (bgQueueTypeId.HasValue)
player.RemoveBattlegroundQueueId(bgQueueTypeId.Value);
} }
// remove from raid group if player is member // remove from raid group if player is member
@@ -846,11 +854,11 @@ namespace Game.BattleGrounds
} }
DecreaseInvitedCount(team); DecreaseInvitedCount(team);
//we should update Battleground queue, but only if bg isn't ending //we should update Battleground queue, but only if bg isn't ending
if (IsBattleground() && GetStatus() < BattlegroundStatus.WaitLeave) if (IsBattleground() && GetStatus() < BattlegroundStatus.WaitLeave && bgQueueTypeId.HasValue)
{ {
// 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, bgQueueTypeId, GetBracketId()); Global.BattlegroundMgr.ScheduleQueueUpdate(0, bgQueueTypeId.Value, GetBracketId());
} }
// Let others know // Let others know
BattlegroundPlayerLeft playerLeft = new(); BattlegroundPlayerLeft playerLeft = new();
@@ -922,7 +930,7 @@ namespace Game.BattleGrounds
player.TeleportTo(loc.Loc); player.TeleportTo(loc.Loc);
} }
public virtual void AddPlayer(Player player) public virtual void AddPlayer(Player player, BattlegroundQueueTypeId queueId)
{ {
// remove afk from player // remove afk from player
if (player.IsAFK()) if (player.IsAFK())
@@ -936,7 +944,8 @@ namespace Game.BattleGrounds
BattlegroundPlayer bp = new(); BattlegroundPlayer bp = new();
bp.OfflineRemoveTime = 0; bp.OfflineRemoveTime = 0;
bp.Team = team; bp.Team = team;
bp.Mercenary = player.IsMercenaryForBattlegroundQueueType(GetQueueId()); bp.Mercenary = player.IsMercenaryForBattlegroundQueueType(queueId);
bp.queueTypeId = queueId;
bool isInBattleground = IsPlayerInBattleground(player.GetGUID()); bool isInBattleground = IsPlayerInBattleground(player.GetGUID());
// Add to list/maps // Add to list/maps
@@ -975,8 +984,9 @@ namespace Game.BattleGrounds
pvpMatchInitialize.Duration = (int)(GetElapsedTime() - (int)BattlegroundStartTimeIntervals.Delay2m) / Time.InMilliseconds; pvpMatchInitialize.Duration = (int)(GetElapsedTime() - (int)BattlegroundStartTimeIntervals.Delay2m) / Time.InMilliseconds;
pvpMatchInitialize.StartTime = GameTime.GetGameTime() - pvpMatchInitialize.Duration; pvpMatchInitialize.StartTime = GameTime.GetGameTime() - pvpMatchInitialize.Duration;
} }
pvpMatchInitialize.ArenaFaction = (byte)(player.GetBGTeam() == Team.Horde ? PvPTeamId.Horde : PvPTeamId.Alliance); pvpMatchInitialize.ArenaFaction = (byte)(player.GetBGTeam() == Team.Horde ? PvPTeamId.Horde : PvPTeamId.Alliance);
pvpMatchInitialize.BattlemasterListID = (uint)GetTypeID(); pvpMatchInitialize.BattlemasterListID = queueId.BattlemasterListId;
pvpMatchInitialize.Registered = false; pvpMatchInitialize.Registered = false;
pvpMatchInitialize.AffectsRating = IsRated(); pvpMatchInitialize.AffectsRating = IsRated();
@@ -1118,7 +1128,7 @@ namespace Game.BattleGrounds
{ {
if (!m_InBGFreeSlotQueue && IsBattleground()) if (!m_InBGFreeSlotQueue && IsBattleground())
{ {
Global.BattlegroundMgr.AddToBGFreeSlotQueue(GetQueueId(), this); Global.BattlegroundMgr.AddToBGFreeSlotQueue(this);
m_InBGFreeSlotQueue = true; m_InBGFreeSlotQueue = true;
} }
} }
@@ -1128,7 +1138,7 @@ namespace Game.BattleGrounds
{ {
if (m_InBGFreeSlotQueue) if (m_InBGFreeSlotQueue)
{ {
Global.BattlegroundMgr.RemoveFromBGFreeSlotQueue(GetQueueId(), m_InstanceID); Global.BattlegroundMgr.RemoveFromBGFreeSlotQueue(GetMapId(), m_InstanceID);
m_InBGFreeSlotQueue = false; m_InBGFreeSlotQueue = false;
} }
} }
@@ -1647,11 +1657,6 @@ namespace Game.BattleGrounds
return count; return count;
} }
public void SetHoliday(bool is_holiday)
{
m_HonorMode = is_holiday ? BGHonorMode.Holiday : BGHonorMode.Normal;
}
int GetObjectType(ObjectGuid guid) int GetObjectType(ObjectGuid guid)
{ {
for (int i = 0; i < BgObjects.Length; ++i) for (int i = 0; i < BgObjects.Length; ++i)
@@ -1724,9 +1729,9 @@ namespace Game.BattleGrounds
return _battlegroundTemplate.BattlemasterEntry.Name[Global.WorldMgr.GetDefaultDbcLocale()]; return _battlegroundTemplate.BattlemasterEntry.Name[Global.WorldMgr.GetDefaultDbcLocale()];
} }
public BattlegroundTypeId GetTypeID(bool getRandom = false) public BattlegroundTypeId GetTypeID()
{ {
return getRandom ? m_RandomTypeID : _battlegroundTemplate.Id; return _battlegroundTemplate.Id;
} }
public BattlegroundBracketId GetBracketId() public BattlegroundBracketId GetBracketId()
@@ -1790,12 +1795,16 @@ namespace Game.BattleGrounds
return _battlegroundTemplate.GetMinPlayersPerTeam(); return _battlegroundTemplate.GetMinPlayersPerTeam();
} }
public BattlegroundPlayer GetBattlegroundPlayerData(ObjectGuid playerGuid)
{
return m_Players.LookupByKey(playerGuid);
}
public virtual void StartingEventCloseDoors() { } public virtual void StartingEventCloseDoors() { }
public virtual void StartingEventOpenDoors() { } public virtual void StartingEventOpenDoors() { }
public virtual void DestroyGate(Player player, GameObject go) { } public virtual void DestroyGate(Player player, GameObject go) { }
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; }
@@ -1805,10 +1814,7 @@ namespace Game.BattleGrounds
int GetStartDelayTime() { return m_StartDelayTime; } int GetStartDelayTime() { return m_StartDelayTime; }
public ArenaTypes GetArenaType() { return m_ArenaType; } public ArenaTypes GetArenaType() { return m_ArenaType; }
PvPTeamId GetWinner() { return _winnerTeamId; } PvPTeamId GetWinner() { return _winnerTeamId; }
public bool IsRandom() { return m_IsRandom; }
public void SetQueueId(BattlegroundQueueTypeId queueId) { m_queueId = queueId; }
public void SetRandomTypeID(BattlegroundTypeId TypeID) { m_RandomTypeID = TypeID; }
//here we can count minlevel and maxlevel for players //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; }
public void SetStatus(BattlegroundStatus Status) { m_Status = Status; } public void SetStatus(BattlegroundStatus Status) { m_Status = Status; }
@@ -1837,7 +1843,6 @@ namespace Game.BattleGrounds
++m_InvitedHorde; ++m_InvitedHorde;
} }
public void SetRandom(bool isRandom) { m_IsRandom = isRandom; }
uint GetInvitedCount(Team team) { return (team == Team.Alliance) ? m_InvitedAlliance : m_InvitedHorde; } uint GetInvitedCount(Team team) { return (team == Team.Alliance) ? m_InvitedAlliance : m_InvitedHorde; }
public bool IsRated() { return m_IsRated; } public bool IsRated() { return m_IsRated; }
@@ -1927,9 +1932,6 @@ namespace Game.BattleGrounds
// this must be filled inructors! // this must be filled inructors!
public uint[] StartMessageIds = new uint[4]; public uint[] StartMessageIds = new uint[4];
bool m_IsRandom;
public BGHonorMode m_HonorMode;
public uint[] m_TeamScores = new uint[SharedConst.PvpTeamsCount]; public uint[] m_TeamScores = new uint[SharedConst.PvpTeamsCount];
protected ObjectGuid[] BgObjects;// = new Dictionary<int, ObjectGuid>(); protected ObjectGuid[] BgObjects;// = new Dictionary<int, ObjectGuid>();
@@ -1938,8 +1940,6 @@ 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;
uint m_InstanceID; // Battleground Instance's GUID! uint m_InstanceID; // Battleground Instance's GUID!
BattlegroundStatus m_Status; BattlegroundStatus m_Status;
uint m_ClientInstanceID; // the instance-id which is sent to the client and without any other internal use uint m_ClientInstanceID; // the instance-id which is sent to the client and without any other internal use
@@ -1993,5 +1993,6 @@ namespace Game.BattleGrounds
public long OfflineRemoveTime; // for tracking and removing offline players from queue after 5 Time.Minutes public long OfflineRemoveTime; // for tracking and removing offline players from queue after 5 Time.Minutes
public Team Team; // Player's team public Team Team; // Player's team
public bool Mercenary; public bool Mercenary;
public BattlegroundQueueTypeId queueTypeId;
} }
} }
+91 -140
View File
@@ -105,7 +105,7 @@ namespace Game.BattleGrounds
} }
} }
void BuildBattlegroundStatusHeader(BattlefieldStatusHeader header, Battleground bg, Player player, uint ticketId, uint joinTime, BattlegroundQueueTypeId queueId, ArenaTypes arenaType) void BuildBattlegroundStatusHeader(BattlefieldStatusHeader header, Player player, uint ticketId, uint joinTime, BattlegroundQueueTypeId queueId)
{ {
header.Ticket = new RideTicket(); header.Ticket = new RideTicket();
header.Ticket.RequesterGuid = player.GetGUID(); header.Ticket.RequesterGuid = player.GetGUID();
@@ -113,11 +113,11 @@ namespace Game.BattleGrounds
header.Ticket.Type = RideType.Battlegrounds; header.Ticket.Type = RideType.Battlegrounds;
header.Ticket.Time = (int)joinTime; header.Ticket.Time = (int)joinTime;
header.QueueID.Add(queueId.GetPacked()); header.QueueID.Add(queueId.GetPacked());
header.RangeMin = (byte)bg.GetMinLevel(); header.RangeMin = 0; // seems to always be 0
header.RangeMax = (byte)bg.GetMaxLevel(); header.RangeMax = SharedConst.DefaultMaxLevel; // alwyas max level of current expansion. Might be limited to account
header.TeamSize = (byte)(bg.IsArena() ? arenaType : 0); header.TeamSize = queueId.TeamSize;
header.InstanceID = bg.GetClientInstanceID(); header.InstanceID = 0; // seems to always be 0
header.RegisteredMatch = bg.IsRated(); header.RegisteredMatch = queueId.Rated;
header.TournamentRules = false; header.TournamentRules = false;
} }
@@ -130,19 +130,19 @@ namespace Game.BattleGrounds
battlefieldStatus.Ticket.Time = (int)joinTime; battlefieldStatus.Ticket.Time = (int)joinTime;
} }
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, BattlegroundQueueTypeId queueId)
{ {
battlefieldStatus = new BattlefieldStatusNeedConfirmation(); battlefieldStatus = new BattlefieldStatusNeedConfirmation();
BuildBattlegroundStatusHeader(battlefieldStatus.Hdr, bg, player, ticketId, joinTime, bg.GetQueueId(), arenaType); BuildBattlegroundStatusHeader(battlefieldStatus.Hdr, player, ticketId, joinTime, queueId);
battlefieldStatus.Mapid = bg.GetMapId(); battlefieldStatus.Mapid = bg.GetMapId();
battlefieldStatus.Timeout = timeout; battlefieldStatus.Timeout = timeout;
battlefieldStatus.Role = 0; battlefieldStatus.Role = 0;
} }
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, BattlegroundQueueTypeId queueId)
{ {
battlefieldStatus = new BattlefieldStatusActive(); battlefieldStatus = new BattlefieldStatusActive();
BuildBattlegroundStatusHeader(battlefieldStatus.Hdr, bg, player, ticketId, joinTime, bg.GetQueueId(), arenaType); BuildBattlegroundStatusHeader(battlefieldStatus.Hdr, player, ticketId, joinTime, queueId);
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;
@@ -150,10 +150,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, BattlegroundQueueTypeId queueId, uint avgWaitTime, ArenaTypes arenaType, bool asGroup) public void BuildBattlegroundStatusQueued(out BattlefieldStatusQueued battlefieldStatus, Player player, uint ticketId, uint joinTime, BattlegroundQueueTypeId queueId, uint avgWaitTime, bool asGroup)
{ {
battlefieldStatus = new BattlefieldStatusQueued(); battlefieldStatus = new BattlefieldStatusQueued();
BuildBattlegroundStatusHeader(battlefieldStatus.Hdr, bg, player, ticketId, joinTime, queueId, arenaType); BuildBattlegroundStatusHeader(battlefieldStatus.Hdr, player, ticketId, joinTime, queueId);
battlefieldStatus.AverageWaitTime = avgWaitTime; battlefieldStatus.AverageWaitTime = avgWaitTime;
battlefieldStatus.AsGroup = asGroup; battlefieldStatus.AsGroup = asGroup;
battlefieldStatus.SuspendedQueue = false; battlefieldStatus.SuspendedQueue = false;
@@ -179,7 +179,7 @@ namespace Game.BattleGrounds
if (instanceId == 0) if (instanceId == 0)
return null; return null;
if (bgTypeId != BattlegroundTypeId.None || bgTypeId == BattlegroundTypeId.RB || bgTypeId == BattlegroundTypeId.RandomEpic) if (bgTypeId != BattlegroundTypeId.None || IsRandomBattleground(bgTypeId))
{ {
var data = bgDataStore.LookupByKey(bgTypeId); var data = bgDataStore.LookupByKey(bgTypeId);
return data.m_Battlegrounds.LookupByKey(instanceId); return data.m_Battlegrounds.LookupByKey(instanceId);
@@ -196,14 +196,6 @@ namespace Game.BattleGrounds
return null; return null;
} }
public Battleground GetBattlegroundTemplate(BattlegroundTypeId bgTypeId)
{
if (bgDataStore.ContainsKey(bgTypeId))
return bgDataStore[bgTypeId].Template;
return null;
}
uint CreateClientVisibleInstanceId(BattlegroundTypeId bgTypeId, BattlegroundBracketId bracket_id) uint CreateClientVisibleInstanceId(BattlegroundTypeId bgTypeId, BattlegroundBracketId bracket_id)
{ {
if (IsArenaType(bgTypeId)) if (IsArenaType(bgTypeId))
@@ -230,115 +222,92 @@ 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(BattlegroundQueueTypeId queueId, PvpDifficultyRecord bracketEntry) public Battleground CreateNewBattleground(BattlegroundQueueTypeId queueId, BattlegroundBracketId bracketId)
{ {
BattlegroundTypeId bgTypeId = GetRandomBG((BattlegroundTypeId)queueId.BattlemasterListId); BattlegroundTypeId bgTypeId = GetRandomBG((BattlegroundTypeId)queueId.BattlemasterListId);
// get the template BG // get the template BG
Battleground bg_template = GetBattlegroundTemplate(bgTypeId); BattlegroundTemplate bg_template = GetBattlegroundTemplateByTypeId(bgTypeId);
if (bg_template == null) if (bg_template == null)
{ {
Log.outError(LogFilter.Battleground, "Battleground: CreateNewBattleground - bg template not found for {0}", bgTypeId); Log.outError(LogFilter.Battleground, $"Battleground: CreateNewBattleground - bg template not found for {bgTypeId}");
return null; return null;
} }
if (bgTypeId == BattlegroundTypeId.RB || bgTypeId == BattlegroundTypeId.AA || bgTypeId == BattlegroundTypeId.RandomEpic) if (bgTypeId == BattlegroundTypeId.RB || bgTypeId == BattlegroundTypeId.AA || bgTypeId == BattlegroundTypeId.RandomEpic)
return null; return null;
PvpDifficultyRecord bracketEntry = Global.DB2Mgr.GetBattlegroundBracketById((uint)bg_template.BattlemasterEntry.MapId[0], bracketId);
if (bracketEntry == null)
{
Log.outError(LogFilter.Battleground, $"Battleground: CreateNewBattleground: bg bracket entry not found for map {bg_template.BattlemasterEntry.MapId[0]} bracket id {bracketId}");
return null;
}
Battleground bg = null;
// create a copy of the BG template // create a copy of the BG template
Battleground bg = bg_template.GetCopy(); switch (bgTypeId)
{
case BattlegroundTypeId.AV:
bg = new BgAlteracValley(bg_template);
break;
case BattlegroundTypeId.WS:
bg = new BgWarsongGluch(bg_template);
break;
case BattlegroundTypeId.AB:
case BattlegroundTypeId.DomAb:
bg = new BgArathiBasin(bg_template);
break;
case BattlegroundTypeId.NA:
bg = new BgNagrandArena(bg_template);
break;
case BattlegroundTypeId.BE:
bg = new BgBladesEdgeArena(bg_template);
break;
case BattlegroundTypeId.EY:
bg = new BgEyeofStorm(bg_template);
break;
case BattlegroundTypeId.RL:
bg = new BgRuinsOfLordaernon(bg_template);
break;
case BattlegroundTypeId.SA:
bg = new BgStrandOfAncients(bg_template);
break;
case BattlegroundTypeId.DS:
bg = new BgDalaranSewers(bg_template);
break;
case BattlegroundTypeId.RV:
bg = new BgTheRingOfValor(bg_template);
break;
case BattlegroundTypeId.IC:
bg = new BgIsleofConquest(bg_template);
break;
case BattlegroundTypeId.TP:
bg = new BgTwinPeaks(bg_template);
break;
case BattlegroundTypeId.BFG:
bg = new BgBattleforGilneas(bg_template);
break;
case BattlegroundTypeId.RB:
case BattlegroundTypeId.AA:
case BattlegroundTypeId.RandomEpic:
default:
return null;
}
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((BattlegroundTypeId)queueId.BattlemasterListId, 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) // reset the new bg (set status to status_wait_queue from status_none)
// this shouldn't be needed anymore as a new Battleground instance is created each time. But some bg sub classes still depend on it.
bg.Reset();
bg.SetStatus(BattlegroundStatus.WaitJoin); // start the joining of the bg bg.SetStatus(BattlegroundStatus.WaitJoin); // start the joining of the bg
bg.SetArenaType((ArenaTypes)queueId.TeamSize); bg.SetArenaType((ArenaTypes)queueId.TeamSize);
bg.SetRandomTypeID(bgTypeId);
bg.SetRated(queueId.Rated); bg.SetRated(queueId.Rated);
bg.SetRandom(isRandom);
return bg; return bg;
} }
// used to create the BG templates
bool CreateBattleground(BattlegroundTemplate bgTemplate)
{
Battleground bg = GetBattlegroundTemplate(bgTemplate.Id);
if (!bg)
{
// Create the BG
switch (bgTemplate.Id)
{
//case BattlegroundTypeId.AV:
// bg = new BattlegroundAV(bgTemplate);
//break;
case BattlegroundTypeId.WS:
bg = new BgWarsongGluch(bgTemplate);
break;
case BattlegroundTypeId.AB:
case BattlegroundTypeId.DomAb:
bg = new BgArathiBasin(bgTemplate);
break;
case BattlegroundTypeId.NA:
bg = new NagrandArena(bgTemplate);
break;
case BattlegroundTypeId.BE:
bg = new BladesEdgeArena(bgTemplate);
break;
case BattlegroundTypeId.EY:
bg = new BgEyeofStorm(bgTemplate);
break;
case BattlegroundTypeId.RL:
bg = new RuinsofLordaeronArena(bgTemplate);
break;
case BattlegroundTypeId.SA:
bg = new BgStrandOfAncients(bgTemplate);
break;
case BattlegroundTypeId.DS:
bg = new DalaranSewersArena(bgTemplate);
break;
case BattlegroundTypeId.RV:
bg = new RingofValorArena(bgTemplate);
break;
//case BattlegroundTypeId.IC:
//bg = new BattlegroundIC(bgTemplate);
//break;
case BattlegroundTypeId.AA:
bg = new Battleground(bgTemplate);
break;
case BattlegroundTypeId.RB:
bg = new Battleground(bgTemplate);
bg.SetRandom(true);
break;
/*
case BattlegroundTypeId.TP:
bg = new BattlegroundTP(bgTemplate);
break;
case BattlegroundTypeId.BFG:
bg = new BattlegroundBFG(bgTemplate);
break;
*/
case BattlegroundTypeId.RandomEpic:
bg = new Battleground(bgTemplate);
bg.SetRandom(true);
break;
default:
return false;
}
}
if (!bgDataStore.ContainsKey(bg.GetTypeID()))
bgDataStore[bg.GetTypeID()] = new BattlegroundData();
bgDataStore[bg.GetTypeID()].Template = bg;
return true;
}
public void LoadBattlegroundTemplates() public void LoadBattlegroundTemplates()
{ {
uint oldMSTime = Time.GetMSTime(); uint oldMSTime = Time.GetMSTime();
@@ -375,7 +344,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 && bgTemplate.Id != BattlegroundTypeId.RandomEpic) if (bgTemplate.Id != BattlegroundTypeId.AA && !IsRandomBattleground(bgTemplate.Id))
{ {
uint startId = result.Read<uint>(1); uint startId = result.Read<uint>(1);
WorldSafeLocsEntry start = Global.ObjectMgr.GetWorldSafeLoc(startId); WorldSafeLocsEntry start = Global.ObjectMgr.GetWorldSafeLoc(startId);
@@ -402,12 +371,6 @@ namespace Game.BattleGrounds
} }
} }
if (!CreateBattleground(bgTemplate))
{
Log.outError(LogFilter.Battleground, $"Could not create battleground template class ({bgTemplate.Id})!");
continue;
}
_battlegroundTemplates[bgTypeId] = bgTemplate; _battlegroundTemplates[bgTypeId] = bgTemplate;
if (bgTemplate.BattlemasterEntry.MapId[1] == -1) // in this case we have only one mapId if (bgTemplate.BattlemasterEntry.MapId[1] == -1) // in this case we have only one mapId
@@ -458,6 +421,11 @@ namespace Game.BattleGrounds
|| bgTypeId == BattlegroundTypeId.DS || bgTypeId == BattlegroundTypeId.RV || bgTypeId == BattlegroundTypeId.RL; || bgTypeId == BattlegroundTypeId.DS || bgTypeId == BattlegroundTypeId.RV || bgTypeId == BattlegroundTypeId.RL;
} }
public bool IsRandomBattleground(BattlegroundTypeId battlemasterListId)
{
return battlemasterListId == BattlegroundTypeId.RB || battlemasterListId == BattlegroundTypeId.RandomEpic;
}
public BattlegroundQueueTypeId BGQueueTypeId(ushort battlemasterListId, BattlegroundQueueIdType type, bool rated, ArenaTypes teamSize) public BattlegroundQueueTypeId BGQueueTypeId(ushort battlemasterListId, BattlegroundQueueIdType type, bool rated, ArenaTypes teamSize)
{ {
return new BattlegroundQueueTypeId(battlemasterListId, (byte)type, rated, (byte)teamSize); return new BattlegroundQueueTypeId(battlemasterListId, (byte)type, rated, (byte)teamSize);
@@ -475,23 +443,6 @@ namespace Game.BattleGrounds
Global.WorldMgr.SendWorldText(m_ArenaTesting ? CypherStrings.DebugArenaOn : CypherStrings.DebugArenaOff); Global.WorldMgr.SendWorldText(m_ArenaTesting ? CypherStrings.DebugArenaOn : CypherStrings.DebugArenaOff);
} }
public void ResetHolidays()
{
for (var i = BattlegroundTypeId.AV; i < BattlegroundTypeId.Max; i++)
{
Battleground bg = GetBattlegroundTemplate(i);
if (bg != null)
bg.SetHoliday(false);
}
}
public void SetHolidayActive(uint battlegroundId)
{
Battleground bg = GetBattlegroundTemplate((BattlegroundTypeId)battlegroundId);
if (bg != null)
bg.SetHoliday(true);
}
public bool IsValidQueueId(BattlegroundQueueTypeId bgQueueTypeId) public bool IsValidQueueId(BattlegroundQueueTypeId bgQueueTypeId)
{ {
BattlemasterListRecord battlemasterList = CliDB.BattlemasterListStorage.LookupByKey(bgQueueTypeId.BattlemasterListId); BattlemasterListRecord battlemasterList = CliDB.BattlemasterListStorage.LookupByKey(bgQueueTypeId.BattlemasterListId);
@@ -521,9 +472,9 @@ namespace Game.BattleGrounds
case BattlegroundQueueIdType.ArenaSkirmish: case BattlegroundQueueIdType.ArenaSkirmish:
if (battlemasterList.InstanceType != (int)MapTypes.Arena) if (battlemasterList.InstanceType != (int)MapTypes.Arena)
return false; return false;
if (bgQueueTypeId.Rated) if (!bgQueueTypeId.Rated)
return false; return false;
if (bgQueueTypeId.TeamSize != 0) if (bgQueueTypeId.TeamSize != (int)ArenaTypes.Team3v3)
return false; return false;
break; break;
default: default:
@@ -700,19 +651,19 @@ namespace Game.BattleGrounds
return BattlegroundTypeId.None; return BattlegroundTypeId.None;
} }
public List<Battleground> GetBGFreeSlotQueueStore(BattlegroundQueueTypeId bgTypeId) public List<Battleground> GetBGFreeSlotQueueStore(uint mapId)
{ {
return m_BGFreeSlotQueue[bgTypeId]; return m_BGFreeSlotQueue[mapId];
} }
public void AddToBGFreeSlotQueue(BattlegroundQueueTypeId bgTypeId, Battleground bg) public void AddToBGFreeSlotQueue(Battleground bg)
{ {
m_BGFreeSlotQueue.Add(bgTypeId, bg); m_BGFreeSlotQueue.Add(bg.GetMapId(), bg);
} }
public void RemoveFromBGFreeSlotQueue(BattlegroundQueueTypeId bgTypeId, uint instanceId) public void RemoveFromBGFreeSlotQueue(uint mapId, uint instanceId)
{ {
var queues = m_BGFreeSlotQueue[bgTypeId]; var queues = m_BGFreeSlotQueue[mapId];
foreach (var bg in queues) foreach (var bg in queues)
{ {
if (bg.GetInstanceID() == instanceId) if (bg.GetInstanceID() == instanceId)
@@ -750,7 +701,7 @@ namespace Game.BattleGrounds
return mBattleMastersMap.LookupByKey(entry); return mBattleMastersMap.LookupByKey(entry);
} }
BattlegroundTemplate GetBattlegroundTemplateByTypeId(BattlegroundTypeId id) public BattlegroundTemplate GetBattlegroundTemplateByTypeId(BattlegroundTypeId id)
{ {
return _battlegroundTemplates.LookupByKey(id); return _battlegroundTemplates.LookupByKey(id);
} }
@@ -762,7 +713,7 @@ namespace Game.BattleGrounds
Dictionary<BattlegroundTypeId, BattlegroundData> bgDataStore = new(); Dictionary<BattlegroundTypeId, BattlegroundData> bgDataStore = new();
Dictionary<BattlegroundQueueTypeId, BattlegroundQueue> m_BattlegroundQueues = new(); Dictionary<BattlegroundQueueTypeId, BattlegroundQueue> m_BattlegroundQueues = new();
MultiMap<BattlegroundQueueTypeId, Battleground> m_BGFreeSlotQueue = new(); MultiMap<uint, Battleground> m_BGFreeSlotQueue = new();
Dictionary<uint, BattlegroundTypeId> mBattleMastersMap = new(); Dictionary<uint, BattlegroundTypeId> mBattleMastersMap = new();
Dictionary<BattlegroundTypeId, BattlegroundTemplate> _battlegroundTemplates = new(); Dictionary<BattlegroundTypeId, BattlegroundTemplate> _battlegroundTemplates = new();
Dictionary<uint, BattlegroundTemplate> _battlegroundMapTemplates = new(); Dictionary<uint, BattlegroundTemplate> _battlegroundMapTemplates = new();
+59 -62
View File
@@ -115,10 +115,9 @@ namespace Game.BattleGrounds
//announce to world, this code needs mutex //announce to world, this code needs mutex
if (!m_queueId.Rated && !isPremade && WorldConfig.GetBoolValue(WorldCfg.BattlegroundQueueAnnouncerEnable)) if (!m_queueId.Rated && !isPremade && WorldConfig.GetBoolValue(WorldCfg.BattlegroundQueueAnnouncerEnable))
{ {
Battleground bg = Global.BattlegroundMgr.GetBattlegroundTemplate((BattlegroundTypeId)m_queueId.BattlemasterListId); BattlegroundTemplate bg = Global.BattlegroundMgr.GetBattlegroundTemplateByTypeId((BattlegroundTypeId)m_queueId.BattlemasterListId);
if (bg) if (bg != null)
{ {
string bgName = bg.GetName();
uint MinPlayers = bg.GetMinPlayersPerTeam(); uint MinPlayers = bg.GetMinPlayersPerTeam();
uint qHorde = 0; uint qHorde = 0;
uint qAlliance = 0; uint qAlliance = 0;
@@ -135,18 +134,17 @@ namespace Game.BattleGrounds
// Show queue status to player only (when joining queue) // Show queue status to player only (when joining queue)
if (WorldConfig.GetBoolValue(WorldCfg.BattlegroundQueueAnnouncerPlayeronly)) if (WorldConfig.GetBoolValue(WorldCfg.BattlegroundQueueAnnouncerPlayeronly))
{ {
leader.SendSysMessage(CypherStrings.BgQueueAnnounceSelf, bgName, q_min_level, q_max_level, leader.SendSysMessage(CypherStrings.BgQueueAnnounceSelf, bg.BattlemasterEntry.Name[Global.WorldMgr.GetDefaultDbcLocale()], q_min_level, q_max_level,
qAlliance, (MinPlayers > qAlliance) ? MinPlayers - qAlliance : 0, qHorde, (MinPlayers > qHorde) ? MinPlayers - qHorde : 0); qAlliance, (MinPlayers > qAlliance) ? MinPlayers - qAlliance : 0, qHorde, (MinPlayers > qHorde) ? MinPlayers - qHorde : 0);
} }
// System message // System message
else else
{ {
Global.WorldMgr.SendWorldText(CypherStrings.BgQueueAnnounceWorld, bgName, q_min_level, q_max_level, Global.WorldMgr.SendWorldText(CypherStrings.BgQueueAnnounceWorld, bg.BattlemasterEntry.Name[Global.WorldMgr.GetDefaultDbcLocale()], q_min_level, q_max_level,
qAlliance, (MinPlayers > qAlliance) ? MinPlayers - qAlliance : 0, qHorde, (MinPlayers > qHorde) ? MinPlayers - qHorde : 0); qAlliance, (MinPlayers > qAlliance) ? MinPlayers - qAlliance : 0, qHorde, (MinPlayers > qHorde) ? MinPlayers - qHorde : 0);
} }
} }
} }
//release mutex
} }
return ginfo; return ginfo;
@@ -364,8 +362,8 @@ namespace Game.BattleGrounds
// not yet invited // not yet invited
// set invitation // set invitation
ginfo.IsInvitedToBGInstanceGUID = bg.GetInstanceID(); ginfo.IsInvitedToBGInstanceGUID = bg.GetInstanceID();
BattlegroundTypeId bgTypeId = bg.GetTypeID(); BattlegroundTypeId bgTypeId = (BattlegroundTypeId)m_queueId.BattlemasterListId;
BattlegroundQueueTypeId bgQueueTypeId = bg.GetQueueId(); BattlegroundQueueTypeId bgQueueTypeId = m_queueId;
BattlegroundBracketId bracket_id = bg.GetBracketId(); BattlegroundBracketId bracket_id = bg.GetBracketId();
// set ArenaTeamId for rated matches // set ArenaTeamId for rated matches
@@ -392,7 +390,7 @@ namespace Game.BattleGrounds
player.SetInviteForBattlegroundQueueType(bgQueueTypeId, ginfo.IsInvitedToBGInstanceGUID); player.SetInviteForBattlegroundQueueType(bgQueueTypeId, ginfo.IsInvitedToBGInstanceGUID);
// create remind invite events // create remind invite events
BGQueueInviteEvent inviteEvent = new(player.GetGUID(), ginfo.IsInvitedToBGInstanceGUID, bgTypeId, (ArenaTypes)m_queueId.TeamSize, ginfo.RemoveInviteTime); BGQueueInviteEvent inviteEvent = new(player.GetGUID(), ginfo.IsInvitedToBGInstanceGUID, bgTypeId, ginfo.RemoveInviteTime, m_queueId);
m_events.AddEvent(inviteEvent, m_events.CalculateTime(TimeSpan.FromMilliseconds(BattlegroundConst.InvitationRemindTime))); m_events.AddEvent(inviteEvent, m_events.CalculateTime(TimeSpan.FromMilliseconds(BattlegroundConst.InvitationRemindTime)));
// create automatic remove events // create automatic remove events
BGQueueRemoveEvent removeEvent = new(player.GetGUID(), ginfo.IsInvitedToBGInstanceGUID, bgQueueTypeId, ginfo.RemoveInviteTime); BGQueueRemoveEvent removeEvent = new(player.GetGUID(), ginfo.IsInvitedToBGInstanceGUID, bgQueueTypeId, ginfo.RemoveInviteTime);
@@ -401,10 +399,10 @@ namespace Game.BattleGrounds
uint queueSlot = player.GetBattlegroundQueueIndex(bgQueueTypeId); uint queueSlot = player.GetBattlegroundQueueIndex(bgQueueTypeId);
Log.outDebug(LogFilter.Battleground, "Battleground: invited player {0} ({1}) to BG instance {2} queueindex {3} bgtype {4}", Log.outDebug(LogFilter.Battleground, "Battleground: invited player {0} ({1}) to BG instance {2} queueindex {3} bgtype {4}",
player.GetName(), player.GetGUID().ToString(), bg.GetInstanceID(), queueSlot, bg.GetTypeID()); player.GetName(), player.GetGUID().ToString(), bg.GetInstanceID(), queueSlot, m_queueId.BattlemasterListId);
BattlefieldStatusNeedConfirmation battlefieldStatus; BattlefieldStatusNeedConfirmation battlefieldStatus;
Global.BattlegroundMgr.BuildBattlegroundStatusNeedConfirmation(out battlefieldStatus, bg, player, queueSlot, player.GetBattlegroundQueueJoinTime(bgQueueTypeId), BattlegroundConst.InviteAcceptWaitTime, (ArenaTypes)m_queueId.TeamSize); Global.BattlegroundMgr.BuildBattlegroundStatusNeedConfirmation(out battlefieldStatus, bg, player, queueSlot, player.GetBattlegroundQueueJoinTime(bgQueueTypeId), BattlegroundConst.InviteAcceptWaitTime, bgQueueTypeId);
player.SendPacket(battlefieldStatus); player.SendPacket(battlefieldStatus);
} }
return true; return true;
@@ -589,15 +587,15 @@ namespace Game.BattleGrounds
} }
// this method tries to create Battleground or arena with MinPlayersPerTeam against MinPlayersPerTeam // this method tries to create Battleground or arena with MinPlayersPerTeam against MinPlayersPerTeam
bool CheckNormalMatch(Battleground bg_template, BattlegroundBracketId bracket_id, uint minPlayers, uint maxPlayers) bool CheckNormalMatch(BattlegroundBracketId bracketId, uint minPlayers, uint maxPlayers)
{ {
int[] teamIndex = new int[SharedConst.PvpTeamsCount]; int[] teamIndex = new int[SharedConst.PvpTeamsCount];
for (uint i = 0; i < SharedConst.PvpTeamsCount; i++) for (uint i = 0; i < SharedConst.PvpTeamsCount; i++)
{ {
teamIndex[i] = 0; teamIndex[i] = 0;
for (; teamIndex[i] != m_QueuedGroups[(int)bracket_id][BattlegroundConst.BgQueueNormalAlliance + i].Count; ++teamIndex[i]) for (; teamIndex[i] != m_QueuedGroups[(int)bracketId][BattlegroundConst.BgQueueNormalAlliance + i].Count; ++teamIndex[i])
{ {
var groupQueueInfo = m_QueuedGroups[(int)bracket_id][BattlegroundConst.BgQueueNormalAlliance + i][teamIndex[i]]; var groupQueueInfo = m_QueuedGroups[(int)bracketId][BattlegroundConst.BgQueueNormalAlliance + i][teamIndex[i]];
if (groupQueueInfo.IsInvitedToBGInstanceGUID == 0) if (groupQueueInfo.IsInvitedToBGInstanceGUID == 0)
{ {
m_SelectionPools[i].AddGroup(groupQueueInfo, maxPlayers); m_SelectionPools[i].AddGroup(groupQueueInfo, maxPlayers);
@@ -616,9 +614,9 @@ namespace Game.BattleGrounds
{ {
//we will try to invite more groups to team with less players indexed by j //we will try to invite more groups to team with less players indexed by j
++(teamIndex[j]); //this will not cause a crash, because for cycle above reached break; ++(teamIndex[j]); //this will not cause a crash, because for cycle above reached break;
for (; teamIndex[j] != m_QueuedGroups[(int)bracket_id][BattlegroundConst.BgQueueNormalAlliance + j].Count; ++teamIndex[j]) for (; teamIndex[j] != m_QueuedGroups[(int)bracketId][BattlegroundConst.BgQueueNormalAlliance + j].Count; ++teamIndex[j])
{ {
var groupQueueInfo = m_QueuedGroups[(int)bracket_id][BattlegroundConst.BgQueueNormalAlliance + j][teamIndex[j]]; var groupQueueInfo = m_QueuedGroups[(int)bracketId][BattlegroundConst.BgQueueNormalAlliance + j][teamIndex[j]];
if (groupQueueInfo.IsInvitedToBGInstanceGUID == 0) if (groupQueueInfo.IsInvitedToBGInstanceGUID == 0)
if (!m_SelectionPools[j].AddGroup(groupQueueInfo, m_SelectionPools[(j + 1) % SharedConst.PvpTeamsCount].GetPlayerCount())) if (!m_SelectionPools[j].AddGroup(groupQueueInfo, m_SelectionPools[(j + 1) % SharedConst.PvpTeamsCount].GetPlayerCount()))
break; break;
@@ -725,48 +723,48 @@ 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(m_queueId); BattlegroundTemplate bg_template = Global.BattlegroundMgr.GetBattlegroundTemplateByTypeId((BattlegroundTypeId)m_queueId.BattlemasterListId);
foreach (var bg in bgQueues) if (bg_template == null)
{
// DO NOT allow queue manager to invite new player to rated games
if (!bg.IsRated() && bg.GetBracketId() == bracket_id &&
bg.GetStatus() > BattlegroundStatus.WaitQueue && bg.GetStatus() < BattlegroundStatus.WaitLeave)
{
// clear selection pools
m_SelectionPools[TeamId.Alliance].Init();
m_SelectionPools[TeamId.Horde].Init();
// call a function that does the job for us
FillPlayersToBG(bg, bracket_id);
// now everything is set, invite players
foreach (var queueInfo in m_SelectionPools[TeamId.Alliance].SelectedGroups)
InviteGroupToBG(queueInfo, bg, queueInfo.Team);
foreach (var queueInfo in m_SelectionPools[TeamId.Horde].SelectedGroups)
InviteGroupToBG(queueInfo, bg, queueInfo.Team);
if (!bg.HasFreeSlots())
bg.RemoveFromBGFreeSlotQueue();
}
}
// finished iterating through the bgs with free slots, maybe we need to create a new bg
Battleground bg_template = Global.BattlegroundMgr.GetBattlegroundTemplate((BattlegroundTypeId)m_queueId.BattlemasterListId);
if (!bg_template)
{ {
Log.outError(LogFilter.Battleground, $"Battleground: Update: bg template not found for {m_queueId.BattlemasterListId}"); Log.outError(LogFilter.Battleground, $"Battleground: Update: bg template not found for {m_queueId.BattlemasterListId}");
return; return;
} }
PvpDifficultyRecord bracketEntry = Global.DB2Mgr.GetBattlegroundBracketById(bg_template.GetMapId(), bracket_id); // loop over queues for every map
if (bracketEntry == null) foreach (var mapId in bg_template.BattlemasterEntry.MapId)
{ {
Log.outError(LogFilter.Battleground, "Battleground: Update: bg bracket entry not found for map {0} bracket id {1}", bg_template.GetMapId(), bracket_id); if (mapId == -1)
return; break;
var bgQueues = Global.BattlegroundMgr.GetBGFreeSlotQueueStore((uint)mapId);
foreach (var bg in bgQueues)
{
// DO NOT allow queue manager to invite new player to rated games
if (!bg.IsRated() && bg.GetBracketId() == bracket_id &&
bg.GetStatus() > BattlegroundStatus.WaitQueue && bg.GetStatus() < BattlegroundStatus.WaitLeave)
{
// clear selection pools
m_SelectionPools[TeamId.Alliance].Init();
m_SelectionPools[TeamId.Horde].Init();
// call a function that does the job for us
FillPlayersToBG(bg, bracket_id);
// now everything is set, invite players
foreach (var queueInfo in m_SelectionPools[TeamId.Alliance].SelectedGroups)
InviteGroupToBG(queueInfo, bg, queueInfo.Team);
foreach (var queueInfo in m_SelectionPools[TeamId.Horde].SelectedGroups)
InviteGroupToBG(queueInfo, bg, queueInfo.Team);
if (!bg.HasFreeSlots())
bg.RemoveFromBGFreeSlotQueue();
}
}
} }
// finished iterating through the bgs with free slots, maybe we need to create a new bg
// get the min. players per team, properly for larger arenas as well. (must have full teams for arena matches!) // get the min. players per team, properly for larger arenas as well. (must have full teams for arena matches!)
uint MinPlayersPerTeam = bg_template.GetMinPlayersPerTeam(); uint MinPlayersPerTeam = bg_template.GetMinPlayersPerTeam();
uint MaxPlayersPerTeam = bg_template.GetMaxPlayersPerTeam(); uint MaxPlayersPerTeam = bg_template.GetMaxPlayersPerTeam();
@@ -782,12 +780,12 @@ namespace Game.BattleGrounds
m_SelectionPools[TeamId.Alliance].Init(); m_SelectionPools[TeamId.Alliance].Init();
m_SelectionPools[TeamId.Horde].Init(); m_SelectionPools[TeamId.Horde].Init();
if (bg_template.IsBattleground()) if (!bg_template.IsArena())
{ {
if (CheckPremadeMatch(bracket_id, MinPlayersPerTeam, MaxPlayersPerTeam)) if (CheckPremadeMatch(bracket_id, MinPlayersPerTeam, MaxPlayersPerTeam))
{ {
// create new Battleground // create new Battleground
Battleground bg2 = Global.BattlegroundMgr.CreateNewBattleground(m_queueId, bracketEntry); Battleground bg2 = Global.BattlegroundMgr.CreateNewBattleground(m_queueId, bracket_id);
if (bg2 == null) if (bg2 == null)
{ {
Log.outError(LogFilter.Battleground, $"BattlegroundQueue.Update - Cannot create Battleground: {m_queueId.BattlemasterListId}"); Log.outError(LogFilter.Battleground, $"BattlegroundQueue.Update - Cannot create Battleground: {m_queueId.BattlemasterListId}");
@@ -809,11 +807,11 @@ namespace Game.BattleGrounds
if (!m_queueId.Rated) 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(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(m_queueId, bracketEntry); Battleground bg2 = Global.BattlegroundMgr.CreateNewBattleground(m_queueId, bracket_id);
if (bg2 == null) if (bg2 == null)
{ {
Log.outError(LogFilter.Battleground, $"BattlegroundQueue.Update - Cannot create Battleground: {m_queueId.BattlemasterListId}"); Log.outError(LogFilter.Battleground, $"BattlegroundQueue.Update - Cannot create Battleground: {m_queueId.BattlemasterListId}");
@@ -912,7 +910,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(m_queueId, bracketEntry); Battleground arena = Global.BattlegroundMgr.CreateNewBattleground(m_queueId, bracket_id);
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!");
@@ -1145,13 +1143,13 @@ namespace Game.BattleGrounds
/// </summary> /// </summary>
class BGQueueInviteEvent : BasicEvent class BGQueueInviteEvent : BasicEvent
{ {
public BGQueueInviteEvent(ObjectGuid plGuid, uint bgInstanceGUID, BattlegroundTypeId bgTypeId, ArenaTypes arenaType, uint removeTime) public BGQueueInviteEvent(ObjectGuid plGuid, uint bgInstanceGUID, BattlegroundTypeId bgTypeId, uint removeTime, BattlegroundQueueTypeId queueId)
{ {
m_PlayerGuid = plGuid; m_PlayerGuid = plGuid;
m_BgInstanceGUID = bgInstanceGUID; m_BgInstanceGUID = bgInstanceGUID;
m_BgTypeId = bgTypeId; m_BgTypeId = bgTypeId;
m_ArenaType = arenaType;
m_RemoveTime = removeTime; m_RemoveTime = removeTime;
m_QueueId = queueId;
} }
public override bool Execute(ulong e_time, uint p_time) public override bool Execute(ulong e_time, uint p_time)
@@ -1166,16 +1164,15 @@ namespace Game.BattleGrounds
if (bg == null) if (bg == null)
return true; return true;
BattlegroundQueueTypeId bgQueueTypeId = bg.GetQueueId(); uint queueSlot = player.GetBattlegroundQueueIndex(m_QueueId);
uint queueSlot = player.GetBattlegroundQueueIndex(bgQueueTypeId);
if (queueSlot < SharedConst.PvpTeamsCount) // player is in queue or in Battleground if (queueSlot < SharedConst.PvpTeamsCount) // player is in queue or in Battleground
{ {
// check if player is invited to this bg // check if player is invited to this bg
BattlegroundQueue bgQueue = Global.BattlegroundMgr.GetBattlegroundQueue(bgQueueTypeId); BattlegroundQueue bgQueue = Global.BattlegroundMgr.GetBattlegroundQueue(m_QueueId);
if (bgQueue.IsPlayerInvited(m_PlayerGuid, m_BgInstanceGUID, m_RemoveTime)) if (bgQueue.IsPlayerInvited(m_PlayerGuid, m_BgInstanceGUID, m_RemoveTime))
{ {
BattlefieldStatusNeedConfirmation battlefieldStatus; BattlefieldStatusNeedConfirmation battlefieldStatus;
Global.BattlegroundMgr.BuildBattlegroundStatusNeedConfirmation(out battlefieldStatus, bg, player, queueSlot, player.GetBattlegroundQueueJoinTime(bgQueueTypeId), BattlegroundConst.InviteAcceptWaitTime - BattlegroundConst.InvitationRemindTime, m_ArenaType); Global.BattlegroundMgr.BuildBattlegroundStatusNeedConfirmation(out battlefieldStatus, bg, player, queueSlot, player.GetBattlegroundQueueJoinTime(m_QueueId), BattlegroundConst.InviteAcceptWaitTime - BattlegroundConst.InvitationRemindTime, m_QueueId);
player.SendPacket(battlefieldStatus); player.SendPacket(battlefieldStatus);
} }
} }
@@ -1187,8 +1184,8 @@ namespace Game.BattleGrounds
ObjectGuid m_PlayerGuid; ObjectGuid m_PlayerGuid;
uint m_BgInstanceGUID; uint m_BgInstanceGUID;
BattlegroundTypeId m_BgTypeId; BattlegroundTypeId m_BgTypeId;
ArenaTypes m_ArenaType;
uint m_RemoveTime; uint m_RemoveTime;
BattlegroundQueueTypeId m_QueueId;
} }
/// <summary> /// <summary>
@@ -3,7 +3,8 @@
namespace Game.BattleGrounds.Zones namespace Game.BattleGrounds.Zones
{ {
class AlteracValley class BgAlteracValley : Battleground
{ {
public BgAlteracValley(BattlegroundTemplate battlegroundTemplate) : base(battlegroundTemplate) { }
} }
} }
@@ -208,10 +208,10 @@ namespace Game.BattleGrounds.Zones
TriggerGameEvent(EventStartBattle); TriggerGameEvent(EventStartBattle);
} }
public override void AddPlayer(Player player) public override void AddPlayer(Player player, BattlegroundQueueTypeId queueId)
{ {
bool isInBattleground = IsPlayerInBattleground(player.GetGUID()); bool isInBattleground = IsPlayerInBattleground(player.GetGUID());
base.AddPlayer(player); base.AddPlayer(player, queueId);
if (!isInBattleground) if (!isInBattleground)
PlayerScores[player.GetGUID()] = new BattlegroundABScore(player.GetGUID(), player.GetBGTeam()); PlayerScores[player.GetGUID()] = new BattlegroundABScore(player.GetGUID(), player.GetBGTeam());
} }
@@ -3,7 +3,8 @@
namespace Game.BattleGrounds.Zones namespace Game.BattleGrounds.Zones
{ {
class BattleforGilneas class BgBattleforGilneas : Battleground
{ {
public BgBattleforGilneas(BattlegroundTemplate battlegroundTemplate) : base(battlegroundTemplate) { }
} }
} }
@@ -0,0 +1,10 @@
// Copyright (c) CypherCore <http://github.com/CypherCore> All rights reserved.
// Licensed under the GNU GENERAL PUBLIC LICENSE. See LICENSE file in the project root for full license information.
namespace Game.BattleGrounds.Zones
{
class BgBladesEdgeArena : Battleground
{
public BgBladesEdgeArena(BattlegroundTemplate battlegroundTemplate) : base(battlegroundTemplate) { }
}
}
@@ -0,0 +1,10 @@
// Copyright (c) CypherCore <http://github.com/CypherCore> All rights reserved.
// Licensed under the GNU GENERAL PUBLIC LICENSE. See LICENSE file in the project root for full license information.
namespace Game.BattleGrounds.Zones
{
class BgDalaranSewers : Battleground
{
public BgDalaranSewers(BattlegroundTemplate battlegroundTemplate) : base(battlegroundTemplate) { }
}
}
@@ -3,7 +3,8 @@
namespace Game.BattleGrounds.Zones namespace Game.BattleGrounds.Zones
{ {
class DeepwindGorge class BgDeepwindGorge : Battleground
{ {
public BgDeepwindGorge(BattlegroundTemplate battlegroundTemplate) : base(battlegroundTemplate) { }
} }
} }
+6 -21
View File
@@ -1,25 +1,10 @@
/* // Copyright (c) CypherCore <http://github.com/CypherCore> All rights reserved.
* Copyright (C) 2012-2016 CypherCore <http://github.com/CypherCore> // Licensed under the GNU GENERAL PUBLIC LICENSE. See LICENSE file in the project root for full license information.
*
* This program is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 3 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
using Game.Entities;
using Framework.Constants; using Framework.Constants;
using System.Collections.Generic; using Game.Entities;
using Game.Networking.Packets; using Game.Networking.Packets;
using Game.DataStorage; using System.Collections.Generic;
namespace Game.BattleGrounds.Zones namespace Game.BattleGrounds.Zones
{ {
@@ -367,10 +352,10 @@ namespace Game.BattleGrounds.Zones
} }
} }
public override void AddPlayer(Player player) public override void AddPlayer(Player player, BattlegroundQueueTypeId queueId)
{ {
bool isInBattleground = IsPlayerInBattleground(player.GetGUID()); bool isInBattleground = IsPlayerInBattleground(player.GetGUID());
base.AddPlayer(player); base.AddPlayer(player, queueId);
if (!isInBattleground) if (!isInBattleground)
PlayerScores[player.GetGUID()] = new BgEyeOfStormScore(player.GetGUID(), player.GetBGTeam()); PlayerScores[player.GetGUID()] = new BgEyeOfStormScore(player.GetGUID(), player.GetBGTeam());
@@ -3,8 +3,9 @@
namespace Game.BattleGrounds.Zones namespace Game.BattleGrounds.Zones
{ {
class IsleofConquest class BgIsleofConquest : Battleground
{ {
public BgIsleofConquest(BattlegroundTemplate battlegroundTemplate) : base(battlegroundTemplate) { }
} }
public struct ICCreatures public struct ICCreatures
@@ -0,0 +1,10 @@
// Copyright (c) CypherCore <http://github.com/CypherCore> All rights reserved.
// Licensed under the GNU GENERAL PUBLIC LICENSE. See LICENSE file in the project root for full license information.
namespace Game.BattleGrounds.Zones
{
class BgNagrandArena : Battleground
{
public BgNagrandArena(BattlegroundTemplate battlegroundTemplate) : base(battlegroundTemplate) { }
}
}
@@ -0,0 +1,10 @@
// Copyright (c) CypherCore <http://github.com/CypherCore> All rights reserved.
// Licensed under the GNU GENERAL PUBLIC LICENSE. See LICENSE file in the project root for full license information.
namespace Game.BattleGrounds.Zones
{
class BgRuinsOfLordaernon : Battleground
{
public BgRuinsOfLordaernon(BattlegroundTemplate battlegroundTemplate) : base(battlegroundTemplate) { }
}
}
@@ -3,7 +3,8 @@
namespace Game.BattleGrounds.Zones namespace Game.BattleGrounds.Zones
{ {
class SilvershardMines class BgSilvershardMines : Battleground
{ {
public BgSilvershardMines(BattlegroundTemplate battlegroundTemplate) : base(battlegroundTemplate) { }
} }
} }
@@ -416,10 +416,10 @@ namespace Game.BattleGrounds.Zones
} }
} }
public override void AddPlayer(Player player) public override void AddPlayer(Player player, BattlegroundQueueTypeId queueId)
{ {
bool isInBattleground = IsPlayerInBattleground(player.GetGUID()); bool isInBattleground = IsPlayerInBattleground(player.GetGUID());
base.AddPlayer(player); base.AddPlayer(player, queueId);
if (!isInBattleground) if (!isInBattleground)
PlayerScores[player.GetGUID()] = new BattlegroundSAScore(player.GetGUID(), player.GetBGTeam()); PlayerScores[player.GetGUID()] = new BattlegroundSAScore(player.GetGUID(), player.GetBGTeam());
@@ -3,7 +3,8 @@
namespace Game.BattleGrounds.Zones namespace Game.BattleGrounds.Zones
{ {
class TempleofKotmogu class BgTempleofKotmogu : Battleground
{ {
public BgTempleofKotmogu(BattlegroundTemplate battlegroundTemplate) : base(battlegroundTemplate) { }
} }
} }
@@ -0,0 +1,10 @@
// Copyright (c) CypherCore <http://github.com/CypherCore> All rights reserved.
// Licensed under the GNU GENERAL PUBLIC LICENSE. See LICENSE file in the project root for full license information.
namespace Game.BattleGrounds.Zones
{
class BgTheRingOfValor : Battleground
{
public BgTheRingOfValor(BattlegroundTemplate battlegroundTemplate) : base(battlegroundTemplate) { }
}
}
+2 -1
View File
@@ -3,7 +3,8 @@
namespace Game.BattleGrounds.Zones namespace Game.BattleGrounds.Zones
{ {
class TwinPeaks class BgTwinPeaks : Battleground
{ {
public BgTwinPeaks(BattlegroundTemplate battlegroundTemplate) : base(battlegroundTemplate) { }
} }
} }
@@ -184,10 +184,10 @@ namespace Game.BattleGrounds.Zones
TriggerGameEvent(8563); TriggerGameEvent(8563);
} }
public override void AddPlayer(Player player) public override void AddPlayer(Player player, BattlegroundQueueTypeId queueId)
{ {
bool isInBattleground = IsPlayerInBattleground(player.GetGUID()); bool isInBattleground = IsPlayerInBattleground(player.GetGUID());
base.AddPlayer(player); base.AddPlayer(player, queueId);
if (!isInBattleground) if (!isInBattleground)
PlayerScores[player.GetGUID()] = new BattlegroundWGScore(player.GetGUID(), player.GetBGTeam()); PlayerScores[player.GetGUID()] = new BattlegroundWGScore(player.GetGUID(), player.GetBGTeam());
} }
@@ -320,7 +320,7 @@ namespace Game.BattleGrounds.Zones
UpdateWorldState(WSGWorldStates.FlagStateHorde, 1); UpdateWorldState(WSGWorldStates.FlagStateHorde, 1);
UpdateWorldState(WSGWorldStates.StateTimerActive, 0); UpdateWorldState(WSGWorldStates.StateTimerActive, 0);
RewardHonorToTeam(Honor[(int)m_HonorMode][(int)WSGRewards.Win], winner); RewardHonorToTeam(Honor[Global.BattlegroundMgr.IsBGWeekend(BattlegroundTypeId.WS) ? 1 : 0][(int)WSGRewards.Win], winner);
EndBattleground(winner); EndBattleground(winner);
} }
else else
+1 -1
View File
@@ -52,7 +52,7 @@ namespace Game.Chat
[Command("areatrigger_teleport", RBACPermissions.CommandReloadAreatriggerTeleport, true)] [Command("areatrigger_teleport", RBACPermissions.CommandReloadAreatriggerTeleport, true)]
static bool HandleReloadAreaTriggerTeleportCommand(CommandHandler handler) static bool HandleReloadAreaTriggerTeleportCommand(CommandHandler handler)
{ {
Log.outInfo(LogFilter.Server, "Re-Loading AreaTrigger teleport definitions..."); Log.outInfo(LogFilter.Server, "Re-Loading Area Trigger Teleports definitions...");
Global.ObjectMgr.LoadAreaTriggerTeleports(); Global.ObjectMgr.LoadAreaTriggerTeleports();
handler.SendGlobalGMSysMessage("DB table `areatrigger_teleport` reloaded."); handler.SendGlobalGMSysMessage("DB table `areatrigger_teleport` reloaded.");
return true; return true;
@@ -2317,11 +2317,11 @@ namespace Game.Entities
{ {
case 179785: // Silverwing Flag case 179785: // Silverwing Flag
case 179786: // Warsong Flag case 179786: // Warsong Flag
if (bg.GetTypeID(true) == BattlegroundTypeId.WS) if (bg.GetTypeID() == BattlegroundTypeId.WS)
bg.EventPlayerClickedOnFlag(player, this); bg.EventPlayerClickedOnFlag(player, this);
break; break;
case 184142: // Netherstorm Flag case 184142: // Netherstorm Flag
if (bg.GetTypeID(true) == BattlegroundTypeId.EY) if (bg.GetTypeID() == BattlegroundTypeId.EY)
bg.EventPlayerClickedOnFlag(player, this); bg.EventPlayerClickedOnFlag(player, this);
break; break;
} }
+15 -11
View File
@@ -1606,14 +1606,15 @@ namespace Game.Entities
return; return;
// Expecting only one row // Expecting only one row
// 0 1 2 3 4 5 6 7 8 9 // 0 1 2 3 4 5 6 7 8 9 10
// SELECT instanceId, team, joinX, joinY, joinZ, joinO, joinMapId, taxiStart, taxiEnd, mountSpell FROM character_Battleground_data WHERE guid = ? // SELECT instanceId, team, joinX, joinY, joinZ, joinO, joinMapId, taxiStart, taxiEnd, mountSpell, queueTypeId FROM character_Battleground_data WHERE guid = ?
m_bgData.bgInstanceID = result.Read<uint>(0); m_bgData.bgInstanceID = result.Read<uint>(0);
m_bgData.bgTeam = result.Read<ushort>(1); m_bgData.bgTeam = result.Read<ushort>(1);
m_bgData.joinPos = new WorldLocation(result.Read<ushort>(6), result.Read<float>(2), result.Read<float>(3), result.Read<float>(4), result.Read<float>(5)); m_bgData.joinPos = new WorldLocation(result.Read<ushort>(6), result.Read<float>(2), result.Read<float>(3), result.Read<float>(4), result.Read<float>(5));
m_bgData.taxiPath[0] = result.Read<uint>(7); m_bgData.taxiPath[0] = result.Read<uint>(7);
m_bgData.taxiPath[1] = result.Read<uint>(8); m_bgData.taxiPath[1] = result.Read<uint>(8);
m_bgData.mountSpell = result.Read<uint>(9); m_bgData.mountSpell = result.Read<uint>(9);
m_bgData.queueId = BattlegroundQueueTypeId.FromPacked(result.Read<ulong>(10));
} }
void _LoadPetStable(uint summonedPetNumber, SQLResult result) void _LoadPetStable(uint summonedPetNumber, SQLResult result)
{ {
@@ -2776,6 +2777,7 @@ namespace Game.Entities
stmt.AddValue(8, m_bgData.taxiPath[0]); stmt.AddValue(8, m_bgData.taxiPath[0]);
stmt.AddValue(9, m_bgData.taxiPath[1]); stmt.AddValue(9, m_bgData.taxiPath[1]);
stmt.AddValue(10, m_bgData.mountSpell); stmt.AddValue(10, m_bgData.mountSpell);
stmt.AddValue(11, m_bgData.queueId.GetPacked());
trans.Append(stmt); trans.Append(stmt);
} }
@@ -3031,16 +3033,18 @@ namespace Game.Entities
{ {
map = currentBg.GetBgMap(); map = currentBg.GetBgMap();
BattlegroundQueueTypeId bgQueueTypeId = currentBg.GetQueueId(); BattlegroundPlayer bgPlayer = currentBg.GetBattlegroundPlayerData(GetGUID());
AddBattlegroundQueueId(bgQueueTypeId); if (bgPlayer != null)
{
AddBattlegroundQueueId(bgPlayer.queueTypeId);
m_bgData.bgTypeID = (BattlegroundTypeId)bgPlayer.queueTypeId.BattlemasterListId;
m_bgData.bgTypeID = currentBg.GetTypeID(); //join player to Battlegroundgroup
currentBg.EventPlayerLoggedIn(this);
//join player to Battlegroundgroup SetInviteForBattlegroundQueueType(bgPlayer.queueTypeId, currentBg.GetInstanceID());
currentBg.EventPlayerLoggedIn(this); SetMercenaryForBattlegroundQueueType(bgPlayer.queueTypeId, currentBg.IsPlayerMercenaryInBattleground(GetGUID()));
}
SetInviteForBattlegroundQueueType(bgQueueTypeId, currentBg.GetInstanceID());
SetMercenaryForBattlegroundQueueType(bgQueueTypeId, currentBg.IsPlayerMercenaryInBattleground(GetGUID()));
} }
// Bg was not found - go to Entry Point // Bg was not found - go to Entry Point
else else
@@ -3256,7 +3260,7 @@ namespace Game.Entities
m_InstanceValid = false; m_InstanceValid = false;
if (player_at_bg) if (player_at_bg)
map.ToBattlegroundMap().GetBG().AddPlayer(this); map.ToBattlegroundMap().GetBG().AddPlayer(this, m_bgData.queueId);
// randomize first save time in range [CONFIG_INTERVAL_SAVE] around [CONFIG_INTERVAL_SAVE] // randomize first save time in range [CONFIG_INTERVAL_SAVE] around [CONFIG_INTERVAL_SAVE]
// this must help in case next save after mass player load after server startup // this must help in case next save after mass player load after server startup
+2 -1
View File
@@ -49,7 +49,7 @@ namespace Game.Entities
//PVP //PVP
BgBattlegroundQueueID_Rec[] m_bgBattlegroundQueueID = new BgBattlegroundQueueID_Rec[SharedConst.MaxPlayerBGQueues]; BgBattlegroundQueueID_Rec[] m_bgBattlegroundQueueID = new BgBattlegroundQueueID_Rec[SharedConst.MaxPlayerBGQueues];
BGData m_bgData; public BGData m_bgData;
bool m_IsBGRandomWinner; bool m_IsBGRandomWinner;
public PvPInfo pvpInfo; public PvPInfo pvpInfo;
uint m_ArenaTeamIdInvited; uint m_ArenaTeamIdInvited;
@@ -583,6 +583,7 @@ namespace Game.Entities
public uint[] taxiPath = new uint[2]; public uint[] taxiPath = new uint[2];
public WorldLocation joinPos; //< From where player entered BG public WorldLocation joinPos; //< From where player entered BG
public BattlegroundQueueTypeId queueId;
public void ClearTaxiPath() { taxiPath[0] = taxiPath[1] = 0; } public void ClearTaxiPath() { taxiPath[0] = taxiPath[1] = 0; }
public bool HasTaxiPath() { return taxiPath[0] != 0 && taxiPath[1] != 0; } public bool HasTaxiPath() { return taxiPath[0] != 0 && taxiPath[1] != 0; }
+1 -1
View File
@@ -6174,7 +6174,7 @@ namespace Game.Entities
Battleground bg = GetBattleground(); Battleground bg = GetBattleground();
if (bg != null) if (bg != null)
{ {
if (bg.GetTypeID(true) == BattlegroundTypeId.AV) if (bg.GetTypeID() == BattlegroundTypeId.AV)
bones.loot.FillLoot(1, LootStorage.Creature, this, true); bones.loot.FillLoot(1, LootStorage.Creature, this, true);
} }
// For wintergrasp Quests // For wintergrasp Quests
+6 -5
View File
@@ -418,10 +418,11 @@ namespace Game.Entities
return GetBattlegroundQueueIndex(bgQueueTypeId) < SharedConst.MaxPlayerBGQueues; return GetBattlegroundQueueIndex(bgQueueTypeId) < SharedConst.MaxPlayerBGQueues;
} }
public void SetBattlegroundId(uint val, BattlegroundTypeId bgTypeId) public void SetBattlegroundId(uint val, BattlegroundTypeId bgTypeId, BattlegroundQueueTypeId queueId = default)
{ {
m_bgData.bgInstanceID = val; m_bgData.bgInstanceID = val;
m_bgData.bgTypeID = bgTypeId; m_bgData.bgTypeID = bgTypeId;
m_bgData.queueId = queueId;
} }
public uint AddBattlegroundQueueId(BattlegroundQueueTypeId val) public uint AddBattlegroundQueueId(BattlegroundQueueTypeId val)
@@ -615,12 +616,12 @@ namespace Game.Entities
public bool IsDeserter() { return HasAura(26013); } public bool IsDeserter() { return HasAura(26013); }
public bool CanJoinToBattleground(Battleground bg) public bool CanJoinToBattleground(BattlegroundTemplate bg)
{ {
RBACPermissions perm = RBACPermissions.JoinNormalBg; RBACPermissions perm = RBACPermissions.JoinNormalBg;
if (bg.IsArena()) if (bg.IsArena())
perm = RBACPermissions.JoinArenas; perm = RBACPermissions.JoinArenas;
else if (bg.IsRandom()) else if (Global.BattlegroundMgr.IsRandomBattleground(bg.Id))
perm = RBACPermissions.JoinRandomBg; perm = RBACPermissions.JoinRandomBg;
return GetSession().HasPermission(perm); return GetSession().HasPermission(perm);
@@ -687,8 +688,8 @@ namespace Game.Entities
public bool GetBGAccessByLevel(BattlegroundTypeId bgTypeId) public bool GetBGAccessByLevel(BattlegroundTypeId bgTypeId)
{ {
// get a template bg instead of running one // get a template bg instead of running one
Battleground bg = Global.BattlegroundMgr.GetBattlegroundTemplate(bgTypeId); BattlegroundTemplate bg = Global.BattlegroundMgr.GetBattlegroundTemplateByTypeId(bgTypeId);
if (!bg) if (bg == null)
return false; return false;
// limit check leel to dbc compatible level range // limit check leel to dbc compatible level range
-45
View File
@@ -802,37 +802,6 @@ namespace Game
} }
} }
Log.outInfo(LogFilter.ServerLoading, "Loading Game Event Battleground Holiday Data...");
{
uint oldMSTime = Time.GetMSTime();
// 0 1
SQLResult result = DB.World.Query("SELECT EventEntry, BattlegroundID FROM game_event_battleground_holiday");
if (result.IsEmpty())
Log.outInfo(LogFilter.ServerLoading, "Loaded 0 Battlegroundholidays in game events. DB table `game_event_battleground_holiday` is empty.");
else
{
uint count = 0;
do
{
ushort eventId = result.Read<byte>(0);
if (eventId >= mGameEvent.Length)
{
Log.outError(LogFilter.Sql, "`game_event_battleground_holiday` game event id ({0}) not exist in `game_event`", eventId);
continue;
}
mGameEventBattlegroundHolidays[eventId] = result.Read<uint>(1);
++count;
}
while (result.NextRow());
Log.outInfo(LogFilter.ServerLoading, "Loaded {0} Battlegroundholidays in game events in {1} ms", count, Time.GetMSTimeDiffToNow(oldMSTime));
}
}
Log.outInfo(LogFilter.ServerLoading, "Loading Game Event Pool Data..."); Log.outInfo(LogFilter.ServerLoading, "Loading Game Event Pool Data...");
{ {
uint oldMSTime = Time.GetMSTime(); uint oldMSTime = Time.GetMSTime();
@@ -915,7 +884,6 @@ namespace Game
mGameEventCreatureQuests = new List<Tuple<uint, uint>>[maxEventId]; mGameEventCreatureQuests = new List<Tuple<uint, uint>>[maxEventId];
mGameEventGameObjectQuests = new List<Tuple<uint, uint>>[maxEventId]; mGameEventGameObjectQuests = new List<Tuple<uint, uint>>[maxEventId];
mGameEventVendors = new Dictionary<uint, VendorItem>[maxEventId]; mGameEventVendors = new Dictionary<uint, VendorItem>[maxEventId];
mGameEventBattlegroundHolidays = new uint[maxEventId];
mGameEventNPCFlags = new List<(ulong guid, ulong npcflag)>[maxEventId]; mGameEventNPCFlags = new List<(ulong guid, ulong npcflag)>[maxEventId];
mGameEventModelEquip = new List<Tuple<ulong, ModelEquip>>[maxEventId]; mGameEventModelEquip = new List<Tuple<ulong, ModelEquip>>[maxEventId];
for (var i = 0; i < maxEventId; ++i) for (var i = 0; i < maxEventId; ++i)
@@ -1053,8 +1021,6 @@ namespace Game
UpdateEventNPCFlags(event_id); UpdateEventNPCFlags(event_id);
// remove vendor items // remove vendor items
UpdateEventNPCVendor(event_id, false); UpdateEventNPCVendor(event_id, false);
// update bg holiday
UpdateBattlegroundSettings();
} }
void ApplyNewEvent(ushort event_id) void ApplyNewEvent(ushort event_id)
@@ -1079,8 +1045,6 @@ namespace Game
UpdateEventNPCFlags(event_id); UpdateEventNPCFlags(event_id);
// add vendor items // add vendor items
UpdateEventNPCVendor(event_id, true); UpdateEventNPCVendor(event_id, true);
// update bg holiday
UpdateBattlegroundSettings();
//! Run SAI scripts with SMART_EVENT_GAME_EVENT_START //! Run SAI scripts with SMART_EVENT_GAME_EVENT_START
RunSmartAIScripts(event_id, true); RunSmartAIScripts(event_id, true);
@@ -1126,14 +1090,6 @@ namespace Game
} }
} }
void UpdateBattlegroundSettings()
{
Global.BattlegroundMgr.ResetHolidays();
foreach (ushort activeEventId in m_ActiveEvents)
Global.BattlegroundMgr.SetHolidayActive(mGameEventBattlegroundHolidays[activeEventId]);
}
void UpdateEventNPCVendor(ushort eventId, bool activate) void UpdateEventNPCVendor(ushort eventId, bool activate)
{ {
foreach (var npcEventVendor in mGameEventVendors[eventId]) foreach (var npcEventVendor in mGameEventVendors[eventId])
@@ -1698,7 +1654,6 @@ namespace Game
List<Tuple<ulong, ModelEquip>>[] mGameEventModelEquip; List<Tuple<ulong, ModelEquip>>[] mGameEventModelEquip;
List<uint>[] mGameEventPoolIds; List<uint>[] mGameEventPoolIds;
GameEventData[] mGameEvent; GameEventData[] mGameEvent;
uint[] mGameEventBattlegroundHolidays;
Dictionary<uint, GameEventQuestToEventConditionNum> mQuestToEventConditions = new(); Dictionary<uint, GameEventQuestToEventConditionNum> mQuestToEventConditions = new();
List<(ulong guid, ulong npcflag)>[] mGameEventNPCFlags; List<(ulong guid, ulong npcflag)>[] mGameEventNPCFlags;
List<ushort> m_ActiveEvents = new(); List<ushort> m_ActiveEvents = new();
+6 -6
View File
@@ -1151,14 +1151,14 @@ namespace Game.Groups
} }
} }
public GroupJoinBattlegroundResult CanJoinBattlegroundQueue(Battleground bgOrTemplate, BattlegroundQueueTypeId bgQueueTypeId, uint MinPlayerCount, uint MaxPlayerCount, bool isRated, uint arenaSlot, out ObjectGuid errorGuid) public GroupJoinBattlegroundResult CanJoinBattlegroundQueue(BattlegroundTemplate bgOrTemplate, BattlegroundQueueTypeId bgQueueTypeId, uint MinPlayerCount, uint MaxPlayerCount, bool isRated, uint arenaSlot, out ObjectGuid errorGuid)
{ {
errorGuid = new ObjectGuid(); errorGuid = new ObjectGuid();
// check if this group is LFG group // check if this group is LFG group
if (IsLFGGroup()) if (IsLFGGroup())
return GroupJoinBattlegroundResult.LfgCantUseBattleground; return GroupJoinBattlegroundResult.LfgCantUseBattleground;
BattlemasterListRecord bgEntry = CliDB.BattlemasterListStorage.LookupByKey(bgOrTemplate.GetTypeID()); BattlemasterListRecord bgEntry = CliDB.BattlemasterListStorage.LookupByKey(bgOrTemplate.Id);
if (bgEntry == null) if (bgEntry == null)
return GroupJoinBattlegroundResult.BattlegroundJoinFailed; // shouldn't happen return GroupJoinBattlegroundResult.BattlegroundJoinFailed; // shouldn't happen
@@ -1174,7 +1174,7 @@ namespace Game.Groups
if (!reference) if (!reference)
return GroupJoinBattlegroundResult.BattlegroundJoinFailed; return GroupJoinBattlegroundResult.BattlegroundJoinFailed;
PvpDifficultyRecord bracketEntry = Global.DB2Mgr.GetBattlegroundBracketByLevel(bgOrTemplate.GetMapId(), reference.GetLevel()); PvpDifficultyRecord bracketEntry = Global.DB2Mgr.GetBattlegroundBracketByLevel((uint)bgOrTemplate.BattlemasterEntry.MapId[0], reference.GetLevel());
if (bracketEntry == null) if (bracketEntry == null)
return GroupJoinBattlegroundResult.BattlegroundJoinFailed; return GroupJoinBattlegroundResult.BattlegroundJoinFailed;
@@ -1212,13 +1212,13 @@ namespace Game.Groups
// 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
bool isInRandomBgQueue = member.InBattlegroundQueueForBattlegroundQueueType(Global.BattlegroundMgr.BGQueueTypeId((ushort)BattlegroundTypeId.RB, BattlegroundQueueIdType.Battleground, false, 0)) 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)); || member.InBattlegroundQueueForBattlegroundQueueType(Global.BattlegroundMgr.BGQueueTypeId((ushort)BattlegroundTypeId.RandomEpic, BattlegroundQueueIdType.Battleground, false, 0));
if (bgOrTemplate.GetTypeID() != BattlegroundTypeId.AA && isInRandomBgQueue) if (bgOrTemplate.Id != BattlegroundTypeId.AA && 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 || bgOrTemplate.GetTypeID() == BattlegroundTypeId.RandomEpic) && member.InBattlegroundQueue(true) && !isInRandomBgQueue) if (Global.BattlegroundMgr.IsRandomBattleground(bgOrTemplate.Id) && member.InBattlegroundQueue(true) && !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.IsDeserter()) if (bgOrTemplate.Id != BattlegroundTypeId.AA && member.IsDeserter())
return GroupJoinBattlegroundResult.Deserters; return GroupJoinBattlegroundResult.Deserters;
// check if member can join any more Battleground queues // check if member can join any more Battleground queues
if (!member.HasFreeBattlegroundQueueId()) if (!member.HasFreeBattlegroundQueueId())
+51 -50
View File
@@ -75,12 +75,12 @@ namespace Game
return; return;
// get bg instance or bg template if instance not found // get bg instance or bg template if instance not found
Battleground bg = Global.BattlegroundMgr.GetBattlegroundTemplate(bgTypeId); BattlegroundTemplate bgTemplate = Global.BattlegroundMgr.GetBattlegroundTemplateByTypeId(bgTypeId);
if (!bg) if (bgTemplate == null)
return; return;
// expected bracket entry // expected bracket entry
PvpDifficultyRecord bracketEntry = Global.DB2Mgr.GetBattlegroundBracketByLevel(bg.GetMapId(), GetPlayer().GetLevel()); PvpDifficultyRecord bracketEntry = Global.DB2Mgr.GetBattlegroundBracketByLevel((uint)bgTemplate.BattlemasterEntry.MapId[0], GetPlayer().GetLevel());
if (bracketEntry == null) if (bracketEntry == null)
return; return;
@@ -91,7 +91,7 @@ namespace Game
Team getQueueTeam() Team getQueueTeam()
{ {
// mercenary applies only to unrated battlegrounds // mercenary applies only to unrated battlegrounds
if (!bg.IsRated() && !bg.IsArena()) if (!bgQueueTypeId.Rated && !bgTemplate.IsArena())
{ {
if (_player.HasAura(BattlegroundConst.SpellMercenaryContractHorde)) if (_player.HasAura(BattlegroundConst.SpellMercenaryContractHorde))
return Team.Horde; return Team.Horde;
@@ -115,7 +115,7 @@ namespace Game
} }
// check RBAC permissions // check RBAC permissions
if (!GetPlayer().CanJoinToBattleground(bg)) if (!GetPlayer().CanJoinToBattleground(bgTemplate))
{ {
Global.BattlegroundMgr.BuildBattlegroundStatusFailed(out battlefieldStatusFailed, bgQueueTypeId, GetPlayer(), 0, GroupJoinBattlegroundResult.JoinTimedOut); Global.BattlegroundMgr.BuildBattlegroundStatusFailed(out battlefieldStatusFailed, bgQueueTypeId, GetPlayer(), 0, GroupJoinBattlegroundResult.JoinTimedOut);
SendPacket(battlefieldStatusFailed); SendPacket(battlefieldStatusFailed);
@@ -132,7 +132,7 @@ namespace Game
bool isInRandomBgQueue = _player.InBattlegroundQueueForBattlegroundQueueType(Global.BattlegroundMgr.BGQueueTypeId((ushort)BattlegroundTypeId.RB, BattlegroundQueueIdType.Battleground, false, 0)) 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)); || _player.InBattlegroundQueueForBattlegroundQueueType(Global.BattlegroundMgr.BGQueueTypeId((ushort)BattlegroundTypeId.RandomEpic, BattlegroundQueueIdType.Battleground, false, 0));
if (bgTypeId != BattlegroundTypeId.RB && bgTypeId != BattlegroundTypeId.RandomEpic && isInRandomBgQueue) if (!Global.BattlegroundMgr.IsRandomBattleground(bgTypeId) && isInRandomBgQueue)
{ {
// player is already in random queue // player is already in random queue
Global.BattlegroundMgr.BuildBattlegroundStatusFailed(out battlefieldStatusFailed, bgQueueTypeId, GetPlayer(), 0, GroupJoinBattlegroundResult.InRandomBg); Global.BattlegroundMgr.BuildBattlegroundStatusFailed(out battlefieldStatusFailed, bgQueueTypeId, GetPlayer(), 0, GroupJoinBattlegroundResult.InRandomBg);
@@ -140,7 +140,7 @@ namespace Game
return; return;
} }
if (_player.InBattlegroundQueue(true) && !isInRandomBgQueue && (bgTypeId == BattlegroundTypeId.RB || bgTypeId == BattlegroundTypeId.RandomEpic)) if (_player.InBattlegroundQueue(true) && !isInRandomBgQueue && Global.BattlegroundMgr.IsRandomBattleground(bgTypeId))
{ {
// 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, bgQueueTypeId, GetPlayer(), 0, GroupJoinBattlegroundResult.InNonRandomBg); Global.BattlegroundMgr.BuildBattlegroundStatusFailed(out battlefieldStatusFailed, bgQueueTypeId, GetPlayer(), 0, GroupJoinBattlegroundResult.InNonRandomBg);
@@ -170,7 +170,7 @@ 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);
Global.BattlegroundMgr.BuildBattlegroundStatusQueued(out BattlefieldStatusQueued battlefieldStatusQueued, bg, GetPlayer(), queueSlot, ginfo.JoinTime, bgQueueTypeId, avgTime, 0, false); Global.BattlegroundMgr.BuildBattlegroundStatusQueued(out BattlefieldStatusQueued battlefieldStatusQueued, GetPlayer(), queueSlot, ginfo.JoinTime, bgQueueTypeId, avgTime, false);
SendPacket(battlefieldStatusQueued); SendPacket(battlefieldStatusQueued);
Log.outDebug(LogFilter.Battleground, $"Battleground: player joined queue for bg queue {bgQueueTypeId}, {_player.GetGUID()}, NAME {_player.GetName()}"); Log.outDebug(LogFilter.Battleground, $"Battleground: player joined queue for bg queue {bgQueueTypeId}, {_player.GetGUID()}, NAME {_player.GetName()}");
@@ -181,8 +181,8 @@ namespace Game
return; return;
ObjectGuid errorGuid; ObjectGuid errorGuid;
err = grp.CanJoinBattlegroundQueue(bg, bgQueueTypeId, 0, bg.GetMaxPlayersPerTeam(), false, 0, out errorGuid); err = grp.CanJoinBattlegroundQueue(bgTemplate, bgQueueTypeId, 0, bgTemplate.GetMaxPlayersPerTeam(), false, 0, out errorGuid);
isPremade = (grp.GetMembersCount() >= bg.GetMinPlayersPerTeam()); isPremade = (grp.GetMembersCount() >= bgTemplate.GetMinPlayersPerTeam());
BattlegroundQueue bgQueue = Global.BattlegroundMgr.GetBattlegroundQueue(bgQueueTypeId); BattlegroundQueue bgQueue = Global.BattlegroundMgr.GetBattlegroundQueue(bgQueueTypeId);
GroupQueueInfo ginfo = null; GroupQueueInfo ginfo = null;
@@ -212,7 +212,7 @@ namespace Game
// add to queue // add to queue
uint queueSlot = member.AddBattlegroundQueueId(bgQueueTypeId); uint queueSlot = member.AddBattlegroundQueueId(bgQueueTypeId);
Global.BattlegroundMgr.BuildBattlegroundStatusQueued(out BattlefieldStatusQueued battlefieldStatusQueued, bg, member, queueSlot, ginfo.JoinTime, bgQueueTypeId, avgTime, 0, true); Global.BattlegroundMgr.BuildBattlegroundStatusQueued(out BattlefieldStatusQueued battlefieldStatusQueued, member, queueSlot, ginfo.JoinTime, bgQueueTypeId, avgTime, true);
member.SendPacket(battlefieldStatusQueued); member.SendPacket(battlefieldStatusQueued);
Log.outDebug(LogFilter.Battleground, $"Battleground: player joined queue for bg queue {bgQueueTypeId}, {member.GetGUID()}, NAME {member.GetName()}"); Log.outDebug(LogFilter.Battleground, $"Battleground: player joined queue for bg queue {bgQueueTypeId}, {member.GetGUID()}, NAME {member.GetName()}");
} }
@@ -288,31 +288,29 @@ namespace Game
} }
BattlegroundTypeId bgTypeId = (BattlegroundTypeId)bgQueueTypeId.BattlemasterListId; BattlegroundTypeId bgTypeId = (BattlegroundTypeId)bgQueueTypeId.BattlemasterListId;
BattlegroundTemplate bgTemplate = Global.BattlegroundMgr.GetBattlegroundTemplateByTypeId(bgTypeId);
if (bgTemplate == null)
{
Log.outError(LogFilter.Network, $"BattlegroundHandle: BattlegroundTemplate not found for type id {bgTypeId}.");
return;
}
uint mapId = (uint)bgTemplate.BattlemasterEntry.MapId[0];
// 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);
if (!bg) if (bg == null && battlefieldPort.AcceptedInvite)
{ {
if (battlefieldPort.AcceptedInvite) Log.outDebug(LogFilter.Battleground, "CMSG_BATTLEFIELD_PORT {0} Slot: {1}, Unk: {2}, Time: {3}, AcceptedInvite: {4}. Cant find BG with id {5}!",
{ GetPlayerInfo(), battlefieldPort.Ticket.Id, battlefieldPort.Ticket.Type, battlefieldPort.Ticket.Time, battlefieldPort.AcceptedInvite, ginfo.IsInvitedToBGInstanceGUID);
Log.outDebug(LogFilter.Battleground, "CMSG_BATTLEFIELD_PORT {0} Slot: {1}, Unk: {2}, Time: {3}, AcceptedInvite: {4}. Cant find BG with id {5}!", return;
GetPlayerInfo(), battlefieldPort.Ticket.Id, battlefieldPort.Ticket.Type, battlefieldPort.Ticket.Time, battlefieldPort.AcceptedInvite, ginfo.IsInvitedToBGInstanceGUID);
return;
}
bg = Global.BattlegroundMgr.GetBattlegroundTemplate(bgTypeId);
if (!bg)
{
Log.outError(LogFilter.Network, "BattlegroundHandler: bg_template not found for type id {0}.", bgTypeId);
return;
}
} }
else if (bg != null)
// get real bg type mapId = bg.GetMapId();
bgTypeId = bg.GetTypeID();
// expected bracket entry // expected bracket entry
PvpDifficultyRecord bracketEntry = Global.DB2Mgr.GetBattlegroundBracketByLevel(bg.GetMapId(), GetPlayer().GetLevel()); PvpDifficultyRecord bracketEntry = Global.DB2Mgr.GetBattlegroundBracketByLevel(mapId, GetPlayer().GetLevel());
if (bracketEntry == null) if (bracketEntry == null)
return; return;
@@ -360,7 +358,7 @@ namespace Game
GetPlayer().FinishTaxiFlight(); GetPlayer().FinishTaxiFlight();
BattlefieldStatusActive battlefieldStatus; BattlefieldStatusActive battlefieldStatus;
Global.BattlegroundMgr.BuildBattlegroundStatusActive(out battlefieldStatus, bg, GetPlayer(), battlefieldPort.Ticket.Id, GetPlayer().GetBattlegroundQueueJoinTime(bgQueueTypeId), bg.GetArenaType()); Global.BattlegroundMgr.BuildBattlegroundStatusActive(out battlefieldStatus, bg, GetPlayer(), battlefieldPort.Ticket.Id, GetPlayer().GetBattlegroundQueueJoinTime(bgQueueTypeId), bgQueueTypeId);
SendPacket(battlefieldStatus); SendPacket(battlefieldStatus);
// remove BattlegroundQueue status from BGmgr // remove BattlegroundQueue status from BGmgr
@@ -372,7 +370,7 @@ namespace Game
currentBg.RemovePlayerAtLeave(GetPlayer().GetGUID(), false, true); currentBg.RemovePlayerAtLeave(GetPlayer().GetGUID(), false, true);
// set the destination instance id // set the destination instance id
GetPlayer().SetBattlegroundId(bg.GetInstanceID(), bgTypeId); GetPlayer().SetBattlegroundId(bg.GetInstanceID(), bg.GetTypeID(), bgQueueTypeId);
// set the destination team // set the destination team
GetPlayer().SetBGTeam(ginfo.Team); GetPlayer().SetBGTeam(ginfo.Team);
@@ -433,15 +431,18 @@ namespace Game
continue; continue;
BattlegroundTypeId bgTypeId = (BattlegroundTypeId)bgQueueTypeId.BattlemasterListId; BattlegroundTypeId bgTypeId = (BattlegroundTypeId)bgQueueTypeId.BattlemasterListId;
ArenaTypes arenaType = (ArenaTypes)bgQueueTypeId.TeamSize;
bg = _player.GetBattleground(); bg = _player.GetBattleground();
if (bg && bg.GetQueueId() == bgQueueTypeId) if (bg != null)
{ {
//i cannot check any variable from player class because player class doesn't know if player is in 2v2 / 3v3 or 5v5 arena BattlegroundPlayer bgPlayer = bg.GetBattlegroundPlayerData(_player.GetGUID());
//so i must use bg pointer to get that information if (bgPlayer != null && bgPlayer.queueTypeId == bgQueueTypeId)
Global.BattlegroundMgr.BuildBattlegroundStatusActive(out BattlefieldStatusActive battlefieldStatus, bg, _player, i, _player.GetBattlegroundQueueJoinTime(bgQueueTypeId), arenaType); {
SendPacket(battlefieldStatus); //i cannot check any variable from player class because player class doesn't know if player is in 2v2 / 3v3 or 5v5 arena
continue; //so i must use bg pointer to get that information
Global.BattlegroundMgr.BuildBattlegroundStatusActive(out BattlefieldStatusActive battlefieldStatus, bg, _player, i, _player.GetBattlegroundQueueJoinTime(bgQueueTypeId), bgQueueTypeId);
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!
@@ -458,23 +459,23 @@ namespace Game
continue; continue;
BattlefieldStatusNeedConfirmation battlefieldStatus; BattlefieldStatusNeedConfirmation battlefieldStatus;
Global.BattlegroundMgr.BuildBattlegroundStatusNeedConfirmation(out battlefieldStatus, bg, GetPlayer(), i, GetPlayer().GetBattlegroundQueueJoinTime(bgQueueTypeId), Time.GetMSTimeDiff(Time.GetMSTime(), ginfo.RemoveInviteTime), arenaType); Global.BattlegroundMgr.BuildBattlegroundStatusNeedConfirmation(out battlefieldStatus, bg, GetPlayer(), i, GetPlayer().GetBattlegroundQueueJoinTime(bgQueueTypeId), Time.GetMSTimeDiff(Time.GetMSTime(), ginfo.RemoveInviteTime), bgQueueTypeId);
SendPacket(battlefieldStatus); SendPacket(battlefieldStatus);
} }
else else
{ {
bg = Global.BattlegroundMgr.GetBattlegroundTemplate(bgTypeId); BattlegroundTemplate bgTemplate = Global.BattlegroundMgr.GetBattlegroundTemplateByTypeId(bgTypeId);
if (!bg) if (bgTemplate == null)
continue; continue;
// expected bracket entry // expected bracket entry
PvpDifficultyRecord bracketEntry = Global.DB2Mgr.GetBattlegroundBracketByLevel(bg.GetMapId(), GetPlayer().GetLevel()); PvpDifficultyRecord bracketEntry = Global.DB2Mgr.GetBattlegroundBracketByLevel((uint)bgTemplate.BattlemasterEntry.MapId[0], _player.GetLevel());
if (bracketEntry == null) if (bracketEntry == null)
continue; continue;
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), bgQueueTypeId, avgTime, arenaType, ginfo.Players.Count > 1); Global.BattlegroundMgr.BuildBattlegroundStatusQueued(out battlefieldStatus, _player, i, _player.GetBattlegroundQueueJoinTime(bgQueueTypeId), bgQueueTypeId, avgTime, ginfo.Players.Count > 1);
SendPacket(battlefieldStatus); SendPacket(battlefieldStatus);
} }
} }
@@ -490,8 +491,8 @@ namespace Game
ArenaTypes arenatype = (ArenaTypes)ArenaTeam.GetTypeBySlot(packet.TeamSizeIndex); ArenaTypes arenatype = (ArenaTypes)ArenaTeam.GetTypeBySlot(packet.TeamSizeIndex);
//check existence //check existence
Battleground bg = Global.BattlegroundMgr.GetBattlegroundTemplate(BattlegroundTypeId.AA); BattlegroundTemplate bgTemplate = Global.BattlegroundMgr.GetBattlegroundTemplateByTypeId(BattlegroundTypeId.AA);
if (!bg) if (bgTemplate == null)
{ {
Log.outError(LogFilter.Network, "Battleground: template bg (all arenas) not found"); Log.outError(LogFilter.Network, "Battleground: template bg (all arenas) not found");
return; return;
@@ -503,9 +504,9 @@ namespace Game
return; return;
} }
BattlegroundTypeId bgTypeId = bg.GetTypeID(); BattlegroundTypeId bgTypeId = bgTemplate.Id;
BattlegroundQueueTypeId bgQueueTypeId = Global.BattlegroundMgr.BGQueueTypeId((ushort)bgTypeId, BattlegroundQueueIdType.Arena, true, 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((uint)bgTemplate.BattlemasterEntry.MapId[0], _player.GetLevel());
if (bracketEntry == null) if (bracketEntry == null)
return; return;
@@ -536,7 +537,7 @@ namespace Game
GroupQueueInfo ginfo = null; GroupQueueInfo ginfo = null;
ObjectGuid errorGuid; ObjectGuid errorGuid;
var err = grp.CanJoinBattlegroundQueue(bg, bgQueueTypeId, (uint)arenatype, (uint)arenatype, true, packet.TeamSizeIndex, out errorGuid); var err = grp.CanJoinBattlegroundQueue(bgTemplate, bgQueueTypeId, (uint)arenatype, (uint)arenatype, true, packet.TeamSizeIndex, out errorGuid);
if (err == 0) if (err == 0)
{ {
Log.outDebug(LogFilter.Battleground, "Battleground: arena team id {0}, leader {1} queued with matchmaker rating {2} for type {3}", GetPlayer().GetArenaTeamId(packet.TeamSizeIndex), GetPlayer().GetName(), matchmakerRating, arenatype); Log.outDebug(LogFilter.Battleground, "Battleground: arena team id {0}, leader {1} queued with matchmaker rating {2} for type {3}", GetPlayer().GetArenaTeamId(packet.TeamSizeIndex), GetPlayer().GetName(), matchmakerRating, arenatype);
@@ -559,7 +560,7 @@ namespace Game
continue; continue;
} }
if (!GetPlayer().CanJoinToBattleground(bg)) if (!GetPlayer().CanJoinToBattleground(bgTemplate))
{ {
BattlefieldStatusFailed battlefieldStatus; BattlefieldStatusFailed battlefieldStatus;
Global.BattlegroundMgr.BuildBattlegroundStatusFailed(out battlefieldStatus, bgQueueTypeId, GetPlayer(), 0, GroupJoinBattlegroundResult.BattlegroundJoinFailed, errorGuid); Global.BattlegroundMgr.BuildBattlegroundStatusFailed(out battlefieldStatus, bgQueueTypeId, GetPlayer(), 0, GroupJoinBattlegroundResult.BattlegroundJoinFailed, errorGuid);
@@ -570,7 +571,7 @@ namespace Game
// add to queue // add to queue
uint queueSlot = member.AddBattlegroundQueueId(bgQueueTypeId); uint queueSlot = member.AddBattlegroundQueueId(bgQueueTypeId);
Global.BattlegroundMgr.BuildBattlegroundStatusQueued(out BattlefieldStatusQueued battlefieldStatusQueued, bg, member, queueSlot, ginfo.JoinTime, bgQueueTypeId, avgTime, arenatype, true); Global.BattlegroundMgr.BuildBattlegroundStatusQueued(out BattlefieldStatusQueued battlefieldStatusQueued, member, queueSlot, ginfo.JoinTime, bgQueueTypeId, avgTime, true);
member.SendPacket(battlefieldStatusQueued); member.SendPacket(battlefieldStatusQueued);
Log.outDebug(LogFilter.Battleground, $"Battleground: player joined queue for arena as group bg queue {bgQueueTypeId}, {member.GetGUID()}, NAME {member.GetName()}"); Log.outDebug(LogFilter.Battleground, $"Battleground: player joined queue for arena as group bg queue {bgQueueTypeId}, {member.GetGUID()}, NAME {member.GetName()}");
+1 -1
View File
@@ -314,7 +314,7 @@ namespace Game
if (bg) if (bg)
{ {
if (player.IsInvitedForBattlegroundInstance(player.GetBattlegroundId())) if (player.IsInvitedForBattlegroundInstance(player.GetBattlegroundId()))
bg.AddPlayer(player); bg.AddPlayer(player, player.m_bgData.queueId);
} }
} }
} }
+1 -1
View File
@@ -1246,7 +1246,7 @@ namespace Game.Spells
Battleground bg = player.GetBattleground(); Battleground bg = player.GetBattleground();
if (bg) if (bg)
{ {
if (bg.GetTypeID(true) == BattlegroundTypeId.EY) if (bg.GetTypeID() == BattlegroundTypeId.EY)
bg.EventPlayerClickedOnFlag(player, gameObjTarget); bg.EventPlayerClickedOnFlag(player, gameObjTarget);
return; return;
} }
+1 -1
View File
@@ -725,7 +725,7 @@ namespace Game
Log.outInfo(LogFilter.ServerLoading, "Loading World locations..."); Log.outInfo(LogFilter.ServerLoading, "Loading World locations...");
Global.ObjectMgr.LoadWorldSafeLocs(); // must be before LoadAreaTriggerTeleports and LoadGraveyardZones Global.ObjectMgr.LoadWorldSafeLocs(); // must be before LoadAreaTriggerTeleports and LoadGraveyardZones
Log.outInfo(LogFilter.ServerLoading, "Loading AreaTrigger definitions..."); Log.outInfo(LogFilter.ServerLoading, "Loading Area Trigger Teleports definitions...");
Global.ObjectMgr.LoadAreaTriggerTeleports(); Global.ObjectMgr.LoadAreaTriggerTeleports();
Log.outInfo(LogFilter.ServerLoading, "Loading Access Requirements..."); Log.outInfo(LogFilter.ServerLoading, "Loading Access Requirements...");