aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/server/game/Handlers/QueryHandler.cpp34
-rw-r--r--src/server/game/Server/Packets/CharacterPackets.cpp43
-rw-r--r--src/server/game/Server/Packets/CharacterPackets.h44
-rw-r--r--src/server/game/Server/Packets/QueryPackets.cpp65
-rw-r--r--src/server/game/Server/Packets/QueryPackets.h76
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp6
-rw-r--r--src/server/game/Server/WorldSession.h7
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);