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:
@@ -24,12 +24,9 @@ namespace Game.BattleGrounds
|
||||
public Battleground(BattlegroundTemplate battlegroundTemplate)
|
||||
{
|
||||
_battlegroundTemplate = battlegroundTemplate;
|
||||
m_RandomTypeID = BattlegroundTypeId.None;
|
||||
m_Status = BattlegroundStatus.None;
|
||||
_winnerTeamId = PvPTeamId.Neutral;
|
||||
|
||||
m_HonorMode = BGHonorMode.Normal;
|
||||
|
||||
StartDelayTimes[BattlegroundConst.EventIdFirst] = BattlegroundStartTimeIntervals.Delay2m;
|
||||
StartDelayTimes[BattlegroundConst.EventIdSecond] = BattlegroundStartTimeIntervals.Delay1m;
|
||||
StartDelayTimes[BattlegroundConst.EventIdThird] = BattlegroundStartTimeIntervals.Delay30s;
|
||||
@@ -632,7 +629,7 @@ namespace Game.BattleGrounds
|
||||
stmt.AddValue(0, battlegroundId);
|
||||
stmt.AddValue(1, (byte)GetWinner());
|
||||
stmt.AddValue(2, GetUniqueBracketId());
|
||||
stmt.AddValue(3, (byte)GetTypeID(true));
|
||||
stmt.AddValue(3, (uint)GetTypeID());
|
||||
DB.Characters.Execute(stmt);
|
||||
}
|
||||
|
||||
@@ -702,18 +699,23 @@ namespace Game.BattleGrounds
|
||||
// Reward winner team
|
||||
if (team == winner)
|
||||
{
|
||||
if (IsRandom() || Global.BattlegroundMgr.IsBGWeekend(GetTypeID()))
|
||||
BattlegroundPlayer bgPlayer = GetBattlegroundPlayerData(player.GetGUID());
|
||||
if (bgPlayer != null)
|
||||
{
|
||||
UpdatePlayerScore(player, ScoreType.BonusHonor, GetBonusHonorFromKill(winnerKills));
|
||||
if (!player.GetRandomWinner())
|
||||
if (Global.BattlegroundMgr.IsRandomBattleground((BattlegroundTypeId)bgPlayer.queueTypeId.BattlemasterListId)
|
||||
|| Global.BattlegroundMgr.IsBGWeekend((BattlegroundTypeId)bgPlayer.queueTypeId.BattlemasterListId))
|
||||
{
|
||||
player.SetRandomWinner(true);
|
||||
// TODO: win honor xp
|
||||
UpdatePlayerScore(player, ScoreType.BonusHonor, GetBonusHonorFromKill(winnerKills));
|
||||
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());
|
||||
@@ -731,8 +733,13 @@ namespace Game.BattleGrounds
|
||||
}
|
||||
else
|
||||
{
|
||||
if (IsRandom() || Global.BattlegroundMgr.IsBGWeekend(GetTypeID()))
|
||||
UpdatePlayerScore(player, ScoreType.BonusHonor, GetBonusHonorFromKill(loserKills));
|
||||
BattlegroundPlayer bgPlayer = GetBattlegroundPlayerData(player.GetGUID());
|
||||
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();
|
||||
@@ -770,8 +777,10 @@ namespace Game.BattleGrounds
|
||||
bool participant = false;
|
||||
// Remove from lists/maps
|
||||
var bgPlayer = m_Players.LookupByKey(guid);
|
||||
BattlegroundQueueTypeId? bgQueueTypeId = null;
|
||||
if (bgPlayer != null)
|
||||
{
|
||||
bgQueueTypeId = bgPlayer.queueTypeId;
|
||||
UpdatePlayersCountByTeam(team, true); // -1 player
|
||||
m_Players.Remove(guid);
|
||||
// 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
|
||||
|
||||
BattlegroundQueueTypeId bgQueueTypeId = GetQueueId();
|
||||
|
||||
if (participant) // if the player was a match participant, remove auras, calc rating, update queue
|
||||
{
|
||||
if (player)
|
||||
@@ -826,15 +833,16 @@ namespace Game.BattleGrounds
|
||||
player.RemovePet(null, PetSaveMode.NotInSlot);
|
||||
player.ResummonPetTemporaryUnSummonedIfAny();
|
||||
}
|
||||
if (SendPacket)
|
||||
if (SendPacket && bgQueueTypeId.HasValue)
|
||||
{
|
||||
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);
|
||||
}
|
||||
|
||||
// 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
|
||||
@@ -846,11 +854,11 @@ namespace Game.BattleGrounds
|
||||
}
|
||||
DecreaseInvitedCount(team);
|
||||
//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
|
||||
AddToBGFreeSlotQueue();
|
||||
Global.BattlegroundMgr.ScheduleQueueUpdate(0, bgQueueTypeId, GetBracketId());
|
||||
Global.BattlegroundMgr.ScheduleQueueUpdate(0, bgQueueTypeId.Value, GetBracketId());
|
||||
}
|
||||
// Let others know
|
||||
BattlegroundPlayerLeft playerLeft = new();
|
||||
@@ -922,7 +930,7 @@ namespace Game.BattleGrounds
|
||||
player.TeleportTo(loc.Loc);
|
||||
}
|
||||
|
||||
public virtual void AddPlayer(Player player)
|
||||
public virtual void AddPlayer(Player player, BattlegroundQueueTypeId queueId)
|
||||
{
|
||||
// remove afk from player
|
||||
if (player.IsAFK())
|
||||
@@ -936,7 +944,8 @@ namespace Game.BattleGrounds
|
||||
BattlegroundPlayer bp = new();
|
||||
bp.OfflineRemoveTime = 0;
|
||||
bp.Team = team;
|
||||
bp.Mercenary = player.IsMercenaryForBattlegroundQueueType(GetQueueId());
|
||||
bp.Mercenary = player.IsMercenaryForBattlegroundQueueType(queueId);
|
||||
bp.queueTypeId = queueId;
|
||||
|
||||
bool isInBattleground = IsPlayerInBattleground(player.GetGUID());
|
||||
// Add to list/maps
|
||||
@@ -975,8 +984,9 @@ namespace Game.BattleGrounds
|
||||
pvpMatchInitialize.Duration = (int)(GetElapsedTime() - (int)BattlegroundStartTimeIntervals.Delay2m) / Time.InMilliseconds;
|
||||
pvpMatchInitialize.StartTime = GameTime.GetGameTime() - pvpMatchInitialize.Duration;
|
||||
}
|
||||
|
||||
pvpMatchInitialize.ArenaFaction = (byte)(player.GetBGTeam() == Team.Horde ? PvPTeamId.Horde : PvPTeamId.Alliance);
|
||||
pvpMatchInitialize.BattlemasterListID = (uint)GetTypeID();
|
||||
pvpMatchInitialize.BattlemasterListID = queueId.BattlemasterListId;
|
||||
pvpMatchInitialize.Registered = false;
|
||||
pvpMatchInitialize.AffectsRating = IsRated();
|
||||
|
||||
@@ -1118,7 +1128,7 @@ namespace Game.BattleGrounds
|
||||
{
|
||||
if (!m_InBGFreeSlotQueue && IsBattleground())
|
||||
{
|
||||
Global.BattlegroundMgr.AddToBGFreeSlotQueue(GetQueueId(), this);
|
||||
Global.BattlegroundMgr.AddToBGFreeSlotQueue(this);
|
||||
m_InBGFreeSlotQueue = true;
|
||||
}
|
||||
}
|
||||
@@ -1128,7 +1138,7 @@ namespace Game.BattleGrounds
|
||||
{
|
||||
if (m_InBGFreeSlotQueue)
|
||||
{
|
||||
Global.BattlegroundMgr.RemoveFromBGFreeSlotQueue(GetQueueId(), m_InstanceID);
|
||||
Global.BattlegroundMgr.RemoveFromBGFreeSlotQueue(GetMapId(), m_InstanceID);
|
||||
m_InBGFreeSlotQueue = false;
|
||||
}
|
||||
}
|
||||
@@ -1647,11 +1657,6 @@ namespace Game.BattleGrounds
|
||||
return count;
|
||||
}
|
||||
|
||||
public void SetHoliday(bool is_holiday)
|
||||
{
|
||||
m_HonorMode = is_holiday ? BGHonorMode.Holiday : BGHonorMode.Normal;
|
||||
}
|
||||
|
||||
int GetObjectType(ObjectGuid guid)
|
||||
{
|
||||
for (int i = 0; i < BgObjects.Length; ++i)
|
||||
@@ -1724,9 +1729,9 @@ namespace Game.BattleGrounds
|
||||
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()
|
||||
@@ -1790,12 +1795,16 @@ namespace Game.BattleGrounds
|
||||
return _battlegroundTemplate.GetMinPlayersPerTeam();
|
||||
}
|
||||
|
||||
public BattlegroundPlayer GetBattlegroundPlayerData(ObjectGuid playerGuid)
|
||||
{
|
||||
return m_Players.LookupByKey(playerGuid);
|
||||
}
|
||||
|
||||
public virtual void StartingEventCloseDoors() { }
|
||||
public virtual void StartingEventOpenDoors() { }
|
||||
|
||||
public virtual void DestroyGate(Player player, GameObject go) { }
|
||||
|
||||
public BattlegroundQueueTypeId GetQueueId() { return m_queueId; }
|
||||
public uint GetInstanceID() { return m_InstanceID; }
|
||||
public BattlegroundStatus GetStatus() { return m_Status; }
|
||||
public uint GetClientInstanceID() { return m_ClientInstanceID; }
|
||||
@@ -1805,10 +1814,7 @@ namespace Game.BattleGrounds
|
||||
int GetStartDelayTime() { return m_StartDelayTime; }
|
||||
public ArenaTypes GetArenaType() { return m_ArenaType; }
|
||||
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
|
||||
public void SetInstanceID(uint InstanceID) { m_InstanceID = InstanceID; }
|
||||
public void SetStatus(BattlegroundStatus Status) { m_Status = Status; }
|
||||
@@ -1837,7 +1843,6 @@ namespace Game.BattleGrounds
|
||||
++m_InvitedHorde;
|
||||
}
|
||||
|
||||
public void SetRandom(bool isRandom) { m_IsRandom = isRandom; }
|
||||
uint GetInvitedCount(Team team) { return (team == Team.Alliance) ? m_InvitedAlliance : m_InvitedHorde; }
|
||||
|
||||
public bool IsRated() { return m_IsRated; }
|
||||
@@ -1927,9 +1932,6 @@ namespace Game.BattleGrounds
|
||||
// this must be filled inructors!
|
||||
public uint[] StartMessageIds = new uint[4];
|
||||
|
||||
bool m_IsRandom;
|
||||
|
||||
public BGHonorMode m_HonorMode;
|
||||
public uint[] m_TeamScores = new uint[SharedConst.PvpTeamsCount];
|
||||
|
||||
protected ObjectGuid[] BgObjects;// = new Dictionary<int, ObjectGuid>();
|
||||
@@ -1938,8 +1940,6 @@ namespace Game.BattleGrounds
|
||||
public uint[] Buff_Entries = { BattlegroundConst.SpeedBuff, BattlegroundConst.RegenBuff, BattlegroundConst.BerserkerBuff };
|
||||
|
||||
// Battleground
|
||||
BattlegroundQueueTypeId m_queueId;
|
||||
BattlegroundTypeId m_RandomTypeID;
|
||||
uint m_InstanceID; // Battleground Instance's GUID!
|
||||
BattlegroundStatus m_Status;
|
||||
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 Team Team; // Player's team
|
||||
public bool Mercenary;
|
||||
public BattlegroundQueueTypeId queueTypeId;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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.RequesterGuid = player.GetGUID();
|
||||
@@ -113,11 +113,11 @@ namespace Game.BattleGrounds
|
||||
header.Ticket.Type = RideType.Battlegrounds;
|
||||
header.Ticket.Time = (int)joinTime;
|
||||
header.QueueID.Add(queueId.GetPacked());
|
||||
header.RangeMin = (byte)bg.GetMinLevel();
|
||||
header.RangeMax = (byte)bg.GetMaxLevel();
|
||||
header.TeamSize = (byte)(bg.IsArena() ? arenaType : 0);
|
||||
header.InstanceID = bg.GetClientInstanceID();
|
||||
header.RegisteredMatch = bg.IsRated();
|
||||
header.RangeMin = 0; // seems to always be 0
|
||||
header.RangeMax = SharedConst.DefaultMaxLevel; // alwyas max level of current expansion. Might be limited to account
|
||||
header.TeamSize = queueId.TeamSize;
|
||||
header.InstanceID = 0; // seems to always be 0
|
||||
header.RegisteredMatch = queueId.Rated;
|
||||
header.TournamentRules = false;
|
||||
}
|
||||
|
||||
@@ -130,19 +130,19 @@ namespace Game.BattleGrounds
|
||||
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();
|
||||
BuildBattlegroundStatusHeader(battlefieldStatus.Hdr, bg, player, ticketId, joinTime, bg.GetQueueId(), arenaType);
|
||||
BuildBattlegroundStatusHeader(battlefieldStatus.Hdr, player, ticketId, joinTime, queueId);
|
||||
battlefieldStatus.Mapid = bg.GetMapId();
|
||||
battlefieldStatus.Timeout = timeout;
|
||||
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();
|
||||
BuildBattlegroundStatusHeader(battlefieldStatus.Hdr, bg, player, ticketId, joinTime, bg.GetQueueId(), arenaType);
|
||||
BuildBattlegroundStatusHeader(battlefieldStatus.Hdr, player, ticketId, joinTime, queueId);
|
||||
battlefieldStatus.ShutdownTimer = bg.GetRemainingTime();
|
||||
battlefieldStatus.ArenaFaction = (byte)(player.GetBGTeam() == Team.Horde ? TeamId.Horde : TeamId.Alliance);
|
||||
battlefieldStatus.LeftEarly = false;
|
||||
@@ -150,10 +150,10 @@ namespace Game.BattleGrounds
|
||||
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();
|
||||
BuildBattlegroundStatusHeader(battlefieldStatus.Hdr, bg, player, ticketId, joinTime, queueId, arenaType);
|
||||
BuildBattlegroundStatusHeader(battlefieldStatus.Hdr, player, ticketId, joinTime, queueId);
|
||||
battlefieldStatus.AverageWaitTime = avgWaitTime;
|
||||
battlefieldStatus.AsGroup = asGroup;
|
||||
battlefieldStatus.SuspendedQueue = false;
|
||||
@@ -179,7 +179,7 @@ namespace Game.BattleGrounds
|
||||
if (instanceId == 0)
|
||||
return null;
|
||||
|
||||
if (bgTypeId != BattlegroundTypeId.None || bgTypeId == BattlegroundTypeId.RB || bgTypeId == BattlegroundTypeId.RandomEpic)
|
||||
if (bgTypeId != BattlegroundTypeId.None || IsRandomBattleground(bgTypeId))
|
||||
{
|
||||
var data = bgDataStore.LookupByKey(bgTypeId);
|
||||
return data.m_Battlegrounds.LookupByKey(instanceId);
|
||||
@@ -196,14 +196,6 @@ namespace Game.BattleGrounds
|
||||
return null;
|
||||
}
|
||||
|
||||
public Battleground GetBattlegroundTemplate(BattlegroundTypeId bgTypeId)
|
||||
{
|
||||
if (bgDataStore.ContainsKey(bgTypeId))
|
||||
return bgDataStore[bgTypeId].Template;
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
uint CreateClientVisibleInstanceId(BattlegroundTypeId bgTypeId, BattlegroundBracketId bracket_id)
|
||||
{
|
||||
if (IsArenaType(bgTypeId))
|
||||
@@ -230,115 +222,92 @@ namespace Game.BattleGrounds
|
||||
}
|
||||
|
||||
// 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);
|
||||
|
||||
// get the template BG
|
||||
Battleground bg_template = GetBattlegroundTemplate(bgTypeId);
|
||||
BattlegroundTemplate bg_template = GetBattlegroundTemplateByTypeId(bgTypeId);
|
||||
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;
|
||||
}
|
||||
|
||||
if (bgTypeId == BattlegroundTypeId.RB || bgTypeId == BattlegroundTypeId.AA || bgTypeId == BattlegroundTypeId.RandomEpic)
|
||||
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
|
||||
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.SetInstanceID(Global.MapMgr.GenerateInstanceId());
|
||||
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.SetArenaType((ArenaTypes)queueId.TeamSize);
|
||||
bg.SetRandomTypeID(bgTypeId);
|
||||
bg.SetRated(queueId.Rated);
|
||||
bg.SetRandom(isRandom);
|
||||
|
||||
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()
|
||||
{
|
||||
uint oldMSTime = Time.GetMSTime();
|
||||
@@ -375,7 +344,7 @@ namespace Game.BattleGrounds
|
||||
bgTemplate.ScriptId = Global.ObjectMgr.GetScriptId(result.Read<string>(5));
|
||||
bgTemplate.BattlemasterEntry = bl;
|
||||
|
||||
if (bgTemplate.Id != BattlegroundTypeId.AA && bgTemplate.Id != BattlegroundTypeId.RB && bgTemplate.Id != BattlegroundTypeId.RandomEpic)
|
||||
if (bgTemplate.Id != BattlegroundTypeId.AA && !IsRandomBattleground(bgTemplate.Id))
|
||||
{
|
||||
uint startId = result.Read<uint>(1);
|
||||
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;
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
public bool IsRandomBattleground(BattlegroundTypeId battlemasterListId)
|
||||
{
|
||||
return battlemasterListId == BattlegroundTypeId.RB || battlemasterListId == BattlegroundTypeId.RandomEpic;
|
||||
}
|
||||
|
||||
public BattlegroundQueueTypeId BGQueueTypeId(ushort battlemasterListId, BattlegroundQueueIdType type, bool rated, ArenaTypes 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);
|
||||
}
|
||||
|
||||
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)
|
||||
{
|
||||
BattlemasterListRecord battlemasterList = CliDB.BattlemasterListStorage.LookupByKey(bgQueueTypeId.BattlemasterListId);
|
||||
@@ -521,9 +472,9 @@ namespace Game.BattleGrounds
|
||||
case BattlegroundQueueIdType.ArenaSkirmish:
|
||||
if (battlemasterList.InstanceType != (int)MapTypes.Arena)
|
||||
return false;
|
||||
if (bgQueueTypeId.Rated)
|
||||
if (!bgQueueTypeId.Rated)
|
||||
return false;
|
||||
if (bgQueueTypeId.TeamSize != 0)
|
||||
if (bgQueueTypeId.TeamSize != (int)ArenaTypes.Team3v3)
|
||||
return false;
|
||||
break;
|
||||
default:
|
||||
@@ -700,19 +651,19 @@ namespace Game.BattleGrounds
|
||||
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)
|
||||
{
|
||||
if (bg.GetInstanceID() == instanceId)
|
||||
@@ -750,7 +701,7 @@ namespace Game.BattleGrounds
|
||||
return mBattleMastersMap.LookupByKey(entry);
|
||||
}
|
||||
|
||||
BattlegroundTemplate GetBattlegroundTemplateByTypeId(BattlegroundTypeId id)
|
||||
public BattlegroundTemplate GetBattlegroundTemplateByTypeId(BattlegroundTypeId id)
|
||||
{
|
||||
return _battlegroundTemplates.LookupByKey(id);
|
||||
}
|
||||
@@ -762,7 +713,7 @@ namespace Game.BattleGrounds
|
||||
|
||||
Dictionary<BattlegroundTypeId, BattlegroundData> bgDataStore = 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<BattlegroundTypeId, BattlegroundTemplate> _battlegroundTemplates = new();
|
||||
Dictionary<uint, BattlegroundTemplate> _battlegroundMapTemplates = new();
|
||||
|
||||
@@ -115,10 +115,9 @@ namespace Game.BattleGrounds
|
||||
//announce to world, this code needs mutex
|
||||
if (!m_queueId.Rated && !isPremade && WorldConfig.GetBoolValue(WorldCfg.BattlegroundQueueAnnouncerEnable))
|
||||
{
|
||||
Battleground bg = Global.BattlegroundMgr.GetBattlegroundTemplate((BattlegroundTypeId)m_queueId.BattlemasterListId);
|
||||
if (bg)
|
||||
BattlegroundTemplate bg = Global.BattlegroundMgr.GetBattlegroundTemplateByTypeId((BattlegroundTypeId)m_queueId.BattlemasterListId);
|
||||
if (bg != null)
|
||||
{
|
||||
string bgName = bg.GetName();
|
||||
uint MinPlayers = bg.GetMinPlayersPerTeam();
|
||||
uint qHorde = 0;
|
||||
uint qAlliance = 0;
|
||||
@@ -135,18 +134,17 @@ namespace Game.BattleGrounds
|
||||
// Show queue status to player only (when joining queue)
|
||||
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);
|
||||
}
|
||||
// System message
|
||||
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);
|
||||
}
|
||||
}
|
||||
}
|
||||
//release mutex
|
||||
}
|
||||
|
||||
return ginfo;
|
||||
@@ -364,8 +362,8 @@ namespace Game.BattleGrounds
|
||||
// not yet invited
|
||||
// set invitation
|
||||
ginfo.IsInvitedToBGInstanceGUID = bg.GetInstanceID();
|
||||
BattlegroundTypeId bgTypeId = bg.GetTypeID();
|
||||
BattlegroundQueueTypeId bgQueueTypeId = bg.GetQueueId();
|
||||
BattlegroundTypeId bgTypeId = (BattlegroundTypeId)m_queueId.BattlemasterListId;
|
||||
BattlegroundQueueTypeId bgQueueTypeId = m_queueId;
|
||||
BattlegroundBracketId bracket_id = bg.GetBracketId();
|
||||
|
||||
// set ArenaTeamId for rated matches
|
||||
@@ -392,7 +390,7 @@ namespace Game.BattleGrounds
|
||||
player.SetInviteForBattlegroundQueueType(bgQueueTypeId, ginfo.IsInvitedToBGInstanceGUID);
|
||||
|
||||
// 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)));
|
||||
// create automatic remove events
|
||||
BGQueueRemoveEvent removeEvent = new(player.GetGUID(), ginfo.IsInvitedToBGInstanceGUID, bgQueueTypeId, ginfo.RemoveInviteTime);
|
||||
@@ -401,10 +399,10 @@ namespace Game.BattleGrounds
|
||||
uint queueSlot = player.GetBattlegroundQueueIndex(bgQueueTypeId);
|
||||
|
||||
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;
|
||||
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);
|
||||
}
|
||||
return true;
|
||||
@@ -589,15 +587,15 @@ namespace Game.BattleGrounds
|
||||
}
|
||||
|
||||
// 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];
|
||||
for (uint i = 0; i < SharedConst.PvpTeamsCount; i++)
|
||||
{
|
||||
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)
|
||||
{
|
||||
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
|
||||
++(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 (!m_SelectionPools[j].AddGroup(groupQueueInfo, m_SelectionPools[(j + 1) % SharedConst.PvpTeamsCount].GetPlayerCount()))
|
||||
break;
|
||||
@@ -725,48 +723,48 @@ namespace Game.BattleGrounds
|
||||
|
||||
// Battleground with free slot for player should be always in the beggining of the queue
|
||||
// maybe it would be better to create bgfreeslotqueue for each bracket_id
|
||||
var bgQueues = Global.BattlegroundMgr.GetBGFreeSlotQueueStore(m_queueId);
|
||||
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
|
||||
|
||||
Battleground bg_template = Global.BattlegroundMgr.GetBattlegroundTemplate((BattlegroundTypeId)m_queueId.BattlemasterListId);
|
||||
if (!bg_template)
|
||||
BattlegroundTemplate bg_template = Global.BattlegroundMgr.GetBattlegroundTemplateByTypeId((BattlegroundTypeId)m_queueId.BattlemasterListId);
|
||||
if (bg_template == null)
|
||||
{
|
||||
Log.outError(LogFilter.Battleground, $"Battleground: Update: bg template not found for {m_queueId.BattlemasterListId}");
|
||||
return;
|
||||
}
|
||||
|
||||
PvpDifficultyRecord bracketEntry = Global.DB2Mgr.GetBattlegroundBracketById(bg_template.GetMapId(), bracket_id);
|
||||
if (bracketEntry == null)
|
||||
// loop over queues for every map
|
||||
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);
|
||||
return;
|
||||
if (mapId == -1)
|
||||
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!)
|
||||
uint MinPlayersPerTeam = bg_template.GetMinPlayersPerTeam();
|
||||
uint MaxPlayersPerTeam = bg_template.GetMaxPlayersPerTeam();
|
||||
@@ -782,12 +780,12 @@ namespace Game.BattleGrounds
|
||||
m_SelectionPools[TeamId.Alliance].Init();
|
||||
m_SelectionPools[TeamId.Horde].Init();
|
||||
|
||||
if (bg_template.IsBattleground())
|
||||
if (!bg_template.IsArena())
|
||||
{
|
||||
if (CheckPremadeMatch(bracket_id, MinPlayersPerTeam, MaxPlayersPerTeam))
|
||||
{
|
||||
// create new Battleground
|
||||
Battleground bg2 = Global.BattlegroundMgr.CreateNewBattleground(m_queueId, bracketEntry);
|
||||
Battleground bg2 = Global.BattlegroundMgr.CreateNewBattleground(m_queueId, bracket_id);
|
||||
if (bg2 == null)
|
||||
{
|
||||
Log.outError(LogFilter.Battleground, $"BattlegroundQueue.Update - Cannot create Battleground: {m_queueId.BattlemasterListId}");
|
||||
@@ -809,11 +807,11 @@ namespace Game.BattleGrounds
|
||||
if (!m_queueId.Rated)
|
||||
{
|
||||
// if there are enough players in pools, start new Battleground or non rated arena
|
||||
if (CheckNormalMatch(bg_template, bracket_id, MinPlayersPerTeam, MaxPlayersPerTeam)
|
||||
if (CheckNormalMatch(bracket_id, MinPlayersPerTeam, MaxPlayersPerTeam)
|
||||
|| (bg_template.IsArena() && CheckSkirmishForSameFaction(bracket_id, MinPlayersPerTeam)))
|
||||
{
|
||||
// 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)
|
||||
{
|
||||
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 hTeam = queueArray[TeamId.Horde];
|
||||
Battleground arena = Global.BattlegroundMgr.CreateNewBattleground(m_queueId, bracketEntry);
|
||||
Battleground arena = Global.BattlegroundMgr.CreateNewBattleground(m_queueId, bracket_id);
|
||||
if (!arena)
|
||||
{
|
||||
Log.outError(LogFilter.Battleground, "BattlegroundQueue.Update couldn't create arena instance for rated arena match!");
|
||||
@@ -1145,13 +1143,13 @@ namespace Game.BattleGrounds
|
||||
/// </summary>
|
||||
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_BgInstanceGUID = bgInstanceGUID;
|
||||
m_BgTypeId = bgTypeId;
|
||||
m_ArenaType = arenaType;
|
||||
m_RemoveTime = removeTime;
|
||||
m_QueueId = queueId;
|
||||
}
|
||||
|
||||
public override bool Execute(ulong e_time, uint p_time)
|
||||
@@ -1166,16 +1164,15 @@ namespace Game.BattleGrounds
|
||||
if (bg == null)
|
||||
return true;
|
||||
|
||||
BattlegroundQueueTypeId bgQueueTypeId = bg.GetQueueId();
|
||||
uint queueSlot = player.GetBattlegroundQueueIndex(bgQueueTypeId);
|
||||
uint queueSlot = player.GetBattlegroundQueueIndex(m_QueueId);
|
||||
if (queueSlot < SharedConst.PvpTeamsCount) // player is in queue or in Battleground
|
||||
{
|
||||
// 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))
|
||||
{
|
||||
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);
|
||||
}
|
||||
}
|
||||
@@ -1187,8 +1184,8 @@ namespace Game.BattleGrounds
|
||||
ObjectGuid m_PlayerGuid;
|
||||
uint m_BgInstanceGUID;
|
||||
BattlegroundTypeId m_BgTypeId;
|
||||
ArenaTypes m_ArenaType;
|
||||
uint m_RemoveTime;
|
||||
BattlegroundQueueTypeId m_QueueId;
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
|
||||
@@ -3,7 +3,8 @@
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
public override void AddPlayer(Player player)
|
||||
public override void AddPlayer(Player player, BattlegroundQueueTypeId queueId)
|
||||
{
|
||||
bool isInBattleground = IsPlayerInBattleground(player.GetGUID());
|
||||
base.AddPlayer(player);
|
||||
base.AddPlayer(player, queueId);
|
||||
if (!isInBattleground)
|
||||
PlayerScores[player.GetGUID()] = new BattlegroundABScore(player.GetGUID(), player.GetBGTeam());
|
||||
}
|
||||
|
||||
@@ -3,7 +3,8 @@
|
||||
|
||||
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
|
||||
{
|
||||
class DeepwindGorge
|
||||
class BgDeepwindGorge : Battleground
|
||||
{
|
||||
public BgDeepwindGorge(BattlegroundTemplate battlegroundTemplate) : base(battlegroundTemplate) { }
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,25 +1,10 @@
|
||||
/*
|
||||
* Copyright (C) 2012-2016 CypherCore <http://github.com/CypherCore>
|
||||
*
|
||||
* 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/>.
|
||||
*/
|
||||
// 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.
|
||||
|
||||
using Game.Entities;
|
||||
using Framework.Constants;
|
||||
using System.Collections.Generic;
|
||||
using Game.Entities;
|
||||
using Game.Networking.Packets;
|
||||
using Game.DataStorage;
|
||||
using System.Collections.Generic;
|
||||
|
||||
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());
|
||||
base.AddPlayer(player);
|
||||
base.AddPlayer(player, queueId);
|
||||
if (!isInBattleground)
|
||||
PlayerScores[player.GetGUID()] = new BgEyeOfStormScore(player.GetGUID(), player.GetBGTeam());
|
||||
|
||||
|
||||
@@ -3,8 +3,9 @@
|
||||
|
||||
namespace Game.BattleGrounds.Zones
|
||||
{
|
||||
class IsleofConquest
|
||||
class BgIsleofConquest : Battleground
|
||||
{
|
||||
public BgIsleofConquest(BattlegroundTemplate battlegroundTemplate) : base(battlegroundTemplate) { }
|
||||
}
|
||||
|
||||
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
|
||||
{
|
||||
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());
|
||||
base.AddPlayer(player);
|
||||
base.AddPlayer(player, queueId);
|
||||
if (!isInBattleground)
|
||||
PlayerScores[player.GetGUID()] = new BattlegroundSAScore(player.GetGUID(), player.GetBGTeam());
|
||||
|
||||
|
||||
@@ -3,7 +3,8 @@
|
||||
|
||||
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) { }
|
||||
}
|
||||
}
|
||||
@@ -3,7 +3,8 @@
|
||||
|
||||
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);
|
||||
}
|
||||
|
||||
public override void AddPlayer(Player player)
|
||||
public override void AddPlayer(Player player, BattlegroundQueueTypeId queueId)
|
||||
{
|
||||
bool isInBattleground = IsPlayerInBattleground(player.GetGUID());
|
||||
base.AddPlayer(player);
|
||||
base.AddPlayer(player, queueId);
|
||||
if (!isInBattleground)
|
||||
PlayerScores[player.GetGUID()] = new BattlegroundWGScore(player.GetGUID(), player.GetBGTeam());
|
||||
}
|
||||
@@ -320,7 +320,7 @@ namespace Game.BattleGrounds.Zones
|
||||
UpdateWorldState(WSGWorldStates.FlagStateHorde, 1);
|
||||
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);
|
||||
}
|
||||
else
|
||||
|
||||
Reference in New Issue
Block a user