diff options
author | Shauren <shauren.trinity@gmail.com> | 2025-02-20 14:01:11 +0100 |
---|---|---|
committer | Shauren <shauren.trinity@gmail.com> | 2025-02-20 14:01:11 +0100 |
commit | caa058d496a2671bd96dbbe5e41ceab775f5639e (patch) | |
tree | 0982f7e19240863eb03c9427bb2e84ff47420151 /src | |
parent | 48baec04dfd3b654c945df9b4fc2e8feadad760a (diff) |
Core/PacketIO: Implemented CMSG_CORPSE_MAP_POSITION_QUERY/SMSG_CORPSE_MAP_POSITION_QUERY_RESPONSE
Diffstat (limited to 'src')
-rw-r--r-- | src/server/game/Handlers/QueryHandler.cpp | 51 | ||||
-rw-r--r-- | src/server/game/Server/Packets/QueryPackets.cpp | 28 | ||||
-rw-r--r-- | src/server/game/Server/Packets/QueryPackets.h | 43 | ||||
-rw-r--r-- | src/server/game/Server/Protocol/Opcodes.cpp | 6 | ||||
-rw-r--r-- | src/server/game/Server/WorldSession.h | 6 |
5 files changed, 105 insertions, 29 deletions
diff --git a/src/server/game/Handlers/QueryHandler.cpp b/src/server/game/Handlers/QueryHandler.cpp index d1febe6baa7..6e9db0a3c7f 100644 --- a/src/server/game/Handlers/QueryHandler.cpp +++ b/src/server/game/Handlers/QueryHandler.cpp @@ -18,6 +18,7 @@ #include "WorldSession.h" #include "CharacterCache.h" #include "Common.h" +#include "Corpse.h" #include "DatabaseEnv.h" #include "DBCStores.h" #include "GameTime.h" @@ -28,6 +29,7 @@ #include "ObjectMgr.h" #include "Player.h" #include "QueryPackets.h" +#include "Transport.h" #include "UpdateMask.h" #include "World.h" @@ -141,13 +143,13 @@ void WorldSession::HandleGameObjectQueryOpcode(WorldPackets::Query::QueryGameObj } } -void WorldSession::HandleCorpseQueryOpcode(WorldPacket & /*recvData*/) +void WorldSession::HandleQueryCorpseLocation(WorldPackets::Query::QueryCorpseLocationFromClient& /*queryCorpseLocation*/) { if (!_player->HasCorpse()) { - WorldPacket data(MSG_CORPSE_QUERY, 1); - data << uint8(0); // corpse not found - SendPacket(&data); + WorldPackets::Query::CorpseLocation packet; + packet.Valid = false; // corpse not found + SendPacket(packet.Write()); return; } @@ -178,15 +180,13 @@ void WorldSession::HandleCorpseQueryOpcode(WorldPacket & /*recvData*/) } } - WorldPacket data(MSG_CORPSE_QUERY, 1+(6*4)); - data << uint8(1); // corpse found - data << int32(mapID); - data << float(x); - data << float(y); - data << float(z); - data << int32(corpseMapID); - data << uint32(0); // unknown - SendPacket(&data); + WorldPackets::Query::CorpseLocation packet; + packet.Valid = true; + packet.MapID = corpseMapID; + packet.ActualMapID = mapID; + packet.Position = Position(x, y, z); + packet.Transport = 0; // TODO: If corpse is on transport, send transport offsets and transport guid + SendPacket(packet.Write()); } void WorldSession::HandleNpcTextQueryOpcode(WorldPacket& recvData) @@ -314,19 +314,22 @@ void WorldSession::HandleQueryPageText(WorldPacket& recvData) } } -void WorldSession::HandleCorpseMapPositionQuery(WorldPacket& recvData) +void WorldSession::HandleQueryCorpseTransport(WorldPackets::Query::QueryCorpseTransport& queryCorpseTransport) { - TC_LOG_DEBUG("network", "WORLD: Recv CMSG_CORPSE_MAP_POSITION_QUERY"); - - uint32 unk; - recvData >> unk; + WorldPackets::Query::CorpseTransportQuery response; + if (Corpse const* corpse = _player->GetCorpse()) + { + if (Transport const* transport = corpse->GetTransport()) + { + if (transport->GetGUID().GetCounter() == queryCorpseTransport.Transport) + { + response.Position = transport->GetPosition(); + response.Facing = transport->GetOrientation(); + } + } + } - WorldPacket data(SMSG_CORPSE_MAP_POSITION_QUERY_RESPONSE, 4+4+4+4); - data << float(0); - data << float(0); - data << float(0); - data << float(0); - SendPacket(&data); + SendPacket(response.Write()); } void WorldSession::HandleQuestPOIQuery(WorldPackets::Query::QuestPOIQuery& query) diff --git a/src/server/game/Server/Packets/QueryPackets.cpp b/src/server/game/Server/Packets/QueryPackets.cpp index c09a0da8e59..83ccc9399ce 100644 --- a/src/server/game/Server/Packets/QueryPackets.cpp +++ b/src/server/game/Server/Packets/QueryPackets.cpp @@ -76,6 +76,34 @@ WorldPacket const* WorldPackets::Query::QueryGameObjectResponse::Write() return &_worldPacket; } +WorldPacket const* WorldPackets::Query::CorpseLocation::Write() +{ + _worldPacket << uint8(Valid); + + if (Valid) + { + _worldPacket << int32(MapID); + _worldPacket << Position; + _worldPacket << int32(ActualMapID); + _worldPacket << uint32(Transport); + } + + return &_worldPacket; +} + +void WorldPackets::Query::QueryCorpseTransport::Read() +{ + _worldPacket >> Transport; +} + +WorldPacket const* WorldPackets::Query::CorpseTransportQuery::Write() +{ + _worldPacket << Position; + _worldPacket << float(Facing); + + return &_worldPacket; +} + void WorldPackets::Query::QueryItemSingle::Read() { _worldPacket >> ItemID; diff --git a/src/server/game/Server/Packets/QueryPackets.h b/src/server/game/Server/Packets/QueryPackets.h index 333e2eb7854..8c36c07afcd 100644 --- a/src/server/game/Server/Packets/QueryPackets.h +++ b/src/server/game/Server/Packets/QueryPackets.h @@ -108,6 +108,49 @@ namespace WorldPackets GameObjectStats Stats; }; + class QueryCorpseLocationFromClient final : public ClientPacket + { + public: + QueryCorpseLocationFromClient(WorldPacket&& packet) : ClientPacket(MSG_CORPSE_QUERY, std::move(packet)) { } + + void Read() override { } + }; + + class CorpseLocation final : public ServerPacket + { + public: + CorpseLocation() : ServerPacket(MSG_CORPSE_QUERY, 1 + 4 + 4 + 4 + 4 + 4 + 4) { } + + WorldPacket const* Write() override; + + uint32 Transport = 0; + TaggedPosition<::Position::XYZ> Position; + int32 ActualMapID = 0; + int32 MapID = 0; + bool Valid = false; + }; + + class QueryCorpseTransport final : public ClientPacket + { + public: + QueryCorpseTransport(WorldPacket&& packet) : ClientPacket(CMSG_CORPSE_MAP_POSITION_QUERY, std::move(packet)) { } + + void Read() override; + + uint32 Transport = 0; + }; + + class CorpseTransportQuery final : public ServerPacket + { + public: + CorpseTransportQuery() : ServerPacket(SMSG_CORPSE_MAP_POSITION_QUERY_RESPONSE, 4 + 4 + 4 + 4) { } + + WorldPacket const* Write() override; + + TaggedPosition<::Position::XYZ> Position; + float Facing = 0.0f; + }; + class QueryItemSingle final : public ClientPacket { public: diff --git a/src/server/game/Server/Protocol/Opcodes.cpp b/src/server/game/Server/Protocol/Opcodes.cpp index 4b10b53f56f..1364387911a 100644 --- a/src/server/game/Server/Protocol/Opcodes.cpp +++ b/src/server/game/Server/Protocol/Opcodes.cpp @@ -662,7 +662,7 @@ void OpcodeTable::Initialize() /*0x213*/ DEFINE_HANDLER(CMSG_UNLEARN_TALENTS, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); /*0x214*/ DEFINE_SERVER_OPCODE_HANDLER(SMSG_UPDATE_INSTANCE_ENCOUNTER_UNIT, STATUS_NEVER); /*0x215*/ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GAMEOBJECT_DESPAWN_ANIM, STATUS_NEVER); - /*0x216*/ DEFINE_HANDLER(MSG_CORPSE_QUERY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleCorpseQueryOpcode ); + /*0x216*/ DEFINE_HANDLER(MSG_CORPSE_QUERY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleQueryCorpseLocation ); /*0x217*/ DEFINE_HANDLER(CMSG_GMTICKET_DELETETICKET, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleGMTicketDeleteOpcode ); /*0x218*/ DEFINE_SERVER_OPCODE_HANDLER(SMSG_GMTICKET_DELETETICKET, STATUS_NEVER); /*0x219*/ DEFINE_SERVER_OPCODE_HANDLER(SMSG_CHAT_WRONG_FACTION, STATUS_NEVER); @@ -1334,7 +1334,7 @@ void OpcodeTable::Initialize() /*0x4B3*/ DEFINE_HANDLER(CMSG_ITEM_REFUND_INFO, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleItemRefundInfoRequest ); /*0x4B4*/ DEFINE_HANDLER(CMSG_ITEM_REFUND, STATUS_LOGGEDIN, PROCESS_INPLACE, &WorldSession::HandleItemRefund ); /*0x4B5*/ DEFINE_SERVER_OPCODE_HANDLER(SMSG_ITEM_REFUND_RESULT, STATUS_NEVER); - /*0x4B6*/ DEFINE_HANDLER(CMSG_CORPSE_MAP_POSITION_QUERY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleCorpseMapPositionQuery ); + /*0x4B6*/ DEFINE_HANDLER(CMSG_CORPSE_MAP_POSITION_QUERY, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::HandleQueryCorpseTransport ); /*0x4B7*/ DEFINE_SERVER_OPCODE_HANDLER(SMSG_CORPSE_MAP_POSITION_QUERY_RESPONSE, STATUS_NEVER); /*0x4B8*/ DEFINE_HANDLER(CMSG_UNUSED5, STATUS_LOGGEDIN, PROCESS_THREADUNSAFE, &WorldSession::Handle_NULL ); /*0x4B9*/ DEFINE_HANDLER(CMSG_UNUSED6, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); @@ -1359,7 +1359,7 @@ void OpcodeTable::Initialize() /*0x4CC*/ DEFINE_HANDLER(CMSG_END_BATTLEFIELD_CHEAT, STATUS_NEVER, PROCESS_INPLACE, &WorldSession::Handle_NULL ); /*0x4CD*/ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MULTIPLE_PACKETS, STATUS_NEVER); /*0x4CE*/ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_GRAVITY_DISABLE, STATUS_NEVER); - /*0x4CF*/ DEFINE_HANDLER(CMSG_MOVE_GRAVITY_DISABLE_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMoveGravityDisableAck ); + /*0x4CF*/ DEFINE_HANDLER(CMSG_MOVE_GRAVITY_DISABLE_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMoveGravityDisableAck ); /*0x4D0*/ DEFINE_SERVER_OPCODE_HANDLER(SMSG_MOVE_GRAVITY_ENABLE, STATUS_NEVER); /*0x4D1*/ DEFINE_HANDLER(CMSG_MOVE_GRAVITY_ENABLE_ACK, STATUS_LOGGEDIN, PROCESS_THREADSAFE, &WorldSession::HandleMoveGravityEnableAck); /*0x4D2*/ DEFINE_SERVER_OPCODE_HANDLER(MSG_MOVE_GRAVITY_CHNG, STATUS_NEVER); diff --git a/src/server/game/Server/WorldSession.h b/src/server/game/Server/WorldSession.h index a8c5a892f87..00abbdd7dde 100644 --- a/src/server/game/Server/WorldSession.h +++ b/src/server/game/Server/WorldSession.h @@ -241,6 +241,8 @@ namespace WorldPackets { class QueryCreature; class QueryGameObject; + class QueryCorpseLocationFromClient; + class QueryCorpseTransport; class QueryItemSingle; class QuestPOIQuery; } @@ -980,8 +982,8 @@ class TC_GAME_API WorldSession void HandleChatIgnoredOpcode(WorldPacket& recvPacket); void HandleReclaimCorpse(WorldPackets::Misc::ReclaimCorpse& packet); - void HandleCorpseQueryOpcode(WorldPacket& recvPacket); - void HandleCorpseMapPositionQuery(WorldPacket& recvPacket); + void HandleQueryCorpseLocation(WorldPackets::Query::QueryCorpseLocationFromClient& packet); + void HandleQueryCorpseTransport(WorldPackets::Query::QueryCorpseTransport& packet); void HandleResurrectResponse(WorldPackets::Misc::ResurrectResponse& packet); void HandleSummonResponseOpcode(WorldPacket& recvData); |