diff --git a/src/server/game/Handlers/QueryHandler.cpp b/src/server/game/Handlers/QueryHandler.cpp index e52fb741ff..e82c9c3195 100644 --- a/src/server/game/Handlers/QueryHandler.cpp +++ b/src/server/game/Handlers/QueryHandler.cpp @@ -35,34 +35,16 @@ void WorldSession::SendNameQueryOpcode(ObjectGuid guid) { Player* player = ObjectAccessor::FindConnectedPlayer(guid); - CharacterCacheEntry const* nameData = sCharacterCache->GetCharacterCacheByGuid(guid); - WorldPacket data(SMSG_NAME_QUERY_RESPONSE, (8+1+1+1+1+1+10)); - data << guid.WriteAsPacked(); - if (!nameData) - { - data << uint8(1); // name unknown - SendPacket(&data); - return; - } + WorldPackets::Query::QueryPlayerNameResponse response; + response.Player = guid; - data << uint8(0); // name known - data << nameData->Name; // played name - data << uint8(0); // realm name - only set for cross realm interaction (such as Battlegrounds) - data << uint8(nameData->Race); - data << uint8(nameData->Sex); - data << uint8(nameData->Class); - - if (DeclinedName const* names = (player ? player->GetDeclinedNames() : nullptr)) - { - data << uint8(1); // Name is declined - for (uint8 i = 0; i < MAX_DECLINED_NAME_CASES; ++i) - data << names->name[i]; - } + if (response.Data.Initialize(guid, player)) + response.Result = RESPONSE_SUCCESS; // name known else - data << uint8(0); // Name is not declined + response.Result = RESPONSE_FAILURE; // name unknown - SendPacket(&data); + SendPacket(response.Write()); } void WorldSession::HandleNameQueryOpcode(WorldPacket& recvData) diff --git a/src/server/game/Server/Packets/QueryPackets.cpp b/src/server/game/Server/Packets/QueryPackets.cpp index 1a779567ad..2772de5d82 100644 --- a/src/server/game/Server/Packets/QueryPackets.cpp +++ b/src/server/game/Server/Packets/QueryPackets.cpp @@ -175,6 +175,9 @@ bool WorldPackets::Query::PlayerGuidLookupData::Initialize(ObjectGuid const& gui Sex = player->getGender(); ClassID = player->getClass(); Level = player->getLevel(); + + if (DeclinedName const* names = player->GetDeclinedNames()) + DeclinedNames = *names; } else { @@ -187,3 +190,30 @@ bool WorldPackets::Query::PlayerGuidLookupData::Initialize(ObjectGuid const& gui return true; } + +ByteBuffer& operator<<(ByteBuffer& data, WorldPackets::Query::PlayerGuidLookupData const& lookupData) +{ + data << lookupData.Name; + data << lookupData.RealmName; + data << uint8(lookupData.Race); + data << uint8(lookupData.Sex); + data << uint8(lookupData.ClassID); + + data << bool(lookupData.DeclinedNames.has_value()); + if (lookupData.DeclinedNames.has_value()) + for (uint8 i = 0; i < MAX_DECLINED_NAME_CASES; ++i) + data << lookupData.DeclinedNames->name[i]; + + return data; +} + +WorldPacket const* WorldPackets::Query::QueryPlayerNameResponse::Write() +{ + _worldPacket << Player.WriteAsPacked(); + _worldPacket << uint8(Result); + + if (Result == RESPONSE_SUCCESS) + _worldPacket << Data; + + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/QueryPackets.h b/src/server/game/Server/Packets/QueryPackets.h index 06d5f5b0d3..c2e2b22969 100644 --- a/src/server/game/Server/Packets/QueryPackets.h +++ b/src/server/game/Server/Packets/QueryPackets.h @@ -23,6 +23,7 @@ #include "GameObjectData.h" #include "DB2Stores.h" #include "ObjectGuid.h" +#include "Optional.h" #include "QuestDef.h" #include "SharedDefines.h" @@ -168,10 +169,24 @@ namespace WorldPackets bool Initialize(ObjectGuid const& guid, Player const* player = nullptr); std::string Name; + std::string RealmName; uint8 Race = RACE_NONE; uint8 Sex = GENDER_NONE; uint8 ClassID = CLASS_NONE; uint8 Level = 0; + Optional DeclinedNames; + }; + + class QueryPlayerNameResponse final : public ServerPacket + { + public: + QueryPlayerNameResponse() : ServerPacket(SMSG_QUERY_PLAYER_NAME_RESPONSE, 8+1+1+1+1+1+10) { } + + WorldPacket const* Write() override; + + ObjectGuid Player; + uint8 Result = 0; // 0 - full packet, != 0 - only guid + PlayerGuidLookupData Data; }; } } diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 5823a493cf..4466b28bd0 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -1069,7 +1069,6 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_WALK_SPEED, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_WATER_WALK, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MULTIPLE_PACKETS, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_NAME_QUERY_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_NEW_TAXI_PATH, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_NEW_WORLD, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_NEW_WORLD_ABORT, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); @@ -1134,6 +1133,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_PVP_CREDIT, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PVP_LOG_DATA, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_PVP_OPTIONS_ENABLED, STATUS_NEVER, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_PLAYER_NAME_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_QUESTS_COMPLETED_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_TIME_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUEST_GIVER_OFFER_REWARD_MESSAGE, STATUS_NEVER, CONNECTION_TYPE_REALM); diff --git a/src/server/game/Server/Protocol/Opcodes.h b/src/server/game/Server/Protocol/Opcodes.h index 1f93bb84ff..cb5783d130 100644 --- a/src/server/game/Server/Protocol/Opcodes.h +++ b/src/server/game/Server/Protocol/Opcodes.h @@ -1023,7 +1023,6 @@ enum OpcodeServer SMSG_MOVE_UPDATE_WALK_SPEED = 0x54A2, SMSG_MOVE_WATER_WALK = 0x75B1, SMSG_MULTIPLE_PACKETS = 0x6736, - SMSG_NAME_QUERY_RESPONSE = 0x6E04, SMSG_NEW_TAXI_PATH = 0x4B35, SMSG_NEW_WORLD = 0x79B1, SMSG_NEW_WORLD_ABORT = 0x14B7, @@ -1091,6 +1090,7 @@ enum OpcodeServer SMSG_PVP_CREDIT = 0x6015, SMSG_PVP_LOG_DATA = 0x5CB2, SMSG_PVP_OPTIONS_ENABLED = 0x50A1, + SMSG_QUERY_PLAYER_NAME_RESPONSE = 0x6E04, SMSG_QUERY_QUESTS_COMPLETED_RESPONSE = 0x6314, SMSG_QUERY_TIME_RESPONSE = 0x2124, SMSG_QUEST_GIVER_OFFER_REWARD_MESSAGE = 0x2427,