diff --git a/src/common/Network/GamePacketNew.h b/src/common/Network/GamePacketNew.h index 595b8222..73602ef3 100644 --- a/src/common/Network/GamePacketNew.h +++ b/src/common/Network/GamePacketNew.h @@ -9,6 +9,8 @@ #include #include +#include + namespace Core { namespace Network { namespace Packets { @@ -17,16 +19,25 @@ namespace Packets { // correct template functions. template < typename T, typename T1 > -class GamePacketNew; - -template < typename T, typename T1 > -std::ostream& operator << ( std::ostream& os, const GamePacketNew< T, T1 >& packet ); +class FFXIVIpcPacket; template< class T > -using ZoneChannelPacket = GamePacketNew< T, ServerZoneIpcType >; +using ZoneChannelPacket = FFXIVIpcPacket< T, ServerZoneIpcType >; template< class T > -using ChatChannelPacket = GamePacketNew< T, ServerChatIpcType >; +using ChatChannelPacket = FFXIVIpcPacket< T, ServerChatIpcType >; + +template< class T, typename... Args > +boost::shared_ptr< ZoneChannelPacket< T > > makeZonePacket( Args... args ) +{ + return boost::make_shared< ZoneChannelPacket< T > >( args... ); +} + +template< class T, typename... Args > +boost::shared_ptr< ChatChannelPacket< T > > makeChatPacket( Args... args ) +{ + return boost::make_shared< ChatChannelPacket< T > >( args... ); +} /** * The base implementation of a game packet. Needed for parsing packets. @@ -43,196 +54,220 @@ public: virtual T1 ipcType() = 0; }; -/** -* A game packet, or IPC packet, object is a template class for constructing -* the data to be sent or parsed. The template works by accepting a structure -* type that represents just the IPC data portion (the bytes after the initial -* 32 byte header information.) -*/ -template < typename T, typename T1 > -class GamePacketNew : public FFXIVIpcPacketBase< T1 > +////////////////////////////////////////////////7 + +class FFXIVPacketBase { public: - /** - * @brief Constructs a new game packet with the specified actors. - * @param sourceActorId The source actor id. - * @param targetActorId The target actor id. - */ - GamePacketNew< T, T1 >( uint32_t sourceActorId, uint32_t targetActorId ) + FFXIVPacketBase() : + m_segmentType( 0 ) { - initialize(); - m_segHdr.source_actor = sourceActorId; - m_segHdr.target_actor = targetActorId; - }; + initializeSegmentHeader(); + } - /** - * @brief Constructs a new game packet with the specified actors. - * @param sourceActorId The source and target actor id. - */ - GamePacketNew< T, T1 >( uint32_t bothActorId ) + FFXIVPacketBase( uint16_t segmentType, uint32_t sourceActorId, uint32_t targetActorId ) : + m_segmentType( segmentType ) { - initialize(); - m_segHdr.source_actor = bothActorId; - m_segHdr.target_actor = bothActorId; - }; + initializeSegmentHeader(); + setSourceActor( sourceActorId ); + setTargetActor( targetActorId ); + } + + std::size_t getSize() const + { + return m_segHdr.size; + } + + virtual std::vector< uint8_t > getData() const + { + return {}; + } protected: - /** Initializes the fields of the header structures */ - virtual void initialize( void ) - { - // Zero out the structures. - memset( &m_segHdr, 0, sizeof( FFXIVARR_PACKET_SEGMENT_HEADER ) ); - memset( &m_ipcHdr, 0, sizeof( FFXIVARR_IPC_HEADER ) ); - memset( &m_data, 0, sizeof( T ) ); - - // Set the values of static fields. - // The size must be the sum of the segment header, the ipc header, and - // the IPC data itself. - m_segHdr.size = sizeof( FFXIVARR_PACKET_SEGMENT_HEADER ) + sizeof( FFXIVARR_IPC_HEADER ) + sizeof( T ); - // Game packets (IPC) are type 3. - m_segHdr.type = 3; - // The IPC type itself. - m_ipcHdr.type = static_cast< ServerZoneIpcType >( m_data._ServerIpcType ); - }; + /** The segment header */ + FFXIVARR_PACKET_SEGMENT_HEADER m_segHdr; + uint16_t m_segmentType; public: + virtual uint32_t getContentSize() { return 0; }; + virtual std::vector< uint8_t > getContent() { return{}; }; + + /** + * @brief Gets the segment type of this packet. + */ + uint16_t getSegmentType() const + { + return m_segmentType; + } + + /** + * @brief Sets the source actor id for this packet. + * @param actorId The source actor id. + */ + void setSourceActor( uint32_t actorId ) + { + m_segHdr.source_actor = actorId; + }; + + /** + * @brief Gets the source actor id for this packet. + * @return The source actor id. + */ + uint32_t getSourceActor() const + { + return m_segHdr.source_actor; + }; + + /** + * @brief Sets the target actor id for this packet. + * @param actorId The target actor id. + */ + void setTargetActor( uint32_t actorId ) + { + m_segHdr.target_actor = actorId; + }; + + /** + * @brief Gets the target actor id for this packet. + */ + uint32_t getTargetActor( void ) const + { + return m_segHdr.target_actor; + }; + + /** Initializes the fields of the segment header structure */ + virtual void initializeSegmentHeader( void ) + { + // Zero out the structure. + memset( &m_segHdr, 0, sizeof( FFXIVARR_PACKET_SEGMENT_HEADER ) ); + + // Set the values of static fields. + // The size must be the sum of the segment header and the content + m_segHdr.size = sizeof( FFXIVARR_PACKET_SEGMENT_HEADER ) + getContentSize(); + m_segHdr.type = getSegmentType(); + } + +}; + +template < typename T, typename T1 > +class FFXIVIpcPacket : public FFXIVIpcPacketBase< T1 >, public FFXIVPacketBase +{ +public: + FFXIVIpcPacket< T, T1 >( uint32_t sourceActorId, uint32_t targetActorId ) : + FFXIVPacketBase( 3, sourceActorId, targetActorId ) + { + initialize(); + }; + + FFXIVIpcPacket< T, T1 >( uint32_t sourceActorId ) : + FFXIVPacketBase( 3, sourceActorId, sourceActorId ) + { + initialize(); + }; + + uint32_t getContentSize() override + { + return sizeof( FFXIVARR_IPC_HEADER ) + sizeof( T ); + } + + std::vector< uint8_t > getContent() override + { + std::vector< uint8_t > content( getContentSize() ); + memcpy( content.data(), &m_ipcHdr, sizeof( FFXIVARR_IPC_HEADER ) ); + memcpy( content.data() + sizeof( FFXIVARR_IPC_HEADER ), &m_data, sizeof( T ) ); + return content; + } + + std::vector< uint8_t > getData() const override + { + auto segmentHeaderSize = sizeof( FFXIVARR_PACKET_SEGMENT_HEADER ); + auto ipcHeaderSize = sizeof( FFXIVARR_IPC_HEADER ); + auto dataSize = sizeof( m_data ); + + std::vector< uint8_t > data( segmentHeaderSize + ipcHeaderSize + dataSize ); + + memcpy( &data[0], &m_segHdr, segmentHeaderSize ); + memcpy( &data[segmentHeaderSize], &m_ipcHdr, ipcHeaderSize ); + memcpy( &data[segmentHeaderSize + ipcHeaderSize], &m_data, dataSize ); + + return data; + } + virtual T1 ipcType() { return static_cast< T1 >( m_data._ServerIpcType ); }; /** Gets a reference to the underlying IPC data structure. */ - T& data( void ) { return m_data; }; + T& data() { return m_data; }; - /** - * @brief Sets the source actor id for this IPC packet. - * @param actorId The source actor id. - * @return This IPC packet object (can be used for chaining). - */ - GamePacketNew< T, T1 > sourceActor( uint32_t actorId ) +protected: + /** Initializes the fields of the header structures */ + virtual void initialize() { - m_segHdr.source_actor = actorId; - return this; - }; + // Zero out the structures. + memset( &m_ipcHdr, 0, sizeof( FFXIVARR_IPC_HEADER ) ); + memset( &m_data, 0, sizeof( T ) ); - /** - * @brief Gets the source actor id for this IPC packet. - * @return The source actor id. - */ - uint32_t sourceActor( void ) const - { - return m_segHdr.source_actor; - }; - - /** - * @brief Sets the target actor id for this IPC packet. - * @param actorId The target actor id. - * @return This IPC packet object (can be used for chaining). - */ - GamePacketNew< T, T1 > targetActor( uint32_t actorId ) - { - m_segHdr.target_actor = actorId; - return this; - }; - - /** - * @brief Gets the target actor id for this IPC packet. - * @return The target actor id. - */ - uint32_t targetActor( void ) const - { - return m_segHdr.target_actor; - }; - - friend std::ostream& operator<< <> ( std::ostream& os, const GamePacketNew< T, T1 >& packet ); - - friend class GamePacketFactory; - - /** - * @brief Adapts the new-style packet into the old style. - */ - operator GamePacket* ( ) const - { - std::ostringstream buf; - serialize( buf ); - // NOTE: This should be ok because CGamePacket's constructor will - // copy the contents of the buffer. - GamePacket* pOldStyle = new GamePacket( const_cast< char* >( buf.str().c_str() ), m_segHdr.size, false ); - return pOldStyle; - }; - - operator GamePacketPtr () const - { - std::ostringstream buf; - serialize( buf ); - // NOTE: This should be ok because CGamePacket's constructor will - // copy the contents of the buffer. - GamePacketPtr pOldStyle( new GamePacket( const_cast< char* >( buf.str().c_str() ), m_segHdr.size, true ) ); - return pOldStyle; + // The IPC type itself. + m_ipcHdr.type = static_cast< ServerZoneIpcType >( m_data._ServerIpcType ); }; protected: - // TODO: Is this a waste of storage memory? - /** The segment header */ - FFXIVARR_PACKET_SEGMENT_HEADER m_segHdr; /** The IPC packet header */ FFXIVARR_IPC_HEADER m_ipcHdr; /** The underlying data portion of the packet as a structure */ T m_data; - -private: - std::ostream& serialize( std::ostream& os ) const - { - // Since the packet itself is constant, we need to make a copy of the IPC - // header in order to set the timestamp. - FFXIVARR_IPC_HEADER ipcHdr; - memcpy( &ipcHdr, &m_ipcHdr, sizeof( ipcHdr ) ); - - // TODO: Fixed timestamp? Can we use a manipulator on the stream to assign - // a fixed timestamp value. This might be useful if several packets must - // be sent having the exact same timestamp. (Maybe this doesn't really - // need to happen though...) - ipcHdr.timestamp = static_cast< uint32_t >( time( nullptr ) ); - - // TODO: What about encryption? compression? - // Ideally, these could come directly from the stream using manipulators. - // We could check the stream's flags, and perform the appropriate - // operations here. The snag is encryption, which does not occur for - // segment headers, but may occur for IPC headers, and their data. - // Compression occurs for the entire segment header down. - os << m_segHdr << ipcHdr; - return os.write( reinterpret_cast< const char* >( &m_data ), sizeof( T ) ); - }; }; -template < typename T, typename T1 > -std::ostream& operator<<( std::ostream& os, const GamePacketNew& packet ) + +class FFXIVRawPacket : public FFXIVPacketBase { -#if 0 - // Since the packet itself is constant, we need to make a copy of the IPC - // header in order to set the timestamp. - FFXIVARR_IPC_HEADER ipcHdr; - memcpy( &ipcHdr, &packet.m_ipcHdr, sizeof( ipcHdr ) ); +public: + FFXIVRawPacket( uint16_t type, uint32_t size, uint32_t sourceActorId, uint32_t targetActorId ) : + FFXIVPacketBase( type, sourceActorId, targetActorId ) + { + m_data.resize( size - sizeof( FFXIVARR_PACKET_SEGMENT_HEADER ) ); + initialize(); + m_segHdr.size = size; + }; - // TODO: Fixed timestamp? Can we use a manipulator on the stream to assign - // a fixed timestamp value. This might be useful if several packets must - // be sent having the exact same timestamp. (Maybe this doesn't really - // need to happen though...) - ipcHdr.timestamp = time( NULL ); + uint32_t getContentSize() override + { + return m_data.size(); + } + + std::vector< uint8_t > getContent() override + { + return m_data; + } + + virtual std::vector< uint8_t > getData() const override + { + std::vector< uint8_t > data( sizeof( FFXIVARR_PACKET_SEGMENT_HEADER ) + m_data.size() ); + + memcpy( &data[0], &m_segHdr, sizeof( FFXIVARR_PACKET_SEGMENT_HEADER ) ); + memcpy( &data[sizeof( FFXIVARR_PACKET_SEGMENT_HEADER )], &m_data[0], m_data.size() ); + + return data; + } + + /** Gets a reference to the underlying IPC data structure. */ + std::vector< uint8_t >& data() { return m_data; }; + +protected: + /** Initializes the fields of the header structures */ + virtual void initialize() + { + // Zero out the structures. + memset( &m_data[0], 0, m_data.size() ); + }; + +protected: + /** The underlying data portion of the packet as a structure */ + std::vector< uint8_t > m_data; +}; - // TODO: What about encryption? compression? - // Ideally, these could come directly from the stream using manipulators. - // We could check the stream's flags, and perform the appropriate - // operations here. The snag is encryption, which does not occur for - // segment headers, but may occur for IPC headers, and their data. - // Compression occurs for the entire segment header down. - os << packet.m_segHdr << ipcHdr; - return os.write( - reinterpret_cast< const char* >( &packet.m_data ), sizeof( T ) ); -#else - return packet.serialize( os ); -#endif -} } /* Packets */ } /* Network */ diff --git a/src/common/Network/PacketContainer.cpp b/src/common/Network/PacketContainer.cpp index d0074938..049ed386 100644 --- a/src/common/Network/PacketContainer.cpp +++ b/src/common/Network/PacketContainer.cpp @@ -1,5 +1,5 @@ #include "PacketContainer.h" -#include "GamePacket.h" + #include "Common.h" #include @@ -19,18 +19,18 @@ Core::Network::Packets::PacketContainer::~PacketContainer() m_entryList.clear(); } -void Core::Network::Packets::PacketContainer::addPacket( GamePacket pEntry ) +void Core::Network::Packets::PacketContainer::addPacket( FFXIVPacketBase entry ) { - m_entryList.push_back( pEntry ); + m_entryList.push_back( entry ); - m_ipcHdr.size += pEntry.getSize(); + m_ipcHdr.size += entry.getSize(); m_ipcHdr.count++; } void Core::Network::Packets::PacketContainer::fillSendBuffer( std::vector< uint8_t >& sendBuffer ) { - uint8_t* tempBuffer = new uint8_t[m_ipcHdr.size]; - memset( tempBuffer, 0, m_ipcHdr.size ); + std::vector< uint8_t > tempBuffer( m_ipcHdr.size ); + memset( &tempBuffer[0], 0, m_ipcHdr.size ); using namespace std::chrono; auto ms = duration_cast< milliseconds >( system_clock::now().time_since_epoch() ); @@ -40,23 +40,22 @@ void Core::Network::Packets::PacketContainer::fillSendBuffer( std::vector< uint8 m_ipcHdr.timestamp = tick; m_ipcHdr.unknown_20 = 1; - memcpy( tempBuffer, &m_ipcHdr, sizeof( FFXIVARR_PACKET_HEADER ) ); + memcpy( &tempBuffer[0], &m_ipcHdr, sizeof( FFXIVARR_PACKET_HEADER ) ); auto it = m_entryList.begin(); - uint16_t offset = 0; + std::size_t offset = 0; if( m_entryList.size() > 1 ) offset = 0; for( ; it != m_entryList.end(); ++it ) { - memcpy( tempBuffer + sizeof( FFXIVARR_PACKET_HEADER ) + offset, it->getData(), it->m_segHdr.size ); - offset += it->m_segHdr.size; + auto data = it->getData(); + memcpy( &tempBuffer[0] + sizeof( FFXIVARR_PACKET_HEADER ) + offset, &data[0], it->getSize() ); + offset += it->getSize(); } - sendBuffer.assign( tempBuffer, tempBuffer + m_ipcHdr.size ); - - delete[] tempBuffer; + sendBuffer.assign( &tempBuffer[0], &tempBuffer[0] + m_ipcHdr.size ); } diff --git a/src/common/Network/PacketContainer.h b/src/common/Network/PacketContainer.h index 494fe64b..65336c82 100644 --- a/src/common/Network/PacketContainer.h +++ b/src/common/Network/PacketContainer.h @@ -5,7 +5,7 @@ #include "Common.h" #include "CommonNetwork.h" -#include "GamePacket.h" +#include "GamePacketNew.h" namespace Core { namespace Network { @@ -19,11 +19,11 @@ public: PacketContainer(); ~PacketContainer(); - void addPacket( GamePacket pEntry ); + void addPacket( FFXIVPacketBase entry ); FFXIVARR_PACKET_HEADER m_ipcHdr; - std::vector< GamePacket > m_entryList; + std::vector< FFXIVPacketBase > m_entryList; std::string toString(); diff --git a/src/servers/sapphire_zone/Action/ActionCast.cpp b/src/servers/sapphire_zone/Action/ActionCast.cpp index 37806683..ed862bcb 100644 --- a/src/servers/sapphire_zone/Action/ActionCast.cpp +++ b/src/servers/sapphire_zone/Action/ActionCast.cpp @@ -49,14 +49,14 @@ void Core::Action::ActionCast::onStart() m_pSource->getAsPlayer()->sendDebug( "onStart()" ); m_startTime = Util::getTimeMs(); - ZoneChannelPacket< FFXIVIpcActorCast > castPacket( m_pSource->getId() ); + auto castPacket = makeZonePacket< FFXIVIpcActorCast >( getId() ); - castPacket.data().action_id = m_id; - castPacket.data().skillType = Common::SkillType::Normal; - castPacket.data().unknown_1 = m_id; + castPacket->data().action_id = m_id; + castPacket->data().skillType = Common::SkillType::Normal; + castPacket->data().unknown_1 = m_id; // This is used for the cast bar above the target bar of the caster. - castPacket.data().cast_time = static_cast< float >( m_castTime / 1000 ); - castPacket.data().target_id = m_pTarget->getId(); + castPacket->data().cast_time = static_cast< float >( m_castTime / 1000 ); + castPacket->data().target_id = m_pTarget->getId(); m_pSource->sendToInRangeSet( castPacket, true ); m_pSource->getAsPlayer()->setStateFlag( PlayerStateFlag::Casting ); @@ -90,8 +90,8 @@ void Core::Action::ActionCast::onInterrupt() //m_pSource->getAsPlayer()->unsetStateFlag( PlayerStateFlag::Occupied1 ); m_pSource->getAsPlayer()->unsetStateFlag( PlayerStateFlag::Casting ); - auto control = ActorControlPacket142( m_pSource->getId(), ActorControlType::CastInterrupt, - 0x219, 1, m_id, 0 ); + auto control = boost::make_shared< ActorControlPacket142 >( m_pSource->getId(), ActorControlType::CastInterrupt, + 0x219, 1, m_id, 0 ); // Note: When cast interrupt from taking too much damage, set the last value to 1. This enables the cast interrupt effect. Example: // auto control = ActorControlPacket142( m_pSource->getId(), ActorControlType::CastInterrupt, 0x219, 1, m_id, 0 ); diff --git a/src/servers/sapphire_zone/Action/ActionMount.cpp b/src/servers/sapphire_zone/Action/ActionMount.cpp index 870da031..d011e472 100644 --- a/src/servers/sapphire_zone/Action/ActionMount.cpp +++ b/src/servers/sapphire_zone/Action/ActionMount.cpp @@ -48,14 +48,13 @@ void Core::Action::ActionMount::onStart() m_pSource->getAsPlayer()->sendDebug( "ActionMount::onStart()" ); m_startTime = Util::getTimeMs(); - ZoneChannelPacket< FFXIVIpcActorCast > castPacket( m_pSource->getId() ); - - castPacket.data().action_id = m_id; - castPacket.data().skillType = Common::SkillType::MountSkill; - castPacket.data().unknown_1 = m_id; + auto castPacket = makeZonePacket< FFXIVIpcActorCast >( getId() ); + castPacket->data().action_id = m_id; + castPacket->data().skillType = Common::SkillType::MountSkill; + castPacket->data().unknown_1 = m_id; // This is used for the cast bar above the target bar of the caster. - castPacket.data().cast_time = static_cast< float >( m_castTime / 1000 ); - castPacket.data().target_id = m_pSource->getAsPlayer()->getId(); + castPacket->data().cast_time = static_cast< float >( m_castTime / 1000 ); + castPacket->data().target_id = m_pSource->getAsPlayer()->getId(); m_pSource->sendToInRangeSet( castPacket, true ); m_pSource->getAsPlayer()->setStateFlag( PlayerStateFlag::Casting ); @@ -72,18 +71,19 @@ void Core::Action::ActionMount::onFinish() pPlayer->unsetStateFlag( PlayerStateFlag::Casting ); - ZoneChannelPacket< FFXIVIpcEffect > effectPacket( pPlayer->getId() ); - effectPacket.data().targetId = pPlayer->getId(); - effectPacket.data().actionAnimationId = m_id; + auto effectPacket = makeZonePacket< FFXIVIpcEffect >( getId() ); + + effectPacket->data().targetId = pPlayer->getId(); + effectPacket->data().actionAnimationId = m_id; // Affects displaying action name next to number in floating text - effectPacket.data().unknown_62 = 13; - effectPacket.data().actionTextId = 4; - effectPacket.data().numEffects = 1; - effectPacket.data().rotation = Math::Util::floatToUInt16Rot( pPlayer->getRot() ); - effectPacket.data().effectTarget = INVALID_GAME_OBJECT_ID; - effectPacket.data().effects[0].effectType = ActionEffectType::Mount; - effectPacket.data().effects[0].hitSeverity = ActionHitSeverityType::CritDamage; - effectPacket.data().effects[0].value = m_id; + effectPacket->data().unknown_62 = 13; + effectPacket->data().actionTextId = 4; + effectPacket->data().numEffects = 1; + effectPacket->data().rotation = Math::Util::floatToUInt16Rot( pPlayer->getRot() ); + effectPacket->data().effectTarget = INVALID_GAME_OBJECT_ID; + effectPacket->data().effects[0].effectType = ActionEffectType::Mount; + effectPacket->data().effects[0].hitSeverity = ActionHitSeverityType::CritDamage; + effectPacket->data().effects[0].value = m_id; pPlayer->sendToInRangeSet( effectPacket, true ); @@ -98,8 +98,8 @@ void Core::Action::ActionMount::onInterrupt() //m_pSource->getAsPlayer()->unsetStateFlag( PlayerStateFlag::Occupied1 ); m_pSource->getAsPlayer()->unsetStateFlag( PlayerStateFlag::Casting ); - auto control = ActorControlPacket142( m_pSource->getId(), ActorControlType::CastInterrupt, - 0x219, 1, m_id, 0 ); + auto control = boost::make_shared< ActorControlPacket142 >( m_pSource->getId(), ActorControlType::CastInterrupt, + 0x219, 1, m_id, 0 ); // Note: When cast interrupt from taking too much damage, set the last value to 1. This enables the cast interrupt effect. Example: // auto control = ActorControlPacket142( m_pSource->getId(), ActorControlType::CastInterrupt, 0x219, 1, m_id, 0 ); diff --git a/src/servers/sapphire_zone/Action/ActionTeleport.cpp b/src/servers/sapphire_zone/Action/ActionTeleport.cpp index 88ffc71e..aee2af29 100644 --- a/src/servers/sapphire_zone/Action/ActionTeleport.cpp +++ b/src/servers/sapphire_zone/Action/ActionTeleport.cpp @@ -47,12 +47,11 @@ void Core::Action::ActionTeleport::onStart() m_startTime = Util::getTimeMs(); - ZoneChannelPacket< FFXIVIpcActorCast > castPacket( m_pSource->getId() ); - - castPacket.data().action_id = 5; - castPacket.data().unknown = 1; - castPacket.data().cast_time = 5.0f; - castPacket.data().target_id = m_pSource->getId(); + auto castPacket = makeZonePacket< FFXIVIpcActorCast >( getId() ); + castPacket->data().action_id = 5; + castPacket->data().unknown = 1; + castPacket->data().cast_time = 5.0f; + castPacket->data().target_id = m_pSource->getId(); m_pSource->sendToInRangeSet( castPacket, true ); m_pSource->getAsPlayer()->setStateFlag( PlayerStateFlag::Casting ); @@ -83,15 +82,15 @@ void Core::Action::ActionTeleport::onFinish() pPlayer->setZoningType( ZoneingType::Teleport ); - ZoneChannelPacket< FFXIVIpcEffect > effectPacket( pPlayer->getId() ); - effectPacket.data().targetId = pPlayer->getId(); - effectPacket.data().actionAnimationId = 5; + auto effectPacket = makeZonePacket< FFXIVIpcEffect >( getId() ); + effectPacket->data().targetId = pPlayer->getId(); + effectPacket->data().actionAnimationId = 5; //effectPacket.data().unknown_3 = 1; - effectPacket.data().actionTextId = 5; - effectPacket.data().unknown_5 = 1; - effectPacket.data().numEffects = 1; - effectPacket.data().rotation = static_cast< uint16_t >( 0x8000 * ( ( pPlayer->getRot() + 3.1415926 ) ) / 3.1415926 ); - effectPacket.data().effectTarget = pPlayer->getId(); + effectPacket->data().actionTextId = 5; + effectPacket->data().unknown_5 = 1; + effectPacket->data().numEffects = 1; + effectPacket->data().rotation = static_cast< uint16_t >( 0x8000 * ( ( pPlayer->getRot() + 3.1415926 ) ) / 3.1415926 ); + effectPacket->data().effectTarget = pPlayer->getId(); pPlayer->sendToInRangeSet( effectPacket, true ); pPlayer->teleport( m_targetAetheryte ); @@ -106,8 +105,8 @@ void Core::Action::ActionTeleport::onInterrupt() m_pSource->getAsPlayer()->unsetStateFlag( PlayerStateFlag::Casting ); - auto control = ActorControlPacket142( m_pSource->getId(), ActorControlType::CastInterrupt, - 0x219, 0x04, m_id, 0 ); + auto control = boost::make_shared< ActorControlPacket142 >( m_pSource->getId(), ActorControlType::CastInterrupt, + 0x219, 0x04, m_id, 0 ); m_pSource->sendToInRangeSet( control, true ); } diff --git a/src/servers/sapphire_zone/Action/EventAction.cpp b/src/servers/sapphire_zone/Action/EventAction.cpp index a21400f0..14a9de84 100644 --- a/src/servers/sapphire_zone/Action/EventAction.cpp +++ b/src/servers/sapphire_zone/Action/EventAction.cpp @@ -50,8 +50,8 @@ void Core::Action::EventAction::onStart() m_startTime = Util::getTimeMs(); - auto control = ActorControlPacket142( m_pSource->getId(), Common::ActorControlType::CastStart, - 1, m_id, 0x4000004E ); + auto control = boost::make_shared< ActorControlPacket142 >( m_pSource->getId(), Common::ActorControlType::CastStart, + 1, m_id, 0x4000004E ); if( m_pSource->isPlayer() ) { @@ -77,7 +77,8 @@ void Core::Action::EventAction::onFinish() if( m_onActionFinishClb ) m_onActionFinishClb( *m_pSource->getAsPlayer(), m_eventId, m_additional ); - auto control = ActorControlPacket142( m_pSource->getId(), Common::ActorControlType::CastStart, 0, m_id ); + auto control = boost::make_shared< ActorControlPacket142 >( m_pSource->getId(), Common::ActorControlType::CastStart, + 0, m_id ); if( !pEvent->hasPlayedScene() ) m_pSource->getAsPlayer()->eventFinish( m_eventId, 1 ); @@ -108,12 +109,13 @@ void Core::Action::EventAction::onInterrupt() try { - auto control = ActorControlPacket142( m_pSource->getId(), ActorControlType::CastInterrupt, - 0x219, 0x04, m_id ); + auto control = boost::make_shared< ActorControlPacket142 >( m_pSource->getId(), ActorControlType::CastInterrupt, + 0x219, 0x04, m_id ); if( m_pSource->isPlayer() ) { - auto control1 = ActorControlPacket143( m_pSource->getId(), ActorControlType::FreeEventPos, m_eventId ); + auto control1 = boost::make_shared< ActorControlPacket143 >( m_pSource->getId(), ActorControlType::FreeEventPos, + m_eventId ); //m_pSource->getAsPlayer()->unsetStateFlag( PlayerStateFlag::NoCombat ); //m_pSource->getAsPlayer()->unsetStateFlag( PlayerStateFlag::Occupied1 ); diff --git a/src/servers/sapphire_zone/Action/EventItemAction.cpp b/src/servers/sapphire_zone/Action/EventItemAction.cpp index 91f40ca5..5c725d75 100644 --- a/src/servers/sapphire_zone/Action/EventItemAction.cpp +++ b/src/servers/sapphire_zone/Action/EventItemAction.cpp @@ -48,13 +48,12 @@ void Core::Action::EventItemAction::onStart() m_startTime = Util::getTimeMs(); - GamePacketNew< FFXIVIpcActorCast, ServerZoneIpcType > castPacket( m_pSource->getId() ); - - castPacket.data().action_id = 1; - castPacket.data().unknown = 3; - castPacket.data().unknown_1 = m_id; - castPacket.data().cast_time = 3.0f; - castPacket.data().target_id = m_pSource->getId(); + auto castPacket = makeZonePacket< FFXIVIpcActorCast >( m_pSource->getId() ); + castPacket->data().action_id = 1; + castPacket->data().unknown = 3; + castPacket->data().unknown_1 = m_id; + castPacket->data().cast_time = 3.0f; + castPacket->data().target_id = m_pSource->getId(); m_pSource->sendToInRangeSet( castPacket, true ); m_pSource->getAsPlayer()->setStateFlag( PlayerStateFlag::Casting ); @@ -68,15 +67,15 @@ void Core::Action::EventItemAction::onFinish() try { - GamePacketNew< FFXIVIpcEffect, ServerZoneIpcType > effectPacket( m_pSource->getId() ); - effectPacket.data().targetId = static_cast< uint32_t >( m_additional ); - effectPacket.data().actionAnimationId = 1; + auto effectPacket = makeZonePacket< FFXIVIpcEffect >( m_pSource->getId() ); + effectPacket->data().targetId = static_cast< uint32_t >( m_additional ); + effectPacket->data().actionAnimationId = 1; // effectPacket.data().unknown_3 = 3; - effectPacket.data().actionTextId = m_id; - effectPacket.data().unknown_5 = 2; - effectPacket.data().numEffects = 1; - effectPacket.data().rotation = Math::Util::floatToUInt16Rot( m_pSource->getRot() ); - effectPacket.data().effectTarget = static_cast< uint32_t >( m_additional ); + effectPacket->data().actionTextId = m_id; + effectPacket->data().unknown_5 = 2; + effectPacket->data().numEffects = 1; + effectPacket->data().rotation = Math::Util::floatToUInt16Rot( m_pSource->getRot() ); + effectPacket->data().effectTarget = static_cast< uint32_t >( m_additional ); m_pSource->getAsPlayer()->unsetStateFlag( Common::PlayerStateFlag::Casting ); m_pSource->sendToInRangeSet( effectPacket, true ); @@ -100,8 +99,8 @@ void Core::Action::EventItemAction::onInterrupt() try { - auto control = ActorControlPacket142( m_pSource->getId(), ActorControlType::CastInterrupt, - 0x219, 0x04, m_id ); + auto control = boost::make_shared< ActorControlPacket142 >( m_pSource->getId(), ActorControlType::CastInterrupt, + 0x219, 0x04, m_id ); if( m_pSource->isPlayer() ) { m_pSource->getAsPlayer()->unsetStateFlag( PlayerStateFlag::Casting ); diff --git a/src/servers/sapphire_zone/Actor/Actor.cpp b/src/servers/sapphire_zone/Actor/Actor.cpp index dcbb812f..bb3a30df 100644 --- a/src/servers/sapphire_zone/Actor/Actor.cpp +++ b/src/servers/sapphire_zone/Actor/Actor.cpp @@ -4,6 +4,7 @@ #include #include +#include #include "Action/Action.h" #include "Action/ActionCollision.h" @@ -278,7 +279,7 @@ Send a packet to all players in range, potentially to self if set and is player \param GamePacketPtr to send \param bool should be send to self? */ -void Core::Entity::Actor::sendToInRangeSet( Network::Packets::GamePacketPtr pPacket, bool bToSelf ) +void Core::Entity::Actor::sendToInRangeSet( Network::Packets::FFXIVPacketBasePtr pPacket, bool bToSelf ) { auto pServerZone = g_fw.get< ServerZone >(); if( bToSelf && isPlayer() ) @@ -289,7 +290,7 @@ void Core::Entity::Actor::sendToInRangeSet( Network::Packets::GamePacketPtr pPac // it might be that the player DC'd in which case the session would be invalid if( pSession ) - pSession->getZoneConnection()->queueOutPacket( pPacket ); + pSession->getZoneConnection()->queueOutPacket( std::move( pPacket ) ); } if( m_inRangePlayers.empty() ) @@ -298,10 +299,11 @@ void Core::Entity::Actor::sendToInRangeSet( Network::Packets::GamePacketPtr pPac for( const auto &pCurAct : m_inRangePlayers ) { assert( pCurAct ); - pPacket->setValAt< uint32_t >( 0x04, m_id ); - pPacket->setValAt< uint32_t >( 0x08, pCurAct->getId() ); + pPacket->setSourceActor( m_id ); + pPacket->setTargetActor( pCurAct->getId() ); // it might be that the player DC'd in which case the session would be invalid - pCurAct->queuePacket( pPacket ); + // TODO: copy packet to a new unique_ptr then move ownership + //pCurAct->queuePacket( pPacket ); } } diff --git a/src/servers/sapphire_zone/Actor/Actor.h b/src/servers/sapphire_zone/Actor/Actor.h index 352f114a..96fc10f8 100644 --- a/src/servers/sapphire_zone/Actor/Actor.h +++ b/src/servers/sapphire_zone/Actor/Actor.h @@ -98,7 +98,7 @@ namespace Entity { ActorPtr getClosestActor(); - void sendToInRangeSet( Network::Packets::GamePacketPtr pPacket, bool bToSelf = false ); + void sendToInRangeSet( Network::Packets::FFXIVPacketBasePtr pPacket, bool bToSelf = false ); // add an actor to in range set void addInRangeActor( ActorPtr pActor ); diff --git a/src/servers/sapphire_zone/Actor/Chara.cpp b/src/servers/sapphire_zone/Actor/Chara.cpp index 841e75fa..8c75068b 100644 --- a/src/servers/sapphire_zone/Actor/Chara.cpp +++ b/src/servers/sapphire_zone/Actor/Chara.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include "Forwards.h" #include "Action/Action.h" @@ -211,11 +212,16 @@ void Core::Entity::Chara::die() // if the actor is a player, the update needs to be send to himself too bool selfNeedsUpdate = isPlayer(); - sendToInRangeSet( ActorControlPacket142( m_id, SetStatus, static_cast< uint8_t >( ActorStatus::Dead ) ), selfNeedsUpdate ); + FFXIVPacketBasePtr packet + = boost::make_shared< ActorControlPacket142 >( m_id, SetStatus, static_cast< uint8_t >( ActorStatus::Dead ) ); + sendToInRangeSet( packet, selfNeedsUpdate ); // TODO: not all actor show the death animation when they die, some quest npcs might just despawn // although that might be handled by setting the HP to 1 and doing some script magic - sendToInRangeSet( ActorControlPacket142( m_id, DeathAnimation, 0, 0, 0, 0x20 ), selfNeedsUpdate ); + + FFXIVPacketBasePtr packet1 + = boost::make_shared< ActorControlPacket142 >( m_id, DeathAnimation, 0, 0, 0, 0x20 ); + sendToInRangeSet( packet1, selfNeedsUpdate ); } @@ -248,7 +254,8 @@ void Core::Entity::Chara::setStance( Stance stance ) { m_currentStance = stance; - sendToInRangeSet( ActorControlPacket142( m_id, ToggleAggro, stance, 1 ) ); + FFXIVPacketBasePtr packet = boost::make_shared< ActorControlPacket142 >( m_id, ToggleAggro, stance, 1 ); + sendToInRangeSet( packet ); } /*! @@ -278,7 +285,8 @@ Change the current target and propagate to in range players void Core::Entity::Chara::changeTarget( uint64_t targetId ) { setTargetId( targetId ); - sendToInRangeSet( ActorControlPacket144( m_id, SetTarget, 0, 0, 0, 0, targetId ) ); + FFXIVPacketBasePtr packet = boost::make_shared< ActorControlPacket144 >( m_id, SetTarget, 0, 0, 0, 0, targetId ); + sendToInRangeSet( packet ); } /*! @@ -349,8 +357,8 @@ so players can have their own version and we can abolish the param. */ void Core::Entity::Chara::sendStatusUpdate( bool toSelf ) { - UpdateHpMpTpPacket updateHpPacket( *this ); - sendToInRangeSet( updateHpPacket ); + FFXIVPacketBasePtr packet = boost::make_shared< UpdateHpMpTpPacket >( *this ); + sendToInRangeSet( packet ); } /*! \return ActionPtr of the currently registered action, or nullptr */ @@ -388,24 +396,25 @@ void Core::Entity::Chara::autoAttack( CharaPtr pTarget ) uint16_t damage = static_cast< uint16_t >( 10 + rand() % 12 ); uint32_t variation = static_cast< uint32_t >( 0 + rand() % 4 ); - ZoneChannelPacket< FFXIVIpcEffect > effectPacket( getId() ); - effectPacket.data().targetId = pTarget->getId(); - effectPacket.data().actionAnimationId = 0x366; - effectPacket.data().unknown_2 = variation; + FFXIVPacketBasePtr packet = boost::make_shared< ZoneChannelPacket< FFXIVIpcEffect > >( getId() ); + auto ipcEffect = dynamic_cast< ZoneChannelPacket< FFXIVIpcEffect >& >( *packet ); + ipcEffect.data().targetId = pTarget->getId(); + ipcEffect.data().actionAnimationId = 0x366; + ipcEffect.data().unknown_2 = variation; // effectPacket.data().unknown_3 = 1; - effectPacket.data().actionTextId = 0x366; - effectPacket.data().numEffects = 1; - effectPacket.data().rotation = Math::Util::floatToUInt16Rot( getRot() ); - effectPacket.data().effectTarget = pTarget->getId(); - effectPacket.data().effects[0].value = damage; - effectPacket.data().effects[0].effectType = ActionEffectType::Damage; - effectPacket.data().effects[0].hitSeverity = static_cast< ActionHitSeverityType >( variation ); - effectPacket.data().effects[0].unknown_3 = 7; + ipcEffect.data().actionTextId = 0x366; + ipcEffect.data().numEffects = 1; + ipcEffect.data().rotation = Math::Util::floatToUInt16Rot( getRot() ); + ipcEffect.data().effectTarget = pTarget->getId(); + ipcEffect.data().effects[0].value = damage; + ipcEffect.data().effects[0].effectType = ActionEffectType::Damage; + ipcEffect.data().effects[0].hitSeverity = static_cast< ActionHitSeverityType >( variation ); + ipcEffect.data().effects[0].unknown_3 = 7; - sendToInRangeSet( effectPacket ); + sendToInRangeSet( packet ); if( isPlayer() ) - getAsPlayer()->queuePacket( effectPacket ); + getAsPlayer()->queuePacket( packet ); pTarget->takeDamage( damage ); } @@ -432,7 +441,8 @@ void Core::Entity::Chara::handleScriptSkill( uint32_t type, uint16_t actionId, u // Todo: Effect packet generator. 90% of this is basically setting params and it's basically unreadable. // Prepare packet. This is seemingly common for all packets in the action handler. - ZoneChannelPacket< FFXIVIpcEffect > effectPacket( getId() ); + FFXIVPacketBasePtr packet = boost::make_shared< ZoneChannelPacket< FFXIVIpcEffect > >( getId() ); + auto effectPacket = dynamic_cast< ZoneChannelPacket< FFXIVIpcEffect >& >( *packet ); effectPacket.data().targetId = target.getId(); effectPacket.data().actionAnimationId = actionId; effectPacket.data().unknown_62 = 1; // Affects displaying action name next to number in floating text @@ -459,7 +469,7 @@ void Core::Entity::Chara::handleScriptSkill( uint32_t type, uint16_t actionId, u if ( isPlayer() && !ActionCollision::isActorApplicable( target, TargetFilter::Enemies ) ) break; - sendToInRangeSet( effectPacket, true ); + sendToInRangeSet( packet, true ); if ( target.isAlive() ) target.onActionHostile( *this ); @@ -479,7 +489,7 @@ void Core::Entity::Chara::handleScriptSkill( uint32_t type, uint16_t actionId, u effectPacket.data().effectTarget = pHitActor->getId(); // todo: send to range of what? ourselves? when mob script hits this is going to be lacking - sendToInRangeSet( effectPacket, true ); + sendToInRangeSet( packet, true ); if( pHitActor->getAsChara()->isAlive() ) @@ -515,7 +525,7 @@ void Core::Entity::Chara::handleScriptSkill( uint32_t type, uint16_t actionId, u if( isPlayer() && !ActionCollision::isActorApplicable( target, TargetFilter::Allies ) ) break; - sendToInRangeSet( effectPacket, true ); + sendToInRangeSet( packet, true ); target.heal( calculatedHeal ); } else @@ -531,7 +541,7 @@ void Core::Entity::Chara::handleScriptSkill( uint32_t type, uint16_t actionId, u effectPacket.data().targetId = target.getId(); effectPacket.data().effectTarget = pHitActor->getId(); - sendToInRangeSet( effectPacket, true ); + sendToInRangeSet( packet, true ); pHitActor->getAsChara()->heal( calculatedHeal ); // Debug @@ -564,7 +574,9 @@ void Core::Entity::Chara::addStatusEffect( StatusEffect::StatusEffectPtr pEffect pEffect->applyStatus(); m_statusEffectMap[nextSlot] = pEffect; - ZoneChannelPacket< Server::FFXIVIpcAddStatusEffect > statusEffectAdd( getId() ); + FFXIVPacketBasePtr packet = boost::make_shared< ZoneChannelPacket< FFXIVIpcAddStatusEffect > >( getId() ); + auto statusEffectAdd = dynamic_cast< ZoneChannelPacket< FFXIVIpcAddStatusEffect >& >( *packet ); + statusEffectAdd.data().actor_id = pEffect->getTargetActorId(); statusEffectAdd.data().actor_id1 = pEffect->getSrcActorId(); statusEffectAdd.data().current_hp = getHp(); @@ -579,7 +591,7 @@ void Core::Entity::Chara::addStatusEffect( StatusEffect::StatusEffectPtr pEffect //statusEffectAdd.data().unknown2 = 28; statusEffectAdd.data().param = pEffect->getParam(); - sendToInRangeSet( statusEffectAdd, isPlayer() ); + sendToInRangeSet( packet, isPlayer() ); } /*! \param StatusEffectPtr to be applied to the actor */ @@ -643,7 +655,7 @@ void Core::Entity::Chara::removeStatusEffect( uint8_t effectSlotId ) auto pEffect = pEffectIt->second; pEffect->removeStatus(); - sendToInRangeSet( ActorControlPacket142( getId(), StatusEffectLose, pEffect->getId() ), isPlayer() ); + sendToInRangeSet( boost::make_shared< ActorControlPacket142 >( getId(), StatusEffectLose, pEffect->getId() ), isPlayer() ); m_statusEffectMap.erase( effectSlotId ); @@ -659,24 +671,23 @@ void Core::Entity::Chara::sendStatusEffectUpdate() { uint64_t currentTimeMs = Util::getTimeMs(); - ZoneChannelPacket< Server::FFXIVIpcStatusEffectList > statusEffectList( getId() ); - - statusEffectList.data().classId = static_cast< uint8_t >( getClass() ); - statusEffectList.data().level = getLevel(); - statusEffectList.data().level1 = getLevel(); - statusEffectList.data().current_hp = getHp(); - statusEffectList.data().current_mp = getMp(); - statusEffectList.data().currentTp = getTp(); - statusEffectList.data().max_hp = getMaxHp(); - statusEffectList.data().max_mp = getMaxMp(); + auto statusEffectList = boost::make_shared< ZoneChannelPacket< FFXIVIpcStatusEffectList > >( getId() ); + statusEffectList->data().classId = static_cast< uint8_t >( getClass() ); + statusEffectList->data().level = getLevel(); + statusEffectList->data().level1 = getLevel(); + statusEffectList->data().current_hp = getHp(); + statusEffectList->data().current_mp = getMp(); + statusEffectList->data().currentTp = getTp(); + statusEffectList->data().max_hp = getMaxHp(); + statusEffectList->data().max_mp = getMaxMp(); uint8_t slot = 0; for( auto effectIt : m_statusEffectMap ) { float timeLeft = static_cast< float >( effectIt.second->getDuration() - ( currentTimeMs - effectIt.second->getStartTimeMs() ) ) / 1000; - statusEffectList.data().effect[slot].duration = timeLeft; - statusEffectList.data().effect[slot].effect_id = effectIt.second->getId(); - statusEffectList.data().effect[slot].sourceActorId = effectIt.second->getSrcActorId(); + statusEffectList->data().effect[slot].duration = timeLeft; + statusEffectList->data().effect[slot].effect_id = effectIt.second->getId(); + statusEffectList->data().effect[slot].sourceActorId = effectIt.second->getSrcActorId(); slot++; } @@ -739,13 +750,15 @@ void Core::Entity::Chara::updateStatusEffects() if( thisTickDmg != 0 ) { takeDamage( thisTickDmg ); - sendToInRangeSet( ActorControlPacket142( getId(), HPFloatingText, 0, static_cast< uint8_t >( ActionEffectType::Damage ), thisTickDmg ) ); + sendToInRangeSet( + boost::make_shared< ActorControlPacket142 >( getId(), HPFloatingText, 0, static_cast< uint8_t >( ActionEffectType::Damage ), thisTickDmg ) ); } if( thisTickHeal != 0 ) { heal( thisTickDmg ); - sendToInRangeSet( ActorControlPacket142( getId(), HPFloatingText, 0, static_cast< uint8_t >( ActionEffectType::Heal ), thisTickHeal ) ); + sendToInRangeSet( + boost::make_shared< ActorControlPacket142 >( getId(), HPFloatingText, 0, static_cast< uint8_t >( ActionEffectType::Heal ), thisTickHeal ) ); } } diff --git a/src/servers/sapphire_zone/Actor/EventObject.cpp b/src/servers/sapphire_zone/Actor/EventObject.cpp index 1f122ca0..d31e78ab 100644 --- a/src/servers/sapphire_zone/Actor/EventObject.cpp +++ b/src/servers/sapphire_zone/Actor/EventObject.cpp @@ -78,23 +78,27 @@ void Core::Entity::EventObject::setState( uint8_t state ) for( const auto& player : m_inRangePlayers ) { - ZoneChannelPacket< FFXIVIpcActorControl142 > eobjUpdatePacket( getId(), player->getId() ); + FFXIVPacketBasePtr packet = boost::make_shared< ZoneChannelPacket< FFXIVIpcActorControl142 > >( getId(), player->getId() ); + auto eobjUpdatePacket = dynamic_cast< ZoneChannelPacket< FFXIVIpcActorControl142 >& >( *packet ); + eobjUpdatePacket.data().category = Common::ActorControlType::DirectorEObjMod; eobjUpdatePacket.data().param1 = state; - player->queuePacket( eobjUpdatePacket ); + player->queuePacket( packet ); } } void Core::Entity::EventObject::setAnimationFlag( uint32_t flag, uint32_t animationFlag ) { for( const auto& player : m_inRangePlayers ) { - ZoneChannelPacket< FFXIVIpcActorControl142 > eobjUpdatePacket( getId(), player->getId() ); + FFXIVPacketBasePtr packet = boost::make_shared< ZoneChannelPacket< FFXIVIpcActorControl142 > >( getId(), player->getId() ); + auto eobjUpdatePacket = dynamic_cast< ZoneChannelPacket< FFXIVIpcActorControl142 >& >( *packet ); + eobjUpdatePacket.data().category = Common::ActorControlType::EObjAnimation; eobjUpdatePacket.data().param1 = flag; eobjUpdatePacket.data().param2 = animationFlag; - player->queuePacket( eobjUpdatePacket ); + player->queuePacket( packet ); } } @@ -117,7 +121,10 @@ void Core::Entity::EventObject::spawn( Core::Entity::PlayerPtr pTarget ) auto pLog = g_fw.get< Logger >(); pLog->debug( "Spawning EObj: id:" + std::to_string( getId() ) + " name:" + getName() ); - ZoneChannelPacket< FFXIVIpcObjectSpawn > eobjStatePacket( getId(), pTarget->getId() ); + + FFXIVPacketBasePtr packet = boost::make_shared< ZoneChannelPacket< FFXIVIpcObjectSpawn > >( getId(), pTarget->getId() ); + auto eobjStatePacket = dynamic_cast< ZoneChannelPacket< FFXIVIpcObjectSpawn >& >( *packet ); + eobjStatePacket.data().spawnIndex = spawnIndex; eobjStatePacket.data().objKind = getObjKind(); eobjStatePacket.data().state = getState(); @@ -127,7 +134,7 @@ void Core::Entity::EventObject::spawn( Core::Entity::PlayerPtr pTarget ) eobjStatePacket.data().scale = getScale(); eobjStatePacket.data().actorId = getId(); eobjStatePacket.data().rotation = Math::Util::floatToUInt16Rot( getRot() ); - pTarget->queuePacket( eobjStatePacket ); + pTarget->queuePacket( packet ); } diff --git a/src/servers/sapphire_zone/Actor/Player.cpp b/src/servers/sapphire_zone/Actor/Player.cpp index 1b1ed8a6..9fd0e496 100644 --- a/src/servers/sapphire_zone/Actor/Player.cpp +++ b/src/servers/sapphire_zone/Actor/Player.cpp @@ -204,12 +204,14 @@ uint64_t Core::Entity::Player::getOnlineStatusMask() const void Core::Entity::Player::prepareZoning( uint16_t targetZone, bool fadeOut, uint8_t fadeOutTime, uint16_t animation ) { - ZoneChannelPacket< FFXIVIpcPrepareZoning > preparePacket( getId() ); + FFXIVPacketBasePtr packet = boost::make_shared< ZoneChannelPacket< FFXIVIpcPrepareZoning > >( getId() ); + auto preparePacket = dynamic_cast< ZoneChannelPacket< FFXIVIpcPrepareZoning >& >( *packet ); + preparePacket.data().targetZone = targetZone; preparePacket.data().fadeOutTime = fadeOutTime; preparePacket.data().animation = animation; preparePacket.data().fadeOut = static_cast< uint8_t >( fadeOut ? 1 : 0 ); - queuePacket( preparePacket ); + queuePacket( packet ); } void Core::Entity::Player::calculateStats() @@ -271,29 +273,30 @@ bool Core::Entity::Player::isAutoattackOn() const void Core::Entity::Player::sendStats() { - ZoneChannelPacket< FFXIVIpcPlayerStats > statPacket( getId() ); - statPacket.data().strength = m_baseStats.str; - statPacket.data().dexterity = m_baseStats.dex; - statPacket.data().vitality = m_baseStats.vit; - statPacket.data().intelligence = m_baseStats.inte; - statPacket.data().mind = m_baseStats.mnd; - statPacket.data().piety = m_baseStats.pie; - statPacket.data().determination = m_baseStats.determination; - statPacket.data().hp = m_baseStats.max_hp; - statPacket.data().mp = m_baseStats.max_mp; - statPacket.data().accuracy = m_baseStats.accuracy; - statPacket.data().attack = m_baseStats.attack; - statPacket.data().attackMagicPotency = m_baseStats.attackPotMagic; - statPacket.data().healingMagicPotency = m_baseStats.healingPotMagic; - statPacket.data().skillSpeed = m_baseStats.skillSpeed; - statPacket.data().spellSpeed = m_baseStats.spellSpeed; - statPacket.data().spellSpeed1 = m_baseStats.spellSpeed; - statPacket.data().spellSpeedMod = 100; - statPacket.data().criticalHitRate = m_baseStats.spellSpeed; - statPacket.data().defense = m_baseStats.spellSpeed; - statPacket.data().magicDefense = m_baseStats.spellSpeed; - statPacket.data().attack = m_baseStats.spellSpeed; + auto statPacket = makeZonePacket< FFXIVIpcPlayerStats >( getId() ); + statPacket->data().strength = m_baseStats.str; + statPacket->data().dexterity = m_baseStats.dex; + statPacket->data().vitality = m_baseStats.vit; + statPacket->data().intelligence = m_baseStats.inte; + statPacket->data().mind = m_baseStats.mnd; + statPacket->data().piety = m_baseStats.pie; + statPacket->data().determination = m_baseStats.determination; + statPacket->data().hp = m_baseStats.max_hp; + statPacket->data().mp = m_baseStats.max_mp; + statPacket->data().accuracy = m_baseStats.accuracy; + statPacket->data().attack = m_baseStats.attack; + statPacket->data().attackMagicPotency = m_baseStats.attackPotMagic; + statPacket->data().healingMagicPotency = m_baseStats.healingPotMagic; + statPacket->data().skillSpeed = m_baseStats.skillSpeed; + statPacket->data().spellSpeed = m_baseStats.spellSpeed; + statPacket->data().spellSpeed1 = m_baseStats.spellSpeed; + statPacket->data().spellSpeedMod = 100; + + statPacket->data().criticalHitRate = m_baseStats.spellSpeed; + statPacket->data().defense = m_baseStats.spellSpeed; + statPacket->data().magicDefense = m_baseStats.spellSpeed; + statPacket->data().attack = m_baseStats.spellSpeed; queuePacket( statPacket ); } @@ -333,19 +336,19 @@ void Core::Entity::Player::teleport( uint16_t aetheryteId, uint8_t type ) if( type == 1 ) // teleport { prepareZoning( data->territory, true, 1, 112 ); // TODO: Really? - sendToInRangeSet( ActorControlPacket142( getId(), ActorDespawnEffect, 0x04 ) ); + sendToInRangeSet( boost::make_shared< ActorControlPacket142 >( getId(), ActorDespawnEffect, 0x04 ) ); setZoningType( Common::ZoneingType::Teleport ); } else if( type == 2 ) // aethernet { prepareZoning( data->territory, true, 1, 112 ); - sendToInRangeSet( ActorControlPacket142( getId(), ActorDespawnEffect, 0x04 ) ); + sendToInRangeSet( boost::make_shared< ActorControlPacket142 >( getId(), ActorDespawnEffect, 0x04 ) ); setZoningType( Common::ZoneingType::Teleport ); } else if( type == 3 ) // return { prepareZoning( data->territory, true, 1, 111 ); - sendToInRangeSet( ActorControlPacket142( getId(), ActorDespawnEffect, 0x03 ) ); + sendToInRangeSet( boost::make_shared< ActorControlPacket142 >( getId(), ActorDespawnEffect, 0x03 ) ); setZoningType( Common::ZoneingType::Return ); } @@ -471,7 +474,7 @@ void Core::Entity::Player::registerAetheryte( uint8_t aetheryteId ) Util::valueToFlagByteIndexValue( aetheryteId, value, index ); m_aetheryte[index] |= value; - queuePacket( ActorControlPacket143( getId(), LearnTeleport, aetheryteId, 1 ) ); + queuePacket( boost::make_shared< ActorControlPacket143 >( getId(), LearnTeleport, aetheryteId, 1 ) ); } bool Core::Entity::Player::isAetheryteRegistered( uint8_t aetheryteId ) const @@ -562,7 +565,7 @@ void Core::Entity::Player::learnAction( uint8_t actionId ) m_unlocks[index] |= value; - queuePacket( ActorControlPacket143( getId(), ToggleActionUnlock, actionId, 1 ) ); + queuePacket( boost::make_shared< ActorControlPacket143 >( getId(), ToggleActionUnlock, actionId, 1 ) ); } void Core::Entity::Player::learnSong( uint8_t songId, uint32_t itemId ) @@ -573,7 +576,7 @@ void Core::Entity::Player::learnSong( uint8_t songId, uint32_t itemId ) m_orchestrion[index] |= value; - queuePacket( ActorControlPacket143( getId(), ToggleOrchestrionUnlock, songId, 1, itemId ) ); + queuePacket( boost::make_shared< ActorControlPacket143 >( getId(), ToggleOrchestrionUnlock, songId, 1, itemId ) ); } bool Core::Entity::Player::isActionLearned( uint8_t actionId ) const @@ -597,11 +600,11 @@ void Core::Entity::Player::gainExp( uint32_t amount ) uint32_t neededExpToLevelplus1 = pExdData->get< Core::Data::ParamGrow >( level + 1 )->expToNext; - queuePacket( ActorControlPacket143( getId(), GainExpMsg, static_cast< uint8_t >( getClass() ), amount ) ); + queuePacket( boost::make_shared< ActorControlPacket143 >( getId(), GainExpMsg, static_cast< uint8_t >( getClass() ), amount ) ); if( level >= 70 ) // temporary fix for leveling over levelcap { - queuePacket( ActorControlPacket143( getId(), UpdateUiExp, static_cast< uint8_t >( getClass() ), amount ) ); + queuePacket( boost::make_shared< ActorControlPacket143 >( getId(), UpdateUiExp, static_cast< uint8_t >( getClass() ), amount ) ); return; } @@ -613,12 +616,12 @@ void Core::Entity::Player::gainExp( uint32_t amount ) ( currentExp + amount - neededExpToLevel ); setExp( amount ); gainLevel(); - queuePacket( ActorControlPacket143( getId(), UpdateUiExp, static_cast< uint8_t >( getClass() ), amount ) ); + queuePacket( boost::make_shared< ActorControlPacket143 >( getId(), UpdateUiExp, static_cast< uint8_t >( getClass() ), amount ) ); } else { - queuePacket( ActorControlPacket143( getId(), UpdateUiExp, static_cast< uint8_t >( getClass() ), currentExp + amount ) ); + queuePacket( boost::make_shared< ActorControlPacket143 >( getId(), UpdateUiExp, static_cast< uint8_t >( getClass() ), currentExp + amount ) ); setExp( currentExp + amount ); } @@ -636,34 +639,33 @@ void Core::Entity::Player::gainLevel() m_hp = getMaxHp(); m_mp = getMaxMp(); - ZoneChannelPacket< FFXIVIpcStatusEffectList > effectListPacket( getId() ); - effectListPacket.data().classId = static_cast< uint8_t > ( getClass() ); - effectListPacket.data().level1 = getLevel(); - effectListPacket.data().level = getLevel(); - effectListPacket.data().current_hp = getMaxHp(); - effectListPacket.data().current_mp = getMaxMp(); - effectListPacket.data().currentTp = 1000; - effectListPacket.data().max_hp = getMaxHp(); - effectListPacket.data().max_mp = getMaxMp(); + auto effectListPacket = makeZonePacket< FFXIVIpcStatusEffectList >( getId() ); + effectListPacket->data().classId = static_cast< uint8_t > ( getClass() ); + effectListPacket->data().level1 = getLevel(); + effectListPacket->data().level = getLevel(); + effectListPacket->data().current_hp = getMaxHp(); + effectListPacket->data().current_mp = getMaxMp(); + effectListPacket->data().currentTp = 1000; + effectListPacket->data().max_hp = getMaxHp(); + effectListPacket->data().max_mp = getMaxMp(); sendToInRangeSet( effectListPacket, true ); - sendToInRangeSet( ActorControlPacket142( getId(), LevelUpEffect, static_cast< uint8_t >( getClass() ), - getLevel(), getLevel() - 1 ), true ); + sendToInRangeSet( boost::make_shared< ActorControlPacket142 >( getId(), LevelUpEffect, static_cast< uint8_t >( getClass() ), + getLevel(), getLevel() - 1 ), true ); - - ZoneChannelPacket< FFXIVIpcUpdateClassInfo > classInfoPacket( getId() ); - classInfoPacket.data().classId = static_cast< uint8_t > ( getClass() ); - classInfoPacket.data().level1 = getLevel(); - classInfoPacket.data().level = getLevel(); - classInfoPacket.data().nextLevelIndex = getLevel(); - classInfoPacket.data().currentExp = getExp(); + auto classInfoPacket = makeZonePacket< FFXIVIpcUpdateClassInfo >( getId() ); + classInfoPacket->data().classId = static_cast< uint8_t > ( getClass() ); + classInfoPacket->data().level1 = getLevel(); + classInfoPacket->data().level = getLevel(); + classInfoPacket->data().nextLevelIndex = getLevel(); + classInfoPacket->data().currentExp = getExp(); queuePacket( classInfoPacket ); } void Core::Entity::Player::sendStatusUpdate( bool toSelf ) { - sendToInRangeSet( UpdateHpMpTpPacket( *this ), true ); + sendToInRangeSet( boost::make_shared< UpdateHpMpTpPacket >( *this ), true ); } uint8_t Core::Entity::Player::getLevel() const @@ -717,12 +719,12 @@ void Core::Entity::Player::setClassJob( Common::ClassJob classJob ) m_tp = 0; - ZoneChannelPacket< FFXIVIpcPlayerClassInfo > classInfoPacket( getId() ); - classInfoPacket.data().classId = static_cast< uint8_t >( getClass() ); - classInfoPacket.data().level = getLevel(); + auto classInfoPacket = makeZonePacket< FFXIVIpcPlayerClassInfo >( getId() ); + classInfoPacket->data().classId = static_cast< uint8_t >( getClass() ); + classInfoPacket->data().level = getLevel(); queuePacket( classInfoPacket ); - sendToInRangeSet( ActorControlPacket142( getId(), ClassJobChange, 0x04 ), true ); + sendToInRangeSet( boost::make_shared< ActorControlPacket142 >( getId(), ClassJobChange, 0x04 ), true ); sendStatusUpdate( true ); } @@ -747,8 +749,7 @@ void Core::Entity::Player::setLevelForClass( uint8_t level, Common::ClassJob cla void Core::Entity::Player::sendModel() { - ModelEquipPacket modelEquip( *getAsPlayer() ); - sendToInRangeSet( modelEquip, true ); + sendToInRangeSet( boost::make_shared< ModelEquipPacket >( *getAsPlayer() ), true ); } uint32_t Core::Entity::Player::getModelForSlot( Inventory::EquipSlot slot ) @@ -816,8 +817,7 @@ void Core::Entity::Player::spawn( Entity::PlayerPtr pTarget ) getName() + " for " + pTarget->getName() ); - PlayerSpawnPacket spawnActor( *getAsPlayer(), *pTarget ); - pTarget->queuePacket( spawnActor ); + pTarget->queuePacket( boost::make_shared< PlayerSpawnPacket >( *getAsPlayer(), *pTarget ) ); } // despawn @@ -829,7 +829,7 @@ void Core::Entity::Player::despawn( Entity::PlayerPtr pTarget ) pPlayer->freePlayerSpawnId( getId() ); - pPlayer->queuePacket( ActorControlPacket143( getId(), DespawnZoneScreenMsg, 0x04, getId(), 0x01 ) ); + pPlayer->queuePacket( boost::make_shared< ActorControlPacket143 >( getId(), DespawnZoneScreenMsg, 0x04, getId(), 0x01 ) ); } Core::Entity::ActorPtr Core::Entity::Player::lookupTargetById( uint64_t targetId ) @@ -863,11 +863,11 @@ void Core::Entity::Player::setGc( uint8_t gc ) { m_gc = gc; - ZoneChannelPacket< FFXIVGCAffiliation > gcAffPacket( getId() ); - gcAffPacket.data().gcId = m_gc; - gcAffPacket.data().gcRank[0] = m_gcRank[0]; - gcAffPacket.data().gcRank[1] = m_gcRank[1]; - gcAffPacket.data().gcRank[2] = m_gcRank[2]; + auto gcAffPacket = makeZonePacket< FFXIVGCAffiliation >( getId() ); + gcAffPacket->data().gcId = m_gc; + gcAffPacket->data().gcRank[0] = m_gcRank[0]; + gcAffPacket->data().gcRank[1] = m_gcRank[1]; + gcAffPacket->data().gcRank[2] = m_gcRank[2]; queuePacket( gcAffPacket ); } @@ -875,11 +875,11 @@ void Core::Entity::Player::setGcRankAt( uint8_t index, uint8_t rank ) { m_gcRank[index] = rank; - ZoneChannelPacket< FFXIVGCAffiliation > gcAffPacket( getId() ); - gcAffPacket.data().gcId = m_gc; - gcAffPacket.data().gcRank[0] = m_gcRank[0]; - gcAffPacket.data().gcRank[1] = m_gcRank[1]; - gcAffPacket.data().gcRank[2] = m_gcRank[2]; + auto gcAffPacket = makeZonePacket< FFXIVGCAffiliation >( getId() ); + gcAffPacket->data().gcId = m_gc; + gcAffPacket->data().gcRank[0] = m_gcRank[0]; + gcAffPacket->data().gcRank[1] = m_gcRank[1]; + gcAffPacket->data().gcRank[2] = m_gcRank[2]; queuePacket( gcAffPacket ); } @@ -925,8 +925,8 @@ void Core::Entity::Player::setStateFlag( Common::PlayerStateFlag flag ) auto newOnlineStatus = getOnlineStatus(); if( prevOnlineStatus != newOnlineStatus ) - sendToInRangeSet( ActorControlPacket142( getId(), SetStatusIcon, - static_cast< uint8_t >( getOnlineStatus() ) ), true ); + sendToInRangeSet( boost::make_shared< ActorControlPacket142 >( getId(), SetStatusIcon, + static_cast< uint8_t >( getOnlineStatus() ) ), true ); } @@ -940,7 +940,7 @@ void Core::Entity::Player::setStateFlags( std::vector< Common::PlayerStateFlag > void Core::Entity::Player::sendStateFlags() { - queuePacket( PlayerStateFlagsPacket( *getAsPlayer() ) ); + queuePacket( boost::make_shared< PlayerStateFlagsPacket >( *getAsPlayer() ) ); } void Core::Entity::Player::unsetStateFlag( Common::PlayerStateFlag flag ) @@ -962,8 +962,8 @@ void Core::Entity::Player::unsetStateFlag( Common::PlayerStateFlag flag ) auto newOnlineStatus = getOnlineStatus(); if( prevOnlineStatus != newOnlineStatus ) - sendToInRangeSet( ActorControlPacket142( getId(), SetStatusIcon, - static_cast< uint8_t >( getOnlineStatus() ) ), true ); + sendToInRangeSet( boost::make_shared< ActorControlPacket142 >( getId(), SetStatusIcon, + static_cast< uint8_t >( getOnlineStatus() ) ), true ); } void Core::Entity::Player::update( int64_t currTime ) @@ -979,12 +979,12 @@ void Core::Entity::Player::update( int64_t currTime ) } else { - ZoneChannelPacket< FFXIVIpcActorSetPos > setActorPosPacket( getId() ); - setActorPosPacket.data().r16 = Math::Util::floatToUInt16Rot( m_queuedZoneing->m_targetRotation ); - setActorPosPacket.data().waitForLoad = 0x04; - setActorPosPacket.data().x = targetPos.x; - setActorPosPacket.data().y = targetPos.y; - setActorPosPacket.data().z = targetPos.z; + auto setActorPosPacket = makeZonePacket< FFXIVIpcActorSetPos >( getId() ); + setActorPosPacket->data().r16 = Math::Util::floatToUInt16Rot( m_queuedZoneing->m_targetRotation ); + setActorPosPacket->data().waitForLoad = 0x04; + setActorPosPacket->data().x = targetPos.x; + setActorPosPacket->data().y = targetPos.y; + setActorPosPacket->data().z = targetPos.z; sendToInRangeSet( setActorPosPacket, true ); setPos( targetPos ); } @@ -1059,9 +1059,9 @@ void Core::Entity::Player::freePlayerSpawnId( uint32_t actorId ) { auto spawnId = m_actorSpawnIndexAllocator.freeUsedSpawnIndex( actorId ); - ZoneChannelPacket< FFXIVIpcActorFreeSpawn > freeActorSpawnPacket( getId() ); - freeActorSpawnPacket.data().actorId = actorId; - freeActorSpawnPacket.data().spawnId = spawnId; + auto freeActorSpawnPacket = makeZonePacket< FFXIVIpcActorFreeSpawn >( getId() ); + freeActorSpawnPacket->data().actorId = actorId; + freeActorSpawnPacket->data().spawnId = spawnId; queuePacket( freeActorSpawnPacket ); } @@ -1076,7 +1076,7 @@ void Core::Entity::Player::setHomepoint( uint8_t aetheryteId ) { m_homePoint = aetheryteId; - queuePacket( ActorControlPacket143( getId(), SetHomepoint, aetheryteId ) ); + queuePacket( boost::make_shared< ActorControlPacket143 >( getId(), SetHomepoint, aetheryteId ) ); } /*! get homepoint */ @@ -1160,7 +1160,7 @@ const uint8_t* Core::Entity::Player::getGcRankArray() const return m_gcRank; } -void Core::Entity::Player::queuePacket( Network::Packets::GamePacketPtr pPacket ) +void Core::Entity::Player::queuePacket( Network::Packets::FFXIVPacketBasePtr pPacket ) { auto pServerZone = g_fw.get< ServerZone >(); auto pSession = pServerZone->getSession( m_id ); @@ -1175,7 +1175,7 @@ void Core::Entity::Player::queuePacket( Network::Packets::GamePacketPtr pPacket } -void Core::Entity::Player::queueChatPacket( Network::Packets::GamePacketPtr pPacket ) +void Core::Entity::Player::queueChatPacket( Network::Packets::FFXIVPacketBasePtr pPacket ) { auto pServerZone = g_fw.get< ServerZone >(); auto pSession = pServerZone->getSession( m_id ); @@ -1248,17 +1248,17 @@ uint8_t Core::Entity::Player::getSearchSelectClass() const void Core::Entity::Player::sendNotice( const std::string& message ) //Purple Text { - queuePacket( ServerNoticePacket( getId(), message ) ); + queuePacket( boost::make_shared< ServerNoticePacket >( getId(), message ) ); } void Core::Entity::Player::sendUrgent( const std::string& message ) //Red Text { - queuePacket( ChatPacket( *getAsPlayer(), ChatType::ServerUrgent, message ) ); + queuePacket( boost::make_shared< ChatPacket >( *getAsPlayer(), ChatType::ServerUrgent, message ) ); } void Core::Entity::Player::sendDebug( const std::string& message ) //Grey Text { - queuePacket( ChatPacket( *getAsPlayer(), ChatType::ServerDebug, message ) ); + queuePacket( boost::make_shared< ChatPacket >( *getAsPlayer(), ChatType::ServerDebug, message ) ); } void Core::Entity::Player::updateHowtosSeen( uint32_t howToId ) @@ -1280,13 +1280,13 @@ void Core::Entity::Player::initHateSlotQueue() void Core::Entity::Player::sendHateList() { - ZoneChannelPacket< FFXIVIpcHateList > hateListPacket( getId() ); - hateListPacket.data().numEntries = m_actorIdTohateSlotMap.size(); + auto hateListPacket = makeZonePacket< FFXIVIpcHateList >( getId() ); + hateListPacket->data().numEntries = m_actorIdTohateSlotMap.size(); auto it = m_actorIdTohateSlotMap.begin(); for( int32_t i = 0; it != m_actorIdTohateSlotMap.end(); ++it, i++ ) { - hateListPacket.data().entry[i].actorId = it->first; - hateListPacket.data().entry[i].hatePercent = 100; + hateListPacket->data().entry[i].actorId = it->first; + hateListPacket->data().entry[i].hatePercent = 100; } queuePacket( hateListPacket ); } @@ -1336,14 +1336,14 @@ void Core::Entity::Player::setTitle( uint16_t titleId ) m_activeTitle = titleId; - sendToInRangeSet( ActorControlPacket142( getId(), SetTitle, titleId ), true ); + sendToInRangeSet( boost::make_shared< ActorControlPacket142 >( getId(), SetTitle, titleId ), true ); } void Core::Entity::Player::setEquipDisplayFlags( uint8_t state ) { m_equipDisplayFlags = state; - ZoneChannelPacket< FFXIVIpcEquipDisplayFlags > paramPacket( getId() ); - paramPacket.data().bitmask = m_equipDisplayFlags; + auto paramPacket = makeZonePacket< FFXIVIpcEquipDisplayFlags >( getId() ); + paramPacket->data().bitmask = m_equipDisplayFlags; sendToInRangeSet( paramPacket, true ); } @@ -1355,19 +1355,19 @@ uint8_t Core::Entity::Player::getEquipDisplayFlags() const void Core::Entity::Player::mount( uint32_t id ) { m_mount = id; - sendToInRangeSet( ActorControlPacket142( getId(), ActorControlType::SetStatus, static_cast< uint8_t >( Entity::Chara::ActorStatus::Mounted )), true ); - sendToInRangeSet( ActorControlPacket143( getId(), 0x39e, 12 ), true ); //? + sendToInRangeSet( boost::make_shared< ActorControlPacket142 >( getId(), ActorControlType::SetStatus, static_cast< uint8_t >( Entity::Chara::ActorStatus::Mounted )), true ); + sendToInRangeSet( boost::make_shared< ActorControlPacket143 >( getId(), 0x39e, 12 ), true ); //? - ZoneChannelPacket< FFXIVIpcMount > mountPacket( getId() ); - mountPacket.data().id = id; + auto mountPacket = makeZonePacket< FFXIVIpcMount >( getId() ); + mountPacket->data().id = id; sendToInRangeSet( mountPacket, true ); } void Core::Entity::Player::dismount() { - sendToInRangeSet( ActorControlPacket142( getId(), ActorControlType::SetStatus, - static_cast< uint8_t >( Entity::Chara::ActorStatus::Idle )), true ); - sendToInRangeSet( ActorControlPacket143( getId(), ActorControlType::Dismount, 1 ), true ); + sendToInRangeSet( boost::make_shared< ActorControlPacket142 >( getId(), ActorControlType::SetStatus, + static_cast< uint8_t >( Entity::Chara::ActorStatus::Idle )), true ); + sendToInRangeSet( boost::make_shared< ActorControlPacket143 >( getId(), ActorControlType::Dismount, 1 ), true ); m_mount = 0; } @@ -1391,41 +1391,41 @@ void Core::Entity::Player::autoAttack( CharaPtr pTarget ) if( getClass() == ClassJob::Machinist || getClass() == ClassJob::Bard || getClass() == ClassJob::Archer ) { - ZoneChannelPacket< FFXIVIpcEffect > effectPacket( getId() ); - effectPacket.data().targetId = pTarget->getId(); - effectPacket.data().actionAnimationId = 8; + auto effectPacket = makeZonePacket< FFXIVIpcEffect >( getId() ); + effectPacket->data().targetId = pTarget->getId(); + effectPacket->data().actionAnimationId = 8; // effectPacket.data().unknown_2 = variation; - effectPacket.data().numEffects = 1; - effectPacket.data().unknown_61 = 1; - effectPacket.data().unknown_62 = 1; - effectPacket.data().actionTextId = 8; - effectPacket.data().rotation = Math::Util::floatToUInt16Rot( getRot() ); - effectPacket.data().effectTargetId = pTarget->getId(); - effectPacket.data().effectTarget = pTarget->getId(); - effectPacket.data().effects[0].value = damage; - effectPacket.data().effects[0].effectType = Common::ActionEffectType::Damage; - effectPacket.data().effects[0].hitSeverity = Common::ActionHitSeverityType::NormalDamage; - effectPacket.data().effects[0].unknown_3 = 7; + effectPacket->data().numEffects = 1; + effectPacket->data().unknown_61 = 1; + effectPacket->data().unknown_62 = 1; + effectPacket->data().actionTextId = 8; + effectPacket->data().rotation = Math::Util::floatToUInt16Rot( getRot() ); + effectPacket->data().effectTargetId = pTarget->getId(); + effectPacket->data().effectTarget = pTarget->getId(); + effectPacket->data().effects[0].value = damage; + effectPacket->data().effects[0].effectType = Common::ActionEffectType::Damage; + effectPacket->data().effects[0].hitSeverity = Common::ActionHitSeverityType::NormalDamage; + effectPacket->data().effects[0].unknown_3 = 7; sendToInRangeSet(effectPacket, true); } else { - ZoneChannelPacket< FFXIVIpcEffect > effectPacket( getId() ); - effectPacket.data().targetId = pTarget->getId(); - effectPacket.data().actionAnimationId = 7; + auto effectPacket = makeZonePacket< FFXIVIpcEffect >( getId() ); + effectPacket->data().targetId = pTarget->getId(); + effectPacket->data().actionAnimationId = 7; // effectPacket.data().unknown_2 = variation; - effectPacket.data().numEffects = 1; - effectPacket.data().unknown_61 = 1; - effectPacket.data().unknown_62 = 1; - effectPacket.data().actionTextId = 7; - effectPacket.data().rotation = Math::Util::floatToUInt16Rot( getRot() ); - effectPacket.data().effectTarget = pTarget->getId(); - effectPacket.data().effects[0].value = damage; - effectPacket.data().effects[0].effectType = Common::ActionEffectType::Damage; - effectPacket.data().effects[0].hitSeverity = Common::ActionHitSeverityType::NormalDamage; - effectPacket.data().effects[0].unknown_3 = 71; + effectPacket->data().numEffects = 1; + effectPacket->data().unknown_61 = 1; + effectPacket->data().unknown_62 = 1; + effectPacket->data().actionTextId = 7; + effectPacket->data().rotation = Math::Util::floatToUInt16Rot( getRot() ); + effectPacket->data().effectTarget = pTarget->getId(); + effectPacket->data().effects[0].value = damage; + effectPacket->data().effects[0].effectType = Common::ActionEffectType::Damage; + effectPacket->data().effects[0].hitSeverity = Common::ActionHitSeverityType::NormalDamage; + effectPacket->data().effects[0].unknown_3 = 71; sendToInRangeSet(effectPacket, true); } @@ -1486,8 +1486,8 @@ uint16_t Core::Entity::Player::getItemLevel() const void Core::Entity::Player::setEorzeaTimeOffset( uint64_t timestamp ) { // TODO: maybe change to persistent? - ZoneChannelPacket< FFXIVIpcEorzeaTimeOffset > packet ( getId() ); - packet.data().timestamp = timestamp; + auto packet = makeZonePacket< FFXIVIpcEorzeaTimeOffset >( getId() ); + packet->data().timestamp = timestamp; // Send to single player queuePacket( packet ); @@ -1507,15 +1507,15 @@ void Core::Entity::Player::sendZonePackets() { getCurrentZone()->onBeforePlayerZoneIn( *this ); - ZoneChannelPacket< FFXIVIpcInit > initPacket( getId() ); - initPacket.data().charId = getId(); + auto initPacket = makeZonePacket< FFXIVIpcInit >( getId() ); + initPacket->data().charId = getId(); queuePacket( initPacket ); sendInventory(); if( isLogin() ) { - queuePacket( ActorControlPacket143( getId(), SetCharaGearParamUI, m_equipDisplayFlags, 1 ) ); + queuePacket( boost::make_shared< ActorControlPacket143 >( getId(), SetCharaGearParamUI, m_equipDisplayFlags, 1 ) ); } // set flags, will be reset automatically by zoning ( only on client side though ) @@ -1527,45 +1527,45 @@ void Core::Entity::Player::sendZonePackets() // only initialize the UI if the player in fact just logged in. if( isLogin() ) { - ZoneChannelPacket< FFXIVIpcCFAvailableContents > contentFinderList( getId() ); - for( auto i = 0; i < sizeof( contentFinderList.data().contents ); i++ ) + auto contentFinderList = makeZonePacket< FFXIVIpcCFAvailableContents >( getId() ); + + for( auto i = 0; i < sizeof( contentFinderList->data().contents ); i++ ) { // unlock all contents for now - contentFinderList.data().contents[i] = 0xFF; + contentFinderList->data().contents[i] = 0xFF; } queuePacket( contentFinderList ); - Server::InitUIPacket initUIPacket( *this ); - queuePacket( initUIPacket ); + queuePacket( boost::make_shared< InitUIPacket >( *this ) ); - ZoneChannelPacket< FFXIVIpcPlayerClassInfo > classInfoPacket( getId() ); - classInfoPacket.data().classId = static_cast< uint8_t >( getClass() ); - classInfoPacket.data().unknown = 1; - classInfoPacket.data().level = getLevel(); - classInfoPacket.data().level1 = getLevel(); + auto classInfoPacket = makeZonePacket< FFXIVIpcPlayerClassInfo >( getId() ); + classInfoPacket->data().classId = static_cast< uint8_t >( getClass() ); + classInfoPacket->data().unknown = 1; + classInfoPacket->data().level = getLevel(); + classInfoPacket->data().level1 = getLevel(); queuePacket( classInfoPacket ); m_itemLevel = getInventory()->calculateEquippedGearItemLevel(); sendItemLevel(); } - ZoneChannelPacket< FFXIVIpcInitZone > initZonePacket( getId() ); - initZonePacket.data().zoneId = getCurrentZone()->getTerritoryId(); - initZonePacket.data().weatherId = static_cast< uint8_t >( getCurrentZone()->getCurrentWeather() ); - initZonePacket.data().bitmask = 0x1; - initZonePacket.data().unknown5 = 0x2A; - initZonePacket.data().festivalId = getCurrentZone()->getCurrentFestival(); - initZonePacket.data().pos.x = getPos().x; - initZonePacket.data().pos.y = getPos().y; - initZonePacket.data().pos.z = getPos().z; + auto initZonePacket = makeZonePacket< FFXIVIpcInitZone >( getId() ); + initZonePacket->data().zoneId = getCurrentZone()->getTerritoryId(); + initZonePacket->data().weatherId = static_cast< uint8_t >( getCurrentZone()->getCurrentWeather() ); + initZonePacket->data().bitmask = 0x1; + initZonePacket->data().unknown5 = 0x2A; + initZonePacket->data().festivalId = getCurrentZone()->getCurrentFestival(); + initZonePacket->data().pos.x = getPos().x; + initZonePacket->data().pos.y = getPos().y; + initZonePacket->data().pos.z = getPos().z; queuePacket( initZonePacket ); if( isLogin() ) { - ZoneChannelPacket< FFXIVARR_IPC_UNK322 > unk322( getId() ); + auto unk322 = makeZonePacket< FFXIVARR_IPC_UNK322 >( getId() ); queuePacket( unk322 ); - ZoneChannelPacket< FFXIVARR_IPC_UNK320 > unk320( getId() ); + auto unk320 = makeZonePacket< FFXIVARR_IPC_UNK320 >( getId() ); queuePacket( unk320 ); } @@ -1589,16 +1589,16 @@ bool Core::Entity::Player::isDirectorInitialized() const void Core::Entity::Player::sendTitleList() { - ZoneChannelPacket< FFXIVIpcPlayerTitleList > titleListPacket( getId() ); - memcpy( titleListPacket.data().titleList, getTitleList(), sizeof( titleListPacket.data().titleList ) ); + auto titleListPacket = makeZonePacket< FFXIVIpcPlayerTitleList >( getId() ); + memcpy( titleListPacket->data().titleList, getTitleList(), sizeof( titleListPacket->data().titleList ) ); queuePacket( titleListPacket ); } void Core::Entity::Player::sendZoneInPackets( uint32_t param1, uint32_t param2 = 0, uint32_t param3 = 0, uint32_t param4 = 0, bool shouldSetStatus = false ) { - auto zoneInPacket = ActorControlPacket143( getId(), ZoneIn, param1, param2, param3, param4 ); - auto SetStatusPacket = ActorControlPacket142( getId(), SetStatus, static_cast< uint8_t >( Entity::Chara::ActorStatus::Idle ) ); + auto zoneInPacket = boost::make_shared< ActorControlPacket143 >( getId(), ZoneIn, param1, param2, param3, param4 ); + auto SetStatusPacket = boost::make_shared< ActorControlPacket142 >( getId(), SetStatus, static_cast< uint8_t >( Entity::Chara::ActorStatus::Idle ) ); if( !getGmInvis() ) sendToInRangeSet( zoneInPacket, true ); @@ -1647,7 +1647,7 @@ void Core::Entity::Player::finishZoning() void Core::Entity::Player::emote( uint32_t emoteId, uint64_t targetId ) { - sendToInRangeSet( ActorControlPacket144( getId(), ActorControlType::Emote, emoteId, 0, 0, 0, targetId ) ); + sendToInRangeSet( boost::make_shared< ActorControlPacket144 >( getId(), ActorControlType::Emote, emoteId, 0, 0, 0, targetId ) ); } void Core::Entity::Player::teleportQuery( uint16_t aetheryteId ) @@ -1670,7 +1670,7 @@ void Core::Entity::Player::teleportQuery( uint16_t aetheryteId ) bool insufficientGil = getCurrency( Inventory::CurrencyType::Gil ) < cost; // TODO: figure out what param1 really does - queuePacket( ActorControlPacket143( getId(), TeleportStart, insufficientGil ? 2 : 0, aetheryteId ) ); + queuePacket( boost::make_shared< ActorControlPacket143 >( getId(), TeleportStart, insufficientGil ? 2 : 0, aetheryteId ) ); if( !insufficientGil ) { @@ -1695,8 +1695,8 @@ void Core::Entity::Player::freeObjSpawnIndexForActorId( uint32_t actorId ) { auto spawnId = m_objSpawnIndexAllocator.freeUsedSpawnIndex( actorId ); - ZoneChannelPacket< FFXIVIpcObjectDespawn > freeObjectSpawnPacket( getId() ); - freeObjectSpawnPacket.data().spawnIndex = spawnId; + auto freeObjectSpawnPacket = makeZonePacket< FFXIVIpcObjectDespawn >( getId() ); + freeObjectSpawnPacket->data().spawnIndex = spawnId; queuePacket( freeObjectSpawnPacket ); } diff --git a/src/servers/sapphire_zone/Actor/Player.h b/src/servers/sapphire_zone/Actor/Player.h index 46a10dbe..9e6b5ecd 100644 --- a/src/servers/sapphire_zone/Actor/Player.h +++ b/src/servers/sapphire_zone/Actor/Player.h @@ -495,9 +495,9 @@ public: /*! send a quest specific message */ void sendQuestMessage( uint32_t questId, int8_t msgId, uint8_t type, uint32_t var1, uint32_t var2 ); /*! queue a packet for the player */ - void queuePacket( Network::Packets::GamePacketPtr pPacket ); + void queuePacket( Network::Packets::FFXIVPacketBasePtr pPacket ); /*! queue a char connection packet for the player */ - void queueChatPacket( Network::Packets::GamePacketPtr pPacket ); + void queueChatPacket( Network::Packets::FFXIVPacketBasePtr pPacket ); /*! returns true if loading is complete ( 0x69 has been received ) */ bool isLoadingComplete() const; /*! set the loading complete bool */ diff --git a/src/servers/sapphire_zone/Actor/PlayerEvent.cpp b/src/servers/sapphire_zone/Actor/PlayerEvent.cpp index ab79db49..c4af5c0b 100644 --- a/src/servers/sapphire_zone/Actor/PlayerEvent.cpp +++ b/src/servers/sapphire_zone/Actor/PlayerEvent.cpp @@ -85,8 +85,8 @@ void Core::Entity::Player::directorPlayScene( uint32_t eventId, uint32_t scene, pEvent->setPlayedScene( true ); pEvent->setEventReturnCallback( nullptr ); - DirectorPlayScenePacket eventPlay( getId(), getId(), pEvent->getId(), - scene, flags, eventParam3, eventParam4, eventParam5 ); + auto eventPlay = boost::make_shared< DirectorPlayScenePacket >( getId(), getId(), pEvent->getId(), + scene, flags, eventParam3, eventParam4, eventParam5 ); queuePacket( eventPlay ); } @@ -102,7 +102,8 @@ void Core::Entity::Player::eventStart( uint64_t actorId, uint32_t eventId, setStateFlag( PlayerStateFlag::InNpcEvent ); - EventStartPacket eventStart( getId(), actorId, eventId, eventType, eventParam1, eventParam2 ); + auto eventStart = boost::make_shared< EventStartPacket >( getId(), actorId, eventId, + eventType, eventParam1, eventParam2 ); queuePacket( eventStart ); @@ -166,8 +167,8 @@ void Core::Entity::Player::playScene( uint32_t eventId, uint32_t scene, pEvent->setPlayedScene( true ); pEvent->setEventReturnCallback( eventCallback ); pEvent->setSceneChainCallback( nullptr ); - EventPlayPacket eventPlay( getId(), pEvent->getActorId(), pEvent->getId(), - scene, flags, eventParam2, eventParam3, eventParam4 ); + auto eventPlay = boost::make_shared< EventPlayPacket >( getId(), pEvent->getActorId(), pEvent->getId(), + scene, flags, eventParam2, eventParam3, eventParam4 ); queuePacket( eventPlay ); } @@ -183,8 +184,8 @@ void Core::Entity::Player::playSceneChain( uint32_t eventId, uint32_t scene, uin pEvent->setPlayedScene( true ); pEvent->setSceneChainCallback( sceneChainCallback ); pEvent->setEventReturnCallback( nullptr ); - EventPlayPacket eventPlay( getId(), pEvent->getActorId(), pEvent->getId(), - scene, flags, eventParam2, eventParam3, eventParam4 ); + auto eventPlay = boost::make_shared< EventPlayPacket >( getId(), pEvent->getActorId(), pEvent->getId(), + scene, flags, eventParam2, eventParam3, eventParam4 ); queuePacket( eventPlay ); } @@ -223,7 +224,8 @@ void Core::Entity::Player::eventFinish( uint32_t eventId, uint32_t freePlayer ) { case Event::EventHandler::Nest: { - queuePacket( EventFinishPacket( getId(), pEvent->getId(), pEvent->getEventType(), pEvent->getEventParam() ) ); + queuePacket( boost::make_shared< EventFinishPacket >( getId(), pEvent->getId(), + pEvent->getEventType(), pEvent->getEventParam() ) ); removeEvent( pEvent->getId() ); auto events = eventList(); @@ -234,8 +236,8 @@ void Core::Entity::Player::eventFinish( uint32_t eventId, uint32_t freePlayer ) if( it.second->hasPlayedScene() == false ) { // TODO: not happy with this, this is also prone to break wit more than one remaining event in there - queuePacket( EventFinishPacket( getId(), it.second->getId(), it.second->getEventType(), - it.second->getEventParam() ) ); + queuePacket( boost::make_shared< EventFinishPacket >( getId(), it.second->getId(), + it.second->getEventType(), it.second->getEventParam() ) ); removeEvent( it.second->getId() ); } } @@ -244,7 +246,8 @@ void Core::Entity::Player::eventFinish( uint32_t eventId, uint32_t freePlayer ) } default: { - queuePacket( EventFinishPacket( getId(), pEvent->getId(), pEvent->getEventType(), pEvent->getEventParam() ) ); + queuePacket( boost::make_shared< EventFinishPacket >( getId(), pEvent->getId(), + pEvent->getEventType(), pEvent->getEventParam() ) ); break; } } diff --git a/src/servers/sapphire_zone/Actor/PlayerInventory.cpp b/src/servers/sapphire_zone/Actor/PlayerInventory.cpp index 9cf412ca..e7d0df6d 100644 --- a/src/servers/sapphire_zone/Actor/PlayerInventory.cpp +++ b/src/servers/sapphire_zone/Actor/PlayerInventory.cpp @@ -26,7 +26,7 @@ Core::InventoryPtr Core::Entity::Player::getInventory() const void Core::Entity::Player::sendItemLevel() { - queuePacket( ActorControlPacket142( getId(), SetItemLevel, getItemLevel(), 0 ) ); + queuePacket( boost::make_shared< ActorControlPacket142 >( getId(), SetItemLevel, getItemLevel(), 0 ) ); } // TODO: This has to be redone and simplified @@ -145,11 +145,11 @@ void Core::Entity::Player::addCurrency( uint8_t type, uint32_t amount ) if( !m_pInventory->addCurrency( static_cast< Inventory::CurrencyType >( type ), amount ) ) return; - ZoneChannelPacket< FFXIVIpcUpdateInventorySlot > invUpPacket( getId() ); - invUpPacket.data().containerId = Inventory::InventoryType::Currency; - invUpPacket.data().catalogId = 1; - invUpPacket.data().quantity = m_pInventory->getCurrency( static_cast< Inventory::CurrencyType >( type ) ); - invUpPacket.data().slot = static_cast< uint8_t >( type ) - 1; + auto invUpPacket = makeZonePacket< FFXIVIpcUpdateInventorySlot >( getId() ); + invUpPacket->data().containerId = Inventory::InventoryType::Currency; + invUpPacket->data().catalogId = 1; + invUpPacket->data().quantity = m_pInventory->getCurrency( static_cast< Inventory::CurrencyType >( type ) ); + invUpPacket->data().slot = static_cast< uint8_t >( type ) - 1; queuePacket( invUpPacket ); } @@ -159,11 +159,11 @@ void Core::Entity::Player::removeCurrency( uint8_t type, uint32_t amount ) if( !m_pInventory->removeCurrency( static_cast< Inventory::CurrencyType >( type ), amount ) ) return; - ZoneChannelPacket< FFXIVIpcUpdateInventorySlot > invUpPacket( getId() ); - invUpPacket.data().containerId = Inventory::InventoryType::Currency; - invUpPacket.data().catalogId = 1; - invUpPacket.data().quantity = m_pInventory->getCurrency( static_cast< Inventory::CurrencyType >( type ) ); - invUpPacket.data().slot = static_cast< uint8_t >( type ) - 1; + auto invUpPacket = makeZonePacket< FFXIVIpcUpdateInventorySlot >( getId() ); + invUpPacket->data().containerId = Inventory::InventoryType::Currency; + invUpPacket->data().catalogId = 1; + invUpPacket->data().quantity = m_pInventory->getCurrency( static_cast< Inventory::CurrencyType >( type ) ); + invUpPacket->data().slot = static_cast< uint8_t >( type ) - 1; queuePacket( invUpPacket ); } @@ -179,15 +179,16 @@ void Core::Entity::Player::addCrystal( uint8_t type, uint32_t amount ) if( !m_pInventory->addCrystal( static_cast< Inventory::CrystalType >( type ), amount ) ) return; - ZoneChannelPacket< FFXIVIpcUpdateInventorySlot > invUpPacket( getId() ); - invUpPacket.data().containerId = Inventory::InventoryType::Crystal; - invUpPacket.data().catalogId = static_cast< uint8_t >( type ) + 1; - invUpPacket.data().quantity = m_pInventory->getCrystal( static_cast< Inventory::CrystalType >( type ) ); - invUpPacket.data().slot = static_cast< uint8_t >( type ) - 1; + auto invUpPacket = makeZonePacket< FFXIVIpcUpdateInventorySlot >( getId() ); + invUpPacket->data().containerId = Inventory::InventoryType::Crystal; + invUpPacket->data().catalogId = static_cast< uint8_t >( type ) + 1; + invUpPacket->data().quantity = m_pInventory->getCrystal( static_cast< Inventory::CrystalType >( type ) ); + invUpPacket->data().slot = static_cast< uint8_t >( type ) - 1; queuePacket( invUpPacket ); - queuePacket( ActorControlPacket143( getId(), ItemObtainIcon, static_cast< uint8_t >( type ) + 1, amount ) ); + queuePacket( boost::make_shared< ActorControlPacket143 >( getId(), ItemObtainIcon, + static_cast< uint8_t >( type ) + 1, amount ) ); } void Core::Entity::Player::removeCrystal( uint8_t type, uint32_t amount ) @@ -195,11 +196,11 @@ void Core::Entity::Player::removeCrystal( uint8_t type, uint32_t amount ) if( !m_pInventory->removeCrystal( static_cast< Inventory::CrystalType >( type ), amount ) ) return; - ZoneChannelPacket< FFXIVIpcUpdateInventorySlot > invUpPacket( getId() ); - invUpPacket.data().containerId = Inventory::InventoryType::Crystal; - invUpPacket.data().catalogId = static_cast< uint8_t >( type ) + 1; - invUpPacket.data().quantity = m_pInventory->getCrystal( static_cast< Inventory::CrystalType >( type ) ); - invUpPacket.data().slot = static_cast< uint8_t >( type ) - 1; + auto invUpPacket = makeZonePacket< FFXIVIpcUpdateInventorySlot >( getId() ); + invUpPacket->data().containerId = Inventory::InventoryType::Crystal; + invUpPacket->data().catalogId = static_cast< uint8_t >( type ) + 1; + invUpPacket->data().quantity = m_pInventory->getCrystal( static_cast< Inventory::CrystalType >( type ) ); + invUpPacket->data().slot = static_cast< uint8_t >( type ) - 1; queuePacket( invUpPacket ); } diff --git a/src/servers/sapphire_zone/Actor/PlayerQuest.cpp b/src/servers/sapphire_zone/Actor/PlayerQuest.cpp index 952d0bf8..a757de8d 100644 --- a/src/servers/sapphire_zone/Actor/PlayerQuest.cpp +++ b/src/servers/sapphire_zone/Actor/PlayerQuest.cpp @@ -42,16 +42,16 @@ void Core::Entity::Player::removeQuest( uint16_t questId ) if( ( idx != -1 ) && ( m_activeQuests[idx] != nullptr ) ) { - ZoneChannelPacket< FFXIVIpcQuestUpdate > questUpdatePacket( getId() ); - questUpdatePacket.data().slot = static_cast< uint8_t >( idx ); - questUpdatePacket.data().questInfo.c.questId = 0; - questUpdatePacket.data().questInfo.c.sequence = 0xFF; + auto questUpdatePacket = makeZonePacket< FFXIVIpcQuestUpdate >( getId() ); + questUpdatePacket->data().slot = static_cast< uint8_t >( idx ); + questUpdatePacket->data().questInfo.c.questId = 0; + questUpdatePacket->data().questInfo.c.sequence = 0xFF; queuePacket( questUpdatePacket ); - ZoneChannelPacket< FFXIVIpcQuestFinish > questFinishPacket( getId() ); - questFinishPacket.data().questId = questId; - questFinishPacket.data().flag1 = 1; - questFinishPacket.data().flag2 = 1; + auto questFinishPacket = makeZonePacket< FFXIVIpcQuestFinish >( getId() ); + questFinishPacket->data().questId = questId; + questFinishPacket->data().flag1 = 1; + questFinishPacket->data().flag2 = 1; queuePacket( questFinishPacket ); for( int32_t ii = 0; ii < 5; ii++ ) @@ -875,11 +875,12 @@ void Core::Entity::Player::updateQuest( uint16_t questId, uint8_t sequence ) { uint8_t index = getQuestIndex( questId ); auto pNewQuest = m_activeQuests[index]; - ZoneChannelPacket< FFXIVIpcQuestUpdate > pe_qa( getId() ); + + auto questUpdatePacket = makeZonePacket< FFXIVIpcQuestUpdate >( getId() ); pNewQuest->c.sequence = sequence; - pe_qa.data().slot = index; - pe_qa.data().questInfo = *pNewQuest; - queuePacket( pe_qa ); + questUpdatePacket->data().slot = index; + questUpdatePacket->data().questInfo = *pNewQuest; + queuePacket( questUpdatePacket ); } else @@ -905,10 +906,10 @@ void Core::Entity::Player::updateQuest( uint16_t questId, uint8_t sequence ) m_questIdToQuestIdx[questId] = idx; m_questIdxToQuestId[idx] = questId; - ZoneChannelPacket< FFXIVIpcQuestUpdate > pe_qa( getId() ); - pe_qa.data().slot = idx; - pe_qa.data().questInfo = *pNewQuest; - queuePacket( pe_qa ); + auto questUpdatePacket = makeZonePacket< FFXIVIpcQuestUpdate >( getId() ); + questUpdatePacket->data().slot = idx; + questUpdatePacket->data().questInfo = *pNewQuest; + queuePacket( questUpdatePacket ); for( int32_t ii = 0; ii < 5; ii++ ) { @@ -927,14 +928,14 @@ void Core::Entity::Player::updateQuest( uint16_t questId, uint8_t sequence ) void Core::Entity::Player::sendQuestTracker() { - ZoneChannelPacket< FFXIVIpcQuestTracker > trackerPacket( getId() ); + auto trackerPacket = makeZonePacket< FFXIVIpcQuestTracker >( getId() ); for( int32_t ii = 0; ii < 5; ii++ ) { if( m_questTracking[ii] >= 0 ) { - trackerPacket.data().entry[ii].active = 1; - trackerPacket.data().entry[ii].questIndex = static_cast< uint8_t >( m_questTracking[ii] ); + trackerPacket->data().entry[ii].active = 1; + trackerPacket->data().entry[ii].questIndex = static_cast< uint8_t >( m_questTracking[ii] ); } } queuePacket( trackerPacket ); @@ -972,7 +973,7 @@ void Core::Entity::Player::setQuestTracker( uint16_t index, int16_t flag ) void Core::Entity::Player::sendQuestInfo() { - ZoneChannelPacket< FFXIVIpcQuestActiveList > pe_qa( getId() ); + auto activeQuestListPacket = makeZonePacket< FFXIVIpcQuestActiveList >( getId() ); for( int32_t i = 0; i < 30; i++ ) { @@ -980,24 +981,24 @@ void Core::Entity::Player::sendQuestInfo() if( m_activeQuests[i] != nullptr ) { - auto& quest = pe_qa.data().activeQuests[i]; + auto& quest = activeQuestListPacket->data().activeQuests[i]; quest = *m_activeQuests[i]; } } - queuePacket( pe_qa ); + queuePacket( activeQuestListPacket ); - ZoneChannelPacket< FFXIVIpcQuestCompleteList > pe_qc( getId() ); - memcpy( pe_qc.data().questCompleteMask, m_questCompleteFlags, sizeof( m_questCompleteFlags ) ); - queuePacket( pe_qc ); + auto completeQuestListPacket = makeZonePacket< FFXIVIpcQuestCompleteList >( getId() ); + memcpy( completeQuestListPacket->data().questCompleteMask, m_questCompleteFlags, sizeof( m_questCompleteFlags ) ); + queuePacket( completeQuestListPacket ); sendQuestTracker(); } void Core::Entity::Player::sendQuestMessage( uint32_t questId, int8_t msgId, uint8_t type, uint32_t var1, uint32_t var2 ) { - queuePacket( QuestMessagePacket( getAsPlayer(), questId, msgId, type, var1, var2 ) ); + queuePacket( boost::make_shared< QuestMessagePacket >( getAsPlayer(), questId, msgId, type, var1, var2 ) ); } @@ -1069,7 +1070,7 @@ bool Core::Entity::Player::giveQuestRewards( uint32_t questId, uint32_t optional return true; } -boost::shared_ptr Core::Entity::Player::getQuestActive( uint16_t index ) +boost::shared_ptr< QuestActive > Core::Entity::Player::getQuestActive( uint16_t index ) { return m_activeQuests[index]; } diff --git a/src/servers/sapphire_zone/DebugCommand/DebugCommandHandler.cpp b/src/servers/sapphire_zone/DebugCommand/DebugCommandHandler.cpp index 187ba5bf..38e30881 100644 --- a/src/servers/sapphire_zone/DebugCommand/DebugCommandHandler.cpp +++ b/src/servers/sapphire_zone/DebugCommand/DebugCommandHandler.cpp @@ -38,6 +38,10 @@ extern Core::Framework g_fw; +using namespace Network; +using namespace Network::Packets; +using namespace Network::Packets::Server; + // instanciate and initialize commands Core::DebugCommandHandler::DebugCommandHandler() { @@ -179,11 +183,10 @@ void Core::DebugCommandHandler::set( char * data, Entity::Player& player, boost: player.getPos().y + static_cast< float >( posY ), player.getPos().z + static_cast< float >( posZ ) ); - Network::Packets::ZoneChannelPacket< Network::Packets::Server::FFXIVIpcActorSetPos > - setActorPosPacket( player.getId() ); - setActorPosPacket.data().x = player.getPos().x; - setActorPosPacket.data().y = player.getPos().y; - setActorPosPacket.data().z = player.getPos().z; + auto setActorPosPacket = makeZonePacket< FFXIVIpcActorSetPos >( player.getId() ); + setActorPosPacket->data().x = player.getPos().x; + setActorPosPacket->data().y = player.getPos().y; + setActorPosPacket->data().z = player.getPos().z; player.queuePacket( setActorPosPacket ); } @@ -200,9 +203,9 @@ void Core::DebugCommandHandler::set( char * data, Entity::Player& player, boost: int32_t discover_id; sscanf( params.c_str(), "%i %i", &map_id, &discover_id ); - Network::Packets::ZoneChannelPacket< Network::Packets::Server::FFXIVIpcDiscovery > discoveryPacket( player.getId() ); - discoveryPacket.data().map_id = map_id; - discoveryPacket.data().map_part_id = discover_id; + auto discoveryPacket = makeZonePacket< FFXIVIpcDiscovery >( player.getId() ); + discoveryPacket->data().map_id = map_id; + discoveryPacket->data().map_part_id = discover_id; player.queuePacket( discoveryPacket ); } @@ -228,7 +231,7 @@ void Core::DebugCommandHandler::set( char * data, Entity::Player& player, boost: else if( subCommand == "discovery_reset" ) { player.resetDiscovery(); - player.queuePacket( Network::Packets::Server::InitUIPacket( player ) ); + player.queuePacket( boost::make_shared< InitUIPacket >( player ) ); } else if( subCommand == "classjob" ) { @@ -282,9 +285,8 @@ void Core::DebugCommandHandler::set( char * data, Entity::Player& player, boost: int32_t id; sscanf( params.c_str(), "%d", &id ); - Network::Packets::ZoneChannelPacket< Network::Packets::Server::FFXIVIpcMSQTrackerProgress > msqPacket( - player.getId()); - msqPacket.data().id = id; + auto msqPacket = makeZonePacket< FFXIVIpcMSQTrackerProgress >( player.getId() ); + msqPacket->data().id = id; player.queuePacket( msqPacket ); player.sendDebug( "MSQ Guide updated " ); @@ -294,8 +296,8 @@ void Core::DebugCommandHandler::set( char * data, Entity::Player& player, boost: int32_t id; sscanf( params.c_str(), "%d", &id ); - Network::Packets::ZoneChannelPacket< Network::Packets::Server::FFXIVIpcMSQTrackerComplete > msqPacket ( player.getId() ); - msqPacket.data().id = id; + auto msqPacket = makeZonePacket< FFXIVIpcMSQTrackerComplete >( player.getId() ); + msqPacket->data().id = id; player.queuePacket( msqPacket ); player.sendDebug( "MSQ Guide updated " ); @@ -377,8 +379,9 @@ void Core::DebugCommandHandler::add( char * data, Entity::Player& player, boost: // temporary research packet int32_t opcode; sscanf( params.c_str(), "%x", &opcode ); - auto pPe = Network::Packets::make_GamePacket( opcode, 0x30, player.getId(), player.getId() ); - player.queuePacket( pPe ); + // TODO: fix for new setup + //auto pPe = Network::Packets::make_GamePacket( opcode, 0x30, player.getId(), player.getId() ); + //player.queuePacket( pPe ); } else if( subCommand == "actrl" ) { @@ -398,14 +401,14 @@ void Core::DebugCommandHandler::add( char * data, Entity::Player& player, boost: player.sendNotice( "Injecting ACTOR_CONTROL " + std::to_string( opcode ) ); - Network::Packets::ZoneChannelPacket< Network::Packets::Server::FFXIVIpcActorControl143 > actorControl( playerId, player.getId() ); - actorControl.data().category = opcode; - actorControl.data().param1 = param1; - actorControl.data().param2 = param2; - actorControl.data().param3 = param3; - actorControl.data().param4 = param4; - actorControl.data().param5 = param5; - actorControl.data().param6 = param6; + auto actorControl = makeZonePacket< FFXIVIpcActorControl143 >( playerId, player.getId() ); + actorControl->data().category = opcode; + actorControl->data().param1 = param1; + actorControl->data().param2 = param2; + actorControl->data().param3 = param3; + actorControl->data().param4 = param4; + actorControl->data().param5 = param5; + actorControl->data().param6 = param6; player.queuePacket( actorControl ); @@ -579,12 +582,11 @@ void Core::DebugCommandHandler::nudge( char * data, Entity::Player& player, boos } if( offset != 0 ) { - Network::Packets::ZoneChannelPacket< Network::Packets::Server::FFXIVIpcActorSetPos > - setActorPosPacket( player.getId() ); - setActorPosPacket.data().x = player.getPos().x; - setActorPosPacket.data().y = player.getPos().y; - setActorPosPacket.data().z = player.getPos().z; - setActorPosPacket.data().r16 = Math::Util::floatToUInt16Rot( player.getRot() ); + auto setActorPosPacket = makeZonePacket< FFXIVIpcActorSetPos >( player.getId() ); + setActorPosPacket->data().x = player.getPos().x; + setActorPosPacket->data().y = player.getPos().y; + setActorPosPacket->data().z = player.getPos().z; + setActorPosPacket->data().r16 = Math::Util::floatToUInt16Rot( player.getRot() ); player.queuePacket( setActorPosPacket ); } } diff --git a/src/servers/sapphire_zone/Event/Director.cpp b/src/servers/sapphire_zone/Event/Director.cpp index dc622023..1a590848 100644 --- a/src/servers/sapphire_zone/Event/Director.cpp +++ b/src/servers/sapphire_zone/Event/Director.cpp @@ -41,22 +41,23 @@ uint8_t Core::Event::Director::getSequence() const void Core::Event::Director::sendDirectorClear( Core::Entity::Player& player ) const { - player.queuePacket( ActorControlPacket143( player.getId(), DirectorClear, m_directorId ) ); + player.queuePacket( boost::make_shared< ActorControlPacket143 >( player.getId(), DirectorClear, m_directorId ) ); } void Core::Event::Director::sendDirectorVars( Core::Entity::Player& player ) const { - ZoneChannelPacket< FFXIVIpcDirectorVars > varPacket( player.getId() ); - varPacket.data().m_directorId = getDirectorId(); - varPacket.data().m_sequence = getSequence(); - varPacket.data().m_branch = 0; - memcpy( varPacket.data().m_unionData, m_unionData.arrData, sizeof( varPacket.data().m_unionData ) ); + auto varPacket = makeZonePacket< FFXIVIpcDirectorVars >( player.getId() ); + varPacket->data().m_directorId = getDirectorId(); + varPacket->data().m_sequence = getSequence(); + varPacket->data().m_branch = 0; + memcpy( varPacket->data().m_unionData, m_unionData.arrData, sizeof( varPacket->data().m_unionData ) ); player.queuePacket( varPacket ); } void Core::Event::Director::sendDirectorInit( Core::Entity::Player& player ) const { - player.queuePacket( ActorControlPacket143( player.getId(), DirectorInit, m_directorId, m_contentId ) ); + player.queuePacket( boost::make_shared< ActorControlPacket143 >( player.getId(), DirectorInit, + m_directorId, m_contentId ) ); } Core::Event::Director::DirectorType Core::Event::Director::getType() const diff --git a/src/servers/sapphire_zone/Forwards.h b/src/servers/sapphire_zone/Forwards.h index 9537191c..6335aeb7 100644 --- a/src/servers/sapphire_zone/Forwards.h +++ b/src/servers/sapphire_zone/Forwards.h @@ -3,12 +3,14 @@ #include #include +#include #include #include #define TYPE_FORWARD( x ) \ class x; \ typedef boost::shared_ptr< x > x ## Ptr; \ +typedef std::unique_ptr< x > x ## UPtr; \ template< typename...Args > \ x ## Ptr make_ ## x( Args &&...args ) { \ return boost::make_shared< x >( std::forward< Args >( args ) ... ); }\ @@ -68,6 +70,7 @@ namespace Core namespace Packets { TYPE_FORWARD( GamePacket ); + TYPE_FORWARD( FFXIVPacketBase ); } } diff --git a/src/servers/sapphire_zone/Inventory/Inventory.cpp b/src/servers/sapphire_zone/Inventory/Inventory.cpp index e1d2078b..2659911a 100644 --- a/src/servers/sapphire_zone/Inventory/Inventory.cpp +++ b/src/servers/sapphire_zone/Inventory/Inventory.cpp @@ -522,17 +522,19 @@ int16_t Core::Inventory::addItem( uint16_t inventoryId, int8_t slotId, uint32_t " WHERE storageId = " + std::to_string( inventoryId ) + " AND CharacterId = " + std::to_string( m_pOwner->getId() ) ); - ZoneChannelPacket< FFXIVIpcUpdateInventorySlot > invUpPacket( m_pOwner->getId() ); - invUpPacket.data().containerId = inventoryId; - invUpPacket.data().catalogId = catalogId; - invUpPacket.data().quantity = item->getStackSize(); - invUpPacket.data().hqFlag = item->isHq() ? 1 : 0; - invUpPacket.data().slot = rSlotId; - invUpPacket.data().condition = 30000; + + auto invUpPacket = makeZonePacket< FFXIVIpcUpdateInventorySlot >( m_pOwner->getId() ); + invUpPacket->data().containerId = inventoryId; + invUpPacket->data().catalogId = catalogId; + invUpPacket->data().quantity = item->getStackSize(); + invUpPacket->data().hqFlag = item->isHq() ? 1 : 0; + invUpPacket->data().slot = rSlotId; + invUpPacket->data().condition = 30000; m_pOwner->queuePacket( invUpPacket ); if( !silent ) - m_pOwner->queuePacket( ActorControlPacket143( m_pOwner->getId(), ItemObtainIcon, catalogId, item->getStackSize() ) ); + m_pOwner->queuePacket( boost::make_shared< ActorControlPacket143 >( m_pOwner->getId(), ItemObtainIcon, + catalogId, item->getStackSize() ) ); } @@ -711,19 +713,19 @@ void Core::Inventory::discardItem( uint16_t fromInventoryId, uint8_t fromSlotId m_inventoryMap[fromInventoryId]->removeItem( fromSlotId ); updateContainer( fromInventoryId, fromSlotId, nullptr ); - ZoneChannelPacket< FFXIVIpcInventoryTransaction > invTransPacket( m_pOwner->getId() ); - invTransPacket.data().transactionId = transactionId; - invTransPacket.data().ownerId = m_pOwner->getId(); - invTransPacket.data().storageId = fromInventoryId; - invTransPacket.data().catalogId = fromItem->getId(); - invTransPacket.data().stackSize = fromItem->getStackSize(); - invTransPacket.data().slotId = fromSlotId; - invTransPacket.data().type = 7; + auto invTransPacket = makeZonePacket< FFXIVIpcInventoryTransaction >( m_pOwner->getId() ); + invTransPacket->data().transactionId = transactionId; + invTransPacket->data().ownerId = m_pOwner->getId(); + invTransPacket->data().storageId = fromInventoryId; + invTransPacket->data().catalogId = fromItem->getId(); + invTransPacket->data().stackSize = fromItem->getStackSize(); + invTransPacket->data().slotId = fromSlotId; + invTransPacket->data().type = 7; m_pOwner->queuePacket( invTransPacket ); - ZoneChannelPacket< FFXIVIpcInventoryTransactionFinish > invTransFinPacket( m_pOwner->getId() ); - invTransFinPacket.data().transactionId = transactionId; - invTransFinPacket.data().transactionId1 = transactionId; + auto invTransFinPacket = makeZonePacket< FFXIVIpcInventoryTransactionFinish >( m_pOwner->getId() ); + invTransFinPacket->data().transactionId = transactionId; + invTransFinPacket->data().transactionId1 = transactionId; m_pOwner->queuePacket( invTransFinPacket ); } @@ -902,34 +904,34 @@ void Core::Inventory::send() if( it->second->getId() == InventoryType::Currency || it->second->getId() == InventoryType::Crystal ) { - ZoneChannelPacket< FFXIVIpcCurrencyCrystalInfo > currencyInfoPacket( m_pOwner->getId() ); - currencyInfoPacket.data().sequence = count; - currencyInfoPacket.data().catalogId = itM->second->getId(); - currencyInfoPacket.data().unknown = 1; - currencyInfoPacket.data().quantity = itM->second->getStackSize(); - currencyInfoPacket.data().containerId = it->second->getId(); - currencyInfoPacket.data().slot = 0; + auto currencyInfoPacket = makeZonePacket< FFXIVIpcCurrencyCrystalInfo >( m_pOwner->getId() ); + currencyInfoPacket->data().sequence = count; + currencyInfoPacket->data().catalogId = itM->second->getId(); + currencyInfoPacket->data().unknown = 1; + currencyInfoPacket->data().quantity = itM->second->getStackSize(); + currencyInfoPacket->data().containerId = it->second->getId(); + currencyInfoPacket->data().slot = 0; m_pOwner->queuePacket( currencyInfoPacket ); } else { - ZoneChannelPacket< FFXIVIpcItemInfo > itemInfoPacket( m_pOwner->getId() ); - itemInfoPacket.data().sequence = count; - itemInfoPacket.data().containerId = it->second->getId(); - itemInfoPacket.data().slot = itM->first; - itemInfoPacket.data().quantity = itM->second->getStackSize(); - itemInfoPacket.data().catalogId = itM->second->getId(); - itemInfoPacket.data().condition = 30000; - itemInfoPacket.data().spiritBond = 0; - itemInfoPacket.data().hqFlag = itM->second->isHq() ? 1 : 0; + auto itemInfoPacket = makeZonePacket< FFXIVIpcItemInfo >( m_pOwner->getId() ); + itemInfoPacket->data().sequence = count; + itemInfoPacket->data().containerId = it->second->getId(); + itemInfoPacket->data().slot = itM->first; + itemInfoPacket->data().quantity = itM->second->getStackSize(); + itemInfoPacket->data().catalogId = itM->second->getId(); + itemInfoPacket->data().condition = 30000; + itemInfoPacket->data().spiritBond = 0; + itemInfoPacket->data().hqFlag = itM->second->isHq() ? 1 : 0; m_pOwner->queuePacket( itemInfoPacket ); } } - ZoneChannelPacket< FFXIVIpcContainerInfo > containerInfoPacket( m_pOwner->getId() ); - containerInfoPacket.data().sequence = count; - containerInfoPacket.data().numItems = it->second->getEntryCount(); - containerInfoPacket.data().containerId = it->second->getId(); + auto containerInfoPacket = makeZonePacket< FFXIVIpcContainerInfo >( m_pOwner->getId() ); + containerInfoPacket->data().sequence = count; + containerInfoPacket->data().numItems = it->second->getEntryCount(); + containerInfoPacket->data().containerId = it->second->getId(); m_pOwner->queuePacket( containerInfoPacket ); diff --git a/src/servers/sapphire_zone/Network/GameConnection.cpp b/src/servers/sapphire_zone/Network/GameConnection.cpp index 3df399a7..38b1f34e 100644 --- a/src/servers/sapphire_zone/Network/GameConnection.cpp +++ b/src/servers/sapphire_zone/Network/GameConnection.cpp @@ -4,6 +4,7 @@ #include #include #include +#include #include #include @@ -179,7 +180,7 @@ void Core::Network::GameConnection::queueInPacket( Core::Network::Packets::FFXIV m_inQueue.push( inPacket ); } -void Core::Network::GameConnection::queueOutPacket( Core::Network::Packets::GamePacketPtr outPacket ) +void Core::Network::GameConnection::queueOutPacket( Core::Network::Packets::FFXIVPacketBasePtr outPacket ) { m_outQueue.push( outPacket ); } @@ -311,7 +312,7 @@ void Core::Network::GameConnection::processOutQueue() } -void Core::Network::GameConnection::sendSinglePacket( Packets::GamePacket* pPacket ) +void Core::Network::GameConnection::sendSinglePacket( Core::Network::Packets::FFXIVPacketBasePtr pPacket ) { PacketContainer pRP = PacketContainer(); pRP.addPacket( *pPacket ); @@ -362,7 +363,8 @@ void Core::Network::GameConnection::injectPacket( const std::string& packetpath, if( pSize == 0 ) return; - queueOutPacket( GamePacketPtr( new GamePacket( packet + k, pSize, false ) ) ); + // TODO: fix injection for new packets + //queueOutPacket( GamePacketPtr( new GamePacket( packet + k, pSize, false ) ) ); k += ( pSize ); } } @@ -412,32 +414,33 @@ void Core::Network::GameConnection::handlePackets( const Core::Network::Packets: if( !m_pSession && session ) m_pSession = session; - GamePacket pPe( 0x00, 0x18, 0, 0, 0x07 ); - //pPe.setValAt< uint32_t >( 0x10, 0xE0000005 ); - pPe.setValAt< uint32_t >( 0x10, 0xE0037603 ); - pPe.setValAt< uint32_t >( 0x14, static_cast< uint32_t >( time( nullptr ) ) ); - sendSinglePacket( &pPe ); + auto pe = boost::make_shared< FFXIVRawPacket >( 0x07, 0x18, 0, 0 ); + *(unsigned int*)(&pe->data()[0]) = 0xE0037603; + *(unsigned int*)(&pe->data()[4]) = static_cast< uint32_t >( time( nullptr ) ); + sendSinglePacket( pe ); // main connection, assinging it to the session if( ipcHeader.connectionType == ConnectionType::Zone ) { - pPe = GamePacket( 0x00, 0x38, 0, 0, 0x02 ); - pPe.setValAt< uint32_t >( 0x10, playerId ); - sendSinglePacket( &pPe ); + auto pe1 = boost::make_shared< FFXIVRawPacket >( 0x02, 0x38, 0, 0 ); + *(unsigned int*)(&pe1->data()[0]) = playerId; + sendSinglePacket( pe1 ); pLog->info( "[" + std::string( id ) + "] Setting session for zone connection" ); session->setZoneConnection( pCon ); } // chat connection, assinging it to the session else if( ipcHeader.connectionType == ConnectionType::Chat ) { - pPe = GamePacket( 0x00, 0x38, 0, 0, 0x02 ); - pPe.setValAt< uint32_t >( 0x10, playerId ); - sendSinglePacket( &pPe ); + auto pe2 = boost::make_shared< FFXIVRawPacket >( 0x02, 0x38, 0, 0 ); + *(unsigned int*)(&pe2->data()[0]) = playerId; + sendSinglePacket( pe2 ); + + auto pe3 = boost::make_shared< FFXIVRawPacket >( 0x03, 0x28, playerId, playerId ); + *(unsigned short*)(&pe3->data()[2]) = 0x02; + sendSinglePacket( pe3 ); pLog->info( "[" + std::string( id ) + "] Setting session for chat connection" ); session->setChatConnection( pCon ); - pPe = GamePacket( 0x02, 0x28, playerId, playerId, 0x03 ); - sendSinglePacket( &pPe ); } break; @@ -453,10 +456,10 @@ void Core::Network::GameConnection::handlePackets( const Core::Network::Packets: uint32_t id = *( uint32_t* ) &inPacket.data[0]; uint32_t timeStamp = *( uint32_t* ) &inPacket.data[4]; - GamePacket pPe( 0x00, 0x18, 0, 0, 0x08 ); - pPe.setValAt< uint32_t >( 0x10, id ); - pPe.setValAt< uint32_t >( 0x14, timeStamp ); - sendSinglePacket( &pPe ); + auto pe4 = boost::make_shared< FFXIVRawPacket >( 0x08, 0x18, 0, 0 ); + *(unsigned int*)(&pe4->data()[0]) = id; + *(unsigned int*)(&pe4->data()[4]) = timeStamp; + sendSinglePacket( pe4 ); break; } diff --git a/src/servers/sapphire_zone/Network/GameConnection.h b/src/servers/sapphire_zone/Network/GameConnection.h index 50442615..b4635844 100644 --- a/src/servers/sapphire_zone/Network/GameConnection.h +++ b/src/servers/sapphire_zone/Network/GameConnection.h @@ -46,7 +46,7 @@ private: SessionPtr m_pSession; LockedQueue< Core::Network::Packets::FFXIVARR_PACKET_RAW > m_inQueue; - LockedQueue< Packets::GamePacketPtr > m_outQueue; + LockedQueue< Packets::FFXIVPacketBasePtr > m_outQueue; public: ConnectionType m_conType; @@ -68,7 +68,7 @@ public: const std::vector< Packets::FFXIVARR_PACKET_RAW >& packetData ); void queueInPacket( Core::Network::Packets::FFXIVARR_PACKET_RAW inPacket ); - void queueOutPacket( Packets::GamePacketPtr outPacket ); + void queueOutPacket( Packets::FFXIVPacketBasePtr outPacket ); void processInQueue(); void processOutQueue(); @@ -81,7 +81,7 @@ public: void sendPackets( Packets::PacketContainer* pPacket ); - void sendSinglePacket( Packets::GamePacket* pPacket ); + void sendSinglePacket( Core::Network::Packets::FFXIVPacketBasePtr pPacket ); void injectPacket( const std::string& packetpath, Entity::Player& player ); diff --git a/src/servers/sapphire_zone/Network/Handlers/ActionHandler.cpp b/src/servers/sapphire_zone/Network/Handlers/ActionHandler.cpp index c48ed2be..cb8cfc18 100644 --- a/src/servers/sapphire_zone/Network/Handlers/ActionHandler.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/ActionHandler.cpp @@ -143,7 +143,7 @@ void Core::Network::GameConnection::actionHandler( const Core::Network::Packets: player.setAutoattack( false ); } - player.sendToInRangeSet( ActorControlPacket142( player.getId(), 0, param11, 1 ) ); + player.sendToInRangeSet( boost::make_shared< ActorControlPacket142 >( player.getId(), 0, param11, 1 ) ); break; } @@ -157,7 +157,7 @@ void Core::Network::GameConnection::actionHandler( const Core::Network::Packets: else player.setAutoattack( false ); - player.sendToInRangeSet( ActorControlPacket142( player.getId(), 1, param11, 1 ) ); + player.sendToInRangeSet( boost::make_shared< ActorControlPacket142 >( player.getId(), 1, param11, 1 ) ); break; } diff --git a/src/servers/sapphire_zone/Network/Handlers/CFHandlers.cpp b/src/servers/sapphire_zone/Network/Handlers/CFHandlers.cpp index b33e941e..c191dffd 100644 --- a/src/servers/sapphire_zone/Network/Handlers/CFHandlers.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/CFHandlers.cpp @@ -29,19 +29,17 @@ using namespace Core::Network::Packets::Server; void Core::Network::GameConnection::cfDutyInfoRequest( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) { - ZoneChannelPacket< FFXIVIpcCFDutyInfo > dutyInfoPacket( player.getId() ); - + auto dutyInfoPacket = makeZonePacket< FFXIVIpcCFDutyInfo >( player.getId() ); auto penaltyMinutes = player.getCFPenaltyMinutes(); if( penaltyMinutes > 255 ) { // cap it since it's uint8_t in packets penaltyMinutes = 255; } - dutyInfoPacket.data().penaltyTime = penaltyMinutes; - + dutyInfoPacket->data().penaltyTime = penaltyMinutes; queueOutPacket( dutyInfoPacket ); - ZoneChannelPacket< FFXIVIpcCFPlayerInNeed > inNeedsPacket( player.getId() ); + auto inNeedsPacket = makeZonePacket< FFXIVIpcCFPlayerInNeed >( player.getId() ); queueOutPacket( inNeedsPacket ); } @@ -73,9 +71,9 @@ void Core::Network::GameConnection::cfRegisterDuty( const Packets::FFXIVARR_PACK player.sendDebug( "Duty register request for contentid: " + std::to_string( contentId ) ); // let's cancel it because otherwise you can't register it again - ZoneChannelPacket< FFXIVIpcCFNotify > cfCancelPacket( player.getId() ); - cfCancelPacket.data().state1 = 3; - cfCancelPacket.data().state2 = 1; // Your registration is withdrawn. + auto cfCancelPacket = makeZonePacket< FFXIVIpcCFNotify >( player.getId() ); + cfCancelPacket->data().state1 = 3; + cfCancelPacket->data().state2 = 1; // Your registration is withdrawn. queueOutPacket( cfCancelPacket ); auto cfCondition = pExdData->get< Core::Data::ContentFinderCondition >( contentId ); @@ -97,9 +95,9 @@ void Core::Network::GameConnection::cfRegisterDuty( const Packets::FFXIVARR_PACK void Core::Network::GameConnection::cfRegisterRoulette( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player) { - ZoneChannelPacket< FFXIVIpcCFNotify > cfCancelPacket( player.getId() ); - cfCancelPacket.data().state1 = 3; - cfCancelPacket.data().state2 = 1; // Your registration is withdrawn. + auto cfCancelPacket = makeZonePacket< FFXIVIpcCFNotify >( player.getId() ); + cfCancelPacket->data().state1 = 3; + cfCancelPacket->data().state2 = 1; // Your registration is withdrawn. queueOutPacket( cfCancelPacket ); player.sendDebug( "Roulette register" ); diff --git a/src/servers/sapphire_zone/Network/Handlers/EventHandlers.cpp b/src/servers/sapphire_zone/Network/Handlers/EventHandlers.cpp index d8e1f6e1..c2813fbd 100644 --- a/src/servers/sapphire_zone/Network/Handlers/EventHandlers.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/EventHandlers.cpp @@ -250,11 +250,11 @@ void Core::Network::GameConnection::eventHandlerLinkshell( const Packets::FFXIVA auto scene = *reinterpret_cast< uint16_t* >( ©.data[0x14] ); auto lsName = std::string( reinterpret_cast< char* >( ©.data[0x17] ) ); - ZoneChannelPacket< FFXIVIpcEventLinkshell > linkshellEvent( player.getId() ); - linkshellEvent.data().eventId = eventId; - linkshellEvent.data().scene = static_cast< uint8_t >( scene ); - linkshellEvent.data().param3 = 1; - linkshellEvent.data().unknown1 = 0x15a; + auto linkshellEvent = makeZonePacket< FFXIVIpcEventLinkshell >( player.getId() ); + linkshellEvent->data().eventId = eventId; + linkshellEvent->data().scene = static_cast< uint8_t >( scene ); + linkshellEvent->data().param3 = 1; + linkshellEvent->data().unknown1 = 0x15a; player.queuePacket( linkshellEvent ); } diff --git a/src/servers/sapphire_zone/Network/Handlers/GMCommandHandlers.cpp b/src/servers/sapphire_zone/Network/Handlers/GMCommandHandlers.cpp index 502d1cab..3f13c5f0 100644 --- a/src/servers/sapphire_zone/Network/Handlers/GMCommandHandlers.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/GMCommandHandlers.cpp @@ -206,7 +206,7 @@ void Core::Network::GameConnection::gm1Handler( const Packets::FFXIVARR_PACKET_R } case GmCommand::Speed: { - targetPlayer->queuePacket( ActorControlPacket143( player.getId(), Flee, param1 ) ); + targetPlayer->queuePacket( boost::make_shared< ActorControlPacket143 >( player.getId(), Flee, param1 ) ); player.sendNotice( "Speed for " + targetPlayer->getName() + " was set to " + std::to_string( param1 ) ); break; } @@ -233,17 +233,17 @@ void Core::Network::GameConnection::gm1Handler( const Packets::FFXIVARR_PACKET_R { targetPlayer->setOnlineStatusMask( param1 ); - ZoneChannelPacket< FFXIVIpcSetOnlineStatus > statusPacket( targetPlayer->getId() ); - statusPacket.data().onlineStatusFlags = param1; + auto statusPacket = makeZonePacket< FFXIVIpcSetOnlineStatus >( player.getId() ); + statusPacket->data().onlineStatusFlags = param1; queueOutPacket( statusPacket ); - ZoneChannelPacket< FFXIVIpcSetSearchInfo > searchInfoPacket( targetPlayer->getId() ); - searchInfoPacket.data().onlineStatusFlags = param1; - searchInfoPacket.data().selectRegion = targetPlayer->getSearchSelectRegion(); - strcpy( searchInfoPacket.data().searchMessage, targetPlayer->getSearchMessage() ); + auto searchInfoPacket = makeZonePacket< FFXIVIpcSetSearchInfo >( player.getId() ); + searchInfoPacket->data().onlineStatusFlags = param1; + searchInfoPacket->data().selectRegion = targetPlayer->getSearchSelectRegion(); + strcpy( searchInfoPacket->data().searchMessage, targetPlayer->getSearchMessage() ); targetPlayer->queuePacket( searchInfoPacket ); - targetPlayer->sendToInRangeSet( ActorControlPacket142( player.getId(), SetStatusIcon, + targetPlayer->sendToInRangeSet( boost::make_shared< ActorControlPacket142 >( player.getId(), SetStatusIcon, static_cast< uint8_t >( player.getOnlineStatus() ) ), true ); player.sendNotice( "Icon for " + targetPlayer->getName() + " was set to " + std::to_string( param1 ) ); @@ -526,8 +526,8 @@ void Core::Network::GameConnection::gm2Handler( const Packets::FFXIVARR_PACKET_R targetPlayer->resetMp(); targetPlayer->setStatus( Entity::Chara::ActorStatus::Idle ); - targetPlayer->sendToInRangeSet( ActorControlPacket143( player.getId(), ZoneIn, 0x01, 0x01, 0, 113 ), true ); - targetPlayer->sendToInRangeSet( ActorControlPacket142( player.getId(), SetStatus, + targetPlayer->sendToInRangeSet( boost::make_shared< ActorControlPacket143 >( player.getId(), ZoneIn, 0x01, 0x01, 0, 113 ), true ); + targetPlayer->sendToInRangeSet( boost::make_shared< ActorControlPacket142 >( player.getId(), SetStatus, static_cast< uint8_t >( Entity::Chara::ActorStatus::Idle ) ), true ); player.sendNotice( "Raised " + targetPlayer->getName() ); break; diff --git a/src/servers/sapphire_zone/Network/Handlers/InventoryHandler.cpp b/src/servers/sapphire_zone/Network/Handlers/InventoryHandler.cpp index 6e3a65f7..6efd9a30 100644 --- a/src/servers/sapphire_zone/Network/Handlers/InventoryHandler.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/InventoryHandler.cpp @@ -53,9 +53,9 @@ void Core::Network::GameConnection::inventoryModifyHandler( const Packets::FFXIV // 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] ); - ZoneChannelPacket< FFXIVIpcInventoryActionAck > ackPacket( player.getId() ); - ackPacket.data().sequence = seq; - ackPacket.data().type = 7; + auto ackPacket = makeZonePacket< FFXIVIpcInventoryActionAck >( player.getId() ); + ackPacket->data().sequence = seq; + ackPacket->data().type = 7; player.queuePacket( ackPacket ); auto pLog = g_fw.get< Logger >(); diff --git a/src/servers/sapphire_zone/Network/Handlers/PacketHandlers.cpp b/src/servers/sapphire_zone/Network/Handlers/PacketHandlers.cpp index c26da3aa..d15f545b 100644 --- a/src/servers/sapphire_zone/Network/Handlers/PacketHandlers.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/PacketHandlers.cpp @@ -76,34 +76,34 @@ void Core::Network::GameConnection::setSearchInfoHandler( const Packets::FFXIVAR // mark player as new adventurer player.setNewAdventurer( true ); - ZoneChannelPacket< FFXIVIpcSetOnlineStatus > statusPacket( player.getId() ); - statusPacket.data().onlineStatusFlags = status; + auto statusPacket = makeZonePacket< FFXIVIpcSetOnlineStatus >( player.getId() ); + statusPacket->data().onlineStatusFlags = status; queueOutPacket( statusPacket ); - ZoneChannelPacket< FFXIVIpcSetSearchInfo > searchInfoPacket( player.getId() ); - searchInfoPacket.data().onlineStatusFlags = status; - searchInfoPacket.data().selectRegion = player.getSearchSelectRegion(); - strcpy( searchInfoPacket.data().searchMessage, player.getSearchMessage() ); + auto searchInfoPacket = makeZonePacket< FFXIVIpcSetSearchInfo >( player.getId() ); + searchInfoPacket->data().onlineStatusFlags = status; + searchInfoPacket->data().selectRegion = player.getSearchSelectRegion(); + strcpy( searchInfoPacket->data().searchMessage, player.getSearchMessage() ); queueOutPacket( searchInfoPacket ); - player.sendToInRangeSet( ActorControlPacket142( player.getId(), SetStatusIcon, + player.sendToInRangeSet( boost::make_shared< ActorControlPacket142 >( player.getId(), SetStatusIcon, static_cast< uint8_t >( player.getOnlineStatus() ) ), true ); } void Core::Network::GameConnection::reqSearchInfoHandler( const Core::Network::Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) { - ZoneChannelPacket< FFXIVIpcInitSearchInfo > searchInfoPacket( player.getId() ); - searchInfoPacket.data().onlineStatusFlags = player.getOnlineStatusMask(); - searchInfoPacket.data().selectRegion = player.getSearchSelectRegion(); - strcpy( searchInfoPacket.data().searchMessage, player.getSearchMessage() ); + auto searchInfoPacket = makeZonePacket< FFXIVIpcInitSearchInfo >( player.getId() ); + searchInfoPacket->data().onlineStatusFlags = player.getOnlineStatusMask(); + searchInfoPacket->data().selectRegion = player.getSearchSelectRegion(); + strcpy( searchInfoPacket->data().searchMessage, player.getSearchMessage() ); queueOutPacket( searchInfoPacket ); } void Core::Network::GameConnection::linkshellListHandler( const Core::Network::Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) { - ZoneChannelPacket< FFXIVIpcLinkshellList > linkshellListPacket( player.getId() ); + auto linkshellListPacket = makeZonePacket< FFXIVIpcLinkshellList >( player.getId() ); queueOutPacket( linkshellListPacket ); } @@ -279,7 +279,7 @@ void Core::Network::GameConnection::updatePositionHandler( const Core::Network:: } } - MoveActorPacket movePacket( player, unk1, unk2, unk3, unk4 ); + auto movePacket = boost::make_shared< MoveActorPacket >( player, unk1, unk2, unk3, unk4 ); player.sendToInRangeSet( movePacket ); } @@ -317,8 +317,8 @@ void Core::Network::GameConnection::zoneLineHandler( const Core::Network::Packet targetZone = pLine->getTargetZoneId(); rotation = pLine->getTargetRotation(); - ZoneChannelPacket< FFXIVIpcPrepareZoning > preparePacket( player.getId() ); - preparePacket.data().targetZone = targetZone; + auto preparePacket = makeZonePacket< FFXIVIpcPrepareZoning >( player.getId() ); + preparePacket->data().targetZone = targetZone; //ActorControlPacket143 controlPacket( pPlayer, ActorControlType::DespawnZoneScreenMsg, // 0x03, player.getId(), 0x01, targetZone ); @@ -358,9 +358,9 @@ void Core::Network::GameConnection::discoveryHandler( const Core::Network::Packe return; } - ZoneChannelPacket< FFXIVIpcDiscovery > discoveryPacket( player.getId() ); - discoveryPacket.data().map_id = pQR->getUInt( 2 ); - discoveryPacket.data().map_part_id = pQR->getUInt( 3 ); + auto discoveryPacket = makeZonePacket< FFXIVIpcDiscovery >( player.getId() ); + discoveryPacket->data().map_id = pQR->getUInt( 2 ); + discoveryPacket->data().map_part_id = pQR->getUInt( 3 ); player.queuePacket( discoveryPacket ); player.sendNotice( "Discovery ref pos ID: " + std::to_string( ref_position_id ) ); @@ -373,8 +373,8 @@ void Core::Network::GameConnection::discoveryHandler( const Core::Network::Packe void Core::Network::GameConnection::playTimeHandler( const Core::Network::Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) { - ZoneChannelPacket< FFXIVIpcPlayTime > playTimePacket( player.getId() ); - playTimePacket.data().playTimeInMinutes = player.getPlayTime() / 60; + auto playTimePacket = makeZonePacket< FFXIVIpcPlayTime >( player.getId() ); + playTimePacket->data().playTimeInMinutes = player.getPlayTime() / 60; player.queuePacket( playTimePacket ); } @@ -394,8 +394,8 @@ void Core::Network::GameConnection::blackListHandler( const Core::Network::Packe { uint8_t count = inPacket.data[0x11]; - ZoneChannelPacket< FFXIVIpcBlackList > blackListPacket( player.getId() ); - blackListPacket.data().sequence = count; + auto blackListPacket = makeZonePacket< FFXIVIpcBlackList >( player.getId() ); + blackListPacket->data().sequence = count; // TODO: Fill with actual blacklist data //blackListPacket.data().entry[0].contentId = 1; //sprintf( blackListPacket.data().entry[0].name, "Test Test" ); @@ -410,8 +410,7 @@ void Core::Network::GameConnection::pingHandler( const Core::Network::Packets::F Packets::FFXIVARR_PACKET_RAW copy = inPacket; auto inVal = *reinterpret_cast< uint32_t* >( ©.data[0x10] ); - PingPacket pingPacket( player, inVal ); - queueOutPacket( pingPacket ); + queueOutPacket( boost::make_shared< PingPacket>( player, inVal ) ); player.setLastPing( static_cast< uint32_t >( time( nullptr ) ) ); } @@ -450,45 +449,44 @@ void Core::Network::GameConnection::socialListHandler( const Core::Network::Pack if( type == 0x02 ) { // party list - ZoneChannelPacket< FFXIVIpcSocialList > listPacket( player.getId() ); + auto listPacket = makeZonePacket< FFXIVIpcSocialList >( player.getId() ); - listPacket.data().type = 2; - listPacket.data().sequence = count; + listPacket->data().type = 2; + listPacket->data().sequence = count; - int32_t entrysizes = sizeof( listPacket.data().entries ); - memset( listPacket.data().entries, 0, sizeof( listPacket.data().entries ) ); + int32_t entrysizes = sizeof( listPacket->data().entries ); + memset( listPacket->data().entries, 0, sizeof( listPacket->data().entries ) ); - listPacket.data().entries[0].bytes[2] = player.getCurrentZone()->getTerritoryId(); - listPacket.data().entries[0].bytes[3] = 0x80; - listPacket.data().entries[0].bytes[4] = 0x02; - listPacket.data().entries[0].bytes[6] = 0x3B; - listPacket.data().entries[0].bytes[11] = 0x10; - listPacket.data().entries[0].classJob = static_cast< uint8_t >( player.getClass() ); - listPacket.data().entries[0].contentId = player.getContentId(); - listPacket.data().entries[0].level = player.getLevel(); - listPacket.data().entries[0].zoneId = player.getCurrentZone()->getTerritoryId(); - listPacket.data().entries[0].zoneId1 = 0x0100; + listPacket->data().entries[0].bytes[2] = player.getCurrentZone()->getTerritoryId(); + listPacket->data().entries[0].bytes[3] = 0x80; + listPacket->data().entries[0].bytes[4] = 0x02; + listPacket->data().entries[0].bytes[6] = 0x3B; + listPacket->data().entries[0].bytes[11] = 0x10; + listPacket->data().entries[0].classJob = static_cast< uint8_t >( player.getClass() ); + listPacket->data().entries[0].contentId = player.getContentId(); + listPacket->data().entries[0].level = player.getLevel(); + listPacket->data().entries[0].zoneId = player.getCurrentZone()->getTerritoryId(); + listPacket->data().entries[0].zoneId1 = 0x0100; // TODO: no idea what this does //listPacket.data().entries[0].one = 1; - memcpy( listPacket.data().entries[0].name, player.getName().c_str(), strlen( player.getName().c_str() ) ); + memcpy( listPacket->data().entries[0].name, player.getName().c_str(), strlen( player.getName().c_str() ) ); // TODO: actually store and read language from somewhere - listPacket.data().entries[0].bytes1[0] = 0x01;//flags (lang) + listPacket->data().entries[0].bytes1[0] = 0x01;//flags (lang) // TODO: these flags need to be figured out //listPacket.data().entries[0].bytes1[1] = 0x00;//flags - listPacket.data().entries[0].onlineStatusMask = player.getOnlineStatusMask(); + listPacket->data().entries[0].onlineStatusMask = player.getOnlineStatusMask(); queueOutPacket( listPacket ); } else if( type == 0x0b ) { // friend list - - ZoneChannelPacket< FFXIVIpcSocialList > listPacket( player.getId() ); - listPacket.data().type = 0x0B; - listPacket.data().sequence = count; - memset( listPacket.data().entries, 0, sizeof( listPacket.data().entries ) ); + auto listPacket = makeZonePacket< FFXIVIpcSocialList >( player.getId() ); + listPacket->data().type = 0x0B; + listPacket->data().sequence = count; + memset( listPacket->data().entries, 0, sizeof( listPacket->data().entries ) ); } else if( type == 0x0e ) @@ -519,14 +517,14 @@ void Core::Network::GameConnection::chatHandler( const Core::Network::Packets::F ChatType chatType = static_cast< ChatType >( inPacket.data[0x28] ); //ToDo, need to implement sending GM chat types. - ChatPacket chatPacket( player, chatType, chatString ); + auto chatPacket = boost::make_shared< ChatPacket >( player, chatType, chatString ); switch( chatType ) { case ChatType::Say: { if (player.getGmRank() > 0) - chatPacket.data().chatType = ChatType::GMSay; + chatPacket->data().chatType = ChatType::GMSay; player.getCurrentZone()->queueOutPacketForRange( player, 50, chatPacket ); break; @@ -534,7 +532,7 @@ void Core::Network::GameConnection::chatHandler( const Core::Network::Packets::F case ChatType::Yell: { if( player.getGmRank() > 0 ) - chatPacket.data().chatType = ChatType::GMYell; + chatPacket->data().chatType = ChatType::GMYell; player.getCurrentZone()->queueOutPacketForRange( player, 6000, chatPacket ); break; @@ -542,7 +540,7 @@ void Core::Network::GameConnection::chatHandler( const Core::Network::Packets::F case ChatType::Shout: { if( player.getGmRank() > 0 ) - chatPacket.data().chatType = ChatType::GMShout; + chatPacket->data().chatType = ChatType::GMShout; player.getCurrentZone()->queueOutPacketForRange( player, 6000, chatPacket ); break; @@ -563,9 +561,9 @@ void Core::Network::GameConnection::chatHandler( const Core::Network::Packets::F void Core::Network::GameConnection::logoutHandler( const Core::Network::Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) { - ZoneChannelPacket< FFXIVIpcLogout > logoutPacket( player.getId() ); - logoutPacket.data().flags1 = 0x02; - logoutPacket.data().flags2 = 0x2000; + auto logoutPacket = makeZonePacket< FFXIVIpcLogout >( player.getId() ); + logoutPacket->data().flags1 = 0x02; + logoutPacket->data().flags2 = 0x2000; queueOutPacket( logoutPacket ); player.setMarkedForRemoval(); @@ -586,8 +584,8 @@ void Core::Network::GameConnection::tellHandler( const Core::Network::Packets::F if( !pSession ) { - ChatChannelPacket< FFXIVIpcTellErrNotFound > tellErrPacket( player.getId() ); - strcpy( tellErrPacket.data().receipientName, targetPcName.c_str() ); + auto tellErrPacket = makeZonePacket< FFXIVIpcTellErrNotFound >( player.getId() ); + strcpy( tellErrPacket->data().receipientName, targetPcName.c_str() ); sendSinglePacket( tellErrPacket ); return; } @@ -615,9 +613,9 @@ void Core::Network::GameConnection::tellHandler( const Core::Network::Packets::F return; } - ChatChannelPacket< FFXIVIpcTell > tellPacket( player.getId() ); - strcpy( tellPacket.data().msg, msg.c_str() ); - strcpy( tellPacket.data().receipientName, player.getName().c_str() ); + auto tellPacket = makeChatPacket< FFXIVIpcTell >( player.getId() ); + strcpy( tellPacket->data().msg, msg.c_str() ); + strcpy( tellPacket->data().receipientName, player.getName().c_str() ); // TODO: do these have a meaning? //tellPacket.data().u1 = 0x92CD7337; //tellPacket.data().u2a = 0x2E; @@ -629,9 +627,7 @@ void Core::Network::GameConnection::tellHandler( const Core::Network::Packets::F void Core::Network::GameConnection::performNoteHandler( const Core::Network::Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) { - ZoneChannelPacket< FFXIVIpcPerformNote > performPacket( player.getId() ); - - memcpy( &performPacket.data().data[0], &inPacket.data[0x10], 32 ); - + auto performPacket = makeZonePacket< FFXIVIpcPerformNote >( player.getId() ); + memcpy( &performPacket->data().data[0], &inPacket.data[0x10], 32 ); player.sendToInRangeSet( performPacket ); } diff --git a/src/servers/sapphire_zone/Network/Handlers/SkillHandler.cpp b/src/servers/sapphire_zone/Network/Handlers/SkillHandler.cpp index 885e4042..4ddebeca 100644 --- a/src/servers/sapphire_zone/Network/Handlers/SkillHandler.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/SkillHandler.cpp @@ -37,7 +37,7 @@ void Core::Network::GameConnection::skillHandler( const Packets::FFXIVARR_PACKET Entity::Player& player ) { Packets::FFXIVARR_PACKET_RAW copy = inPacket; - + uint8_t type = inPacket.data[0x11]; auto action = *reinterpret_cast< uint32_t* >( ©.data[0x14] ); @@ -62,7 +62,7 @@ void Core::Network::GameConnection::skillHandler( const Packets::FFXIVARR_PACKET pExdData->get< Core::Data::Action >( action )->name + " | " + std::to_string( targetId ) + " )" ); - player.queuePacket( ActorControlPacket142( player.getId(), ActorControlType::ActionStart, 0x01, action ) ); + player.queuePacket( boost::make_shared< ActorControlPacket142 >( player.getId(), ActorControlType::ActionStart, 0x01, action ) ); if( action == 5 ) { diff --git a/src/servers/sapphire_zone/Network/PacketWrappers/PlayerSpawnPacket.h b/src/servers/sapphire_zone/Network/PacketWrappers/PlayerSpawnPacket.h index a9b4359c..4694ea22 100644 --- a/src/servers/sapphire_zone/Network/PacketWrappers/PlayerSpawnPacket.h +++ b/src/servers/sapphire_zone/Network/PacketWrappers/PlayerSpawnPacket.h @@ -19,11 +19,12 @@ namespace Server { * @brief The packet sent to spawn a player. */ class PlayerSpawnPacket : - public GamePacketNew< FFXIVIpcPlayerSpawn, ServerZoneIpcType > + public ZoneChannelPacket< FFXIVIpcPlayerSpawn > + { public: PlayerSpawnPacket( Entity::Player& player, Entity::Player& target ) : - GamePacketNew< FFXIVIpcPlayerSpawn, ServerZoneIpcType >( player.getId(), target.getId() ) + ZoneChannelPacket< FFXIVIpcPlayerSpawn >( player.getId(), target.getId() ) { initialize( player, target ); }; diff --git a/src/servers/sapphire_zone/Zone/InstanceContent.cpp b/src/servers/sapphire_zone/Zone/InstanceContent.cpp index 69cd5c20..e1566b15 100644 --- a/src/servers/sapphire_zone/Zone/InstanceContent.cpp +++ b/src/servers/sapphire_zone/Zone/InstanceContent.cpp @@ -133,7 +133,7 @@ void Core::InstanceContent::onUpdate( uint32_t currTime ) { auto pPlayer = playerIt.second; pPlayer->queuePacket( - ActorControlPacket143( pPlayer->getId(), DirectorUpdate, + boost::make_shared< ActorControlPacket143 >( pPlayer->getId(), DirectorUpdate, getDirectorId(), 0x40000001, m_instanceConfiguration->timeLimitmin * 60u ) ); } @@ -175,7 +175,7 @@ void Core::InstanceContent::onInitDirector( Entity::Player& player ) void Core::InstanceContent::onSomeDirectorEvent( Entity::Player& player ) { - player.queuePacket( ActorControlPacket143( player.getId(), DirectorUpdate, 0x00110001, 0x80000000, 1 ) ); + player.queuePacket( boost::make_shared< ActorControlPacket143 >( player.getId(), DirectorUpdate, 0x00110001, 0x80000000, 1 ) ); } @@ -281,7 +281,7 @@ void Core::InstanceContent::startQte() for( const auto& playerIt : m_playerMap ) { auto player = playerIt.second; - player->queuePacket( ActorControlPacket143( player->getId(), DirectorUpdate, getDirectorId(), 0x8000000A ) ); + player->queuePacket( boost::make_shared< ActorControlPacket143 >( player->getId(), DirectorUpdate, getDirectorId(), 0x8000000A ) ); } } @@ -291,7 +291,7 @@ void Core::InstanceContent::startEventCutscene() for( const auto& playerIt : m_playerMap ) { auto player = playerIt.second; - player->queuePacket( ActorControlPacket143( player->getId(), DirectorUpdate, getDirectorId(), 0x80000008 ) ); + player->queuePacket( boost::make_shared< ActorControlPacket143 >( player->getId(), DirectorUpdate, getDirectorId(), 0x80000008 ) ); } } @@ -300,7 +300,7 @@ void Core::InstanceContent::endEventCutscene() for( const auto& playerIt : m_playerMap ) { auto player = playerIt.second; - player->queuePacket( ActorControlPacket143( player->getId(), DirectorUpdate, getDirectorId(), 0x80000009 ) ); + player->queuePacket( boost::make_shared< ActorControlPacket143 >( player->getId(), DirectorUpdate, getDirectorId(), 0x80000009 ) ); } } @@ -409,13 +409,13 @@ void Core::InstanceContent::setCurrentBGM( uint16_t bgmIndex ) // note: retail do send a BGM_MUTE(1) first before any BGM transition, but YOLO in this case. // also do note that this code can't control the bgm granularly. (i.e. per player for WoD submap.) oops. // player->queuePacket( ActorControlPacket143( player->getId(), DirectorUpdate, getDirectorId(), 0x80000001, 1 ) ); - player->queuePacket( ActorControlPacket143( player->getId(), DirectorUpdate, getDirectorId(), 0x80000001, bgmIndex ) ); + player->queuePacket( boost::make_shared< ActorControlPacket143 >( player->getId(), DirectorUpdate, getDirectorId(), 0x80000001, bgmIndex ) ); } } void Core::InstanceContent::setPlayerBGM( Core::Entity::Player& player, uint16_t bgmId ) { - player.queuePacket( ActorControlPacket143( player.getId(), DirectorUpdate, getDirectorId(), 0x80000001, bgmId ) ); + player.queuePacket( boost::make_shared< ActorControlPacket143 >( player.getId(), DirectorUpdate, getDirectorId(), 0x80000001, bgmId ) ); } uint16_t Core::InstanceContent::getCurrentBGM() const diff --git a/src/servers/sapphire_zone/Zone/Zone.cpp b/src/servers/sapphire_zone/Zone/Zone.cpp index 570de342..25f000b7 100644 --- a/src/servers/sapphire_zone/Zone/Zone.cpp +++ b/src/servers/sapphire_zone/Zone/Zone.cpp @@ -142,7 +142,7 @@ void Core::Zone::setCurrentFestival( uint16_t festivalId ) { auto player = playerEntry.second; - ActorControlPacket143 enableFestival( player->getId(), SetFestival, m_currentFestivalId ); + auto enableFestival = boost::make_shared< ActorControlPacket143 >( player->getId(), SetFestival, m_currentFestivalId ); playerEntry.second->queuePacket( enableFestival ); } } @@ -265,7 +265,8 @@ void Core::Zone::removeActor( Entity::ActorPtr pActor ) } -void Core::Zone::queueOutPacketForRange( Entity::Player& sourcePlayer, uint32_t range, GamePacketPtr pPacketEntry ) +void Core::Zone::queueOutPacketForRange( Entity::Player& sourcePlayer, uint32_t range, + Network::Packets::FFXIVPacketBasePtr pPacketEntry ) { auto pTeriMgr = g_fw.get< TerritoryMgr >(); if( pTeriMgr->isPrivateTerritory( getTerritoryId() ) ) @@ -286,7 +287,7 @@ void Core::Zone::queueOutPacketForRange( Entity::Player& sourcePlayer, uint32_t { auto pSession = pServerZone->getSession( player->getId() ); - pPacketEntry->setValAt< uint32_t >( 0x08, player->getId() ); + //pPacketEntry->setValAt< uint32_t >( 0x08, player->getId() ); if( pSession ) pSession->getZoneConnection()->queueOutPacket( pPacketEntry ); } @@ -433,9 +434,9 @@ void Core::Zone::updateSessions( bool changedWeather ) if( changedWeather ) { - ZoneChannelPacket< FFXIVIpcWeatherChange > weatherChangePacket( pPlayer->getId() ); - weatherChangePacket.data().weatherId = static_cast< uint8_t >( m_currentWeather ); - weatherChangePacket.data().delay = 5.0f; + auto weatherChangePacket = makeZonePacket< FFXIVIpcWeatherChange >(pPlayer->getId() ); + weatherChangePacket->data().weatherId = static_cast< uint8_t >( m_currentWeather ); + weatherChangePacket->data().delay = 5.0f; pSession->getPlayer()->queuePacket( weatherChangePacket ); } diff --git a/src/servers/sapphire_zone/Zone/Zone.h b/src/servers/sapphire_zone/Zone/Zone.h index c48643af..f632651f 100644 --- a/src/servers/sapphire_zone/Zone/Zone.h +++ b/src/servers/sapphire_zone/Zone/Zone.h @@ -97,7 +97,7 @@ public: void updateInRangeSet( Entity::ActorPtr pActor, Cell* pCell ); - void queueOutPacketForRange( Entity::Player& sourcePlayer, uint32_t range, Network::Packets::GamePacketPtr pPacketEntry ); + void queueOutPacketForRange( Entity::Player& sourcePlayer, uint32_t range, Network::Packets::FFXIVPacketBasePtr pPacketEntry ); uint32_t getGuId() const;