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..73f5c134 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( m_segmentTargetOverride != 0 && 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() )