From f693fa0a2f83488d4f0e013c87b15d5bf22cc990 Mon Sep 17 00:00:00 2001 From: NotAdam Date: Tue, 3 Jul 2018 20:04:12 +1000 Subject: [PATCH 1/2] segment header types, send inrange packets and override target id --- src/common/Network/CommonNetwork.h | 13 +++++++++++++ src/common/Network/PacketContainer.cpp | 16 ++++++++++++---- src/common/Network/PacketContainer.h | 5 ++++- src/servers/sapphire_zone/Actor/Actor.cpp | 8 ++++---- .../sapphire_zone/Network/GameConnection.cpp | 2 +- 5 files changed, 34 insertions(+), 10 deletions(-) diff --git a/src/common/Network/CommonNetwork.h b/src/common/Network/CommonNetwork.h index c5d4dc90..fbebcf31 100644 --- a/src/common/Network/CommonNetwork.h +++ b/src/common/Network/CommonNetwork.h @@ -130,6 +130,19 @@ struct FFXIVARR_PACKET_RAW std::vector< uint8_t > data; }; +/** + * Indicates the type of the segment + * IPC type will contain an additional header: FFXIVARR_PACKET_SEGMENT_HEADER + FFXIVARR_IPC_HEADER + data + * The remaining types don't contain an additonal header, FFXIVARR_PACKET_SEGMENT_HEADER + data + */ +enum FFXIVARR_SEGMENT_TYPE +{ + SEGMENTTYPE_IPC = 3, + SEGMENTTYPE_RESPONSE = 7, + SEGMENTTYPE_KEEPALIVE = 8, + SEGMENTTYPE_ENCRYPTIONHANDSHAKE = 9, +}; + /** * Structural representation of the common header for IPC packet segments. * NOTE: This is packet segment type 3. diff --git a/src/common/Network/PacketContainer.cpp b/src/common/Network/PacketContainer.cpp index 227dc7d7..936c03cd 100644 --- a/src/common/Network/PacketContainer.cpp +++ b/src/common/Network/PacketContainer.cpp @@ -9,7 +9,8 @@ #include #include -Core::Network::Packets::PacketContainer::PacketContainer() +Core::Network::Packets::PacketContainer::PacketContainer( uint32_t segmentTargetOverride ) : + m_segmentTargetOverride( segmentTargetOverride ) { memset( &m_ipcHdr, 0, sizeof( FFXIVARR_PACKET_HEADER ) ); m_ipcHdr.size = sizeof( FFXIVARR_PACKET_HEADER ); @@ -52,9 +53,16 @@ void Core::Network::Packets::PacketContainer::fillSendBuffer( std::vector< uint8 for( ; it != m_entryList.end(); ++it ) { - auto data = (*it)->getData(); - memcpy( &tempBuffer[0] + sizeof( FFXIVARR_PACKET_HEADER ) + offset, &data[0], (*it)->getSize() ); - offset += (*it)->getSize(); + auto pPacket = (*it); + + if( pPacket->getSegmentType() == SEGMENTTYPE_IPC ) + { + pPacket->setTargetActor( m_segmentTargetOverride ); + } + + auto data = pPacket->getData(); + memcpy( &tempBuffer[0] + sizeof( FFXIVARR_PACKET_HEADER ) + offset, &data[0], pPacket->getSize() ); + offset += pPacket->getSize(); } sendBuffer.assign( &tempBuffer[0], &tempBuffer[0] + m_ipcHdr.size ); diff --git a/src/common/Network/PacketContainer.h b/src/common/Network/PacketContainer.h index 6d1995f5..373954bd 100644 --- a/src/common/Network/PacketContainer.h +++ b/src/common/Network/PacketContainer.h @@ -17,7 +17,7 @@ typedef boost::shared_ptr< FFXIVPacketBase > FFXIVPacketBasePtr; class PacketContainer { public: - PacketContainer(); + PacketContainer( uint32_t segmentTargetOverride = 0 ); ~PacketContainer(); void addPacket( FFXIVPacketBasePtr entry ); @@ -30,6 +30,9 @@ public: void fillSendBuffer( std::vector< uint8_t >& sendBuffer ); +private: + uint32_t m_segmentTargetOverride; + }; } diff --git a/src/servers/sapphire_zone/Actor/Actor.cpp b/src/servers/sapphire_zone/Actor/Actor.cpp index bb3a30df..505fa68e 100644 --- a/src/servers/sapphire_zone/Actor/Actor.cpp +++ b/src/servers/sapphire_zone/Actor/Actor.cpp @@ -290,20 +290,20 @@ void Core::Entity::Actor::sendToInRangeSet( Network::Packets::FFXIVPacketBasePtr // it might be that the player DC'd in which case the session would be invalid if( pSession ) - pSession->getZoneConnection()->queueOutPacket( std::move( pPacket ) ); + pSession->getZoneConnection()->queueOutPacket( pPacket ); } if( m_inRangePlayers.empty() ) return; + pPacket->setSourceActor( m_id ); + for( const auto &pCurAct : m_inRangePlayers ) { assert( pCurAct ); - pPacket->setSourceActor( m_id ); - pPacket->setTargetActor( pCurAct->getId() ); // it might be that the player DC'd in which case the session would be invalid // TODO: copy packet to a new unique_ptr then move ownership - //pCurAct->queuePacket( pPacket ); + pCurAct->queuePacket( pPacket ); } } diff --git a/src/servers/sapphire_zone/Network/GameConnection.cpp b/src/servers/sapphire_zone/Network/GameConnection.cpp index c2bfeb20..edce5c48 100644 --- a/src/servers/sapphire_zone/Network/GameConnection.cpp +++ b/src/servers/sapphire_zone/Network/GameConnection.cpp @@ -291,7 +291,7 @@ void Core::Network::GameConnection::processOutQueue() int32_t totalSize = 0; // create a new packet container - PacketContainer pRP = PacketContainer(); + PacketContainer pRP = PacketContainer( m_pSession->getId() ); // get next packet off the queue while( auto pPacket = m_outQueue.pop() ) From 72c071eb07e4326c554fba9e7db292b8ee6d8fa5 Mon Sep 17 00:00:00 2001 From: NotAdam Date: Tue, 3 Jul 2018 20:12:28 +1000 Subject: [PATCH 2/2] check if segmentTargetOverride is nonzero before overriding target --- src/common/Network/PacketContainer.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/common/Network/PacketContainer.cpp b/src/common/Network/PacketContainer.cpp index 936c03cd..73f5c134 100644 --- a/src/common/Network/PacketContainer.cpp +++ b/src/common/Network/PacketContainer.cpp @@ -55,7 +55,7 @@ void Core::Network::Packets::PacketContainer::fillSendBuffer( std::vector< uint8 { auto pPacket = (*it); - if( pPacket->getSegmentType() == SEGMENTTYPE_IPC ) + if( m_segmentTargetOverride != 0 && pPacket->getSegmentType() == SEGMENTTYPE_IPC ) { pPacket->setTargetActor( m_segmentTargetOverride ); }