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,
const std::vector<Core::Network::Packets::FFXIVARR_PACKET_RAW>& packetData )
const std::vector< Core::Network::Packets::FFXIVARR_PACKET_RAW >& 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() );
}
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

View file

@ -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 );

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 )
{
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* >( &copy.data[0x10] );
uint64_t param1 = *reinterpret_cast< uint64_t* >( &copy.data[0x14] );
uint32_t param11 = *reinterpret_cast< uint32_t* >( &copy.data[0x14] );
uint32_t param12 = *reinterpret_cast< uint32_t* >( &copy.data[0x18] );
uint32_t param2 = *reinterpret_cast< uint32_t* >( &copy.data[0x1C] );
uint64_t param3 = *reinterpret_cast< uint64_t* >( &copy.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;

View file

@ -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* >( &copy.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" );

View file

@ -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* >( &copy.data[0x10] );
auto eventId = *reinterpret_cast< uint32_t* >( &copy.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* >( &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 );
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* >( &copy.data[0x14] );
auto param1 = *reinterpret_cast< uint32_t* >( &copy.data[0x10] );
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 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* >( &copy.data[0x14] );
auto param1 = *reinterpret_cast< uint32_t* >( &copy.data[0x10] );
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 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* >( &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";
@ -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* >( &copy.data[0x10] );
auto scene = *reinterpret_cast< uint16_t* >( &copy.data[0x14] );
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 );
@ -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* >( &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() );
linkshellEvent.data().eventId = eventId;

View file

@ -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* >( &copy.data[0x10] );
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 >();
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* >( &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 );

View file

@ -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* >( &copy.data[0x10] );
auto action = *reinterpret_cast< uint8_t* >( &copy.data[0x14] );
auto fromSlot = *reinterpret_cast< uint8_t* >( &copy.data[0x20] );
auto toSlot = *reinterpret_cast< uint8_t* >( &copy.data[0x34] );
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
uint16_t splitCount = inPacket.getValAt< uint16_t >( 0x48 );
auto splitCount = *reinterpret_cast< uint16_t* >( &copy.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

View file

@ -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* >( &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 );
@ -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<uint16_t>( 0x28 );
auto flags = *reinterpret_cast< uint16_t* >( &copy.data[0x18] );
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 );
//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();
;
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* >( &copy.data[0x1C] ) ) ||
( player.getPos().y != *reinterpret_cast< float* >( &copy.data[0x20] ) ) ||
( player.getPos().z != *reinterpret_cast< float* >( &copy.data[0x24] ) ) )
bPosChanged = true;
if( !bPosChanged && player.getRot() == inPacket.getValAt< float >( 0x20 ) )
if( !bPosChanged && player.getRot() == *reinterpret_cast< float* >( &copy.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* >( &copy.data[0x10] ) );
player.setPos( *reinterpret_cast< float* >( &copy.data[0x1C] ),
*reinterpret_cast< float* >( &copy.data[0x20] ),
*reinterpret_cast< float* >( &copy.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* >( &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 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* >( &copy.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* >( &copy.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* >( &copy.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* >( &copy.data[0x2a] ) );
auto sourceId = *reinterpret_cast< uint32_t* >( &copy.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* >( &copy.data[0x11] ) );
std::string msg( reinterpret_cast< char* >( &copy.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 );
}

View file

@ -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;
uint32_t action = inPacket.getValAt< uint32_t >( 0x24 );
uint32_t useCount = inPacket.getValAt< uint32_t >( 0x28 );
uint8_t type = inPacket.data[0x11];
uint64_t targetId = inPacket.getValAt< uint64_t >( 0x30 );
auto action = *reinterpret_cast< uint32_t* >( &copy.data[0x14] );
auto useCount = *reinterpret_cast< uint32_t* >( &copy.data[0x18] );
player.sendDebug( "Skill type:" + std::to_string( type ) );
auto targetId = *reinterpret_cast< uint64_t* >( &copy.data[0x20] );
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( action == 5 )
{
auto currentAction = player.getCurrentAction();
if( targetId != player.getId() )
{
targetActor = player.lookupTargetById( targetId );
}
// we should always have an action here, if not there is a bug
assert( currentAction );
currentAction->onStart();
}
else
{
Core::Entity::ActorPtr targetActor = player.getAsPlayer();
// Check if we actually have an actor
if( !targetActor )
{
// todo: interrupt a cast.
player.sendDebug( "Invalid target." );
return;
}
if( targetId != player.getId() )
{
targetActor = player.lookupTargetById( targetId );
}
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
{
// Check if we actually have an actor
if( !targetActor )
{
// todo: interrupt a cast.
player.sendDebug( "Invalid target." );
return;
}
}
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
{
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
{
}
}
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
{
break;
}
case Common::SkillType::MountSkill:
break;
player.sendDebug( "Request mount " + std::to_string( action ) );
case Common::SkillType::MountSkill:
auto pActionMount = Action::make_ActionMount( player.getAsPlayer(), action );
player.setCurrentAction( pActionMount );
player.sendDebug( "setCurrentAction()" );
player.getCurrentAction()->onStart();
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;
}
}