diff options
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(); |