1
Fork 0
mirror of https://github.com/SapphireServer/Sapphire.git synced 2025-05-02 08:57:44 +00:00

Implemented a switch to chose from zone or chat handlers

This commit is contained in:
Mordred 2017-08-22 21:36:20 +02:00
parent f4df52f3d9
commit 08ff069ee1
7 changed files with 247 additions and 148 deletions

View file

@ -0,0 +1,34 @@
#ifndef _CORE_NETWORK_PACKETS_CHAT_SERVER_IPC_H
#define _CORE_NETWORK_PACKETS_CHAT_SERVER_IPC_H
#include "src/servers/Server_Common/Common.h"
#include "src/servers/Server_Common/Network/CommonNetwork.h"
namespace Core {
namespace Network {
namespace Packets {
namespace Server {
/**
* Structural representation of the packet sent by the server as response
* to a ping packet
*/
struct FFXIVIpcTell : FFXIVIpcBasePacket<Tell>
{
uint32_t u1;
uint16_t u2a;
uint16_t u2b;
uint8_t preName;
char receipientName[32];
char msg[1031];
};
} /* Server */
} /* Packets */
} /* Network */
} /* Core */
#endif /*_CORE_NETWORK_PACKETS_CHAT_SERVER_IPC_H*/

View file

@ -114,7 +114,7 @@ namespace Packets {
// Unknown IPC types that still need to be sent // Unknown IPC types that still need to be sent
// TODO: figure all these out properly // TODO: figure all these out properly
IPCTYPE_UNK_320 = 0x1FB, IPCTYPE_UNK_320 = 0x1FB,
IPCTYPE_UNK_322 = 0x1FD, IPCTYPE_UNK_322 = 0x1FD,
}; };
@ -185,7 +185,7 @@ namespace Packets {
*/ */
enum ServerChatIpcType : uint16_t enum ServerChatIpcType : uint16_t
{ {
Tell = 0x0064, // updated for sb Tell = 0x0064, // updated for sb
}; };
/** /**
@ -193,7 +193,7 @@ namespace Packets {
*/ */
enum ClientChatIpcType : uint16_t enum ClientChatIpcType : uint16_t
{ {
TellReq = 0x0064, TellReq = 0x0064,
}; };

View file

@ -9,132 +9,132 @@ namespace Network {
namespace Packets { namespace Packets {
namespace Server { namespace Server {
struct FFXIVIpcRetainerList : FFXIVIpcBasePacket<LobbyRetainerList> struct FFXIVIpcRetainerList : FFXIVIpcBasePacket<LobbyRetainerList>
{ {
uint8_t padding[0x210]; uint8_t padding[0x210];
}; };
/** /**
*/ */
struct FFXIVIpcServiceIdInfo : FFXIVIpcBasePacket<LobbyServiceAccountList> struct FFXIVIpcServiceIdInfo : FFXIVIpcBasePacket<LobbyServiceAccountList>
{
uint64_t seq;
uint8_t padding;
uint8_t numServiceAccounts;
uint8_t u1;
uint8_t u2;
uint32_t padding1;
struct
{ {
uint64_t seq; uint32_t id;
uint8_t padding; uint32_t unknown;
uint8_t numServiceAccounts; uint32_t index;
uint8_t u1; char name[0x44];
uint8_t u2; } serviceAccount[8];
};
struct FFXIVIpcServerList : FFXIVIpcBasePacket<LobbyServerList>
{
uint64_t seq;
uint16_t final;
uint16_t offset;
uint32_t numServers;
uint32_t padding;
uint32_t padding1;
struct
{
uint16_t id;
uint16_t index;
uint32_t flags; // 0x02 = World not accepting new characters
uint32_t padding1; uint32_t padding1;
uint32_t icon; // 2 = bonus XP star
struct
{
uint32_t id;
uint32_t unknown;
uint32_t index;
char name[0x44];
} serviceAccount[8];
};
struct FFXIVIpcServerList : FFXIVIpcBasePacket<LobbyServerList>
{
uint64_t seq;
uint16_t final;
uint16_t offset;
uint32_t numServers;
uint32_t padding;
uint32_t padding1;
struct
{
uint16_t id;
uint16_t index;
uint32_t flags; // 0x02 = World not accepting new characters
uint32_t padding1;
uint32_t icon; // 2 = bonus XP star
uint32_t padding2;
char name[0x40];
} server[6];
};
struct FFXIVIpcCharList : FFXIVIpcBasePacket<LobbyCharList>
{
uint64_t seq;
uint8_t counter; // current packet count * 4, count * 4 +1 on last packet.
uint8_t numInPacket; // always 2??
uint16_t padding;
uint8_t unknown1;
uint8_t unknown2;
uint8_t unknown3;
uint8_t unknown4; // 0x80 in case of last packet
uint32_t unknown5[7];
uint8_t unknown6; // 0x80 in case of last packet
uint8_t veteranRank;
uint8_t unknown7;
uint8_t padding1;
uint32_t daysSubscribed;
uint32_t remainingDays;
uint32_t daysToNextRank;
uint16_t maxCharOnWorld;
uint16_t unknown8;
uint32_t entitledExpansion;
uint32_t padding2; uint32_t padding2;
char name[0x40];
} server[6];
};
struct CharaDetails struct FFXIVIpcCharList : FFXIVIpcBasePacket<LobbyCharList>
{ {
uint32_t uniqueId; uint64_t seq;
uint32_t padding; uint8_t counter; // current packet count * 4, count * 4 +1 on last packet.
uint64_t contentId; uint8_t numInPacket; // always 2??
uint32_t index; uint16_t padding;
uint32_t padding2; uint8_t unknown1;
uint16_t serverId; uint8_t unknown2;
char nameChara[32]; uint8_t unknown3;
char nameServer[32]; uint8_t unknown4; // 0x80 in case of last packet
char charDetailJson[1030]; uint32_t unknown5[7];
} charaDetails[2]; uint8_t unknown6; // 0x80 in case of last packet
uint8_t veteranRank;
uint8_t unknown7;
uint8_t padding1;
uint32_t daysSubscribed;
uint32_t remainingDays;
uint32_t daysToNextRank;
uint16_t maxCharOnWorld;
uint16_t unknown8;
uint32_t entitledExpansion;
uint32_t padding2;
}; struct CharaDetails
struct FFXIVIpcEnterWorld : FFXIVIpcBasePacket<LobbyEnterWorld>
{ {
uint64_t seq; uint32_t uniqueId;
uint32_t charId;
uint32_t padding; uint32_t padding;
uint64_t contentId; uint64_t contentId;
uint32_t index;
uint32_t padding2; uint32_t padding2;
char sid[66]; uint16_t serverId;
uint16_t port; char nameChara[32];
char host[48]; char nameServer[32];
uint64_t padding3; char charDetailJson[1030];
uint64_t padding4; } charaDetails[2];
};
struct FFXIVIpcCharCreate : FFXIVIpcBasePacket<LobbyCharCreate> };
{
uint64_t seq;
uint8_t unknown;
uint8_t unknown_2;
uint8_t type;
uint8_t padding;
uint32_t unknown_3;
uint32_t unknown_4;
uint32_t unknown_5;
uint64_t content_id;
uint16_t unknown_7;
uint16_t unknown_8;
uint32_t unknown_9;
uint16_t unknown_10;
char name[32];
char world[32];
};
struct FFXIVIpcLobbyError : FFXIVIpcBasePacket<LobbyError> struct FFXIVIpcEnterWorld : FFXIVIpcBasePacket<LobbyEnterWorld>
{ {
uint64_t seq; uint64_t seq;
uint32_t error_id; uint32_t charId;
uint32_t param; uint32_t padding;
uint16_t message_id; uint64_t contentId;
char message[516]; uint32_t padding2;
}; char sid[66];
uint16_t port;
char host[48];
uint64_t padding3;
uint64_t padding4;
};
struct FFXIVIpcCharCreate : FFXIVIpcBasePacket<LobbyCharCreate>
{
uint64_t seq;
uint8_t unknown;
uint8_t unknown_2;
uint8_t type;
uint8_t padding;
uint32_t unknown_3;
uint32_t unknown_4;
uint32_t unknown_5;
uint64_t content_id;
uint16_t unknown_7;
uint16_t unknown_8;
uint32_t unknown_9;
uint16_t unknown_10;
char name[32];
char world[32];
};
struct FFXIVIpcLobbyError : FFXIVIpcBasePacket<LobbyError>
{
uint64_t seq;
uint32_t error_id;
uint32_t param;
uint16_t message_id;
char message[516];
};
} }
} }

View file

@ -66,7 +66,7 @@ public:
void handleGamePacket( Packets::FFXIVARR_PACKET_RAW &pPacket ); void handleGamePacket( Packets::FFXIVARR_PACKET_RAW &pPacket );
void handleGamePacket( Packets::GamePacketPtr pPacket ); void handlePacket( Packets::GamePacketPtr pPacket );
void sendPackets( Packets::PacketContainer * pPacket ); void sendPackets( Packets::PacketContainer * pPacket );

View file

@ -34,7 +34,13 @@ Core::Network::GameConnection::GameConnection( Core::Network::HivePtr pHive,
auto setZoneHandler = [=]( uint16_t opcode, std::string handlerName, GameConnection::Handler pHandler ) auto setZoneHandler = [=]( uint16_t opcode, std::string handlerName, GameConnection::Handler pHandler )
{ {
m_zoneHandlerMap[opcode] = pHandler; m_zoneHandlerMap[opcode] = pHandler;
m_packetHandlerStrMap[opcode] = handlerName; m_zoneHandlerStrMap[opcode] = handlerName;
};
auto setChatHandler = [=]( uint16_t opcode, std::string handlerName, GameConnection::Handler pHandler )
{
m_chatHandlerMap[opcode] = pHandler;
m_chatHandlerStrMap[opcode] = handlerName;
}; };
setZoneHandler( ClientZoneIpcType::PingHandler, "PingHandler", &GameConnection::pingHandler ); setZoneHandler( ClientZoneIpcType::PingHandler, "PingHandler", &GameConnection::pingHandler );
@ -84,6 +90,9 @@ Core::Network::GameConnection::GameConnection( Core::Network::HivePtr pHive,
setZoneHandler( ClientZoneIpcType::CFRegisterRoulette, "CFRegisterRoulette", &GameConnection::cfRegisterRoulette ); setZoneHandler( ClientZoneIpcType::CFRegisterRoulette, "CFRegisterRoulette", &GameConnection::cfRegisterRoulette );
setZoneHandler( ClientZoneIpcType::CFCommenceHandler, "CFDutyAccepted", &GameConnection::cfDutyAccepted); setZoneHandler( ClientZoneIpcType::CFCommenceHandler, "CFDutyAccepted", &GameConnection::cfDutyAccepted);
setChatHandler( ClientChatIpcType::TellReq, "TellReq", &GameConnection::tellHandler);
} }
Core::Network::GameConnection::~GameConnection() Core::Network::GameConnection::~GameConnection()
@ -134,40 +143,78 @@ void Core::Network::GameConnection::queueOutPacket( Core::Network::Packets::Game
m_outQueue.push( outPacket ); m_outQueue.push( outPacket );
} }
void Core::Network::GameConnection::handleGamePacket( Core::Network::Packets::GamePacketPtr pPacket ) void Core::Network::GameConnection::handleZonePacket( const Packets::GamePacket& pPacket )
{
auto it = m_zoneHandlerMap.find( pPacket.getSubType() );
std::string sessionStr = "[" + std::to_string( m_pSession->getId() ) + "]";
if( it != m_zoneHandlerMap.end() )
{
auto itStr = m_zoneHandlerStrMap.find( pPacket.getSubType() );
std::string name = itStr != m_zoneHandlerStrMap.end() ? itStr->second : "unknown";
// dont display packet notification if it is a ping or pos update, don't want the spam
if( pPacket.getSubType() != PingHandler &&
pPacket.getSubType() != UpdatePositionHandler )
g_log.debug( sessionStr + " Handling Zone IPC : " + name + "( " +
boost::str( boost::format( "%|04X|" ) %
static_cast< uint32_t >( pPacket.getSubType() & 0xFFFF ) ) + " )" );
( this->*( it->second ) )( pPacket, m_pSession->getPlayer() );
}
else
{
g_log.debug( sessionStr + " Undefined Zone IPC : Unknown ( " +
boost::str( boost::format( "%|04X|" ) %
static_cast< uint32_t >( pPacket.getSubType() & 0xFFFF ) ) + " )" );
g_log.debug( pPacket.toString() );
}
}
void Core::Network::GameConnection::handleChatPacket( const Packets::GamePacket& pPacket )
{
auto it = m_chatHandlerMap.find( pPacket.getSubType() );
std::string sessionStr = "[" + std::to_string( m_pSession->getId() ) + "]";
if( it != m_chatHandlerMap.end() )
{
auto itStr = m_chatHandlerStrMap.find( pPacket.getSubType() );
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
g_log.debug( sessionStr + " Handling Chat IPC : " + name + "( " +
boost::str( boost::format( "%|04X|" ) %
static_cast< uint32_t >( pPacket.getSubType() & 0xFFFF ) ) + " )" );
( this->*( it->second ) )( pPacket, m_pSession->getPlayer() );
}
else
{
g_log.debug( sessionStr + " Undefined Chat IPC : Unknown ( " +
boost::str( boost::format( "%|04X|" ) %
static_cast< uint32_t >( pPacket.getSubType() & 0xFFFF ) ) + " )" );
g_log.debug( pPacket.toString() );
}
}
void Core::Network::GameConnection::handlePacket( Core::Network::Packets::GamePacketPtr pPacket )
{ {
if( !m_pSession ) if( !m_pSession )
return; return;
/*if( m_conType == Network::ConnectionType::Zone ) switch( m_conType )
{ {
g_log.debug( "Zone Packet" ); case Network::ConnectionType::Zone:
handleZonePacket( *pPacket );
break;
case Network::ConnectionType::Chat:
handleChatPacket( *pPacket );
break;
} }
else if( m_conType == Network::ConnectionType::Chat )
{
g_log.debug( "Chat Packet" );
}*/
auto it = m_zoneHandlerMap.find( pPacket->getSubType() );
if( it != m_zoneHandlerMap.end() )
{
auto name = m_packetHandlerStrMap[pPacket->getSubType()];
// dont display packet notification if it is a ping or pos update, don't want the spam
if( pPacket->getSubType() != ClientZoneIpcType::PingHandler &&
pPacket->getSubType() != ClientZoneIpcType::UpdatePositionHandler )
g_log.debug( "[" + std::to_string( m_pSession->getId() ) + "] Handling packet : " + name + "( " +
boost::str( boost::format( "%|04X|" ) % static_cast< uint32_t >( pPacket->getSubType() & 0xFFFF ) ) + " )" );
( this->*( it->second ) )( *pPacket, m_pSession->getPlayer() );
}
else
{
g_log.debug( "[" + std::to_string( m_pSession->getId() ) + "] Undefined packet : Unknown ( " +
boost::str( boost::format( "%|04X|" ) % static_cast< uint32_t >( pPacket->getSubType() & 0xFFFF ) ) + " )" );
g_log.debug( pPacket->toString() );
}
} }
@ -185,7 +232,7 @@ void Core::Network::GameConnection::processInQueue()
// handle the incoming game packets // handle the incoming game packets
while( auto pPacket = m_inQueue.pop() ) while( auto pPacket = m_inQueue.pop() )
{ {
handleGamePacket( pPacket ); handlePacket(pPacket);
} }
} }

View file

@ -36,9 +36,13 @@ private:
AcceptorPtr m_pAcceptor; AcceptorPtr m_pAcceptor;
// handler for game packets (main type 0x03) // handler for game packets (main type 0x03, connection type 1)
HandlerMap m_zoneHandlerMap; HandlerMap m_zoneHandlerMap;
HandlerStrMap m_packetHandlerStrMap; HandlerStrMap m_zoneHandlerStrMap;
// handler for game packets (main type 0x03, connection type 2)
HandlerMap m_chatHandlerMap;
HandlerStrMap m_chatHandlerStrMap;
SessionPtr m_pSession; SessionPtr m_pSession;
@ -70,7 +74,11 @@ public:
void processInQueue(); void processInQueue();
void processOutQueue(); void processOutQueue();
void handleGamePacket( Packets::GamePacketPtr pPacket ); void handlePacket( Packets::GamePacketPtr pPacket );
void handleZonePacket( const Packets::GamePacket& pPacket );
void handleChatPacket( const Packets::GamePacket& pPacket );
void sendPackets( Packets::PacketContainer * pPacket ); void sendPackets( Packets::PacketContainer * pPacket );
@ -108,6 +116,8 @@ public:
DECLARE_HANDLER( gm1Handler ); DECLARE_HANDLER( gm1Handler );
DECLARE_HANDLER( gm2Handler ); DECLARE_HANDLER( gm2Handler );
DECLARE_HANDLER( tellHandler );
}; };

View file

@ -542,3 +542,11 @@ void Core::Network::GameConnection::logoutHandler( const Packets::GamePacket& in
logoutPacket.data().flags2 = 0x2000; logoutPacket.data().flags2 = 0x2000;
queueOutPacket( logoutPacket ); queueOutPacket( logoutPacket );
} }
void Core::Network::GameConnection::tellHandler( const Packets::GamePacket& inPacket,
Entity::PlayerPtr pPlayer )
{
}