aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/server/game/Handlers/PetHandler.cpp53
-rw-r--r--src/server/game/Server/Packets/QueryPackets.cpp30
-rw-r--r--src/server/game/Server/Packets/QueryPackets.h26
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp4
-rw-r--r--src/server/game/Server/WorldSession.h5
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);