From ce5d28617d1d3f6f2a5000395324119192d8d049 Mon Sep 17 00:00:00 2001 From: Ovahlord Date: Sun, 30 Aug 2020 02:23:27 +0200 Subject: [PATCH] Core/Packets: converted CMSG_GENERATE_RANDOM_CHARACTER_NAME, SMSG_GENERATE_RANDOM_CHARACTER_NAME_RESULT, CMSG_CHAR_DELETE, SMSG_CREATE_CHAR, SMSG_DELETE_CHAR and CMSG_PLAYER_LOGIN to packet class --- src/server/game/Handlers/CharacterHandler.cpp | 103 +++++++----------- .../game/Server/Packets/CharacterPackets.cpp | 55 ++++++++++ .../game/Server/Packets/CharacterPackets.h | 62 +++++++++++ src/server/game/Server/Protocol/Opcodes.cpp | 8 +- src/server/game/Server/Protocol/Opcodes.h | 8 +- src/server/game/Server/WorldSession.h | 9 +- 6 files changed, 168 insertions(+), 77 deletions(-) diff --git a/src/server/game/Handlers/CharacterHandler.cpp b/src/server/game/Handlers/CharacterHandler.cpp index 079b9527fe..27007128b5 100644 --- a/src/server/game/Handlers/CharacterHandler.cpp +++ b/src/server/game/Handlers/CharacterHandler.cpp @@ -665,17 +665,15 @@ void WorldSession::HandleCharCreateOpcode(WorldPacket& recvData) })); } -void WorldSession::HandleCharDeleteOpcode(WorldPacket& recvData) +void WorldSession::HandleCharDeleteOpcode(WorldPackets::Character::CharDelete& packet) { - ObjectGuid guid; - recvData >> guid; // Initiating uint32 initAccountId = GetAccountId(); // can't delete loaded character - if (ObjectAccessor::FindPlayer(guid)) + if (ObjectAccessor::FindPlayer(packet.Guid)) { - sScriptMgr->OnPlayerFailedDelete(guid, initAccountId); + sScriptMgr->OnPlayerFailedDelete(packet.Guid, initAccountId); return; } @@ -684,25 +682,25 @@ void WorldSession::HandleCharDeleteOpcode(WorldPacket& recvData) std::string name; // is guild leader - if (sGuildMgr->GetGuildByLeader(guid)) + if (sGuildMgr->GetGuildByLeader(packet.Guid)) { - sScriptMgr->OnPlayerFailedDelete(guid, initAccountId); + sScriptMgr->OnPlayerFailedDelete(packet.Guid, initAccountId); SendCharDelete(CHAR_DELETE_FAILED_GUILD_LEADER); return; } // is arena team captain - if (sArenaTeamMgr->GetArenaTeamByCaptain(guid)) + if (sArenaTeamMgr->GetArenaTeamByCaptain(packet.Guid)) { - sScriptMgr->OnPlayerFailedDelete(guid, initAccountId); + sScriptMgr->OnPlayerFailedDelete(packet.Guid, initAccountId); SendCharDelete(CHAR_DELETE_FAILED_ARENA_CAPTAIN); return; } - CharacterCacheEntry const* characterInfo = sCharacterCache->GetCharacterCacheByGuid(guid); + CharacterCacheEntry const* characterInfo = sCharacterCache->GetCharacterCacheByGuid(packet.Guid); if (!characterInfo) { - sScriptMgr->OnPlayerFailedDelete(guid, initAccountId); + sScriptMgr->OnPlayerFailedDelete(packet.Guid, initAccountId); return; } @@ -713,31 +711,31 @@ void WorldSession::HandleCharDeleteOpcode(WorldPacket& recvData) // prevent deleting other players' characters using cheating tools if (accountId != initAccountId) { - sScriptMgr->OnPlayerFailedDelete(guid, initAccountId); + sScriptMgr->OnPlayerFailedDelete(packet.Guid, initAccountId); return; } - TC_LOG_INFO("entities.player.character", "Account: %d, IP: %s deleted character: %s, %s, Level: %u", accountId, GetRemoteAddress().c_str(), name.c_str(), guid.ToString().c_str(), level); + TC_LOG_INFO("entities.player.character", "Account: %d, IP: %s deleted character: %s, %s, Level: %u", accountId, GetRemoteAddress().c_str(), name.c_str(), packet.Guid.ToString().c_str(), level); // To prevent hook failure, place hook before removing reference from DB - sScriptMgr->OnPlayerDelete(guid, initAccountId); // To prevent race conditioning, but as it also makes sense, we hand the accountId over for successful delete. + sScriptMgr->OnPlayerDelete(packet.Guid, initAccountId); // To prevent race conditioning, but as it also makes sense, we hand the accountId over for successful delete. // Shouldn't interfere with character deletion though if (sLog->ShouldLog("entities.player.dump", LOG_LEVEL_INFO)) // optimize GetPlayerDump call { std::string dump; - if (PlayerDumpWriter().GetDump(guid.GetCounter(), dump)) - sLog->outCharDump(dump.c_str(), accountId, guid.GetRawValue(), name.c_str()); + if (PlayerDumpWriter().GetDump(packet.Guid.GetCounter(), dump)) + sLog->outCharDump(dump.c_str(), accountId, packet.Guid.GetRawValue(), name.c_str()); } - sGuildFinderMgr->RemoveAllMembershipRequestsFromPlayer(guid); - sCalendarMgr->RemoveAllPlayerEventsAndInvites(guid); - Player::DeleteFromDB(guid, accountId); + sGuildFinderMgr->RemoveAllMembershipRequestsFromPlayer(packet.Guid); + sCalendarMgr->RemoveAllPlayerEventsAndInvites(packet.Guid); + Player::DeleteFromDB(packet.Guid, accountId); SendCharDelete(CHAR_DELETE_SUCCESS); } -void WorldSession::HandlePlayerLoginOpcode(WorldPacket& recvData) +void WorldSession::HandlePlayerLoginOpcode(WorldPackets::Character::PlayerLogin& packet) { if (PlayerLoading() || GetPlayer() != nullptr) { @@ -746,32 +744,11 @@ void WorldSession::HandlePlayerLoginOpcode(WorldPacket& recvData) return; } - ObjectGuid playerGuid; + m_playerLoading = packet.Guid; - TC_LOG_DEBUG("network", "WORLD: Recvd Player Logon Message"); - playerGuid[2] = recvData.ReadBit(); - playerGuid[3] = recvData.ReadBit(); - playerGuid[0] = recvData.ReadBit(); - playerGuid[6] = recvData.ReadBit(); - playerGuid[4] = recvData.ReadBit(); - playerGuid[5] = recvData.ReadBit(); - playerGuid[1] = recvData.ReadBit(); - playerGuid[7] = recvData.ReadBit(); - - recvData.ReadByteSeq(playerGuid[2]); - recvData.ReadByteSeq(playerGuid[7]); - recvData.ReadByteSeq(playerGuid[0]); - recvData.ReadByteSeq(playerGuid[3]); - recvData.ReadByteSeq(playerGuid[5]); - recvData.ReadByteSeq(playerGuid[6]); - recvData.ReadByteSeq(playerGuid[1]); - recvData.ReadByteSeq(playerGuid[4]); - - m_playerLoading = playerGuid; - - if (!IsLegitCharacterForAccount(playerGuid)) + if (!IsLegitCharacterForAccount(packet.Guid)) { - TC_LOG_ERROR("network", "Account (%u) can't login with that character (%s).", GetAccountId(), playerGuid.ToString().c_str()); + TC_LOG_ERROR("network", "Account (%u) can't login with that character (%s).", GetAccountId(), packet.Guid.ToString().c_str()); KickPlayer(); return; } @@ -2299,16 +2276,16 @@ void WorldSession::HandleCharFactionOrRaceChangeCallback(std::shared_ptr> race; - recvData >> gender; - - if (!Player::IsValidRace(race)) + if (!Player::IsValidRace(packet.Race)) { - TC_LOG_ERROR("misc", "Invalid race (%u) sent by accountId: %u", race, GetAccountId()); + TC_LOG_ERROR("misc", "Invalid race (%u) sent by accountId: %u", packet.Race, GetAccountId()); return; } - if (!Player::IsValidGender(gender)) + if (!Player::IsValidGender(packet.Sex)) { - TC_LOG_ERROR("misc", "Invalid gender (%u) sent by accountId: %u", gender, GetAccountId()); + TC_LOG_ERROR("misc", "Invalid gender (%u) sent by accountId: %u", packet.Sex, GetAccountId()); return; } - std::string const& name = sDBCManager.GetRandomCharacterName(race, gender); - WorldPacket data(SMSG_RANDOMIZE_CHAR_NAME, 10); - data.WriteBit(0); // unk - data.WriteBits(name.size(), 7); - data.WriteString(name); - SendPacket(&data); + std::string const& name = sDBCManager.GetRandomCharacterName(packet.Race, packet.Sex); + WorldPackets::Character::GenerateRandomCharacterNameResult nameResult; + nameResult.Success = true; + nameResult.Name = name; + SendPacket(nameResult.Write()); } void WorldSession::HandleReorderCharacters(WorldPacket& recvData) diff --git a/src/server/game/Server/Packets/CharacterPackets.cpp b/src/server/game/Server/Packets/CharacterPackets.cpp index f476ad2157..311d17ced3 100644 --- a/src/server/game/Server/Packets/CharacterPackets.cpp +++ b/src/server/game/Server/Packets/CharacterPackets.cpp @@ -232,3 +232,58 @@ WorldPacket const* WorldPackets::Character::LoginVerifyWorld::Write() _worldPacket << Pos; return &_worldPacket; } + +void WorldPackets::Character::GenerateRandomCharacterName::Read() +{ + _worldPacket >> Race; + _worldPacket >> Sex; +} + +WorldPacket const* WorldPackets::Character::GenerateRandomCharacterNameResult::Write() +{ + _worldPacket.WriteBit(Success); + _worldPacket.WriteBits(Name.size(), 7); + _worldPacket.WriteString(Name); + + return &_worldPacket; +} + +WorldPacket const* WorldPackets::Character::CreateChar::Write() +{ + _worldPacket << uint8(Code); + + return &_worldPacket; +} + +void WorldPackets::Character::CharDelete::Read() +{ + _worldPacket >> Guid; +} + +WorldPacket const* WorldPackets::Character::DeleteChar::Write() +{ + _worldPacket << uint8(Code); + + return &_worldPacket; +} + +void WorldPackets::Character::PlayerLogin::Read() +{ + Guid[2] = _worldPacket.ReadBit(); + Guid[3] = _worldPacket.ReadBit(); + Guid[0] = _worldPacket.ReadBit(); + Guid[6] = _worldPacket.ReadBit(); + Guid[4] = _worldPacket.ReadBit(); + Guid[5] = _worldPacket.ReadBit(); + Guid[1] = _worldPacket.ReadBit(); + Guid[7] = _worldPacket.ReadBit(); + + _worldPacket.ReadByteSeq(Guid[2]); + _worldPacket.ReadByteSeq(Guid[7]); + _worldPacket.ReadByteSeq(Guid[0]); + _worldPacket.ReadByteSeq(Guid[3]); + _worldPacket.ReadByteSeq(Guid[5]); + _worldPacket.ReadByteSeq(Guid[6]); + _worldPacket.ReadByteSeq(Guid[1]); + _worldPacket.ReadByteSeq(Guid[4]); +} diff --git a/src/server/game/Server/Packets/CharacterPackets.h b/src/server/game/Server/Packets/CharacterPackets.h index 7b529ba1cc..5da64a20da 100644 --- a/src/server/game/Server/Packets/CharacterPackets.h +++ b/src/server/game/Server/Packets/CharacterPackets.h @@ -156,6 +156,68 @@ namespace WorldPackets int32 MapID = -1; TaggedPosition Pos; }; + + class GenerateRandomCharacterName final : public ClientPacket + { + public: + GenerateRandomCharacterName(WorldPacket&& packet) : ClientPacket(CMSG_GENERATE_RANDOM_CHARACTER_NAME, std::move(packet)) { } + + void Read() override; + + uint8 Sex = 0; + uint8 Race = 0; + }; + + class GenerateRandomCharacterNameResult final : public ServerPacket + { + public: + GenerateRandomCharacterNameResult() : ServerPacket(SMSG_GENERATE_RANDOM_CHARACTER_NAME_RESULT, 10) { } + + WorldPacket const* Write() override; + + std::string Name; + bool Success = false; + }; + + class CreateChar final : public ServerPacket + { + public: + CreateChar() : ServerPacket(SMSG_CREATE_CHAR, 1) { } + + WorldPacket const* Write() override; + + uint8 Code = 0; ///< Result code @see enum ResponseCodes + }; + + class CharDelete final : public ClientPacket + { + public: + CharDelete(WorldPacket&& packet) : ClientPacket(CMSG_CHAR_DELETE, std::move(packet)) { } + + void Read() override; + + ObjectGuid Guid; ///< Guid of the character to delete + }; + + class DeleteChar final : public ServerPacket + { + public: + DeleteChar() : ServerPacket(SMSG_DELETE_CHAR, 1) { } + + WorldPacket const* Write() override; + + uint8 Code = 0; ///< Result code @see enum ResponseCodes + }; + + class PlayerLogin final : public ClientPacket + { + public: + PlayerLogin(WorldPacket&& packet) : ClientPacket(CMSG_PLAYER_LOGIN, std::move(packet)) { } + + void Read() override; + + ObjectGuid Guid; ///< Guid of the player that is logging in + }; } } diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 235fdb8afa..a271c7e0bb 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -526,7 +526,7 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_QUEST_NPC_QUERY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleQuestNPCQuery ); DEFINE_HANDLER(CMSG_QUEST_POI_QUERY, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleQuestPOIQuery ); DEFINE_HANDLER(CMSG_QUERY_QUEST_INFO, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleQuestQueryOpcode ); - DEFINE_HANDLER(CMSG_RANDOMIZE_CHAR_NAME, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleRandomizeCharNameOpcode ); + DEFINE_HANDLER(CMSG_GENERATE_RANDOM_CHARACTER_NAME, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleRandomizeCharNameOpcode ); DEFINE_HANDLER(CMSG_READY_FOR_ACCOUNT_DATA_TIMES, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleReadyForAccountDataTimes ); DEFINE_HANDLER(CMSG_READ_ITEM, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleReadItem ); DEFINE_HANDLER(CMSG_REALM_SPLIT, STATUS_AUTHED, PROCESS_THREADUNSAFE, &WorldSession::HandleRealmSplitOpcode ); @@ -756,9 +756,9 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHANNEL_MEMBER_COUNT, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHANNEL_NOTIFY, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHARACTER_LOGIN_FAILED, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHAR_CREATE, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_CREATE_CHAR, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHAR_CUSTOMIZE, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHAR_DELETE, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_DELETE_CHAR, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHAR_FACTION_CHANGE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHAR_RENAME, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHAT_IGNORED_ACCOUNT_MUTED, STATUS_NEVER, CONNECTION_TYPE_REALM); @@ -1162,7 +1162,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_RAID_MARKERS_CHANGED, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_RAID_READY_CHECK_THROTTLED_ERROR, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_RAID_SUMMON_FAILED, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_RANDOMIZE_CHAR_NAME, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_GENERATE_RANDOM_CHARACTER_NAME_RESULT, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_RATED_BG_RATING, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_RATED_BG_STATS, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_READ_ITEM_FAILED, STATUS_NEVER, CONNECTION_TYPE_REALM); diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h index ce3c4d1754..8ddca2be2b 100644 --- a/src/server/game/Server/Protocol/Opcodes.h +++ b/src/server/game/Server/Protocol/Opcodes.h @@ -442,7 +442,7 @@ enum OpcodeClient : uint16 CMSG_QUEST_NPC_QUERY = 0x7302, CMSG_QUEST_POI_QUERY = 0x4037, CMSG_QUERY_QUEST_INFO = 0x0D06, - CMSG_RANDOMIZE_CHAR_NAME = 0x2413, + CMSG_GENERATE_RANDOM_CHARACTER_NAME = 0x2413, CMSG_READY_FOR_ACCOUNT_DATA_TIMES = 0x2B16, CMSG_READ_ITEM = 0x2F16, CMSG_REALM_SPLIT = 0x2906, @@ -688,9 +688,9 @@ enum OpcodeServer SMSG_CHANNEL_MEMBER_COUNT = 0x6414, SMSG_CHANNEL_NOTIFY = 0x0825, SMSG_CHARACTER_LOGIN_FAILED = 0x4417, - SMSG_CHAR_CREATE = 0x2D05, + SMSG_CREATE_CHAR = 0x2D05, SMSG_CHAR_CUSTOMIZE = 0x4F16, - SMSG_CHAR_DELETE = 0x0304, + SMSG_DELETE_CHAR = 0x0304, SMSG_CHAR_FACTION_CHANGE = 0x4C06, SMSG_CHAR_RENAME = 0x2024, SMSG_CHAT_IGNORED_ACCOUNT_MUTED = 0x15A4, @@ -1120,7 +1120,7 @@ enum OpcodeServer SMSG_RAID_MARKERS_CHANGED = 0x10A1, SMSG_RAID_READY_CHECK_THROTTLED_ERROR = 0x2607, SMSG_RAID_SUMMON_FAILED = 0x18B6, - SMSG_RANDOMIZE_CHAR_NAME = 0x38B1, + SMSG_GENERATE_RANDOM_CHARACTER_NAME_RESULT = 0x38B1, SMSG_RATED_BG_RATING = 0x15A1, SMSG_RATED_BG_STATS = 0x34A1, SMSG_READ_ITEM_FAILED = 0x0F16, diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 18fc2db071..9ba42f4868 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -82,7 +82,10 @@ namespace WorldPackets namespace Character { + class CharDelete; class EnumCharacters; + class GenerateRandomCharacterName; + class PlayerLogin; class ShowingCloak; class ShowingHelm; @@ -592,9 +595,9 @@ class TC_GAME_API WorldSession void HandleCharEnum(PreparedQueryResult result); void HandleCharEnumOpcode(WorldPackets::Character::EnumCharacters& /*enumCharacters*/); - void HandleCharDeleteOpcode(WorldPacket& recvPacket); + void HandleCharDeleteOpcode(WorldPackets::Character::CharDelete& packet); void HandleCharCreateOpcode(WorldPacket& recvPacket); - void HandlePlayerLoginOpcode(WorldPacket& recvPacket); + void HandlePlayerLoginOpcode(WorldPackets::Character::PlayerLogin& packet); void SendConnectToInstance(WorldPackets::Auth::ConnectToSerial serial); void HandleContinuePlayerLogin(); @@ -611,7 +614,7 @@ class TC_GAME_API WorldSession void HandleCharCustomizeCallback(std::shared_ptr customizeInfo, PreparedQueryResult result); void HandleOpeningCinematic(WorldPackets::Misc::OpeningCinematic& packet); - void HandleRandomizeCharNameOpcode(WorldPacket& recvData); + void HandleRandomizeCharNameOpcode(WorldPackets::Character::GenerateRandomCharacterName& packet); void HandleReorderCharacters(WorldPacket& recvData); void SendCharCreate(ResponseCodes result); void SendCharDelete(ResponseCodes result);