diff --git a/src/server/game/Handlers/InspectHandler.cpp b/src/server/game/Handlers/InspectHandler.cpp new file mode 100644 index 0000000000..71b9d10780 --- /dev/null +++ b/src/server/game/Handlers/InspectHandler.cpp @@ -0,0 +1,69 @@ +/* +* 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 "WorldSession.h" +#include "InspectPackets.h" +#include "Player.h" + +void WorldSession::HandleRequestHonorStatsOpcode(WorldPackets::Inspect::RequestHonorStats& packet) +{ + Player* player = ObjectAccessor::GetPlayer(*_player, packet.TargetGUID); + if (!player) + { + TC_LOG_DEBUG("network", "CMSG_REQUEST_HONOR_STATS: No player found from %s", packet.TargetGUID.ToString().c_str()); + return; + } + + if (!GetPlayer()->IsWithinDistInMap(player, INSPECT_DISTANCE, false)) + return; + + if (GetPlayer()->IsValidAttackTarget(player)) + return; + + WorldPackets::Inspect::InspectHonorStats inspectHonorStats; + inspectHonorStats.PlayerGUID = player->GetGUID(); + inspectHonorStats.LifetimeHK = player->GetUInt32Value(PLAYER_FIELD_LIFETIME_HONORABLE_KILLS); + inspectHonorStats.YesterdayHK = player->GetUInt16Value(PLAYER_FIELD_KILLS, 1); + inspectHonorStats.TodayHK = player->GetUInt16Value(PLAYER_FIELD_KILLS, 0); + inspectHonorStats.LifetimeMaxRank = 0; // @todo + + SendPacket(inspectHonorStats.Write()); +} + +void WorldSession::HandleRequestInspectRatedBgStatsOpcode(WorldPackets::Inspect::RequestInspectRatedBgStats& packet) +{ + Player* player = ObjectAccessor::GetPlayer(*_player, packet.TargetGUID); + if (!player) + { + TC_LOG_DEBUG("network", "CMSG_REQUEST_INSPECT_RATED_BG_STATS: No player found from %s", packet.TargetGUID.ToString().c_str()); + return; + } + + if (!GetPlayer()->IsWithinDistInMap(player, INSPECT_DISTANCE, false)) + return; + + if (GetPlayer()->IsValidAttackTarget(player)) + return; + + WorldPackets::Inspect::InspectRatedBgStats inspectRatedBgStats; + inspectRatedBgStats.PlayerGUID = player->GetGUID(); + inspectRatedBgStats.Played = 0; // @todo + inspectRatedBgStats.Rating = 0; // @todo + inspectRatedBgStats.Won = 0; // @todo + + SendPacket(inspectRatedBgStats.Write()); +} diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp index 1c9276f137..7fda030e36 100644 --- a/src/server/game/Handlers/MiscHandler.cpp +++ b/src/server/game/Handlers/MiscHandler.cpp @@ -39,6 +39,7 @@ #include "Group.h" #include "Guild.h" #include "GuildMgr.h" +#include "InspectPackets.h" #include "InstanceScript.h" #include "Language.h" #include "Log.h" @@ -1040,64 +1041,6 @@ void WorldSession::HandleInspectOpcode(WorldPacket& recvData) SendPacket(&data); } -void WorldSession::HandleInspectHonorStatsOpcode(WorldPacket& recvData) -{ - ObjectGuid guid; - guid[1] = recvData.ReadBit(); - guid[5] = recvData.ReadBit(); - guid[7] = recvData.ReadBit(); - guid[3] = recvData.ReadBit(); - guid[2] = recvData.ReadBit(); - guid[4] = recvData.ReadBit(); - guid[0] = recvData.ReadBit(); - guid[6] = recvData.ReadBit(); - - recvData.ReadByteSeq(guid[4]); - recvData.ReadByteSeq(guid[7]); - recvData.ReadByteSeq(guid[0]); - recvData.ReadByteSeq(guid[5]); - recvData.ReadByteSeq(guid[1]); - recvData.ReadByteSeq(guid[6]); - recvData.ReadByteSeq(guid[2]); - recvData.ReadByteSeq(guid[3]); - Player* player = ObjectAccessor::GetPlayer(*_player, guid); - if (!player) - { - TC_LOG_DEBUG("network", "CMSG_INSPECT_HONOR_STATS: No player found from %s", guid.ToString().c_str()); - return; - } - - if (!GetPlayer()->IsWithinDistInMap(player, INSPECT_DISTANCE, false)) - return; - - if (GetPlayer()->IsValidAttackTarget(player)) - return; - - ObjectGuid playerGuid = player->GetGUID(); - WorldPacket data(SMSG_INSPECT_HONOR_STATS, 8+1+4+4); - data.WriteBit(playerGuid[4]); - data.WriteBit(playerGuid[3]); - data.WriteBit(playerGuid[6]); - data.WriteBit(playerGuid[2]); - data.WriteBit(playerGuid[5]); - data.WriteBit(playerGuid[0]); - data.WriteBit(playerGuid[7]); - data.WriteBit(playerGuid[1]); - data << uint8(0); // rank - data << uint16(player->GetUInt16Value(PLAYER_FIELD_KILLS, 1)); // yesterday kills - data << uint16(player->GetUInt16Value(PLAYER_FIELD_KILLS, 0)); // today kills - data.WriteByteSeq(playerGuid[2]); - data.WriteByteSeq(playerGuid[0]); - data.WriteByteSeq(playerGuid[6]); - data.WriteByteSeq(playerGuid[3]); - data.WriteByteSeq(playerGuid[4]); - data.WriteByteSeq(playerGuid[1]); - data.WriteByteSeq(playerGuid[5]); - data << uint32(player->GetUInt32Value(PLAYER_FIELD_LIFETIME_HONORABLE_KILLS)); - data.WriteByteSeq(playerGuid[7]); - SendPacket(&data); -} - void WorldSession::HandleWorldTeleportOpcode(WorldPacket& recvData) { uint32 time; diff --git a/src/server/game/Server/Packets/AllPackets.h b/src/server/game/Server/Packets/AllPackets.h index ee3f382ab3..b67c843ceb 100644 --- a/src/server/game/Server/Packets/AllPackets.h +++ b/src/server/game/Server/Packets/AllPackets.h @@ -25,6 +25,7 @@ #include "CombatLogPackets.h" #include "CombatPackets.h" #include "GuildPackets.h" +#include "InspectPackets.h" #include "InstancePackets.h" #include "ItemPackets.h" #include "LFGPackets.h" diff --git a/src/server/game/Server/Packets/InspectPackets.cpp b/src/server/game/Server/Packets/InspectPackets.cpp new file mode 100644 index 0000000000..46f4727b00 --- /dev/null +++ b/src/server/game/Server/Packets/InspectPackets.cpp @@ -0,0 +1,113 @@ +/* +* 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 "InspectPackets.h" + +WorldPacket const* WorldPackets::Inspect::InspectHonorStats::Write() +{ + _worldPacket.WriteBit(PlayerGUID[4]); + _worldPacket.WriteBit(PlayerGUID[3]); + _worldPacket.WriteBit(PlayerGUID[6]); + _worldPacket.WriteBit(PlayerGUID[2]); + _worldPacket.WriteBit(PlayerGUID[5]); + _worldPacket.WriteBit(PlayerGUID[0]); + _worldPacket.WriteBit(PlayerGUID[7]); + _worldPacket.WriteBit(PlayerGUID[1]); + + _worldPacket << uint8(LifetimeMaxRank); + _worldPacket << uint16(YesterdayHK); + _worldPacket << uint16(TodayHK); + _worldPacket.WriteByteSeq(PlayerGUID[2]); + _worldPacket.WriteByteSeq(PlayerGUID[0]); + _worldPacket.WriteByteSeq(PlayerGUID[6]); + _worldPacket.WriteByteSeq(PlayerGUID[3]); + _worldPacket.WriteByteSeq(PlayerGUID[4]); + _worldPacket.WriteByteSeq(PlayerGUID[1]); + _worldPacket.WriteByteSeq(PlayerGUID[5]); + _worldPacket << uint32(LifetimeHK); + _worldPacket.WriteByteSeq(PlayerGUID[7]); + + return &_worldPacket; +} + +void WorldPackets::Inspect::RequestHonorStats::Read() +{ + TargetGUID[1] = _worldPacket.ReadBit(); + TargetGUID[5] = _worldPacket.ReadBit(); + TargetGUID[7] = _worldPacket.ReadBit(); + TargetGUID[3] = _worldPacket.ReadBit(); + TargetGUID[2] = _worldPacket.ReadBit(); + TargetGUID[4] = _worldPacket.ReadBit(); + TargetGUID[0] = _worldPacket.ReadBit(); + TargetGUID[6] = _worldPacket.ReadBit(); + + _worldPacket.ReadByteSeq(TargetGUID[4]); + _worldPacket.ReadByteSeq(TargetGUID[7]); + _worldPacket.ReadByteSeq(TargetGUID[0]); + _worldPacket.ReadByteSeq(TargetGUID[5]); + _worldPacket.ReadByteSeq(TargetGUID[1]); + _worldPacket.ReadByteSeq(TargetGUID[6]); + _worldPacket.ReadByteSeq(TargetGUID[2]); + _worldPacket.ReadByteSeq(TargetGUID[3]); +} + +void WorldPackets::Inspect::RequestInspectRatedBgStats::Read() +{ + TargetGUID[1] = _worldPacket.ReadBit(); + TargetGUID[4] = _worldPacket.ReadBit(); + TargetGUID[6] = _worldPacket.ReadBit(); + TargetGUID[5] = _worldPacket.ReadBit(); + TargetGUID[0] = _worldPacket.ReadBit(); + TargetGUID[2] = _worldPacket.ReadBit(); + TargetGUID[7] = _worldPacket.ReadBit(); + TargetGUID[3] = _worldPacket.ReadBit(); + + _worldPacket.ReadByteSeq(TargetGUID[4]); + _worldPacket.ReadByteSeq(TargetGUID[7]); + _worldPacket.ReadByteSeq(TargetGUID[2]); + _worldPacket.ReadByteSeq(TargetGUID[5]); + _worldPacket.ReadByteSeq(TargetGUID[6]); + _worldPacket.ReadByteSeq(TargetGUID[3]); + _worldPacket.ReadByteSeq(TargetGUID[0]); + _worldPacket.ReadByteSeq(TargetGUID[1]); +} + +WorldPacket const* WorldPackets::Inspect::InspectRatedBgStats::Write() +{ + _worldPacket.WriteBit(PlayerGUID[6]); + _worldPacket.WriteBit(PlayerGUID[4]); + _worldPacket.WriteBit(PlayerGUID[5]); + _worldPacket.WriteBit(PlayerGUID[1]); + _worldPacket.WriteBit(PlayerGUID[2]); + _worldPacket.WriteBit(PlayerGUID[7]); + _worldPacket.WriteBit(PlayerGUID[0]); + _worldPacket.WriteBit(PlayerGUID[3]); + + _worldPacket.WriteByteSeq(PlayerGUID[3]); + _worldPacket << int32(Rating); + _worldPacket.WriteByteSeq(PlayerGUID[1]); + _worldPacket.WriteByteSeq(PlayerGUID[7]); + _worldPacket.WriteByteSeq(PlayerGUID[3]); + _worldPacket.WriteByteSeq(PlayerGUID[6]); + _worldPacket << int32(Won); + _worldPacket << int32(Played); + _worldPacket.WriteByteSeq(PlayerGUID[2]); + _worldPacket.WriteByteSeq(PlayerGUID[5]); + _worldPacket.WriteByteSeq(PlayerGUID[0]); + + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/InspectPackets.h b/src/server/game/Server/Packets/InspectPackets.h new file mode 100644 index 0000000000..86f0623c36 --- /dev/null +++ b/src/server/game/Server/Packets/InspectPackets.h @@ -0,0 +1,77 @@ +/* +* 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 InspectPackets_h__ +#define InspectPackets_h__ + +#include "Packet.h" +#include "ObjectGuid.h" + +namespace WorldPackets +{ + namespace Inspect + { + class InspectHonorStats final : public ServerPacket + { + public: + InspectHonorStats() : ServerPacket(SMSG_INSPECT_HONOR_STATS, 17) { } + + WorldPacket const* Write() override; + + ObjectGuid PlayerGUID; + uint32 LifetimeHK = 0; + uint16 YesterdayHK = 0; + uint16 TodayHK = 0; + uint8 LifetimeMaxRank = 0; + }; + + class RequestHonorStats final : public ClientPacket + { + public: + RequestHonorStats(WorldPacket&& packet) : ClientPacket(CMSG_REQUEST_HONOR_STATS, std::move(packet)) { } + + void Read() override; + + ObjectGuid TargetGUID; + }; + + class RequestInspectRatedBgStats final : public ClientPacket + { + public: + RequestInspectRatedBgStats(WorldPacket&& packet) : ClientPacket(CMSG_REQUEST_INSPECT_RATED_BG_STATS, std::move(packet)) { } + + void Read() override; + + ObjectGuid TargetGUID; + }; + + class InspectRatedBgStats final : public ServerPacket + { + public: + InspectRatedBgStats() : ServerPacket(SMSG_INSPECT_RATED_BG_STATS, 20) { } + + WorldPacket const* Write() override; + + ObjectGuid PlayerGUID; + int32 Rating = 0; + int32 Played = 0; + int32 Won = 0; + }; + } +} + +#endif diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 034a1e59ee..13b1f9c2e7 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -382,7 +382,6 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_IGNORE_TRADE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleIgnoreTradeOpcode ); DEFINE_HANDLER(CMSG_INITIATE_TRADE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleInitiateTradeOpcode ); DEFINE_HANDLER(CMSG_INSPECT, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleInspectOpcode ); - DEFINE_HANDLER(CMSG_INSPECT_HONOR_STATS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleInspectHonorStatsOpcode ); DEFINE_HANDLER(CMSG_INSTANCE_LOCK_WARNING_RESPONSE, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleInstanceLockResponse ); DEFINE_HANDLER(CMSG_ITEM_REFUND, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleItemRefund ); DEFINE_HANDLER(CMSG_ITEM_REFUND_INFO, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleItemRefundInfoRequest ); @@ -540,7 +539,8 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_REQUEST_CATEGORY_COOLDOWNS, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleRequestCategoryCooldowns ); DEFINE_HANDLER(CMSG_REQUEST_CEMETERY_LIST, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleRequestCemeteryList ); DEFINE_HANDLER(CMSG_REQUEST_GUILD_REWARDS_LIST, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleRequestGuildRewardsList ); - DEFINE_HANDLER(CMSG_REQUEST_INSPECT_RATED_BG_STATS, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); + DEFINE_HANDLER(CMSG_REQUEST_HONOR_STATS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleRequestHonorStatsOpcode ); + DEFINE_HANDLER(CMSG_REQUEST_INSPECT_RATED_BG_STATS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleRequestInspectRatedBgStatsOpcode); DEFINE_HANDLER(CMSG_REQUEST_PARTY_MEMBER_STATS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleRequestPartyMemberStatsOpcode); DEFINE_HANDLER(CMSG_REQUEST_PET_INFO, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleRequestPetInfoOpcode ); DEFINE_HANDLER(CMSG_REQUEST_PVP_OPTIONS_ENABLED, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleRequestPvpOptions ); @@ -939,7 +939,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_SETUP_RESEARCH_HISTORY, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_INIT_WORLD_STATES, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSPECT_HONOR_STATS, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSPECT_RATED_BG_STATS, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSPECT_RATED_BG_STATS, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSPECT_RESULTS_UPDATE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSPECT_TALENT, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_INSTANCE_INFO, STATUS_NEVER, CONNECTION_TYPE_REALM); diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h index 06cbbea80d..4870190681 100644 --- a/src/server/game/Server/Protocol/Opcodes.h +++ b/src/server/game/Server/Protocol/Opcodes.h @@ -285,7 +285,6 @@ enum OpcodeClient : uint16 CMSG_IGNORE_TRADE = 0x7112, CMSG_INITIATE_TRADE = 0x7916, CMSG_INSPECT = 0x0927, - CMSG_INSPECT_HONOR_STATS = 0x791E, CMSG_INSTANCE_LOCK_WARNING_RESPONSE = 0x6234, CMSG_ITEM_REFUND = 0x6134, CMSG_ITEM_REFUND_INFO = 0x2206, @@ -457,6 +456,7 @@ enum OpcodeClient : uint16 CMSG_REQUEST_CATEGORY_COOLDOWNS = 0x7102, CMSG_REQUEST_CEMETERY_LIST = 0x720A, CMSG_REQUEST_GUILD_REWARDS_LIST = 0x3012, + CMSG_REQUEST_HONOR_STATS = 0x791E, CMSG_REQUEST_INSPECT_RATED_BG_STATS = 0x3010, CMSG_REQUEST_PARTY_MEMBER_STATS = 0x0C04, CMSG_REQUEST_PET_INFO = 0x4924, diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 923eab61d6..dddb21aab5 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -143,6 +143,12 @@ namespace WorldPackets class SetGuildMaster; } + namespace Inspect + { + class RequestHonorStats; + class RequestInspectRatedBgStats; + } + namespace Misc { class CompleteCinematic; @@ -657,7 +663,9 @@ class TC_GAME_API WorldSession void HandleInspectOpcode(WorldPacket& recvPacket); // new party stats - void HandleInspectHonorStatsOpcode(WorldPacket& recvPacket); + void HandleRequestHonorStatsOpcode(WorldPackets::Inspect::RequestHonorStats& packet); + void HandleRequestInspectRatedBgStatsOpcode(WorldPackets::Inspect::RequestInspectRatedBgStats& packet); + void HandleMoveWaterWalkAck(WorldPacket& recvPacket); void HandleFeatherFallAck(WorldPacket& recvData);