aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeremy <Golrag@users.noreply.github.com>2023-08-26 14:03:42 +0200
committerGitHub <noreply@github.com>2023-08-26 14:03:42 +0200
commit0ede6c155605da602b3bafaa3a1212d9f924759b (patch)
treec30077044c03821c4af7db095f49b1edf71d7a05
parent3e7b5f982c3b518a642447f112fc628edd963ce2 (diff)
Core/Battlegrounds: Rework queues (#29200)
* 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
-rw-r--r--sql/base/characters_database.sql6
-rw-r--r--sql/updates/characters/master/2023_08_26_00_characters.sql3
-rw-r--r--sql/updates/world/master/2023_08_26_00_world.sql1
-rw-r--r--src/server/database/Database/Implementation/CharacterDatabase.cpp4
-rw-r--r--src/server/game/Battlegrounds/Arena.cpp4
-rw-r--r--src/server/game/Battlegrounds/Arena.h2
-rw-r--r--src/server/game/Battlegrounds/Battleground.cpp74
-rw-r--r--src/server/game/Battlegrounds/Battleground.h33
-rw-r--r--src/server/game/Battlegrounds/BattlegroundMgr.cpp200
-rw-r--r--src/server/game/Battlegrounds/BattlegroundMgr.h39
-rw-r--r--src/server/game/Battlegrounds/BattlegroundQueue.cpp108
-rw-r--r--src/server/game/Battlegrounds/BattlegroundQueue.h8
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundAB.cpp4
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundAB.h2
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp4
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundAV.h2
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp11
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundEY.h2
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundIC.cpp4
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundIC.h2
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundSA.cpp4
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundSA.h2
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp8
-rw-r--r--src/server/game/Battlegrounds/Zones/BattlegroundWS.h2
-rw-r--r--src/server/game/Entities/GameObject/GameObject.cpp4
-rw-r--r--src/server/game/Entities/Player/Player.cpp38
-rw-r--r--src/server/game/Entities/Player/Player.h8
-rw-r--r--src/server/game/Events/GameEventMgr.cpp47
-rw-r--r--src/server/game/Events/GameEventMgr.h3
-rw-r--r--src/server/game/Groups/Group.cpp14
-rw-r--r--src/server/game/Groups/Group.h3
-rw-r--r--src/server/game/Handlers/BattleGroundHandler.cpp104
-rw-r--r--src/server/game/Handlers/MovementHandler.cpp4
-rw-r--r--src/server/game/Miscellaneous/SharedDefines.h2
-rw-r--r--src/server/game/Spells/SpellEffects.cpp2
-rw-r--r--src/server/scripts/Commands/cs_misc.cpp4
36 files changed, 306 insertions, 456 deletions
diff --git a/sql/base/characters_database.sql b/sql/base/characters_database.sql
index d72e85fffc7..5e75e1c5b69 100644
--- a/sql/base/characters_database.sql
+++ b/sql/base/characters_database.sql
@@ -636,6 +636,7 @@ CREATE TABLE `character_battleground_data` (
`taxiStart` int unsigned NOT NULL DEFAULT '0',
`taxiEnd` int unsigned NOT NULL DEFAULT '0',
`mountSpell` int unsigned NOT NULL DEFAULT '0',
+ `queueId` BIGINT UNSIGNED DEFAULT '0',
PRIMARY KEY (`guid`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci COMMENT='Player System';
/*!40101 SET character_set_client = @saved_cs_client */;
@@ -3397,7 +3398,7 @@ CREATE TABLE `pvpstats_battlegrounds` (
`id` bigint unsigned NOT NULL AUTO_INCREMENT,
`winner_faction` tinyint NOT NULL,
`bracket_id` tinyint unsigned NOT NULL,
- `type` tinyint unsigned NOT NULL,
+ `type` int unsigned NOT NULL,
`date` datetime NOT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
@@ -3708,7 +3709,8 @@ INSERT INTO `updates` VALUES
('2023_04_02_00_characters.sql','AAC1B81AFE4716CF4DAB6BCF01D22F421BFAD253','ARCHIVED','2023-04-02 01:02:26',0),
('2023_05_04_00_characters.sql','9AC370E51507F5BD368707E90D8F6BF0FF16CA09','ARCHIVED','2023-05-04 16:17:31',0),
('2023_05_19_00_characters.sql','5E0C9338554BAA481566EDFF3FE2FCEFF1B67DA9','ARCHIVED','2023-05-19 18:40:42',0),
-('2023_07_14_00_characters.sql','BB44A95A9C4B0C16878A5316AC38E702A8AACDE2','ARCHIVED','2023-07-14 08:24:44',0);
+('2023_07_14_00_characters.sql','BB44A95A9C4B0C16878A5316AC38E702A8AACDE2','ARCHIVED','2023-07-14 08:24:44',0),
+('2023_08_26_00_characters.sql','FA50838609AB5E645FB2DCAC970BD5706F9EFAAF','RELEASED','2023-08-26 12:18:22',0);
/*!40000 ALTER TABLE `updates` ENABLE KEYS */;
UNLOCK TABLES;
diff --git a/sql/updates/characters/master/2023_08_26_00_characters.sql b/sql/updates/characters/master/2023_08_26_00_characters.sql
new file mode 100644
index 00000000000..7b1ca982250
--- /dev/null
+++ b/sql/updates/characters/master/2023_08_26_00_characters.sql
@@ -0,0 +1,3 @@
+ALTER TABLE `character_battleground_data` ADD `queueId` BIGINT UNSIGNED NULL DEFAULT '0' AFTER `mountSpell`;
+
+ALTER TABLE `pvpstats_battlegrounds` CHANGE `type` `type` int unsigned NOT NULL;
diff --git a/sql/updates/world/master/2023_08_26_00_world.sql b/sql/updates/world/master/2023_08_26_00_world.sql
new file mode 100644
index 00000000000..1809516b75d
--- /dev/null
+++ b/sql/updates/world/master/2023_08_26_00_world.sql
@@ -0,0 +1 @@
+DROP TABLE IF EXISTS `game_event_battleground_holiday`;
diff --git a/src/server/database/Database/Implementation/CharacterDatabase.cpp b/src/server/database/Database/Implementation/CharacterDatabase.cpp
index ba3449db560..4bd9439f379 100644
--- a/src/server/database/Database/Implementation/CharacterDatabase.cpp
+++ b/src/server/database/Database/Implementation/CharacterDatabase.cpp
@@ -137,7 +137,7 @@ void CharacterDatabaseConnection::DoPrepareStatements()
PrepareStatement(CHAR_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, "
"appearance17, appearance18, mainHandEnchant, offHandEnchant FROM character_transmog_outfits WHERE guid = ? ORDER BY setindex", CONNECTION_ASYNC);
- PrepareStatement(CHAR_SEL_CHARACTER_BGDATA, "SELECT instanceId, team, joinX, joinY, joinZ, joinO, joinMapId, taxiStart, taxiEnd, mountSpell FROM character_battleground_data WHERE guid = ?", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_SEL_CHARACTER_BGDATA, "SELECT instanceId, team, joinX, joinY, joinZ, joinO, joinMapId, taxiStart, taxiEnd, mountSpell, queueId FROM character_battleground_data WHERE guid = ?", CONNECTION_ASYNC);
PrepareStatement(CHAR_SEL_CHARACTER_GLYPHS, "SELECT talentGroup, glyphId FROM character_glyphs WHERE guid = ?", CONNECTION_ASYNC);
PrepareStatement(CHAR_SEL_CHARACTER_TALENTS, "SELECT talentId, talentGroup FROM character_talent WHERE guid = ?", CONNECTION_ASYNC);
PrepareStatement(CHAR_SEL_CHARACTER_PVP_TALENTS, "SELECT talentId0, talentId1, talentId2, talentId3, talentGroup FROM character_pvp_talent WHERE guid = ?", CONNECTION_ASYNC);
@@ -408,7 +408,7 @@ void CharacterDatabaseConnection::DoPrepareStatements()
PrepareStatement(CHAR_UPD_ARENA_TEAM_NAME, "UPDATE arena_team SET name = ? WHERE arenaTeamId = ?", CONNECTION_ASYNC);
// Character battleground data
- PrepareStatement(CHAR_INS_PLAYER_BGDATA, "INSERT INTO character_battleground_data (guid, instanceId, team, joinX, joinY, joinZ, joinO, joinMapId, taxiStart, taxiEnd, mountSpell) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
+ PrepareStatement(CHAR_INS_PLAYER_BGDATA, "INSERT INTO character_battleground_data (guid, instanceId, team, joinX, joinY, joinZ, joinO, joinMapId, taxiStart, taxiEnd, mountSpell, queueId) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)", CONNECTION_ASYNC);
PrepareStatement(CHAR_DEL_PLAYER_BGDATA, "DELETE FROM character_battleground_data WHERE guid = ?", CONNECTION_ASYNC);
// Character homebind
diff --git a/src/server/game/Battlegrounds/Arena.cpp b/src/server/game/Battlegrounds/Arena.cpp
index 9bd9aa3b192..d90a18bc153 100644
--- a/src/server/game/Battlegrounds/Arena.cpp
+++ b/src/server/game/Battlegrounds/Arena.cpp
@@ -39,10 +39,10 @@ Arena::Arena(BattlegroundTemplate const* battlegroundTemplate) : Battleground(ba
StartMessageIds[BG_STARTING_EVENT_FOURTH] = ARENA_TEXT_START_BATTLE_HAS_BEGUN;
}
-void Arena::AddPlayer(Player* player)
+void Arena::AddPlayer(Player* player, BattlegroundQueueTypeId queueId)
{
bool const isInBattleground = IsPlayerInBattleground(player->GetGUID());
- Battleground::AddPlayer(player);
+ Battleground::AddPlayer(player, queueId);
if (!isInBattleground)
PlayerScores[player->GetGUID()] = new ArenaScore(player->GetGUID(), player->GetBGTeam());
diff --git a/src/server/game/Battlegrounds/Arena.h b/src/server/game/Battlegrounds/Arena.h
index 2ba7b04a536..8322aecda6f 100644
--- a/src/server/game/Battlegrounds/Arena.h
+++ b/src/server/game/Battlegrounds/Arena.h
@@ -58,7 +58,7 @@ class TC_GAME_API Arena : public Battleground
protected:
Arena(BattlegroundTemplate const* battlegroundTemplate);
- void AddPlayer(Player* player) override;
+ void AddPlayer(Player* player, BattlegroundQueueTypeId queueId) override;
void RemovePlayer(Player* /*player*/, ObjectGuid /*guid*/, uint32 /*team*/) override;
void UpdateArenaWorldState();
diff --git a/src/server/game/Battlegrounds/Battleground.cpp b/src/server/game/Battlegrounds/Battleground.cpp
index 88128727181..59db44658c8 100644
--- a/src/server/game/Battlegrounds/Battleground.cpp
+++ b/src/server/game/Battlegrounds/Battleground.cpp
@@ -59,7 +59,6 @@ Battleground::Battleground(BattlegroundTemplate const* battlegroundTemplate) : _
{
ASSERT(_battlegroundTemplate, "Nonexisting Battleground Template passed to battleground ctor!");
- m_RandomTypeID = BATTLEGROUND_TYPE_NONE;
m_InstanceID = 0;
m_Status = STATUS_NONE;
m_ClientInstanceID = 0;
@@ -75,7 +74,6 @@ Battleground::Battleground(BattlegroundTemplate const* battlegroundTemplate) : _
m_Events = 0;
m_StartDelayTime = 0;
m_IsRated = false;
- m_IsRandom = false;
m_InBGFreeSlotQueue = false;
m_SetDeleteThis = false;
@@ -101,8 +99,6 @@ Battleground::Battleground(BattlegroundTemplate const* battlegroundTemplate) : _
m_LastPlayerPositionBroadcast = 0;
- m_HonorMode = BG_NORMAL;
-
StartDelayTimes[BG_STARTING_EVENT_FIRST] = BG_START_DELAY_2M;
StartDelayTimes[BG_STARTING_EVENT_SECOND] = BG_START_DELAY_1M;
StartDelayTimes[BG_STARTING_EVENT_THIRD] = BG_START_DELAY_30S;
@@ -684,7 +680,7 @@ void Battleground::EndBattleground(uint32 winner)
stmt->setUInt64(0, battlegroundId);
stmt->setUInt8(1, GetWinner());
stmt->setUInt8(2, GetUniqueBracketId());
- stmt->setUInt8(3, GetTypeID(true));
+ stmt->setUInt32(3, GetTypeID());
CharacterDatabase.Execute(stmt);
}
@@ -753,18 +749,22 @@ void Battleground::EndBattleground(uint32 winner)
// Reward winner team
if (team == winner)
{
- if (IsRandom() || BattlegroundMgr::IsBGWeekend(GetTypeID()))
+ if (BattlegroundPlayer const* bgPlayer = GetBattlegroundPlayerData(player->GetGUID()))
{
- UpdatePlayerScore(player, SCORE_BONUS_HONOR, GetBonusHonorFromKill(winnerKills));
- if (!player->GetRandomWinner())
+ if (BattlegroundMgr::IsRandomBattleground(bgPlayer->queueTypeId.BattlemasterListId)
+ || BattlegroundMgr::IsBGWeekend(BattlegroundTypeId(bgPlayer->queueTypeId.BattlemasterListId)))
{
- player->SetRandomWinner(true);
- // TODO: win honor xp
+ UpdatePlayerScore(player, SCORE_BONUS_HONOR, GetBonusHonorFromKill(winnerKills));
+ if (!player->GetRandomWinner())
+ {
+ player->SetRandomWinner(true);
+ // TODO: win honor xp
+ }
+ }
+ else
+ {
+ // TODO: loss honor xp
}
- }
- else
- {
- // TODO: loss honor xp
}
player->UpdateCriteria(CriteriaType::WinBattleground, player->GetMapId());
@@ -780,8 +780,12 @@ void Battleground::EndBattleground(uint32 winner)
}
else
{
- if (IsRandom() || BattlegroundMgr::IsBGWeekend(GetTypeID()))
- UpdatePlayerScore(player, SCORE_BONUS_HONOR, GetBonusHonorFromKill(loserKills));
+ if (BattlegroundPlayer const* bgPlayer = GetBattlegroundPlayerData(player->GetGUID()))
+ {
+ if (BattlegroundMgr::IsRandomBattleground(bgPlayer->queueTypeId.BattlemasterListId)
+ || BattlegroundMgr::IsBGWeekend(BattlegroundTypeId(bgPlayer->queueTypeId.BattlemasterListId)))
+ UpdatePlayerScore(player, SCORE_BONUS_HONOR, GetBonusHonorFromKill(loserKills));
+ }
}
player->ResetAllPowers();
@@ -819,8 +823,10 @@ void Battleground::RemovePlayerAtLeave(ObjectGuid guid, bool Transport, bool Sen
bool participant = false;
// Remove from lists/maps
BattlegroundPlayerMap::iterator itr = m_Players.find(guid);
+ Optional<BattlegroundQueueTypeId> bgQueueTypeId;
if (itr != m_Players.end())
{
+ bgQueueTypeId = itr->second.queueTypeId;
UpdatePlayersCountByTeam(team, true); // -1 player
m_Players.erase(itr);
// check if the player was a participant of the match, or only entered through gm command (goname)
@@ -868,8 +874,6 @@ void Battleground::RemovePlayerAtLeave(ObjectGuid guid, bool Transport, bool Sen
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)
@@ -884,15 +888,16 @@ void Battleground::RemovePlayerAtLeave(ObjectGuid guid, bool Transport, bool Sen
player->ResummonPetTemporaryUnSummonedIfAny();
}
- if (SendPacket)
+ if (SendPacket && bgQueueTypeId)
{
WorldPackets::Battleground::BattlefieldStatusNone battlefieldStatus;
- sBattlegroundMgr->BuildBattlegroundStatusNone(&battlefieldStatus, player, player->GetBattlegroundQueueIndex(bgQueueTypeId), player->GetBattlegroundQueueJoinTime(bgQueueTypeId));
+ sBattlegroundMgr->BuildBattlegroundStatusNone(&battlefieldStatus, player, player->GetBattlegroundQueueIndex(*bgQueueTypeId), player->GetBattlegroundQueueJoinTime(*bgQueueTypeId));
player->SendDirectMessage(battlefieldStatus.Write());
}
// 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)
+ player->RemoveBattlegroundQueueId(*bgQueueTypeId);
}
// remove from raid group if player is member
@@ -903,11 +908,11 @@ void Battleground::RemovePlayerAtLeave(ObjectGuid guid, bool Transport, bool Sen
}
DecreaseInvitedCount(team);
//we should update battleground queue, but only if bg isn't ending
- if (isBattleground() && GetStatus() < STATUS_WAIT_LEAVE)
+ if (isBattleground() && GetStatus() < STATUS_WAIT_LEAVE && bgQueueTypeId)
{
// a player has left the battleground, so there are free slots -> add to queue
AddToBGFreeSlotQueue();
- sBattlegroundMgr->ScheduleQueueUpdate(0, bgQueueTypeId, GetBracketId());
+ sBattlegroundMgr->ScheduleQueueUpdate(0, *bgQueueTypeId, GetBracketId());
}
// Let others know
@@ -919,7 +924,7 @@ void Battleground::RemovePlayerAtLeave(ObjectGuid guid, bool Transport, bool Sen
if (player)
{
// Do next only if found in battleground
- player->SetBattlegroundId(0, BATTLEGROUND_TYPE_NONE); // We're not in BG.
+ player->SetBattlegroundId(0, BATTLEGROUND_TYPE_NONE, BATTLEGROUND_QUEUE_NONE); // We're not in BG.
// reset destination bg team
player->SetBGTeam(0);
@@ -982,7 +987,7 @@ void Battleground::TeleportPlayerToExploitLocation(Player* player)
player->TeleportTo(loc->Loc);
}
-void Battleground::AddPlayer(Player* player)
+void Battleground::AddPlayer(Player* player, BattlegroundQueueTypeId queueId)
{
// remove afk from player
if (player->isAFK())
@@ -995,7 +1000,8 @@ void Battleground::AddPlayer(Player* player)
BattlegroundPlayer bp;
bp.OfflineRemoveTime = 0;
bp.Team = team;
- bp.Mercenary = player->IsMercenaryForBattlegroundQueueType(GetQueueId());
+ bp.Mercenary = player->IsMercenaryForBattlegroundQueueType(queueId);
+ bp.queueTypeId = queueId;
bool const isInBattleground = IsPlayerInBattleground(player->GetGUID());
// Add to list/maps
@@ -1035,8 +1041,9 @@ void Battleground::AddPlayer(Player* player)
pvpMatchInitialize.Duration = std::chrono::duration_cast<Seconds>(duration);
pvpMatchInitialize.StartTime = GameTime::GetSystemTime() - duration;
}
+
pvpMatchInitialize.ArenaFaction = player->GetBGTeam() == HORDE ? PVP_TEAM_HORDE : PVP_TEAM_ALLIANCE;
- pvpMatchInitialize.BattlemasterListID = GetTypeID();
+ pvpMatchInitialize.BattlemasterListID = queueId.BattlemasterListId;
pvpMatchInitialize.Registered = false;
pvpMatchInitialize.AffectsRating = isRated();
@@ -1175,7 +1182,7 @@ void Battleground::AddToBGFreeSlotQueue()
{
if (!m_InBGFreeSlotQueue && isBattleground())
{
- sBattlegroundMgr->AddToBGFreeSlotQueue(GetQueueId(), this);
+ sBattlegroundMgr->AddToBGFreeSlotQueue(this);
m_InBGFreeSlotQueue = true;
}
}
@@ -1185,7 +1192,7 @@ void Battleground::RemoveFromBGFreeSlotQueue()
{
if (m_InBGFreeSlotQueue)
{
- sBattlegroundMgr->RemoveFromBGFreeSlotQueue(GetQueueId(), m_InstanceID);
+ sBattlegroundMgr->RemoveFromBGFreeSlotQueue(GetMapId(), m_InstanceID);
m_InBGFreeSlotQueue = false;
}
}
@@ -1740,11 +1747,6 @@ uint32 Battleground::GetAlivePlayersCountByTeam(uint32 Team) const
return count;
}
-void Battleground::SetHoliday(bool is_holiday)
-{
- m_HonorMode = is_holiday ? BG_HOLIDAY : BG_NORMAL;
-}
-
int32 Battleground::GetObjectType(ObjectGuid guid)
{
for (uint32 i = 0; i < BgObjects.size(); ++i)
@@ -1813,9 +1815,9 @@ char const* Battleground::GetName() const
return _battlegroundTemplate->BattlemasterEntry->Name[sWorld->GetDefaultDbcLocale()];
}
-BattlegroundTypeId Battleground::GetTypeID(bool getRandom) const
+BattlegroundTypeId Battleground::GetTypeID() const
{
- return getRandom ? m_RandomTypeID : _battlegroundTemplate->Id;
+ return _battlegroundTemplate->Id;
}
BattlegroundBracketId Battleground::GetBracketId() const
diff --git a/src/server/game/Battlegrounds/Battleground.h b/src/server/game/Battlegrounds/Battleground.h
index 737e6662ac5..2b8698860d1 100644
--- a/src/server/game/Battlegrounds/Battleground.h
+++ b/src/server/game/Battlegrounds/Battleground.h
@@ -169,6 +169,7 @@ struct BattlegroundPlayer
time_t OfflineRemoveTime; // for tracking and removing offline players from queue after 5 minutes
uint32 Team; // Player's team
bool Mercenary;
+ BattlegroundQueueTypeId queueTypeId;
};
struct BattlegroundObjectInfo
@@ -205,13 +206,6 @@ enum BattlegroundStartingEventsIds
};
#define BG_STARTING_EVENT_COUNT 4
-enum BGHonorMode
-{
- BG_NORMAL = 0,
- BG_HOLIDAY,
- BG_HONOR_MODE_NUM
-};
-
#define BG_AWARD_ARENA_POINTS_MIN_LEVEL 71
#define ARENA_TIMELIMIT_POINTS_LOSS -16
@@ -280,8 +274,7 @@ class TC_GAME_API Battleground : public ZoneScript
/* Battleground */
// Get methods:
char const* GetName() const;
- BattlegroundQueueTypeId GetQueueId() const { return m_queueId; }
- BattlegroundTypeId GetTypeID(bool getRandom = false) const;
+ BattlegroundTypeId GetTypeID() const;
BattlegroundBracketId GetBracketId() const;
uint32 GetInstanceID() const { return m_InstanceID; }
BattlegroundStatus GetStatus() const { return m_Status; }
@@ -302,11 +295,8 @@ class TC_GAME_API Battleground : public ZoneScript
PvPTeamId GetWinner() const { return _winnerTeamId; }
uint32 GetScriptId() const;
uint32 GetBonusHonorFromKill(uint32 kills) const;
- bool IsRandom() const { return m_IsRandom; }
// Set methods:
- void SetQueueId(BattlegroundQueueTypeId queueId) { m_queueId = queueId; }
- void SetRandomTypeID(BattlegroundTypeId TypeID) { m_RandomTypeID = TypeID; }
//here we can count minlevel and maxlevel for players
void SetBracket(PVPDifficultyEntry const* bracketEntry);
void SetInstanceID(uint32 InstanceID) { m_InstanceID = InstanceID; }
@@ -327,7 +317,6 @@ class TC_GAME_API Battleground : public ZoneScript
void DecreaseInvitedCount(uint32 team) { (team == ALLIANCE) ? --m_InvitedAlliance : --m_InvitedHorde; }
void IncreaseInvitedCount(uint32 team) { (team == ALLIANCE) ? ++m_InvitedAlliance : ++m_InvitedHorde; }
- void SetRandom(bool isRandom) { m_IsRandom = isRandom; }
uint32 GetInvitedCount(uint32 team) const { return (team == ALLIANCE) ? m_InvitedAlliance : m_InvitedHorde; }
bool HasFreeSlots() const;
uint32 GetFreeSlotsForTeam(uint32 Team) const;
@@ -437,15 +426,13 @@ class TC_GAME_API Battleground : public ZoneScript
// GetExploitTeleportLocation(TeamId) must be implemented in the battleground subclass.
void TeleportPlayerToExploitLocation(Player* player);
- virtual void AddPlayer(Player* player); // must be implemented in BG subclass
+ virtual void AddPlayer(Player* player, BattlegroundQueueTypeId queueId); // must be implemented in BG subclass
void AddOrSetPlayerToCorrectBgGroup(Player* player, uint32 team);
virtual void RemovePlayerAtLeave(ObjectGuid guid, bool Transport, bool SendPacket);
// can be extended in in BG subclass
- void SetHoliday(bool is_holiday);
-
/// @todo make this protected:
GuidVector BgObjects;
GuidVector BgCreatures;
@@ -493,6 +480,15 @@ class TC_GAME_API Battleground : public ZoneScript
void AddPlayerPosition(WorldPackets::Battleground::BattlegroundPlayerPosition const& position);
void RemovePlayerPosition(ObjectGuid guid);
+ BattlegroundPlayer const* GetBattlegroundPlayerData(ObjectGuid const& playerGuid) const
+ {
+ auto const& itr = m_Players.find(playerGuid);
+ if (itr == m_Players.end())
+ return nullptr;
+
+ return &itr->second;
+ }
+
protected:
// this method is called, when BG cannot spawn its own spirit guide, or something is wrong, It correctly ends Battleground
void EndNow();
@@ -554,15 +550,10 @@ class TC_GAME_API Battleground : public ZoneScript
// this must be filled in constructors!
uint32 StartMessageIds[BG_STARTING_EVENT_COUNT];
- bool m_IsRandom;
-
- BGHonorMode m_HonorMode;
int32 m_TeamScores[PVP_TEAMS_COUNT];
private:
// Battleground
- BattlegroundQueueTypeId m_queueId;
- BattlegroundTypeId m_RandomTypeID;
uint32 m_InstanceID; // Battleground Instance's GUID!
BattlegroundStatus m_Status;
uint32 m_ClientInstanceID; // the instance-id which is sent to the client and without any other internal use
diff --git a/src/server/game/Battlegrounds/BattlegroundMgr.cpp b/src/server/game/Battlegrounds/BattlegroundMgr.cpp
index aa903481d75..5b4b958042a 100644
--- a/src/server/game/Battlegrounds/BattlegroundMgr.cpp
+++ b/src/server/game/Battlegrounds/BattlegroundMgr.cpp
@@ -119,8 +119,7 @@ void BattlegroundMgr::Update(uint32 diff)
{
BattlegroundContainer& bgs = itr1->second.m_Battlegrounds;
BattlegroundContainer::iterator itrDelete = bgs.begin();
- // first one is template and should not be deleted
- for (BattlegroundContainer::iterator itr = ++itrDelete; itr != bgs.end();)
+ for (BattlegroundContainer::iterator itr = itrDelete; itr != bgs.end();)
{
itrDelete = itr++;
Battleground* bg = itrDelete->second;
@@ -183,18 +182,18 @@ void BattlegroundMgr::Update(uint32 diff)
}
}
-void BattlegroundMgr::BuildBattlegroundStatusHeader(WorldPackets::Battleground::BattlefieldStatusHeader* header, Battleground* bg, Player* player, uint32 ticketId, uint32 joinTime, BattlegroundQueueTypeId queueId, uint32 arenaType)
+void BattlegroundMgr::BuildBattlegroundStatusHeader(WorldPackets::Battleground::BattlefieldStatusHeader* header, Player* player, uint32 ticketId, uint32 joinTime, BattlegroundQueueTypeId queueId)
{
header->Ticket.RequesterGuid = player->GetGUID();
header->Ticket.Id = ticketId;
header->Ticket.Type = WorldPackets::LFG::RideType::Battlegrounds;
header->Ticket.Time = joinTime;
header->QueueID.push_back(queueId.GetPacked());
- header->RangeMin = bg->GetMinLevel();
- header->RangeMax = bg->GetMaxLevel();
- header->TeamSize = bg->isArena() ? arenaType : 0;
- header->InstanceID = bg->GetClientInstanceID();
- header->RegisteredMatch = bg->isRated();
+ header->RangeMin = 0; // seems to always be 0
+ header->RangeMax = DEFAULT_MAX_LEVEL; // 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;
}
@@ -206,17 +205,17 @@ void BattlegroundMgr::BuildBattlegroundStatusNone(WorldPackets::Battleground::Ba
battlefieldStatus->Ticket.Time = joinTime;
}
-void BattlegroundMgr::BuildBattlegroundStatusNeedConfirmation(WorldPackets::Battleground::BattlefieldStatusNeedConfirmation* battlefieldStatus, Battleground* bg, Player* player, uint32 ticketId, uint32 joinTime, uint32 timeout, uint32 arenaType)
+void BattlegroundMgr::BuildBattlegroundStatusNeedConfirmation(WorldPackets::Battleground::BattlefieldStatusNeedConfirmation* battlefieldStatus, Battleground* bg, Player* player, uint32 ticketId, uint32 joinTime, uint32 timeout, BattlegroundQueueTypeId queueId)
{
- 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;
}
-void BattlegroundMgr::BuildBattlegroundStatusActive(WorldPackets::Battleground::BattlefieldStatusActive* battlefieldStatus, Battleground* bg, Player* player, uint32 ticketId, uint32 joinTime, uint32 arenaType)
+void BattlegroundMgr::BuildBattlegroundStatusActive(WorldPackets::Battleground::BattlefieldStatusActive* battlefieldStatus, Battleground* bg, Player* player, uint32 ticketId, uint32 joinTime, BattlegroundQueueTypeId queueId)
{
- BuildBattlegroundStatusHeader(&battlefieldStatus->Hdr, bg, player, ticketId, joinTime, bg->GetQueueId(), arenaType);
+ BuildBattlegroundStatusHeader(&battlefieldStatus->Hdr, player, ticketId, joinTime, queueId);
battlefieldStatus->ShutdownTimer = bg->GetRemainingTime();
battlefieldStatus->ArenaFaction = player->GetBGTeam() == HORDE ? PVP_TEAM_HORDE : PVP_TEAM_ALLIANCE;
battlefieldStatus->LeftEarly = false;
@@ -224,9 +223,9 @@ void BattlegroundMgr::BuildBattlegroundStatusActive(WorldPackets::Battleground::
battlefieldStatus->Mapid = bg->GetMapId();
}
-void BattlegroundMgr::BuildBattlegroundStatusQueued(WorldPackets::Battleground::BattlefieldStatusQueued* battlefieldStatus, Battleground* bg, Player* player, uint32 ticketId, uint32 joinTime, BattlegroundQueueTypeId queueId, uint32 avgWaitTime, uint32 arenaType, bool asGroup)
+void BattlegroundMgr::BuildBattlegroundStatusQueued(WorldPackets::Battleground::BattlefieldStatusQueued* battlefieldStatus, Player* player, uint32 ticketId, uint32 joinTime, BattlegroundQueueTypeId queueId, uint32 avgWaitTime, bool asGroup)
{
- 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;
@@ -253,7 +252,7 @@ Battleground* BattlegroundMgr::GetBattleground(uint32 instanceId, BattlegroundTy
BattlegroundDataContainer::const_iterator begin, end;
- if (bgTypeId == BATTLEGROUND_TYPE_NONE || bgTypeId == BATTLEGROUND_RB || bgTypeId == BATTLEGROUND_RANDOM_EPIC)
+ if (bgTypeId == BATTLEGROUND_TYPE_NONE || IsRandomBattleground(bgTypeId))
{
begin = bgDataStore.begin();
end = bgDataStore.end();
@@ -277,17 +276,6 @@ Battleground* BattlegroundMgr::GetBattleground(uint32 instanceId, BattlegroundTy
return nullptr;
}
-Battleground* BattlegroundMgr::GetBattlegroundTemplate(BattlegroundTypeId bgTypeId)
-{
- BattlegroundDataContainer::const_iterator itr = bgDataStore.find(bgTypeId);
- if (itr == bgDataStore.end())
- return nullptr;
-
- BattlegroundContainer const& bgs = itr->second.m_Battlegrounds;
- // map is sorted and we can be sure that lowest instance id has only BG template
- return bgs.empty() ? nullptr : bgs.begin()->second;
-}
-
uint32 BattlegroundMgr::CreateClientVisibleInstanceId(BattlegroundTypeId bgTypeId, BattlegroundBracketId bracket_id)
{
if (IsArenaType(bgTypeId))
@@ -314,12 +302,12 @@ uint32 BattlegroundMgr::CreateClientVisibleInstanceId(BattlegroundTypeId bgTypeI
}
// create a new battleground that will really be used to play
-Battleground* BattlegroundMgr::CreateNewBattleground(BattlegroundQueueTypeId queueId, PVPDifficultyEntry const* bracketEntry)
+Battleground* BattlegroundMgr::CreateNewBattleground(BattlegroundQueueTypeId queueId, BattlegroundBracketId bracketId)
{
BattlegroundTypeId bgTypeId = GetRandomBG(BattlegroundTypeId(queueId.BattlemasterListId));
// get the template BG
- Battleground* bg_template = GetBattlegroundTemplate(bgTypeId);
+ BattlegroundTemplate const* bg_template = GetBattlegroundTemplateByTypeId(bgTypeId);
if (!bg_template)
{
@@ -327,49 +315,56 @@ Battleground* BattlegroundMgr::CreateNewBattleground(BattlegroundQueueTypeId que
return nullptr;
}
+ PVPDifficultyEntry const* bracketEntry = DB2Manager::GetBattlegroundBracketById(bg_template->BattlemasterEntry->MapID[0], bracketId);
+ if (!bracketEntry)
+ {
+ TC_LOG_ERROR("bg.battleground", "Battleground: CreateNewBattleground: bg bracket entry not found for map {} bracket id {}", bg_template->BattlemasterEntry->MapID[0], bracketId);
+ return nullptr;
+ }
+
Battleground* bg = nullptr;
// create a copy of the BG template
switch (bgTypeId)
{
case BATTLEGROUND_AV:
- bg = new BattlegroundAV(*(BattlegroundAV*)bg_template);
+ bg = new BattlegroundAV(bg_template);
break;
case BATTLEGROUND_WS:
- bg = new BattlegroundWS(*(BattlegroundWS*)bg_template);
+ bg = new BattlegroundWS(bg_template);
break;
case BATTLEGROUND_AB:
case BATTLEGROUND_DOM_AB:
- bg = new BattlegroundAB(*(BattlegroundAB*)bg_template);
+ bg = new BattlegroundAB(bg_template);
break;
case BATTLEGROUND_NA:
- bg = new BattlegroundNA(*(BattlegroundNA*)bg_template);
+ bg = new BattlegroundNA(bg_template);
break;
case BATTLEGROUND_BE:
- bg = new BattlegroundBE(*(BattlegroundBE*)bg_template);
+ bg = new BattlegroundBE(bg_template);
break;
case BATTLEGROUND_EY:
- bg = new BattlegroundEY(*(BattlegroundEY*)bg_template);
+ bg = new BattlegroundEY(bg_template);
break;
case BATTLEGROUND_RL:
- bg = new BattlegroundRL(*(BattlegroundRL*)bg_template);
+ bg = new BattlegroundRL(bg_template);
break;
case BATTLEGROUND_SA:
- bg = new BattlegroundSA(*(BattlegroundSA*)bg_template);
+ bg = new BattlegroundSA(bg_template);
break;
case BATTLEGROUND_DS:
- bg = new BattlegroundDS(*(BattlegroundDS*)bg_template);
+ bg = new BattlegroundDS(bg_template);
break;
case BATTLEGROUND_RV:
- bg = new BattlegroundRV(*(BattlegroundRV*)bg_template);
+ bg = new BattlegroundRV(bg_template);
break;
case BATTLEGROUND_IC:
- bg = new BattlegroundIC(*(BattlegroundIC*)bg_template);
+ bg = new BattlegroundIC(bg_template);
break;
case BATTLEGROUND_TP:
- bg = new BattlegroundTP(*(BattlegroundTP*)bg_template);
+ bg = new BattlegroundTP(bg_template);
break;
case BATTLEGROUND_BFG:
- bg = new BattlegroundBFG(*(BattlegroundBFG*)bg_template);
+ bg = new BattlegroundBFG(bg_template);
break;
case BATTLEGROUND_RB:
case BATTLEGROUND_AA:
@@ -378,93 +373,19 @@ Battleground* BattlegroundMgr::CreateNewBattleground(BattlegroundQueueTypeId que
return nullptr;
}
- bool isRandom = bgTypeId != BattlegroundTypeId(queueId.BattlemasterListId) && !bg->isArena();
-
- bg->SetQueueId(queueId);
bg->SetBracket(bracketEntry);
bg->SetInstanceID(sMapMgr->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(STATUS_WAIT_JOIN); // start the joining of the bg
bg->SetArenaType(queueId.TeamSize);
- bg->SetRandomTypeID(bgTypeId);
bg->SetRated(queueId.Rated);
- bg->SetRandom(isRandom);
return bg;
}
-// used to create the BG templates
-bool BattlegroundMgr::CreateBattleground(BattlegroundTemplate const* bgTemplate)
-{
- Battleground* bg = GetBattlegroundTemplate(bgTemplate->Id);
- if (!bg)
- {
- // Create the BG
- switch (bgTemplate->Id)
- {
- case BATTLEGROUND_AV:
- bg = new BattlegroundAV(bgTemplate);
- break;
- case BATTLEGROUND_WS:
- bg = new BattlegroundWS(bgTemplate);
- break;
- case BATTLEGROUND_AB:
- case BATTLEGROUND_DOM_AB:
- bg = new BattlegroundAB(bgTemplate);
- break;
- case BATTLEGROUND_NA:
- bg = new BattlegroundNA(bgTemplate);
- break;
- case BATTLEGROUND_BE:
- bg = new BattlegroundBE(bgTemplate);
- break;
- case BATTLEGROUND_EY:
- bg = new BattlegroundEY(bgTemplate);
- break;
- case BATTLEGROUND_RL:
- bg = new BattlegroundRL(bgTemplate);
- break;
- case BATTLEGROUND_SA:
- bg = new BattlegroundSA(bgTemplate);
- break;
- case BATTLEGROUND_DS:
- bg = new BattlegroundDS(bgTemplate);
- break;
- case BATTLEGROUND_RV:
- bg = new BattlegroundRV(bgTemplate);
- break;
- case BATTLEGROUND_IC:
- bg = new BattlegroundIC(bgTemplate);
- break;
- case BATTLEGROUND_AA:
- bg = new Battleground(bgTemplate);
- break;
- case BATTLEGROUND_RB:
- bg = new Battleground(bgTemplate);
- bg->SetRandom(true);
- break;
- case BATTLEGROUND_TP:
- bg = new BattlegroundTP(bgTemplate);
- break;
- case BATTLEGROUND_BFG:
- bg = new BattlegroundBFG(bgTemplate);
- break;
- case BATTLEGROUND_RANDOM_EPIC:
- bg = new Battleground(bgTemplate);
- bg->SetRandom(true);
- break;
- default:
- return false;
- }
-
- bg->SetInstanceID(0);
- AddBattleground(bg);
- }
-
- return true;
-}
-
void BattlegroundMgr::LoadBattlegroundTemplates()
{
uint32 oldMSTime = getMSTime();
@@ -504,7 +425,7 @@ void BattlegroundMgr::LoadBattlegroundTemplates()
bgTemplate.ScriptId = sObjectMgr->GetScriptId(fields[5].GetString());
bgTemplate.BattlemasterEntry = bl;
- if (bgTemplate.Id != BATTLEGROUND_AA && bgTemplate.Id != BATTLEGROUND_RB && bgTemplate.Id != BATTLEGROUND_RANDOM_EPIC)
+ if (bgTemplate.Id != BATTLEGROUND_AA && !IsRandomBattleground(bgTemplate.Id))
{
uint32 startId = fields[1].GetUInt32();
if (WorldSafeLocsEntry const* start = sObjectMgr->GetWorldSafeLoc(startId))
@@ -531,13 +452,6 @@ void BattlegroundMgr::LoadBattlegroundTemplates()
}
}
- if (!CreateBattleground(&bgTemplate))
- {
- TC_LOG_ERROR("bg.battleground", "Could not create battleground template class ({})!", bgTemplate.Id);
- _battlegroundTemplates.erase(bgTypeId);
- continue;
- }
-
if (bgTemplate.BattlemasterEntry->MapID[1] == -1) // in this case we have only one mapId
_battlegroundMapTemplates[bgTemplate.BattlemasterEntry->MapID[0]] = &_battlegroundTemplates[bgTypeId];
@@ -589,6 +503,11 @@ bool BattlegroundMgr::IsArenaType(BattlegroundTypeId bgTypeId)
|| bgTypeId == BATTLEGROUND_RL;
}
+bool BattlegroundMgr::IsRandomBattleground(uint32 battlemasterListId)
+{
+ return battlemasterListId == BATTLEGROUND_RB || battlemasterListId == BATTLEGROUND_RANDOM_EPIC;
+}
+
BattlegroundQueueTypeId BattlegroundMgr::BGQueueTypeId(uint16 battlemasterListId, BattlegroundQueueIdType type, bool rated, uint8 teamSize)
{
return { battlemasterListId, AsUnderlyingType(type), rated, teamSize };
@@ -606,19 +525,6 @@ void BattlegroundMgr::ToggleArenaTesting()
sWorld->SendWorldText(m_ArenaTesting ? LANG_DEBUG_ARENA_ON : LANG_DEBUG_ARENA_OFF);
}
-void BattlegroundMgr::ResetHolidays()
-{
- for (uint32 i = BATTLEGROUND_AV; i < MAX_BATTLEGROUND_TYPE_ID; i++)
- if (Battleground* bg = GetBattlegroundTemplate(BattlegroundTypeId(i)))
- bg->SetHoliday(false);
-}
-
-void BattlegroundMgr::SetHolidayActive(uint32 battlegroundId)
-{
- if (Battleground* bg = GetBattlegroundTemplate(BattlegroundTypeId(battlegroundId)))
- bg->SetHoliday(true);
-}
-
bool BattlegroundMgr::IsValidQueueId(BattlegroundQueueTypeId bgQueueTypeId)
{
BattlemasterListEntry const* battlemasterList = sBattlemasterListStore.LookupEntry(bgQueueTypeId.BattlemasterListId);
@@ -648,9 +554,9 @@ bool BattlegroundMgr::IsValidQueueId(BattlegroundQueueTypeId bgQueueTypeId)
case BattlegroundQueueIdType::ArenaSkirmish:
if (battlemasterList->InstanceType != MAP_ARENA)
return false;
- if (bgQueueTypeId.Rated)
+ if (!bgQueueTypeId.Rated)
return false;
- if (bgQueueTypeId.TeamSize)
+ if (bgQueueTypeId.TeamSize != ARENA_TYPE_3v3)
return false;
break;
default:
@@ -814,19 +720,19 @@ BattlegroundTypeId BattlegroundMgr::GetRandomBG(BattlegroundTypeId bgTypeId)
return BATTLEGROUND_TYPE_NONE;
}
-BGFreeSlotQueueContainer& BattlegroundMgr::GetBGFreeSlotQueueStore(BattlegroundQueueTypeId bgTypeId)
+BGFreeSlotQueueContainer& BattlegroundMgr::GetBGFreeSlotQueueStore(uint32 mapId)
{
- return m_BGFreeSlotQueue[bgTypeId];
+ return m_BGFreeSlotQueue[mapId];
}
-void BattlegroundMgr::AddToBGFreeSlotQueue(BattlegroundQueueTypeId bgTypeId, Battleground* bg)
+void BattlegroundMgr::AddToBGFreeSlotQueue(Battleground* bg)
{
- m_BGFreeSlotQueue[bgTypeId].push_front(bg);
+ m_BGFreeSlotQueue[bg->GetMapId()].push_front(bg);
}
-void BattlegroundMgr::RemoveFromBGFreeSlotQueue(BattlegroundQueueTypeId bgTypeId, uint32 instanceId)
+void BattlegroundMgr::RemoveFromBGFreeSlotQueue(uint32 mapId, uint32 instanceId)
{
- BGFreeSlotQueueContainer& queues = m_BGFreeSlotQueue[bgTypeId];
+ BGFreeSlotQueueContainer& queues = m_BGFreeSlotQueue[mapId];
for (BGFreeSlotQueueContainer::iterator itr = queues.begin(); itr != queues.end(); ++itr)
if ((*itr)->GetInstanceID() == instanceId)
{
diff --git a/src/server/game/Battlegrounds/BattlegroundMgr.h b/src/server/game/Battlegrounds/BattlegroundMgr.h
index 836ca705dc3..da7f135a42b 100644
--- a/src/server/game/Battlegrounds/BattlegroundMgr.h
+++ b/src/server/game/Battlegrounds/BattlegroundMgr.h
@@ -90,23 +90,22 @@ class TC_GAME_API BattlegroundMgr
/* Packet Building */
void SendBattlegroundList(Player* player, ObjectGuid const& guid, BattlegroundTypeId bgTypeId);
- void BuildBattlegroundStatusHeader(WorldPackets::Battleground::BattlefieldStatusHeader* battlefieldStatus, Battleground* bg, Player* player, uint32 ticketId, uint32 joinTime, BattlegroundQueueTypeId queueId, uint32 arenaType);
+ void BuildBattlegroundStatusHeader(WorldPackets::Battleground::BattlefieldStatusHeader* battlefieldStatus, Player* player, uint32 ticketId, uint32 joinTime, BattlegroundQueueTypeId queueId);
void BuildBattlegroundStatusNone(WorldPackets::Battleground::BattlefieldStatusNone* battlefieldStatus, Player* player, uint32 ticketId, uint32 joinTime);
- void BuildBattlegroundStatusNeedConfirmation(WorldPackets::Battleground::BattlefieldStatusNeedConfirmation* battlefieldStatus, Battleground* bg, Player* player, uint32 ticketId, uint32 joinTime, uint32 timeout, uint32 arenaType);
- void BuildBattlegroundStatusActive(WorldPackets::Battleground::BattlefieldStatusActive* battlefieldStatus, Battleground* bg, Player* player, uint32 ticketId, uint32 joinTime, uint32 arenaType);
- void BuildBattlegroundStatusQueued(WorldPackets::Battleground::BattlefieldStatusQueued* battlefieldStatus, Battleground* bg, Player* player, uint32 ticketId, uint32 joinTime, BattlegroundQueueTypeId queueId, uint32 avgWaitTime, uint32 arenaType, bool asGroup);
+ void BuildBattlegroundStatusNeedConfirmation(WorldPackets::Battleground::BattlefieldStatusNeedConfirmation* battlefieldStatus, Battleground* bg, Player* player, uint32 ticketId, uint32 joinTime, uint32 timeout, BattlegroundQueueTypeId queueId);
+ void BuildBattlegroundStatusActive(WorldPackets::Battleground::BattlefieldStatusActive* battlefieldStatus, Battleground* bg, Player* player, uint32 ticketId, uint32 joinTime, BattlegroundQueueTypeId queueId);
+ void BuildBattlegroundStatusQueued(WorldPackets::Battleground::BattlefieldStatusQueued* battlefieldStatus, Player* player, uint32 ticketId, uint32 joinTime, BattlegroundQueueTypeId queueId, uint32 avgWaitTime, bool asGroup);
void BuildBattlegroundStatusFailed(WorldPackets::Battleground::BattlefieldStatusFailed* battlefieldStatus, BattlegroundQueueTypeId queueId, Player* pPlayer, uint32 ticketId, GroupJoinBattlegroundResult result, ObjectGuid const* errorGuid = nullptr);
/* Battlegrounds */
Battleground* GetBattleground(uint32 InstanceID, BattlegroundTypeId bgTypeId);
- Battleground* GetBattlegroundTemplate(BattlegroundTypeId bgTypeId);
- Battleground* CreateNewBattleground(BattlegroundQueueTypeId queueId, PVPDifficultyEntry const* bracketEntry);
+ Battleground* CreateNewBattleground(BattlegroundQueueTypeId queueId, BattlegroundBracketId bracketId);
void AddBattleground(Battleground* bg);
void RemoveBattleground(BattlegroundTypeId bgTypeId, uint32 instanceId);
- void AddToBGFreeSlotQueue(BattlegroundQueueTypeId bgTypeId, Battleground* bg);
- void RemoveFromBGFreeSlotQueue(BattlegroundQueueTypeId bgTypeId, uint32 instanceId);
- BGFreeSlotQueueContainer& GetBGFreeSlotQueueStore(BattlegroundQueueTypeId bgTypeId);
+ void AddToBGFreeSlotQueue(Battleground* bg);
+ void RemoveFromBGFreeSlotQueue(uint32 mapId, uint32 instanceId);
+ BGFreeSlotQueueContainer& GetBGFreeSlotQueueStore(uint32 mapId);
void LoadBattlegroundTemplates();
void DeleteAllBattlegrounds();
@@ -122,12 +121,10 @@ class TC_GAME_API BattlegroundMgr
void ToggleArenaTesting();
void ToggleTesting();
- void ResetHolidays();
- void SetHolidayActive(uint32 battlegroundId);
-
bool isArenaTesting() const { return m_ArenaTesting; }
bool isTesting() const { return m_Testing; }
+ static bool IsRandomBattleground(uint32 battlemasterListId);
static BattlegroundQueueTypeId BGQueueTypeId(uint16 battlemasterListId, BattlegroundQueueIdType type, bool rated, uint8 teamSize);
static HolidayIds BGTypeToWeekendHolidayId(BattlegroundTypeId bgTypeId);
@@ -146,8 +143,14 @@ class TC_GAME_API BattlegroundMgr
return BATTLEGROUND_TYPE_NONE;
}
+ BattlegroundTemplate const* GetBattlegroundTemplateByTypeId(BattlegroundTypeId id)
+ {
+ BattlegroundTemplateMap::const_iterator itr = _battlegroundTemplates.find(id);
+ if (itr != _battlegroundTemplates.end())
+ return &itr->second;
+ return nullptr;
+ }
private:
- bool CreateBattleground(BattlegroundTemplate const* bgTemplate);
uint32 CreateClientVisibleInstanceId(BattlegroundTypeId bgTypeId, BattlegroundBracketId bracket_id);
static bool IsArenaType(BattlegroundTypeId bgTypeId);
BattlegroundTypeId GetRandomBG(BattlegroundTypeId id);
@@ -156,7 +159,7 @@ class TC_GAME_API BattlegroundMgr
BattlegroundDataContainer bgDataStore;
std::map<BattlegroundQueueTypeId, BattlegroundQueue> m_BattlegroundQueues;
- std::map<BattlegroundQueueTypeId, BGFreeSlotQueueContainer> m_BGFreeSlotQueue;
+ std::map<uint32 /*mapId*/, BGFreeSlotQueueContainer> m_BGFreeSlotQueue;
struct ScheduledQueueUpdate
{
@@ -174,14 +177,6 @@ class TC_GAME_API BattlegroundMgr
bool m_Testing;
BattleMastersMap mBattleMastersMap;
- BattlegroundTemplate const* GetBattlegroundTemplateByTypeId(BattlegroundTypeId id)
- {
- BattlegroundTemplateMap::const_iterator itr = _battlegroundTemplates.find(id);
- if (itr != _battlegroundTemplates.end())
- return &itr->second;
- return nullptr;
- }
-
BattlegroundTemplate const* GetBattlegroundTemplateByMapId(uint32 mapId)
{
BattlegroundMapTemplateContainer::const_iterator itr = _battlegroundMapTemplates.find(mapId);
diff --git a/src/server/game/Battlegrounds/BattlegroundQueue.cpp b/src/server/game/Battlegrounds/BattlegroundQueue.cpp
index 2e409e23c77..9df8417d249 100644
--- a/src/server/game/Battlegrounds/BattlegroundQueue.cpp
+++ b/src/server/game/Battlegrounds/BattlegroundQueue.cpp
@@ -196,7 +196,7 @@ GroupQueueInfo* BattlegroundQueue::AddGroup(Player const* leader, Group const* g
//announce to world, this code needs mutex
if (!m_queueId.Rated && !isPremade && sWorld->getBoolConfig(CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_ENABLE))
{
- if (Battleground* bg = sBattlegroundMgr->GetBattlegroundTemplate(BattlegroundTypeId(m_queueId.BattlemasterListId)))
+ if (BattlegroundTemplate const* bg = sBattlegroundMgr->GetBattlegroundTemplateByTypeId(BattlegroundTypeId(m_queueId.BattlemasterListId)))
{
uint32 MinPlayers = bg->GetMinPlayersPerTeam();
uint32 qHorde = 0;
@@ -214,18 +214,18 @@ GroupQueueInfo* BattlegroundQueue::AddGroup(Player const* leader, Group const* g
// Show queue status to player only (when joining queue)
if (sWorld->getBoolConfig(CONFIG_BATTLEGROUND_QUEUE_ANNOUNCER_PLAYERONLY))
{
- ChatHandler(leader->GetSession()).PSendSysMessage(LANG_BG_QUEUE_ANNOUNCE_SELF, bg->GetName(), q_min_level, q_max_level,
+ ChatHandler chatHandler(leader->GetSession());
+ chatHandler.PSendSysMessage(LANG_BG_QUEUE_ANNOUNCE_SELF, bg->BattlemasterEntry->Name[chatHandler.GetSessionDbcLocale()], q_min_level, q_max_level,
qAlliance, (MinPlayers > qAlliance) ? MinPlayers - qAlliance : (uint32)0, qHorde, (MinPlayers > qHorde) ? MinPlayers - qHorde : (uint32)0);
}
// System message
else
{
- sWorld->SendWorldText(LANG_BG_QUEUE_ANNOUNCE_WORLD, bg->GetName(), q_min_level, q_max_level,
+ sWorld->SendWorldText(LANG_BG_QUEUE_ANNOUNCE_WORLD, bg->BattlemasterEntry->Name[sWorld->GetDefaultDbcLocale()], q_min_level, q_max_level,
qAlliance, (MinPlayers > qAlliance) ? MinPlayers - qAlliance : (uint32)0, qHorde, (MinPlayers > qHorde) ? MinPlayers - qHorde : (uint32)0);
}
}
}
- //release mutex
}
return ginfo;
@@ -436,8 +436,8 @@ bool BattlegroundQueue::InviteGroupToBG(GroupQueueInfo* ginfo, Battleground* bg,
// 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
@@ -465,7 +465,7 @@ bool BattlegroundQueue::InviteGroupToBG(GroupQueueInfo* ginfo, Battleground* bg,
player->SetInviteForBattlegroundQueueType(bgQueueTypeId, ginfo->IsInvitedToBGInstanceGUID);
// create remind invite events
- BGQueueInviteEvent* inviteEvent = new BGQueueInviteEvent(player->GetGUID(), ginfo->IsInvitedToBGInstanceGUID, bgTypeId, m_queueId.TeamSize, ginfo->RemoveInviteTime);
+ BGQueueInviteEvent* inviteEvent = new BGQueueInviteEvent(player->GetGUID(), ginfo->IsInvitedToBGInstanceGUID, bgTypeId, ginfo->RemoveInviteTime, m_queueId);
m_events.AddEvent(inviteEvent, m_events.CalculateTime(Milliseconds(INVITATION_REMIND_TIME)));
// create automatic remove events
BGQueueRemoveEvent* removeEvent = new BGQueueRemoveEvent(player->GetGUID(), ginfo->IsInvitedToBGInstanceGUID, bgQueueTypeId, ginfo->RemoveInviteTime);
@@ -474,10 +474,10 @@ bool BattlegroundQueue::InviteGroupToBG(GroupQueueInfo* ginfo, Battleground* bg,
uint32 queueSlot = player->GetBattlegroundQueueIndex(bgQueueTypeId);
TC_LOG_DEBUG("bg.battleground", "Battleground: invited player {} {} to BG instance {} queueindex {} bgtype {}",
- player->GetName(), player->GetGUID().ToString(), bg->GetInstanceID(), queueSlot, bg->GetTypeID());
+ player->GetName(), player->GetGUID().ToString(), bg->GetInstanceID(), queueSlot, m_queueId.BattlemasterListId);
WorldPackets::Battleground::BattlefieldStatusNeedConfirmation battlefieldStatus;
- sBattlegroundMgr->BuildBattlegroundStatusNeedConfirmation(&battlefieldStatus, bg, player, queueSlot, player->GetBattlegroundQueueJoinTime(bgQueueTypeId), INVITE_ACCEPT_WAIT_TIME, m_queueId.TeamSize);
+ sBattlegroundMgr->BuildBattlegroundStatusNeedConfirmation(&battlefieldStatus, bg, player, queueSlot, player->GetBattlegroundQueueJoinTime(bgQueueTypeId), INVITE_ACCEPT_WAIT_TIME, bgQueueTypeId);
player->SendDirectMessage(battlefieldStatus.Write());
}
return true;
@@ -654,7 +654,7 @@ bool BattlegroundQueue::CheckPremadeMatch(BattlegroundBracketId bracket_id, uint
}
// this method tries to create battleground or arena with MinPlayersPerTeam against MinPlayersPerTeam
-bool BattlegroundQueue::CheckNormalMatch(Battleground* /*bg_template*/, BattlegroundBracketId bracket_id, uint32 minPlayers, uint32 maxPlayers)
+bool BattlegroundQueue::CheckNormalMatch(BattlegroundBracketId bracket_id, uint32 minPlayers, uint32 maxPlayers)
{
GroupsQueueType::const_iterator itr_team[PVP_TEAMS_COUNT];
for (uint32 i = 0; i < PVP_TEAMS_COUNT; i++)
@@ -776,54 +776,55 @@ void BattlegroundQueue::BattlegroundQueueUpdate(uint32 /*diff*/, BattlegroundBra
// 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
- BGFreeSlotQueueContainer& bgQueues = sBattlegroundMgr->GetBGFreeSlotQueueStore(m_queueId);
- for (BGFreeSlotQueueContainer::iterator itr = bgQueues.begin(); itr != bgQueues.end();)
+
+ BattlegroundTemplate const* bg_template = sBattlegroundMgr->GetBattlegroundTemplateByTypeId(BattlegroundTypeId(m_queueId.BattlemasterListId));
+ if (!bg_template)
+ {
+ TC_LOG_ERROR("bg.battleground", "Battleground: Update: bg template not found for {}", m_queueId.BattlemasterListId);
+ return;
+ }
+
+ // loop over queues for every map
+ for (int16 mapId : bg_template->BattlemasterEntry->MapID)
{
- Battleground* bg = *itr; ++itr;
- // DO NOT allow queue manager to invite new player to rated games
- if (!bg->isRated() && bg->GetBracketId() == bracket_id &&
- bg->GetStatus() > STATUS_WAIT_QUEUE && bg->GetStatus() < STATUS_WAIT_LEAVE)
+ if (mapId == -1)
+ break;
+
+ BGFreeSlotQueueContainer& bgQueues = sBattlegroundMgr->GetBGFreeSlotQueueStore(mapId);
+ for (BGFreeSlotQueueContainer::iterator itr = bgQueues.begin(); itr != bgQueues.end();)
{
- // clear selection pools
- m_SelectionPools[TEAM_ALLIANCE].Init();
- m_SelectionPools[TEAM_HORDE].Init();
+ Battleground* bg = *itr; ++itr;
+ // DO NOT allow queue manager to invite new player to rated games
+ if (!bg->isRated() && bg->GetBracketId() == bracket_id &&
+ bg->GetStatus() > STATUS_WAIT_QUEUE && bg->GetStatus() < STATUS_WAIT_LEAVE)
+ {
+ // clear selection pools
+ m_SelectionPools[TEAM_ALLIANCE].Init();
+ m_SelectionPools[TEAM_HORDE].Init();
- // call a function that does the job for us
- FillPlayersToBG(bg, bracket_id);
+ // call a function that does the job for us
+ FillPlayersToBG(bg, bracket_id);
- // now everything is set, invite players
- for (GroupsQueueType::const_iterator citr = m_SelectionPools[TEAM_ALLIANCE].SelectedGroups.begin(); citr != m_SelectionPools[TEAM_ALLIANCE].SelectedGroups.end(); ++citr)
- InviteGroupToBG((*citr), bg, (*citr)->Team);
+ // now everything is set, invite players
+ for (GroupsQueueType::const_iterator citr = m_SelectionPools[TEAM_ALLIANCE].SelectedGroups.begin(); citr != m_SelectionPools[TEAM_ALLIANCE].SelectedGroups.end(); ++citr)
+ InviteGroupToBG((*citr), bg, (*citr)->Team);
- for (GroupsQueueType::const_iterator citr = m_SelectionPools[TEAM_HORDE].SelectedGroups.begin(); citr != m_SelectionPools[TEAM_HORDE].SelectedGroups.end(); ++citr)
- InviteGroupToBG((*citr), bg, (*citr)->Team);
+ for (GroupsQueueType::const_iterator citr = m_SelectionPools[TEAM_HORDE].SelectedGroups.begin(); citr != m_SelectionPools[TEAM_HORDE].SelectedGroups.end(); ++citr)
+ InviteGroupToBG((*citr), bg, (*citr)->Team);
- if (!bg->HasFreeSlots())
- bg->RemoveFromBGFreeSlotQueue();
+ if (!bg->HasFreeSlots())
+ bg->RemoveFromBGFreeSlotQueue();
+ }
}
}
// finished iterating through the bgs with free slots, maybe we need to create a new bg
- Battleground* bg_template = sBattlegroundMgr->GetBattlegroundTemplate(BattlegroundTypeId(m_queueId.BattlemasterListId));
- if (!bg_template)
- {
- TC_LOG_ERROR("bg.battleground", "Battleground: Update: bg template not found for {}", m_queueId.BattlemasterListId);
- return;
- }
-
- PVPDifficultyEntry const* bracketEntry = DB2Manager::GetBattlegroundBracketById(bg_template->GetMapId(), bracket_id);
- if (!bracketEntry)
- {
- TC_LOG_ERROR("bg.battleground", "Battleground: Update: bg bracket entry not found for map {} bracket id {}", bg_template->GetMapId(), bracket_id);
- return;
- }
-
// get the min. players per team, properly for larger arenas as well. (must have full teams for arena matches!)
uint32 MinPlayersPerTeam = bg_template->GetMinPlayersPerTeam();
uint32 MaxPlayersPerTeam = bg_template->GetMaxPlayersPerTeam();
- if (bg_template->isArena())
+ if (bg_template->IsArena())
{
MaxPlayersPerTeam = m_queueId.TeamSize;
MinPlayersPerTeam = sBattlegroundMgr->isArenaTesting() ? 1 : m_queueId.TeamSize;
@@ -834,12 +835,12 @@ void BattlegroundQueue::BattlegroundQueueUpdate(uint32 /*diff*/, BattlegroundBra
m_SelectionPools[TEAM_ALLIANCE].Init();
m_SelectionPools[TEAM_HORDE].Init();
- if (bg_template->isBattleground())
+ if (!bg_template->IsArena())
{
if (CheckPremadeMatch(bracket_id, MinPlayersPerTeam, MaxPlayersPerTeam))
{
// create new battleground
- Battleground* bg2 = sBattlegroundMgr->CreateNewBattleground(m_queueId, bracketEntry);
+ Battleground* bg2 = sBattlegroundMgr->CreateNewBattleground(m_queueId, bracket_id);
if (!bg2)
{
TC_LOG_ERROR("bg.battleground", "BattlegroundQueue::Update - Cannot create battleground: {}", m_queueId.BattlemasterListId);
@@ -861,11 +862,11 @@ void BattlegroundQueue::BattlegroundQueueUpdate(uint32 /*diff*/, BattlegroundBra
if (!m_queueId.Rated)
{
// if there are enough players in pools, start new battleground or non rated arena
- if (CheckNormalMatch(bg_template, bracket_id, MinPlayersPerTeam, MaxPlayersPerTeam)
- || (bg_template->isArena() && CheckSkirmishForSameFaction(bracket_id, MinPlayersPerTeam)))
+ if (CheckNormalMatch(bracket_id, MinPlayersPerTeam, MaxPlayersPerTeam)
+ || (bg_template->IsArena() && CheckSkirmishForSameFaction(bracket_id, MinPlayersPerTeam)))
{
// we successfully created a pool
- Battleground* bg2 = sBattlegroundMgr->CreateNewBattleground(m_queueId, bracketEntry);
+ Battleground* bg2 = sBattlegroundMgr->CreateNewBattleground(m_queueId, bracket_id);
if (!bg2)
{
TC_LOG_ERROR("bg.battleground", "BattlegroundQueue::Update - Cannot create battleground: {}", m_queueId.BattlemasterListId);
@@ -880,7 +881,7 @@ void BattlegroundQueue::BattlegroundQueueUpdate(uint32 /*diff*/, BattlegroundBra
bg2->StartBattleground();
}
}
- else if (bg_template->isArena())
+ else if (bg_template->IsArena())
{
// found out the minimum and maximum ratings the newly added team should battle against
// arenaRating is the rating of the latest joined team, or 0
@@ -964,7 +965,7 @@ void BattlegroundQueue::BattlegroundQueueUpdate(uint32 /*diff*/, BattlegroundBra
{
GroupQueueInfo* aTeam = *itr_teams[TEAM_ALLIANCE];
GroupQueueInfo* hTeam = *itr_teams[TEAM_HORDE];
- Battleground* arena = sBattlegroundMgr->CreateNewBattleground(m_queueId, bracketEntry);
+ Battleground* arena = sBattlegroundMgr->CreateNewBattleground(m_queueId, bracket_id);
if (!arena)
{
TC_LOG_ERROR("bg.battleground", "BattlegroundQueue::Update couldn't create arena instance for rated arena match!");
@@ -1017,16 +1018,15 @@ bool BGQueueInviteEvent::Execute(uint64 /*e_time*/, uint32 /*p_time*/)
if (!bg)
return true;
- BattlegroundQueueTypeId bgQueueTypeId = bg->GetQueueId();
- uint32 queueSlot = player->GetBattlegroundQueueIndex(bgQueueTypeId);
+ uint32 queueSlot = player->GetBattlegroundQueueIndex(m_QueueId);
if (queueSlot < PLAYER_MAX_BATTLEGROUND_QUEUES) // player is in queue or in battleground
{
// check if player is invited to this bg
- BattlegroundQueue &bgQueue = sBattlegroundMgr->GetBattlegroundQueue(bgQueueTypeId);
+ BattlegroundQueue &bgQueue = sBattlegroundMgr->GetBattlegroundQueue(m_QueueId);
if (bgQueue.IsPlayerInvited(m_PlayerGuid, m_BgInstanceGUID, m_RemoveTime))
{
WorldPackets::Battleground::BattlefieldStatusNeedConfirmation battlefieldStatus;
- sBattlegroundMgr->BuildBattlegroundStatusNeedConfirmation(&battlefieldStatus, bg, player, queueSlot, player->GetBattlegroundQueueJoinTime(bgQueueTypeId), INVITE_ACCEPT_WAIT_TIME - INVITATION_REMIND_TIME, m_ArenaType);
+ sBattlegroundMgr->BuildBattlegroundStatusNeedConfirmation(&battlefieldStatus, bg, player, queueSlot, player->GetBattlegroundQueueJoinTime(m_QueueId), INVITE_ACCEPT_WAIT_TIME - INVITATION_REMIND_TIME, m_QueueId);
player->SendDirectMessage(battlefieldStatus.Write());
}
}
diff --git a/src/server/game/Battlegrounds/BattlegroundQueue.h b/src/server/game/Battlegrounds/BattlegroundQueue.h
index 6d1c77999d9..02eb1da9f60 100644
--- a/src/server/game/Battlegrounds/BattlegroundQueue.h
+++ b/src/server/game/Battlegrounds/BattlegroundQueue.h
@@ -77,7 +77,7 @@ class TC_GAME_API BattlegroundQueue
void FillPlayersToBG(Battleground* bg, BattlegroundBracketId bracket_id);
bool CheckPremadeMatch(BattlegroundBracketId bracket_id, uint32 MinPlayersPerTeam, uint32 MaxPlayersPerTeam);
- bool CheckNormalMatch(Battleground* bg_template, BattlegroundBracketId bracket_id, uint32 minPlayers, uint32 maxPlayers);
+ bool CheckNormalMatch(BattlegroundBracketId bracket_id, uint32 minPlayers, uint32 maxPlayers);
bool CheckSkirmishForSameFaction(BattlegroundBracketId bracket_id, uint32 minPlayersPerTeam);
GroupQueueInfo* AddGroup(Player const* leader, Group const* group, Team team, PVPDifficultyEntry const* bracketEntry, bool isPremade, uint32 ArenaRating, uint32 MatchmakerRating, uint32 ArenaTeamId = 0);
void RemovePlayer(ObjectGuid guid, bool decreaseInvitedCount);
@@ -143,8 +143,8 @@ class TC_GAME_API BattlegroundQueue
class TC_GAME_API BGQueueInviteEvent : public BasicEvent
{
public:
- BGQueueInviteEvent(ObjectGuid pl_guid, uint32 BgInstanceGUID, BattlegroundTypeId BgTypeId, uint8 arenaType, uint32 removeTime) :
- m_PlayerGuid(pl_guid), m_BgInstanceGUID(BgInstanceGUID), m_BgTypeId(BgTypeId), m_ArenaType(arenaType), m_RemoveTime(removeTime)
+ BGQueueInviteEvent(ObjectGuid pl_guid, uint32 BgInstanceGUID, BattlegroundTypeId BgTypeId, uint32 removeTime, BattlegroundQueueTypeId queueId) :
+ m_PlayerGuid(pl_guid), m_BgInstanceGUID(BgInstanceGUID), m_BgTypeId(BgTypeId), m_RemoveTime(removeTime), m_QueueId(queueId)
{ }
virtual ~BGQueueInviteEvent() { }
@@ -154,8 +154,8 @@ class TC_GAME_API BGQueueInviteEvent : public BasicEvent
ObjectGuid m_PlayerGuid;
uint32 m_BgInstanceGUID;
BattlegroundTypeId m_BgTypeId;
- uint8 m_ArenaType;
uint32 m_RemoveTime;
+ BattlegroundQueueTypeId m_QueueId;
};
/*
diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundAB.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundAB.cpp
index 07aeb6ef5d8..489f004b18b 100644
--- a/src/server/game/Battlegrounds/Zones/BattlegroundAB.cpp
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundAB.cpp
@@ -131,10 +131,10 @@ void BattlegroundAB::StartingEventOpenDoors()
TriggerGameEvent(AB_EVENT_START_BATTLE);
}
-void BattlegroundAB::AddPlayer(Player* player)
+void BattlegroundAB::AddPlayer(Player* player, BattlegroundQueueTypeId queueId)
{
bool const isInBattleground = IsPlayerInBattleground(player->GetGUID());
- Battleground::AddPlayer(player);
+ Battleground::AddPlayer(player, queueId);
if (!isInBattleground)
PlayerScores[player->GetGUID()] = new BattlegroundABScore(player->GetGUID(), player->GetBGTeam());
}
diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundAB.h b/src/server/game/Battlegrounds/Zones/BattlegroundAB.h
index 19c786b3614..44d98227a8c 100644
--- a/src/server/game/Battlegrounds/Zones/BattlegroundAB.h
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundAB.h
@@ -266,7 +266,7 @@ class BattlegroundAB : public Battleground
BattlegroundAB(BattlegroundTemplate const* battlegroundTemplate);
~BattlegroundAB();
- void AddPlayer(Player* player) override;
+ void AddPlayer(Player* player, BattlegroundQueueTypeId queueId) override;
void StartingEventOpenDoors() override;
void RemovePlayer(Player* player, ObjectGuid guid, uint32 team) override;
void HandleAreaTrigger(Player* source, uint32 trigger, bool entered) override;
diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp
index be75e338ed8..2a5a5aa1ae1 100644
--- a/src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundAV.cpp
@@ -438,10 +438,10 @@ void BattlegroundAV::StartingEventOpenDoors()
TriggerGameEvent(BG_AV_EVENT_START_BATTLE);
}
-void BattlegroundAV::AddPlayer(Player* player)
+void BattlegroundAV::AddPlayer(Player* player, BattlegroundQueueTypeId queueId)
{
bool const isInBattleground = IsPlayerInBattleground(player->GetGUID());
- Battleground::AddPlayer(player);
+ Battleground::AddPlayer(player, queueId);
if (!isInBattleground)
PlayerScores[player->GetGUID()] = new BattlegroundAVScore(player->GetGUID(), player->GetBGTeam());
}
diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundAV.h b/src/server/game/Battlegrounds/Zones/BattlegroundAV.h
index 24cdced6cc3..d857773b6eb 100644
--- a/src/server/game/Battlegrounds/Zones/BattlegroundAV.h
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundAV.h
@@ -1650,7 +1650,7 @@ class BattlegroundAV : public Battleground
~BattlegroundAV();
/* inherited from BattlegroundClass */
- void AddPlayer(Player* player) override;
+ void AddPlayer(Player* player, BattlegroundQueueTypeId queueId) override;
void StartingEventCloseDoors() override;
void StartingEventOpenDoors() override;
diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp
index f33ae2b444d..e258b762f68 100644
--- a/src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundEY.cpp
@@ -29,13 +29,6 @@
#include "SpellInfo.h"
#include "Util.h"
-// these variables aren't used outside of this file, so declare them only here
-uint32 BG_EY_HonorScoreTicks[BG_HONOR_MODE_NUM] =
-{
- 260, // normal honor
- 160 // holiday
-};
-
BattlegroundEY::BattlegroundEY(BattlegroundTemplate const* battlegroundTemplate) : Battleground(battlegroundTemplate)
{
BgObjects.resize(BG_EY_OBJECT_MAX);
@@ -376,10 +369,10 @@ void BattlegroundEY::UpdatePointsIcons(uint32 Team, uint32 Point)
}
}
-void BattlegroundEY::AddPlayer(Player* player)
+void BattlegroundEY::AddPlayer(Player* player, BattlegroundQueueTypeId queueId)
{
bool const isInBattleground = IsPlayerInBattleground(player->GetGUID());
- Battleground::AddPlayer(player);
+ Battleground::AddPlayer(player, queueId);
if (!isInBattleground)
PlayerScores[player->GetGUID()] = new BattlegroundEYScore(player->GetGUID(), player->GetBGTeam());
diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundEY.h b/src/server/game/Battlegrounds/Zones/BattlegroundEY.h
index 3f77ab0afde..6b047836742 100644
--- a/src/server/game/Battlegrounds/Zones/BattlegroundEY.h
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundEY.h
@@ -420,7 +420,7 @@ class BattlegroundEY : public Battleground
~BattlegroundEY();
/* inherited from BattlegroundClass */
- void AddPlayer(Player* player) override;
+ void AddPlayer(Player* player, BattlegroundQueueTypeId queueId) override;
void StartingEventCloseDoors() override;
void StartingEventOpenDoors() override;
diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundIC.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundIC.cpp
index a41cd3347b9..12bfcb9ab4d 100644
--- a/src/server/game/Battlegrounds/Zones/BattlegroundIC.cpp
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundIC.cpp
@@ -242,10 +242,10 @@ void BattlegroundIC::StartingEventOpenDoors()
GetBGObject(BG_IC_TeleporterEffects[i].type)->SetGoState(GO_STATE_ACTIVE);
}
-void BattlegroundIC::AddPlayer(Player* player)
+void BattlegroundIC::AddPlayer(Player* player, BattlegroundQueueTypeId queueId)
{
bool const isInBattleground = IsPlayerInBattleground(player->GetGUID());
- Battleground::AddPlayer(player);
+ Battleground::AddPlayer(player, queueId);
if (!isInBattleground)
PlayerScores[player->GetGUID()] = new BattlegroundICScore(player->GetGUID(), player->GetBGTeam());
diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundIC.h b/src/server/game/Battlegrounds/Zones/BattlegroundIC.h
index dd4b7776572..58cc337a991 100644
--- a/src/server/game/Battlegrounds/Zones/BattlegroundIC.h
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundIC.h
@@ -965,7 +965,7 @@ class BattlegroundIC : public Battleground
~BattlegroundIC();
/* inherited from BattlegroundClass */
- void AddPlayer(Player* player) override;
+ void AddPlayer(Player* player, BattlegroundQueueTypeId queueId) override;
void StartingEventCloseDoors() override;
void StartingEventOpenDoors() override;
void PostUpdateImpl(uint32 diff) override;
diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundSA.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundSA.cpp
index 27fb91ae668..825fbe3b5c9 100644
--- a/src/server/game/Battlegrounds/Zones/BattlegroundSA.cpp
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundSA.cpp
@@ -428,10 +428,10 @@ void BattlegroundSA::PostUpdateImpl(uint32 diff)
}
}
-void BattlegroundSA::AddPlayer(Player* player)
+void BattlegroundSA::AddPlayer(Player* player, BattlegroundQueueTypeId queueId)
{
bool const isInBattleground = IsPlayerInBattleground(player->GetGUID());
- Battleground::AddPlayer(player);
+ Battleground::AddPlayer(player, queueId);
if (!isInBattleground)
PlayerScores[player->GetGUID()] = new BattlegroundSAScore(player->GetGUID(), player->GetBGTeam());
diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundSA.h b/src/server/game/Battlegrounds/Zones/BattlegroundSA.h
index 93f62c31091..bde9e3a298b 100644
--- a/src/server/game/Battlegrounds/Zones/BattlegroundSA.h
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundSA.h
@@ -582,7 +582,7 @@ class BattlegroundSA : public Battleground
/* inherited from BattlegroundClass */
/// Called when a player join battle
- void AddPlayer(Player* player) override;
+ void AddPlayer(Player* player, BattlegroundQueueTypeId queueId) override;
/// Called for ini battleground, after that the first player be entered
bool SetupBattleground() override;
void Reset() override;
diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp b/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp
index 61b94d03d8b..aa84185f559 100644
--- a/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundWS.cpp
@@ -37,7 +37,7 @@ enum BG_WSG_Rewards
BG_WSG_REWARD_NUM
};
-uint32 BG_WSG_Honor[BG_HONOR_MODE_NUM][BG_WSG_REWARD_NUM] =
+uint32 BG_WSG_Honor[2][BG_WSG_REWARD_NUM] =
{
{20, 40, 40}, // normal honor
{60, 40, 80} // holiday
@@ -226,10 +226,10 @@ void BattlegroundWS::StartingEventOpenDoors()
TriggerGameEvent(WS_EVENT_START_BATTLE);
}
-void BattlegroundWS::AddPlayer(Player* player)
+void BattlegroundWS::AddPlayer(Player* player, BattlegroundQueueTypeId queueId)
{
bool const isInBattleground = IsPlayerInBattleground(player->GetGUID());
- Battleground::AddPlayer(player);
+ Battleground::AddPlayer(player, queueId);
if (!isInBattleground)
PlayerScores[player->GetGUID()] = new BattlegroundWGScore(player->GetGUID(), player->GetBGTeam());
}
@@ -361,7 +361,7 @@ void BattlegroundWS::EventPlayerCapturedFlag(Player* player)
UpdateWorldState(BG_WS_FLAG_STATE_HORDE, 1);
UpdateWorldState(BG_WS_STATE_TIMER_ACTIVE, 0);
- RewardHonorToTeam(BG_WSG_Honor[m_HonorMode][BG_WSG_WIN], winner);
+ RewardHonorToTeam(BG_WSG_Honor[BattlegroundMgr::IsBGWeekend(BATTLEGROUND_WS) ? 1 : 0][BG_WSG_WIN], winner);
EndBattleground(winner);
}
else
diff --git a/src/server/game/Battlegrounds/Zones/BattlegroundWS.h b/src/server/game/Battlegrounds/Zones/BattlegroundWS.h
index 156eb8dd87b..8a4269ef583 100644
--- a/src/server/game/Battlegrounds/Zones/BattlegroundWS.h
+++ b/src/server/game/Battlegrounds/Zones/BattlegroundWS.h
@@ -222,7 +222,7 @@ class BattlegroundWS : public Battleground
~BattlegroundWS();
/* inherited from BattlegroundClass */
- void AddPlayer(Player* player) override;
+ void AddPlayer(Player* player, BattlegroundQueueTypeId queueId) override;
void StartingEventCloseDoors() override;
void StartingEventOpenDoors() override;
diff --git a/src/server/game/Entities/GameObject/GameObject.cpp b/src/server/game/Entities/GameObject/GameObject.cpp
index 75b9590ece9..ad7e9c68127 100644
--- a/src/server/game/Entities/GameObject/GameObject.cpp
+++ b/src/server/game/Entities/GameObject/GameObject.cpp
@@ -2921,11 +2921,11 @@ void GameObject::Use(Unit* user)
{
case 179785: // Silverwing Flag
case 179786: // Warsong Flag
- if (bg->GetTypeID(true) == BATTLEGROUND_WS)
+ if (bg->GetTypeID() == BATTLEGROUND_WS)
bg->EventPlayerClickedOnFlag(player, this);
break;
case 184142: // Netherstorm Flag
- if (bg->GetTypeID(true) == BATTLEGROUND_EY)
+ if (bg->GetTypeID() == BATTLEGROUND_EY)
bg->EventPlayerClickedOnFlag(player, this);
break;
}
diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp
index 03483e5763b..4a6b11f002a 100644
--- a/src/server/game/Entities/Player/Player.cpp
+++ b/src/server/game/Entities/Player/Player.cpp
@@ -8986,7 +8986,7 @@ void Player::RemovedInsignia(Player* looterPlr)
// For AV Achievement
if (Battleground* bg = GetBattleground())
{
- if (bg->GetTypeID(true) == BATTLEGROUND_AV)
+ if (bg->GetTypeID() == BATTLEGROUND_AV)
bones->m_loot->FillLoot(PLAYER_CORPSE_LOOT_ENTRY, LootTemplates_Creature, this, true);
}
// For wintergrasp Quests
@@ -17246,8 +17246,8 @@ void Player::_LoadBGData(PreparedQueryResult result)
Field* fields = result->Fetch();
// Expecting only one row
- // 0 1 2 3 4 5 6 7 8 9
- // SELECT instanceId, team, joinX, joinY, joinZ, joinO, joinMapId, taxiStart, taxiEnd, mountSpell FROM character_battleground_data WHERE guid = ?
+ // 0 1 2 3 4 5 6 7 8 9 10
+ // SELECT instanceId, team, joinX, joinY, joinZ, joinO, joinMapId, taxiStart, taxiEnd, mountSpell, queueTypeId FROM character_battleground_data WHERE guid = ?
m_bgData.bgInstanceID = fields[0].GetUInt32();
m_bgData.bgTeam = fields[1].GetUInt16();
@@ -17259,6 +17259,7 @@ void Player::_LoadBGData(PreparedQueryResult result)
m_bgData.taxiPath[0] = fields[7].GetUInt32();
m_bgData.taxiPath[1] = fields[8].GetUInt32();
m_bgData.mountSpell = fields[9].GetUInt32();
+ m_bgData.queueId = BattlegroundQueueTypeId::FromPacked(fields[10].GetUInt64());
}
bool Player::LoadPositionFromDB(uint32& mapid, float& x, float& y, float& z, float& o, bool& in_flight, ObjectGuid guid)
@@ -17649,16 +17650,17 @@ bool Player::LoadFromDB(ObjectGuid guid, CharacterDatabaseQueryHolder const& hol
{
map = currentBg->GetBgMap();
- BattlegroundQueueTypeId bgQueueTypeId = currentBg->GetQueueId();
- AddBattlegroundQueueId(bgQueueTypeId);
-
- m_bgData.bgTypeID = currentBg->GetTypeID();
+ if (BattlegroundPlayer const* bgPlayer = currentBg->GetBattlegroundPlayerData(GetGUID()))
+ {
+ AddBattlegroundQueueId(bgPlayer->queueTypeId);
+ m_bgData.bgTypeID = BattlegroundTypeId(bgPlayer->queueTypeId.BattlemasterListId);
- //join player to battleground group
- currentBg->EventPlayerLoggedIn(this);
+ //join player to battleground group
+ currentBg->EventPlayerLoggedIn(this);
- SetInviteForBattlegroundQueueType(bgQueueTypeId, currentBg->GetInstanceID());
- SetMercenaryForBattlegroundQueueType(bgQueueTypeId, currentBg->IsPlayerMercenaryInBattleground(GetGUID()));
+ SetInviteForBattlegroundQueueType(bgPlayer->queueTypeId, currentBg->GetInstanceID());
+ SetMercenaryForBattlegroundQueueType(bgPlayer->queueTypeId, currentBg->IsPlayerMercenaryInBattleground(GetGUID()));
+ }
}
// Bg was not found - go to Entry Point
else
@@ -17873,7 +17875,7 @@ bool Player::LoadFromDB(ObjectGuid guid, CharacterDatabaseQueryHolder const& hol
m_InstanceValid = false;
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]
// this must help in case next save after mass player load after server startup
@@ -23312,12 +23314,12 @@ void Player::LeaveBattleground(bool teleportToEntryPoint)
}
}
-bool Player::CanJoinToBattleground(Battleground const* bg) const
+bool Player::CanJoinToBattleground(BattlegroundTemplate const* bg) const
{
uint32 perm = rbac::RBAC_PERM_JOIN_NORMAL_BG;
- if (bg->isArena())
+ if (bg->IsArena())
perm = rbac::RBAC_PERM_JOIN_ARENAS;
- else if (bg->IsRandom())
+ else if (BattlegroundMgr::IsRandomBattleground(bg->Id))
perm = rbac::RBAC_PERM_JOIN_RANDOM_BG;
return GetSession()->HasPermission(perm);
@@ -24608,10 +24610,11 @@ bool Player::InBattlegroundQueueForBattlegroundQueueType(BattlegroundQueueTypeId
return GetBattlegroundQueueIndex(bgQueueTypeId) < PLAYER_MAX_BATTLEGROUND_QUEUES;
}
-void Player::SetBattlegroundId(uint32 val, BattlegroundTypeId bgTypeId)
+void Player::SetBattlegroundId(uint32 val, BattlegroundTypeId bgTypeId, BattlegroundQueueTypeId queueId)
{
m_bgData.bgInstanceID = val;
m_bgData.bgTypeID = bgTypeId;
+ m_bgData.queueId = queueId;
}
uint32 Player::AddBattlegroundQueueId(BattlegroundQueueTypeId val)
@@ -24695,7 +24698,7 @@ bool Player::InArena() const
bool Player::GetBGAccessByLevel(BattlegroundTypeId bgTypeId) const
{
// get a template bg instead of running one
- Battleground* bg = sBattlegroundMgr->GetBattlegroundTemplate(bgTypeId);
+ BattlegroundTemplate const* bg = sBattlegroundMgr->GetBattlegroundTemplateByTypeId(bgTypeId);
if (!bg)
return false;
@@ -26956,6 +26959,7 @@ void Player::_SaveBGData(CharacterDatabaseTransaction trans)
stmt->setUInt32(8, m_bgData.taxiPath[0]);
stmt->setUInt32(9, m_bgData.taxiPath[1]);
stmt->setUInt32(10, m_bgData.mountSpell);
+ stmt->setUInt64(11, m_bgData.queueId.GetPacked());
trans->Append(stmt);
}
diff --git a/src/server/game/Entities/Player/Player.h b/src/server/game/Entities/Player/Player.h
index 4545d302bb7..c328092ac41 100644
--- a/src/server/game/Entities/Player/Player.h
+++ b/src/server/game/Entities/Player/Player.h
@@ -43,6 +43,7 @@ struct AzeriteEssencePowerEntry;
struct AzeriteItemMilestonePowerEntry;
struct AzeritePowerEntry;
struct BarberShopStyleEntry;
+struct BattlegroundTemplate;
struct CharTitlesEntry;
struct ChatChannelsEntry;
struct ChrSpecializationEntry;
@@ -990,7 +991,7 @@ class Player;
struct BGData
{
BGData() : bgInstanceID(0), bgTypeID(BATTLEGROUND_TYPE_NONE), bgAfkReportedCount(0), bgAfkReportedTimer(0),
- bgTeam(0), mountSpell(0) { ClearTaxiPath(); }
+ bgTeam(0), mountSpell(0), queueId(BATTLEGROUND_QUEUE_NONE) { ClearTaxiPath(); }
uint32 bgInstanceID; ///< This variable is set to bg->m_InstanceID,
/// when player is teleported to BG - (it is battleground's GUID)
@@ -1006,6 +1007,7 @@ struct BGData
uint32 taxiPath[2];
WorldLocation joinPos; ///< From where player entered BG
+ BattlegroundQueueTypeId queueId;
void ClearTaxiPath() { taxiPath[0] = taxiPath[1] = 0; }
bool HasTaxiPath() const { return taxiPath[0] && taxiPath[1]; }
@@ -2393,7 +2395,7 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
bool IsInvitedForBattlegroundQueueType(BattlegroundQueueTypeId bgQueueTypeId) const;
bool InBattlegroundQueueForBattlegroundQueueType(BattlegroundQueueTypeId bgQueueTypeId) const;
- void SetBattlegroundId(uint32 val, BattlegroundTypeId bgTypeId);
+ void SetBattlegroundId(uint32 val, BattlegroundTypeId bgTypeId, BattlegroundQueueTypeId queueId);
uint32 AddBattlegroundQueueId(BattlegroundQueueTypeId val);
bool HasFreeBattlegroundQueueId() const;
void RemoveBattlegroundQueueId(BattlegroundQueueTypeId val);
@@ -2408,7 +2410,7 @@ class TC_GAME_API Player : public Unit, public GridObject<Player>
uint32 GetBGTeam() const;
void LeaveBattleground(bool teleportToEntryPoint = true);
- bool CanJoinToBattleground(Battleground const* bg) const;
+ bool CanJoinToBattleground(BattlegroundTemplate const* bg) const;
bool CanReportAfkDueToLimit();
void ReportedAfkBy(Player* reporter);
void ClearAfkReports() { m_bgData.bgAfkReporter.clear(); }
diff --git a/src/server/game/Events/GameEventMgr.cpp b/src/server/game/Events/GameEventMgr.cpp
index 12e9c070bfd..59ce82d1b3c 100644
--- a/src/server/game/Events/GameEventMgr.cpp
+++ b/src/server/game/Events/GameEventMgr.cpp
@@ -871,40 +871,6 @@ void GameEventMgr::LoadFromDB()
}
}
- TC_LOG_INFO("server.loading", "Loading Game Event Battleground Holiday Data...");
- {
- uint32 oldMSTime = getMSTime();
-
- // 0 1
- QueryResult result = WorldDatabase.Query("SELECT EventEntry, BattlegroundID FROM game_event_battleground_holiday");
-
- if (!result)
- TC_LOG_INFO("server.loading", ">> Loaded 0 battleground holidays in game events. DB table `game_event_battleground_holiday` is empty.");
- else
- {
- uint32 count = 0;
- do
- {
- Field* fields = result->Fetch();
-
- uint16 event_id = fields[0].GetUInt8();
-
- if (event_id >= mGameEvent.size())
- {
- TC_LOG_ERROR("sql.sql", "`game_event_battleground_holiday`: game event id ({}) is out of range compared to max event id in `game_event`.", event_id);
- continue;
- }
-
- mGameEventBattlegroundHolidays[event_id] = fields[1].GetUInt32();
-
- ++count;
- }
- while (result->NextRow());
-
- TC_LOG_INFO("server.loading", ">> Loaded {} battleground holidays in game events in {} ms.", count, GetMSTimeDiffToNow(oldMSTime));
- }
- }
-
TC_LOG_INFO("server.loading", "Loading Game Event Pool Data...");
{
uint32 oldMSTime = getMSTime();
@@ -986,7 +952,6 @@ void GameEventMgr::Initialize()
mGameEventCreatureQuests.resize(maxEventId);
mGameEventGameObjectQuests.resize(maxEventId);
mGameEventVendors.resize(maxEventId);
- mGameEventBattlegroundHolidays.resize(maxEventId, 0);
mGameEventPoolIds.resize(maxEventId * 2 - 1);
mGameEventNPCFlags.resize(maxEventId);
mGameEventModelEquip.resize(maxEventId);
@@ -1115,8 +1080,6 @@ void GameEventMgr::UnApplyEvent(uint16 event_id)
UpdateEventNPCFlags(event_id);
// remove vendor items
UpdateEventNPCVendor(event_id, false);
- // update bg holiday
- UpdateBattlegroundSettings();
}
void GameEventMgr::ApplyNewEvent(uint16 event_id)
@@ -1141,8 +1104,6 @@ void GameEventMgr::ApplyNewEvent(uint16 event_id)
UpdateEventNPCFlags(event_id);
// add vendor items
UpdateEventNPCVendor(event_id, true);
- // update bg holiday
- UpdateBattlegroundSettings();
//! Run SAI scripts with SMART_EVENT_GAME_EVENT_START
RunSmartAIScripts(event_id, true);
@@ -1185,14 +1146,6 @@ void GameEventMgr::UpdateEventNPCFlags(uint16 event_id)
}
}
-void GameEventMgr::UpdateBattlegroundSettings()
-{
- sBattlegroundMgr->ResetHolidays();
-
- for (uint16 activeEventId : m_ActiveEvents)
- sBattlegroundMgr->SetHolidayActive(mGameEventBattlegroundHolidays[activeEventId]);
-}
-
void GameEventMgr::UpdateEventNPCVendor(uint16 event_id, bool activate)
{
for (NPCVendorMap::iterator itr = mGameEventVendors[event_id].begin(); itr != mGameEventVendors[event_id].end(); ++itr)
diff --git a/src/server/game/Events/GameEventMgr.h b/src/server/game/Events/GameEventMgr.h
index b0654119567..888c7745dad 100644
--- a/src/server/game/Events/GameEventMgr.h
+++ b/src/server/game/Events/GameEventMgr.h
@@ -130,7 +130,6 @@ class TC_GAME_API GameEventMgr
void UpdateWorldStates(uint16 event_id, bool Activate);
void UpdateEventNPCFlags(uint16 event_id);
void UpdateEventNPCVendor(uint16 event_id, bool activate);
- void UpdateBattlegroundSettings();
void RunSmartAIScripts(uint16 event_id, bool activate); //! Runs SMART_EVENT_GAME_EVENT_START/_END SAI
bool CheckOneGameEventConditions(uint16 event_id);
void SaveWorldEventStateToDB(uint16 event_id);
@@ -157,7 +156,6 @@ class TC_GAME_API GameEventMgr
typedef std::pair<ObjectGuid::LowType /*guid*/, uint64 /*npcflag*/> GuidNPCFlagPair;
typedef std::list<GuidNPCFlagPair> NPCFlagList;
typedef std::vector<NPCFlagList> GameEventNPCFlagMap;
- typedef std::vector<uint32> GameEventBattlegroundMap;
GameEventQuestMap mGameEventCreatureQuests;
GameEventQuestMap mGameEventGameObjectQuests;
GameEventNPCVendorMap mGameEventVendors;
@@ -166,7 +164,6 @@ class TC_GAME_API GameEventMgr
//GameEventGuidMap mGameEventGameobjectGuids;
GameEventIdMap mGameEventPoolIds;
GameEventDataMap mGameEvent;
- GameEventBattlegroundMap mGameEventBattlegroundHolidays;
QuestIdToEventConditionMap mQuestToEventConditions;
GameEventNPCFlagMap mGameEventNPCFlags;
ActiveEvents m_ActiveEvents;
diff --git a/src/server/game/Groups/Group.cpp b/src/server/game/Groups/Group.cpp
index f95f374a116..821ee3c7dd8 100644
--- a/src/server/game/Groups/Group.cpp
+++ b/src/server/game/Groups/Group.cpp
@@ -1167,13 +1167,13 @@ void Group::UpdateLooterGuid(WorldObject* pLootedObject, bool ifneed)
}
}
-GroupJoinBattlegroundResult Group::CanJoinBattlegroundQueue(Battleground const* bgOrTemplate, BattlegroundQueueTypeId bgQueueTypeId, uint32 MinPlayerCount, uint32 /*MaxPlayerCount*/, bool isRated, uint32 arenaSlot, ObjectGuid& errorGuid) const
+GroupJoinBattlegroundResult Group::CanJoinBattlegroundQueue(BattlegroundTemplate const* bgOrTemplate, BattlegroundQueueTypeId bgQueueTypeId, uint32 MinPlayerCount, uint32 /*MaxPlayerCount*/, bool isRated, uint32 arenaSlot, ObjectGuid& errorGuid) const
{
// check if this group is LFG group
if (isLFGGroup())
return ERR_LFG_CANT_USE_BATTLEGROUND;
- BattlemasterListEntry const* bgEntry = sBattlemasterListStore.LookupEntry(bgOrTemplate->GetTypeID());
+ BattlemasterListEntry const* bgEntry = sBattlemasterListStore.LookupEntry(bgOrTemplate->Id);
if (!bgEntry)
return ERR_BATTLEGROUND_JOIN_FAILED; // shouldn't happen
@@ -1189,7 +1189,7 @@ GroupJoinBattlegroundResult Group::CanJoinBattlegroundQueue(Battleground const*
if (!reference)
return ERR_BATTLEGROUND_JOIN_FAILED;
- PVPDifficultyEntry const* bracketEntry = DB2Manager::GetBattlegroundBracketByLevel(bgOrTemplate->GetMapId(), reference->GetLevel());
+ PVPDifficultyEntry const* bracketEntry = DB2Manager::GetBattlegroundBracketByLevel(bgOrTemplate->BattlemasterEntry->MapID[0], reference->GetLevel());
if (!bracketEntry)
return ERR_BATTLEGROUND_JOIN_FAILED;
@@ -1227,13 +1227,13 @@ GroupJoinBattlegroundResult Group::CanJoinBattlegroundQueue(Battleground const*
// don't let join if someone from the group is in bg queue random
bool isInRandomBgQueue = member->InBattlegroundQueueForBattlegroundQueueType(BattlegroundMgr::BGQueueTypeId(BATTLEGROUND_RB, BattlegroundQueueIdType::Battleground, false, 0))
|| member->InBattlegroundQueueForBattlegroundQueueType(BattlegroundMgr::BGQueueTypeId(BATTLEGROUND_RANDOM_EPIC, BattlegroundQueueIdType::Battleground, false, 0));
- if (bgOrTemplate->GetTypeID() != BATTLEGROUND_AA && isInRandomBgQueue)
+ if (bgOrTemplate->Id != BATTLEGROUND_AA && isInRandomBgQueue)
return ERR_IN_RANDOM_BG;
// don't let join to bg queue random if someone from the group is already in bg queue
- if ((bgOrTemplate->GetTypeID() == BATTLEGROUND_RB || bgOrTemplate->GetTypeID() == BATTLEGROUND_RANDOM_EPIC) && member->InBattlegroundQueue(true) && !isInRandomBgQueue)
+ if (BattlegroundMgr::IsRandomBattleground(bgOrTemplate->Id) && member->InBattlegroundQueue(true) && !isInRandomBgQueue)
return ERR_IN_NON_RANDOM_BG;
// check for deserter debuff in case not arena queue
- if (bgOrTemplate->GetTypeID() != BATTLEGROUND_AA && member->IsDeserter())
+ if (bgOrTemplate->Id != BATTLEGROUND_AA && member->IsDeserter())
return ERR_GROUP_JOIN_BATTLEGROUND_DESERTERS;
// check if member can join any more battleground queues
if (!member->HasFreeBattlegroundQueueId())
@@ -1249,7 +1249,7 @@ GroupJoinBattlegroundResult Group::CanJoinBattlegroundQueue(Battleground const*
}
// only check for MinPlayerCount since MinPlayerCount == MaxPlayerCount for arenas...
- if (bgOrTemplate->isArena() && memberscount != MinPlayerCount)
+ if (bgOrTemplate->IsArena() && memberscount != MinPlayerCount)
return ERR_ARENA_TEAM_PARTY_SIZE;
return ERR_BATTLEGROUND_NONE;
diff --git a/src/server/game/Groups/Group.h b/src/server/game/Groups/Group.h
index a3333319b29..825c8732724 100644
--- a/src/server/game/Groups/Group.h
+++ b/src/server/game/Groups/Group.h
@@ -38,6 +38,7 @@ class WorldObject;
class WorldPacket;
class WorldSession;
+struct BattlegroundTemplate;
struct ItemDisenchantLootEntry;
struct MapEntry;
@@ -292,7 +293,7 @@ class TC_GAME_API Group
void SetBattlegroundGroup(Battleground* bg);
void SetBattlefieldGroup(Battlefield* bf);
- GroupJoinBattlegroundResult CanJoinBattlegroundQueue(Battleground const* bgOrTemplate, BattlegroundQueueTypeId bgQueueTypeId, uint32 MinPlayerCount, uint32 MaxPlayerCount, bool isRated, uint32 arenaSlot, ObjectGuid& errorGuid) const;
+ GroupJoinBattlegroundResult CanJoinBattlegroundQueue(BattlegroundTemplate const* bgOrTemplate, BattlegroundQueueTypeId bgQueueTypeId, uint32 MinPlayerCount, uint32 MaxPlayerCount, bool isRated, uint32 arenaSlot, ObjectGuid& errorGuid) const;
void ChangeMembersGroup(ObjectGuid guid, uint8 group);
void SwapMembersGroups(ObjectGuid firstGuid, ObjectGuid secondGuid);
diff --git a/src/server/game/Handlers/BattleGroundHandler.cpp b/src/server/game/Handlers/BattleGroundHandler.cpp
index 6083c180b71..87ce5123100 100644
--- a/src/server/game/Handlers/BattleGroundHandler.cpp
+++ b/src/server/game/Handlers/BattleGroundHandler.cpp
@@ -95,13 +95,12 @@ void WorldSession::HandleBattlemasterJoinOpcode(WorldPackets::Battleground::Batt
if (_player->InBattleground())
return;
- // get bg instance or bg template if instance not found
- Battleground* bg = sBattlegroundMgr->GetBattlegroundTemplate(bgTypeId);
- if (!bg)
+ BattlegroundTemplate const* bgTemplate = sBattlegroundMgr->GetBattlegroundTemplateByTypeId(bgTypeId);
+ if (!bgTemplate)
return;
// expected bracket entry
- PVPDifficultyEntry const* bracketEntry = DB2Manager::GetBattlegroundBracketByLevel(bg->GetMapId(), _player->GetLevel());
+ PVPDifficultyEntry const* bracketEntry = DB2Manager::GetBattlegroundBracketByLevel(bgTemplate->BattlemasterEntry->MapID[0], _player->GetLevel());
if (!bracketEntry)
return;
@@ -112,7 +111,7 @@ void WorldSession::HandleBattlemasterJoinOpcode(WorldPackets::Battleground::Batt
auto getQueueTeam = [&]() -> Team
{
// mercenary applies only to unrated battlegrounds
- if (!bg->isRated() && !bg->isArena())
+ if (!bgQueueTypeId.Rated && !bgTemplate->IsArena())
{
if (_player->HasAura(SPELL_MERCENARY_CONTRACT_HORDE))
return HORDE;
@@ -136,7 +135,7 @@ void WorldSession::HandleBattlemasterJoinOpcode(WorldPackets::Battleground::Batt
}
// check RBAC permissions
- if (!_player->CanJoinToBattleground(bg))
+ if (!_player->CanJoinToBattleground(bgTemplate))
{
WorldPackets::Battleground::BattlefieldStatusFailed battlefieldStatus;
sBattlegroundMgr->BuildBattlegroundStatusFailed(&battlefieldStatus, bgQueueTypeId, _player, 0, ERR_BATTLEGROUND_JOIN_TIMED_OUT);
@@ -155,7 +154,7 @@ void WorldSession::HandleBattlemasterJoinOpcode(WorldPackets::Battleground::Batt
bool isInRandomBgQueue = _player->InBattlegroundQueueForBattlegroundQueueType(BattlegroundMgr::BGQueueTypeId(BATTLEGROUND_RB, BattlegroundQueueIdType::Battleground, false, 0))
|| _player->InBattlegroundQueueForBattlegroundQueueType(BattlegroundMgr::BGQueueTypeId(BATTLEGROUND_RANDOM_EPIC, BattlegroundQueueIdType::Battleground, false, 0));
- if (bgTypeId != BATTLEGROUND_RB && bgTypeId != BATTLEGROUND_RANDOM_EPIC && isInRandomBgQueue)
+ if (!BattlegroundMgr::IsRandomBattleground(bgTypeId) && isInRandomBgQueue)
{
// player is already in random queue
WorldPackets::Battleground::BattlefieldStatusFailed battlefieldStatus;
@@ -164,7 +163,7 @@ void WorldSession::HandleBattlemasterJoinOpcode(WorldPackets::Battleground::Batt
return;
}
- if (_player->InBattlegroundQueue(true) && !isInRandomBgQueue && (bgTypeId == BATTLEGROUND_RB || bgTypeId == BATTLEGROUND_RANDOM_EPIC))
+ if (_player->InBattlegroundQueue(true) && !isInRandomBgQueue && BattlegroundMgr::IsRandomBattleground(bgTypeId))
{
// player is already in queue, can't start random queue
WorldPackets::Battleground::BattlefieldStatusFailed battlefieldStatus;
@@ -197,7 +196,7 @@ void WorldSession::HandleBattlemasterJoinOpcode(WorldPackets::Battleground::Batt
uint32 queueSlot = _player->AddBattlegroundQueueId(bgQueueTypeId);
WorldPackets::Battleground::BattlefieldStatusQueued battlefieldStatus;
- sBattlegroundMgr->BuildBattlegroundStatusQueued(&battlefieldStatus, bg, _player, queueSlot, ginfo->JoinTime, bgQueueTypeId, avgTime, 0, false);
+ sBattlegroundMgr->BuildBattlegroundStatusQueued(&battlefieldStatus, _player, queueSlot, ginfo->JoinTime, bgQueueTypeId, avgTime, false);
SendPacket(battlefieldStatus.Write());
TC_LOG_DEBUG("bg.battleground", "Battleground: player joined queue for bg queue {{ BattlemasterListId: {}, Type: {}, Rated: {}, TeamSize: {} }}, {}, NAME {}",
@@ -210,8 +209,8 @@ void WorldSession::HandleBattlemasterJoinOpcode(WorldPackets::Battleground::Batt
return;
ObjectGuid errorGuid;
- err = grp->CanJoinBattlegroundQueue(bg, bgQueueTypeId, 0, bg->GetMaxPlayersPerTeam(), false, 0, errorGuid);
- isPremade = (grp->GetMembersCount() >= bg->GetMinPlayersPerTeam());
+ err = grp->CanJoinBattlegroundQueue(bgTemplate, bgQueueTypeId, 0, bgTemplate->GetMaxPlayersPerTeam(), false, 0, errorGuid);
+ isPremade = (grp->GetMembersCount() >= bgTemplate->GetMinPlayersPerTeam());
BattlegroundQueue& bgQueue = sBattlegroundMgr->GetBattlegroundQueue(bgQueueTypeId);
GroupQueueInfo* ginfo = nullptr;
@@ -242,7 +241,7 @@ void WorldSession::HandleBattlemasterJoinOpcode(WorldPackets::Battleground::Batt
uint32 queueSlot = member->AddBattlegroundQueueId(bgQueueTypeId);
WorldPackets::Battleground::BattlefieldStatusQueued battlefieldStatus;
- sBattlegroundMgr->BuildBattlegroundStatusQueued(&battlefieldStatus, bg, member, queueSlot, ginfo->JoinTime, bgQueueTypeId, avgTime, 0, true);
+ sBattlegroundMgr->BuildBattlegroundStatusQueued(&battlefieldStatus, member, queueSlot, ginfo->JoinTime, bgQueueTypeId, avgTime, true);
member->SendDirectMessage(battlefieldStatus.Write());
TC_LOG_DEBUG("bg.battleground", "Battleground: player joined queue for bg queue {{ BattlemasterListId: {}, Type: {}, Rated: {}, TeamSize: {} }}, {}, NAME {}",
bgQueueTypeId.BattlemasterListId, uint32(bgQueueTypeId.Type), bgQueueTypeId.Rated ? "true" : "false", uint32(bgQueueTypeId.TeamSize),
@@ -317,34 +316,32 @@ void WorldSession::HandleBattleFieldPortOpcode(WorldPackets::Battleground::Battl
}
BattlegroundTypeId bgTypeId = BattlegroundTypeId(bgQueueTypeId.BattlemasterListId);
+ BattlegroundTemplate const* bgTemplate = sBattlegroundMgr->GetBattlegroundTemplateByTypeId(bgTypeId);
+ if (!bgTemplate)
+ {
+ TC_LOG_ERROR("network", "BattlegroundHandle: BattlegroundTemplate not found for type id {}.", bgTypeId);
+ return;
+ }
+
+ uint32 mapId = bgTemplate->BattlemasterEntry->MapID[0];
+
// BGTemplateId returns BATTLEGROUND_AA when it is arena queue.
// Do instance id search as there is no AA bg instances.
Battleground* bg = sBattlegroundMgr->GetBattleground(ginfo.IsInvitedToBGInstanceGUID, bgTypeId == BATTLEGROUND_AA ? BATTLEGROUND_TYPE_NONE : bgTypeId);
- if (!bg)
+ if (!bg && battlefieldPort.AcceptedInvite)
{
- if (battlefieldPort.AcceptedInvite)
- {
- TC_LOG_DEBUG("bg.battleground", "CMSG_BATTLEFIELD_PORT {} Slot: {}, Unk: {}, Time: {}, AcceptedInvite: {}. Cant find BG with id {}!",
- GetPlayerInfo(), battlefieldPort.Ticket.Id, uint32(battlefieldPort.Ticket.Type), battlefieldPort.Ticket.Time.AsUnderlyingType(), uint32(battlefieldPort.AcceptedInvite), ginfo.IsInvitedToBGInstanceGUID);
- return;
- }
-
- bg = sBattlegroundMgr->GetBattlegroundTemplate(bgTypeId);
- if (!bg)
- {
- TC_LOG_ERROR("network", "BattlegroundHandler: bg_template not found for type id {}.", bgTypeId);
- return;
- }
+ TC_LOG_DEBUG("bg.battleground", "CMSG_BATTLEFIELD_PORT {} Slot: {}, Unk: {}, Time: {}, AcceptedInvite: {}. Cant find BG with id {}!",
+ GetPlayerInfo(), battlefieldPort.Ticket.Id, uint32(battlefieldPort.Ticket.Type), battlefieldPort.Ticket.Time.AsUnderlyingType(), uint32(battlefieldPort.AcceptedInvite), ginfo.IsInvitedToBGInstanceGUID);
+ return;
}
+ else if (bg)
+ mapId = bg->GetMapId();
TC_LOG_DEBUG("bg.battleground", "CMSG_BATTLEFIELD_PORT {} Slot: {}, Unk: {}, Time: {}, AcceptedInvite: {}.",
GetPlayerInfo(), battlefieldPort.Ticket.Id, uint32(battlefieldPort.Ticket.Type), battlefieldPort.Ticket.Time.AsUnderlyingType(), uint32(battlefieldPort.AcceptedInvite));
- // get real bg type
- bgTypeId = bg->GetTypeID();
-
// expected bracket entry
- PVPDifficultyEntry const* bracketEntry = DB2Manager::GetBattlegroundBracketByLevel(bg->GetMapId(), _player->GetLevel());
+ PVPDifficultyEntry const* bracketEntry = DB2Manager::GetBattlegroundBracketByLevel(mapId, _player->GetLevel());
if (!bracketEntry)
return;
@@ -392,7 +389,7 @@ void WorldSession::HandleBattleFieldPortOpcode(WorldPackets::Battleground::Battl
_player->FinishTaxiFlight();
WorldPackets::Battleground::BattlefieldStatusActive battlefieldStatus;
- sBattlegroundMgr->BuildBattlegroundStatusActive(&battlefieldStatus, bg, _player, battlefieldPort.Ticket.Id, _player->GetBattlegroundQueueJoinTime(bgQueueTypeId), bg->GetArenaType());
+ sBattlegroundMgr->BuildBattlegroundStatusActive(&battlefieldStatus, bg, _player, battlefieldPort.Ticket.Id, _player->GetBattlegroundQueueJoinTime(bgQueueTypeId), bgQueueTypeId);
SendPacket(battlefieldStatus.Write());
// remove battleground queue status from BGmgr
@@ -403,7 +400,7 @@ void WorldSession::HandleBattleFieldPortOpcode(WorldPackets::Battleground::Battl
currentBg->RemovePlayerAtLeave(_player->GetGUID(), false, true);
// set the destination instance id
- _player->SetBattlegroundId(bg->GetInstanceID(), bgTypeId);
+ _player->SetBattlegroundId(bg->GetInstanceID(), bg->GetTypeID(), bgQueueTypeId);
// set the destination team
_player->SetBGTeam(ginfo.Team);
@@ -466,16 +463,19 @@ void WorldSession::HandleRequestBattlefieldStatusOpcode(WorldPackets::Battlegrou
if (bgQueueTypeId == BATTLEGROUND_QUEUE_NONE)
continue;
BattlegroundTypeId bgTypeId = BattlegroundTypeId(bgQueueTypeId.BattlemasterListId);
- uint8 arenaType = bgQueueTypeId.TeamSize;
bg = _player->GetBattleground();
- if (bg && bg->GetQueueId() == bgQueueTypeId)
+ if (bg)
{
- //i cannot check any variable from player class because player class doesn't know if player is in 2v2 / 3v3 or 5v5 arena
- //so i must use bg pointer to get that information
- WorldPackets::Battleground::BattlefieldStatusActive battlefieldStatus;
- sBattlegroundMgr->BuildBattlegroundStatusActive(&battlefieldStatus, bg, _player, i, _player->GetBattlegroundQueueJoinTime(bgQueueTypeId), arenaType);
- SendPacket(battlefieldStatus.Write());
- continue;
+ BattlegroundPlayer const* bgPlayer = bg->GetBattlegroundPlayerData(_player->GetGUID());
+ if (bgPlayer && bgPlayer->queueTypeId == bgQueueTypeId)
+ {
+ //i cannot check any variable from player class because player class doesn't know if player is in 2v2 / 3v3 or 5v5 arena
+ //so i must use bg pointer to get that information
+ WorldPackets::Battleground::BattlefieldStatusActive battlefieldStatus;
+ sBattlegroundMgr->BuildBattlegroundStatusActive(&battlefieldStatus, bg, _player, i, _player->GetBattlegroundQueueJoinTime(bgQueueTypeId), bgQueueTypeId);
+ SendPacket(battlefieldStatus.Write());
+ continue;
+ }
}
//we are sending update to player about queue - he can be invited there!
@@ -491,23 +491,23 @@ void WorldSession::HandleRequestBattlefieldStatusOpcode(WorldPackets::Battlegrou
continue;
WorldPackets::Battleground::BattlefieldStatusNeedConfirmation battlefieldStatus;
- sBattlegroundMgr->BuildBattlegroundStatusNeedConfirmation(&battlefieldStatus, bg, _player, i, _player->GetBattlegroundQueueJoinTime(bgQueueTypeId), getMSTimeDiff(getMSTime(), ginfo.RemoveInviteTime), arenaType);
+ sBattlegroundMgr->BuildBattlegroundStatusNeedConfirmation(&battlefieldStatus, bg, _player, i, _player->GetBattlegroundQueueJoinTime(bgQueueTypeId), getMSTimeDiff(getMSTime(), ginfo.RemoveInviteTime), bgQueueTypeId);
SendPacket(battlefieldStatus.Write());
}
else
{
- bg = sBattlegroundMgr->GetBattlegroundTemplate(bgTypeId);
- if (!bg)
+ BattlegroundTemplate const* bgTemplate = sBattlegroundMgr->GetBattlegroundTemplateByTypeId(bgTypeId);
+ if (!bgTemplate)
continue;
// expected bracket entry
- PVPDifficultyEntry const* bracketEntry = DB2Manager::GetBattlegroundBracketByLevel(bg->GetMapId(), _player->GetLevel());
+ PVPDifficultyEntry const* bracketEntry = DB2Manager::GetBattlegroundBracketByLevel(bgTemplate->BattlemasterEntry->MapID[0], _player->GetLevel());
if (!bracketEntry)
continue;
uint32 avgTime = bgQueue.GetAverageQueueWaitTime(&ginfo, bracketEntry->GetBracketId());
WorldPackets::Battleground::BattlefieldStatusQueued battlefieldStatus;
- sBattlegroundMgr->BuildBattlegroundStatusQueued(&battlefieldStatus, bg, _player, i, _player->GetBattlegroundQueueJoinTime(bgQueueTypeId), bgQueueTypeId, avgTime, arenaType, ginfo.Players.size() > 1);
+ sBattlegroundMgr->BuildBattlegroundStatusQueued(&battlefieldStatus, _player, i, _player->GetBattlegroundQueueJoinTime(bgQueueTypeId), bgQueueTypeId, avgTime, ginfo.Players.size() > 1);
SendPacket(battlefieldStatus.Write());
}
}
@@ -522,8 +522,8 @@ void WorldSession::HandleBattlemasterJoinArena(WorldPackets::Battleground::Battl
uint8 arenatype = ArenaTeam::GetTypeBySlot(packet.TeamSizeIndex);
//check existence
- Battleground* bg = sBattlegroundMgr->GetBattlegroundTemplate(BATTLEGROUND_AA);
- if (!bg)
+ BattlegroundTemplate const* bgTemplate = sBattlegroundMgr->GetBattlegroundTemplateByTypeId(BATTLEGROUND_AA);
+ if (!bgTemplate)
{
TC_LOG_ERROR("network", "Battleground: template bg (all arenas) not found");
return;
@@ -535,9 +535,9 @@ void WorldSession::HandleBattlemasterJoinArena(WorldPackets::Battleground::Battl
return;
}
- BattlegroundTypeId bgTypeId = bg->GetTypeID();
+ BattlegroundTypeId bgTypeId = bgTemplate->Id;
BattlegroundQueueTypeId bgQueueTypeId = BattlegroundMgr::BGQueueTypeId(bgTypeId, BattlegroundQueueIdType::Arena, true, arenatype);
- PVPDifficultyEntry const* bracketEntry = DB2Manager::GetBattlegroundBracketByLevel(bg->GetMapId(), _player->GetLevel());
+ PVPDifficultyEntry const* bracketEntry = DB2Manager::GetBattlegroundBracketByLevel(bgTemplate->BattlemasterEntry->MapID[0], _player->GetLevel());
if (!bracketEntry)
return;
@@ -568,7 +568,7 @@ void WorldSession::HandleBattlemasterJoinArena(WorldPackets::Battleground::Battl
GroupQueueInfo* ginfo = nullptr;
ObjectGuid errorGuid;
- GroupJoinBattlegroundResult err = grp->CanJoinBattlegroundQueue(bg, bgQueueTypeId, arenatype, arenatype, true, packet.TeamSizeIndex, errorGuid);
+ GroupJoinBattlegroundResult err = grp->CanJoinBattlegroundQueue(bgTemplate, bgQueueTypeId, arenatype, arenatype, true, packet.TeamSizeIndex, errorGuid);
if (!err)
{
TC_LOG_DEBUG("bg.battleground", "Battleground: arena team id {}, leader {} queued with matchmaker rating {} for type {}", _player->GetArenaTeamId(packet.TeamSizeIndex), _player->GetName(), matchmakerRating, arenatype);
@@ -591,7 +591,7 @@ void WorldSession::HandleBattlemasterJoinArena(WorldPackets::Battleground::Battl
continue;
}
- if (!_player->CanJoinToBattleground(bg))
+ if (!_player->CanJoinToBattleground(bgTemplate))
{
WorldPackets::Battleground::BattlefieldStatusFailed battlefieldStatus;
sBattlegroundMgr->BuildBattlegroundStatusFailed(&battlefieldStatus, bgQueueTypeId, _player, 0, ERR_BATTLEGROUND_JOIN_FAILED, &errorGuid);
@@ -603,7 +603,7 @@ void WorldSession::HandleBattlemasterJoinArena(WorldPackets::Battleground::Battl
uint32 queueSlot = member->AddBattlegroundQueueId(bgQueueTypeId);
WorldPackets::Battleground::BattlefieldStatusQueued battlefieldStatus;
- sBattlegroundMgr->BuildBattlegroundStatusQueued(&battlefieldStatus, bg, member, queueSlot, ginfo->JoinTime, bgQueueTypeId, avgTime, arenatype, true);
+ sBattlegroundMgr->BuildBattlegroundStatusQueued(&battlefieldStatus, member, queueSlot, ginfo->JoinTime, bgQueueTypeId, avgTime, true);
member->SendDirectMessage(battlefieldStatus.Write());
TC_LOG_DEBUG("bg.battleground", "Battleground: player joined queue for arena as group bg queue {{ BattlemasterListId: {}, Type: {}, Rated: {}, TeamSize: {} }}, {}, NAME {}",
diff --git a/src/server/game/Handlers/MovementHandler.cpp b/src/server/game/Handlers/MovementHandler.cpp
index b8b36effa8c..6f9dfa69337 100644
--- a/src/server/game/Handlers/MovementHandler.cpp
+++ b/src/server/game/Handlers/MovementHandler.cpp
@@ -139,7 +139,7 @@ void WorldSession::HandleMoveWorldportAck()
if (!mEntry->IsBattlegroundOrArena())
{
// We're not in BG
- player->SetBattlegroundId(0, BATTLEGROUND_TYPE_NONE);
+ player->SetBattlegroundId(0, BATTLEGROUND_TYPE_NONE, BATTLEGROUND_QUEUE_NONE);
// reset destination bg team
player->SetBGTeam(0);
}
@@ -147,7 +147,7 @@ void WorldSession::HandleMoveWorldportAck()
else if (Battleground* bg = player->GetBattleground())
{
if (player->IsInvitedForBattlegroundInstance(player->GetBattlegroundId()))
- bg->AddPlayer(player);
+ bg->AddPlayer(player, player->m_bgData.queueId);
}
}
diff --git a/src/server/game/Miscellaneous/SharedDefines.h b/src/server/game/Miscellaneous/SharedDefines.h
index 70f78d3be39..f966cd4abc2 100644
--- a/src/server/game/Miscellaneous/SharedDefines.h
+++ b/src/server/game/Miscellaneous/SharedDefines.h
@@ -196,7 +196,7 @@ static constexpr uint8 MAX_UNIT_CLASSES = 4;
#define CLASSMASK_WAND_USERS ((1<<(CLASS_PRIEST-1)) | (1<<(CLASS_MAGE-1)) | (1<<(CLASS_WARLOCK-1)))
-#define PLAYER_MAX_BATTLEGROUND_QUEUES 2
+static constexpr uint8 PLAYER_MAX_BATTLEGROUND_QUEUES = 3;
enum ReputationRank
{
diff --git a/src/server/game/Spells/SpellEffects.cpp b/src/server/game/Spells/SpellEffects.cpp
index 3b247b74095..dba303507e1 100644
--- a/src/server/game/Spells/SpellEffects.cpp
+++ b/src/server/game/Spells/SpellEffects.cpp
@@ -1606,7 +1606,7 @@ void Spell::EffectOpenLock()
// in battleground check
if (Battleground* bg = player->GetBattleground())
{
- if (bg->GetTypeID(true) == BATTLEGROUND_EY)
+ if (bg->GetTypeID() == BATTLEGROUND_EY)
bg->EventPlayerClickedOnFlag(player, gameObjTarget);
return;
}
diff --git a/src/server/scripts/Commands/cs_misc.cpp b/src/server/scripts/Commands/cs_misc.cpp
index efaf039149a..a368b7033e5 100644
--- a/src/server/scripts/Commands/cs_misc.cpp
+++ b/src/server/scripts/Commands/cs_misc.cpp
@@ -389,7 +389,7 @@ public:
// all's well, set bg id
// when porting out from the bg, it will be reset to 0
- _player->SetBattlegroundId(target->GetBattlegroundId(), target->GetBattlegroundTypeId());
+ _player->SetBattlegroundId(target->GetBattlegroundId(), target->GetBattlegroundTypeId(), BATTLEGROUND_QUEUE_NONE); // unsure
// remember current position as entry point for return at bg end teleportation
if (!_player->GetMap()->IsBattlegroundOrArena())
_player->SetBattlegroundEntryPoint();
@@ -522,7 +522,7 @@ public:
// all's well, set bg id
// when porting out from the bg, it will be reset to 0
- target->SetBattlegroundId(_player->GetBattlegroundId(), _player->GetBattlegroundTypeId());
+ target->SetBattlegroundId(_player->GetBattlegroundId(), _player->GetBattlegroundTypeId(), BATTLEGROUND_QUEUE_NONE); // unsure about this
// remember current position as entry point for return at bg end teleportation
if (!target->GetMap()->IsBattlegroundOrArena())
target->SetBattlegroundEntryPoint();