diff options
-rw-r--r-- | src/server/game/Handlers/QueryHandler.cpp | 34 | ||||
-rw-r--r-- | src/server/game/Server/Packets/CharacterPackets.cpp | 43 | ||||
-rw-r--r-- | src/server/game/Server/Packets/CharacterPackets.h | 44 | ||||
-rw-r--r-- | src/server/game/Server/Packets/QueryPackets.cpp | 65 | ||||
-rw-r--r-- | src/server/game/Server/Packets/QueryPackets.h | 76 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 6 | ||||
-rw-r--r-- | src/server/game/Server/WorldSession.h | 7 |
7 files changed, 163 insertions, 112 deletions
diff --git a/src/server/game/Handlers/QueryHandler.cpp b/src/server/game/Handlers/QueryHandler.cpp index 490097ec647..f432ff70275 100644 --- a/src/server/game/Handlers/QueryHandler.cpp +++ b/src/server/game/Handlers/QueryHandler.cpp @@ -39,7 +39,7 @@ void WorldSession::SendNameQueryOpcode(ObjectGuid guid) Player* player = ObjectAccessor::FindConnectedPlayer(guid); CharacterInfo const* characterInfo = sWorld->GetCharacterInfo(guid); - WorldPackets::Character::PlayerNameResponse response; + WorldPackets::Query::QueryPlayerNameResponse response; response.Player = guid; if (characterInfo) @@ -68,7 +68,7 @@ void WorldSession::SendNameQueryOpcode(ObjectGuid guid) SendPacket(response.Write()); } -void WorldSession::HandleNameQueryOpcode(WorldPackets::Character::QueryPlayerName& packet) +void WorldSession::HandleNameQueryOpcode(WorldPackets::Query::QueryPlayerName& packet) { SendNameQueryOpcode(packet.Player); } @@ -326,41 +326,39 @@ void WorldSession::HandleNpcTextQueryOpcode(WorldPacket& recvData) } /// Only _static_ data is sent in this packet !!! -void WorldSession::HandlePageTextQueryOpcode(WorldPacket& recvData) +void WorldSession::HandlePageTextQueryOpcode(WorldPackets::Query::QueryPageText& packet) { TC_LOG_DEBUG("network", "WORLD: Received CMSG_PAGE_TEXT_QUERY"); - - uint32 pageID; - recvData >> pageID; - recvData.read_skip<uint64>(); // guid + + uint32 pageID = packet.PageTextID; while (pageID) { PageText const* pageText = sObjectMgr->GetPageText(pageID); - // guess size - WorldPacket data(SMSG_PAGE_TEXT_QUERY_RESPONSE, 50); - data << pageID; + + WorldPackets::Query::QueryPageTextResponse response; + response.PageTextID = pageID; if (!pageText) { - data << "Item page missing."; - data << uint32(0); + response.Allow = false; pageID = 0; } else { - std::string Text = pageText->Text; - + response.Allow = true; + response.Info.ID = pageID; + int loc_idx = GetSessionDbLocaleIndex(); if (loc_idx >= 0) if (PageTextLocale const* player = sObjectMgr->GetPageTextLocale(pageID)) - ObjectMgr::GetLocaleString(player->Text, loc_idx, Text); + ObjectMgr::GetLocaleString(player->Text, loc_idx, response.Info.Text); - data << Text; - data << uint32(pageText->NextPageID); + response.Info.NextPageID = pageText->NextPageID; pageID = pageText->NextPageID; } - SendPacket(&data); + + SendPacket(response.Write()); TC_LOG_DEBUG("network", "WORLD: Sent SMSG_PAGE_TEXT_QUERY_RESPONSE"); } diff --git a/src/server/game/Server/Packets/CharacterPackets.cpp b/src/server/game/Server/Packets/CharacterPackets.cpp index 9876da54ae3..8fae98cf8f2 100644 --- a/src/server/game/Server/Packets/CharacterPackets.cpp +++ b/src/server/game/Server/Packets/CharacterPackets.cpp @@ -395,46 +395,3 @@ void WorldPackets::Character::LoadingScreenNotify::Read() _worldPacket >> MapID; Showing = _worldPacket.ReadBit(); } - -void WorldPackets::Character::QueryPlayerName::Read() -{ - _worldPacket >> Player; - - Hint.VirtualRealmAddress.HasValue = _worldPacket.ReadBit(); - Hint.NativeRealmAddress.HasValue = _worldPacket.ReadBit(); - - if (Hint.VirtualRealmAddress.HasValue) - _worldPacket >> Hint.VirtualRealmAddress.value; - - if (Hint.NativeRealmAddress.HasValue) - _worldPacket >> Hint.NativeRealmAddress.value; -} - -WorldPacket const* WorldPackets::Character::PlayerNameResponse::Write() -{ - _worldPacket << Result; - _worldPacket << Player; - - if (Result == 0) - { - _worldPacket.WriteBits(Data.Name.length(), 7); - - for (int i = 0; i < MAX_DECLINED_NAME_CASES; ++i) - _worldPacket.WriteBits(Data.DeclinedNames.name[i].length(), 7); - - for (int i = 0; i < MAX_DECLINED_NAME_CASES; ++i) - _worldPacket.WriteString(Data.DeclinedNames.name[i]); - - _worldPacket << Data.AccountID; - _worldPacket << Data.BnetAccountID; - _worldPacket << Data.GuidActual; - _worldPacket << Data.VirtualRealmAddress; - _worldPacket << Data.Race; - _worldPacket << Data.Sex; - _worldPacket << Data.ClassID; - _worldPacket << Data.Level; - _worldPacket.WriteString(Data.Name); - } - - return &_worldPacket; -} diff --git a/src/server/game/Server/Packets/CharacterPackets.h b/src/server/game/Server/Packets/CharacterPackets.h index 8ffd3622539..386c407b10f 100644 --- a/src/server/game/Server/Packets/CharacterPackets.h +++ b/src/server/game/Server/Packets/CharacterPackets.h @@ -473,50 +473,6 @@ namespace WorldPackets int32 MapID = -1; bool Showing = false; }; - - struct PlayerGuidLookupHint - { - Optional<uint32> VirtualRealmAddress; ///< current realm (?) (identifier made from the Index, BattleGroup and Region) - Optional<uint32> NativeRealmAddress; ///< original realm (?) (identifier made from the Index, BattleGroup and Region) - }; - - struct PlayerGuidLookupData - { - bool IsDeleted = false; - ObjectGuid AccountID; - ObjectGuid BnetAccountID; - ObjectGuid GuidActual; - std::string Name; - uint32 VirtualRealmAddress = 0; - uint8 Race = RACE_NONE; - uint8 Sex = GENDER_NONE; - uint8 ClassID = CLASS_NONE; - uint8 Level = 0; - DeclinedName DeclinedNames; - }; - - class QueryPlayerName final : public ClientPacket - { - public: - QueryPlayerName(WorldPacket&& packet) : ClientPacket(CMSG_NAME_QUERY, std::move(packet)) { } - - void Read() override; - - ObjectGuid Player; - PlayerGuidLookupHint Hint; - }; - - class PlayerNameResponse final : public ServerPacket - { - public: - PlayerNameResponse() : ServerPacket(SMSG_NAME_QUERY_RESPONSE, 60) { } - - WorldPacket const* Write() override; - - ObjectGuid Player; - uint8 Result = 0; // 0 - full packet, != 0 - only guid - PlayerGuidLookupData Data; - }; } } diff --git a/src/server/game/Server/Packets/QueryPackets.cpp b/src/server/game/Server/Packets/QueryPackets.cpp index 3076c221c71..eec966e2cfb 100644 --- a/src/server/game/Server/Packets/QueryPackets.cpp +++ b/src/server/game/Server/Packets/QueryPackets.cpp @@ -88,3 +88,68 @@ WorldPacket const* WorldPackets::Query::QueryCreatureResponse::Write() return &_worldPacket; } + +void WorldPackets::Query::QueryPlayerName::Read() +{ + _worldPacket >> Player; + + Hint.VirtualRealmAddress.HasValue = _worldPacket.ReadBit(); + Hint.NativeRealmAddress.HasValue = _worldPacket.ReadBit(); + + if (Hint.VirtualRealmAddress.HasValue) + _worldPacket >> Hint.VirtualRealmAddress.value; + + if (Hint.NativeRealmAddress.HasValue) + _worldPacket >> Hint.NativeRealmAddress.value; +} + +WorldPacket const* WorldPackets::Query::QueryPlayerNameResponse::Write() +{ + _worldPacket << Result; + _worldPacket << Player; + + if (Result == 0) + { + _worldPacket.WriteBits(Data.Name.length(), 7); + + for (int i = 0; i < MAX_DECLINED_NAME_CASES; ++i) + _worldPacket.WriteBits(Data.DeclinedNames.name[i].length(), 7); + + for (int i = 0; i < MAX_DECLINED_NAME_CASES; ++i) + _worldPacket.WriteString(Data.DeclinedNames.name[i]); + + _worldPacket << Data.AccountID; + _worldPacket << Data.BnetAccountID; + _worldPacket << Data.GuidActual; + _worldPacket << Data.VirtualRealmAddress; + _worldPacket << Data.Race; + _worldPacket << Data.Sex; + _worldPacket << Data.ClassID; + _worldPacket << Data.Level; + _worldPacket.WriteString(Data.Name); + } + + return &_worldPacket; +} + +void WorldPackets::Query::QueryPageText::Read() +{ + _worldPacket >> PageTextID; + _worldPacket >> ItemGUID; +} + +WorldPacket const* WorldPackets::Query::QueryPageTextResponse::Write() +{ + _worldPacket << PageTextID; + _worldPacket.WriteBit(Allow); + + if (Allow) + { + _worldPacket << Info.ID; + _worldPacket << Info.NextPageID; + _worldPacket.WriteBits(Info.Text.length(), 12); + _worldPacket.WriteString(Info.Text); + } + + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/QueryPackets.h b/src/server/game/Server/Packets/QueryPackets.h index 49bb5847400..b7c57e94747 100644 --- a/src/server/game/Server/Packets/QueryPackets.h +++ b/src/server/game/Server/Packets/QueryPackets.h @@ -59,7 +59,7 @@ namespace WorldPackets class QueryCreatureResponse final : public ServerPacket { public: - QueryCreatureResponse() : ServerPacket(SMSG_CREATURE_QUERY_RESPONSE, 2+4+4+4+12) { } + QueryCreatureResponse() : ServerPacket(SMSG_CREATURE_QUERY_RESPONSE, 76) { } WorldPacket const* Write() override; @@ -67,6 +67,80 @@ namespace WorldPackets CreatureStats Stats; uint32 CreatureID = 0; }; + + struct PlayerGuidLookupHint + { + Optional<uint32> VirtualRealmAddress; ///< current realm (?) (identifier made from the Index, BattleGroup and Region) + Optional<uint32> NativeRealmAddress; ///< original realm (?) (identifier made from the Index, BattleGroup and Region) + }; + + class QueryPlayerName final : public ClientPacket + { + public: + QueryPlayerName(WorldPacket&& packet) : ClientPacket(CMSG_NAME_QUERY, std::move(packet)) { } + + void Read() override; + + ObjectGuid Player; + PlayerGuidLookupHint Hint; + }; + + struct PlayerGuidLookupData + { + bool IsDeleted = false; + ObjectGuid AccountID; + ObjectGuid BnetAccountID; + ObjectGuid GuidActual; + std::string Name; + uint32 VirtualRealmAddress = 0; + uint8 Race = RACE_NONE; + uint8 Sex = GENDER_NONE; + uint8 ClassID = CLASS_NONE; + uint8 Level = 0; + DeclinedName DeclinedNames; + }; + + class QueryPlayerNameResponse final : public ServerPacket + { + public: + QueryPlayerNameResponse() : ServerPacket(SMSG_NAME_QUERY_RESPONSE, 60) { } + + WorldPacket const* Write() override; + + ObjectGuid Player; + uint8 Result = 0; // 0 - full packet, != 0 - only guid + PlayerGuidLookupData Data; + }; + + class QueryPageText final : public ClientPacket + { + public: + QueryPageText(WorldPacket&& packet) : ClientPacket(CMSG_PAGE_TEXT_QUERY, std::move(packet)) { } + + void Read() override; + + ObjectGuid ItemGUID; + uint32 PageTextID = 0; + }; + + struct PageTextInfo + { + uint32 ID = 0; + uint32 NextPageID = 0; + std::string Text; + }; + + class QueryPageTextResponse final : public ServerPacket + { + public: + QueryPageTextResponse() : ServerPacket(SMSG_PAGE_TEXT_QUERY_RESPONSE, 15) { } + + WorldPacket const* Write() override; + + bool Allow = false; + PageTextInfo Info; + uint32 PageTextID = 0; + }; } } diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index c5cff72df4e..89b130c61f4 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -471,7 +471,7 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_TIME_SKIPPED, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::HandleMoveTimeSkippedOpcode ); DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_WATER_WALK_ACK, STATUS_UNHANDLED, PROCESS_THREADSAFE, &WorldSession::HandleMoveWaterWalkAck ); DEFINE_OPCODE_HANDLER_OLD(CMSG_MOVE_WORLDPORT_ACK, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleMoveWorldportAckOpcode ); - DEFINE_HANDLER(CMSG_NAME_QUERY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Character::QueryPlayerName, &WorldSession::HandleNameQueryOpcode); + DEFINE_HANDLER(CMSG_NAME_QUERY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Query::QueryPlayerName, &WorldSession::HandleNameQueryOpcode); DEFINE_OPCODE_HANDLER_OLD(CMSG_NEXT_CINEMATIC_CAMERA, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleNextCinematicCamera ); DEFINE_OPCODE_HANDLER_OLD(CMSG_NPC_TEXT_QUERY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleNpcTextQueryOpcode ); DEFINE_OPCODE_HANDLER_OLD(CMSG_OBJECT_UPDATE_FAILED, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::HandleObjectUpdateFailedOpcode ); @@ -480,7 +480,7 @@ void OpcodeTable::Initialize() DEFINE_OPCODE_HANDLER_OLD(CMSG_OPENING_CINEMATIC, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleOpeningCinematic ); DEFINE_OPCODE_HANDLER_OLD(CMSG_OPEN_ITEM, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleOpenItemOpcode ); DEFINE_OPCODE_HANDLER_OLD(CMSG_OPT_OUT_OF_LOOT, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandleOptOutOfLootOpcode ); - DEFINE_OPCODE_HANDLER_OLD(CMSG_PAGE_TEXT_QUERY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandlePageTextQueryOpcode ); + DEFINE_HANDLER(CMSG_PAGE_TEXT_QUERY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Query::QueryPageText, &WorldSession::HandlePageTextQueryOpcode); DEFINE_OPCODE_HANDLER_OLD(CMSG_PARTY_SILENCE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER_OLD(CMSG_PARTY_UNSILENCE, STATUS_UNHANDLED, PROCESS_INPLACE, &WorldSession::Handle_NULL ); DEFINE_OPCODE_HANDLER_OLD(CMSG_PETITION_BUY, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandlePetitionBuyOpcode ); @@ -1138,7 +1138,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_OPEN_CONTAINER, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_OPEN_LFG_DUNGEON_FINDER, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_OVERRIDE_LIGHT, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_PAGE_TEXT_QUERY_RESPONSE, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_PAGE_TEXT_QUERY_RESPONSE, STATUS_NEVER); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PARTYKILLLOG, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PARTY_COMMAND_RESULT, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PARTY_MEMBER_STATS, STATUS_UNHANDLED); diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 5b5cde1bc63..2db482e220c 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -94,7 +94,6 @@ namespace WorldPackets class LogoutRequest; class LogoutCancel; class LoadingScreenNotify; - class QueryPlayerName; } namespace Guild @@ -115,6 +114,8 @@ namespace WorldPackets namespace Query { class QueryCreature; + class QueryPlayerName; + class QueryPageText; } namespace Movement @@ -586,7 +587,7 @@ class WorldSession void HandleMeetingStoneInfo(WorldPacket& recPacket); void HandleGameobjectReportUse(WorldPacket& recvPacket); - void HandleNameQueryOpcode(WorldPackets::Character::QueryPlayerName& packet); + void HandleNameQueryOpcode(WorldPackets::Query::QueryPlayerName& packet); void HandleQueryTimeOpcode(WorldPacket& recvPacket); @@ -839,7 +840,7 @@ class WorldSession void HandleCompleteCinematic(WorldPacket& recvPacket); void HandleNextCinematicCamera(WorldPacket& recvPacket); - void HandlePageTextQueryOpcode(WorldPacket& recvPacket); + void HandlePageTextQueryOpcode(WorldPackets::Query::QueryPageText& packet); void HandleTutorialFlag (WorldPacket& recvData); void HandleTutorialClear(WorldPacket& recvData); |