diff options
-rw-r--r-- | src/server/game/Handlers/PetHandler.cpp | 53 | ||||
-rw-r--r-- | src/server/game/Server/Packets/QueryPackets.cpp | 30 | ||||
-rw-r--r-- | src/server/game/Server/Packets/QueryPackets.h | 26 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 4 | ||||
-rw-r--r-- | src/server/game/Server/WorldSession.h | 5 |
5 files changed, 82 insertions, 36 deletions
diff --git a/src/server/game/Handlers/PetHandler.cpp b/src/server/game/Handlers/PetHandler.cpp index c9cc6d547f1..7dd87f6cdba 100644 --- a/src/server/game/Handlers/PetHandler.cpp +++ b/src/server/game/Handlers/PetHandler.cpp @@ -34,6 +34,7 @@ #include "SpellInfo.h" #include "Player.h" #include "SpellPackets.h" +#include "QueryPackets.h" void WorldSession::HandleDismissCritter(WorldPacket& recvData) { @@ -413,48 +414,36 @@ void WorldSession::HandlePetActionHelper(Unit* pet, ObjectGuid guid1, uint32 spe } } -void WorldSession::HandlePetNameQuery(WorldPacket& recvData) +void WorldSession::HandleQueryPetName(WorldPackets::Query::QueryPetName& packet) { - TC_LOG_DEBUG("network", "WORLD: Received CMSG_PET_NAME_QUERY"); + TC_LOG_DEBUG("network", "WORLD: Received CMSG_QUERY_PET_NAME"); - uint32 petnumber; - ObjectGuid petguid; - - recvData >> petnumber; - recvData >> petguid; - - SendPetNameQuery(petguid, petnumber); + SendPetNameQuery(packet.UnitGUID); } -void WorldSession::SendPetNameQuery(ObjectGuid petguid, uint32 petnumber) +void WorldSession::SendPetNameQuery(ObjectGuid guid) { - Creature* pet = ObjectAccessor::GetCreatureOrPetOrVehicle(*_player, petguid); - if (!pet) - { - WorldPacket data(SMSG_QUERY_PET_NAME_RESPONSE, (4 + 1 + 4 + 1)); - data << uint32(petnumber); - data << uint8(0); - data << uint32(0); - data << uint8(0); - _player->GetSession()->SendPacket(&data); - return; - } + WorldPackets::Query::QueryPetNameResponse response; - WorldPacket data(SMSG_QUERY_PET_NAME_RESPONSE, (4 + 4 + pet->GetName().size() + 1)); - data << uint32(petnumber); - data << pet->GetName(); - data << uint32(pet->GetUInt32Value(UNIT_FIELD_PET_NAME_TIMESTAMP)); + response.UnitGUID = guid; - if (pet->IsPet() && ((Pet*)pet)->GetDeclinedNames()) + if (Creature* unit = ObjectAccessor::GetCreatureOrPetOrVehicle(*_player, guid)) { - data << uint8(1); - for (uint8 i = 0; i < MAX_DECLINED_NAME_CASES; ++i) - data << ((Pet*)pet)->GetDeclinedNames()->name[i]; + response.Allow = true; + response.Timestamp = unit->GetUInt32Value(UNIT_FIELD_PET_NAME_TIMESTAMP); + response.Name = unit->GetName(); + + if (Pet* pet = unit->ToPet()) + { + if (DeclinedName const* names = pet->GetDeclinedNames()) + { + response.HasDeclined = true; + response.DeclinedNames = *names; + } + } } - else - data << uint8(0); - _player->GetSession()->SendPacket(&data); + _player->GetSession()->SendPacket(response.Write()); } bool WorldSession::CheckStableMaster(ObjectGuid guid) diff --git a/src/server/game/Server/Packets/QueryPackets.cpp b/src/server/game/Server/Packets/QueryPackets.cpp index 9ac9d79a41f..40019ced69e 100644 --- a/src/server/game/Server/Packets/QueryPackets.cpp +++ b/src/server/game/Server/Packets/QueryPackets.cpp @@ -434,3 +434,33 @@ WorldPacket const* WorldPackets::Query::QuestCompletionNPCResponse::Write() return &_worldPacket; } + +void WorldPackets::Query::QueryPetName::Read() +{ + _worldPacket >> UnitGUID; +} + +WorldPacket const* WorldPackets::Query::QueryPetNameResponse::Write() +{ + _worldPacket << UnitGUID; + _worldPacket.WriteBit(Allow); + + if (Allow) + { + _worldPacket.WriteBits(Name.length(), 8); + _worldPacket.WriteBit(HasDeclined); + + for (uint8 i = 0; i < MAX_DECLINED_NAME_CASES; ++i) + _worldPacket.WriteBits(DeclinedNames.name[i].length(), 7); + + for (uint8 i = 0; i < MAX_DECLINED_NAME_CASES; ++i) + _worldPacket.WriteString(DeclinedNames.name[i]); + + _worldPacket << Timestamp; + _worldPacket.WriteString(Name); + } + + _worldPacket.FlushBits(); + + return &_worldPacket; +} diff --git a/src/server/game/Server/Packets/QueryPackets.h b/src/server/game/Server/Packets/QueryPackets.h index 8e9613019c8..a5d7e5de8c4 100644 --- a/src/server/game/Server/Packets/QueryPackets.h +++ b/src/server/game/Server/Packets/QueryPackets.h @@ -392,6 +392,32 @@ namespace WorldPackets std::vector<QuestCompletionNPC> QuestCompletionNPCs; }; + + class QueryPetName final : public ClientPacket + { + public: + QueryPetName(WorldPacket&& packet) : ClientPacket(CMSG_QUERY_PET_NAME, std::move(packet)) { } + + void Read() override; + + ObjectGuid UnitGUID; + }; + + class QueryPetNameResponse final : public ServerPacket + { + public: + QueryPetNameResponse() : ServerPacket(SMSG_QUERY_PET_NAME_RESPONSE, 16 + 1) { } + + WorldPacket const* Write() override; + + ObjectGuid UnitGUID; + bool Allow = false; + + bool HasDeclined = false; + DeclinedName DeclinedNames; + uint32 Timestamp = 0; + std::string Name; + }; } } diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 1fe1118fb82..0ee0cc8306a 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -631,7 +631,7 @@ void OpcodeTable::Initialize() DEFINE_HANDLER(CMSG_QUERY_NPC_TEXT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Query::QueryNPCText, &WorldSession::HandleNpcTextQueryOpcode); DEFINE_HANDLER(CMSG_QUERY_PAGE_TEXT, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Query::QueryPageText, &WorldSession::HandleQueryPageText); DEFINE_HANDLER(CMSG_QUERY_PETITION, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Petition::QueryPetition, &WorldSession::HandleQueryPetition); - DEFINE_OPCODE_HANDLER_OLD(CMSG_QUERY_PET_NAME, STATUS_UNHANDLED, PROCESS_THREADUNSAFE, &WorldSession::HandlePetNameQuery ); + DEFINE_HANDLER(CMSG_QUERY_PET_NAME, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Query::QueryPetName, &WorldSession::HandleQueryPetName); DEFINE_HANDLER(CMSG_QUERY_PLAYER_NAME, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Query::QueryPlayerName, &WorldSession::HandleNameQueryOpcode); DEFINE_HANDLER(CMSG_QUERY_QUEST_COMPLETION_NPCS, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Query::QueryQuestCompletionNPCs, &WorldSession::HandleQueryQuestCompletionNPCs); DEFINE_HANDLER(CMSG_QUERY_QUEST_INFO, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, WorldPackets::Quest::QueryQuestInfo, &WorldSession::HandleQuestQueryOpcode); @@ -1508,7 +1508,7 @@ void OpcodeTable::Initialize() DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_NPC_TEXT_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_PAGE_TEXT_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_PETITION_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM); - DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_PET_NAME_RESPONSE, STATUS_UNHANDLED, CONNECTION_TYPE_REALM); + DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_PET_NAME_RESPONSE, 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_QUEST_INFO_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_REALM); DEFINE_SERVER_OPCODE_HANDLER(SMSG_QUERY_TIME_RESPONSE, STATUS_NEVER, CONNECTION_TYPE_INSTANCE); diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index 69cc071a2c4..7917c9f0a44 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -363,6 +363,7 @@ namespace WorldPackets class QueryCorpseLocationFromClient; class QueryCorpseTransport; class QueryTime; + class QueryPetName; class QuestPOIQuery; class QueryQuestCompletionNPCs; } @@ -766,7 +767,7 @@ class WorldSession void HandleClientCastFlags(WorldPacket& recvPacket, uint8 castFlags, SpellCastTargets& targets); // Pet - void SendPetNameQuery(ObjectGuid guid, uint32 petnumber); + void SendPetNameQuery(ObjectGuid guid); void SendStablePet(ObjectGuid guid); void SendStablePetCallback(PreparedQueryResult result, ObjectGuid guid); void SendPetStableResult(uint8 guid); @@ -1270,7 +1271,7 @@ class WorldSession void HandlePetAction(WorldPacket& recvData); void HandlePetStopAttack(WorldPacket& recvData); void HandlePetActionHelper(Unit* pet, ObjectGuid guid1, uint32 spellid, uint16 flag, ObjectGuid guid2, float x, float y, float z); - void HandlePetNameQuery(WorldPacket& recvData); + void HandleQueryPetName(WorldPackets::Query::QueryPetName& packet); void HandlePetSetAction(WorldPacket& recvData); void HandlePetAbandon(WorldPacket& recvData); void HandlePetRename(WorldPacket& recvData); |