From a322e81a531fa92424d1261e7fd565109d4e8836 Mon Sep 17 00:00:00 2001 From: NotAdam Date: Fri, 6 Jul 2018 19:47:07 +1000 Subject: [PATCH 01/16] remove old xmlconfig class --- src/common/Config/XMLConfig.cpp | 35 ---------------- src/common/Config/XMLConfig.h | 73 --------------------------------- 2 files changed, 108 deletions(-) delete mode 100644 src/common/Config/XMLConfig.cpp delete mode 100644 src/common/Config/XMLConfig.h diff --git a/src/common/Config/XMLConfig.cpp b/src/common/Config/XMLConfig.cpp deleted file mode 100644 index a28d8dfa..00000000 --- a/src/common/Config/XMLConfig.cpp +++ /dev/null @@ -1,35 +0,0 @@ -#include "XMLConfig.h" -#include -#include -#include -#include -#include -#include - -namespace Core { - // instanciate and load a config - XMLConfig::XMLConfig() - { - - } - - XMLConfig::~XMLConfig() - { - - } - - using boost::property_tree::ptree; - const ptree& empty_ptree() - { - static ptree t; - return t; - }; - - bool XMLConfig::loadConfig( const std::string& fileName ) - { - - boost::property_tree::read_xml( fileName, m_propTree ); - return true; - } - -} diff --git a/src/common/Config/XMLConfig.h b/src/common/Config/XMLConfig.h deleted file mode 100644 index cf9395b2..00000000 --- a/src/common/Config/XMLConfig.h +++ /dev/null @@ -1,73 +0,0 @@ -#ifndef __XMLCONFIG_H -#define __XMLCONFIG_H - -#include - -#include - -#include - -namespace Core { - - // very simple XML parser class - // this hasn't gotten much attention yet as it works good as it is. - class XMLConfig - { - public: - typedef std::map SettingMap; - typedef std::map CategoryMap; - - // instanciate and load a config - XMLConfig(); - - ~XMLConfig(); - - // load a config file - bool loadConfig( const std::string& fileName ); - - template< class T > - T getValue( const std::string& name, T defaultValue = T() ) - { - try - { - return m_propTree.get< T >( name ); - } - catch( ... ) - { - return defaultValue; - } - } - - template< class T > - void setValue( const std::string& name, T defaultValue = T() ) - { - m_propTree.put( name, defaultValue ); - } - - template< class T > - T getAttrValue( boost::property_tree::ptree node, const std::string& name, T defaultValue = T() ) - { - try - { - T outVal = node.get< T >( "." + name ); - return outVal; - } - catch( const std::runtime_error& ) - { - T outVal = defaultValue; - return outVal; - } - } - - boost::property_tree::ptree getChild( const std::string& name ) - { - auto val = m_propTree.get_child( name ); - return val; - } - - private: - boost::property_tree::ptree m_propTree; - }; - -} -#endif From 98bb3eb4364927ea4adfb9a246c6e36c1b0f03c9 Mon Sep 17 00:00:00 2001 From: NotAdam Date: Fri, 6 Jul 2018 19:47:35 +1000 Subject: [PATCH 02/16] 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 ) + From 24615759ce0f42e0065b59e54210d479bd62b943 Mon Sep 17 00:00:00 2001 From: NotAdam Date: Fri, 6 Jul 2018 20:32:36 +1000 Subject: [PATCH 03/16] client opcode updates --- src/common/Network/PacketDef/Ipcs.h | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/src/common/Network/PacketDef/Ipcs.h b/src/common/Network/PacketDef/Ipcs.h index 2c670e0a..05475bf5 100644 --- a/src/common/Network/PacketDef/Ipcs.h +++ b/src/common/Network/PacketDef/Ipcs.h @@ -223,13 +223,17 @@ namespace Packets { ReqJoinNoviceNetwork = 0x0129, // updated 4.2 - ReqCountdownInitiate = 0x012C, // updated 4.2 - ReqCountdownCancel = 0x012D, // updated 4.2 + + ReqCountdownInitiate = 0x0138, // updated 4.3 + ReqCountdownCancel = 0x0139, // updated 4.3 + ClearWaymarks = 0x013A, // updated 4.3 ZoneLineHandler = 0x013C, // updated 4.3 ClientTrigger = 0x013D, // updated 4.3 DiscoveryHandler = 0x013E, // updated 4.3 + AddWaymark = 0x013F, // updated 4.3 + SkillHandler = 0x0140, // updated 4.3 GMCommand1 = 0x0141, // updated 4.3 GMCommand2 = 0x0142, // updated 4.3 From 57c1f66310baddee7fc383d446f6d4d7a945f586 Mon Sep 17 00:00:00 2001 From: NotAdam Date: Fri, 6 Jul 2018 20:32:54 +1000 Subject: [PATCH 04/16] raw packet data contains an ipc header, not segment --- src/common/Network/GamePacketNew.h | 10 +++++----- 1 file changed, 5 insertions(+), 5 deletions(-) diff --git a/src/common/Network/GamePacketNew.h b/src/common/Network/GamePacketNew.h index a5890457..7a6fe489 100644 --- a/src/common/Network/GamePacketNew.h +++ b/src/common/Network/GamePacketNew.h @@ -180,13 +180,13 @@ public: 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 ); + auto ipcHdrSize = sizeof( FFXIVARR_IPC_HEADER ); + auto copySize = std::min< uint32_t >( sizeof( T ), rawPacket.segHdr.size - ipcHdrSize ); - memcpy( &m_segHdr, &rawPacket.segHdr, segHdrSize ); - memcpy( &m_data, &rawPacket.data[0] + segHdrSize, copySize ); + memcpy( &m_segHdr, &rawPacket.segHdr, sizeof( FFXIVARR_PACKET_SEGMENT_HEADER ) ); + memcpy( &m_data, &rawPacket.data[0] + ipcHdrSize, copySize ); - memset( &m_ipcHdr, 0, sizeof( FFXIVARR_IPC_HEADER ) ); + memset( &m_ipcHdr, 0, ipcHdrSize ); m_ipcHdr.type = static_cast< ServerZoneIpcType >( m_data._ServerIpcType ); } From 479a4369ab6a45d1c966cb3afd56193a6c4c61f4 Mon Sep 17 00:00:00 2001 From: NotAdam Date: Fri, 6 Jul 2018 21:53:35 +1000 Subject: [PATCH 05/16] add packet hex dump, moved gm1handler to use struct inpacket --- src/common/Network/CommonNetwork.h | 7 ++++--- src/common/Network/GamePacketNew.h | 13 +++++++++++++ src/common/Network/PacketDef/Zone/ClientZoneDef.h | 4 ++-- src/servers/sapphire_lobby/GameConnection.cpp | 6 +++--- .../sapphire_zone/Network/GameConnection.cpp | 8 ++++---- 5 files changed, 26 insertions(+), 12 deletions(-) diff --git a/src/common/Network/CommonNetwork.h b/src/common/Network/CommonNetwork.h index fbebcf31..a6901f2e 100644 --- a/src/common/Network/CommonNetwork.h +++ b/src/common/Network/CommonNetwork.h @@ -137,10 +137,11 @@ struct FFXIVARR_PACKET_RAW */ enum FFXIVARR_SEGMENT_TYPE { + SEGMENTTYPE_SESSIONINIT = 1, SEGMENTTYPE_IPC = 3, - SEGMENTTYPE_RESPONSE = 7, - SEGMENTTYPE_KEEPALIVE = 8, - SEGMENTTYPE_ENCRYPTIONHANDSHAKE = 9, + SEGMENTTYPE_KEEPALIVE = 7, + //SEGMENTTYPE_RESPONSE = 8, + SEGMENTTYPE_ENCRYPTIONINIT = 9, }; /** diff --git a/src/common/Network/GamePacketNew.h b/src/common/Network/GamePacketNew.h index 7a6fe489..c9ee97fe 100644 --- a/src/common/Network/GamePacketNew.h +++ b/src/common/Network/GamePacketNew.h @@ -14,6 +14,12 @@ #include "CommonNetwork.h" #include "PacketDef/Ipcs.h" +#include +#include +#include + +extern Core::Framework g_fw; + namespace Core { namespace Network { namespace Packets { @@ -186,6 +192,13 @@ public: memcpy( &m_segHdr, &rawPacket.segHdr, sizeof( FFXIVARR_PACKET_SEGMENT_HEADER ) ); memcpy( &m_data, &rawPacket.data[0] + ipcHdrSize, copySize ); + auto log = g_fw.get< Core::Logger >(); + if( log ) + { + log->debug( "rawpacket size" + std::to_string( rawPacket.segHdr.size ) + "\n" + Util::binaryToHexDump( const_cast< uint8_t* >( &rawPacket.data[0] ), rawPacket.segHdr.size ) ); + log->debug( "T size " + std::to_string( sizeof( T ) ) + "\n" + Util::binaryToHexDump( reinterpret_cast< uint8_t* >( &m_data ), sizeof( T ) ) ); + } + memset( &m_ipcHdr, 0, ipcHdrSize ); m_ipcHdr.type = static_cast< ServerZoneIpcType >( m_data._ServerIpcType ); } diff --git a/src/common/Network/PacketDef/Zone/ClientZoneDef.h b/src/common/Network/PacketDef/Zone/ClientZoneDef.h index 55a87f7f..61bed5b7 100644 --- a/src/common/Network/PacketDef/Zone/ClientZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ClientZoneDef.h @@ -14,8 +14,8 @@ 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; + /* 000C */ uint8_t unknown_C[0xC]; + /* 0018 */ uint32_t param3; }; } diff --git a/src/servers/sapphire_lobby/GameConnection.cpp b/src/servers/sapphire_lobby/GameConnection.cpp index c5cc7ed0..8c402d3e 100644 --- a/src/servers/sapphire_lobby/GameConnection.cpp +++ b/src/servers/sapphire_lobby/GameConnection.cpp @@ -483,7 +483,7 @@ void Core::Network::GameConnection::handlePackets( const Core::Network::Packets: switch( inPacket.segHdr.type ) { - case 9: // Encryption init + case SEGMENTTYPE_ENCRYPTIONINIT: // Encryption init { std::string key_phrase( reinterpret_cast< char* >( &inPacket.data[36] ) ); generateEncryptionKey( *reinterpret_cast< uint32_t* >( &inPacket.data[100] ), key_phrase ); @@ -501,13 +501,13 @@ void Core::Network::GameConnection::handlePackets( const Core::Network::Packets: } - case 3: // game packet + case SEGMENTTYPE_IPC: // game packet { g_log.info( "GamePacket [" + std::to_string( inPacket.segHdr.type ) + "]" ); handleGamePacket( inPacket ); break; } - case 7: // keep alive + case SEGMENTTYPE_KEEPALIVE: // keep alive { uint32_t id = *reinterpret_cast< uint32_t* >( &inPacket.data[0] ); uint32_t timeStamp = *reinterpret_cast< uint32_t* >( &inPacket.data[4] ); diff --git a/src/servers/sapphire_zone/Network/GameConnection.cpp b/src/servers/sapphire_zone/Network/GameConnection.cpp index d29022e5..b0e78bfa 100644 --- a/src/servers/sapphire_zone/Network/GameConnection.cpp +++ b/src/servers/sapphire_zone/Network/GameConnection.cpp @@ -211,7 +211,7 @@ void Core::Network::GameConnection::handleZonePacket( Core::Network::Packets::FF pLog->debug( sessionStr + " Undefined Zone IPC : Unknown ( " + boost::str( boost::format( "%|04X|" ) % static_cast< uint32_t >( opcode ) ) + " )" ); - //pLog->debug( "\n" + pPacket.toString() ); + pLog->debug( "Dump:\n" + Util::binaryToHexDump( const_cast< uint8_t* >( &pPacket.data[0] ), pPacket.segHdr.size ) ); } } @@ -381,7 +381,7 @@ void Core::Network::GameConnection::handlePackets( const Core::Network::Packets: { switch( inPacket.segHdr.type ) { - case 1: + case SEGMENTTYPE_SESSIONINIT: { char* id = ( char* ) &( inPacket.data[4] ); uint32_t playerId = boost::lexical_cast< uint32_t >( id ); @@ -445,12 +445,12 @@ void Core::Network::GameConnection::handlePackets( const Core::Network::Packets: break; } - case 3: // game packet + case SEGMENTTYPE_IPC: // game packet { queueInPacket( inPacket ); break; } - case 7: // keep alive + case SEGMENTTYPE_KEEPALIVE: // keep alive { uint32_t id = *( uint32_t* ) &inPacket.data[0]; uint32_t timeStamp = *( uint32_t* ) &inPacket.data[4]; From f774ba9d33ed0354732d7c430f10adf411076206 Mon Sep 17 00:00:00 2001 From: NotAdam Date: Fri, 6 Jul 2018 22:43:26 +1000 Subject: [PATCH 06/16] fix typo --- src/common/Network/CommonActorControl.h | 2 +- .../sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/src/common/Network/CommonActorControl.h b/src/common/Network/CommonActorControl.h index 2ab573d5..fb2fe4ba 100644 --- a/src/common/Network/CommonActorControl.h +++ b/src/common/Network/CommonActorControl.h @@ -219,7 +219,7 @@ namespace Core { enum ClientTriggerType { - ToggleSeathe = 0x01, + ToggleSheathe = 0x01, ToggleAutoAttack = 0x02, ChangeTarget = 0x03, diff --git a/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp b/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp index 6f81318d..8b7010a2 100644 --- a/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp @@ -64,7 +64,7 @@ void Core::Network::GameConnection::clientTriggerHandler( const Packets::FFXIVAR switch( commandId ) { - case ClientTriggerType::ToggleSeathe: // Toggle sheathe + case ClientTriggerType::ToggleSheathe: // Toggle sheathe { if ( param11 == 1 ) player.setStance( Entity::Chara::Stance::Active ); From 09d00b8a7f11c7f4fdbe24ef96da893e40a015a0 Mon Sep 17 00:00:00 2001 From: NotAdam Date: Fri, 6 Jul 2018 22:43:49 +1000 Subject: [PATCH 07/16] start moving old packets to new incoming packet system --- src/common/Network/GamePacketNew.h | 2 +- .../Network/PacketDef/Zone/ClientZoneDef.h | 28 +++++++++++++++++++ .../Network/Handlers/ClientTriggerHandler.cpp | 18 ++++++------ .../Network/Handlers/GMCommandHandlers.cpp | 6 ++-- .../Network/Handlers/SkillHandler.cpp | 13 ++++----- 5 files changed, 48 insertions(+), 19 deletions(-) diff --git a/src/common/Network/GamePacketNew.h b/src/common/Network/GamePacketNew.h index c9ee97fe..37319b66 100644 --- a/src/common/Network/GamePacketNew.h +++ b/src/common/Network/GamePacketNew.h @@ -195,7 +195,7 @@ public: auto log = g_fw.get< Core::Logger >(); if( log ) { - log->debug( "rawpacket size" + std::to_string( rawPacket.segHdr.size ) + "\n" + Util::binaryToHexDump( const_cast< uint8_t* >( &rawPacket.data[0] ), rawPacket.segHdr.size ) ); + log->debug( "rawpacket size " + std::to_string( rawPacket.segHdr.size ) + "\n" + Util::binaryToHexDump( const_cast< uint8_t* >( &rawPacket.data[0] ), rawPacket.segHdr.size ) ); log->debug( "T size " + std::to_string( sizeof( T ) ) + "\n" + Util::binaryToHexDump( reinterpret_cast< uint8_t* >( &m_data ), sizeof( T ) ) ); } diff --git a/src/common/Network/PacketDef/Zone/ClientZoneDef.h b/src/common/Network/PacketDef/Zone/ClientZoneDef.h index 61bed5b7..93a2c085 100644 --- a/src/common/Network/PacketDef/Zone/ClientZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ClientZoneDef.h @@ -18,6 +18,34 @@ struct FFXIVIpcGmCommand1 : FFXIVIpcBasePacket< GMCommand1 > /* 0018 */ uint32_t param3; }; +struct FFXIVIpcGmCommand2 : FFXIVIpcBasePacket< GMCommand2 > +{ + /* 0000 */ uint32_t commandId; + /* 0004 */ char unk_4[0x10]; + /* 0014 */ char param1[0x20]; +}; + +struct FFXIVIpcClientTrigger : FFXIVIpcBasePacket< ClientTrigger > +{ + /* 0000 */ uint16_t commandId; + /* 0002 */ char unk_2[2]; + /* 0004 */ uint64_t param1; + /* 000C */ uint32_t param2; + /* 0010 */ char unk_10[8]; + /* 0018 */ uint64_t param3; +}; + +struct FFXIVIpcSkillHandler : FFXIVIpcBasePacket< SkillHandler > +{ + /* 0000 */ char pad_0000[1]; + /* 0001 */ uint8_t type; + /* 0002 */ char pad_0002[2]; + /* 0004 */ uint32_t actionId; + /* 0008 */ uint32_t useCount; + /* 000C */ char pad_000C[4]; + /* 0010 */ uint64_t targetId; +}; + } } } diff --git a/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp b/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp index 8b7010a2..a03b4bad 100644 --- a/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include "Zone/Zone.h" #include "Zone/ZonePosition.h" @@ -42,15 +43,16 @@ using namespace Core::Network::ActorControl; void Core::Network::GameConnection::clientTriggerHandler( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) { - Packets::FFXIVARR_PACKET_RAW copy = inPacket; - auto pLog = g_fw.get< Logger >(); - uint16_t commandId = *reinterpret_cast< uint16_t* >( ©.data[0x10] ); - uint64_t param1 = *reinterpret_cast< uint64_t* >( ©.data[0x14] ); - uint32_t param11 = *reinterpret_cast< uint32_t* >( ©.data[0x14] ); - uint32_t param12 = *reinterpret_cast< uint32_t* >( ©.data[0x18] ); - uint32_t param2 = *reinterpret_cast< uint32_t* >( ©.data[0x1C] ); - uint64_t param3 = *reinterpret_cast< uint64_t* >( ©.data[0x28] ); + + auto packet = ZoneChannelPacket< Client::FFXIVIpcClientTrigger >( inPacket ); + + auto commandId = packet.data().commandId; + auto param1 = packet.data().param1; + auto param11 = *reinterpret_cast< uint32_t* >( &packet.data().param1 ); + auto param12 = *reinterpret_cast< uint32_t* >( &packet.data().param1 + sizeof( uint32_t ) ); + auto param2 = packet.data().param2; + auto param3 = packet.data().param3; pLog->debug( "[" + std::to_string( m_pSession->getId() ) + "] Incoming action: " + boost::str( boost::format( "%|04X|" ) % ( uint32_t ) ( commandId & 0xFFFF ) ) + diff --git a/src/servers/sapphire_zone/Network/Handlers/GMCommandHandlers.cpp b/src/servers/sapphire_zone/Network/Handlers/GMCommandHandlers.cpp index f0ed74ab..8737cbe9 100644 --- a/src/servers/sapphire_zone/Network/Handlers/GMCommandHandlers.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/GMCommandHandlers.cpp @@ -489,10 +489,10 @@ void Core::Network::GameConnection::gm2Handler( const Packets::FFXIVARR_PACKET_R auto pLog = g_fw.get< Logger >(); auto pServerZone = g_fw.get< ServerZone >(); - Packets::FFXIVARR_PACKET_RAW copy = inPacket; - auto commandId = *reinterpret_cast< uint32_t* >( ©.data[0x10] ); + auto packet = ZoneChannelPacket< Client::FFXIVIpcGmCommand2 >( inPacket ); - auto param1 = std::string( reinterpret_cast< char* >( ©.data[0x24] ) ); + auto commandId = packet.data().commandId; + auto param1 = std::string( packet.data().param1 ); pLog->debug( player.getName() + " used GM2 commandId: " + std::to_string( commandId ) + ", params: " + param1 ); diff --git a/src/servers/sapphire_zone/Network/Handlers/SkillHandler.cpp b/src/servers/sapphire_zone/Network/Handlers/SkillHandler.cpp index a520a9c7..fa3eb7fd 100644 --- a/src/servers/sapphire_zone/Network/Handlers/SkillHandler.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/SkillHandler.cpp @@ -6,6 +6,7 @@ #include #include #include +#include #include #include "Network/GameConnection.h" @@ -38,14 +39,12 @@ using namespace Core::Network::ActorControl; void Core::Network::GameConnection::skillHandler( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) { - Packets::FFXIVARR_PACKET_RAW copy = inPacket; + auto packet = ZoneChannelPacket< Client::FFXIVIpcSkillHandler >( inPacket ); - uint8_t type = inPacket.data[0x11]; - - auto action = *reinterpret_cast< uint32_t* >( ©.data[0x14] ); - auto useCount = *reinterpret_cast< uint32_t* >( ©.data[0x18] ); - - auto targetId = *reinterpret_cast< uint64_t* >( ©.data[0x20] ); + auto type = packet.data().type; + auto action = packet.data().actionId; + auto useCount = packet.data().useCount; + auto targetId = packet.data().targetId; player.sendDebug( "Skill type:" + std::to_string( type ) ); From 833f4f1431c9f2b961b58c08c162ddec4be06b3f Mon Sep 17 00:00:00 2001 From: NotAdam Date: Fri, 6 Jul 2018 23:36:50 +1000 Subject: [PATCH 08/16] convert more old incoming packets to structs --- src/common/Network/GamePacketNew.h | 2 + .../Network/PacketDef/Zone/ClientZoneDef.h | 59 +++++++++++++++++ .../Network/Handlers/ClientTriggerHandler.cpp | 14 ++-- .../Network/Handlers/EventHandlers.cpp | 65 ++++++++++--------- .../Network/Handlers/GMCommandHandlers.cpp | 24 +++---- .../Network/Handlers/InventoryHandler.cpp | 14 ++-- .../Network/Handlers/PacketHandlers.cpp | 19 +++--- .../Network/Handlers/SkillHandler.cpp | 10 +-- 8 files changed, 136 insertions(+), 71 deletions(-) diff --git a/src/common/Network/GamePacketNew.h b/src/common/Network/GamePacketNew.h index 37319b66..f0543b4a 100644 --- a/src/common/Network/GamePacketNew.h +++ b/src/common/Network/GamePacketNew.h @@ -239,6 +239,8 @@ public: /** Gets a reference to the underlying IPC data structure. */ T& data() { return m_data; }; + const T& data() const { return m_data; } + protected: /** Initializes the fields of the header structures */ virtual void initialize() diff --git a/src/common/Network/PacketDef/Zone/ClientZoneDef.h b/src/common/Network/PacketDef/Zone/ClientZoneDef.h index 93a2c085..7e2021f7 100644 --- a/src/common/Network/PacketDef/Zone/ClientZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ClientZoneDef.h @@ -46,6 +46,65 @@ struct FFXIVIpcSkillHandler : FFXIVIpcBasePacket< SkillHandler > /* 0010 */ uint64_t targetId; }; +struct FFXIVIpcZoneLineHandler : FFXIVIpcBasePacket< ZoneLineHandler > +{ + /* 0000 */ uint32_t zoneLineId; +}; + +struct FFXIVIpcDiscoveryHandler : FFXIVIpcBasePacket< DiscoveryHandler > +{ + /* 0000 */ uint32_t positionRef; +}; + +struct FFXIVIpcEventHandlerReturn : FFXIVIpcBasePacket< ReturnEventHandler > +{ + /* 0000 */ uint32_t eventId; + /* 0004 */ uint16_t scene; + /* 0006 */ uint16_t param1; + /* 0008 */ uint16_t param2; + /* 000A */ char pad_000A[2]; + /* 000C */ uint16_t param3; +}; + +struct FFXIVIpcEnterTerritoryHandler : FFXIVIpcBasePacket< EnterTeriEventHandler > +{ + /* 0000 */ uint32_t eventId; + /* 0004 */ uint16_t param1; + /* 0006 */ uint16_t param2; +}; + +struct FFXIVIpcEventHandlerOutsideRange : FFXIVIpcBasePacket< OutOfRangeEventHandler > +{ + /* 0000 */ uint32_t param1; + /* 0004 */ uint32_t eventId; + /* 0008 */ Common::FFXIVARR_POSITION3 position; +}; + +struct FFXIVIpcEventHandlerWithinRange : FFXIVIpcBasePacket< WithinRangeEventHandler > +{ + /* 0000 */ uint32_t param1; + /* 0004 */ uint32_t eventId; + /* 0008 */ Common::FFXIVARR_POSITION3 position; +}; + +struct FFXIVIpcEventHandlerEmote : FFXIVIpcBasePacket< EmoteEventHandler > +{ + /* 0000 */ uint64_t actorId; + /* 0008 */ uint32_t eventId; + /* 000C */ uint16_t emoteId; +}; + +struct FFXIVIpcEventHandlerTalk : FFXIVIpcBasePacket< TalkEventHandler > +{ + /* 0000 */ uint64_t actorId; + /* 0008 */ uint32_t eventId; +}; + +struct FFXIVIpcPingHandler : FFXIVIpcBasePacket< PingHandler > +{ + /* 0000 */ uint32_t timestamp; // maybe lol.. +}; + } } } diff --git a/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp b/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp index a03b4bad..8cda8ace 100644 --- a/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp @@ -45,14 +45,14 @@ void Core::Network::GameConnection::clientTriggerHandler( const Packets::FFXIVAR { auto pLog = g_fw.get< Logger >(); - auto packet = ZoneChannelPacket< Client::FFXIVIpcClientTrigger >( inPacket ); + const auto packet = ZoneChannelPacket< Client::FFXIVIpcClientTrigger >( inPacket ); - auto commandId = packet.data().commandId; - auto param1 = packet.data().param1; - auto param11 = *reinterpret_cast< uint32_t* >( &packet.data().param1 ); - auto param12 = *reinterpret_cast< uint32_t* >( &packet.data().param1 + sizeof( uint32_t ) ); - auto param2 = packet.data().param2; - auto param3 = packet.data().param3; + const auto& commandId = packet.data().commandId; + const auto& param1 = packet.data().param1; + const auto& param11 = *reinterpret_cast< const uint32_t* >( &packet.data().param1 ); + const auto& param12 = *reinterpret_cast< const uint32_t* >( &packet.data().param1 + sizeof( uint32_t ) ); + const auto& param2 = packet.data().param2; + const auto& param3 = packet.data().param3; pLog->debug( "[" + std::to_string( m_pSession->getId() ) + "] Incoming action: " + boost::str( boost::format( "%|04X|" ) % ( uint32_t ) ( commandId & 0xFFFF ) ) + diff --git a/src/servers/sapphire_zone/Network/Handlers/EventHandlers.cpp b/src/servers/sapphire_zone/Network/Handlers/EventHandlers.cpp index 7668f528..8bb33b7c 100644 --- a/src/servers/sapphire_zone/Network/Handlers/EventHandlers.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/EventHandlers.cpp @@ -7,6 +7,7 @@ #include #include #include +#include #include "Network/GameConnection.h" #include "Network/PacketWrappers/ServerNoticePacket.h" @@ -38,10 +39,12 @@ void Core::Network::GameConnection::eventHandlerTalk( const Packets::FFXIVARR_PA { auto pScriptMgr = g_fw.get< Scripting::ScriptMgr >(); auto pExdData = g_fw.get< Data::ExdDataGenerated >(); - Packets::FFXIVARR_PACKET_RAW copy = inPacket; - auto actorId = *reinterpret_cast< uint64_t* >( ©.data[0x10] ); - auto eventId = *reinterpret_cast< uint32_t* >( ©.data[0x18] ); + const auto packet = ZoneChannelPacket< Client::FFXIVIpcEventHandlerTalk >( inPacket ); + + const auto& actorId = packet.data().actorId; + const auto& eventId = packet.data().eventId; + auto eventType = static_cast< uint16_t >( eventId >> 16 ); std::string eventName = "onTalk"; @@ -81,12 +84,13 @@ void Core::Network::GameConnection::eventHandlerEmote( const Packets::FFXIVARR_P auto pScriptMgr = g_fw.get< Scripting::ScriptMgr >(); auto pExdData = g_fw.get< Data::ExdDataGenerated >(); - Packets::FFXIVARR_PACKET_RAW copy = inPacket; - auto actorId = *reinterpret_cast< uint64_t* >( ©.data[0x10] ); - auto eventId = *reinterpret_cast< uint32_t* >( ©.data[0x18] ); - auto emoteId = *reinterpret_cast< uint16_t* >( ©.data[0x1C] ); - auto eventType = static_cast< uint16_t >( eventId >> 16 ); + const auto packet = ZoneChannelPacket< Client::FFXIVIpcEventHandlerEmote >( inPacket ); + + const auto& actorId = packet.data().actorId; + const auto& eventId = packet.data().eventId; + const auto& emoteId = packet.data().emoteId; + const auto eventType = static_cast< uint16_t >( eventId >> 16 ); std::string eventName = "onEmote"; std::string objName = Event::getEventName( eventId ); @@ -118,14 +122,12 @@ void Core::Network::GameConnection::eventHandlerWithinRange( const Packets::FFXI Entity::Player& player ) { auto pScriptMgr = g_fw.get< Scripting::ScriptMgr >(); - Packets::FFXIVARR_PACKET_RAW copy = inPacket; - auto eventId = *reinterpret_cast< uint32_t* >( ©.data[0x14] ); - auto param1 = *reinterpret_cast< uint32_t* >( ©.data[0x10] ); + const auto packet = ZoneChannelPacket< Client::FFXIVIpcEventHandlerWithinRange >( inPacket ); - auto x = *reinterpret_cast< float* >( ©.data[0x18] ); - auto y = *reinterpret_cast< float* >( ©.data[0x1C] ); - auto z = *reinterpret_cast< float* >( ©.data[0x20] ); + const auto& eventId = packet.data().eventId; + const auto& param1 = packet.data().param1; + const auto& pos = packet.data().position; std::string eventName = "onWithinRange"; std::string objName = Event::getEventName( eventId ); @@ -134,7 +136,7 @@ void Core::Network::GameConnection::eventHandlerWithinRange( const Packets::FFXI player.eventStart( player.getId(), eventId, Event::EventHandler::WithinRange, 1, param1 ); - pScriptMgr->onWithinRange( player, eventId, param1, x, y, z ); + pScriptMgr->onWithinRange( player, eventId, param1, pos.x, pos.y, pos.z ); player.checkEvent( eventId ); } @@ -145,12 +147,11 @@ void Core::Network::GameConnection::eventHandlerOutsideRange( const Packets::FFX auto pScriptMgr = g_fw.get< Scripting::ScriptMgr >(); Packets::FFXIVARR_PACKET_RAW copy = inPacket; - auto eventId = *reinterpret_cast< uint32_t* >( ©.data[0x14] ); - auto param1 = *reinterpret_cast< uint32_t* >( ©.data[0x10] ); + const auto packet = ZoneChannelPacket< Client::FFXIVIpcEventHandlerOutsideRange >( inPacket ); - auto x = *reinterpret_cast< float* >( ©.data[0x18] ); - auto y = *reinterpret_cast< float* >( ©.data[0x1C] ); - auto z = *reinterpret_cast< float* >( ©.data[0x20] ); + const auto& eventId = packet.data().eventId; + const auto& param1 = packet.data().param1; + const auto& pos = packet.data().position; std::string eventName = "onOutsideRange"; std::string objName = Event::getEventName( eventId ); @@ -159,7 +160,7 @@ void Core::Network::GameConnection::eventHandlerOutsideRange( const Packets::FFX player.eventStart( player.getId(), eventId, Event::EventHandler::WithinRange, 1, param1 ); - pScriptMgr->onOutsideRange( player, eventId, param1, x, y, z ); + pScriptMgr->onOutsideRange( player, eventId, param1, pos.x, pos.y, pos.z ); player.checkEvent( eventId ); } @@ -168,11 +169,12 @@ void Core::Network::GameConnection::eventHandlerEnterTerritory( const Packets::F Entity::Player& player ) { auto pScriptMgr = g_fw.get< Scripting::ScriptMgr >(); - Packets::FFXIVARR_PACKET_RAW copy = inPacket; - auto eventId = *reinterpret_cast< uint32_t* >( ©.data[0x10] ); - auto param1 = *reinterpret_cast< uint16_t* >( ©.data[0x14] ); - auto param2 = *reinterpret_cast< uint16_t* >( ©.data[0x16] ); + const auto packet = ZoneChannelPacket< Client::FFXIVIpcEnterTerritoryHandler >( inPacket ); + + const auto& eventId = packet.data().eventId; + const auto& param1 = packet.data().param1; + const auto& param2 = packet.data().param2; std::string eventName = "onEnterTerritory"; @@ -197,13 +199,12 @@ void Core::Network::GameConnection::eventHandlerEnterTerritory( const Packets::F void Core::Network::GameConnection::eventHandlerReturn( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) { - Packets::FFXIVARR_PACKET_RAW copy = inPacket; - - auto eventId = *reinterpret_cast< uint32_t* >( ©.data[0x10] ); - auto scene = *reinterpret_cast< uint16_t* >( ©.data[0x14] ); - auto param1 = *reinterpret_cast< uint16_t* >( ©.data[0x16] ); - auto param2 = *reinterpret_cast< uint16_t* >( ©.data[0x18] ); - auto param3 = *reinterpret_cast< uint16_t* >( ©.data[0x1C] ); + const auto packet = ZoneChannelPacket< Client::FFXIVIpcEventHandlerReturn >( inPacket ); + const auto& eventId = packet.data().eventId; + const auto& scene = packet.data().scene; + const auto& param1 = packet.data().param1; + const auto& param2 = packet.data().param2; + const auto& param3 = packet.data().param3; std::string eventName = Event::getEventName( eventId ); diff --git a/src/servers/sapphire_zone/Network/Handlers/GMCommandHandlers.cpp b/src/servers/sapphire_zone/Network/Handlers/GMCommandHandlers.cpp index 8737cbe9..b68be510 100644 --- a/src/servers/sapphire_zone/Network/Handlers/GMCommandHandlers.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/GMCommandHandlers.cpp @@ -92,11 +92,11 @@ void Core::Network::GameConnection::gm1Handler( const Packets::FFXIVARR_PACKET_R if( player.getGmRank() <= 0 ) return; - 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; + const auto packet = ZoneChannelPacket< Client::FFXIVIpcGmCommand1 >( inPacket ); + const auto& commandId = packet.data().commandId; + const auto& param1 = packet.data().param1; + const auto& param2 = packet.data().param2; + const auto& param3 = packet.data().param3; auto pLog = g_fw.get< Logger >(); pLog->debug( player.getName() + " used GM1 commandId: " + std::to_string( commandId ) + @@ -310,9 +310,11 @@ void Core::Network::GameConnection::gm1Handler( const Packets::FFXIVARR_PACKET_R } case GmCommand::Item: { - if( param2 < 1 || param2 > 99 ) + auto quantity = param2; + + if( quantity < 1 || quantity > 999 ) { - param2 = 1; + quantity = 1; } if( ( param1 == 0xcccccccc ) ) @@ -321,7 +323,7 @@ void Core::Network::GameConnection::gm1Handler( const Packets::FFXIVARR_PACKET_R return; } - if( !targetPlayer->addItem( -1, param1, param2 ) ) + if( !targetPlayer->addItem( -1, param1, quantity ) ) player.sendUrgent( "Item " + std::to_string( param1 ) + " not found..." ); break; } @@ -489,10 +491,10 @@ void Core::Network::GameConnection::gm2Handler( const Packets::FFXIVARR_PACKET_R auto pLog = g_fw.get< Logger >(); auto pServerZone = g_fw.get< ServerZone >(); - auto packet = ZoneChannelPacket< Client::FFXIVIpcGmCommand2 >( inPacket ); + const auto packet = ZoneChannelPacket< Client::FFXIVIpcGmCommand2 >( inPacket ); - auto commandId = packet.data().commandId; - auto param1 = std::string( packet.data().param1 ); + const auto& commandId = packet.data().commandId; + const auto& param1 = std::string( packet.data().param1 ); pLog->debug( player.getName() + " used GM2 commandId: " + std::to_string( commandId ) + ", params: " + param1 ); diff --git a/src/servers/sapphire_zone/Network/Handlers/InventoryHandler.cpp b/src/servers/sapphire_zone/Network/Handlers/InventoryHandler.cpp index 6efd9a30..05118fa2 100644 --- a/src/servers/sapphire_zone/Network/Handlers/InventoryHandler.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/InventoryHandler.cpp @@ -42,16 +42,16 @@ void Core::Network::GameConnection::inventoryModifyHandler( const Packets::FFXIV Entity::Player& player ) { Packets::FFXIVARR_PACKET_RAW copy = inPacket; - auto seq = *reinterpret_cast< uint32_t* >( ©.data[0x10] ); - auto action = *reinterpret_cast< uint8_t* >( ©.data[0x14] ); - auto fromSlot = *reinterpret_cast< uint8_t* >( ©.data[0x20] ); - auto toSlot = *reinterpret_cast< uint8_t* >( ©.data[0x34] ); + auto seq = *reinterpret_cast< uint32_t* >( ©.data[0x1] ); + auto action = *reinterpret_cast< uint8_t* >( ©.data[0x4] ); + auto fromSlot = *reinterpret_cast< uint8_t* >( ©.data[0x10] ); + auto toSlot = *reinterpret_cast< uint8_t* >( ©.data[0x24] ); - auto fromContainer = *reinterpret_cast< uint16_t* >( ©.data[0x1C] ); - auto toContainer = *reinterpret_cast< uint16_t* >( ©.data[0x30] ); + auto fromContainer = *reinterpret_cast< uint16_t* >( ©.data[0xC] ); + auto toContainer = *reinterpret_cast< uint16_t* >( ©.data[0x20] ); // todo: check packet handler in game and see if this is sent as a u16 or u32 - auto splitCount = *reinterpret_cast< uint16_t* >( ©.data[0x38] ); + auto splitCount = *reinterpret_cast< uint16_t* >( ©.data[0x28] ); auto ackPacket = makeZonePacket< FFXIVIpcInventoryActionAck >( player.getId() ); ackPacket->data().sequence = seq; diff --git a/src/servers/sapphire_zone/Network/Handlers/PacketHandlers.cpp b/src/servers/sapphire_zone/Network/Handlers/PacketHandlers.cpp index 7d400df5..aee30a3a 100644 --- a/src/servers/sapphire_zone/Network/Handlers/PacketHandlers.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/PacketHandlers.cpp @@ -10,6 +10,7 @@ #include #include +#include #include "Network/GameConnection.h" #include "Zone/TerritoryMgr.h" @@ -299,8 +300,8 @@ void Core::Network::GameConnection::zoneLineHandler( const Core::Network::Packet { auto pTeriMgr = g_fw.get< TerritoryMgr >(); - Packets::FFXIVARR_PACKET_RAW copy = inPacket; - auto zoneLineId = *reinterpret_cast< uint32_t* >( ©.data[0x10] ); + const auto packet = ZoneChannelPacket< Client::FFXIVIpcZoneLineHandler >( inPacket ); + const auto& zoneLineId = packet.data().zoneLineId; player.sendDebug( "Walking ZoneLine " + std::to_string( zoneLineId ) ); @@ -346,17 +347,18 @@ void Core::Network::GameConnection::discoveryHandler( const Core::Network::Packe Packets::FFXIVARR_PACKET_RAW copy = inPacket; - auto ref_position_id = *reinterpret_cast< uint32_t* >( ©.data[0x10] ); + auto packet = ZoneChannelPacket< Client::FFXIVIpcDiscoveryHandler >( inPacket ); + const auto& positionRef = packet.data().positionRef; auto pDb = g_fw.get< Db::DbWorkerPool< Db::CharaDbConnection > >(); auto pQR = pDb->query( "SELECT id, map_id, discover_id " "FROM discoveryinfo " - "WHERE id = " + std::to_string( ref_position_id ) + ";" ); + "WHERE id = " + std::to_string( positionRef ) + ";" ); if( !pQR->next() ) { - player.sendNotice( "Discovery ref pos ID: " + std::to_string( ref_position_id ) + " not found. " ); + player.sendNotice( "Discovery ref pos ID: " + std::to_string( positionRef ) + " not found. " ); return; } @@ -365,7 +367,7 @@ void Core::Network::GameConnection::discoveryHandler( const Core::Network::Packe discoveryPacket->data().map_part_id = pQR->getUInt( 3 ); player.queuePacket( discoveryPacket ); - player.sendNotice( "Discovery ref pos ID: " + std::to_string( ref_position_id ) ); + player.sendNotice( "Discovery ref pos ID: " + std::to_string( positionRef ) ); player.discover( pQR->getUInt16( 2 ), pQR->getUInt16( 3 ) ); @@ -409,10 +411,9 @@ void Core::Network::GameConnection::blackListHandler( const Core::Network::Packe void Core::Network::GameConnection::pingHandler( const Core::Network::Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) { - Packets::FFXIVARR_PACKET_RAW copy = inPacket; - auto inVal = *reinterpret_cast< uint32_t* >( ©.data[0x10] ); + const auto packet = ZoneChannelPacket< Client::FFXIVIpcPingHandler >( inPacket ); - queueOutPacket( boost::make_shared< PingPacket>( player, inVal ) ); + queueOutPacket( boost::make_shared< Server::PingPacket >( player, packet.data().timestamp ) ); player.setLastPing( static_cast< uint32_t >( time( nullptr ) ) ); } diff --git a/src/servers/sapphire_zone/Network/Handlers/SkillHandler.cpp b/src/servers/sapphire_zone/Network/Handlers/SkillHandler.cpp index fa3eb7fd..f7be2a62 100644 --- a/src/servers/sapphire_zone/Network/Handlers/SkillHandler.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/SkillHandler.cpp @@ -39,12 +39,12 @@ using namespace Core::Network::ActorControl; void Core::Network::GameConnection::skillHandler( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) { - auto packet = ZoneChannelPacket< Client::FFXIVIpcSkillHandler >( inPacket ); + const auto packet = ZoneChannelPacket< Client::FFXIVIpcSkillHandler >( inPacket ); - auto type = packet.data().type; - auto action = packet.data().actionId; - auto useCount = packet.data().useCount; - auto targetId = packet.data().targetId; + const auto& type = packet.data().type; + const auto& action = packet.data().actionId; + const auto& useCount = packet.data().useCount; + const auto& targetId = packet.data().targetId; player.sendDebug( "Skill type:" + std::to_string( type ) ); From 44eeda832bb2a5edef3468c47ae4589e74455840 Mon Sep 17 00:00:00 2001 From: NotAdam Date: Fri, 6 Jul 2018 23:38:40 +1000 Subject: [PATCH 09/16] const correctness --- src/servers/sapphire_zone/Network/Handlers/PacketHandlers.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/servers/sapphire_zone/Network/Handlers/PacketHandlers.cpp b/src/servers/sapphire_zone/Network/Handlers/PacketHandlers.cpp index aee30a3a..9cf33272 100644 --- a/src/servers/sapphire_zone/Network/Handlers/PacketHandlers.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/PacketHandlers.cpp @@ -347,7 +347,7 @@ void Core::Network::GameConnection::discoveryHandler( const Core::Network::Packe Packets::FFXIVARR_PACKET_RAW copy = inPacket; - auto packet = ZoneChannelPacket< Client::FFXIVIpcDiscoveryHandler >( inPacket ); + const auto packet = ZoneChannelPacket< Client::FFXIVIpcDiscoveryHandler >( inPacket ); const auto& positionRef = packet.data().positionRef; auto pDb = g_fw.get< Db::DbWorkerPool< Db::CharaDbConnection > >(); From c18ea5e7345f773ae7c17f8d7c3db6d4321e9e5b Mon Sep 17 00:00:00 2001 From: NotAdam Date: Sat, 7 Jul 2018 13:38:15 +1000 Subject: [PATCH 10/16] cleanup clienttrigger ipc struct, verbose packet construction log switch --- src/common/Network/GamePacketNew.h | 4 ++-- .../Network/PacketDef/Zone/ClientZoneDef.h | 18 ++++++++++++++++-- .../Network/Handlers/ClientTriggerHandler.cpp | 4 ++-- 3 files changed, 20 insertions(+), 6 deletions(-) diff --git a/src/common/Network/GamePacketNew.h b/src/common/Network/GamePacketNew.h index f0543b4a..7eefc16a 100644 --- a/src/common/Network/GamePacketNew.h +++ b/src/common/Network/GamePacketNew.h @@ -184,7 +184,7 @@ public: initialize(); }; - FFXIVIpcPacket< T, T1 >( const FFXIVARR_PACKET_RAW& rawPacket ) + FFXIVIpcPacket< T, T1 >( const FFXIVARR_PACKET_RAW& rawPacket, bool verbose = false ) { auto ipcHdrSize = sizeof( FFXIVARR_IPC_HEADER ); auto copySize = std::min< uint32_t >( sizeof( T ), rawPacket.segHdr.size - ipcHdrSize ); @@ -193,7 +193,7 @@ public: memcpy( &m_data, &rawPacket.data[0] + ipcHdrSize, copySize ); auto log = g_fw.get< Core::Logger >(); - if( log ) + if( log && verbose ) { log->debug( "rawpacket size " + std::to_string( rawPacket.segHdr.size ) + "\n" + Util::binaryToHexDump( const_cast< uint8_t* >( &rawPacket.data[0] ), rawPacket.segHdr.size ) ); log->debug( "T size " + std::to_string( sizeof( T ) ) + "\n" + Util::binaryToHexDump( reinterpret_cast< uint8_t* >( &m_data ), sizeof( T ) ) ); diff --git a/src/common/Network/PacketDef/Zone/ClientZoneDef.h b/src/common/Network/PacketDef/Zone/ClientZoneDef.h index 7e2021f7..659f8ad4 100644 --- a/src/common/Network/PacketDef/Zone/ClientZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ClientZoneDef.h @@ -25,16 +25,30 @@ struct FFXIVIpcGmCommand2 : FFXIVIpcBasePacket< GMCommand2 > /* 0014 */ char param1[0x20]; }; +#pragma pack(push, 4) + struct FFXIVIpcClientTrigger : FFXIVIpcBasePacket< ClientTrigger > { /* 0000 */ uint16_t commandId; - /* 0002 */ char unk_2[2]; - /* 0004 */ uint64_t param1; + /* 0002 */ uint8_t unk_2[2]; + + union + { + /* 0004 */ uint64_t param1; + struct + { + /* 0004 */ uint32_t param11; + /* 0008 */ uint32_t param12; + }; + }; + /* 000C */ uint32_t param2; /* 0010 */ char unk_10[8]; /* 0018 */ uint64_t param3; }; +#pragma pack(pop) + struct FFXIVIpcSkillHandler : FFXIVIpcBasePacket< SkillHandler > { /* 0000 */ char pad_0000[1]; diff --git a/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp b/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp index 8cda8ace..8335f1e1 100644 --- a/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp @@ -49,8 +49,8 @@ void Core::Network::GameConnection::clientTriggerHandler( const Packets::FFXIVAR const auto& commandId = packet.data().commandId; const auto& param1 = packet.data().param1; - const auto& param11 = *reinterpret_cast< const uint32_t* >( &packet.data().param1 ); - const auto& param12 = *reinterpret_cast< const uint32_t* >( &packet.data().param1 + sizeof( uint32_t ) ); + const auto& param11 = packet.data().param11; + const auto& param12 = packet.data().param12; const auto& param2 = packet.data().param2; const auto& param3 = packet.data().param3; From 25b6359736d52b962fc8f8d92ddbb4d95dc5f0f7 Mon Sep 17 00:00:00 2001 From: NotAdam Date: Sat, 7 Jul 2018 16:50:11 +1000 Subject: [PATCH 11/16] fix searchinfo update, add searchinfo ipc struct --- src/common/Common.h | 8 ++++++ .../Network/PacketDef/Zone/ClientZoneDef.h | 25 ++++++++++++++++--- src/servers/sapphire_zone/Actor/PlayerSql.cpp | 2 +- .../Network/Handlers/PacketHandlers.cpp | 13 +++++----- 4 files changed, 36 insertions(+), 12 deletions(-) diff --git a/src/common/Common.h b/src/common/Common.h index 8088c90b..3eba346d 100644 --- a/src/common/Common.h +++ b/src/common/Common.h @@ -27,6 +27,14 @@ namespace Common { float z; }; + enum ClientLanguage : uint8_t + { + Japanese = 1, + English = 2, + German = 4, + French = 8 + }; + enum EquipSlot : uint8_t { MainHand = 0, diff --git a/src/common/Network/PacketDef/Zone/ClientZoneDef.h b/src/common/Network/PacketDef/Zone/ClientZoneDef.h index 659f8ad4..4445adc7 100644 --- a/src/common/Network/PacketDef/Zone/ClientZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ClientZoneDef.h @@ -9,6 +9,8 @@ namespace Network { namespace Packets { namespace Client { +#pragma pack(push, 1) + struct FFXIVIpcGmCommand1 : FFXIVIpcBasePacket< GMCommand1 > { /* 0000 */ uint32_t commandId; @@ -25,8 +27,6 @@ struct FFXIVIpcGmCommand2 : FFXIVIpcBasePacket< GMCommand2 > /* 0014 */ char param1[0x20]; }; -#pragma pack(push, 4) - struct FFXIVIpcClientTrigger : FFXIVIpcBasePacket< ClientTrigger > { /* 0000 */ uint16_t commandId; @@ -47,8 +47,6 @@ struct FFXIVIpcClientTrigger : FFXIVIpcBasePacket< ClientTrigger > /* 0018 */ uint64_t param3; }; -#pragma pack(pop) - struct FFXIVIpcSkillHandler : FFXIVIpcBasePacket< SkillHandler > { /* 0000 */ char pad_0000[1]; @@ -119,6 +117,25 @@ struct FFXIVIpcPingHandler : FFXIVIpcBasePacket< PingHandler > /* 0000 */ uint32_t timestamp; // maybe lol.. }; +struct FFXIVIpcSetSearchInfo : FFXIVIpcBasePacket< SetSearchInfoHandler > +{ + union + { + /* 0000 */ uint64_t status; + struct + { + /* 0000 */ uint32_t status1; + /* 0004 */ uint32_t status2; + }; + }; + + /* 0008 */ char pad_0008[9]; + /* 0011 */ Common::ClientLanguage language; + /* 0012 */ char searchComment[193]; +}; + +#pragma pack(pop) + } } } diff --git a/src/servers/sapphire_zone/Actor/PlayerSql.cpp b/src/servers/sapphire_zone/Actor/PlayerSql.cpp index 564f44a9..1a325350 100644 --- a/src/servers/sapphire_zone/Actor/PlayerSql.cpp +++ b/src/servers/sapphire_zone/Actor/PlayerSql.cpp @@ -488,7 +488,7 @@ void Core::Entity::Player::updateDbSearchInfo() const stmtS1->setInt( 2, m_id ); pDb->execute( stmtS1 ); - auto stmtS2 = pDb->getPreparedStatement( Db::CHARA_SEARCHINFO_UP_SELECTREGION ); + auto stmtS2 = pDb->getPreparedStatement( Db::CHARA_SEARCHINFO_UP_SEARCHCOMMENT ); stmtS2->setString( 1, string( m_searchMessage != nullptr ? m_searchMessage : "" ) ); stmtS2->setInt( 2, m_id ); pDb->execute( stmtS2 ); diff --git a/src/servers/sapphire_zone/Network/Handlers/PacketHandlers.cpp b/src/servers/sapphire_zone/Network/Handlers/PacketHandlers.cpp index 2633d0fd..a5f7a32c 100644 --- a/src/servers/sapphire_zone/Network/Handlers/PacketHandlers.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/PacketHandlers.cpp @@ -63,15 +63,14 @@ void Core::Network::GameConnection::fcInfoReqHandler( const Core::Network::Packe void Core::Network::GameConnection::setSearchInfoHandler( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) { - Packets::FFXIVARR_PACKET_RAW copy = inPacket; + const auto packet = ZoneChannelPacket< Client::FFXIVIpcSetSearchInfo >( inPacket, true ); - auto inval = *reinterpret_cast< uint32_t* >( ©.data[0x10] ); - auto inval1 = *reinterpret_cast< uint32_t* >( ©.data[0x14] ); - auto status = *reinterpret_cast< uint64_t* >( ©.data[0x10] ); + const auto& inval = packet.data().status1; + const auto& inval1 = packet.data().status2; + const auto& status = packet.data().status; + const auto& selectRegion = packet.data().language; - auto selectRegion = copy.data[0x21]; - - player.setSearchInfo( selectRegion, 0, reinterpret_cast< char* >( ©.data[0x22] ) ); + player.setSearchInfo( selectRegion, 0, packet.data().searchComment ); player.setOnlineStatusMask( status ); From 2e0fec5a10f0bcb5d3a38f47f4b6e79f1fcf6374 Mon Sep 17 00:00:00 2001 From: NotAdam Date: Sat, 7 Jul 2018 17:14:30 +1000 Subject: [PATCH 12/16] cleanup --- src/servers/sapphire_zone/Network/Handlers/EventHandlers.cpp | 2 -- src/servers/sapphire_zone/Network/Handlers/PacketHandlers.cpp | 3 --- 2 files changed, 5 deletions(-) diff --git a/src/servers/sapphire_zone/Network/Handlers/EventHandlers.cpp b/src/servers/sapphire_zone/Network/Handlers/EventHandlers.cpp index 8bb33b7c..da8f553b 100644 --- a/src/servers/sapphire_zone/Network/Handlers/EventHandlers.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/EventHandlers.cpp @@ -145,10 +145,8 @@ void Core::Network::GameConnection::eventHandlerOutsideRange( const Packets::FFX Entity::Player& player ) { auto pScriptMgr = g_fw.get< Scripting::ScriptMgr >(); - Packets::FFXIVARR_PACKET_RAW copy = inPacket; const auto packet = ZoneChannelPacket< Client::FFXIVIpcEventHandlerOutsideRange >( inPacket ); - const auto& eventId = packet.data().eventId; const auto& param1 = packet.data().param1; const auto& pos = packet.data().position; diff --git a/src/servers/sapphire_zone/Network/Handlers/PacketHandlers.cpp b/src/servers/sapphire_zone/Network/Handlers/PacketHandlers.cpp index a5f7a32c..6d67e08b 100644 --- a/src/servers/sapphire_zone/Network/Handlers/PacketHandlers.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/PacketHandlers.cpp @@ -302,9 +302,6 @@ void Core::Network::GameConnection::zoneLineHandler( const Core::Network::Packet void Core::Network::GameConnection::discoveryHandler( const Core::Network::Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) { - - Packets::FFXIVARR_PACKET_RAW copy = inPacket; - const auto packet = ZoneChannelPacket< Client::FFXIVIpcDiscoveryHandler >( inPacket ); const auto& positionRef = packet.data().positionRef; From 69624b5053a32098b91dfda8549ab3fdb677845a Mon Sep 17 00:00:00 2001 From: NotAdam Date: Sat, 7 Jul 2018 22:27:35 +1000 Subject: [PATCH 13/16] add tell and chat ipc structures --- .../Network/PacketDef/Zone/ClientZoneDef.h | 31 ++++++++++--------- .../Network/Handlers/ClientTriggerHandler.cpp | 2 +- .../Network/Handlers/PacketHandlers.cpp | 27 ++++++---------- 3 files changed, 28 insertions(+), 32 deletions(-) diff --git a/src/common/Network/PacketDef/Zone/ClientZoneDef.h b/src/common/Network/PacketDef/Zone/ClientZoneDef.h index 4445adc7..088a539f 100644 --- a/src/common/Network/PacketDef/Zone/ClientZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ClientZoneDef.h @@ -9,8 +9,6 @@ namespace Network { namespace Packets { namespace Client { -#pragma pack(push, 1) - struct FFXIVIpcGmCommand1 : FFXIVIpcBasePacket< GMCommand1 > { /* 0000 */ uint32_t commandId; @@ -31,17 +29,8 @@ struct FFXIVIpcClientTrigger : FFXIVIpcBasePacket< ClientTrigger > { /* 0000 */ uint16_t commandId; /* 0002 */ uint8_t unk_2[2]; - - union - { - /* 0004 */ uint64_t param1; - struct - { - /* 0004 */ uint32_t param11; - /* 0008 */ uint32_t param12; - }; - }; - + /* 0004 */ uint32_t param11; + /* 0008 */ uint32_t param12; /* 000C */ uint32_t param2; /* 0010 */ char unk_10[8]; /* 0018 */ uint64_t param3; @@ -134,7 +123,21 @@ struct FFXIVIpcSetSearchInfo : FFXIVIpcBasePacket< SetSearchInfoHandler > /* 0012 */ char searchComment[193]; }; -#pragma pack(pop) +struct FFXIVIpcTellHandler : FFXIVIpcBasePacket< TellReq > +{ + /* 0000 */ char pad_0000[4]; + /* 0004 */ char targetPCName[32]; + /* 0024 */ char message[1012]; +}; + +struct FFXIVIpcChatHandler : FFXIVIpcBasePacket< ChatHandler > +{ + /* 0000 */ char pad_0000[4]; + /* 0004 */ uint32_t sourceId; + /* 0008 */ char pad_0008[16]; + /* 0018 */ Common::ChatType chatType; + /* 001A */ char message[1012]; +}; } } diff --git a/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp b/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp index 8335f1e1..d902cc6f 100644 --- a/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/ClientTriggerHandler.cpp @@ -48,7 +48,7 @@ void Core::Network::GameConnection::clientTriggerHandler( const Packets::FFXIVAR const auto packet = ZoneChannelPacket< Client::FFXIVIpcClientTrigger >( inPacket ); const auto& commandId = packet.data().commandId; - const auto& param1 = packet.data().param1; + const auto& param1 = *reinterpret_cast< const uint64_t* >( &packet.data().param11 ); const auto& param11 = packet.data().param11; const auto& param12 = packet.data().param12; const auto& param2 = packet.data().param2; diff --git a/src/servers/sapphire_zone/Network/Handlers/PacketHandlers.cpp b/src/servers/sapphire_zone/Network/Handlers/PacketHandlers.cpp index 6d67e08b..40c1d76d 100644 --- a/src/servers/sapphire_zone/Network/Handlers/PacketHandlers.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/PacketHandlers.cpp @@ -63,7 +63,7 @@ void Core::Network::GameConnection::fcInfoReqHandler( const Core::Network::Packe void Core::Network::GameConnection::setSearchInfoHandler( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) { - const auto packet = ZoneChannelPacket< Client::FFXIVIpcSetSearchInfo >( inPacket, true ); + const auto packet = ZoneChannelPacket< Client::FFXIVIpcSetSearchInfo >( inPacket ); const auto& inval = packet.data().status1; const auto& inval1 = packet.data().status2; @@ -459,23 +459,19 @@ void Core::Network::GameConnection::chatHandler( const Core::Network::Packets::F { auto pDebugCom = g_fw.get< DebugCommandHandler >(); - Packets::FFXIVARR_PACKET_RAW copy = inPacket; + const auto packet = ZoneChannelPacket< Client::FFXIVIpcChatHandler >( inPacket ); - std::string chatString( reinterpret_cast< char* >( ©.data[0x2a] ) ); - - auto sourceId = *reinterpret_cast< uint32_t* >( ©.data[0x14] ); - - if( chatString.at( 0 ) == '!' ) + if( packet.data().message[0] == '!' ) { // execute game console command - pDebugCom->execCommand( const_cast< char * >( chatString.c_str() ) + 1, player ); + pDebugCom->execCommand( const_cast< char* >( packet.data().message ) + 1, player ); return; } - ChatType chatType = static_cast< ChatType >( inPacket.data[0x28] ); + auto chatType = packet.data().chatType; //ToDo, need to implement sending GM chat types. - auto chatPacket = boost::make_shared< ChatPacket >( player, chatType, chatString ); + auto chatPacket = boost::make_shared< Server::ChatPacket >( player, chatType, packet.data().message ); switch( chatType ) { @@ -531,19 +527,16 @@ void Core::Network::GameConnection::logoutHandler( const Core::Network::Packets: void Core::Network::GameConnection::tellHandler( const Core::Network::Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) { - Packets::FFXIVARR_PACKET_RAW copy = inPacket; - - std::string targetPcName( reinterpret_cast< char* >( ©.data[0x14] ) ); - std::string msg( reinterpret_cast< char* >( ©.data[0x34] ) ); + const auto packet = ZoneChannelPacket< Client::FFXIVIpcTellHandler >( inPacket ); auto pZoneServer = g_fw.get< ServerZone >(); - auto pSession = pZoneServer->getSession( targetPcName ); + auto pSession = pZoneServer->getSession( packet.data().targetPCName ); if( !pSession ) { auto tellErrPacket = makeZonePacket< FFXIVIpcTellErrNotFound >( player.getId() ); - strcpy( tellErrPacket->data().receipientName, targetPcName.c_str() ); + strcpy( tellErrPacket->data().receipientName, packet.data().targetPCName ); sendSinglePacket( tellErrPacket ); return; } @@ -572,7 +565,7 @@ void Core::Network::GameConnection::tellHandler( const Core::Network::Packets::F } auto tellPacket = makeChatPacket< FFXIVIpcTell >( player.getId() ); - strcpy( tellPacket->data().msg, msg.c_str() ); + strcpy( tellPacket->data().msg, packet.data().message ); strcpy( tellPacket->data().receipientName, player.getName().c_str() ); // TODO: do these have a meaning? //tellPacket.data().u1 = 0x92CD7337; From 27c11f392a9b24cf5b4f26cc35abbafdfd645be4 Mon Sep 17 00:00:00 2001 From: NotAdam Date: Sun, 8 Jul 2018 12:38:08 +1000 Subject: [PATCH 14/16] add linkshell event, some cleanup --- src/common/Network/GamePacketNew.h | 15 +-------------- src/common/Network/PacketDef/Zone/ClientZoneDef.h | 8 ++++++++ .../Network/Handlers/EventHandlers.cpp | 12 ++++-------- .../Network/Handlers/InventoryHandler.cpp | 6 +++--- src/servers/sapphire_zone/Script/ScriptMgr.cpp | 2 +- 5 files changed, 17 insertions(+), 26 deletions(-) diff --git a/src/common/Network/GamePacketNew.h b/src/common/Network/GamePacketNew.h index 7eefc16a..e93f29cb 100644 --- a/src/common/Network/GamePacketNew.h +++ b/src/common/Network/GamePacketNew.h @@ -14,12 +14,6 @@ #include "CommonNetwork.h" #include "PacketDef/Ipcs.h" -#include -#include -#include - -extern Core::Framework g_fw; - namespace Core { namespace Network { namespace Packets { @@ -184,7 +178,7 @@ public: initialize(); }; - FFXIVIpcPacket< T, T1 >( const FFXIVARR_PACKET_RAW& rawPacket, bool verbose = false ) + FFXIVIpcPacket< T, T1 >( const FFXIVARR_PACKET_RAW& rawPacket ) { auto ipcHdrSize = sizeof( FFXIVARR_IPC_HEADER ); auto copySize = std::min< uint32_t >( sizeof( T ), rawPacket.segHdr.size - ipcHdrSize ); @@ -192,13 +186,6 @@ public: memcpy( &m_segHdr, &rawPacket.segHdr, sizeof( FFXIVARR_PACKET_SEGMENT_HEADER ) ); memcpy( &m_data, &rawPacket.data[0] + ipcHdrSize, copySize ); - auto log = g_fw.get< Core::Logger >(); - if( log && verbose ) - { - log->debug( "rawpacket size " + std::to_string( rawPacket.segHdr.size ) + "\n" + Util::binaryToHexDump( const_cast< uint8_t* >( &rawPacket.data[0] ), rawPacket.segHdr.size ) ); - log->debug( "T size " + std::to_string( sizeof( T ) ) + "\n" + Util::binaryToHexDump( reinterpret_cast< uint8_t* >( &m_data ), sizeof( T ) ) ); - } - memset( &m_ipcHdr, 0, ipcHdrSize ); m_ipcHdr.type = static_cast< ServerZoneIpcType >( m_data._ServerIpcType ); } diff --git a/src/common/Network/PacketDef/Zone/ClientZoneDef.h b/src/common/Network/PacketDef/Zone/ClientZoneDef.h index 088a539f..cbe0a0b0 100644 --- a/src/common/Network/PacketDef/Zone/ClientZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ClientZoneDef.h @@ -139,6 +139,14 @@ struct FFXIVIpcChatHandler : FFXIVIpcBasePacket< ChatHandler > /* 001A */ char message[1012]; }; +struct FFXIVIpcLinkshellEventHandler : FFXIVIpcBasePacket< LinkshellEventHandler > +{ + /* 0000 */ uint32_t eventId; + /* 0004 */ uint16_t scene; + /* 0006 */ char pad_0006[1]; + /* 0007 */ char lsName[21]; +}; + } } } diff --git a/src/servers/sapphire_zone/Network/Handlers/EventHandlers.cpp b/src/servers/sapphire_zone/Network/Handlers/EventHandlers.cpp index da8f553b..801ab2b7 100644 --- a/src/servers/sapphire_zone/Network/Handlers/EventHandlers.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/EventHandlers.cpp @@ -243,15 +243,11 @@ void Core::Network::GameConnection::eventHandlerReturn( const Packets::FFXIVARR_ void Core::Network::GameConnection::eventHandlerLinkshell( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) { - Packets::FFXIVARR_PACKET_RAW copy = inPacket; + const auto packet = ZoneChannelPacket< Client::FFXIVIpcLinkshellEventHandler >( inPacket ); - auto eventId = *reinterpret_cast< uint32_t* >( ©.data[0x10] ); - auto scene = *reinterpret_cast< uint16_t* >( ©.data[0x14] ); - auto lsName = std::string( reinterpret_cast< char* >( ©.data[0x17] ) ); - - auto linkshellEvent = makeZonePacket< FFXIVIpcEventLinkshell >( player.getId() ); - linkshellEvent->data().eventId = eventId; - linkshellEvent->data().scene = static_cast< uint8_t >( scene ); + auto linkshellEvent = makeZonePacket< Server::FFXIVIpcEventLinkshell >( player.getId() ); + linkshellEvent->data().eventId = packet.data().eventId; + linkshellEvent->data().scene = static_cast< uint8_t >( packet.data().scene ); linkshellEvent->data().param3 = 1; linkshellEvent->data().unknown1 = 0x15a; player.queuePacket( linkshellEvent ); diff --git a/src/servers/sapphire_zone/Network/Handlers/InventoryHandler.cpp b/src/servers/sapphire_zone/Network/Handlers/InventoryHandler.cpp index 05118fa2..edd34e19 100644 --- a/src/servers/sapphire_zone/Network/Handlers/InventoryHandler.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/InventoryHandler.cpp @@ -42,12 +42,12 @@ void Core::Network::GameConnection::inventoryModifyHandler( const Packets::FFXIV Entity::Player& player ) { Packets::FFXIVARR_PACKET_RAW copy = inPacket; - auto seq = *reinterpret_cast< uint32_t* >( ©.data[0x1] ); - auto action = *reinterpret_cast< uint8_t* >( ©.data[0x4] ); + auto seq = *reinterpret_cast< uint32_t* >( ©.data[0x1] ); // + auto action = *reinterpret_cast< uint8_t* >( ©.data[0x4] ); // auto fromSlot = *reinterpret_cast< uint8_t* >( ©.data[0x10] ); auto toSlot = *reinterpret_cast< uint8_t* >( ©.data[0x24] ); - auto fromContainer = *reinterpret_cast< uint16_t* >( ©.data[0xC] ); + auto fromContainer = *reinterpret_cast< uint16_t* >( ©.data[0xC] ); // auto toContainer = *reinterpret_cast< uint16_t* >( ©.data[0x20] ); // todo: check packet handler in game and see if this is sent as a u16 or u32 diff --git a/src/servers/sapphire_zone/Script/ScriptMgr.cpp b/src/servers/sapphire_zone/Script/ScriptMgr.cpp index 8e2efdbe..78424df8 100644 --- a/src/servers/sapphire_zone/Script/ScriptMgr.cpp +++ b/src/servers/sapphire_zone/Script/ScriptMgr.cpp @@ -76,7 +76,7 @@ bool Core::Scripting::ScriptMgr::init() scriptsLoaded++; } - pLog->info( "ScriptMgr: Loaded " + std::to_string( scriptsLoaded ) + "/" + std::to_string( scriptsFound ) + " scripts successfully" ); + pLog->info( "ScriptMgr: Loaded " + std::to_string( scriptsLoaded ) + "/" + std::to_string( scriptsFound ) + " modules" ); watchDirectories(); From 519b352281d872ae8f32dc1116f894188c614b0a Mon Sep 17 00:00:00 2001 From: NotAdam Date: Sun, 8 Jul 2018 19:45:46 +1000 Subject: [PATCH 15/16] opcode updates --- src/common/Network/PacketDef/Ipcs.h | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/common/Network/PacketDef/Ipcs.h b/src/common/Network/PacketDef/Ipcs.h index 05475bf5..deaea6a2 100644 --- a/src/common/Network/PacketDef/Ipcs.h +++ b/src/common/Network/PacketDef/Ipcs.h @@ -91,8 +91,9 @@ namespace Packets { LogMessage = 0x00D0, LinkshellList = 0x011C, // updated 4.3 - SetCharaFCTag = 0x013B, // updated 4.3 - SetFreeCompanyInfo = 0x013D, // updated 4.3 + CharaFreeCompanyTag = 0x013B, // updated 4.3 + FreeCompanyBoardMsg = 0x013C, // updated 4.3 + FreeCompanyInfo = 0x013D, // updated 4.3 StatusEffectList = 0x014E, // updated 4.3 Effect = 0x0151, // updated 4.3 From 4bce3e8d4b82aca6ee14a87a5012ad33b97441b7 Mon Sep 17 00:00:00 2001 From: NotAdam Date: Sun, 8 Jul 2018 21:11:22 +1000 Subject: [PATCH 16/16] inventorymodifyhandler packet structure --- src/common/Common.h | 9 ++++++ .../Network/PacketDef/Zone/ClientZoneDef.h | 16 ++++++++++ .../Network/Handlers/InventoryHandler.cpp | 32 ++++++------------- 3 files changed, 35 insertions(+), 22 deletions(-) diff --git a/src/common/Common.h b/src/common/Common.h index 92e68294..6f8acead 100644 --- a/src/common/Common.h +++ b/src/common/Common.h @@ -27,6 +27,15 @@ namespace Common { float z; }; + enum InventoryOperation : uint8_t + { + Discard = 0x07, + Move = 0x08, + Swap = 0x09, + Merge = 0x0C, + Split = 0x0A + }; + enum ClientLanguage : uint8_t { Japanese = 1, diff --git a/src/common/Network/PacketDef/Zone/ClientZoneDef.h b/src/common/Network/PacketDef/Zone/ClientZoneDef.h index cbe0a0b0..6963493b 100644 --- a/src/common/Network/PacketDef/Zone/ClientZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ClientZoneDef.h @@ -147,6 +147,22 @@ struct FFXIVIpcLinkshellEventHandler : FFXIVIpcBasePacket< LinkshellEventHandler /* 0007 */ char lsName[21]; }; +struct FFXIVIpcInventoryModifyHandler : FFXIVIpcBasePacket< InventoryModifyHandler > +{ + /* 0000 */ uint32_t seq; + /* 0004 */ Common::InventoryOperation action; + /* 0005 */ char pad_0005[3]; + /* 0008 */ uint16_t splitCount; // todo: check packet handler in game and see if this is sent as a u16 or u32 + /* 000A */ char pad_000A[2]; + /* 000C */ uint16_t fromContainer; + /* 000E */ char pad_000E[2]; + /* 0010 */ uint8_t fromSlot; + /* 0011 */ char pad_0011[15]; + /* 0020 */ uint16_t toContainer; + /* 0022 */ char pad_0022[2]; + /* 0024 */ uint8_t toSlot; +}; + } } } diff --git a/src/servers/sapphire_zone/Network/Handlers/InventoryHandler.cpp b/src/servers/sapphire_zone/Network/Handlers/InventoryHandler.cpp index edd34e19..71ae48cc 100644 --- a/src/servers/sapphire_zone/Network/Handlers/InventoryHandler.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/InventoryHandler.cpp @@ -5,6 +5,7 @@ #include #include #include +#include #include "Network/GameConnection.h" #include "Network/PacketWrappers/ServerNoticePacket.h" @@ -29,39 +30,26 @@ using namespace Core::Common; using namespace Core::Network::Packets; using namespace Core::Network::Packets::Server; -enum InventoryOperation -{ - Discard = 0x07, - Move = 0x08, - Swap = 0x09, - Merge = 0x0C, - Split = 0x0A -}; - void Core::Network::GameConnection::inventoryModifyHandler( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) { - Packets::FFXIVARR_PACKET_RAW copy = inPacket; - auto seq = *reinterpret_cast< uint32_t* >( ©.data[0x1] ); // - auto action = *reinterpret_cast< uint8_t* >( ©.data[0x4] ); // - auto fromSlot = *reinterpret_cast< uint8_t* >( ©.data[0x10] ); - auto toSlot = *reinterpret_cast< uint8_t* >( ©.data[0x24] ); + const auto packet = ZoneChannelPacket< Client::FFXIVIpcInventoryModifyHandler >( inPacket ); - auto fromContainer = *reinterpret_cast< uint16_t* >( ©.data[0xC] ); // - auto toContainer = *reinterpret_cast< uint16_t* >( ©.data[0x20] ); + const auto& action = packet.data().action; + const auto& splitCount = packet.data().splitCount; - // todo: check packet handler in game and see if this is sent as a u16 or u32 - auto splitCount = *reinterpret_cast< uint16_t* >( ©.data[0x28] ); + const auto& fromSlot = packet.data().fromSlot; + const auto& fromContainer = packet.data().fromContainer; + const auto& toSlot = packet.data().toSlot; + const auto& toContainer = packet.data().toContainer; - auto ackPacket = makeZonePacket< FFXIVIpcInventoryActionAck >( player.getId() ); - ackPacket->data().sequence = seq; + auto ackPacket = makeZonePacket< Server::FFXIVIpcInventoryActionAck >( player.getId() ); + ackPacket->data().sequence = packet.data().seq; ackPacket->data().type = 7; player.queuePacket( ackPacket ); auto pLog = g_fw.get< Logger >(); - - //pLog->debug( inPacket.toString() ); pLog->debug( "InventoryAction: " + std::to_string( action ) ); // TODO: other inventory operations need to be implemented