diff --git a/src/server/game/Handlers/BattleGroundHandler.cpp b/src/server/game/Handlers/BattleGroundHandler.cpp index 15dae84fdf..26f14287a7 100644 --- a/src/server/game/Handlers/BattleGroundHandler.cpp +++ b/src/server/game/Handlers/BattleGroundHandler.cpp @@ -20,6 +20,7 @@ #include "ArenaTeamMgr.h" #include "Battleground.h" #include "BattlegroundMgr.h" +#include "BattlegroundPackets.h" #include "Chat.h" #include "Common.h" #include "Creature.h" @@ -818,47 +819,32 @@ void WorldSession::HandleRequestRatedBgInfo(WorldPacket & recvData) recvData >> unk; TC_LOG_DEBUG("bg.battleground", "WorldSession::HandleRequestRatedBgInfo: unk = %u", unk); + uint8 ratedBattlegroundActive = sWorld->getBoolConfig(CONFIG_RATED_BATTLEGROUND_ENABLE); + uint8 ratedBattlegroundReward = sWorld->getIntConfig(CONFIG_RATED_BATTLEGROUND_REWARD) / CURRENCY_PRECISION; - /// @Todo: perfome research in this case - /// The unk fields are related to arenas - WorldPacket data(SMSG_RATED_BG_STATS, 72); - data << uint32(0); // BgWeeklyWins20vs20 - data << uint32(0); // BgWeeklyPlayed20vs20 - data << uint32(0); // BgWeeklyPlayed15vs15 - data << uint32(0); - data << uint32(0); // BgWeeklyWins10vs10 - data << uint32(0); - data << uint32(0); - data << uint32(0); - data << uint32(0); // BgWeeklyWins15vs15 - data << uint32(0); - data << uint32(0); - data << uint32(0); - data << uint32(0); - data << uint32(0); - data << uint32(0); - data << uint32(0); // BgWeeklyPlayed10vs10 - data << uint32(0); - data << uint32(0); - SendPacket(&data); + WorldPackets::Battleground::BattlefieldRatedInfo packet; + packet.Unk = unk; + packet.Reward = ratedBattlegroundReward; + packet.RewardWeeklyLimit = _player->GetCurrencyWeekCap(CURRENCY_TYPE_CONQUEST_META_RBG, true); + packet.PurseQuantity = _player->GetCurrency(CURRENCY_TYPE_CONQUEST_POINTS, true); + + SendPacket(packet.Write()); + + // update the rated battleground state + _player->SendUpdateWorldState(WS_RATED_BATTLEGROUND_STATE_ACTIVE, ratedBattlegroundActive); } void WorldSession::HandleRequestPvpOptions(WorldPacket& /*recvData*/) { TC_LOG_DEBUG("network", "WORLD: CMSG_REQUEST_PVP_OPTIONS_ENABLED"); - /// @Todo: perfome research in this case - WorldPacket data(SMSG_PVP_OPTIONS_ENABLED, 1); - data.WriteBit(1); - data.WriteBit(1); // WargamesEnabled - data.WriteBit(1); - data.WriteBit(1); // RatedBGsEnabled - data.WriteBit(1); // RatedArenasEnabled + WorldPackets::Battleground::PVPOptionsEnabled packet; + packet.RatedArenas = true; + packet.WargameBattlegrounds = true; + packet.RatedBattlegrounds = true; - data.FlushBits(); - - SendPacket(&data); + SendPacket(packet.Write()); } void WorldSession::HandleRequestPvpReward(WorldPacket& /*recvData*/) @@ -872,23 +858,8 @@ void WorldSession::HandleRequestRatedBgStats(WorldPacket& /*recvData*/) { TC_LOG_DEBUG("network", "WORLD: CMSG_REQUEST_RATED_BG_STATS"); - uint8 ratedBattlegroundActive = sWorld->getBoolConfig(CONFIG_RATED_BATTLEGROUND_ENABLE); - uint8 ratedBattlegroundReward = sWorld->getIntConfig(CONFIG_RATED_BATTLEGROUND_REWARD) / CURRENCY_PRECISION; - - WorldPacket data(SMSG_BATTLEFIELD_RATED_INFO, 29); - data << uint32(ratedBattlegroundReward); // Reward - data << uint8(3); // unk - data << uint32(0); // unk - data << uint32(0); // unk - data << _player->GetCurrencyWeekCap(CURRENCY_TYPE_CONQUEST_META_RBG, true); - data << uint32(0); // unk - data << uint32(0); // unk - data << _player->GetCurrency(CURRENCY_TYPE_CONQUEST_POINTS, true); - - SendPacket(&data); - - // update the rated battleground state - _player->SendUpdateWorldState(WS_RATED_BATTLEGROUND_STATE_ACTIVE, ratedBattlegroundActive); + WorldPackets::Battleground::RatedBattlefieldInfo packet; + SendPacket(packet.Write()); } void WorldSession::HandleBattlegroundStateQuery(WorldPacket& /*recvData*/) diff --git a/src/server/game/Server/Packets/AllPackets.h b/src/server/game/Server/Packets/AllPackets.h index 87d9981108..d443be42a3 100644 --- a/src/server/game/Server/Packets/AllPackets.h +++ b/src/server/game/Server/Packets/AllPackets.h @@ -19,6 +19,7 @@ #define AllPackets_h__ #include "AuthenticationPackets.h" +#include "BattlegroundPackets.h" #include "CharacterPackets.h" #include "CombatLogPackets.h" #include "CombatPackets.h" diff --git a/src/server/game/Server/Packets/BattlegroundPackets.cpp b/src/server/game/Server/Packets/BattlegroundPackets.cpp new file mode 100644 index 0000000000..f92789768e --- /dev/null +++ b/src/server/game/Server/Packets/BattlegroundPackets.cpp @@ -0,0 +1,63 @@ +/* + * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +#include "BattlegroundPackets.h" + +WorldPacket const* WorldPackets::Battleground::PVPOptionsEnabled::Write() +{ + _worldPacket.WriteBit(1); // ignored by the client + _worldPacket.WriteBit(WargameBattlegrounds); + _worldPacket.WriteBit(1); // ignored by the client + _worldPacket.WriteBit(RatedBattlegrounds); + _worldPacket.WriteBit(RatedArenas); + _worldPacket.FlushBits(); + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Battleground::RatedBattlefieldInfo::Write() +{ + _worldPacket << int32(Brackets[2].WeeklyWon); // BgWeeklyWins25vs25 + _worldPacket << int32(Brackets[2].WeeklyPlayed); // BgWeeklyPlayed25vs25 + _worldPacket << int32(Brackets[1].WeeklyPlayed); // BgWeeklyPlayed15vs15 + _worldPacket << int32(0); + _worldPacket << int32(Brackets[0].WeeklyWon); // BgWeeklyWins10vs10 + _worldPacket << int32(0); + _worldPacket << int32(0); + _worldPacket << int32(0); + _worldPacket << int32(Brackets[1].WeeklyWon); // BgWeeklyWins15vs15 + _worldPacket << int32(0); + _worldPacket << int32(0); + _worldPacket << int32(0); + _worldPacket << int32(Brackets[0].WeeklyPlayed); // BgWeeklyPlayed10vs10 + _worldPacket << int32(0); + _worldPacket << int32(0); + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Battleground::BattlefieldRatedInfo::Write() +{ + _worldPacket << int32(Reward); + _worldPacket << int8(Unk); + _worldPacket << int32(PersonalRating); + _worldPacket << int32(0); + _worldPacket << int32(RewardWeeklyLimit); + _worldPacket << int32(0); + _worldPacket << int32(0); + _worldPacket << int32(PurseQuantity); + + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/BattlegroundPackets.h b/src/server/game/Server/Packets/BattlegroundPackets.h new file mode 100644 index 0000000000..793e373b96 --- /dev/null +++ b/src/server/game/Server/Packets/BattlegroundPackets.h @@ -0,0 +1,73 @@ +/* + * This file is part of the TrinityCore Project. See AUTHORS file for Copyright information + * + * This program is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License as published by the + * Free Software Foundation; either version 2 of the License, or (at your + * option) any later version. + * + * This program is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for + * more details. + * + * You should have received a copy of the GNU General Public License along + * with this program. If not, see . + */ + +#ifndef BattlegroundPackets_h__ +#define BattlegroundPackets_h__ + +#include "Packet.h" +#include "ObjectGuid.h" + +namespace WorldPackets +{ + namespace Battleground + { + class PVPOptionsEnabled final : public ServerPacket + { + public: + PVPOptionsEnabled() : ServerPacket(SMSG_PVP_OPTIONS_ENABLED, 1) { } + + WorldPacket const* Write() override; + + bool RatedArenas = false; + bool WargameBattlegrounds = false; + bool RatedBattlegrounds = false; + }; + + struct ClientBracketInfo + { + int32 WeeklyPlayed = 0; + int32 WeeklyWon = 0; + }; + + class RatedBattlefieldInfo final : public ServerPacket + { + public: + RatedBattlefieldInfo() : ServerPacket(SMSG_RATED_BG_STATS, 72) { } + + WorldPacket const* Write() override; + + std::array Brackets; + }; + + class BattlefieldRatedInfo final : public ServerPacket + { + public: + BattlefieldRatedInfo() : ServerPacket(SMSG_BATTLEFIELD_RATED_INFO, 29) { } + + WorldPacket const* Write() override; + + int32 Reward = 0; + int32 PersonalRating = 0; + int32 RewardWeeklyLimit = 0; + int32 PurseQuantity = 0; + int8 Unk = 0; // Same value as in cmsg + }; + } + +} + +#endif // BattlegroundPackets_h__