Core/Packets: Added CMSG_PAGE_TEXT_QUERY and SMSG_PAGE_TEXT_QUERY_RESPONSE

Moved QueryPlayerName to QueryPackets
This commit is contained in:
Intel
2014-11-15 17:13:41 +02:00
parent 96fa1eb5ec
commit cd9be92395
7 changed files with 163 additions and 112 deletions

View File

@@ -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");
}

View File

@@ -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;
}

View File

@@ -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;
};
}
}

View File

@@ -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;
}

View File

@@ -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;
};
}
}

View File

@@ -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);

View File

@@ -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);