From 98bb3eb4364927ea4adfb9a246c6e36c1b0f03c9 Mon Sep 17 00:00:00 2001 From: NotAdam Date: Fri, 6 Jul 2018 19:47:35 +1000 Subject: [PATCH] incoming packet deserialization --- src/common/Network/GamePacketNew.h | 12 +++++++++ .../Network/PacketDef/Zone/ClientZoneDef.h | 26 +++++++++++++++++++ .../Network/Handlers/GMCommandHandlers.cpp | 12 ++++----- 3 files changed, 44 insertions(+), 6 deletions(-) create mode 100644 src/common/Network/PacketDef/Zone/ClientZoneDef.h diff --git a/src/common/Network/GamePacketNew.h b/src/common/Network/GamePacketNew.h index f45835dc..a5890457 100644 --- a/src/common/Network/GamePacketNew.h +++ b/src/common/Network/GamePacketNew.h @@ -178,6 +178,18 @@ public: initialize(); }; + FFXIVIpcPacket< T, T1 >( const FFXIVARR_PACKET_RAW& rawPacket ) + { + auto segHdrSize = sizeof( FFXIVARR_PACKET_SEGMENT_HEADER ); + auto copySize = std::min< uint32_t >( sizeof( T ), rawPacket.segHdr.size - segHdrSize ); + + memcpy( &m_segHdr, &rawPacket.segHdr, segHdrSize ); + memcpy( &m_data, &rawPacket.data[0] + segHdrSize, copySize ); + + memset( &m_ipcHdr, 0, sizeof( FFXIVARR_IPC_HEADER ) ); + m_ipcHdr.type = static_cast< ServerZoneIpcType >( m_data._ServerIpcType ); + } + uint32_t getContentSize() override { return sizeof( FFXIVARR_IPC_HEADER ) + sizeof( T ); diff --git a/src/common/Network/PacketDef/Zone/ClientZoneDef.h b/src/common/Network/PacketDef/Zone/ClientZoneDef.h new file mode 100644 index 00000000..55a87f7f --- /dev/null +++ b/src/common/Network/PacketDef/Zone/ClientZoneDef.h @@ -0,0 +1,26 @@ +#ifndef _CORE_NETWORK_PACKETS_ZONE_CLIENT_IPC_H +#define _CORE_NETWORK_PACKETS_ZONE_CLIENT_IPC_H + +#include +#include + +namespace Core { +namespace Network { +namespace Packets { +namespace Client { + +struct FFXIVIpcGmCommand1 : FFXIVIpcBasePacket< GMCommand1 > +{ + /* 0000 */ uint32_t commandId; + /* 0004 */ uint32_t param1; + /* 0008 */ uint32_t param2; + /* 000C */ char unknown_C[28]; + /* 0028 */ uint32_t param3; +}; + +} +} +} +} + +#endif //_CORE_NETWORK_PACKETS_ZONE_CLIENT_IPC_H diff --git a/src/servers/sapphire_zone/Network/Handlers/GMCommandHandlers.cpp b/src/servers/sapphire_zone/Network/Handlers/GMCommandHandlers.cpp index fa3243cc..f0ed74ab 100644 --- a/src/servers/sapphire_zone/Network/Handlers/GMCommandHandlers.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/GMCommandHandlers.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include @@ -91,12 +92,11 @@ void Core::Network::GameConnection::gm1Handler( const Packets::FFXIVARR_PACKET_R if( player.getGmRank() <= 0 ) return; - Packets::FFXIVARR_PACKET_RAW copy = inPacket; - auto commandId = *reinterpret_cast< uint32_t* >( ©.data[0x10] ); - - uint32_t param1 = *reinterpret_cast< uint32_t* >( ©.data[0x14] ); - uint32_t param2 = *reinterpret_cast< uint32_t* >( ©.data[0x18] ); - uint32_t param3 = *reinterpret_cast< uint32_t* >( ©.data[0x28] ); + auto packet = ZoneChannelPacket< Client::FFXIVIpcGmCommand1 >( inPacket ); + auto commandId = packet.data().commandId; + auto param1 = packet.data().param1; + auto param2 = packet.data().param2; + auto param3 = packet.data().param3; auto pLog = g_fw.get< Logger >(); pLog->debug( player.getName() + " used GM1 commandId: " + std::to_string( commandId ) +