Core/PacketIO: Implemented CMSG_CORPSE_MAP_POSITION_QUERY/SMSG_CORPSE_MAP_POSITION_QUERY_RESPONSE

This commit is contained in:
Shauren
2025-02-20 14:01:11 +01:00
parent 48baec04df
commit caa058d496
5 changed files with 105 additions and 29 deletions

View File

@@ -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");
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();
}
}
}
uint32 unk;
recvData >> unk;
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)

View File

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

View File

@@ -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:

View File

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

View File

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