From 78f8cdbaf561d0ceaa3d6d673b63b7833dca60d6 Mon Sep 17 00:00:00 2001 From: Mordred Date: Thu, 7 Jun 2018 20:32:02 +0200 Subject: [PATCH 1/3] Fixed initui packet -> equipping gear fixed --- .../Network/PacketDef/Zone/ServerZoneDef.h | 284 +++++++++--------- 1 file changed, 145 insertions(+), 139 deletions(-) diff --git a/src/common/Network/PacketDef/Zone/ServerZoneDef.h b/src/common/Network/PacketDef/Zone/ServerZoneDef.h index 3baa1305..d8a628a8 100644 --- a/src/common/Network/PacketDef/Zone/ServerZoneDef.h +++ b/src/common/Network/PacketDef/Zone/ServerZoneDef.h @@ -612,146 +612,152 @@ struct FFXIVIpcInitUI : FFXIVIpcBasePacket // plain C types for a bit until the packet is actually fixed. // makes conversion between different editors easier. uint64_t contentId; - uint32_t unknown8; - uint32_t unknownC; - uint32_t charId; - uint32_t restedExp; - uint32_t companionCurrentExp; - uint32_t unknown3C; - uint32_t fishCaught; - uint32_t useBaitCatalogId; - uint32_t pvpWolfFoldMatches; - uint16_t pvpWolfFoldWeeklyMatches; - uint16_t pvpWolfFoldWeeklyVictories; - uint16_t pvpStats[6]; - uint16_t playerCommendations; - uint16_t pvpStats1; - uint16_t frontlineCampaigns[4]; - uint16_t frontlineCampaignsWeekly; - uint16_t currentRelic; - uint16_t currentBook; - uint16_t masterCrafterMask; - uint16_t unknown69; - uint16_t unknown6A; - uint16_t unknown6B; - uint16_t unknown6C[4]; - uint16_t unknown50[34]; - uint16_t unknown18; - uint16_t maxLevel; - uint16_t expansion; - uint16_t unknown76; - uint16_t race; - uint16_t tribe; - uint16_t gender; - uint16_t currentJob; - uint16_t currentClass; - uint16_t deity; - uint16_t namedayMonth; - uint16_t namedayDay; - uint16_t cityState; - uint16_t homepoint; - uint16_t unknown26; - uint16_t petHotBar; - uint16_t companionRank; - uint16_t companionStars; - uint16_t companionSp; - uint16_t companionUnk2B; - uint16_t companionColor; - uint16_t companionFavoFeed; - uint16_t companionUnk89; - uint16_t companionUnk90[5]; - uint16_t unknown90[7]; - uint16_t unknown9E; - uint16_t unknownA0; - uint32_t exp[25]; - uint16_t unknown564[16]; - uint32_t pvpFrontlineOverall1st; - uint32_t pvpFrontlineOverall2nd; - uint32_t pvpFrontlineOverall3rd; - uint16_t relicBookCompletion1[4]; - uint16_t levels[25]; - uint16_t levelsPadding; - uint16_t unknown15C[8]; - uint16_t fishingRecordsFish[26]; - uint16_t fishingRecordsFishWeight[26]; - uint16_t unknownMask554[44]; - uint16_t companion_name[21]; - uint16_t companionDefRank; - uint16_t companionAttRank; - uint16_t companionHealRank; - uint16_t mountGuideMask[16]; + unsigned int unknown8; + unsigned int unknownC; + unsigned int charId; + unsigned int restedExp; + unsigned int companionCurrentExp; + unsigned int unknown3C; + unsigned int fishCaught; + unsigned int useBaitCatalogId; + unsigned int pvpWolfFoldMatches; + unsigned short pvpWolfFoldWeeklyMatches; + unsigned short pvpWolfFoldWeeklyVictories; + unsigned short pvpStats[6]; + unsigned short playerCommendations; + unsigned short pvpStats1; + unsigned char frontlineCampaigns[4]; + unsigned short frontlineCampaignsWeekly; + unsigned char currentRelic; + unsigned char currentBook; + unsigned char masterCrafterMask; + unsigned char unknown69; + unsigned char unknown6A; + unsigned char unknown6B; + unsigned char unknown6C[4]; + unsigned char unknown70[34]; + unsigned short unknown18; + unsigned char maxLevel; + unsigned char expansion; + unsigned char unknown; + unsigned char race; + unsigned char tribe; + unsigned char gender; + unsigned char currentJob; + unsigned char currentClass; + unsigned char deity; + unsigned char namedayMonth; + unsigned char namedayDay; + unsigned char cityState; + unsigned char homepoint; + unsigned char unknown26; + unsigned char petHotBar; + unsigned char companionRank; + unsigned char companionStars; + unsigned char companionSp; + unsigned char companionUnk2B; + unsigned char companionColor; + unsigned char companionFavoFeed; + unsigned char companionUnk2E; + unsigned char companionTimePassed[4]; + unsigned short unknown38[11]; + + unsigned int exp[25]; + unsigned char unknown564[16]; + unsigned int pvpFrontlineOverall1st; + unsigned int pvpFrontlineOverall2nd; + unsigned int pvpFrontlineOverall3rd; + unsigned char relicBookCompletion1[4]; + unsigned short levels[25]; + unsigned short levelsPadding; + unsigned char unknown__[16]; + unsigned short fishingRecordsFish[26]; + unsigned short fishingRecordsFishWeight[26]; + unsigned char unknownMask554[44]; + + unsigned char companion_name[21]; + unsigned char companionDefRank; + unsigned char companionAttRank; + unsigned char companionHealRank; + unsigned char mountGuideMask[16]; char name[32]; - uint16_t unknownOword[16]; - uint16_t unknown258; - uint16_t unlockBitmask[64]; - uint16_t aetheryte[17]; - uint16_t discovery[421]; - uint16_t howto[33]; - uint16_t minions[38]; - uint16_t chocoboTaxiMask[8]; - uint16_t contentClearMask[111]; - uint16_t contentClearPadding; - uint16_t unknown428[8]; - uint16_t companionBardingMask[8]; - uint16_t companionEquippedHead; - uint16_t companionEquippedBody; - uint16_t companionEquippedFeet; - uint16_t companionUnk4[4]; - uint16_t companion_fields[11]; - uint16_t fishingGuideMask[89]; - uint16_t fishingSpotVisited[25]; - uint16_t unknownMask4Padding; - uint16_t rankAmalJaa; - uint16_t rankSylph; - uint16_t rankKobold; - uint16_t rankSahagin; - uint16_t rankIxal; - uint16_t rankVanu; - uint16_t rankVath; - uint16_t rankMoogle; - uint16_t rankKojin; - uint16_t rankAnata; - uint16_t expAmalJaa; - uint16_t expSylph; - uint16_t expKobold; - uint16_t expSahagin; - uint16_t expIxal; - uint16_t expVanu; - uint16_t expVath; - uint16_t expMoogle; - uint16_t expKojin; - uint16_t expAnata; - uint16_t unknown596[10]; - uint16_t unknown5A0[5]; - uint16_t unknownMask59E[5]; - uint16_t unknown5A3[18]; - uint16_t unknownMask5C1[28]; - uint16_t unknown_03411; - uint32_t unknownDword5E0; - uint16_t pvpFrontlineWeekly1st; - uint16_t pvpFrontlineWeekly2nd; - uint16_t pvpFrontlineWeekly3rd; - uint16_t relicBookCompletion2[8]; - uint16_t sightseeingMask[26]; - uint16_t unknown_XXX; - uint16_t unknown61E[20]; - uint16_t unknown656[29]; - uint16_t unknown63F[22]; - uint16_t tripleTriadCards[28]; - uint16_t unknown671[11]; - uint16_t unknownMask67C[22]; - uint16_t unknown692[3]; - uint16_t orchestrionMask[40]; - uint16_t hallOfNoviceCompleteMask[3]; - uint16_t unknownMask6C0[11]; - uint16_t unknownMask6CB[16]; - uint16_t unknown6DB[14]; - uint16_t unlockedRaids[28]; - uint16_t unlockedDungeons[18]; - uint16_t unlockedGuildhests[10]; - uint16_t unlockedTrials[7]; - uint16_t unlockedPvp[5]; - uint16_t unknownMask72D[28]; + unsigned char unknownOword[16]; + unsigned char unlockBitmask[64]; + unsigned char aetheryte[17]; + unsigned char discovery[421]; + unsigned char howto[33]; + unsigned char minions[38]; + unsigned char chocoboTaxiMask[8]; + unsigned char contentClearMask[111]; + unsigned char contentClearPadding; + unsigned short unknown428[8]; + unsigned char companionBardingMask[8]; + unsigned char companionEquippedHead; + unsigned char companionEquippedBody; + unsigned char companionEquippedFeet; + unsigned char companionUnk4[4]; + unsigned char companion_fields[11]; + + unsigned char fishingGuideMask[89]; + unsigned char fishingSpotVisited[25]; + + + unsigned char unknownMask4Padding; + + unsigned char rankAmalJaa; + unsigned char rankSylph; + unsigned char rankKobold; + unsigned char rankSahagin; + unsigned char rankIxal; + unsigned char rankVanu; + unsigned char rankVath; + unsigned char rankMoogle; + unsigned char rankKojin; + unsigned char rankAnata; + unsigned short expAmalJaa; + unsigned short expSylph; + unsigned short expKobold; + unsigned short expSahagin; + unsigned short expIxal; + unsigned short expVanu; + unsigned short expVath; + unsigned short expMoogle; + unsigned short expKojin; + unsigned short expAnata; + unsigned char unknown596[10]; + unsigned short unknown5A0[5]; + unsigned char unknownMask59E[5]; + unsigned char unknown5A3[18]; + unsigned char unknownMask5C1[28]; + unsigned char unknown_03411; + unsigned int unknownDword5E0; + unsigned short pvpFrontlineWeekly1st; + unsigned short pvpFrontlineWeekly2nd; + unsigned short pvpFrontlineWeekly3rd; + unsigned char relicBookCompletion2[8]; + unsigned char sightseeingMask[26]; + unsigned short unknown_XXX; + + unsigned char unknown61E; + unsigned char unknown61F[32]; + unsigned char unknown63F[22]; + unsigned char tripleTriadCards[28]; + unsigned char unknown671[11]; + unsigned char unknownMask67C[22]; + unsigned char unknown692[3]; + unsigned char orchestrionMask[40]; + unsigned char hallOfNoviceCompleteMask[3]; + unsigned char unknownMask6C0[11]; + unsigned char unknownMask6CB[16]; + unsigned char unknown6DB[14]; + unsigned char unlockedRaids[28]; + unsigned char unlockedDungeons[18]; + unsigned char unlockedGuildhests[10]; + unsigned char unlockedTrials[7]; + unsigned char unlockedPvp[5]; + unsigned char unknownMask72D[28]; + // unsigned char unknownMask749[18]; + //unsigned char unknown749[13]; }; From 2d5d0debca1cbb51e619a4a5c6591f97526ac69d Mon Sep 17 00:00:00 2001 From: Mordred Date: Thu, 7 Jun 2018 20:33:06 +0200 Subject: [PATCH 2/3] Cleanup --- src/common/Network/GamePacket.cpp | 20 +- src/common/Network/GamePacketNew.h | 12 +- src/common/Network/GamePacketParser.cpp | 235 ++++++++++++------------ src/common/Network/GamePacketParser.h | 85 ++++----- 4 files changed, 167 insertions(+), 185 deletions(-) diff --git a/src/common/Network/GamePacket.cpp b/src/common/Network/GamePacket.cpp index c4d61f81..bc142ab5 100644 --- a/src/common/Network/GamePacket.cpp +++ b/src/common/Network/GamePacket.cpp @@ -7,16 +7,17 @@ #include #include "Util/Util.h" -Core::Network::Packets::GamePacket::GamePacket( uint16_t subType, uint16_t size, uint32_t id1, uint32_t id2, uint16_t type ) +Core::Network::Packets::GamePacket::GamePacket( uint16_t subType, uint16_t size, + uint32_t id1, uint32_t id2, uint16_t type ) { - m_dataBuf = std::vector( size ); + m_dataBuf = std::vector< uint8_t >( size ); memset( &m_segHdr, 0, sizeof( m_segHdr ) ); setHeader( size, type, id1, id2, subType, 0x00 ); - } -void Core::Network::Packets::GamePacket::setHeader( uint16_t size, uint16_t type, uint32_t id1, uint32_t id2, uint16_t subType, uint32_t unknown ) +void Core::Network::Packets::GamePacket::setHeader( uint16_t size, uint16_t type, uint32_t id1, + uint32_t id2, uint16_t subType, uint32_t unknown ) { m_segHdr.size = size; @@ -40,7 +41,7 @@ void Core::Network::Packets::GamePacket::setHeader( uint16_t size, uint16_t type Core::Network::Packets::GamePacket::GamePacket( char * pData, uint16_t size, bool bWriteStamp ) { - m_dataBuf = std::vector( size ); + m_dataBuf = std::vector< uint8_t >( size ); memcpy( &m_dataBuf[0], pData, size ); m_unknown2 = 0; @@ -65,9 +66,12 @@ Core::Network::Packets::GamePacket::GamePacket( const Packets::FFXIVARR_PACKET_R { m_segHdr = packetData.segHdr; - m_dataBuf = std::vector( m_segHdr.size ); + m_dataBuf = std::vector< uint8_t >( m_segHdr.size ); + + memcpy( &m_dataBuf[0] + sizeof( Packets::FFXIVARR_PACKET_SEGMENT_HEADER ), + &packetData.data[0], + m_segHdr.size - sizeof( Packets::FFXIVARR_PACKET_SEGMENT_HEADER ) ); - memcpy( &m_dataBuf[0] + sizeof( Packets::FFXIVARR_PACKET_SEGMENT_HEADER ), &packetData.data[0], m_segHdr.size - sizeof( Packets::FFXIVARR_PACKET_SEGMENT_HEADER ) ); memcpy( &m_dataBuf[0], &m_segHdr, sizeof( Packets::FFXIVARR_PACKET_SEGMENT_HEADER ) ); m_subType = *reinterpret_cast< uint16_t* >( &m_dataBuf[0] + 0x12 ); @@ -98,5 +102,5 @@ void Core::Network::Packets::GamePacket::savePacket() std::string Core::Network::Packets::GamePacket::toString() const { - return Core::Util::binaryToHexDump( const_cast( &m_dataBuf[0] ), getSize() ); + return Core::Util::binaryToHexDump( const_cast< uint8_t* >( &m_dataBuf[0] ), getSize() ); } diff --git a/src/common/Network/GamePacketNew.h b/src/common/Network/GamePacketNew.h index 451c4eee..595b8222 100644 --- a/src/common/Network/GamePacketNew.h +++ b/src/common/Network/GamePacketNew.h @@ -20,7 +20,7 @@ template < typename T, typename T1 > class GamePacketNew; template < typename T, typename T1 > -std::ostream& operator<< ( std::ostream& os, const GamePacketNew< T, T1 >& packet ); +std::ostream& operator << ( std::ostream& os, const GamePacketNew< T, T1 >& packet ); template< class T > using ZoneChannelPacket = GamePacketNew< T, ServerZoneIpcType >; @@ -32,15 +32,15 @@ using ChatChannelPacket = GamePacketNew< T, ServerChatIpcType >; * The base implementation of a game packet. Needed for parsing packets. */ template < typename T1 > -class FFXIVPacketBase +class FFXIVIpcPacketBase { public: - virtual ~FFXIVPacketBase() = default; + virtual ~FFXIVIpcPacketBase() = default; /** * @brief Gets the IPC type of this packet. (Useful for determining the * type of a parsed packet.) */ - virtual T1 ipcType( void ) = 0; + virtual T1 ipcType() = 0; }; /** @@ -50,7 +50,7 @@ public: * 32 byte header information.) */ template < typename T, typename T1 > -class GamePacketNew : public FFXIVPacketBase< T1 > +class GamePacketNew : public FFXIVIpcPacketBase< T1 > { public: /** @@ -96,7 +96,7 @@ protected: }; public: - virtual T1 ipcType( void ) + virtual T1 ipcType() { return static_cast< T1 >( m_data._ServerIpcType ); }; diff --git a/src/common/Network/GamePacketParser.cpp b/src/common/Network/GamePacketParser.cpp index 4a9fd067..52cfe1a3 100644 --- a/src/common/Network/GamePacketParser.cpp +++ b/src/common/Network/GamePacketParser.cpp @@ -5,131 +5,122 @@ using namespace Core::Network::Packets; -namespace Core +PacketParseResult Core::Network::Packets::getHeader( const std::vector< uint8_t > &buffer, + const uint32_t offset, + FFXIVARR_PACKET_HEADER &header ) { - namespace Network - { - namespace Packets - { - PacketParseResult getHeader( const std::vector< uint8_t > &buffer, - const uint32_t offset, - FFXIVARR_PACKET_HEADER &header ) - { - const auto headerSize = sizeof( FFXIVARR_PACKET_HEADER ); + const auto headerSize = sizeof( FFXIVARR_PACKET_HEADER ); - // Check if we have enough bytes in the buffer. - auto remainingBytes = buffer.size() - offset; - if( remainingBytes < headerSize ) - return Incomplete; + // Check if we have enough bytes in the buffer. + auto remainingBytes = buffer.size() - offset; + if( remainingBytes < headerSize ) + return Incomplete; - // Copy packet header. - memcpy( &header, buffer.data() + offset, headerSize ); + // Copy packet header. + memcpy( &header, buffer.data() + offset, headerSize ); - if( !checkHeader(header) ) - return Malformed; + if( !checkHeader(header) ) + return Malformed; - return Success; - } - - PacketParseResult getSegmentHeader( const std::vector< uint8_t > &buffer, - const uint32_t offset, - FFXIVARR_PACKET_SEGMENT_HEADER &header ) - { - const auto headerSize = sizeof( FFXIVARR_PACKET_SEGMENT_HEADER ); - - // Check if we have enough bytes in the buffer. - auto remainingBytes = buffer.size() - offset; - if( remainingBytes < headerSize ) - return Incomplete; - - // Copy segment header - memcpy( &header, buffer.data() + offset, headerSize ); - - return Success; - } - - PacketParseResult getPackets( const std::vector< uint8_t > &buffer, - const uint32_t offset, - const FFXIVARR_PACKET_HEADER &packetHeader, - std::vector< FFXIVARR_PACKET_RAW > &packets ) - { - // sanity check: check there's enough bytes in the buffer - const auto bytesExpected = packetHeader.size - sizeof( struct FFXIVARR_PACKET_HEADER ); - if( buffer.size() - offset < bytesExpected ) - return Incomplete; - - // Loop each message - uint32_t count = 0; - uint32_t bytesProcessed = 0; - while( count < packetHeader.count ) - { - FFXIVARR_PACKET_RAW rawPacket; - - // Copy ipc packet message - const auto packetResult = getPacket( buffer, offset + bytesProcessed, rawPacket ); - if( packetResult != Success ) - return packetResult; - - // NOTE: isn't rawPacket is allocated on stack? - // why is okay to do this? - packets.push_back( rawPacket ); - - // Add message size and count - bytesProcessed += rawPacket.segHdr.size; - count += 1; - } - - // sanity check: check if we processed all bytes. - // this check can fail if size of messages don't add up to size reported from packet header. - if( bytesExpected != bytesProcessed ) - return Malformed; - - return Success; - } - - PacketParseResult getPacket( const std::vector< uint8_t > &buffer, const uint32_t offset, - FFXIVARR_PACKET_RAW &packet ) - { - // Copy segment header - const auto headerResult = getSegmentHeader( buffer, offset, packet.segHdr ); - if( headerResult != Success ) - return headerResult; - - // Check header sanity and it's size - if( !checkSegmentHeader( packet.segHdr ) ) - return Malformed; - - const auto dataOffset = offset + sizeof( struct FFXIVARR_PACKET_SEGMENT_HEADER ); - const auto dataSize = packet.segHdr.size; - - // Allocate data buffer and copy - packet.data.resize( dataSize ); - memcpy( packet.data.data(), buffer.data() + dataOffset, dataSize ); - - return Success; - } - - bool checkHeader( const FFXIVARR_PACKET_HEADER &header ) - { - // Max size of the packet is capped at 1MB for now. - if( header.size > 1 * 1024 * 1024 ) - return false; - - // Max number of message is capped at 255 for now. - if( header.count > 255 ) - return false; - - return true; - } - - bool checkSegmentHeader( const FFXIVARR_PACKET_SEGMENT_HEADER &header ) - { - // Max size of individual message is capped at 256KB for now. - if( header.size > 256 * 1024 ) - return false; - - return true; - } - } - } + return Success; +} + +PacketParseResult Core::Network::Packets::getSegmentHeader( const std::vector< uint8_t > &buffer, + const uint32_t offset, + FFXIVARR_PACKET_SEGMENT_HEADER &header ) +{ + const auto headerSize = sizeof( FFXIVARR_PACKET_SEGMENT_HEADER ); + + // Check if we have enough bytes in the buffer. + auto remainingBytes = buffer.size() - offset; + if( remainingBytes < headerSize ) + return Incomplete; + + // Copy segment header + memcpy( &header, buffer.data() + offset, headerSize ); + + return Success; +} + +PacketParseResult Core::Network::Packets::getPackets( const std::vector< uint8_t > &buffer, + const uint32_t offset, + const FFXIVARR_PACKET_HEADER &packetHeader, + std::vector< FFXIVARR_PACKET_RAW > &packets ) +{ + // sanity check: check there's enough bytes in the buffer + const auto bytesExpected = packetHeader.size - sizeof( struct FFXIVARR_PACKET_HEADER ); + if( buffer.size() - offset < bytesExpected ) + return Incomplete; + + // Loop each message + uint32_t count = 0; + uint32_t bytesProcessed = 0; + while( count < packetHeader.count ) + { + FFXIVARR_PACKET_RAW rawPacket; + + // Copy ipc packet message + const auto packetResult = getPacket( buffer, offset + bytesProcessed, rawPacket ); + if( packetResult != Success ) + return packetResult; + + // NOTE: isn't rawPacket is allocated on stack? + // why is okay to do this? + packets.push_back( rawPacket ); + + // Add message size and count + bytesProcessed += rawPacket.segHdr.size; + count += 1; + } + + // sanity check: check if we processed all bytes. + // this check can fail if size of messages don't add up to size reported from packet header. + if( bytesExpected != bytesProcessed ) + return Malformed; + + return Success; +} + +PacketParseResult Core::Network::Packets::getPacket( const std::vector< uint8_t > &buffer, const uint32_t offset, + FFXIVARR_PACKET_RAW &packet ) +{ + // Copy segment header + const auto headerResult = getSegmentHeader( buffer, offset, packet.segHdr ); + if( headerResult != Success ) + return headerResult; + + // Check header sanity and it's size + if( !checkSegmentHeader( packet.segHdr ) ) + return Malformed; + + const auto dataOffset = offset + sizeof( struct FFXIVARR_PACKET_SEGMENT_HEADER ); + const auto dataSize = packet.segHdr.size; + + // Allocate data buffer and copy + packet.data.resize( dataSize ); + memcpy( packet.data.data(), buffer.data() + dataOffset, dataSize ); + + return Success; +} + +bool Core::Network::Packets::checkHeader( const FFXIVARR_PACKET_HEADER &header ) +{ + // Max size of the packet is capped at 1MB for now. + if( header.size > 1 * 1024 * 1024 ) + return false; + + // Max number of message is capped at 255 for now. + if( header.count > 255 ) + return false; + + return true; +} + +bool Core::Network::Packets::checkSegmentHeader( const FFXIVARR_PACKET_SEGMENT_HEADER &header ) +{ + // Max size of individual message is capped at 256KB for now. + if( header.size > 256 * 1024 ) + return false; + + return true; } diff --git a/src/common/Network/GamePacketParser.h b/src/common/Network/GamePacketParser.h index 1ffda893..6f870bd2 100644 --- a/src/common/Network/GamePacketParser.h +++ b/src/common/Network/GamePacketParser.h @@ -2,62 +2,49 @@ #define _GAMEPACKETPARSER_H #include "CommonNetwork.h" -namespace Core -{ - namespace Network +namespace Core { +namespace Network { +namespace Packets { + + enum PacketParseResult { - namespace Packets - { - enum PacketParseResult - { - /// Dissected game packet successfully - Success, + /// Dissected game packet successfully + Success, - /// Buffer is too short to dissect a message. - Incomplete, - - /// Invalid data detected. - Malformed - }; + /// Buffer is too short to dissect a message. + Incomplete, - /// Read packet header from buffer with given offset. - /// Buffer with given offset must be pointing to start of the new FFXIV packet. - PacketParseResult getHeader( - const std::vector< uint8_t > &buffer, - const uint32_t offset, - FFXIVARR_PACKET_HEADER &header - ); + /// Invalid data detected. + Malformed + }; - /// Read packet header from buffer with given offset. - /// Buffer with given offset must be pointing to start of FFXIVARR_PACKET_SEGMENT_HEADER data. - /// Keep in mind that this function does check for data validity. Call checkSegmentHeader() if that's needed. - PacketParseResult getSegmentHeader( - const std::vector< uint8_t > &buffer, - const uint32_t offset, - FFXIVARR_PACKET_SEGMENT_HEADER &header - ); + /// Read packet header from buffer with given offset. + /// Buffer with given offset must be pointing to start of the new FFXIV packet. + PacketParseResult getHeader( const std::vector< uint8_t > &buffer, const uint32_t offset, + FFXIVARR_PACKET_HEADER &header ); - /// Read packets from the buffer with given offset. - /// Buffer with given offset must be pointing to end of FFXIVARR_PACKET_HEADER data. - PacketParseResult getPackets( - const std::vector< uint8_t > &buffer, - const uint32_t offset, - const FFXIVARR_PACKET_HEADER &header, - std::vector< Packets::FFXIVARR_PACKET_RAW > &packets); - - /// Read single packet from the buffer with given offset. - /// Buffer with an offset must be pointing to start of FFXIVARR_PACKET_SEGMENT_HEADER data. - PacketParseResult getPacket( - const std::vector< uint8_t > &buffer, - const uint32_t offset, - FFXIVARR_PACKET_RAW &packet - ); + /// Read packet header from buffer with given offset. + /// Buffer with given offset must be pointing to start of FFXIVARR_PACKET_SEGMENT_HEADER data. + /// Keep in mind that this function does check for data validity. Call checkSegmentHeader() if that's needed. + PacketParseResult getSegmentHeader( const std::vector< uint8_t > &buffer, const uint32_t offset, + FFXIVARR_PACKET_SEGMENT_HEADER &header ); - bool checkHeader(const FFXIVARR_PACKET_HEADER &header); - bool checkSegmentHeader(const FFXIVARR_PACKET_SEGMENT_HEADER &header); + /// Read packets from the buffer with given offset. + /// Buffer with given offset must be pointing to end of FFXIVARR_PACKET_HEADER data. + PacketParseResult getPackets( const std::vector< uint8_t > &buffer, const uint32_t offset, + const FFXIVARR_PACKET_HEADER &header, + std::vector< Packets::FFXIVARR_PACKET_RAW > &packets ); - } - } + /// Read single packet from the buffer with given offset. + /// Buffer with an offset must be pointing to start of FFXIVARR_PACKET_SEGMENT_HEADER data. + PacketParseResult getPacket( const std::vector< uint8_t > &buffer, const uint32_t offset, + FFXIVARR_PACKET_RAW &packet ); + + bool checkHeader(const FFXIVARR_PACKET_HEADER &header); + bool checkSegmentHeader(const FFXIVARR_PACKET_SEGMENT_HEADER &header); + +} +} } From 4cd71f53fdbedc3ab389fb36fda43d7c8b91e395 Mon Sep 17 00:00:00 2001 From: Perize Date: Sun, 10 Jun 2018 13:26:43 +0900 Subject: [PATCH 3/3] opcode --- src/common/Common.h | 2 ++ src/common/Network/PacketDef/Ipcs.h | 3 +++ 2 files changed, 5 insertions(+) diff --git a/src/common/Common.h b/src/common/Common.h index a1214d01..18f2cce8 100644 --- a/src/common/Common.h +++ b/src/common/Common.h @@ -553,6 +553,7 @@ namespace Common { AetherReductionDlg = 0x17D, Unk6 = 0x19C, + EObjAnimation = 0x19D, SetTitle = 0x1F4, @@ -562,6 +563,7 @@ namespace Common { SetFavorite = 0x1FC, LearnTeleport = 0x1FD, + OpenRecommendationGuide = 0x200, ArmoryErrorMsg = 0x201, AchievementPopup = 0x203, diff --git a/src/common/Network/PacketDef/Ipcs.h b/src/common/Network/PacketDef/Ipcs.h index 0515d755..56f8e6a0 100644 --- a/src/common/Network/PacketDef/Ipcs.h +++ b/src/common/Network/PacketDef/Ipcs.h @@ -107,11 +107,14 @@ namespace Packets { ActorCast = 0x0178, // updated 4.3 + PartyList = 0x017A, // updated 4.3 HateList = 0x017B, // updated 4.3 ObjectSpawn = 0x017D, // updated 4.3 ObjectDespawn = 0x017E, // updated 4.3 + SetLevelSync = 0x017F, // updated 4.3 + InventoryActionAck = 0x0180, // updated 4.2 ? InitUI = 0x0181, // updated 4.3