1
Fork 0
mirror of https://github.com/SapphireServer/Sapphire.git synced 2025-05-05 18:27:47 +00:00

Emancipation from the GamePacket class, step 1

This commit is contained in:
Mordred 2018-06-18 23:03:39 +02:00
parent 5c7b8e31e6
commit 972cd05e48
10 changed files with 273 additions and 227 deletions

View file

@ -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, void Core::Network::GameConnection::handlePackets( const Core::Network::Packets::FFXIVARR_PACKET_HEADER& ipcHeader,
const std::vector<Core::Network::Packets::FFXIVARR_PACKET_RAW>& packetData ) const std::vector< Core::Network::Packets::FFXIVARR_PACKET_RAW >& packetData )
{ {
for( auto inPacket : packetData ) for( auto inPacket : packetData )

View file

@ -174,7 +174,7 @@ void Core::Network::GameConnection::OnError( const boost::system::error_code & e
pLog->debug( "GameConnection ERROR: " + error.message() ); 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 ); m_inQueue.push( inPacket );
} }
@ -184,24 +184,25 @@ void Core::Network::GameConnection::queueOutPacket( Core::Network::Packets::Game
m_outQueue.push( outPacket ); 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 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() ) + "]"; std::string sessionStr = "[" + std::to_string( m_pSession->getId() ) + "]";
if( it != m_zoneHandlerMap.end() ) 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"; 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 // dont display packet notification if it is a ping or pos update, don't want the spam
if( pPacket.getSubType() != PingHandler && if( opcode != PingHandler &&
pPacket.getSubType() != UpdatePositionHandler ) opcode != UpdatePositionHandler )
pLog->debug( sessionStr + " Handling Zone IPC : " + name + "( " + pLog->debug( sessionStr + " Handling Zone IPC : " + name + "( " +
boost::str( boost::format( "%|04X|" ) % boost::str( boost::format( "%|04X|" ) %
static_cast< uint32_t >( pPacket.getSubType() & 0xFFFF ) ) + " )" ); static_cast< uint32_t >( opcode ) ) + " )" );
( this->*( it->second ) )( pPacket, *m_pSession->getPlayer() ); ( 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 ( " + pLog->debug( sessionStr + " Undefined Zone IPC : Unknown ( " +
boost::str( boost::format( "%|04X|" ) % boost::str( boost::format( "%|04X|" ) %
static_cast< uint32_t >( pPacket.getSubType() & 0xFFFF ) ) + " )" ); static_cast< uint32_t >( opcode ) ) + " )" );
pLog->debug( "\n" + pPacket.toString() ); //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 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() ) + "]"; std::string sessionStr = "[" + std::to_string( m_pSession->getId() ) + "]";
if( it != m_chatHandlerMap.end() ) 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"; 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 // dont display packet notification if it is a ping or pos update, don't want the spam
pLog->debug( sessionStr + " Handling Chat IPC : " + name + "( " + pLog->debug( sessionStr + " Handling Chat IPC : " + name + "( " +
boost::str( boost::format( "%|04X|" ) % boost::str( boost::format( "%|04X|" ) %
static_cast< uint32_t >( pPacket.getSubType() & 0xFFFF ) ) + " )" ); static_cast< uint32_t >( opcode ) ) + " )" );
( this->*( it->second ) )( pPacket, *m_pSession->getPlayer() ); ( 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 ( " + pLog->debug( sessionStr + " Undefined Chat IPC : Unknown ( " +
boost::str( boost::format( "%|04X|" ) % boost::str( boost::format( "%|04X|" ) %
static_cast< uint32_t >( pPacket.getSubType() & 0xFFFF ) ) + " )" ); static_cast< uint32_t >( opcode ) ) + " )" );
pLog->debug( pPacket.toString() ); //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 ) if( !m_pSession )
return; return;
@ -251,11 +253,11 @@ void Core::Network::GameConnection::handlePacket( Core::Network::Packets::GamePa
switch( m_conType ) switch( m_conType )
{ {
case Network::ConnectionType::Zone: case Network::ConnectionType::Zone:
handleZonePacket( *pPacket ); handleZonePacket( pPacket );
break; break;
case Network::ConnectionType::Chat: case Network::ConnectionType::Chat:
handleChatPacket( *pPacket ); handleChatPacket( pPacket );
break; break;
} }
@ -273,8 +275,9 @@ void Core::Network::GameConnection::sendPackets( Packets::PacketContainer* pPack
void Core::Network::GameConnection::processInQueue() void Core::Network::GameConnection::processInQueue()
{ {
// handle the incoming game packets // handle the incoming game packets
while( auto pPacket = m_inQueue.pop() ) while( m_inQueue.size() )
{ {
auto pPacket = m_inQueue.pop();
handlePacket( pPacket ); handlePacket( pPacket );
} }
} }
@ -442,8 +445,7 @@ void Core::Network::GameConnection::handlePackets( const Core::Network::Packets:
} }
case 3: // game packet case 3: // game packet
{ {
auto pPacket = new GamePacket( inPacket ); queueInPacket( inPacket );
queueInPacket( Packets::GamePacketPtr( pPacket ) );
break; break;
} }
case 7: // keep alive case 7: // keep alive

View file

@ -9,7 +9,7 @@
#include "Forwards.h" #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 Core {
namespace Network { namespace Network {
@ -28,7 +28,7 @@ class GameConnection : public Connection
{ {
private: 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 HandlerMap = std::map< uint16_t, Handler >;
using HandlerStrMap = std::map< uint16_t, std::string >; using HandlerStrMap = std::map< uint16_t, std::string >;
@ -45,7 +45,7 @@ private:
SessionPtr m_pSession; SessionPtr m_pSession;
LockedQueue< Packets::GamePacketPtr > m_inQueue; LockedQueue< Core::Network::Packets::FFXIVARR_PACKET_RAW > m_inQueue;
LockedQueue< Packets::GamePacketPtr > m_outQueue; LockedQueue< Packets::GamePacketPtr > m_outQueue;
public: public:
@ -67,17 +67,17 @@ public:
void handlePackets( const Packets::FFXIVARR_PACKET_HEADER& ipcHeader, void handlePackets( const Packets::FFXIVARR_PACKET_HEADER& ipcHeader,
const std::vector< Packets::FFXIVARR_PACKET_RAW >& packetData ); 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 queueOutPacket( Packets::GamePacketPtr outPacket );
void processInQueue(); void processInQueue();
void processOutQueue(); 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 ); void sendPackets( Packets::PacketContainer* pPacket );

View file

@ -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 ) Entity::Player& player )
{ {
Packets::FFXIVARR_PACKET_RAW copy = inPacket;
auto pLog = g_fw.get< Logger >(); auto pLog = g_fw.get< Logger >();
uint16_t commandId = inPacket.getValAt< uint16_t >( 0x20 ); uint16_t commandId = *reinterpret_cast< uint16_t* >( &copy.data[0x10] );
uint64_t param1 = inPacket.getValAt< uint64_t >( 0x24 ); uint64_t param1 = *reinterpret_cast< uint64_t* >( &copy.data[0x14] );
uint32_t param11 = inPacket.getValAt< uint32_t >( 0x24 ); uint32_t param11 = *reinterpret_cast< uint32_t* >( &copy.data[0x14] );
uint32_t param12 = inPacket.getValAt< uint32_t >( 0x28 ); uint32_t param12 = *reinterpret_cast< uint32_t* >( &copy.data[0x18] );
uint32_t param2 = inPacket.getValAt< uint32_t >( 0x2C ); uint32_t param2 = *reinterpret_cast< uint32_t* >( &copy.data[0x1C] );
uint64_t param3 = inPacket.getValAt< uint64_t >( 0x38 ); uint64_t param3 = *reinterpret_cast< uint64_t* >( &copy.data[0x28] );
pLog->debug( "[" + std::to_string( m_pSession->getId() ) + "] Incoming action: " + pLog->debug( "[" + std::to_string( m_pSession->getId() ) + "] Incoming action: " +
boost::str( boost::format( "%|04X|" ) % ( uint32_t ) ( commandId & 0xFFFF ) ) + 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 case ClientTrigger::ChangeTarget: // Change target
{ {
uint64_t targetId = inPacket.getValAt< uint64_t >( 0x24 ); uint64_t targetId = param1;
player.changeTarget( targetId ); player.changeTarget( targetId );
break; break;
} }
@ -206,7 +208,7 @@ void Core::Network::GameConnection::actionHandler( const Packets::GamePacket& in
case ClientTrigger::Emote: // emote case ClientTrigger::Emote: // emote
{ {
uint64_t targetId = player.getTargetId(); uint64_t targetId = player.getTargetId();
uint32_t emoteId = inPacket.getValAt< uint32_t >( 0x24 ); uint32_t emoteId = param11;
player.emote( emoteId, targetId ); player.emote( emoteId, targetId );
break; break;

View file

@ -26,7 +26,7 @@ using namespace Core::Network::Packets;
using namespace Core::Network::Packets::Server; 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 ) Entity::Player& player )
{ {
ZoneChannelPacket< FFXIVIpcCFDutyInfo > dutyInfoPacket( player.getId() ); 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) Entity::Player& player)
{ {
Packets::FFXIVARR_PACKET_RAW copy = inPacket;
auto pTeriMgr = g_fw.get< TerritoryMgr >(); auto pTeriMgr = g_fw.get< TerritoryMgr >();
auto pExdData = g_fw.get< Data::ExdDataGenerated >(); auto pExdData = g_fw.get< Data::ExdDataGenerated >();
std::vector< uint16_t > selectedContent; 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* >( &copy.data[offset] );
if( id == 0 ) if( id == 0 )
break; break;
@ -93,7 +94,7 @@ void Core::Network::GameConnection::cfRegisterDuty( const Packets::GamePacket& i
player.setInstance( instance ); 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) Entity::Player& player)
{ {
ZoneChannelPacket< FFXIVIpcCFNotify > cfCancelPacket( player.getId() ); ZoneChannelPacket< FFXIVIpcCFNotify > cfCancelPacket( player.getId() );
@ -104,7 +105,7 @@ void Core::Network::GameConnection::cfRegisterRoulette( const Packets::GamePacke
player.sendDebug( "Roulette register" ); 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) Entity::Player& player)
{ {
player.sendDebug( "TODO: Duty accept" ); player.sendDebug( "TODO: Duty accept" );

View file

@ -33,12 +33,15 @@ using namespace Core::Common;
using namespace Core::Network::Packets; using namespace Core::Network::Packets;
using namespace Core::Network::Packets::Server; 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 pScriptMgr = g_fw.get< Scripting::ScriptMgr >();
auto pExdData = g_fw.get< Data::ExdDataGenerated >(); auto pExdData = g_fw.get< Data::ExdDataGenerated >();
auto actorId = inPacket.getValAt< uint64_t >( 0x20 ); Packets::FFXIVARR_PACKET_RAW copy = inPacket;
auto eventId = inPacket.getValAt< uint32_t >( 0x28 );
auto actorId = *reinterpret_cast< uint64_t* >( &copy.data[0x10] );
auto eventId = *reinterpret_cast< uint32_t* >( &copy.data[0x18] );
auto eventType = static_cast< uint16_t >( eventId >> 16 ); auto eventType = static_cast< uint16_t >( eventId >> 16 );
std::string eventName = "onTalk"; std::string eventName = "onTalk";
@ -56,7 +59,6 @@ void Core::Network::GameConnection::eventHandlerTalk( const Packets::GamePacket&
player.sendDebug( "Calling: " + objName + "." + eventName ); player.sendDebug( "Calling: " + objName + "." + eventName );
player.eventStart( actorId, eventId, Event::EventHandler::Talk, 0, 0 ); player.eventStart( actorId, eventId, Event::EventHandler::Talk, 0, 0 );
if( auto instance = player.getCurrentInstance() ) if( auto instance = player.getCurrentInstance() )
{ {
instance->onTalk( player, eventId, actorId ); 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 pScriptMgr = g_fw.get< Scripting::ScriptMgr >();
auto pExdData = g_fw.get< Data::ExdDataGenerated >(); auto pExdData = g_fw.get< Data::ExdDataGenerated >();
auto actorId = inPacket.getValAt< uint64_t >( 0x20 ); Packets::FFXIVARR_PACKET_RAW copy = inPacket;
auto eventId = inPacket.getValAt< uint32_t >( 0x28 );
auto emoteId = inPacket.getValAt< uint16_t >( 0x2C ); auto actorId = *reinterpret_cast< uint64_t* >( &copy.data[0x10] );
auto eventId = *reinterpret_cast< uint32_t* >( &copy.data[0x18] );
auto emoteId = *reinterpret_cast< uint16_t* >( &copy.data[0x1C] );
auto eventType = static_cast< uint16_t >( eventId >> 16 ); auto eventType = static_cast< uint16_t >( eventId >> 16 );
std::string eventName = "onEmote"; std::string eventName = "onEmote";
@ -109,15 +114,18 @@ void Core::Network::GameConnection::eventHandlerEmote( const Packets::GamePacket
player.checkEvent( eventId ); 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 ) Entity::Player& player )
{ {
auto pScriptMgr = g_fw.get< Scripting::ScriptMgr >(); auto pScriptMgr = g_fw.get< Scripting::ScriptMgr >();
auto eventId = inPacket.getValAt< uint32_t >( 0x24 ); Packets::FFXIVARR_PACKET_RAW copy = inPacket;
auto param1 = inPacket.getValAt< uint32_t >( 0x20 );
auto x = inPacket.getValAt< float >( 0x28 ); auto eventId = *reinterpret_cast< uint32_t* >( &copy.data[0x14] );
auto y = inPacket.getValAt< float >( 0x2C ); auto param1 = *reinterpret_cast< uint32_t* >( &copy.data[0x10] );
auto z = inPacket.getValAt< float >( 0x30 );
auto x = *reinterpret_cast< float* >( &copy.data[0x18] );
auto y = *reinterpret_cast< float* >( &copy.data[0x1C] );
auto z = *reinterpret_cast< float* >( &copy.data[0x20] );
std::string eventName = "onWithinRange"; std::string eventName = "onWithinRange";
std::string objName = Event::getEventName( eventId ); std::string objName = Event::getEventName( eventId );
@ -131,15 +139,18 @@ void Core::Network::GameConnection::eventHandlerWithinRange( const Packets::Game
player.checkEvent( eventId ); 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 ) Entity::Player& player )
{ {
auto pScriptMgr = g_fw.get< Scripting::ScriptMgr >(); auto pScriptMgr = g_fw.get< Scripting::ScriptMgr >();
auto eventId = inPacket.getValAt< uint32_t >( 0x24 ); Packets::FFXIVARR_PACKET_RAW copy = inPacket;
auto param1 = inPacket.getValAt< uint32_t >( 0x20 );
auto x = inPacket.getValAt< float >( 0x28 ); auto eventId = *reinterpret_cast< uint32_t* >( &copy.data[0x14] );
auto y = inPacket.getValAt< float >( 0x2C ); auto param1 = *reinterpret_cast< uint32_t* >( &copy.data[0x10] );
auto z = inPacket.getValAt< float >( 0x30 );
auto x = *reinterpret_cast< float* >( &copy.data[0x18] );
auto y = *reinterpret_cast< float* >( &copy.data[0x1C] );
auto z = *reinterpret_cast< float* >( &copy.data[0x20] );
std::string eventName = "onOutsideRange"; std::string eventName = "onOutsideRange";
std::string objName = Event::getEventName( eventId ); std::string objName = Event::getEventName( eventId );
@ -153,13 +164,15 @@ void Core::Network::GameConnection::eventHandlerOutsideRange( const Packets::Gam
player.checkEvent( eventId ); player.checkEvent( eventId );
} }
void Core::Network::GameConnection::eventHandlerEnterTerritory( const Packets::GamePacket &inPacket, void Core::Network::GameConnection::eventHandlerEnterTerritory( const Packets::FFXIVARR_PACKET_RAW& inPacket,
Entity::Player &player ) Entity::Player& player )
{ {
auto pScriptMgr = g_fw.get< Scripting::ScriptMgr >(); auto pScriptMgr = g_fw.get< Scripting::ScriptMgr >();
auto eventId = inPacket.getValAt< uint32_t >( 0x20 ); Packets::FFXIVARR_PACKET_RAW copy = inPacket;
auto param1 = inPacket.getValAt< uint16_t >( 0x24 );
auto param2 = inPacket.getValAt< uint16_t >( 0x26 ); auto eventId = *reinterpret_cast< uint32_t* >( &copy.data[0x14] );
auto param1 = *reinterpret_cast< uint16_t* >( &copy.data[0x10] );
auto param2 = *reinterpret_cast< uint16_t* >( &copy.data[0x16] );
std::string eventName = "onEnterTerritory"; std::string eventName = "onEnterTerritory";
@ -181,14 +194,16 @@ void Core::Network::GameConnection::eventHandlerEnterTerritory( const Packets::G
player.checkEvent( eventId ); player.checkEvent( eventId );
} }
void Core::Network::GameConnection::eventHandlerReturn( const Packets::GamePacket &inPacket, void Core::Network::GameConnection::eventHandlerReturn( const Packets::FFXIVARR_PACKET_RAW& inPacket,
Entity::Player &player ) Entity::Player& player )
{ {
auto eventId = inPacket.getValAt< uint32_t >( 0x20 ); Packets::FFXIVARR_PACKET_RAW copy = inPacket;
auto scene = inPacket.getValAt< uint16_t >( 0x24 );
auto param1 = inPacket.getValAt< uint16_t >( 0x26 ); auto eventId = *reinterpret_cast< uint32_t* >( &copy.data[0x10] );
auto param2 = inPacket.getValAt< uint16_t >( 0x28 ); auto scene = *reinterpret_cast< uint16_t* >( &copy.data[0x14] );
auto param3 = inPacket.getValAt< uint16_t >( 0x2C ); auto param1 = *reinterpret_cast< uint16_t* >( &copy.data[0x16] );
auto param2 = *reinterpret_cast< uint16_t* >( &copy.data[0x18] );
auto param3 = *reinterpret_cast< uint16_t* >( &copy.data[0x1C] );
std::string eventName = Event::getEventName( eventId ); 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, void Core::Network::GameConnection::eventHandlerLinkshell( const Packets::FFXIVARR_PACKET_RAW& inPacket,
Entity::Player &player ) Entity::Player& player )
{ {
auto eventId = inPacket.getValAt< uint32_t >( 0x20 ); Packets::FFXIVARR_PACKET_RAW copy = inPacket;
auto scene = inPacket.getValAt< uint16_t >( 0x24 );
auto lsName = inPacket.getStringAt( 0x27 ); auto eventId = *reinterpret_cast< uint32_t* >( &copy.data[0x10] );
auto scene = *reinterpret_cast< uint16_t* >( &copy.data[0x14] );
auto lsName = std::string( reinterpret_cast< char* >( &copy.data[0x17] ) );
ZoneChannelPacket< FFXIVIpcEventLinkshell > linkshellEvent( player.getId() ); ZoneChannelPacket< FFXIVIpcEventLinkshell > linkshellEvent( player.getId() );
linkshellEvent.data().eventId = eventId; linkshellEvent.data().eventId = eventId;

View file

@ -84,15 +84,17 @@ enum GmCommand
JumpNpc = 0x025F, 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 ) if( player.getGmRank() <= 0 )
return; return;
uint32_t commandId = inPacket.getValAt< uint32_t >( 0x20 ); Packets::FFXIVARR_PACKET_RAW copy = inPacket;
uint32_t param1 = inPacket.getValAt< uint32_t >( 0x24 ); auto commandId = *reinterpret_cast< uint32_t* >( &copy.data[0x10] );
uint32_t param2 = inPacket.getValAt< uint32_t >( 0x28 );
uint32_t param3 = inPacket.getValAt< uint32_t >( 0x38 ); uint32_t param1 = *reinterpret_cast< uint32_t* >( &copy.data[0x14] );
uint32_t param2 = *reinterpret_cast< uint32_t* >( &copy.data[0x18] );
uint32_t param3 = *reinterpret_cast< uint32_t* >( &copy.data[0x28] );
auto pLog = g_fw.get< Logger >(); auto pLog = g_fw.get< Logger >();
pLog->debug( player.getName() + " used GM1 commandId: " + std::to_string( commandId ) + 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 ) if( player.getGmRank() <= 0 )
return; return;
@ -484,8 +486,10 @@ void Core::Network::GameConnection::gm2Handler( const Packets::GamePacket& inPac
auto pLog = g_fw.get< Logger >(); auto pLog = g_fw.get< Logger >();
auto pServerZone = g_fw.get< ServerZone >(); auto pServerZone = g_fw.get< ServerZone >();
uint32_t commandId = inPacket.getValAt< uint32_t >( 0x20 ); Packets::FFXIVARR_PACKET_RAW copy = inPacket;
std::string param1 = inPacket.getStringAt( 0x34 ); auto commandId = *reinterpret_cast< uint32_t* >( &copy.data[0x10] );
auto param1 = std::string( reinterpret_cast< char* >( &copy.data[0x24] ) );
pLog->debug( player.getName() + " used GM2 commandId: " + std::to_string( commandId ) + ", params: " + param1 ); pLog->debug( player.getName() + " used GM2 commandId: " + std::to_string( commandId ) + ", params: " + param1 );

View file

@ -38,17 +38,20 @@ enum InventoryOperation
Split = 0x0A 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 ) Entity::Player& player )
{ {
uint32_t seq = inPacket.getValAt< uint32_t >( 0x20 ); Packets::FFXIVARR_PACKET_RAW copy = inPacket;
uint8_t action = inPacket.getValAt< uint8_t >( 0x24 ); auto seq = *reinterpret_cast< uint32_t* >( &copy.data[0x10] );
uint8_t fromSlot = inPacket.getValAt< uint8_t >( 0x30 ); auto action = *reinterpret_cast< uint8_t* >( &copy.data[0x14] );
uint8_t toSlot = inPacket.getValAt< uint8_t >( 0x44 ); auto fromSlot = *reinterpret_cast< uint8_t* >( &copy.data[0x20] );
uint16_t fromContainer = inPacket.getValAt< uint16_t >( 0x2C ); auto toSlot = *reinterpret_cast< uint8_t* >( &copy.data[0x34] );
uint16_t toContainer = inPacket.getValAt< uint16_t >( 0x40 );
auto fromContainer = *reinterpret_cast< uint16_t* >( &copy.data[0x1C] );
auto toContainer = *reinterpret_cast< uint16_t* >( &copy.data[0x30] );
// todo: check packet handler in game and see if this is sent as a u16 or u32 // 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* >( &copy.data[0x38] );
ZoneChannelPacket< FFXIVIpcInventoryActionAck > ackPacket( player.getId() ); ZoneChannelPacket< FFXIVIpcInventoryActionAck > ackPacket( player.getId() );
ackPacket.data().sequence = seq; ackPacket.data().sequence = seq;
@ -58,7 +61,7 @@ void Core::Network::GameConnection::inventoryModifyHandler( const Packets::GameP
auto pLog = g_fw.get< Logger >(); auto pLog = g_fw.get< Logger >();
pLog->debug( inPacket.toString() ); //pLog->debug( inPacket.toString() );
pLog->debug( "InventoryAction: " + std::to_string( action ) ); pLog->debug( "InventoryAction: " + std::to_string( action ) );
// TODO: other inventory operations need to be implemented // TODO: other inventory operations need to be implemented

View file

@ -45,7 +45,7 @@ using namespace Core::Common;
using namespace Core::Network::Packets; using namespace Core::Network::Packets;
using namespace Core::Network::Packets::Server; 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 ) Entity::Player& player )
{ {
// TODO: use new packet struct for this // TODO: use new packet struct for this
@ -54,16 +54,18 @@ void Core::Network::GameConnection::fcInfoReqHandler( const Packets::GamePacket&
//queueOutPacket( pPe ); //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 ) Entity::Player& player )
{ {
uint32_t inval = inPacket.getValAt< uint32_t >( 0x20 ); Packets::FFXIVARR_PACKET_RAW copy = inPacket;
uint32_t inval1 = inPacket.getValAt< uint32_t >( 0x24 );
uint64_t status = inPacket.getValAt< uint64_t >( 0x20 );
uint8_t selectRegion = inPacket.getValAt< uint8_t >( 0x31 ); auto inval = *reinterpret_cast< uint32_t* >( &copy.data[0x10] );
auto inval1 = *reinterpret_cast< uint32_t* >( &copy.data[0x14] );
auto status = *reinterpret_cast< uint64_t* >( &copy.data[0x10] );
player.setSearchInfo( selectRegion, 0, inPacket.getStringAt( 0x32 ) ); auto selectRegion = copy.data[0x21];
player.setSearchInfo( selectRegion, 0, reinterpret_cast< char* >( &copy.data[0x22] ) );
player.setOnlineStatusMask( status ); player.setOnlineStatusMask( status );
@ -88,7 +90,7 @@ void Core::Network::GameConnection::setSearchInfoHandler( const Packets::GamePac
static_cast< uint8_t >( player.getOnlineStatus() ) ), true ); 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 ) Entity::Player& player )
{ {
ZoneChannelPacket< FFXIVIpcInitSearchInfo > searchInfoPacket( player.getId() ); ZoneChannelPacket< FFXIVIpcInitSearchInfo > searchInfoPacket( player.getId() );
@ -98,20 +100,22 @@ void Core::Network::GameConnection::reqSearchInfoHandler( const Packets::GamePac
queueOutPacket( searchInfoPacket ); 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 ) Entity::Player& player )
{ {
ZoneChannelPacket< FFXIVIpcLinkshellList > linkshellListPacket( player.getId() ); ZoneChannelPacket< FFXIVIpcLinkshellList > linkshellListPacket( player.getId() );
queueOutPacket( linkshellListPacket ); 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 ) Entity::Player& player )
{ {
// if the player is marked for zoning we no longer want to update his pos // if the player is marked for zoning we no longer want to update his pos
if( player.isMarkedForZoning() ) if( player.isMarkedForZoning() )
return; return;
Packets::FFXIVARR_PACKET_RAW copy = inPacket;
struct testMov struct testMov
{ {
uint32_t specialMovement : 23; // 0x00490FDA uint32_t specialMovement : 23; // 0x00490FDA
@ -140,10 +144,10 @@ void Core::Network::GameConnection::updatePositionHandler( const Packets::GamePa
uint16_t bit16 : 1; uint16_t bit16 : 1;
} IPC_OP_019AB; } IPC_OP_019AB;
uint16_t flags = inPacket.getValAt<uint16_t>( 0x28 ); auto flags = *reinterpret_cast< uint16_t* >( &copy.data[0x18] );
memcpy( &IPC_OP_019AB, &flags, 2 ); memcpy( &IPC_OP_019AB, &flags, 2 );
uint32_t flags1 = inPacket.getValAt<uint32_t>( 0x24 ); auto flags1 = *reinterpret_cast< uint32_t* >( &copy.data[0x14] );
memcpy( &IPC_OP_019A, &flags1, 4 ); memcpy( &IPC_OP_019A, &flags1, 4 );
//g_log.Log(LoggingSeverity::debug, "" + boost::lexical_cast<std::string>((int)IPC_OP_019AB.bit1) //g_log.Log(LoggingSeverity::debug, "" + boost::lexical_cast<std::string>((int)IPC_OP_019AB.bit1)
@ -173,18 +177,19 @@ void Core::Network::GameConnection::updatePositionHandler( const Packets::GamePa
//pInPacket->debugPrint(); //pInPacket->debugPrint();
;
bool bPosChanged = false; bool bPosChanged = false;
if( ( player.getPos().x != inPacket.getValAt< float >( 0x2c ) ) || if( ( player.getPos().x != *reinterpret_cast< float* >( &copy.data[0x1C] ) ) ||
( player.getPos().y != inPacket.getValAt< float >( 0x30 ) ) || ( player.getPos().y != *reinterpret_cast< float* >( &copy.data[0x20] ) ) ||
( player.getPos().z != inPacket.getValAt< float >( 0x34 ) ) ) ( player.getPos().z != *reinterpret_cast< float* >( &copy.data[0x24] ) ) )
bPosChanged = true; bPosChanged = true;
if( !bPosChanged && player.getRot() == inPacket.getValAt< float >( 0x20 ) ) if( !bPosChanged && player.getRot() == *reinterpret_cast< float* >( &copy.data[0x10] ) )
return; return;
player.setRot( inPacket.getValAt< float >( 0x20 ) ); player.setRot( *reinterpret_cast< float* >( &copy.data[0x10] ) );
player.setPos( inPacket.getValAt< float >( 0x2c ), player.setPos( *reinterpret_cast< float* >( &copy.data[0x1C] ),
inPacket.getValAt< float >( 0x30 ), *reinterpret_cast< float* >( &copy.data[0x20] ),
inPacket.getValAt< float >( 0x34 ) ); *reinterpret_cast< float* >( &copy.data[0x24] ) );
if( ( player.getCurrentAction() != nullptr ) && bPosChanged ) if( ( player.getCurrentAction() != nullptr ) && bPosChanged )
player.getCurrentAction()->setInterrupted(); player.getCurrentAction()->setInterrupted();
@ -193,9 +198,9 @@ void Core::Network::GameConnection::updatePositionHandler( const Packets::GamePa
if( !player.hasInRangeActor() ) if( !player.hasInRangeActor() )
return; return;
uint8_t unk = inPacket.getValAt< uint8_t >( 0x29 ); auto unk = *reinterpret_cast< uint8_t* >( &copy.data[0x19] );
uint16_t moveType = inPacket.getValAt< uint16_t >( 0x28 ); auto moveType = *reinterpret_cast< uint16_t* >( &copy.data[0x18] );
uint8_t unk1 = 0; uint8_t unk1 = 0;
uint8_t unk2 = 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 ) Entity::Player& player )
{ {
player.setEquipDisplayFlags( inPacket.getValAt< uint8_t >( 0x20 ) ); player.setEquipDisplayFlags( inPacket.data[0x10] );
player.sendDebug( "EquipDisplayFlag CHANGE: " + std::to_string( player.getEquipDisplayFlags() ) ); 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 ) Entity::Player& player )
{ {
auto pTeriMgr = g_fw.get< TerritoryMgr >(); 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* >( &copy.data[0x10] );
player.sendDebug( "Walking ZoneLine " + std::to_string( zoneLineId ) ); 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 ) 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* >( &copy.data[0x10] );
auto pDb = g_fw.get< Db::DbWorkerPool< Db::CharaDbConnection > >(); 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 ) Entity::Player& player )
{ {
ZoneChannelPacket< FFXIVIpcPlayTime > playTimePacket( player.getId() ); 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 ) Entity::Player& player )
{ {
// init handler means this is a login procedure // 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 ) Entity::Player& player )
{ {
uint8_t count = inPacket.getValAt< uint8_t >( 0x21 ); uint8_t count = inPacket.data[0x11];
ZoneChannelPacket< FFXIVIpcBlackList > blackListPacket( player.getId() ); ZoneChannelPacket< FFXIVIpcBlackList > blackListPacket( player.getId() );
blackListPacket.data().sequence = count; 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 ) Entity::Player& player )
{ {
int32_t inVal = inPacket.getValAt< int32_t >( 0x20 ); Packets::FFXIVARR_PACKET_RAW copy = inPacket;
auto inVal = *reinterpret_cast< uint32_t* >( &copy.data[0x10] );
PingPacket pingPacket( player, inVal ); PingPacket pingPacket( player, inVal );
queueOutPacket( pingPacket ); 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 ) Entity::Player& player )
{ {
player.getCurrentZone()->onFinishLoading( player ); player.getCurrentZone()->onFinishLoading( player );
@ -428,12 +440,12 @@ void Core::Network::GameConnection::finishLoadingHandler( const Packets::GamePac
player.getCurrentZone()->updateActorPosition(player); 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 ) Entity::Player& player )
{ {
uint8_t type = inPacket.getValAt< uint8_t >( 0x2A ); uint8_t type = inPacket.data[0x1A];
uint8_t count = inPacket.getValAt< uint8_t >( 0x2B ); uint8_t count = inPacket.data[0x1B];
if( type == 0x02 ) if( type == 0x02 )
{ // party list { // 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 ) Entity::Player& player )
{ {
auto pDebugCom = g_fw.get< DebugCommandHandler >(); 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* >( &copy.data[0x2a] ) );
auto sourceId = *reinterpret_cast< uint32_t* >( &copy.data[0x14] );
if( chatString.at( 0 ) == '!' ) if( chatString.at( 0 ) == '!' )
{ {
@ -502,7 +516,7 @@ void Core::Network::GameConnection::chatHandler( const Packets::GamePacket& inPa
return; 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. //ToDo, need to implement sending GM chat types.
ChatPacket chatPacket( player, chatType, chatString ); 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 // 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. // log right back in.
// Also the packet needs to be converted to an ipc structure // 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 ) Entity::Player& player )
{ {
ZoneChannelPacket< FFXIVIpcLogout > logoutPacket( player.getId() ); 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 ) Entity::Player& player )
{ {
std::string targetPcName = inPacket.getStringAt( 0x21 ); Packets::FFXIVARR_PACKET_RAW copy = inPacket;
std::string msg = inPacket.getStringAt( 0x41 );
std::string targetPcName( reinterpret_cast< char* >( &copy.data[0x11] ) );
std::string msg( reinterpret_cast< char* >( &copy.data[0x31] ) );
auto pZoneServer = g_fw.get< ServerZone >(); 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 ) Entity::Player& player )
{ {
ZoneChannelPacket< FFXIVIpcPerformNote > performPacket( player.getId() ); ZoneChannelPacket< FFXIVIpcPerformNote > performPacket( player.getId() );
auto inVal = inPacket.getDataAt( 0x20 ); memcpy( &performPacket.data().data[0], &inPacket.data[0x10], 32 );
memcpy( &performPacket.data().data[0], inVal, 32 );
player.sendToInRangeSet( performPacket ); player.sendToInRangeSet( performPacket );
} }

View file

@ -33,103 +33,105 @@ using namespace Core::Common;
using namespace Core::Network::Packets; using namespace Core::Network::Packets;
using namespace Core::Network::Packets::Server; 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 ) 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 ); auto action = *reinterpret_cast< uint32_t* >( &copy.data[0x14] );
uint32_t useCount = inPacket.getValAt< uint32_t >( 0x28 ); auto useCount = *reinterpret_cast< uint32_t* >( &copy.data[0x18] );
uint64_t targetId = inPacket.getValAt< uint64_t >( 0x30 ); auto targetId = *reinterpret_cast< uint64_t* >( &copy.data[0x20] );
player.sendDebug( "Skill type:" + std::to_string( type ) ); player.sendDebug( "Skill type:" + std::to_string( type ) );
auto pExdData = g_fw.get< Data::ExdDataGenerated >();
auto pScriptMgr = g_fw.get< Scripting::ScriptMgr >();
switch( type ) auto pExdData = g_fw.get< Data::ExdDataGenerated >();
{ auto pScriptMgr = g_fw.get< Scripting::ScriptMgr >();
case Common::SkillType::Normal:
if( action < 1000000 ) // normal action switch( type )
{ {
std::string actionIdStr = boost::str( boost::format( "%|04X|" ) % action ); case Common::SkillType::Normal:
player.sendDebug( "---------------------------------------" );
player.sendDebug( "ActionHandler ( " + actionIdStr + " | " +
pExdData->get< Core::Data::Action >( action )->name +
" | " + std::to_string( targetId ) + " )" );
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 ) player.queuePacket( ActorControlPacket142( player.getId(), ActorControlType::ActionStart, 0x01, action ) );
{
auto currentAction = player.getCurrentAction();
// we should always have an action here, if not there is a bug if( action == 5 )
assert( currentAction ); {
currentAction->onStart(); auto currentAction = player.getCurrentAction();
}
else
{
Core::Entity::ActorPtr targetActor = player.getAsPlayer();
if( targetId != player.getId() )
{
targetActor = player.lookupTargetById( targetId );
}
// Check if we actually have an actor // we should always have an action here, if not there is a bug
if( !targetActor ) assert( currentAction );
{ currentAction->onStart();
// todo: interrupt a cast. }
player.sendDebug( "Invalid target." ); else
return; {
} Core::Entity::ActorPtr targetActor = player.getAsPlayer();
if( !player.actionHasCastTime( action ) ) if( targetId != player.getId() )
{ {
pScriptMgr->onCastFinish( player, targetActor->getAsChara(), action ); targetActor = player.lookupTargetById( targetId );
} }
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
{
} // Check if we actually have an actor
else if( action < 3000000 ) // item action if( !targetActor )
{ {
auto info = pExdData->get< Core::Data::EventItem >( action ); // todo: interrupt a cast.
if( info ) player.sendDebug( "Invalid target." );
{ return;
pScriptMgr->onEventItem( player, action, info->quest, info->castTime, targetId ); }
}
}
else if( action > 3000000 ) // unknown
{
} 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 ); case Common::SkillType::MountSkill:
player.setCurrentAction( pActionMount );
player.sendDebug( "setCurrentAction()" );
player.getCurrentAction()->onStart();
break;
} 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;
}
} }