aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2025-02-20 14:01:11 +0100
committerShauren <shauren.trinity@gmail.com>2025-02-20 14:01:11 +0100
commitcaa058d496a2671bd96dbbe5e41ceab775f5639e (patch)
tree0982f7e19240863eb03c9427bb2e84ff47420151 /src
parent48baec04dfd3b654c945df9b4fc2e8feadad760a (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.cpp51
-rw-r--r--src/server/game/Server/Packets/QueryPackets.cpp28
-rw-r--r--src/server/game/Server/Packets/QueryPackets.h43
-rw-r--r--src/server/game/Server/Protocol/Opcodes.cpp6
-rw-r--r--src/server/game/Server/WorldSession.h6
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);