From 4c8fe1c08e82aaa6b1e729aed7f22dfe6ff0db15 Mon Sep 17 00:00:00 2001 From: Ovahlord Date: Mon, 2 Nov 2020 02:04:42 +0100 Subject: [PATCH] Core/Packets: converted SMSG_BATTLEFIELD_LIST to packet class and handle remaining fields --- .../game/Battlegrounds/BattlegroundMgr.cpp | 66 ++++++------------- .../game/Battlegrounds/BattlegroundMgr.h | 2 +- src/server/game/DataStores/DBCStructure.h | 4 +- src/server/game/Entities/Player/Player.cpp | 2 +- .../game/Handlers/BattleGroundHandler.cpp | 13 +--- .../Server/Packets/BattlegroundPackets.cpp | 47 +++++++++++++ .../game/Server/Packets/BattlegroundPackets.h | 26 ++++++++ src/server/game/Server/WorldSession.h | 2 - 8 files changed, 98 insertions(+), 64 deletions(-) diff --git a/src/server/game/Battlegrounds/BattlegroundMgr.cpp b/src/server/game/Battlegrounds/BattlegroundMgr.cpp index d0530077de4..39e88f8c349 100644 --- a/src/server/game/Battlegrounds/BattlegroundMgr.cpp +++ b/src/server/game/Battlegrounds/BattlegroundMgr.cpp @@ -30,6 +30,7 @@ #include "BattlegroundIC.h" #include "BattlegroundTP.h" #include "BattlegroundBFG.h" +#include "BattlegroundPackets.h" #include "Common.h" #include "Containers.h" #include "Chat.h" @@ -865,74 +866,45 @@ void BattlegroundMgr::LoadBattlegroundTemplates() TC_LOG_INFO("server.loading", ">> Loaded %u battlegrounds in %u ms", count, GetMSTimeDiffToNow(oldMSTime)); } -void BattlegroundMgr::BuildBattlegroundListPacket(WorldPacket* data, ObjectGuid guid, Player* player, BattlegroundTypeId bgTypeId, bool hideWindow /*= true*/) +void BattlegroundMgr::SendBattlegroundList(ObjectGuid guid, Player* player, BattlegroundTypeId bgTypeId) { - if (!player) - return; - BattlegroundTemplate const* bgTemplate = GetBattlegroundTemplateByTypeId(bgTypeId); if (!bgTemplate) return; uint32 winnerConquest = (player->GetRandomWinner() ? sWorld->getIntConfig(CONFIG_BG_REWARD_WINNER_CONQUEST_LAST) : sWorld->getIntConfig(CONFIG_BG_REWARD_WINNER_CONQUEST_FIRST)) / CURRENCY_PRECISION; uint32 winnerHonor = (player->GetRandomWinner() ? sWorld->getIntConfig(CONFIG_BG_REWARD_WINNER_HONOR_LAST) : sWorld->getIntConfig(CONFIG_BG_REWARD_WINNER_HONOR_FIRST)) / CURRENCY_PRECISION; - uint32 loserHonor = (!player->GetRandomWinner() ? sWorld->getIntConfig(CONFIG_BG_REWARD_LOSER_HONOR_LAST) : sWorld->getIntConfig(CONFIG_BG_REWARD_LOSER_HONOR_FIRST)) / CURRENCY_PRECISION; + uint32 loserHonor = (player->GetRandomWinner() ? sWorld->getIntConfig(CONFIG_BG_REWARD_LOSER_HONOR_LAST) : sWorld->getIntConfig(CONFIG_BG_REWARD_LOSER_HONOR_FIRST)) / CURRENCY_PRECISION; - data->Initialize(SMSG_BATTLEFIELD_LIST); - *data << uint32(winnerConquest) // Winner Conquest Reward or Random Winner Conquest Reward - << uint32(winnerConquest) // Winner Conquest Reward or Random Winner Conquest Reward - << uint32(loserHonor) // Loser Honor Reward or Random Loser Honor Reward - << uint32(bgTypeId) // battleground id - << uint32(loserHonor) // Loser Honor Reward or Random Loser Honor Reward - << uint32(winnerHonor) // Winner Honor Reward or Random Winner Honor Reward - << uint32(winnerHonor) // Winner Honor Reward or Random Winner Honor Reward - << uint8(bgTemplate->MaxLevel) // max level - << uint8(bgTemplate->MinLevel); // min level - - data->WriteBit(guid[0]); - data->WriteBit(guid[1]); - data->WriteBit(guid[7]); - data->WriteBit(0); // unk - data->WriteBit(0); // unk - - size_t count_pos = data->bitwpos(); - data->WriteBits(0, 24); // placeholder - - data->WriteBit(guid[6]); - data->WriteBit(guid[4]); - data->WriteBit(guid[2]); - data->WriteBit(guid[3]); - data->WriteBit(0); // unk - data->WriteBit(guid[5]); - data->WriteBit(hideWindow); // hide battleground list window - - data->FlushBits(); - - data->WriteByteSeq(guid[6]); - data->WriteByteSeq(guid[1]); - data->WriteByteSeq(guid[7]); - data->WriteByteSeq(guid[5]); + WorldPackets::Battleground::BattlefieldList battlefieldList; + battlefieldList.ConquestBonusRandom = winnerConquest; + battlefieldList.ConquestBonusHoliday = winnerConquest; + battlefieldList.HonorBonusRandomWin = winnerHonor; + battlefieldList.HonorBonusHolidayWin = winnerHonor; + battlefieldList.HonorBonusRandomLoss = loserHonor; + battlefieldList.HonorBonusHolidayLoss = loserHonor; + battlefieldList.BattlemasterGuid = guid; + battlefieldList.BattlemasterListID = bgTypeId; + battlefieldList.MinLevel = bgTemplate->MinLevel; + battlefieldList.MaxLevel = bgTemplate->MaxLevel; + battlefieldList.PvpAnywhere = guid.IsEmpty(); + battlefieldList.IsRandomBG = bgTypeId == BATTLEGROUND_RB; + battlefieldList.HasRandomWinToday = player->GetRandomWinner(); BattlegroundDataContainer::iterator it = bgDataStore.find(bgTypeId); if (it != bgDataStore.end()) { - PvPDifficultyEntry const* bracketEntry = sDBCManager.GetBattlegroundBracketByLevel(it->second.m_Battlegrounds.begin()->second->GetMapId(), player->getLevel()); if (bracketEntry) { BattlegroundBracketId bracketId = bracketEntry->GetBracketId(); BattlegroundClientIdsContainer& clientIds = it->second.m_ClientBattlegroundIds[bracketId]; for (BattlegroundClientIdsContainer::const_iterator itr = clientIds.begin(); itr != clientIds.end(); ++itr) - *data << uint32(*itr); - - data->PutBits(count_pos, clientIds.size(), 24); // bg instance count + battlefieldList.Battlefields.push_back(uint32(*itr)); } } - data->WriteByteSeq(guid[0]); - data->WriteByteSeq(guid[2]); - data->WriteByteSeq(guid[4]); - data->WriteByteSeq(guid[3]); + player->SendDirectMessage(battlefieldList.Write()); } void BattlegroundMgr::SendToBattleground(Player* player, uint32 instanceId, BattlegroundTypeId bgTypeId) diff --git a/src/server/game/Battlegrounds/BattlegroundMgr.h b/src/server/game/Battlegrounds/BattlegroundMgr.h index adf10e8bdc6..0e326d79af8 100644 --- a/src/server/game/Battlegrounds/BattlegroundMgr.h +++ b/src/server/game/Battlegrounds/BattlegroundMgr.h @@ -68,11 +68,11 @@ class TC_GAME_API BattlegroundMgr /* Packet Building */ void BuildPlayerJoinedBattlegroundPacket(WorldPacket* data, ObjectGuid guid); void BuildPlayerLeftBattlegroundPacket(WorldPacket* data, ObjectGuid guid); - void BuildBattlegroundListPacket(WorldPacket* data, ObjectGuid guid, Player* player, BattlegroundTypeId bgTypeId, bool hideWindow = true); void BuildStatusFailedPacket(WorldPacket* data, Battleground* bg, Player* pPlayer, uint8 QueueSlot, GroupJoinBattlegroundResult result); void BuildUpdateWorldStatePacket(WorldPacket* data, uint32 field, uint32 value); void BuildBattlegroundStatusPacket(WorldPacket* data, Battleground* bg, Player* player, uint8 queueSlot, uint8 statusId, uint32 time1, uint32 time2, uint8 arenaType); void SendAreaSpiritHealerQueryOpcode(Player* player, Battleground* bg, ObjectGuid guid); + void SendBattlegroundList(ObjectGuid guid, Player* player, BattlegroundTypeId bgTypeId); /* Battlegrounds */ Battleground* GetBattlegroundThroughClientInstance(uint32 instanceId, BattlegroundTypeId bgTypeId); diff --git a/src/server/game/DataStores/DBCStructure.h b/src/server/game/DataStores/DBCStructure.h index a0f66e6c581..0cde8c5e960 100644 --- a/src/server/game/DataStores/DBCStructure.h +++ b/src/server/game/DataStores/DBCStructure.h @@ -765,8 +765,8 @@ struct BattlemasterListEntry char* Name; // 11 uint32 MaxGroupSize; // 12 maxGroupSize, used for checking if queue as group uint32 HolidayWorldState; // 13 new 3.1 - uint32 Minlevel; // 14, min level (sync with PvPDifficulty.dbc content) - uint32 Maxlevel; // 15, max level (sync with PvPDifficulty.dbc content) + uint32 MinLevel; // 14, min level (sync with PvPDifficulty.dbc content) + uint32 MaxLevel; // 15, max level (sync with PvPDifficulty.dbc content) //uint32 RatedPlayers; // 16 4.0.1 //uint32 MinPlayers; // 17 - 4.0.6.13596 //uint32 MaxPlayers; // 18 4.0.1 diff --git a/src/server/game/Entities/Player/Player.cpp b/src/server/game/Entities/Player/Player.cpp index f92cdd31a4d..a47bcca7ba1 100644 --- a/src/server/game/Entities/Player/Player.cpp +++ b/src/server/game/Entities/Player/Player.cpp @@ -14129,7 +14129,7 @@ void Player::OnGossipSelect(WorldObject* source, uint32 gossipListId, uint32 men return; } - GetSession()->SendBattleGroundList(guid, bgTypeId); + sBattlegroundMgr->SendBattlegroundList(source->GetGUID(), this, BattlegroundTypeId(bgTypeId)); break; } } diff --git a/src/server/game/Handlers/BattleGroundHandler.cpp b/src/server/game/Handlers/BattleGroundHandler.cpp index 26f14287a7f..4505df207ca 100644 --- a/src/server/game/Handlers/BattleGroundHandler.cpp +++ b/src/server/game/Handlers/BattleGroundHandler.cpp @@ -66,14 +66,7 @@ void WorldSession::HandleBattlemasterHelloOpcode(WorldPacket& recvData) return; } - SendBattleGroundList(guid, bgTypeId); -} - -void WorldSession::SendBattleGroundList(ObjectGuid guid, BattlegroundTypeId bgTypeId) -{ - WorldPacket data; - sBattlegroundMgr->BuildBattlegroundListPacket(&data, guid, _player, bgTypeId, false); - SendPacket(&data); + sBattlegroundMgr->SendBattlegroundList(guid, _player, bgTypeId); } void WorldSession::HandleBattlemasterJoinOpcode(WorldPacket& recvData) @@ -400,9 +393,7 @@ void WorldSession::HandleBattlefieldListOpcode(WorldPacket& recvData) return; } - WorldPacket data; - sBattlegroundMgr->BuildBattlegroundListPacket(&data, ObjectGuid::Empty, _player, BattlegroundTypeId(bgTypeId)); - SendPacket(&data); + sBattlegroundMgr->SendBattlegroundList(ObjectGuid::Empty, _player, BattlegroundTypeId(bgTypeId)); } void WorldSession::HandleBattleFieldPortOpcode(WorldPacket &recvData) diff --git a/src/server/game/Server/Packets/BattlegroundPackets.cpp b/src/server/game/Server/Packets/BattlegroundPackets.cpp index f92789768e8..1ff9e424bbc 100644 --- a/src/server/game/Server/Packets/BattlegroundPackets.cpp +++ b/src/server/game/Server/Packets/BattlegroundPackets.cpp @@ -61,3 +61,50 @@ WorldPacket const* WorldPackets::Battleground::BattlefieldRatedInfo::Write() return &_worldPacket; } + +WorldPacket const* WorldPackets::Battleground::BattlefieldList::Write() +{ + _worldPacket << int32(ConquestBonusHoliday); + _worldPacket << int32(ConquestBonusRandom); + + _worldPacket << int32(HonorBonusHolidayLoss); + _worldPacket << int32(BattlemasterListID); + _worldPacket << int32(HonorBonusRandomLoss); + + _worldPacket << int32(HonorBonusRandomWin); + _worldPacket << int32(HonorBonusHolidayWin); + _worldPacket << uint8(MaxLevel); + _worldPacket << uint8(MinLevel); + + _worldPacket.WriteBit(BattlemasterGuid[0]); + _worldPacket.WriteBit(BattlemasterGuid[1]); + _worldPacket.WriteBit(BattlemasterGuid[7]); + + _worldPacket.WriteBit(HasHolidayWinToday); + _worldPacket.WriteBit(HasRandomWinToday); + _worldPacket.WriteBits(Battlefields.size(), 24); + + _worldPacket.WriteBit(BattlemasterGuid[6]); + _worldPacket.WriteBit(BattlemasterGuid[4]); + _worldPacket.WriteBit(BattlemasterGuid[2]); + _worldPacket.WriteBit(BattlemasterGuid[3]); + _worldPacket.WriteBit(IsRandomBG); + _worldPacket.WriteBit(BattlemasterGuid[5]); + _worldPacket.WriteBit(PvpAnywhere); + _worldPacket.FlushBits(); + + _worldPacket.WriteByteSeq(BattlemasterGuid[6]); + _worldPacket.WriteByteSeq(BattlemasterGuid[1]); + _worldPacket.WriteByteSeq(BattlemasterGuid[7]); + _worldPacket.WriteByteSeq(BattlemasterGuid[5]); + + for (int32 battlefield : Battlefields) + _worldPacket << int32(battlefield); + + _worldPacket.WriteByteSeq(BattlemasterGuid[0]); + _worldPacket.WriteByteSeq(BattlemasterGuid[2]); + _worldPacket.WriteByteSeq(BattlemasterGuid[4]); + _worldPacket.WriteByteSeq(BattlemasterGuid[3]); + + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/BattlegroundPackets.h b/src/server/game/Server/Packets/BattlegroundPackets.h index 793e373b96f..d61662e6226 100644 --- a/src/server/game/Server/Packets/BattlegroundPackets.h +++ b/src/server/game/Server/Packets/BattlegroundPackets.h @@ -66,6 +66,32 @@ namespace WorldPackets int32 PurseQuantity = 0; int8 Unk = 0; // Same value as in cmsg }; + + class BattlefieldList final : public ServerPacket + { + public: + BattlefieldList() : ServerPacket(SMSG_BATTLEFIELD_LIST, 35) { } + + WorldPacket const* Write() override; + + ObjectGuid BattlemasterGuid; + int32 BattlemasterListID = 0; + int32 ConquestBonusRandom = 0; + int32 ConquestBonusHoliday = 0; + int32 HonorBonusRandomWin = 0; + int32 HonorBonusRandomLoss = 0; + int32 HonorBonusHolidayWin = 0; + int32 HonorBonusHolidayLoss = 0; + int32 HonorLossBonus = 0; + int32 HonorWinBonus = 0; + uint8 MinLevel = 0; + uint8 MaxLevel = 0; + std::vector Battlefields; + bool PvpAnywhere = false; + bool IsRandomBG = false; + bool HasRandomWinToday = false; + bool HasHolidayWinToday = false; + }; } } diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 83bd96eb42f..64e06cc7c93 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -486,8 +486,6 @@ class TC_GAME_API WorldSession void SendAttackStop(Unit const* enemy); - void SendBattleGroundList(ObjectGuid guid, BattlegroundTypeId bgTypeId = BATTLEGROUND_RB); - void SendTradeStatus(TradeStatusInfo const& status); void SendUpdateTrade(bool trader_data = true); void SendCancelTrade();