mirror of
https://github.com/TrinityCore/TrinityCore.git
synced 2026-01-19 08:55:32 +01:00
Core/PacketIO: Implemented CMSG_CORPSE_MAP_POSITION_QUERY/SMSG_CORPSE_MAP_POSITION_QUERY_RESPONSE
This commit is contained in:
@@ -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)
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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);
|
||||
|
||||
|
||||
Reference in New Issue
Block a user