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:
parent
5c7b8e31e6
commit
972cd05e48
10 changed files with 273 additions and 227 deletions
|
@ -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 )
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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 );
|
||||||
|
|
||||||
|
|
|
@ -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* >( ©.data[0x10] );
|
||||||
uint64_t param1 = inPacket.getValAt< uint64_t >( 0x24 );
|
uint64_t param1 = *reinterpret_cast< uint64_t* >( ©.data[0x14] );
|
||||||
uint32_t param11 = inPacket.getValAt< uint32_t >( 0x24 );
|
uint32_t param11 = *reinterpret_cast< uint32_t* >( ©.data[0x14] );
|
||||||
uint32_t param12 = inPacket.getValAt< uint32_t >( 0x28 );
|
uint32_t param12 = *reinterpret_cast< uint32_t* >( ©.data[0x18] );
|
||||||
uint32_t param2 = inPacket.getValAt< uint32_t >( 0x2C );
|
uint32_t param2 = *reinterpret_cast< uint32_t* >( ©.data[0x1C] );
|
||||||
uint64_t param3 = inPacket.getValAt< uint64_t >( 0x38 );
|
uint64_t param3 = *reinterpret_cast< uint64_t* >( ©.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;
|
||||||
|
|
|
@ -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* >( ©.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" );
|
||||||
|
|
|
@ -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* >( ©.data[0x10] );
|
||||||
|
auto eventId = *reinterpret_cast< uint32_t* >( ©.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* >( ©.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 );
|
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* >( ©.data[0x14] );
|
||||||
auto y = inPacket.getValAt< float >( 0x2C );
|
auto param1 = *reinterpret_cast< uint32_t* >( ©.data[0x10] );
|
||||||
auto z = inPacket.getValAt< float >( 0x30 );
|
|
||||||
|
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 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* >( ©.data[0x14] );
|
||||||
auto y = inPacket.getValAt< float >( 0x2C );
|
auto param1 = *reinterpret_cast< uint32_t* >( ©.data[0x10] );
|
||||||
auto z = inPacket.getValAt< float >( 0x30 );
|
|
||||||
|
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 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* >( ©.data[0x14] );
|
||||||
|
auto param1 = *reinterpret_cast< uint16_t* >( ©.data[0x10] );
|
||||||
|
auto param2 = *reinterpret_cast< uint16_t* >( ©.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* >( ©.data[0x10] );
|
||||||
auto param2 = inPacket.getValAt< uint16_t >( 0x28 );
|
auto scene = *reinterpret_cast< uint16_t* >( ©.data[0x14] );
|
||||||
auto param3 = inPacket.getValAt< uint16_t >( 0x2C );
|
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 );
|
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* >( ©.data[0x10] );
|
||||||
|
auto scene = *reinterpret_cast< uint16_t* >( ©.data[0x14] );
|
||||||
|
auto lsName = std::string( reinterpret_cast< char* >( ©.data[0x17] ) );
|
||||||
|
|
||||||
ZoneChannelPacket< FFXIVIpcEventLinkshell > linkshellEvent( player.getId() );
|
ZoneChannelPacket< FFXIVIpcEventLinkshell > linkshellEvent( player.getId() );
|
||||||
linkshellEvent.data().eventId = eventId;
|
linkshellEvent.data().eventId = eventId;
|
||||||
|
|
|
@ -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* >( ©.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* >( ©.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 >();
|
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* >( ©.data[0x10] );
|
||||||
|
|
||||||
|
auto param1 = std::string( reinterpret_cast< char* >( ©.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 );
|
||||||
|
|
||||||
|
|
|
@ -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* >( ©.data[0x10] );
|
||||||
uint8_t fromSlot = inPacket.getValAt< uint8_t >( 0x30 );
|
auto action = *reinterpret_cast< uint8_t* >( ©.data[0x14] );
|
||||||
uint8_t toSlot = inPacket.getValAt< uint8_t >( 0x44 );
|
auto fromSlot = *reinterpret_cast< uint8_t* >( ©.data[0x20] );
|
||||||
uint16_t fromContainer = inPacket.getValAt< uint16_t >( 0x2C );
|
auto toSlot = *reinterpret_cast< uint8_t* >( ©.data[0x34] );
|
||||||
uint16_t toContainer = inPacket.getValAt< uint16_t >( 0x40 );
|
|
||||||
|
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
|
// 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() );
|
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
|
||||||
|
|
|
@ -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* >( ©.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 );
|
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* >( ©.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* >( ©.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* >( ©.data[0x1C] ) ) ||
|
||||||
( player.getPos().y != inPacket.getValAt< float >( 0x30 ) ) ||
|
( player.getPos().y != *reinterpret_cast< float* >( ©.data[0x20] ) ) ||
|
||||||
( player.getPos().z != inPacket.getValAt< float >( 0x34 ) ) )
|
( player.getPos().z != *reinterpret_cast< float* >( ©.data[0x24] ) ) )
|
||||||
bPosChanged = true;
|
bPosChanged = true;
|
||||||
if( !bPosChanged && player.getRot() == inPacket.getValAt< float >( 0x20 ) )
|
if( !bPosChanged && player.getRot() == *reinterpret_cast< float* >( ©.data[0x10] ) )
|
||||||
return;
|
return;
|
||||||
|
|
||||||
player.setRot( inPacket.getValAt< float >( 0x20 ) );
|
player.setRot( *reinterpret_cast< float* >( ©.data[0x10] ) );
|
||||||
player.setPos( inPacket.getValAt< float >( 0x2c ),
|
player.setPos( *reinterpret_cast< float* >( ©.data[0x1C] ),
|
||||||
inPacket.getValAt< float >( 0x30 ),
|
*reinterpret_cast< float* >( ©.data[0x20] ),
|
||||||
inPacket.getValAt< float >( 0x34 ) );
|
*reinterpret_cast< float* >( ©.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* >( ©.data[0x19] );
|
||||||
|
|
||||||
uint16_t moveType = inPacket.getValAt< uint16_t >( 0x28 );
|
auto moveType = *reinterpret_cast< uint16_t* >( ©.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* >( ©.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* >( ©.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* >( ©.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* >( ©.data[0x2a] ) );
|
||||||
|
|
||||||
|
auto sourceId = *reinterpret_cast< uint32_t* >( ©.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* >( ©.data[0x11] ) );
|
||||||
|
std::string msg( reinterpret_cast< char* >( ©.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 );
|
||||||
}
|
}
|
||||||
|
|
|
@ -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* >( ©.data[0x14] );
|
||||||
uint32_t useCount = inPacket.getValAt< uint32_t >( 0x28 );
|
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 ) );
|
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;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue