diff --git a/src/servers/sapphire_lobby/GameConnection.cpp b/src/servers/sapphire_lobby/GameConnection.cpp index 2d99df2c..8c03bd9b 100644 --- a/src/servers/sapphire_lobby/GameConnection.cpp +++ b/src/servers/sapphire_lobby/GameConnection.cpp @@ -483,7 +483,7 @@ void Core::Network::GameConnection::generateEncryptionKey( uint32_t key, const s } void Core::Network::GameConnection::handlePackets( const Core::Network::Packets::FFXIVARR_PACKET_HEADER& ipcHeader, - const std::vector& packetData ) + const std::vector< Core::Network::Packets::FFXIVARR_PACKET_RAW >& packetData ) { for( auto inPacket : packetData ) diff --git a/src/servers/sapphire_zone/Network/GameConnection.cpp b/src/servers/sapphire_zone/Network/GameConnection.cpp index e885a994..3df399a7 100644 --- a/src/servers/sapphire_zone/Network/GameConnection.cpp +++ b/src/servers/sapphire_zone/Network/GameConnection.cpp @@ -174,7 +174,7 @@ void Core::Network::GameConnection::OnError( const boost::system::error_code & e pLog->debug( "GameConnection ERROR: " + error.message() ); } -void Core::Network::GameConnection::queueInPacket( Core::Network::Packets::GamePacketPtr inPacket ) +void Core::Network::GameConnection::queueInPacket( Core::Network::Packets::FFXIVARR_PACKET_RAW inPacket ) { m_inQueue.push( inPacket ); } @@ -184,24 +184,25 @@ void Core::Network::GameConnection::queueOutPacket( Core::Network::Packets::Game m_outQueue.push( outPacket ); } -void Core::Network::GameConnection::handleZonePacket( const Packets::GamePacket& pPacket ) +void Core::Network::GameConnection::handleZonePacket( Core::Network::Packets::FFXIVARR_PACKET_RAW& pPacket ) { auto pLog = g_fw.get< Logger >(); - auto it = m_zoneHandlerMap.find( pPacket.getSubType() ); + uint16_t opcode = *reinterpret_cast< uint16_t* >( &pPacket.data[0x02] ); + auto it = m_zoneHandlerMap.find( opcode ); std::string sessionStr = "[" + std::to_string( m_pSession->getId() ) + "]"; if( it != m_zoneHandlerMap.end() ) { - auto itStr = m_zoneHandlerStrMap.find( pPacket.getSubType() ); + auto itStr = m_zoneHandlerStrMap.find( opcode ); std::string name = itStr != m_zoneHandlerStrMap.end() ? itStr->second : "unknown"; // dont display packet notification if it is a ping or pos update, don't want the spam - if( pPacket.getSubType() != PingHandler && - pPacket.getSubType() != UpdatePositionHandler ) + if( opcode != PingHandler && + opcode != UpdatePositionHandler ) pLog->debug( sessionStr + " Handling Zone IPC : " + name + "( " + boost::str( boost::format( "%|04X|" ) % - static_cast< uint32_t >( pPacket.getSubType() & 0xFFFF ) ) + " )" ); + static_cast< uint32_t >( opcode ) ) + " )" ); ( this->*( it->second ) )( pPacket, *m_pSession->getPlayer() ); } @@ -209,28 +210,29 @@ void Core::Network::GameConnection::handleZonePacket( const Packets::GamePacket& { pLog->debug( sessionStr + " Undefined Zone IPC : Unknown ( " + boost::str( boost::format( "%|04X|" ) % - static_cast< uint32_t >( pPacket.getSubType() & 0xFFFF ) ) + " )" ); - pLog->debug( "\n" + pPacket.toString() ); + static_cast< uint32_t >( opcode ) ) + " )" ); + //pLog->debug( "\n" + pPacket.toString() ); } } -void Core::Network::GameConnection::handleChatPacket( const Packets::GamePacket& pPacket ) +void Core::Network::GameConnection::handleChatPacket( Core::Network::Packets::FFXIVARR_PACKET_RAW& pPacket ) { auto pLog = g_fw.get< Logger >(); - auto it = m_chatHandlerMap.find( pPacket.getSubType() ); + uint16_t opcode = *reinterpret_cast< uint16_t* >( &pPacket.data[0x02] ); + auto it = m_chatHandlerMap.find( opcode ); std::string sessionStr = "[" + std::to_string( m_pSession->getId() ) + "]"; if( it != m_chatHandlerMap.end() ) { - auto itStr = m_chatHandlerStrMap.find( pPacket.getSubType() ); + auto itStr = m_chatHandlerStrMap.find( opcode ); std::string name = itStr != m_chatHandlerStrMap.end() ? itStr->second : "unknown"; // dont display packet notification if it is a ping or pos update, don't want the spam pLog->debug( sessionStr + " Handling Chat IPC : " + name + "( " + boost::str( boost::format( "%|04X|" ) % - static_cast< uint32_t >( pPacket.getSubType() & 0xFFFF ) ) + " )" ); + static_cast< uint32_t >( opcode ) ) + " )" ); ( this->*( it->second ) )( pPacket, *m_pSession->getPlayer() ); } @@ -238,12 +240,12 @@ void Core::Network::GameConnection::handleChatPacket( const Packets::GamePacket& { pLog->debug( sessionStr + " Undefined Chat IPC : Unknown ( " + boost::str( boost::format( "%|04X|" ) % - static_cast< uint32_t >( pPacket.getSubType() & 0xFFFF ) ) + " )" ); - pLog->debug( pPacket.toString() ); + static_cast< uint32_t >( opcode ) ) + " )" ); + //pLog->debug( pPacket.toString() ); } } -void Core::Network::GameConnection::handlePacket( Core::Network::Packets::GamePacketPtr pPacket ) +void Core::Network::GameConnection::handlePacket( Core::Network::Packets::FFXIVARR_PACKET_RAW& pPacket ) { if( !m_pSession ) return; @@ -251,11 +253,11 @@ void Core::Network::GameConnection::handlePacket( Core::Network::Packets::GamePa switch( m_conType ) { case Network::ConnectionType::Zone: - handleZonePacket( *pPacket ); + handleZonePacket( pPacket ); break; case Network::ConnectionType::Chat: - handleChatPacket( *pPacket ); + handleChatPacket( pPacket ); break; } @@ -273,8 +275,9 @@ void Core::Network::GameConnection::sendPackets( Packets::PacketContainer* pPack void Core::Network::GameConnection::processInQueue() { // handle the incoming game packets - while( auto pPacket = m_inQueue.pop() ) + while( m_inQueue.size() ) { + auto pPacket = m_inQueue.pop(); handlePacket( pPacket ); } } @@ -442,8 +445,7 @@ void Core::Network::GameConnection::handlePackets( const Core::Network::Packets: } case 3: // game packet { - auto pPacket = new GamePacket( inPacket ); - queueInPacket( Packets::GamePacketPtr( pPacket ) ); + queueInPacket( inPacket ); break; } case 7: // keep alive diff --git a/src/servers/sapphire_zone/Network/GameConnection.h b/src/servers/sapphire_zone/Network/GameConnection.h index 07e17bc3..50442615 100644 --- a/src/servers/sapphire_zone/Network/GameConnection.h +++ b/src/servers/sapphire_zone/Network/GameConnection.h @@ -9,7 +9,7 @@ #include "Forwards.h" -#define DECLARE_HANDLER( x ) void x( const Packets::GamePacket& inPacket, Entity::Player& player ) +#define DECLARE_HANDLER( x ) void x( const Core::Network::Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) namespace Core { namespace Network { @@ -28,7 +28,7 @@ class GameConnection : public Connection { private: - typedef void ( GameConnection::* Handler )( const Packets::GamePacket& inPacket, Entity::Player& player ); + typedef void ( GameConnection::* Handler )( const Core::Network::Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ); using HandlerMap = std::map< uint16_t, Handler >; using HandlerStrMap = std::map< uint16_t, std::string >; @@ -45,7 +45,7 @@ private: SessionPtr m_pSession; - LockedQueue< Packets::GamePacketPtr > m_inQueue; + LockedQueue< Core::Network::Packets::FFXIVARR_PACKET_RAW > m_inQueue; LockedQueue< Packets::GamePacketPtr > m_outQueue; public: @@ -67,17 +67,17 @@ public: void handlePackets( const Packets::FFXIVARR_PACKET_HEADER& ipcHeader, const std::vector< Packets::FFXIVARR_PACKET_RAW >& packetData ); - void queueInPacket( Packets::GamePacketPtr inPacket ); + void queueInPacket( Core::Network::Packets::FFXIVARR_PACKET_RAW inPacket ); void queueOutPacket( Packets::GamePacketPtr outPacket ); void processInQueue(); void processOutQueue(); - void handlePacket( Packets::GamePacketPtr pPacket ); + void handlePacket( Core::Network::Packets::FFXIVARR_PACKET_RAW& pPacket ); - void handleZonePacket( const Packets::GamePacket& pPacket ); + void handleZonePacket( Core::Network::Packets::FFXIVARR_PACKET_RAW& pPacket ); - void handleChatPacket( const Packets::GamePacket& pPacket ); + void handleChatPacket( Core::Network::Packets::FFXIVARR_PACKET_RAW& pPacket ); void sendPackets( Packets::PacketContainer* pPacket ); diff --git a/src/servers/sapphire_zone/Network/Handlers/ActionHandler.cpp b/src/servers/sapphire_zone/Network/Handlers/ActionHandler.cpp index 50c81fb0..c48ed2be 100644 --- a/src/servers/sapphire_zone/Network/Handlers/ActionHandler.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/ActionHandler.cpp @@ -108,16 +108,18 @@ enum ClientTrigger }; -void Core::Network::GameConnection::actionHandler( const Packets::GamePacket& inPacket, +void Core::Network::GameConnection::actionHandler( const Core::Network::Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) { + Packets::FFXIVARR_PACKET_RAW copy = inPacket; + auto pLog = g_fw.get< Logger >(); - uint16_t commandId = inPacket.getValAt< uint16_t >( 0x20 ); - uint64_t param1 = inPacket.getValAt< uint64_t >( 0x24 ); - uint32_t param11 = inPacket.getValAt< uint32_t >( 0x24 ); - uint32_t param12 = inPacket.getValAt< uint32_t >( 0x28 ); - uint32_t param2 = inPacket.getValAt< uint32_t >( 0x2C ); - uint64_t param3 = inPacket.getValAt< uint64_t >( 0x38 ); + uint16_t commandId = *reinterpret_cast< uint16_t* >( ©.data[0x10] ); + uint64_t param1 = *reinterpret_cast< uint64_t* >( ©.data[0x14] ); + uint32_t param11 = *reinterpret_cast< uint32_t* >( ©.data[0x14] ); + uint32_t param12 = *reinterpret_cast< uint32_t* >( ©.data[0x18] ); + uint32_t param2 = *reinterpret_cast< uint32_t* >( ©.data[0x1C] ); + uint64_t param3 = *reinterpret_cast< uint64_t* >( ©.data[0x28] ); pLog->debug( "[" + std::to_string( m_pSession->getId() ) + "] Incoming action: " + boost::str( boost::format( "%|04X|" ) % ( uint32_t ) ( commandId & 0xFFFF ) ) + @@ -162,7 +164,7 @@ void Core::Network::GameConnection::actionHandler( const Packets::GamePacket& in case ClientTrigger::ChangeTarget: // Change target { - uint64_t targetId = inPacket.getValAt< uint64_t >( 0x24 ); + uint64_t targetId = param1; player.changeTarget( targetId ); break; } @@ -206,7 +208,7 @@ void Core::Network::GameConnection::actionHandler( const Packets::GamePacket& in case ClientTrigger::Emote: // emote { uint64_t targetId = player.getTargetId(); - uint32_t emoteId = inPacket.getValAt< uint32_t >( 0x24 ); + uint32_t emoteId = param11; player.emote( emoteId, targetId ); break; diff --git a/src/servers/sapphire_zone/Network/Handlers/CFHandlers.cpp b/src/servers/sapphire_zone/Network/Handlers/CFHandlers.cpp index 683a966f..b33e941e 100644 --- a/src/servers/sapphire_zone/Network/Handlers/CFHandlers.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/CFHandlers.cpp @@ -26,7 +26,7 @@ using namespace Core::Network::Packets; using namespace Core::Network::Packets::Server; -void Core::Network::GameConnection::cfDutyInfoRequest( const Packets::GamePacket& inPacket, +void Core::Network::GameConnection::cfDutyInfoRequest( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) { ZoneChannelPacket< FFXIVIpcCFDutyInfo > dutyInfoPacket( player.getId() ); @@ -46,17 +46,18 @@ void Core::Network::GameConnection::cfDutyInfoRequest( const Packets::GamePacket } -void Core::Network::GameConnection::cfRegisterDuty( const Packets::GamePacket& inPacket, +void Core::Network::GameConnection::cfRegisterDuty( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player) { + Packets::FFXIVARR_PACKET_RAW copy = inPacket; auto pTeriMgr = g_fw.get< TerritoryMgr >(); auto pExdData = g_fw.get< Data::ExdDataGenerated >(); std::vector< uint16_t > selectedContent; - for( uint32_t offset = 0x2E; offset <= 0x36; offset += 0x2 ) + for( uint32_t offset = 0x1E; offset <= 0x26; offset += 0x2 ) { - auto id = inPacket.getValAt< uint16_t >( offset ); + auto id = *reinterpret_cast< uint16_t* >( ©.data[offset] ); if( id == 0 ) break; @@ -93,7 +94,7 @@ void Core::Network::GameConnection::cfRegisterDuty( const Packets::GamePacket& i player.setInstance( instance ); } -void Core::Network::GameConnection::cfRegisterRoulette( const Packets::GamePacket& inPacket, +void Core::Network::GameConnection::cfRegisterRoulette( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player) { ZoneChannelPacket< FFXIVIpcCFNotify > cfCancelPacket( player.getId() ); @@ -104,7 +105,7 @@ void Core::Network::GameConnection::cfRegisterRoulette( const Packets::GamePacke player.sendDebug( "Roulette register" ); } -void Core::Network::GameConnection::cfDutyAccepted( const Packets::GamePacket& inPacket, +void Core::Network::GameConnection::cfDutyAccepted( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player) { player.sendDebug( "TODO: Duty accept" ); diff --git a/src/servers/sapphire_zone/Network/Handlers/EventHandlers.cpp b/src/servers/sapphire_zone/Network/Handlers/EventHandlers.cpp index 1e6913bb..d8e1f6e1 100644 --- a/src/servers/sapphire_zone/Network/Handlers/EventHandlers.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/EventHandlers.cpp @@ -33,12 +33,15 @@ using namespace Core::Common; using namespace Core::Network::Packets; using namespace Core::Network::Packets::Server; -void Core::Network::GameConnection::eventHandlerTalk( const Packets::GamePacket& inPacket, Entity::Player& player ) +void Core::Network::GameConnection::eventHandlerTalk( const Packets::FFXIVARR_PACKET_RAW& inPacket, + Entity::Player& player ) { auto pScriptMgr = g_fw.get< Scripting::ScriptMgr >(); auto pExdData = g_fw.get< Data::ExdDataGenerated >(); - auto actorId = inPacket.getValAt< uint64_t >( 0x20 ); - auto eventId = inPacket.getValAt< uint32_t >( 0x28 ); + Packets::FFXIVARR_PACKET_RAW copy = inPacket; + + auto actorId = *reinterpret_cast< uint64_t* >( ©.data[0x10] ); + auto eventId = *reinterpret_cast< uint32_t* >( ©.data[0x18] ); auto eventType = static_cast< uint16_t >( eventId >> 16 ); std::string eventName = "onTalk"; @@ -56,7 +59,6 @@ void Core::Network::GameConnection::eventHandlerTalk( const Packets::GamePacket& player.sendDebug( "Calling: " + objName + "." + eventName ); player.eventStart( actorId, eventId, Event::EventHandler::Talk, 0, 0 ); - if( auto instance = player.getCurrentInstance() ) { instance->onTalk( player, eventId, actorId ); @@ -73,14 +75,17 @@ void Core::Network::GameConnection::eventHandlerTalk( const Packets::GamePacket& } -void Core::Network::GameConnection::eventHandlerEmote( const Packets::GamePacket& inPacket, Entity::Player& player ) +void Core::Network::GameConnection::eventHandlerEmote( const Packets::FFXIVARR_PACKET_RAW& inPacket, + Entity::Player& player ) { auto pScriptMgr = g_fw.get< Scripting::ScriptMgr >(); auto pExdData = g_fw.get< Data::ExdDataGenerated >(); - auto actorId = inPacket.getValAt< uint64_t >( 0x20 ); - auto eventId = inPacket.getValAt< uint32_t >( 0x28 ); - auto emoteId = inPacket.getValAt< uint16_t >( 0x2C ); + Packets::FFXIVARR_PACKET_RAW copy = inPacket; + + auto actorId = *reinterpret_cast< uint64_t* >( ©.data[0x10] ); + auto eventId = *reinterpret_cast< uint32_t* >( ©.data[0x18] ); + auto emoteId = *reinterpret_cast< uint16_t* >( ©.data[0x1C] ); auto eventType = static_cast< uint16_t >( eventId >> 16 ); std::string eventName = "onEmote"; @@ -109,15 +114,18 @@ void Core::Network::GameConnection::eventHandlerEmote( const Packets::GamePacket player.checkEvent( eventId ); } -void Core::Network::GameConnection::eventHandlerWithinRange( const Packets::GamePacket& inPacket, +void Core::Network::GameConnection::eventHandlerWithinRange( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) { auto pScriptMgr = g_fw.get< Scripting::ScriptMgr >(); - auto eventId = inPacket.getValAt< uint32_t >( 0x24 ); - auto param1 = inPacket.getValAt< uint32_t >( 0x20 ); - auto x = inPacket.getValAt< float >( 0x28 ); - auto y = inPacket.getValAt< float >( 0x2C ); - auto z = inPacket.getValAt< float >( 0x30 ); + Packets::FFXIVARR_PACKET_RAW copy = inPacket; + + auto eventId = *reinterpret_cast< uint32_t* >( ©.data[0x14] ); + auto param1 = *reinterpret_cast< uint32_t* >( ©.data[0x10] ); + + auto x = *reinterpret_cast< float* >( ©.data[0x18] ); + auto y = *reinterpret_cast< float* >( ©.data[0x1C] ); + auto z = *reinterpret_cast< float* >( ©.data[0x20] ); std::string eventName = "onWithinRange"; std::string objName = Event::getEventName( eventId ); @@ -131,15 +139,18 @@ void Core::Network::GameConnection::eventHandlerWithinRange( const Packets::Game player.checkEvent( eventId ); } -void Core::Network::GameConnection::eventHandlerOutsideRange( const Packets::GamePacket& inPacket, +void Core::Network::GameConnection::eventHandlerOutsideRange( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) { auto pScriptMgr = g_fw.get< Scripting::ScriptMgr >(); - auto eventId = inPacket.getValAt< uint32_t >( 0x24 ); - auto param1 = inPacket.getValAt< uint32_t >( 0x20 ); - auto x = inPacket.getValAt< float >( 0x28 ); - auto y = inPacket.getValAt< float >( 0x2C ); - auto z = inPacket.getValAt< float >( 0x30 ); + Packets::FFXIVARR_PACKET_RAW copy = inPacket; + + auto eventId = *reinterpret_cast< uint32_t* >( ©.data[0x14] ); + auto param1 = *reinterpret_cast< uint32_t* >( ©.data[0x10] ); + + auto x = *reinterpret_cast< float* >( ©.data[0x18] ); + auto y = *reinterpret_cast< float* >( ©.data[0x1C] ); + auto z = *reinterpret_cast< float* >( ©.data[0x20] ); std::string eventName = "onOutsideRange"; std::string objName = Event::getEventName( eventId ); @@ -153,13 +164,15 @@ void Core::Network::GameConnection::eventHandlerOutsideRange( const Packets::Gam player.checkEvent( eventId ); } -void Core::Network::GameConnection::eventHandlerEnterTerritory( const Packets::GamePacket &inPacket, - Entity::Player &player ) +void Core::Network::GameConnection::eventHandlerEnterTerritory( const Packets::FFXIVARR_PACKET_RAW& inPacket, + Entity::Player& player ) { auto pScriptMgr = g_fw.get< Scripting::ScriptMgr >(); - auto eventId = inPacket.getValAt< uint32_t >( 0x20 ); - auto param1 = inPacket.getValAt< uint16_t >( 0x24 ); - auto param2 = inPacket.getValAt< uint16_t >( 0x26 ); + Packets::FFXIVARR_PACKET_RAW copy = inPacket; + + auto eventId = *reinterpret_cast< uint32_t* >( ©.data[0x14] ); + auto param1 = *reinterpret_cast< uint16_t* >( ©.data[0x10] ); + auto param2 = *reinterpret_cast< uint16_t* >( ©.data[0x16] ); std::string eventName = "onEnterTerritory"; @@ -181,14 +194,16 @@ void Core::Network::GameConnection::eventHandlerEnterTerritory( const Packets::G player.checkEvent( eventId ); } -void Core::Network::GameConnection::eventHandlerReturn( const Packets::GamePacket &inPacket, - Entity::Player &player ) +void Core::Network::GameConnection::eventHandlerReturn( const Packets::FFXIVARR_PACKET_RAW& inPacket, + Entity::Player& player ) { - auto eventId = inPacket.getValAt< uint32_t >( 0x20 ); - auto scene = inPacket.getValAt< uint16_t >( 0x24 ); - auto param1 = inPacket.getValAt< uint16_t >( 0x26 ); - auto param2 = inPacket.getValAt< uint16_t >( 0x28 ); - auto param3 = inPacket.getValAt< uint16_t >( 0x2C ); + Packets::FFXIVARR_PACKET_RAW copy = inPacket; + + auto eventId = *reinterpret_cast< uint32_t* >( ©.data[0x10] ); + auto scene = *reinterpret_cast< uint16_t* >( ©.data[0x14] ); + auto param1 = *reinterpret_cast< uint16_t* >( ©.data[0x16] ); + auto param2 = *reinterpret_cast< uint16_t* >( ©.data[0x18] ); + auto param3 = *reinterpret_cast< uint16_t* >( ©.data[0x1C] ); std::string eventName = Event::getEventName( eventId ); @@ -226,12 +241,14 @@ void Core::Network::GameConnection::eventHandlerReturn( const Packets::GamePacke } -void Core::Network::GameConnection::eventHandlerLinkshell( const Packets::GamePacket &inPacket, - Entity::Player &player ) +void Core::Network::GameConnection::eventHandlerLinkshell( const Packets::FFXIVARR_PACKET_RAW& inPacket, + Entity::Player& player ) { - auto eventId = inPacket.getValAt< uint32_t >( 0x20 ); - auto scene = inPacket.getValAt< uint16_t >( 0x24 ); - auto lsName = inPacket.getStringAt( 0x27 ); + Packets::FFXIVARR_PACKET_RAW copy = inPacket; + + auto eventId = *reinterpret_cast< uint32_t* >( ©.data[0x10] ); + auto scene = *reinterpret_cast< uint16_t* >( ©.data[0x14] ); + auto lsName = std::string( reinterpret_cast< char* >( ©.data[0x17] ) ); ZoneChannelPacket< FFXIVIpcEventLinkshell > linkshellEvent( player.getId() ); linkshellEvent.data().eventId = eventId; diff --git a/src/servers/sapphire_zone/Network/Handlers/GMCommandHandlers.cpp b/src/servers/sapphire_zone/Network/Handlers/GMCommandHandlers.cpp index 35808521..502d1cab 100644 --- a/src/servers/sapphire_zone/Network/Handlers/GMCommandHandlers.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/GMCommandHandlers.cpp @@ -84,15 +84,17 @@ enum GmCommand JumpNpc = 0x025F, }; -void Core::Network::GameConnection::gm1Handler( const Packets::GamePacket& inPacket, Entity::Player& player ) +void Core::Network::GameConnection::gm1Handler( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) { if( player.getGmRank() <= 0 ) return; - uint32_t commandId = inPacket.getValAt< uint32_t >( 0x20 ); - uint32_t param1 = inPacket.getValAt< uint32_t >( 0x24 ); - uint32_t param2 = inPacket.getValAt< uint32_t >( 0x28 ); - uint32_t param3 = inPacket.getValAt< uint32_t >( 0x38 ); + Packets::FFXIVARR_PACKET_RAW copy = inPacket; + auto commandId = *reinterpret_cast< uint32_t* >( ©.data[0x10] ); + + uint32_t param1 = *reinterpret_cast< uint32_t* >( ©.data[0x14] ); + uint32_t param2 = *reinterpret_cast< uint32_t* >( ©.data[0x18] ); + uint32_t param3 = *reinterpret_cast< uint32_t* >( ©.data[0x28] ); auto pLog = g_fw.get< Logger >(); pLog->debug( player.getName() + " used GM1 commandId: " + std::to_string( commandId ) + @@ -476,7 +478,7 @@ void Core::Network::GameConnection::gm1Handler( const Packets::GamePacket& inPac } -void Core::Network::GameConnection::gm2Handler( const Packets::GamePacket& inPacket, Entity::Player& player ) +void Core::Network::GameConnection::gm2Handler( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) { if( player.getGmRank() <= 0 ) return; @@ -484,8 +486,10 @@ void Core::Network::GameConnection::gm2Handler( const Packets::GamePacket& inPac auto pLog = g_fw.get< Logger >(); auto pServerZone = g_fw.get< ServerZone >(); - uint32_t commandId = inPacket.getValAt< uint32_t >( 0x20 ); - std::string param1 = inPacket.getStringAt( 0x34 ); + Packets::FFXIVARR_PACKET_RAW copy = inPacket; + auto commandId = *reinterpret_cast< uint32_t* >( ©.data[0x10] ); + + auto param1 = std::string( reinterpret_cast< char* >( ©.data[0x24] ) ); pLog->debug( player.getName() + " used GM2 commandId: " + std::to_string( commandId ) + ", params: " + param1 ); diff --git a/src/servers/sapphire_zone/Network/Handlers/InventoryHandler.cpp b/src/servers/sapphire_zone/Network/Handlers/InventoryHandler.cpp index 71ec3f2e..6e3a65f7 100644 --- a/src/servers/sapphire_zone/Network/Handlers/InventoryHandler.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/InventoryHandler.cpp @@ -38,17 +38,20 @@ enum InventoryOperation Split = 0x0A }; -void Core::Network::GameConnection::inventoryModifyHandler( const Packets::GamePacket& inPacket, +void Core::Network::GameConnection::inventoryModifyHandler( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) { - uint32_t seq = inPacket.getValAt< uint32_t >( 0x20 ); - uint8_t action = inPacket.getValAt< uint8_t >( 0x24 ); - uint8_t fromSlot = inPacket.getValAt< uint8_t >( 0x30 ); - uint8_t toSlot = inPacket.getValAt< uint8_t >( 0x44 ); - uint16_t fromContainer = inPacket.getValAt< uint16_t >( 0x2C ); - uint16_t toContainer = inPacket.getValAt< uint16_t >( 0x40 ); + Packets::FFXIVARR_PACKET_RAW copy = inPacket; + auto seq = *reinterpret_cast< uint32_t* >( ©.data[0x10] ); + auto action = *reinterpret_cast< uint8_t* >( ©.data[0x14] ); + auto fromSlot = *reinterpret_cast< uint8_t* >( ©.data[0x20] ); + auto toSlot = *reinterpret_cast< uint8_t* >( ©.data[0x34] ); + + auto fromContainer = *reinterpret_cast< uint16_t* >( ©.data[0x1C] ); + auto toContainer = *reinterpret_cast< uint16_t* >( ©.data[0x30] ); + // todo: check packet handler in game and see if this is sent as a u16 or u32 - uint16_t splitCount = inPacket.getValAt< uint16_t >( 0x48 ); + auto splitCount = *reinterpret_cast< uint16_t* >( ©.data[0x38] ); ZoneChannelPacket< FFXIVIpcInventoryActionAck > ackPacket( player.getId() ); ackPacket.data().sequence = seq; @@ -58,7 +61,7 @@ void Core::Network::GameConnection::inventoryModifyHandler( const Packets::GameP auto pLog = g_fw.get< Logger >(); - pLog->debug( inPacket.toString() ); + //pLog->debug( inPacket.toString() ); pLog->debug( "InventoryAction: " + std::to_string( action ) ); // TODO: other inventory operations need to be implemented diff --git a/src/servers/sapphire_zone/Network/Handlers/PacketHandlers.cpp b/src/servers/sapphire_zone/Network/Handlers/PacketHandlers.cpp index a0b55b65..c26da3aa 100644 --- a/src/servers/sapphire_zone/Network/Handlers/PacketHandlers.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/PacketHandlers.cpp @@ -45,7 +45,7 @@ using namespace Core::Common; using namespace Core::Network::Packets; using namespace Core::Network::Packets::Server; -void Core::Network::GameConnection::fcInfoReqHandler( const Packets::GamePacket& inPacket, +void Core::Network::GameConnection::fcInfoReqHandler( const Core::Network::Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) { // TODO: use new packet struct for this @@ -54,16 +54,18 @@ void Core::Network::GameConnection::fcInfoReqHandler( const Packets::GamePacket& //queueOutPacket( pPe ); } -void Core::Network::GameConnection::setSearchInfoHandler( const Packets::GamePacket& inPacket, +void Core::Network::GameConnection::setSearchInfoHandler( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) { - uint32_t inval = inPacket.getValAt< uint32_t >( 0x20 ); - uint32_t inval1 = inPacket.getValAt< uint32_t >( 0x24 ); - uint64_t status = inPacket.getValAt< uint64_t >( 0x20 ); + Packets::FFXIVARR_PACKET_RAW copy = inPacket; - uint8_t selectRegion = inPacket.getValAt< uint8_t >( 0x31 ); + auto inval = *reinterpret_cast< uint32_t* >( ©.data[0x10] ); + auto inval1 = *reinterpret_cast< uint32_t* >( ©.data[0x14] ); + auto status = *reinterpret_cast< uint64_t* >( ©.data[0x10] ); - player.setSearchInfo( selectRegion, 0, inPacket.getStringAt( 0x32 ) ); + auto selectRegion = copy.data[0x21]; + + player.setSearchInfo( selectRegion, 0, reinterpret_cast< char* >( ©.data[0x22] ) ); player.setOnlineStatusMask( status ); @@ -88,7 +90,7 @@ void Core::Network::GameConnection::setSearchInfoHandler( const Packets::GamePac static_cast< uint8_t >( player.getOnlineStatus() ) ), true ); } -void Core::Network::GameConnection::reqSearchInfoHandler( const Packets::GamePacket& inPacket, +void Core::Network::GameConnection::reqSearchInfoHandler( const Core::Network::Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) { ZoneChannelPacket< FFXIVIpcInitSearchInfo > searchInfoPacket( player.getId() ); @@ -98,20 +100,22 @@ void Core::Network::GameConnection::reqSearchInfoHandler( const Packets::GamePac queueOutPacket( searchInfoPacket ); } -void Core::Network::GameConnection::linkshellListHandler( const Packets::GamePacket& inPacket, +void Core::Network::GameConnection::linkshellListHandler( const Core::Network::Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) { ZoneChannelPacket< FFXIVIpcLinkshellList > linkshellListPacket( player.getId() ); queueOutPacket( linkshellListPacket ); } -void Core::Network::GameConnection::updatePositionHandler( const Packets::GamePacket& inPacket, +void Core::Network::GameConnection::updatePositionHandler( const Core::Network::Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) { // if the player is marked for zoning we no longer want to update his pos if( player.isMarkedForZoning() ) return; + Packets::FFXIVARR_PACKET_RAW copy = inPacket; + struct testMov { uint32_t specialMovement : 23; // 0x00490FDA @@ -140,10 +144,10 @@ void Core::Network::GameConnection::updatePositionHandler( const Packets::GamePa uint16_t bit16 : 1; } IPC_OP_019AB; - uint16_t flags = inPacket.getValAt( 0x28 ); + auto flags = *reinterpret_cast< uint16_t* >( ©.data[0x18] ); memcpy( &IPC_OP_019AB, &flags, 2 ); - uint32_t flags1 = inPacket.getValAt( 0x24 ); + auto flags1 = *reinterpret_cast< uint32_t* >( ©.data[0x14] ); memcpy( &IPC_OP_019A, &flags1, 4 ); //g_log.Log(LoggingSeverity::debug, "" + boost::lexical_cast((int)IPC_OP_019AB.bit1) @@ -173,18 +177,19 @@ void Core::Network::GameConnection::updatePositionHandler( const Packets::GamePa //pInPacket->debugPrint(); + ; bool bPosChanged = false; - if( ( player.getPos().x != inPacket.getValAt< float >( 0x2c ) ) || - ( player.getPos().y != inPacket.getValAt< float >( 0x30 ) ) || - ( player.getPos().z != inPacket.getValAt< float >( 0x34 ) ) ) + if( ( player.getPos().x != *reinterpret_cast< float* >( ©.data[0x1C] ) ) || + ( player.getPos().y != *reinterpret_cast< float* >( ©.data[0x20] ) ) || + ( player.getPos().z != *reinterpret_cast< float* >( ©.data[0x24] ) ) ) bPosChanged = true; - if( !bPosChanged && player.getRot() == inPacket.getValAt< float >( 0x20 ) ) + if( !bPosChanged && player.getRot() == *reinterpret_cast< float* >( ©.data[0x10] ) ) return; - player.setRot( inPacket.getValAt< float >( 0x20 ) ); - player.setPos( inPacket.getValAt< float >( 0x2c ), - inPacket.getValAt< float >( 0x30 ), - inPacket.getValAt< float >( 0x34 ) ); + player.setRot( *reinterpret_cast< float* >( ©.data[0x10] ) ); + player.setPos( *reinterpret_cast< float* >( ©.data[0x1C] ), + *reinterpret_cast< float* >( ©.data[0x20] ), + *reinterpret_cast< float* >( ©.data[0x24] ) ); if( ( player.getCurrentAction() != nullptr ) && bPosChanged ) player.getCurrentAction()->setInterrupted(); @@ -193,9 +198,9 @@ void Core::Network::GameConnection::updatePositionHandler( const Packets::GamePa if( !player.hasInRangeActor() ) return; - uint8_t unk = inPacket.getValAt< uint8_t >( 0x29 ); + auto unk = *reinterpret_cast< uint8_t* >( ©.data[0x19] ); - uint16_t moveType = inPacket.getValAt< uint16_t >( 0x28 ); + auto moveType = *reinterpret_cast< uint16_t* >( ©.data[0x18] ); uint8_t unk1 = 0; uint8_t unk2 = 0; @@ -279,19 +284,21 @@ void Core::Network::GameConnection::updatePositionHandler( const Packets::GamePa } -void Core::Network::GameConnection::reqEquipDisplayFlagsHandler( const Packets::GamePacket& inPacket, +void Core::Network::GameConnection::reqEquipDisplayFlagsHandler( const Core::Network::Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) { - player.setEquipDisplayFlags( inPacket.getValAt< uint8_t >( 0x20 ) ); + player.setEquipDisplayFlags( inPacket.data[0x10] ); player.sendDebug( "EquipDisplayFlag CHANGE: " + std::to_string( player.getEquipDisplayFlags() ) ); } -void Core::Network::GameConnection::zoneLineHandler( const Packets::GamePacket& inPacket, +void Core::Network::GameConnection::zoneLineHandler( const Core::Network::Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) { auto pTeriMgr = g_fw.get< TerritoryMgr >(); - uint32_t zoneLineId = inPacket.getValAt< uint32_t >( 0x20 ); + + Packets::FFXIVARR_PACKET_RAW copy = inPacket; + auto zoneLineId = *reinterpret_cast< uint32_t* >( ©.data[0x10] ); player.sendDebug( "Walking ZoneLine " + std::to_string( zoneLineId ) ); @@ -331,10 +338,13 @@ void Core::Network::GameConnection::zoneLineHandler( const Packets::GamePacket& } -void Core::Network::GameConnection::discoveryHandler( const Packets::GamePacket& inPacket, +void Core::Network::GameConnection::discoveryHandler( const Core::Network::Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) { - uint32_t ref_position_id = inPacket.getValAt< uint32_t >( 0x20 ); + + Packets::FFXIVARR_PACKET_RAW copy = inPacket; + + auto ref_position_id = *reinterpret_cast< uint32_t* >( ©.data[0x10] ); auto pDb = g_fw.get< Db::DbWorkerPool< Db::CharaDbConnection > >(); @@ -360,7 +370,7 @@ void Core::Network::GameConnection::discoveryHandler( const Packets::GamePacket& } -void Core::Network::GameConnection::playTimeHandler( const Packets::GamePacket& inPacket, +void Core::Network::GameConnection::playTimeHandler( const Core::Network::Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) { ZoneChannelPacket< FFXIVIpcPlayTime > playTimePacket( player.getId() ); @@ -369,7 +379,7 @@ void Core::Network::GameConnection::playTimeHandler( const Packets::GamePacket& } -void Core::Network::GameConnection::initHandler( const Packets::GamePacket& inPacket, +void Core::Network::GameConnection::initHandler( const Core::Network::Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) { // init handler means this is a login procedure @@ -379,10 +389,10 @@ void Core::Network::GameConnection::initHandler( const Packets::GamePacket& inPa } -void Core::Network::GameConnection::blackListHandler( const Packets::GamePacket& inPacket, +void Core::Network::GameConnection::blackListHandler( const Core::Network::Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) { - uint8_t count = inPacket.getValAt< uint8_t >( 0x21 ); + uint8_t count = inPacket.data[0x11]; ZoneChannelPacket< FFXIVIpcBlackList > blackListPacket( player.getId() ); blackListPacket.data().sequence = count; @@ -394,10 +404,12 @@ void Core::Network::GameConnection::blackListHandler( const Packets::GamePacket& } -void Core::Network::GameConnection::pingHandler( const Packets::GamePacket& inPacket, +void Core::Network::GameConnection::pingHandler( const Core::Network::Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) { - int32_t inVal = inPacket.getValAt< int32_t >( 0x20 ); + Packets::FFXIVARR_PACKET_RAW copy = inPacket; + auto inVal = *reinterpret_cast< uint32_t* >( ©.data[0x10] ); + PingPacket pingPacket( player, inVal ); queueOutPacket( pingPacket ); @@ -405,7 +417,7 @@ void Core::Network::GameConnection::pingHandler( const Packets::GamePacket& inPa } -void Core::Network::GameConnection::finishLoadingHandler( const Packets::GamePacket& inPacket, +void Core::Network::GameConnection::finishLoadingHandler( const Core::Network::Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) { player.getCurrentZone()->onFinishLoading( player ); @@ -428,12 +440,12 @@ void Core::Network::GameConnection::finishLoadingHandler( const Packets::GamePac player.getCurrentZone()->updateActorPosition(player); } -void Core::Network::GameConnection::socialListHandler( const Packets::GamePacket& inPacket, +void Core::Network::GameConnection::socialListHandler( const Core::Network::Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) { - uint8_t type = inPacket.getValAt< uint8_t >( 0x2A ); - uint8_t count = inPacket.getValAt< uint8_t >( 0x2B ); + uint8_t type = inPacket.data[0x1A]; + uint8_t count = inPacket.data[0x1B]; if( type == 0x02 ) { // party list @@ -486,14 +498,16 @@ void Core::Network::GameConnection::socialListHandler( const Packets::GamePacket } -void Core::Network::GameConnection::chatHandler( const Packets::GamePacket& inPacket, +void Core::Network::GameConnection::chatHandler( const Core::Network::Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) { - auto pDebugCom = g_fw.get< DebugCommandHandler >(); - std::string chatString( inPacket.getStringAt( 0x3a ) ); - uint32_t sourceId = inPacket.getValAt< uint32_t >( 0x24 ); + Packets::FFXIVARR_PACKET_RAW copy = inPacket; + + std::string chatString( reinterpret_cast< char* >( ©.data[0x2a] ) ); + + auto sourceId = *reinterpret_cast< uint32_t* >( ©.data[0x14] ); if( chatString.at( 0 ) == '!' ) { @@ -502,7 +516,7 @@ void Core::Network::GameConnection::chatHandler( const Packets::GamePacket& inPa return; } - ChatType chatType = static_cast< ChatType >( inPacket.getValAt< uint8_t >( 0x38 ) ); + ChatType chatType = static_cast< ChatType >( inPacket.data[0x28] ); //ToDo, need to implement sending GM chat types. ChatPacket chatPacket( player, chatType, chatString ); @@ -546,7 +560,7 @@ void Core::Network::GameConnection::chatHandler( const Packets::GamePacket& inPa // currently we wait for the session to just time out after logout, this can be a problem is the user tries to // log right back in. // Also the packet needs to be converted to an ipc structure -void Core::Network::GameConnection::logoutHandler( const Packets::GamePacket& inPacket, +void Core::Network::GameConnection::logoutHandler( const Core::Network::Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) { ZoneChannelPacket< FFXIVIpcLogout > logoutPacket( player.getId() ); @@ -558,11 +572,13 @@ void Core::Network::GameConnection::logoutHandler( const Packets::GamePacket& in } -void Core::Network::GameConnection::tellHandler( const Packets::GamePacket& inPacket, +void Core::Network::GameConnection::tellHandler( const Core::Network::Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) { - std::string targetPcName = inPacket.getStringAt( 0x21 ); - std::string msg = inPacket.getStringAt( 0x41 ); + Packets::FFXIVARR_PACKET_RAW copy = inPacket; + + std::string targetPcName( reinterpret_cast< char* >( ©.data[0x11] ) ); + std::string msg( reinterpret_cast< char* >( ©.data[0x31] ) ); auto pZoneServer = g_fw.get< ServerZone >(); @@ -610,13 +626,12 @@ void Core::Network::GameConnection::tellHandler( const Packets::GamePacket& inPa } -void Core::Network::GameConnection::performNoteHandler( const Packets::GamePacket& inPacket, +void Core::Network::GameConnection::performNoteHandler( const Core::Network::Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) { ZoneChannelPacket< FFXIVIpcPerformNote > performPacket( player.getId() ); - auto inVal = inPacket.getDataAt( 0x20 ); - memcpy( &performPacket.data().data[0], inVal, 32 ); + 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 aa068d79..885e4042 100644 --- a/src/servers/sapphire_zone/Network/Handlers/SkillHandler.cpp +++ b/src/servers/sapphire_zone/Network/Handlers/SkillHandler.cpp @@ -33,103 +33,105 @@ using namespace Core::Common; using namespace Core::Network::Packets; using namespace Core::Network::Packets::Server; -void Core::Network::GameConnection::skillHandler( const Packets::GamePacket& inPacket, +void Core::Network::GameConnection::skillHandler( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) { - uint8_t type = inPacket.getValAt< uint32_t >( 0x21 ); + Packets::FFXIVARR_PACKET_RAW copy = inPacket; + + uint8_t type = inPacket.data[0x11]; - uint32_t action = inPacket.getValAt< uint32_t >( 0x24 ); - uint32_t useCount = inPacket.getValAt< uint32_t >( 0x28 ); + auto action = *reinterpret_cast< uint32_t* >( ©.data[0x14] ); + auto useCount = *reinterpret_cast< uint32_t* >( ©.data[0x18] ); - uint64_t targetId = inPacket.getValAt< uint64_t >( 0x30 ); + auto targetId = *reinterpret_cast< uint64_t* >( ©.data[0x20] ); - player.sendDebug( "Skill type:" + std::to_string( type ) ); - - auto pExdData = g_fw.get< Data::ExdDataGenerated >(); - auto pScriptMgr = g_fw.get< Scripting::ScriptMgr >(); + player.sendDebug( "Skill type:" + std::to_string( type ) ); - switch( type ) - { - case Common::SkillType::Normal: + auto pExdData = g_fw.get< Data::ExdDataGenerated >(); + auto pScriptMgr = g_fw.get< Scripting::ScriptMgr >(); - if( action < 1000000 ) // normal action - { - std::string actionIdStr = boost::str( boost::format( "%|04X|" ) % action ); - player.sendDebug( "---------------------------------------" ); - player.sendDebug( "ActionHandler ( " + actionIdStr + " | " + - pExdData->get< Core::Data::Action >( action )->name + - " | " + std::to_string( targetId ) + " )" ); + switch( type ) + { + case Common::SkillType::Normal: - player.queuePacket( ActorControlPacket142( player.getId(), ActorControlType::ActionStart, 0x01, action ) ); + if( action < 1000000 ) // normal action + { + std::string actionIdStr = boost::str( boost::format( "%|04X|" ) % action ); + player.sendDebug( "---------------------------------------" ); + player.sendDebug( "ActionHandler ( " + actionIdStr + " | " + + pExdData->get< Core::Data::Action >( action )->name + + " | " + std::to_string( targetId ) + " )" ); - if( action == 5 ) - { - auto currentAction = player.getCurrentAction(); + player.queuePacket( ActorControlPacket142( player.getId(), ActorControlType::ActionStart, 0x01, action ) ); - // we should always have an action here, if not there is a bug - assert( currentAction ); - currentAction->onStart(); - } - else - { - Core::Entity::ActorPtr targetActor = player.getAsPlayer(); - - if( targetId != player.getId() ) - { - targetActor = player.lookupTargetById( targetId ); - } + if( action == 5 ) + { + auto currentAction = player.getCurrentAction(); - // Check if we actually have an actor - if( !targetActor ) - { - // todo: interrupt a cast. - player.sendDebug( "Invalid target." ); - return; - } + // we should always have an action here, if not there is a bug + assert( currentAction ); + currentAction->onStart(); + } + else + { + Core::Entity::ActorPtr targetActor = player.getAsPlayer(); - if( !player.actionHasCastTime( action ) ) - { - pScriptMgr->onCastFinish( player, targetActor->getAsChara(), action ); - } - else - { - auto pActionCast = Action::make_ActionCast( player.getAsPlayer(), targetActor->getAsChara(), action ); - player.setCurrentAction( pActionCast ); - player.sendDebug( "setCurrentAction()" ); - player.getCurrentAction()->onStart(); - } - } - } - else if( action < 2000000 ) // craft action - { + if( targetId != player.getId() ) + { + targetActor = player.lookupTargetById( targetId ); + } - } - else if( action < 3000000 ) // item action - { - auto info = pExdData->get< Core::Data::EventItem >( action ); - if( info ) - { - pScriptMgr->onEventItem( player, action, info->quest, info->castTime, targetId ); - } - } - else if( action > 3000000 ) // unknown - { + // Check if we actually have an actor + if( !targetActor ) + { + // todo: interrupt a cast. + player.sendDebug( "Invalid target." ); + return; + } - } + if( !player.actionHasCastTime( action ) ) + { + pScriptMgr->onCastFinish( player, targetActor->getAsChara(), action ); + } + else + { + auto pActionCast = Action::make_ActionCast( player.getAsPlayer(), targetActor->getAsChara(), action ); + player.setCurrentAction( pActionCast ); + player.sendDebug( "setCurrentAction()" ); + player.getCurrentAction()->onStart(); + } + } + } + else if( action < 2000000 ) // craft action + { - break; + } + else if( action < 3000000 ) // item action + { + auto info = pExdData->get< Core::Data::EventItem >( action ); + if( info ) + { + pScriptMgr->onEventItem( player, action, info->quest, info->castTime, targetId ); + } + } + else if( action > 3000000 ) // unknown + { - case Common::SkillType::MountSkill: + } - player.sendDebug( "Request mount " + std::to_string( action ) ); + break; - auto pActionMount = Action::make_ActionMount( player.getAsPlayer(), action ); - player.setCurrentAction( pActionMount ); - player.sendDebug( "setCurrentAction()" ); - player.getCurrentAction()->onStart(); - - break; + case Common::SkillType::MountSkill: - } + player.sendDebug( "Request mount " + std::to_string( action ) ); + + auto pActionMount = Action::make_ActionMount( player.getAsPlayer(), action ); + player.setCurrentAction( pActionMount ); + player.sendDebug( "setCurrentAction()" ); + player.getCurrentAction()->onStart(); + + break; + + } }