From 93322bcb4d1c66f65c4848a0a573ae56d2cfc4f6 Mon Sep 17 00:00:00 2001 From: IntelligentQuantum Date: Thu, 6 Jan 2022 15:25:00 +0330 Subject: [PATCH] refactor(Core/Packet): Character packets (#9546) * Character * Update CharacterHandler.cpp --- src/server/game/Entities/Unit/Unit.h | 2 + src/server/game/Handlers/CharacterHandler.cpp | 25 ++-- src/server/game/Handlers/MiscHandler.cpp | 50 +++---- src/server/game/Server/Packets/AllPackets.h | 1 + .../game/Server/Packets/CharacterPackets.cpp | 49 +++++++ .../game/Server/Packets/CharacterPackets.h | 122 ++++++++++++++++++ src/server/game/Server/WorldSession.cpp | 6 +- src/server/game/Server/WorldSession.h | 24 +++- 8 files changed, 228 insertions(+), 51 deletions(-) create mode 100644 src/server/game/Server/Packets/CharacterPackets.cpp create mode 100644 src/server/game/Server/Packets/CharacterPackets.h diff --git a/src/server/game/Entities/Unit/Unit.h b/src/server/game/Entities/Unit/Unit.h index f86823ebb..152f19afb 100644 --- a/src/server/game/Entities/Unit/Unit.h +++ b/src/server/game/Entities/Unit/Unit.h @@ -2625,6 +2625,7 @@ private: [[nodiscard]] float GetCombatRatingReduction(CombatRating cr) const; [[nodiscard]] uint32 GetCombatRatingDamageReduction(CombatRating cr, float rate, float cap, uint32 damage) const; +protected: void SetFeared(bool apply); void SetConfused(bool apply); void SetStunned(bool apply); @@ -2632,6 +2633,7 @@ private: uint32 m_rootTimes; +private: uint32 m_state; // Even derived shouldn't modify uint32 m_CombatTimer; uint32 m_lastManaUse; // msecs diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index c6c48167f..b7bae6c44 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -21,6 +21,7 @@ #include "Battleground.h" #include "CalendarMgr.h" #include "CharacterCache.h" +#include "CharacterPackets.h" #include "Chat.h" #include "Common.h" #include "DatabaseEnv.h" @@ -1199,9 +1200,9 @@ void WorldSession::HandlePlayerLoginToCharInWorld(Player* pCurrChar) _mask[i] = uint32(1) << (eff - (32 * i)); int32 val = 0; - for (SpellModList::const_iterator itr = spellMods.begin(); itr != spellMods.end(); ++itr) - if ((*itr)->type == modType && (*itr)->mask & _mask) - val += (*itr)->value; + for (auto const& spellMod : spellMods) + if (spellMod->type == modType && spellMod->mask & _mask) + val += spellMod->value; if (val == 0) continue; @@ -1315,18 +1316,20 @@ void WorldSession::HandleSetFactionInactiveOpcode(WorldPacket& recvData) _player->GetReputationMgr().SetInactive(replistid, inactive); } -void WorldSession::HandleShowingHelmOpcode(WorldPacket& recvData) +void WorldSession::HandleShowingHelmOpcode(WorldPackets::Character::ShowingHelm& packet) { - LOG_DEBUG("network.opcode", "CMSG_SHOWING_HELM for %s", _player->GetName().c_str()); - recvData.read_skip(); // unknown, bool? - _player->ToggleFlag(PLAYER_FLAGS, PLAYER_FLAGS_HIDE_HELM); + if (packet.ShowHelm) + _player->RemoveFlag(PLAYER_FLAGS, PLAYER_FLAGS_HIDE_HELM); + else + _player->SetFlag(PLAYER_FLAGS, PLAYER_FLAGS_HIDE_HELM); } -void WorldSession::HandleShowingCloakOpcode(WorldPacket& recvData) +void WorldSession::HandleShowingCloakOpcode(WorldPackets::Character::ShowingCloak& packet) { - LOG_DEBUG("network.opcode", "CMSG_SHOWING_CLOAK for %s", _player->GetName().c_str()); - recvData.read_skip(); // unknown, bool? - _player->ToggleFlag(PLAYER_FLAGS, PLAYER_FLAGS_HIDE_CLOAK); + if (packet.ShowCloak) + _player->RemoveFlag(PLAYER_FLAGS, PLAYER_FLAGS_HIDE_CLOAK); + else + _player->SetFlag(PLAYER_FLAGS, PLAYER_FLAGS_HIDE_CLOAK); } void WorldSession::HandleCharRenameOpcode(WorldPacket& recvData) diff --git a/src/server/game/Handlers/MiscHandler.cpp b/src/server/game/Handlers/MiscHandler.cpp index 1fd8a63c7..dd648a211 100644 --- a/src/server/game/Handlers/MiscHandler.cpp +++ b/src/server/game/Handlers/MiscHandler.cpp @@ -19,6 +19,7 @@ #include "BattlefieldMgr.h" #include "Battleground.h" #include "BattlegroundMgr.h" +#include "CharacterPackets.h" #include "Chat.h" #include "Common.h" #include "CreatureAI.h" @@ -406,7 +407,7 @@ void WorldSession::HandleWhoOpcode(WorldPacket& recvData) FMT_LOG_DEBUG("network", "WORLD: Send SMSG_WHO Message"); } -void WorldSession::HandleLogoutRequestOpcode(WorldPacket& /*recv_data*/) +void WorldSession::HandleLogoutRequestOpcode(WorldPackets::Character::LogoutRequest& /*logoutRequest*/) { LOG_DEBUG("network", "WORLD: Recvd CMSG_LOGOUT_REQUEST Message, security - %u", GetSecurity()); @@ -433,14 +434,14 @@ void WorldSession::HandleLogoutRequestOpcode(WorldPacket& /*recv_data*/) else if (preventAfkSanctuaryLogout || preventAfkLogout || GetPlayer()->duel || GetPlayer()->HasAura(9454)) // is dueling or frozen by GM via freeze command reason = 2; // FIXME - Need the correct value - WorldPacket data(SMSG_LOGOUT_RESPONSE, 1 + 4); - data << uint32(reason); - data << uint8(instantLogout); - SendPacket(&data); + WorldPackets::Character::LogoutResponse logoutResponse; + logoutResponse.LogoutResult = reason; + logoutResponse.Instant = instantLogout; + SendPacket(logoutResponse.Write()); if (reason) { - LogoutRequest(0); + SetLogoutStartTime(0); return; } @@ -459,35 +460,27 @@ void WorldSession::HandleLogoutRequestOpcode(WorldPacket& /*recv_data*/) GetPlayer()->SetStandState(UNIT_STAND_STATE_SIT); } - WorldPacket data2(SMSG_FORCE_MOVE_ROOT, (8 + 4)); // guess size - data2 << GetPlayer()->GetPackGUID(); - data2 << (uint32)2; - SendPacket(&data2); + GetPlayer()->SetRooted(true); GetPlayer()->SetFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED); } - LogoutRequest(time(nullptr)); + SetLogoutStartTime(time(nullptr)); } -void WorldSession::HandlePlayerLogoutOpcode(WorldPacket& /*recv_data*/) +void WorldSession::HandlePlayerLogoutOpcode(WorldPackets::Character::PlayerLogout& /*playerLogout*/) { - LOG_DEBUG("network", "WORLD: Recvd CMSG_PLAYER_LOGOUT Message"); } -void WorldSession::HandleLogoutCancelOpcode(WorldPacket& /*recv_data*/) +void WorldSession::HandleLogoutCancelOpcode(WorldPackets::Character::LogoutCancel& /*logoutCancel*/) { - LogoutRequest(0); + SetLogoutStartTime(0); - WorldPacket data(SMSG_LOGOUT_CANCEL_ACK, 0); - SendPacket(&data); + SendPacket(WorldPackets::Character::LogoutCancelAck().Write()); // not remove flags if can't free move - its not set in Logout request code. if (GetPlayer()->CanFreeMove()) { - data.Initialize(SMSG_FORCE_MOVE_UNROOT, 9 + 4); - data << GetPlayer()->GetPackGUID(); - data << uint32(0); - SendPacket(&data); + GetPlayer()->SetRooted(false); GetPlayer()->SetStandState(UNIT_STAND_STATE_STAND); GetPlayer()->RemoveFlag(UNIT_FIELD_FLAGS, UNIT_FLAG_STUNNED); @@ -1000,16 +993,13 @@ void WorldSession::HandleSetActionBarToggles(WorldPacket& recv_data) GetPlayer()->SetByteValue(PLAYER_FIELD_BYTES, 2, ActionBar); } -void WorldSession::HandlePlayedTime(WorldPacket& recv_data) +void WorldSession::HandlePlayedTime(WorldPackets::Character::PlayedTimeClient& packet) { - uint8 unk1; - recv_data >> unk1; // 0 or 1 expected - - WorldPacket data(SMSG_PLAYED_TIME, 4 + 4 + 1); - data << uint32(_player->GetTotalPlayedTime()); - data << uint32(_player->GetLevelPlayedTime()); - data << uint8(unk1); // 0 - will not show in chat frame - SendPacket(&data); + WorldPackets::Character::PlayedTime playedTime; + playedTime.TotalTime = _player->GetTotalPlayedTime(); + playedTime.LevelTime = _player->GetLevelPlayedTime(); + playedTime.TriggerScriptEvent = packet.TriggerScriptEvent; // 0-1 - will not show in chat frame + SendPacket(playedTime.Write()); } void WorldSession::HandleInspectOpcode(WorldPacket& recv_data) diff --git a/src/server/game/Server/Packets/AllPackets.h b/src/server/game/Server/Packets/AllPackets.h index e18eec4ac..6c56663fe 100644 --- a/src/server/game/Server/Packets/AllPackets.h +++ b/src/server/game/Server/Packets/AllPackets.h @@ -18,6 +18,7 @@ #ifndef AllPackets_h__ #define AllPackets_h__ +#include "CharacterPackets.h" #include "MiscPackets.h" #include "WorldStatePackets.h" #include "TotemPackets.h" diff --git a/src/server/game/Server/Packets/CharacterPackets.cpp b/src/server/game/Server/Packets/CharacterPackets.cpp new file mode 100644 index 000000000..d641849e8 --- /dev/null +++ b/src/server/game/Server/Packets/CharacterPackets.cpp @@ -0,0 +1,49 @@ +/* + * This file is part of the AzerothCore 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 Affero General Public License as published by the + * Free Software Foundation; either version 3 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 Affero 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 "CharacterPackets.h" + +void WorldPackets::Character::ShowingCloak::Read() +{ + _worldPacket >> ShowCloak; +} + +void WorldPackets::Character::ShowingHelm::Read() +{ + _worldPacket >> ShowHelm; +} + +WorldPacket const* WorldPackets::Character::LogoutResponse::Write() +{ + _worldPacket << uint32(LogoutResult); + _worldPacket << uint8(Instant); + return &_worldPacket; +} + +void WorldPackets::Character::PlayedTimeClient::Read() +{ + _worldPacket >> TriggerScriptEvent; +} + +WorldPacket const* WorldPackets::Character::PlayedTime::Write() +{ + _worldPacket << uint32(TotalTime); + _worldPacket << uint32(LevelTime); + _worldPacket << uint8(TriggerScriptEvent); + + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/CharacterPackets.h b/src/server/game/Server/Packets/CharacterPackets.h new file mode 100644 index 000000000..a1d0a952b --- /dev/null +++ b/src/server/game/Server/Packets/CharacterPackets.h @@ -0,0 +1,122 @@ +/* + * This file is part of the AzerothCore 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 Affero General Public License as published by the + * Free Software Foundation; either version 3 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 Affero 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 CharacterPackets_h__ +#define CharacterPackets_h__ + +#include "Packet.h" + +namespace WorldPackets +{ + namespace Character + { + class ShowingCloak final : public ClientPacket + { + public: + ShowingCloak(WorldPacket&& packet) : ClientPacket(CMSG_SHOWING_CLOAK, std::move(packet)) { } + + void Read() override; + + bool ShowCloak = false; + }; + + class ShowingHelm final : public ClientPacket + { + public: + ShowingHelm(WorldPacket&& packet) : ClientPacket(CMSG_SHOWING_HELM, std::move(packet)) { } + + void Read() override; + + bool ShowHelm = false; + }; + + class LogoutRequest final : public ClientPacket + { + public: + LogoutRequest(WorldPacket&& packet) : ClientPacket(std::move(packet)) { } + + void Read() override { } + }; + + class LogoutResponse final : public ServerPacket + { + public: + LogoutResponse() : ServerPacket(SMSG_LOGOUT_RESPONSE, 4 + 1) { } + + WorldPacket const* Write() override; + + uint32 LogoutResult = 0; + bool Instant = false; + }; + + class LogoutComplete final : public ServerPacket + { + public: + LogoutComplete() : ServerPacket(SMSG_LOGOUT_COMPLETE, 0) { } + + WorldPacket const* Write() override { return &_worldPacket; } + }; + + class LogoutCancel final : public ClientPacket + { + public: + LogoutCancel(WorldPacket&& packet) : ClientPacket(std::move(packet)) { } + + void Read() override { } + }; + + class LogoutCancelAck final : public ServerPacket + { + public: + LogoutCancelAck() : ServerPacket(SMSG_LOGOUT_CANCEL_ACK, 0) { } + + WorldPacket const* Write() override { return &_worldPacket; } + }; + + class PlayerLogout final : public ClientPacket + { + public: + PlayerLogout(WorldPacket&& packet) : ClientPacket(std::move(packet)) { } + + void Read() override { } + }; + + class PlayedTimeClient final : public ClientPacket + { + public: + PlayedTimeClient(WorldPacket&& packet) : ClientPacket(CMSG_PLAYED_TIME, std::move(packet)) { } + + void Read() override; + + bool TriggerScriptEvent = false; + }; + + class PlayedTime final : public ServerPacket + { + public: + PlayedTime() : ServerPacket(SMSG_PLAYED_TIME, 9) { } + + WorldPacket const* Write() override; + + uint32 TotalTime = 0; + uint32 LevelTime = 0; + bool TriggerScriptEvent = false; + }; + } +} + +#endif // CharacterPackets_h__ diff --git a/src/server/game/Server/WorldSession.cpp b/src/server/game/Server/WorldSession.cpp index 45fc8cc0e..4b2967462 100644 --- a/src/server/game/Server/WorldSession.cpp +++ b/src/server/game/Server/WorldSession.cpp @@ -22,6 +22,7 @@ #include "WorldSession.h" #include "AccountMgr.h" #include "BattlegroundMgr.h" +#include "CharacterPackets.h" #include "Common.h" #include "DatabaseEnv.h" #include "Group.h" @@ -687,8 +688,7 @@ void WorldSession::LogoutPlayer(bool save) //! Send the 'logout complete' packet to the client //! Client will respond by sending 3x CMSG_CANCEL_TRADE, which we currently dont handle - WorldPacket data(SMSG_LOGOUT_COMPLETE, 0); - SendPacket(&data); + SendPacket(WorldPackets::Character::LogoutComplete().Write()); LOG_DEBUG("network", "SESSION: Sent SMSG_LOGOUT_COMPLETE Message"); //! Since each account can only have one online character at any given time, ensure all characters for active account are marked as offline @@ -699,7 +699,7 @@ void WorldSession::LogoutPlayer(bool save) m_playerLogout = false; m_playerSave = false; - LogoutRequest(0); + SetLogoutStartTime(0); } /// Kick a player out of the World diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index c9f836b76..3c60a4be2 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -71,6 +71,16 @@ namespace lfg namespace WorldPackets { + namespace Character + { + class LogoutCancel; + class LogoutRequest; + class ShowingCloak; + class ShowingHelm; + class PlayerLogout; + class PlayedTimeClient; + } + namespace Totem { class TotemDestroyed; @@ -342,7 +352,7 @@ public: bool isLogingOut() const { return _logoutTime || m_playerLogout; } /// Engage the logout process for the user - void LogoutRequest(time_t requestTime) + void SetLogoutStartTime(time_t requestTime) { _logoutTime = requestTime; } @@ -515,7 +525,7 @@ public: // opcodes handlers void SendSetPlayerDeclinedNamesResult(DeclinedNameResult result, ObjectGuid guid); // played time - void HandlePlayedTime(WorldPacket& recvPacket); + void HandlePlayedTime(WorldPackets::Character::PlayedTimeClient& packet); // new void HandleMoveUnRootAck(WorldPacket& recvPacket); @@ -535,8 +545,8 @@ public: // opcodes handlers void HandleMountSpecialAnimOpcode(WorldPacket& recvdata); // character view - void HandleShowingHelmOpcode(WorldPacket& recvData); - void HandleShowingCloakOpcode(WorldPacket& recvData); + void HandleShowingHelmOpcode(WorldPackets::Character::ShowingHelm& packet); + void HandleShowingCloakOpcode(WorldPackets::Character::ShowingCloak& packet); // repair void HandleRepairItemOpcode(WorldPacket& recvPacket); @@ -554,9 +564,9 @@ public: // opcodes handlers void HandleLootReleaseOpcode(WorldPacket& recvPacket); void HandleLootMasterGiveOpcode(WorldPacket& recvPacket); void HandleWhoOpcode(WorldPacket& recvPacket); - void HandleLogoutRequestOpcode(WorldPacket& recvPacket); - void HandlePlayerLogoutOpcode(WorldPacket& recvPacket); - void HandleLogoutCancelOpcode(WorldPacket& recvPacket); + void HandleLogoutRequestOpcode(WorldPackets::Character::LogoutRequest& logoutRequest); + void HandlePlayerLogoutOpcode(WorldPackets::Character::PlayerLogout& playerLogout); + void HandleLogoutCancelOpcode(WorldPackets::Character::LogoutCancel& logoutCancel); // GM Ticket opcodes void HandleGMTicketCreateOpcode(WorldPacket& recvPacket);