diff options
-rw-r--r-- | src/server/game/Handlers/QueryHandler.cpp | 49 | ||||
-rw-r--r-- | src/server/game/Server/Packets/CharacterPackets.cpp | 29 | ||||
-rw-r--r-- | src/server/game/Server/Packets/CharacterPackets.h | 47 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 2 | ||||
-rw-r--r-- | src/server/game/Server/WorldSession.h | 2 |
5 files changed, 94 insertions, 35 deletions
diff --git a/src/server/game/Handlers/QueryHandler.cpp b/src/server/game/Handlers/QueryHandler.cpp index 8a2cedab4d7..bc61f8e5483 100644 --- a/src/server/game/Handlers/QueryHandler.cpp +++ b/src/server/game/Handlers/QueryHandler.cpp @@ -36,37 +36,40 @@ void WorldSession::SendNameQueryOpcode(ObjectGuid guid) Player* player = ObjectAccessor::FindConnectedPlayer(guid); CharacterNameData const* nameData = sWorld->GetCharacterNameData(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::Character::PlayerNameResponse response; + response.Player = guid; - data << uint8(0); // name known - data << nameData->m_name; // played name - data << uint8(0); // realm name - only set for cross realm interaction (such as Battlegrounds) - data << uint8(nameData->m_race); - data << uint8(nameData->m_gender); - data << uint8(nameData->m_class); - - if (DeclinedName const* names = (player ? player->GetDeclinedNames() : NULL)) + if (nameData) { - data << uint8(1); // Name is declined - for (uint8 i = 0; i < MAX_DECLINED_NAME_CASES; ++i) - data << names->name[i]; + uint32 accountId = player ? player->GetSession()->GetAccountId() : sObjectMgr->GetPlayerAccountIdByGUID(guid); + uint32 bnetAccountId = player ? player->GetSession()->GetBattlenetAccountId() : Battlenet::AccountMgr::GetIdByGameAccount(accountId); + + response.Result = 0; // name known + response.Data.IsDeleted = false; // TODO: send deletes as well + response.Data.AccountID = ObjectGuid::Create<HighGuid::WowAccount>(accountId); + response.Data.BnetAccountID = ObjectGuid::Create<HighGuid::BNetAccount>(bnetAccountId); + response.Data.Name = nameData->m_name; + response.Data.VirtualRealmAddress = GetVirtualRealmAddress(); + response.Data.Race = nameData->m_race; + response.Data.Sex = nameData->m_gender; + response.Data.ClassID = nameData->m_class; + response.Data.Level = nameData->m_level; + + if (DeclinedName const* names = (player ? player->GetDeclinedNames() : nullptr)) + for (int i = 0; i < MAX_DECLINED_NAME_CASES; ++i) + response.Data.DeclinedNames.name[i] = names[i]; } else - data << uint8(0); // Name is not declined + { + response.Result = 1; // name unknown + } - SendPacket(&data); + SendPacket(response.Write()); } -void WorldSession::HandleNameQueryOpcode(WorldPackets::Character::QueryPlayerName& queryPlayerName) +void WorldSession::HandleNameQueryOpcode(WorldPackets::Character::QueryPlayerName& packet) { - SendNameQueryOpcode(queryPlayerName.Player); + SendNameQueryOpcode(packet.Player); } void WorldSession::HandleQueryTimeOpcode(WorldPacket & /*recvData*/) diff --git a/src/server/game/Server/Packets/CharacterPackets.cpp b/src/server/game/Server/Packets/CharacterPackets.cpp index 2adbd3666b0..d6f3736d9bb 100644 --- a/src/server/game/Server/Packets/CharacterPackets.cpp +++ b/src/server/game/Server/Packets/CharacterPackets.cpp @@ -317,3 +317,32 @@ void WorldPackets::Character::QueryPlayerName::Read() if (Hint.NativeRealmAddress.HasValue) _worldPacket >> Hint.NativeRealmAddress; } + +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 e85a8aaccb9..5fbe1426292 100644 --- a/src/server/game/Server/Packets/CharacterPackets.h +++ b/src/server/game/Server/Packets/CharacterPackets.h @@ -25,18 +25,12 @@ namespace WorldPackets { namespace Character { - struct PlayerGuidLookupHint - { - public Optional<uint32> VirtualRealmAddress; ///< current realm (?) (identifier made from the Index, BattleGroup and Region) - public Optional<uint32> NativeRealmAddress; ///< original realm (?) (identifier made from the Index, BattleGroup and Region) - }; - struct CharacterCreateInfo { /// User specified variables - uint8 Race = 0; - uint8 Class = 0; - uint8 Sex = GENDER_NONE; + uint8 Race = RACE_NONE; + uint8 Class = CLASS_NONE; + uint8 Sex = GENDER_NONE; uint8 Skin = 0; uint8 Face = 0; uint8 HairStyle = 0; @@ -68,7 +62,7 @@ namespace WorldPackets struct CharacterFactionChangeInfo : public CharacterCustomizeInfo { - uint8 Race = 0; + uint8 Race = RACE_NONE; }; struct CharacterUndeleteInfo @@ -367,6 +361,27 @@ namespace WorldPackets 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: @@ -377,6 +392,18 @@ namespace WorldPackets 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 = -1; // 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 504e17788fd..9695598a097 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -1112,7 +1112,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_UPDATE_WALK_SPEED, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_WATER_WALK, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_MULTIPLE_PACKETS, STATUS_UNHANDLED); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_NAME_QUERY_RESPONSE, STATUS_UNHANDLED); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_NAME_QUERY_RESPONSE, STATUS_NEVER); DEFINE_SERVER_OPCODE_HANDLER(SMSG_NEW_TAXI_PATH, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_NEW_WORLD, STATUS_UNHANDLED); DEFINE_SERVER_OPCODE_HANDLER(SMSG_NEW_WORLD_ABORT, STATUS_UNHANDLED); diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index c09511eb259..ec791a52ca6 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -569,7 +569,7 @@ class WorldSession void HandleMeetingStoneInfo(WorldPacket& recPacket); void HandleGameobjectReportUse(WorldPacket& recvPacket); - void HandleNameQueryOpcode(WorldPackets::Character::QueryPlayerName& queryPlayerName); + void HandleNameQueryOpcode(WorldPackets::Character::QueryPlayerName& packet); void HandleQueryTimeOpcode(WorldPacket& recvPacket); |