aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Handlers/QueryHandler.cpp49
-rw-r--r--src/server/game/Server/Packets/CharacterPackets.cpp29
-rw-r--r--src/server/game/Server/Packets/CharacterPackets.h47
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp2
-rw-r--r--src/server/game/Server/WorldSession.h2
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);