1
Fork 0
mirror of https://github.com/SapphireServer/Sapphire.git synced 2025-04-27 14:57:44 +00:00

More packet conversion for lobby and zone

This commit is contained in:
Mordred 2018-07-03 00:01:26 +02:00
parent 6797e61657
commit 30b08d5817
11 changed files with 254 additions and 278 deletions

View file

@ -1,5 +1,5 @@
#ifndef _COMMON_FORWARDS_H #ifndef COMMON_FORWARDS_H
#define _COMMON_FORWARDS_H #define COMMON_FORWARDS_H
#include <boost/shared_ptr.hpp> #include <boost/shared_ptr.hpp>

View file

@ -1,5 +1,5 @@
#ifndef _GAMEPACKETNEW_H #ifndef _GAMEPACKET_NEW_H
#define _GAMEPACKETNEW_H #define _GAMEPACKET_NEW_H
#include <stdint.h> #include <stdint.h>
#include <iostream> #include <iostream>
@ -27,6 +27,10 @@ using ZoneChannelPacket = FFXIVIpcPacket< T, ServerZoneIpcType >;
template< class T > template< class T >
using ChatChannelPacket = FFXIVIpcPacket< T, ServerChatIpcType >; using ChatChannelPacket = FFXIVIpcPacket< T, ServerChatIpcType >;
template< class T >
using LobbyChannelPacket = FFXIVIpcPacket< T, ServerLobbyIpcType >;
template< class T, typename... Args > template< class T, typename... Args >
boost::shared_ptr< ZoneChannelPacket< T > > makeZonePacket( Args... args ) boost::shared_ptr< ZoneChannelPacket< T > > makeZonePacket( Args... args )
{ {
@ -39,6 +43,12 @@ boost::shared_ptr< ChatChannelPacket< T > > makeChatPacket( Args... args )
return boost::make_shared< ChatChannelPacket< T > >( args... ); return boost::make_shared< ChatChannelPacket< T > >( args... );
} }
template< class T, typename... Args >
boost::shared_ptr< LobbyChannelPacket< T > > makeLobbyPacket( Args... args )
{
return boost::make_shared< LobbyChannelPacket< T > >( args... );
}
/** /**
* The base implementation of a game packet. Needed for parsing packets. * The base implementation of a game packet. Needed for parsing packets.
*/ */

View file

@ -6,12 +6,13 @@
#include "Common.h" #include "Common.h"
#include "CommonNetwork.h" #include "CommonNetwork.h"
#include "GamePacketNew.h" #include "GamePacketNew.h"
#include "Forwards.h"
namespace Core { namespace Core {
namespace Network { namespace Network {
namespace Packets { namespace Packets {
class GamePacket; typedef boost::shared_ptr< FFXIVPacketBase > FFXIVPacketBasePtr;
class PacketContainer class PacketContainer
{ {

View file

@ -27,6 +27,7 @@ namespace Core
namespace Packets namespace Packets
{ {
TYPE_FORWARD( GamePacket ); TYPE_FORWARD( GamePacket );
TYPE_FORWARD( FFXIVPacketBase );
} }
} }

View file

@ -107,11 +107,10 @@ void Core::Network::GameConnection::OnError( const boost::system::error_code & e
void Core::Network::GameConnection::sendError( uint64_t sequence, uint32_t errorcode, uint16_t messageId, uint32_t tmpId ) void Core::Network::GameConnection::sendError( uint64_t sequence, uint32_t errorcode, uint16_t messageId, uint32_t tmpId )
{ {
GamePacketNew< FFXIVIpcLobbyError, ServerLobbyIpcType > errorPacket( tmpId ); auto errorPacket = makeLobbyPacket< FFXIVIpcLobbyError >( tmpId );
errorPacket->data().seq = sequence;
errorPacket.data().seq = sequence; errorPacket->data().error_id = errorcode;
errorPacket.data().error_id = errorcode; errorPacket->data().message_id = messageId;
errorPacket.data().message_id = messageId;
Packets::LobbyPacketContainer pRP( m_encKey ); Packets::LobbyPacketContainer pRP( m_encKey );
pRP.addPacket( errorPacket ); pRP.addPacket( errorPacket );
@ -126,20 +125,19 @@ void Core::Network::GameConnection::getCharList( FFXIVARR_PACKET_RAW& packet, ui
g_log.info( "[" + std::to_string( m_pSession->getAccountID() ) + "] ReqCharList" ); g_log.info( "[" + std::to_string( m_pSession->getAccountID() ) + "] ReqCharList" );
Packets::LobbyPacketContainer pRP( m_encKey ); Packets::LobbyPacketContainer pRP( m_encKey );
GamePacketNew< FFXIVIpcServerList, ServerLobbyIpcType > serverListPacket( tmpId ); auto serverListPacket = makeLobbyPacket< FFXIVIpcServerList >( tmpId );
serverListPacket.data().seq = 1; serverListPacket->data().seq = 1;
serverListPacket.data().offset = 0; serverListPacket->data().offset = 0;
serverListPacket.data().numServers = 1; serverListPacket->data().numServers = 1;
serverListPacket.data().server[0].id = g_serverLobby.getConfig()->getValue<uint16_t>( "Lobby.WorldID", 1 ); serverListPacket->data().server[0].id = g_serverLobby.getConfig()->getValue<uint16_t>( "Lobby.WorldID", 1 );
serverListPacket.data().server[0].index = 0; serverListPacket->data().server[0].index = 0;
serverListPacket.data().final = 1; serverListPacket->data().final = 1;
strcpy( serverListPacket.data().server[0].name, g_serverLobby.getConfig()->getValue< std::string >( "Lobby.WorldName", "Sapphire" ).c_str() ); strcpy( serverListPacket->data().server[0].name,
g_serverLobby.getConfig()->getValue< std::string >( "Lobby.WorldName", "Sapphire" ).c_str() );
pRP.addPacket( serverListPacket ); pRP.addPacket( serverListPacket );
GamePacketNew< FFXIVIpcRetainerList, ServerLobbyIpcType > retainerListPacket( tmpId ); auto retainerListPacket = makeLobbyPacket< FFXIVIpcRetainerList >( tmpId );
retainerListPacket.data().padding[8] = 1; retainerListPacket->data().padding[8] = 1;
pRP.addPacket( retainerListPacket ); pRP.addPacket( retainerListPacket );
sendPacket( pRP ); sendPacket( pRP );
@ -150,11 +148,10 @@ void Core::Network::GameConnection::getCharList( FFXIVARR_PACKET_RAW& packet, ui
for( uint8_t i = 0; i < 4; i++ ) for( uint8_t i = 0; i < 4; i++ )
{ {
GamePacketNew< FFXIVIpcCharList, ServerLobbyIpcType > charListPacket( tmpId ); auto charListPacket = makeLobbyPacket< FFXIVIpcCharList >( tmpId );
charListPacket->data().seq = sequence;
charListPacket.data().seq = sequence; charListPacket->data().numInPacket = 2;
charListPacket.data().numInPacket = 2; charListPacket->data().counter = i * 4;
charListPacket.data().counter = i * 4;
for( uint8_t j = 0; j < 2; j++ ) for( uint8_t j = 0; j < 2; j++ )
@ -173,7 +170,7 @@ void Core::Network::GameConnection::getCharList( FFXIVARR_PACKET_RAW& packet, ui
strcpy( details.nameChara, get< 0 >( charEntry ).c_str() ); strcpy( details.nameChara, get< 0 >( charEntry ).c_str() );
strcpy( details.nameServer, g_serverLobby.getConfig()->getValue< std::string >( "Lobby.WorldName", "Sapphire" ).c_str() ); strcpy( details.nameServer, g_serverLobby.getConfig()->getValue< std::string >( "Lobby.WorldName", "Sapphire" ).c_str() );
charListPacket.data().charaDetails[j] = details; charListPacket->data().charaDetails[j] = details;
g_log.debug( "[" + std::to_string( charIndex ) + "] " + std::to_string( details.index ) + " - " g_log.debug( "[" + std::to_string( charIndex ) + "] " + std::to_string( details.index ) + " - "
+ get< 0 >( charEntry ) + " - " + + get< 0 >( charEntry ) + " - " +
@ -188,12 +185,12 @@ void Core::Network::GameConnection::getCharList( FFXIVARR_PACKET_RAW& packet, ui
// TODO: Eventually move to account info storage // TODO: Eventually move to account info storage
if( i == 3 ) if( i == 3 )
{ {
charListPacket.data().entitledExpansion = 2; charListPacket->data().entitledExpansion = 2;
charListPacket.data().maxCharOnWorld = 8; charListPacket->data().maxCharOnWorld = 8;
charListPacket.data().unknown8 = 8; charListPacket->data().unknown8 = 8;
charListPacket.data().veteranRank = 12; charListPacket->data().veteranRank = 12;
charListPacket.data().counter = ( i * 4 ) + 1; charListPacket->data().counter = ( i * 4 ) + 1;
charListPacket.data().unknown4 = 128; charListPacket->data().unknown4 = 128;
} }
Packets::LobbyPacketContainer pRP( m_encKey ); Packets::LobbyPacketContainer pRP( m_encKey );
@ -234,16 +231,14 @@ void Core::Network::GameConnection::enterWorld( FFXIVARR_PACKET_RAW& packet, uin
Packets::LobbyPacketContainer pRP( m_encKey ); Packets::LobbyPacketContainer pRP( m_encKey );
GamePacketNew< FFXIVIpcEnterWorld, ServerLobbyIpcType > enterWorldPacket( tmpId ); auto enterWorldPacket = makeLobbyPacket< FFXIVIpcEnterWorld >( tmpId );
enterWorldPacket->data().contentId = lookupId;
enterWorldPacket.data().contentId = lookupId; enterWorldPacket->data().seq = sequence;
strcpy( enterWorldPacket->data().host,
enterWorldPacket.data().seq = sequence; g_serverLobby.getConfig()->getValue< std::string >( "GlobalNetwork.ZoneHost" ).c_str() );
strcpy( enterWorldPacket.data().host, g_serverLobby.getConfig()->getValue< std::string >( "GlobalNetwork.ZoneHost" ).c_str() ); enterWorldPacket->data().port = g_serverLobby.getConfig()->getValue< uint16_t >( "GlobalNetwork.ZonePort" );
enterWorldPacket.data().port = g_serverLobby.getConfig()->getValue< uint16_t >( "GlobalNetwork.ZonePort" ); enterWorldPacket->data().charId = logInCharId;
enterWorldPacket.data().charId = logInCharId; memcpy( enterWorldPacket->data().sid, m_pSession->getSessionId(), 66 );
memcpy( enterWorldPacket.data().sid, m_pSession->getSessionId(), 66 );
pRP.addPacket( enterWorldPacket ); pRP.addPacket( enterWorldPacket );
sendPacket( pRP ); sendPacket( pRP );
} }
@ -265,13 +260,13 @@ bool Core::Network::GameConnection::sendServiceAccountList( FFXIVARR_PACKET_RAW&
{ {
g_log.Log( LoggingSeverity::info, "Found session linked to accountId: " + std::to_string( pSession->getAccountID() ) ); g_log.Log( LoggingSeverity::info, "Found session linked to accountId: " + std::to_string( pSession->getAccountID() ) );
m_pSession = pSession; m_pSession = pSession;
GamePacketNew< FFXIVIpcServiceIdInfo, ServerLobbyIpcType > serviceIdInfoPacket( tmpId );
sprintf( serviceIdInfoPacket.data().serviceAccount[0].name, "FINAL FANTASY XIV" );
serviceIdInfoPacket.data().numServiceAccounts = 1;
serviceIdInfoPacket.data().u1 = 3; auto serviceIdInfoPacket = makeLobbyPacket< FFXIVIpcServiceIdInfo >( tmpId );
serviceIdInfoPacket.data().u2 = 0x99; sprintf( serviceIdInfoPacket->data().serviceAccount[0].name, "FINAL FANTASY XIV" );
serviceIdInfoPacket.data().serviceAccount[0].id = 0x002E4A2B; serviceIdInfoPacket->data().numServiceAccounts = 1;
serviceIdInfoPacket->data().u1 = 3;
serviceIdInfoPacket->data().u2 = 0x99;
serviceIdInfoPacket->data().serviceAccount[0].id = 0x002E4A2B;
Packets::LobbyPacketContainer pRP( m_encKey ); Packets::LobbyPacketContainer pRP( m_encKey );
pRP.addPacket( serviceIdInfoPacket ); pRP.addPacket( serviceIdInfoPacket );
@ -316,18 +311,17 @@ bool Core::Network::GameConnection::createOrModifyChar( FFXIVARR_PACKET_RAW& pac
return true; return true;
} }
GamePacketNew< FFXIVIpcCharCreate, ServerLobbyIpcType > charCreatePacket( tmpId ); auto charCreatePacket = makeLobbyPacket< FFXIVIpcCharCreate >( tmpId );
charCreatePacket->data().content_id = newContentId;
charCreatePacket.data().content_id = newContentId; strcpy( charCreatePacket->data().name, name.c_str() );
strcpy( charCreatePacket.data().name, name.c_str() ); strcpy( charCreatePacket->data().world,
strcpy( charCreatePacket.data().world, g_serverLobby.getConfig()->getValue< std::string >( "Lobby.WorldName", "Sapphire" ).c_str() ); g_serverLobby.getConfig()->getValue< std::string >( "Lobby.WorldName", "Sapphire" ).c_str() );
charCreatePacket.data().type = 1; charCreatePacket->data().type = 1;
charCreatePacket.data().seq = sequence; charCreatePacket->data().seq = sequence;
charCreatePacket.data().unknown = 1; charCreatePacket->data().unknown = 1;
charCreatePacket.data().unknown_2 = 1; charCreatePacket->data().unknown_2 = 1;
charCreatePacket.data().unknown_7 = 1; charCreatePacket->data().unknown_7 = 1;
charCreatePacket.data().unknown_8 = 1; charCreatePacket->data().unknown_8 = 1;
pRP.addPacket( charCreatePacket ); pRP.addPacket( charCreatePacket );
sendPacket( pRP ); sendPacket( pRP );
} }
@ -340,18 +334,17 @@ bool Core::Network::GameConnection::createOrModifyChar( FFXIVARR_PACKET_RAW& pac
{ {
Packets::LobbyPacketContainer pRP( m_encKey ); Packets::LobbyPacketContainer pRP( m_encKey );
GamePacketNew< FFXIVIpcCharCreate, ServerLobbyIpcType > charCreatePacket( tmpId ); auto charCreatePacket = makeLobbyPacket< FFXIVIpcCharCreate >( tmpId );
charCreatePacket->data().content_id = newContentId;
charCreatePacket.data().content_id = newContentId; strcpy( charCreatePacket->data().name, name.c_str() );
strcpy( charCreatePacket.data().name, name.c_str() ); strcpy( charCreatePacket->data().world,
strcpy( charCreatePacket.data().world, g_serverLobby.getConfig()->getValue< std::string >( "Lobby.WorldName", "Sapphire" ).c_str() ); g_serverLobby.getConfig()->getValue< std::string >( "Lobby.WorldName", "Sapphire" ).c_str() );
charCreatePacket.data().type = 2; charCreatePacket->data().type = 2;
charCreatePacket.data().seq = sequence; charCreatePacket->data().seq = sequence;
charCreatePacket.data().unknown = 1; charCreatePacket->data().unknown = 1;
charCreatePacket.data().unknown_2 = 1; charCreatePacket->data().unknown_2 = 1;
charCreatePacket.data().unknown_7 = 1; charCreatePacket->data().unknown_7 = 1;
charCreatePacket.data().unknown_8 = 1; charCreatePacket->data().unknown_8 = 1;
pRP.addPacket( charCreatePacket ); pRP.addPacket( charCreatePacket );
sendPacket( pRP ); sendPacket( pRP );
} }
@ -370,18 +363,17 @@ bool Core::Network::GameConnection::createOrModifyChar( FFXIVARR_PACKET_RAW& pac
if( g_restConnector.deleteCharacter( ( char* )m_pSession->getSessionId(), name ) ) if( g_restConnector.deleteCharacter( ( char* )m_pSession->getSessionId(), name ) )
{ {
GamePacketNew< FFXIVIpcCharCreate, ServerLobbyIpcType > charCreatePacket( tmpId ); auto charCreatePacket = makeLobbyPacket< FFXIVIpcCharCreate >( tmpId );
//charCreatePacket->data().content_id = deletePlayer.getContentId();
//charCreatePacket.data().content_id = deletePlayer.getContentId(); charCreatePacket->data().content_id = 0;
charCreatePacket.data().content_id = 0; strcpy( charCreatePacket->data().name, name.c_str() );
strcpy( charCreatePacket.data().name, name.c_str() ); strcpy( charCreatePacket->data().world, g_serverLobby.getConfig()->getValue< std::string >( "Lobby.WorldName", "Sapphire" ).c_str() );
strcpy( charCreatePacket.data().world, g_serverLobby.getConfig()->getValue< std::string >( "Lobby.WorldName", "Sapphire" ).c_str() ); charCreatePacket->data().type = 4;
charCreatePacket.data().type = 4; charCreatePacket->data().seq = sequence;
charCreatePacket.data().seq = sequence; charCreatePacket->data().unknown = 1;
charCreatePacket.data().unknown = 1; charCreatePacket->data().unknown_2 = 1;
charCreatePacket.data().unknown_2 = 1; charCreatePacket->data().unknown_7 = 1;
charCreatePacket.data().unknown_7 = 1; charCreatePacket->data().unknown_8 = 1;
charCreatePacket.data().unknown_8 = 1;
Packets::LobbyPacketContainer pRP( m_encKey ); Packets::LobbyPacketContainer pRP( m_encKey );
pRP.addPacket( charCreatePacket ); pRP.addPacket( charCreatePacket );
@ -454,14 +446,7 @@ void Core::Network::GameConnection::sendPackets( Packets::PacketContainer * pPac
Send( sendBuffer ); Send( sendBuffer );
} }
void Core::Network::GameConnection::sendSinglePacket( Packets::GamePacket * pPacket ) void Core::Network::GameConnection::sendSinglePacket( FFXIVPacketBasePtr pPacket )
{
PacketContainer pRP = PacketContainer();
pRP.addPacket( *pPacket );
sendPackets( &pRP );
}
void Core::Network::GameConnection::sendSinglePacket( Packets::GamePacket & pPacket )
{ {
PacketContainer pRP = PacketContainer(); PacketContainer pRP = PacketContainer();
pRP.addPacket( pPacket ); pRP.addPacket( pPacket );
@ -505,19 +490,14 @@ void Core::Network::GameConnection::handlePackets( const Core::Network::Packets:
generateEncryptionKey( *reinterpret_cast< uint32_t* >( &inPacket.data[100] ), key_phrase ); generateEncryptionKey( *reinterpret_cast< uint32_t* >( &inPacket.data[100] ), key_phrase );
m_bEncryptionInitialized = true; m_bEncryptionInitialized = true;
std::vector< uint8_t > samplePacket( 0x290 ); auto pe1 = boost::make_shared< FFXIVRawPacket >( 0x0A, 0x290, 0, 0 );
memset( &samplePacket[0], 0, 0x290 ); *reinterpret_cast< uint32_t* >(&pe1->data()[0]) = 0xE0003C2A;
*reinterpret_cast< uint16_t* >( &samplePacket[0] ) = 0x290;
*reinterpret_cast< uint8_t* >( &samplePacket[0] + 0x0C ) = 0x0A;
*reinterpret_cast< uint32_t* >( &samplePacket[0] + 0x10 ) = 0xE0003C2A;
BlowFish blowfish; BlowFish blowfish;
blowfish.initialize( m_encKey, 0x10 ); blowfish.initialize( m_encKey, 0x10 );
blowfish.Encode( &samplePacket[0] + 0x10, &samplePacket[0] + 0x10, 0x280 ); blowfish.Encode( &pe1->data()[0], &pe1->data()[0], 0x280 );
auto packet = GamePacket( reinterpret_cast< char* >( &samplePacket[0] ), static_cast< uint16_t >( samplePacket.size() ) ); sendSinglePacket( pe1 );
sendSinglePacket( packet );
break; break;
} }
@ -533,10 +513,10 @@ void Core::Network::GameConnection::handlePackets( const Core::Network::Packets:
uint32_t id = *reinterpret_cast< uint32_t* >( &inPacket.data[0] ); uint32_t id = *reinterpret_cast< uint32_t* >( &inPacket.data[0] );
uint32_t timeStamp = *reinterpret_cast< uint32_t* >( &inPacket.data[4] ); uint32_t timeStamp = *reinterpret_cast< uint32_t* >( &inPacket.data[4] );
GamePacket pPe( 0x00, 0x18, 0, 0, 0x08 ); auto pe4 = boost::make_shared< FFXIVRawPacket >( 0x08, 0x18, 0, 0 );
pPe.setValAt< uint32_t >( 0x10, id ); *(unsigned int*)(&pe4->data()[0]) = id;
pPe.setValAt< uint32_t >( 0x14, timeStamp ); *(unsigned int*)(&pe4->data()[4]) = timeStamp;
sendSinglePacket( &pPe ); sendSinglePacket( pe4 );
break; break;
} }

View file

@ -65,15 +65,14 @@ public:
void handleGamePacket( Packets::FFXIVARR_PACKET_RAW &pPacket ); void handleGamePacket( Packets::FFXIVARR_PACKET_RAW &pPacket );
void handlePacket( Packets::GamePacketPtr pPacket ); void handlePacket( Packets::FFXIVPacketBasePtr pPacket );
void sendPackets( Packets::PacketContainer * pPacket ); void sendPackets( Packets::PacketContainer * pPacket );
void sendPacket( Packets::LobbyPacketContainer& pLpc ); void sendPacket( Packets::LobbyPacketContainer& pLpc );
void sendSinglePacket( Packets::GamePacket * pPacket ); void sendSinglePacket( Packets::FFXIVPacketBasePtr pPacket );
void sendSinglePacket( Packets::GamePacket & pPacket );
}; };

View file

@ -1,58 +1,56 @@
#include "LobbyPacketContainer.h" #include "LobbyPacketContainer.h"
#include <Network/CommonNetwork.h>
#include <Network/GamePacket.h> #include <Network/GamePacket.h>
#include <Network/GamePacketNew.h> #include <Network/GamePacketNew.h>
#include <Crypt/blowfish.h> #include <Crypt/blowfish.h>
#include <Common.h>
namespace Core { using namespace Core::Common;
namespace Network { using namespace Core::Network::Packets;
namespace Packets {
LobbyPacketContainer::LobbyPacketContainer( uint8_t* encKey ) Core::Network::Packets::LobbyPacketContainer::LobbyPacketContainer( uint8_t* encKey )
{ {
memset( &m_header, 0, sizeof( Core::Network::Packets::FFXIVARR_PACKET_HEADER ) ); memset( &m_header, 0, sizeof( Core::Network::Packets::FFXIVARR_PACKET_HEADER ) );
m_header.size = sizeof( Core::Network::Packets::FFXIVARR_PACKET_HEADER ); m_header.size = sizeof( Core::Network::Packets::FFXIVARR_PACKET_HEADER );
m_encKey = encKey; m_encKey = encKey;
memset( m_dataBuf, 0, 0x1570 ); memset( m_dataBuf, 0, 0x1570 );
} }
LobbyPacketContainer::~LobbyPacketContainer() Core::Network::Packets::LobbyPacketContainer::~LobbyPacketContainer()
{ {
m_entryList.clear(); m_entryList.clear();
} }
void LobbyPacketContainer::addPacket( GamePacketPtr pEntry ) void Core::Network::Packets::LobbyPacketContainer::addPacket( FFXIVPacketBasePtr pEntry )
{ {
memcpy( m_dataBuf + m_header.size, pEntry->getData(), pEntry->getSize() ); memcpy( m_dataBuf + m_header.size, &pEntry->getData()[0], pEntry->getSize() );
// encryption key is set, we want to encrypt this packet // encryption key is set, we want to encrypt this packet
if( m_encKey != NULL ) if( m_encKey != nullptr )
{ {
BlowFish blowfish; BlowFish blowfish;
blowfish.initialize( m_encKey, 0x10 ); blowfish.initialize( m_encKey, 0x10 );
blowfish.Encode( m_dataBuf + m_header.size + 0x10, m_dataBuf + m_header.size + 0x10, pEntry->getSize() - 0x10 ); blowfish.Encode( m_dataBuf + m_header.size + 0x10, m_dataBuf + m_header.size + 0x10, pEntry->getSize() - 0x10 );
} }
m_header.size += pEntry->getSize(); m_header.size += pEntry->getSize();
m_header.count++; m_header.count++;
} }
uint16_t LobbyPacketContainer::getSize() const uint16_t Core::Network::Packets::LobbyPacketContainer::getSize() const
{ {
return m_header.size; return m_header.size;
} }
uint8_t* LobbyPacketContainer::getRawData( bool addstuff ) uint8_t* Core::Network::Packets::LobbyPacketContainer::getRawData( bool addstuff )
{ {
if( addstuff ) if( addstuff )
{ {
m_header.unknown_0 = 0xff41a05252; m_header.unknown_0 = 0xff41a05252;
m_header.timestamp = Core::Util::getTimeMs(); m_header.timestamp = Core::Util::getTimeMs();
} }
memcpy( m_dataBuf, &m_header, sizeof( Core::Network::Packets::FFXIVARR_PACKET_HEADER ) ); memcpy( m_dataBuf, &m_header, sizeof( Core::Network::Packets::FFXIVARR_PACKET_HEADER ) );
return m_dataBuf; return m_dataBuf;
}
}
}
} }

View file

@ -1,5 +1,5 @@
#ifndef _LobbyPacketContainer_H_ #ifndef LOBBY_PACKET_CONTAINER_H_
#define _LobbyPacketContainer_H_ #define LOBBY_PACKET_CONTAINER_H_
#include <vector> #include <vector>
#include <string.h> #include <string.h>
@ -10,34 +10,35 @@
#include "Forwards.h" #include "Forwards.h"
namespace Core { namespace Core {
namespace Network { namespace Network {
namespace Packets { namespace Packets {
class GamePacket;
class LobbyPacketContainer typedef boost::shared_ptr< FFXIVPacketBase > FFXIVPacketBasePtr;
{
public:
LobbyPacketContainer( uint8_t* encKey = nullptr );
~LobbyPacketContainer();
void addPacket( GamePacketPtr pEntry ); class LobbyPacketContainer
{
public:
LobbyPacketContainer( uint8_t* encKey = nullptr );
~LobbyPacketContainer();
uint16_t getSize() const; void addPacket( FFXIVPacketBasePtr pEntry );
uint8_t* getRawData( bool addstuff = true ); uint16_t getSize() const;
private: uint8_t* getRawData( bool addstuff = true );
Core::Network::Packets::FFXIVARR_PACKET_HEADER m_header;
uint8_t * m_encKey; private:
Core::Network::Packets::FFXIVARR_PACKET_HEADER m_header;
std::vector<GamePacket> m_entryList; uint8_t* m_encKey;
uint8_t m_dataBuf[0x2000]; std::vector< FFXIVPacketBasePtr > m_entryList;
}; uint8_t m_dataBuf[0x2000];
} };
}
}
}
} }
#endif #endif

View file

@ -396,25 +396,24 @@ void Core::Entity::Chara::autoAttack( CharaPtr pTarget )
uint16_t damage = static_cast< uint16_t >( 10 + rand() % 12 ); uint16_t damage = static_cast< uint16_t >( 10 + rand() % 12 );
uint32_t variation = static_cast< uint32_t >( 0 + rand() % 4 ); uint32_t variation = static_cast< uint32_t >( 0 + rand() % 4 );
FFXIVPacketBasePtr packet = boost::make_shared< ZoneChannelPacket< FFXIVIpcEffect > >( getId() ); auto ipcEffect = makeZonePacket< FFXIVIpcEffect >( getId() );
auto ipcEffect = dynamic_cast< ZoneChannelPacket< FFXIVIpcEffect >& >( *packet ); ipcEffect->data().targetId = pTarget->getId();
ipcEffect.data().targetId = pTarget->getId(); ipcEffect->data().actionAnimationId = 0x366;
ipcEffect.data().actionAnimationId = 0x366; ipcEffect->data().unknown_2 = variation;
ipcEffect.data().unknown_2 = variation; // effectPacket->data().unknown_3 = 1;
// effectPacket.data().unknown_3 = 1; ipcEffect->data().actionTextId = 0x366;
ipcEffect.data().actionTextId = 0x366; ipcEffect->data().numEffects = 1;
ipcEffect.data().numEffects = 1; ipcEffect->data().rotation = Math::Util::floatToUInt16Rot( getRot() );
ipcEffect.data().rotation = Math::Util::floatToUInt16Rot( getRot() ); ipcEffect->data().effectTarget = pTarget->getId();
ipcEffect.data().effectTarget = pTarget->getId(); ipcEffect->data().effects[0].value = damage;
ipcEffect.data().effects[0].value = damage; ipcEffect->data().effects[0].effectType = ActionEffectType::Damage;
ipcEffect.data().effects[0].effectType = ActionEffectType::Damage; ipcEffect->data().effects[0].hitSeverity = static_cast< ActionHitSeverityType >( variation );
ipcEffect.data().effects[0].hitSeverity = static_cast< ActionHitSeverityType >( variation ); ipcEffect->data().effects[0].unknown_3 = 7;
ipcEffect.data().effects[0].unknown_3 = 7;
sendToInRangeSet( packet ); sendToInRangeSet( ipcEffect );
if( isPlayer() ) if( isPlayer() )
getAsPlayer()->queuePacket( packet ); getAsPlayer()->queuePacket( ipcEffect );
pTarget->takeDamage( damage ); pTarget->takeDamage( damage );
} }
@ -441,16 +440,16 @@ void Core::Entity::Chara::handleScriptSkill( uint32_t type, uint16_t actionId, u
// Todo: Effect packet generator. 90% of this is basically setting params and it's basically unreadable. // Todo: Effect packet generator. 90% of this is basically setting params and it's basically unreadable.
// Prepare packet. This is seemingly common for all packets in the action handler. // Prepare packet. This is seemingly common for all packets in the action handler.
FFXIVPacketBasePtr packet = boost::make_shared< ZoneChannelPacket< FFXIVIpcEffect > >( getId() );
auto effectPacket = dynamic_cast< ZoneChannelPacket< FFXIVIpcEffect >& >( *packet ); auto effectPacket = makeZonePacket< FFXIVIpcEffect >( getId() );
effectPacket.data().targetId = target.getId(); effectPacket->data().targetId = target.getId();
effectPacket.data().actionAnimationId = actionId; effectPacket->data().actionAnimationId = actionId;
effectPacket.data().unknown_62 = 1; // Affects displaying action name next to number in floating text effectPacket->data().unknown_62 = 1; // Affects displaying action name next to number in floating text
effectPacket.data().unknown_2 = 1; // This seems to have an effect on the "double-cast finish" animation effectPacket->data().unknown_2 = 1; // This seems to have an effect on the "double-cast finish" animation
effectPacket.data().actionTextId = actionId; effectPacket->data().actionTextId = actionId;
effectPacket.data().numEffects = 1; effectPacket->data().numEffects = 1;
effectPacket.data().rotation = Math::Util::floatToUInt16Rot( getRot() ); effectPacket->data().rotation = Math::Util::floatToUInt16Rot( getRot() );
effectPacket.data().effectTarget = target.getId(); effectPacket->data().effectTarget = target.getId();
// Todo: for each actor, calculate how much damage the calculated value should deal to them - 2-step damage calc. we only have 1-step // Todo: for each actor, calculate how much damage the calculated value should deal to them - 2-step damage calc. we only have 1-step
switch( type ) switch( type )
@ -458,10 +457,10 @@ void Core::Entity::Chara::handleScriptSkill( uint32_t type, uint16_t actionId, u
case ActionEffectType::Damage: case ActionEffectType::Damage:
{ {
effectPacket.data().effects[0].value = static_cast< uint16_t >( param1 ); effectPacket->data().effects[0].value = static_cast< uint16_t >( param1 );
effectPacket.data().effects[0].effectType = ActionEffectType::Damage; effectPacket->data().effects[0].effectType = ActionEffectType::Damage;
effectPacket.data().effects[0].hitSeverity = ActionHitSeverityType::NormalDamage; effectPacket->data().effects[0].hitSeverity = ActionHitSeverityType::NormalDamage;
effectPacket.data().effects[0].unknown_3 = 7; effectPacket->data().effects[0].unknown_3 = 7;
if( actionInfoPtr->castType == 1 && actionInfoPtr->effectRange != 0 || actionInfoPtr->castType != 1 ) if( actionInfoPtr->castType == 1 && actionInfoPtr->effectRange != 0 || actionInfoPtr->castType != 1 )
{ {
@ -469,7 +468,7 @@ void Core::Entity::Chara::handleScriptSkill( uint32_t type, uint16_t actionId, u
if ( isPlayer() && !ActionCollision::isActorApplicable( target, TargetFilter::Enemies ) ) if ( isPlayer() && !ActionCollision::isActorApplicable( target, TargetFilter::Enemies ) )
break; break;
sendToInRangeSet( packet, true ); sendToInRangeSet( effectPacket, true );
if ( target.isAlive() ) if ( target.isAlive() )
target.onActionHostile( *this ); target.onActionHostile( *this );
@ -485,11 +484,11 @@ void Core::Entity::Chara::handleScriptSkill( uint32_t type, uint16_t actionId, u
for( const auto& pHitActor : actorsCollided ) for( const auto& pHitActor : actorsCollided )
{ {
effectPacket.data().targetId = pHitActor->getId(); effectPacket->data().targetId = pHitActor->getId();
effectPacket.data().effectTarget = pHitActor->getId(); effectPacket->data().effectTarget = pHitActor->getId();
// todo: send to range of what? ourselves? when mob script hits this is going to be lacking // todo: send to range of what? ourselves? when mob script hits this is going to be lacking
sendToInRangeSet( packet, true ); sendToInRangeSet( effectPacket, true );
if( pHitActor->getAsChara()->isAlive() ) if( pHitActor->getAsChara()->isAlive() )
@ -516,16 +515,16 @@ void Core::Entity::Chara::handleScriptSkill( uint32_t type, uint16_t actionId, u
{ {
uint32_t calculatedHeal = Math::CalcBattle::calculateHealValue( getAsPlayer(), static_cast< uint32_t >( param1 ) ); uint32_t calculatedHeal = Math::CalcBattle::calculateHealValue( getAsPlayer(), static_cast< uint32_t >( param1 ) );
effectPacket.data().effects[0].value = calculatedHeal; effectPacket->data().effects[0].value = calculatedHeal;
effectPacket.data().effects[0].effectType = ActionEffectType::Heal; effectPacket->data().effects[0].effectType = ActionEffectType::Heal;
effectPacket.data().effects[0].hitSeverity = ActionHitSeverityType::NormalHeal; effectPacket->data().effects[0].hitSeverity = ActionHitSeverityType::NormalHeal;
if( actionInfoPtr->castType == 1 && actionInfoPtr->effectRange != 0 || actionInfoPtr->castType != 1 ) if( actionInfoPtr->castType == 1 && actionInfoPtr->effectRange != 0 || actionInfoPtr->castType != 1 )
{ {
if( isPlayer() && !ActionCollision::isActorApplicable( target, TargetFilter::Allies ) ) if( isPlayer() && !ActionCollision::isActorApplicable( target, TargetFilter::Allies ) )
break; break;
sendToInRangeSet( packet, true ); sendToInRangeSet( effectPacket, true );
target.heal( calculatedHeal ); target.heal( calculatedHeal );
} }
else else
@ -538,10 +537,10 @@ void Core::Entity::Chara::handleScriptSkill( uint32_t type, uint16_t actionId, u
for( auto pHitActor : actorsCollided ) for( auto pHitActor : actorsCollided )
{ {
effectPacket.data().targetId = target.getId(); effectPacket->data().targetId = target.getId();
effectPacket.data().effectTarget = pHitActor->getId(); effectPacket->data().effectTarget = pHitActor->getId();
sendToInRangeSet( packet, true ); sendToInRangeSet( effectPacket, true );
pHitActor->getAsChara()->heal( calculatedHeal ); pHitActor->getAsChara()->heal( calculatedHeal );
// Debug // Debug
@ -574,24 +573,23 @@ void Core::Entity::Chara::addStatusEffect( StatusEffect::StatusEffectPtr pEffect
pEffect->applyStatus(); pEffect->applyStatus();
m_statusEffectMap[nextSlot] = pEffect; m_statusEffectMap[nextSlot] = pEffect;
FFXIVPacketBasePtr packet = boost::make_shared< ZoneChannelPacket< FFXIVIpcAddStatusEffect > >( getId() ); auto statusEffectAdd = makeZonePacket< FFXIVIpcAddStatusEffect >( getId() );
auto statusEffectAdd = dynamic_cast< ZoneChannelPacket< FFXIVIpcAddStatusEffect >& >( *packet );
statusEffectAdd.data().actor_id = pEffect->getTargetActorId(); statusEffectAdd->data().actor_id = pEffect->getTargetActorId();
statusEffectAdd.data().actor_id1 = pEffect->getSrcActorId(); statusEffectAdd->data().actor_id1 = pEffect->getSrcActorId();
statusEffectAdd.data().current_hp = getHp(); statusEffectAdd->data().current_hp = getHp();
statusEffectAdd.data().current_mp = getMp(); statusEffectAdd->data().current_mp = getMp();
statusEffectAdd.data().current_tp = getTp(); statusEffectAdd->data().current_tp = getTp();
statusEffectAdd.data().duration = static_cast< float >( pEffect->getDuration() ) / 1000; statusEffectAdd->data().duration = static_cast< float >( pEffect->getDuration() ) / 1000;
statusEffectAdd.data().effect_id = pEffect->getId(); statusEffectAdd->data().effect_id = pEffect->getId();
statusEffectAdd.data().effect_index = nextSlot; statusEffectAdd->data().effect_index = nextSlot;
statusEffectAdd.data().max_hp = getMaxHp(); statusEffectAdd->data().max_hp = getMaxHp();
statusEffectAdd.data().max_mp = getMaxMp(); statusEffectAdd->data().max_mp = getMaxMp();
statusEffectAdd.data().max_something = 1; statusEffectAdd->data().max_something = 1;
//statusEffectAdd.data().unknown2 = 28; //statusEffectAdd->data().unknown2 = 28;
statusEffectAdd.data().param = pEffect->getParam(); statusEffectAdd->data().param = pEffect->getParam();
sendToInRangeSet( packet, isPlayer() ); sendToInRangeSet( statusEffectAdd, isPlayer() );
} }
/*! \param StatusEffectPtr to be applied to the actor */ /*! \param StatusEffectPtr to be applied to the actor */
@ -671,7 +669,8 @@ void Core::Entity::Chara::sendStatusEffectUpdate()
{ {
uint64_t currentTimeMs = Util::getTimeMs(); uint64_t currentTimeMs = Util::getTimeMs();
auto statusEffectList = boost::make_shared< ZoneChannelPacket< FFXIVIpcStatusEffectList > >( getId() );
auto statusEffectList = makeZonePacket< FFXIVIpcStatusEffectList >( getId() );
statusEffectList->data().classId = static_cast< uint8_t >( getClass() ); statusEffectList->data().classId = static_cast< uint8_t >( getClass() );
statusEffectList->data().level = getLevel(); statusEffectList->data().level = getLevel();
statusEffectList->data().level1 = getLevel(); statusEffectList->data().level1 = getLevel();

View file

@ -3,6 +3,10 @@
#include "Zone/InstanceContent.h" #include "Zone/InstanceContent.h"
#include "Actor/Player.h" #include "Actor/Player.h"
#include "Network/PacketWrappers/ActorControlPacket142.h"
#include "Network/PacketWrappers/ActorControlPacket143.h"
#include "Network/PacketWrappers/ActorControlPacket144.h"
#include <Logging/Logger.h> #include <Logging/Logger.h>
#include <Network/GamePacket.h> #include <Network/GamePacket.h>
#include <Network/GamePacketNew.h> #include <Network/GamePacketNew.h>
@ -78,27 +82,14 @@ void Core::Entity::EventObject::setState( uint8_t state )
for( const auto& player : m_inRangePlayers ) for( const auto& player : m_inRangePlayers )
{ {
FFXIVPacketBasePtr packet = boost::make_shared< ZoneChannelPacket< FFXIVIpcActorControl142 > >( getId(), player->getId() ); player->queuePacket( boost::make_shared< ActorControlPacket142 >( getId(), DirectorEObjMod, state ) );
auto eobjUpdatePacket = dynamic_cast< ZoneChannelPacket< FFXIVIpcActorControl142 >& >( *packet );
eobjUpdatePacket.data().category = Common::ActorControlType::DirectorEObjMod;
eobjUpdatePacket.data().param1 = state;
player->queuePacket( packet );
} }
} }
void Core::Entity::EventObject::setAnimationFlag( uint32_t flag, uint32_t animationFlag ) { void Core::Entity::EventObject::setAnimationFlag( uint32_t flag, uint32_t animationFlag ) {
for( const auto& player : m_inRangePlayers ) for( const auto& player : m_inRangePlayers )
{ {
FFXIVPacketBasePtr packet = boost::make_shared< ZoneChannelPacket< FFXIVIpcActorControl142 > >( getId(), player->getId() ); player->queuePacket( boost::make_shared< ActorControlPacket142 >( getId(), EObjAnimation, flag, animationFlag ) );
auto eobjUpdatePacket = dynamic_cast< ZoneChannelPacket< FFXIVIpcActorControl142 >& >( *packet );
eobjUpdatePacket.data().category = Common::ActorControlType::EObjAnimation;
eobjUpdatePacket.data().param1 = flag;
eobjUpdatePacket.data().param2 = animationFlag;
player->queuePacket( packet );
} }
} }
@ -122,19 +113,17 @@ void Core::Entity::EventObject::spawn( Core::Entity::PlayerPtr pTarget )
pLog->debug( "Spawning EObj: id:" + std::to_string( getId() ) + " name:" + getName() ); pLog->debug( "Spawning EObj: id:" + std::to_string( getId() ) + " name:" + getName() );
FFXIVPacketBasePtr packet = boost::make_shared< ZoneChannelPacket< FFXIVIpcObjectSpawn > >( getId(), pTarget->getId() ); auto eobjStatePacket = makeZonePacket< FFXIVIpcObjectSpawn >( getId(), pTarget->getId() );
auto eobjStatePacket = dynamic_cast< ZoneChannelPacket< FFXIVIpcObjectSpawn >& >( *packet ); eobjStatePacket->data().spawnIndex = spawnIndex;
eobjStatePacket->data().objKind = getObjKind();
eobjStatePacket.data().spawnIndex = spawnIndex; eobjStatePacket->data().state = getState();
eobjStatePacket.data().objKind = getObjKind(); eobjStatePacket->data().objId = getObjectId();
eobjStatePacket.data().state = getState(); eobjStatePacket->data().gimmickId = getGimmickId();
eobjStatePacket.data().objId = getObjectId(); eobjStatePacket->data().position = getPos();
eobjStatePacket.data().gimmickId = getGimmickId(); eobjStatePacket->data().scale = getScale();
eobjStatePacket.data().position = getPos(); eobjStatePacket->data().actorId = getId();
eobjStatePacket.data().scale = getScale(); eobjStatePacket->data().rotation = Math::Util::floatToUInt16Rot( getRot() );
eobjStatePacket.data().actorId = getId(); pTarget->queuePacket( eobjStatePacket );
eobjStatePacket.data().rotation = Math::Util::floatToUInt16Rot( getRot() );
pTarget->queuePacket( packet );
} }

View file

@ -204,14 +204,12 @@ uint64_t Core::Entity::Player::getOnlineStatusMask() const
void Core::Entity::Player::prepareZoning( uint16_t targetZone, bool fadeOut, uint8_t fadeOutTime, uint16_t animation ) void Core::Entity::Player::prepareZoning( uint16_t targetZone, bool fadeOut, uint8_t fadeOutTime, uint16_t animation )
{ {
FFXIVPacketBasePtr packet = boost::make_shared< ZoneChannelPacket< FFXIVIpcPrepareZoning > >( getId() ); auto preparePacket = makeZonePacket< FFXIVIpcPrepareZoning >( getId() );
auto preparePacket = dynamic_cast< ZoneChannelPacket< FFXIVIpcPrepareZoning >& >( *packet ); preparePacket->data().targetZone = targetZone;
preparePacket->data().fadeOutTime = fadeOutTime;
preparePacket.data().targetZone = targetZone; preparePacket->data().animation = animation;
preparePacket.data().fadeOutTime = fadeOutTime; preparePacket->data().fadeOut = static_cast< uint8_t >( fadeOut ? 1 : 0 );
preparePacket.data().animation = animation; queuePacket( preparePacket );
preparePacket.data().fadeOut = static_cast< uint8_t >( fadeOut ? 1 : 0 );
queuePacket( packet );
} }
void Core::Entity::Player::calculateStats() void Core::Entity::Player::calculateStats()