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

Cleanup of GameConnection

This commit is contained in:
Mordred 2023-02-27 09:57:12 +01:00
parent 0116272e69
commit cd01ed7295
6 changed files with 47 additions and 48 deletions

View file

@ -296,8 +296,7 @@ namespace Sapphire::Network::Packets
}; };
class FFXIVRawPacket : class FFXIVRawPacket : public FFXIVPacketBase
public FFXIVPacketBase
{ {
public: public:
FFXIVRawPacket( uint16_t type, uint32_t size, uint32_t sourceActorId, uint32_t targetActorId ) : FFXIVRawPacket( uint16_t type, uint32_t size, uint32_t sourceActorId, uint32_t targetActorId ) :

View file

@ -120,19 +120,15 @@ void ChatChannelMgr::sendMessageToChannel( uint64_t channelId, Entity::Player& s
if( id == sender.getId() ) if( id == sender.getId() )
continue; continue;
auto pSession = server.getSession( id ); auto pPlayer = playerMgr.getPlayer( id );
// check if player is online to recv message // check if player is online to recv message
if( !pSession ) if( !pPlayer->isConnected() )
{
continue; continue;
}
auto pPlayer = playerMgr.getPlayer( id );
// prepare message packet, associating message and sender info with channel data // prepare message packet, associating message and sender info with channel data
auto chatToChannelPacket = std::make_shared< Packets::Server::ChatToChannelPacket >( *pPlayer, sender, channelId, message ); auto chatToChannelPacket = std::make_shared< Packets::Server::ChatToChannelPacket >( *pPlayer, sender, channelId, message );
pSession->getChatConnection()->queueOutPacket( chatToChannelPacket ); server.queueChatForPlayer( pPlayer->getCharacterId(), chatToChannelPacket );
} }
} }

View file

@ -9,8 +9,6 @@
#include <Network/GamePacketParser.h> #include <Network/GamePacketParser.h>
#include <Service.h> #include <Service.h>
#include "Territory/Territory.h"
#include "Network/PacketWrappers/PlayerSetupPacket.h" #include "Network/PacketWrappers/PlayerSetupPacket.h"
#include "GameConnection.h" #include "GameConnection.h"
@ -28,8 +26,7 @@ using namespace Sapphire::Network::Packets::WorldPackets;
using namespace Sapphire::Network::Packets::WorldPackets::Client; using namespace Sapphire::Network::Packets::WorldPackets::Client;
using namespace Sapphire::Network::Packets::WorldPackets::Server; using namespace Sapphire::Network::Packets::WorldPackets::Server;
Sapphire::Network::GameConnection::GameConnection( Sapphire::Network::HivePtr pHive, GameConnection::GameConnection( Sapphire::Network::HivePtr pHive, Sapphire::Network::AcceptorPtr pAcceptor ) :
Sapphire::Network::AcceptorPtr pAcceptor ) :
Connection( std::move( pHive ) ), Connection( std::move( pHive ) ),
m_pAcceptor( std::move( pAcceptor ) ), m_pAcceptor( std::move( pAcceptor ) ),
m_conType( ConnectionType::None ) m_conType( ConnectionType::None )
@ -173,28 +170,28 @@ Sapphire::Network::GameConnection::GameConnection( Sapphire::Network::HivePtr pH
setZoneHandler( GetFcInviteList, "GetFcInviteList", &GameConnection::getFcInviteListHandler ); setZoneHandler( GetFcInviteList, "GetFcInviteList", &GameConnection::getFcInviteListHandler );
} }
Sapphire::Network::GameConnection::~GameConnection() = default; GameConnection::~GameConnection() = default;
// overwrite the parents onConnect for our game socket needs // overwrite the parents onConnect for our game socket needs
void Sapphire::Network::GameConnection::onAccept( const std::string& host, uint16_t port ) void GameConnection::onAccept( const std::string& host, uint16_t port )
{ {
GameConnectionPtr connection( new GameConnection( m_hive, m_pAcceptor ) ); auto connection = std::make_shared< GameConnection >( m_hive, m_pAcceptor );
m_pAcceptor->accept( connection ); m_pAcceptor->accept( connection );
Logger::info( "Connect from {0}:{1}", m_socket.remote_endpoint().address().to_string(), m_socket.remote_endpoint().port() ); Logger::info( "Connect from {0}:{1}", m_socket.remote_endpoint().address().to_string(), m_socket.remote_endpoint().port() );
} }
void Sapphire::Network::GameConnection::onDisconnect() void GameConnection::onDisconnect()
{ {
if( m_pSession ) if( m_pSession )
Logger::debug( "[{0}] Disconnect", m_pSession->getId() ); Logger::debug( "[{0}] Disconnect {1}:{2}\"", m_pSession->getId() );
else else
Logger::debug( "Disconnect of lost session." ); Logger::debug( "Disconnect of lost session." );
m_pSession.reset(); m_pSession.reset();
} }
void Sapphire::Network::GameConnection::onRecv( std::vector< uint8_t >& buffer ) void GameConnection::onRecv( std::vector< uint8_t >& buffer )
{ {
m_packets.insert( std::end( m_packets ), std::begin( buffer ), std::end( buffer ) ); m_packets.insert( std::end( m_packets ), std::begin( buffer ), std::end( buffer ) );
// This is assumed packet always start with valid FFXIVARR_PACKET_HEADER for now. // This is assumed packet always start with valid FFXIVARR_PACKET_HEADER for now.
@ -213,8 +210,7 @@ void Sapphire::Network::GameConnection::onRecv( std::vector< uint8_t >& buffer )
// Dissect packet list // Dissect packet list
std::vector< Packets::FFXIVARR_PACKET_RAW > packetList; std::vector< Packets::FFXIVARR_PACKET_RAW > packetList;
const auto packetResult = Packets::getPackets( m_packets, sizeof( struct FFXIVARR_PACKET_HEADER ), const auto packetResult = Packets::getPackets( m_packets, sizeof( struct FFXIVARR_PACKET_HEADER ), packetHeader, packetList );
packetHeader, packetList );
if( packetResult == Incomplete ) if( packetResult == Incomplete )
return; return;
@ -231,22 +227,22 @@ void Sapphire::Network::GameConnection::onRecv( std::vector< uint8_t >& buffer )
m_packets.clear(); m_packets.clear();
} }
void Sapphire::Network::GameConnection::onError( const asio::error_code& error ) void GameConnection::onError( const asio::error_code& error )
{ {
Logger::debug( "GameConnection ERROR: {0}", error.message() ); Logger::debug( "GameConnection ERROR: {0}", error.message() );
} }
void Sapphire::Network::GameConnection::queueInPacket( Sapphire::Network::Packets::FFXIVARR_PACKET_RAW inPacket ) void GameConnection::queueInPacket( Packets::FFXIVARR_PACKET_RAW inPacket )
{ {
m_inQueue.push( inPacket ); m_inQueue.push( std::move( inPacket ) );
} }
void Sapphire::Network::GameConnection::queueOutPacket( Sapphire::Network::Packets::FFXIVPacketBasePtr outPacket ) void GameConnection::queueOutPacket( Packets::FFXIVPacketBasePtr outPacket )
{ {
m_outQueue.push( outPacket ); m_outQueue.push( std::move( outPacket ) );
} }
void Sapphire::Network::GameConnection::queueOutPacket( std::vector< Packets::FFXIVPacketBasePtr > vector ) void GameConnection::queueOutPacket( std::vector< Packets::FFXIVPacketBasePtr > vector )
{ {
for( auto& packet : vector ) for( auto& packet : vector )
{ {
@ -254,7 +250,7 @@ void Sapphire::Network::GameConnection::queueOutPacket( std::vector< Packets::FF
} }
} }
void Sapphire::Network::GameConnection::handleZonePacket( Sapphire::Network::Packets::FFXIVARR_PACKET_RAW& pPacket ) void GameConnection::handleZonePacket( Packets::FFXIVARR_PACKET_RAW& pPacket )
{ {
uint16_t opcode = Util::getOpCode( pPacket ); uint16_t opcode = Util::getOpCode( pPacket );
auto it = m_zoneHandlerMap.find( opcode ); auto it = m_zoneHandlerMap.find( opcode );
@ -285,7 +281,7 @@ void Sapphire::Network::GameConnection::handleZonePacket( Sapphire::Network::Pac
} }
} }
void Sapphire::Network::GameConnection::handleChatPacket( Sapphire::Network::Packets::FFXIVARR_PACKET_RAW& pPacket ) void GameConnection::handleChatPacket( Packets::FFXIVARR_PACKET_RAW& pPacket )
{ {
uint16_t opcode = Util::getOpCode( pPacket ); uint16_t opcode = Util::getOpCode( pPacket );
auto it = m_chatHandlerMap.find( opcode ); auto it = m_chatHandlerMap.find( opcode );
@ -312,18 +308,18 @@ void Sapphire::Network::GameConnection::handleChatPacket( Sapphire::Network::Pac
} }
} }
void Sapphire::Network::GameConnection::handlePacket( Sapphire::Network::Packets::FFXIVARR_PACKET_RAW& pPacket ) void GameConnection::handlePacket( Packets::FFXIVARR_PACKET_RAW& pPacket )
{ {
if( !m_pSession ) if( !m_pSession )
return; return;
switch( m_conType ) switch( m_conType )
{ {
case Network::ConnectionType::Zone: case ConnectionType::Zone:
handleZonePacket( pPacket ); handleZonePacket( pPacket );
break; break;
case Network::ConnectionType::Chat: case ConnectionType::Chat:
handleChatPacket( pPacket ); handleChatPacket( pPacket );
break; break;
@ -333,7 +329,7 @@ void Sapphire::Network::GameConnection::handlePacket( Sapphire::Network::Packets
} }
void Sapphire::Network::GameConnection::sendPackets( Packets::PacketContainer* pPacket ) void GameConnection::sendPackets( Packets::PacketContainer* pPacket )
{ {
std::vector< uint8_t > sendBuffer; std::vector< uint8_t > sendBuffer;
@ -341,7 +337,7 @@ void Sapphire::Network::GameConnection::sendPackets( Packets::PacketContainer* p
send( sendBuffer ); send( sendBuffer );
} }
void Sapphire::Network::GameConnection::processInQueue() void GameConnection::processInQueue()
{ {
// handle the incoming game packets // handle the incoming game packets
while( m_inQueue.size() ) while( m_inQueue.size() )
@ -351,7 +347,7 @@ void Sapphire::Network::GameConnection::processInQueue()
} }
} }
void Sapphire::Network::GameConnection::processOutQueue() void GameConnection::processOutQueue()
{ {
if( m_outQueue.size() < 1 ) if( m_outQueue.size() < 1 )
return; return;
@ -383,14 +379,14 @@ void Sapphire::Network::GameConnection::processOutQueue()
} }
void Sapphire::Network::GameConnection::sendSinglePacket( Sapphire::Network::Packets::FFXIVPacketBasePtr pPacket ) void GameConnection::sendSinglePacket( Packets::FFXIVPacketBasePtr pPacket )
{ {
PacketContainer pRP = PacketContainer(); PacketContainer pRP = PacketContainer();
pRP.addPacket( pPacket ); pRP.addPacket( std::move( pPacket ) );
sendPackets( &pRP ); sendPackets( &pRP );
} }
void Sapphire::Network::GameConnection::injectPacket( const std::string& packetpath, Sapphire::Entity::Player& player ) void GameConnection::injectPacket( const std::string& packetpath, Entity::Player& player )
{ {
char packet[ 0x11570 ]; char packet[ 0x11570 ];
@ -435,14 +431,13 @@ void Sapphire::Network::GameConnection::injectPacket( const std::string& packetp
if( pSize == 0 ) if( pSize == 0 )
return; return;
queueOutPacket( FFXIVPacketBasePtr( new FFXIVRawPacket( packet + k, pSize ) ) ); queueOutPacket( std::make_shared< FFXIVRawPacket >( packet + k, pSize ) );
k += ( pSize ); k += ( pSize );
} }
} }
void Sapphire::Network::GameConnection::handlePackets( const Sapphire::Network::Packets::FFXIVARR_PACKET_HEADER& ipcHeader, void GameConnection::handlePackets( const Packets::FFXIVARR_PACKET_HEADER& ipcHeader, const std::vector< Packets::FFXIVARR_PACKET_RAW >& packetData )
const std::vector< Sapphire::Network::Packets::FFXIVARR_PACKET_RAW >& packetData )
{ {
auto& server = Common::Service< World::WorldServer >::ref(); auto& server = Common::Service< World::WorldServer >::ref();
@ -553,7 +548,7 @@ void Sapphire::Network::GameConnection::handlePackets( const Sapphire::Network::
} }
} }
const char* Sapphire::Network::GameConnection::zonePacketToString( uint32_t opcode ) const char* GameConnection::zonePacketToString( uint32_t opcode )
{ {
switch( opcode ) switch( opcode )
{ {

View file

@ -510,13 +510,11 @@ void Sapphire::Network::GameConnection::tellHandler( const Packets::FFXIVARR_PAC
return; return;
} }
auto pSessionSource = server.getSession( player.getCharacterId() );
if( pTargetPlayer->hasCondition( PlayerCondition::BoundByDuty ) && !player.isActingAsGm() ) if( pTargetPlayer->hasCondition( PlayerCondition::BoundByDuty ) && !player.isActingAsGm() )
{ {
auto boundPacket = makeChatPacket< Packets::Server::FFXIVRecvFinderStatus >( player.getId() ); auto boundPacket = makeChatPacket< Packets::Server::FFXIVRecvFinderStatus >( player.getId() );
strcpy( boundPacket->data().toName, data.toName ); strcpy( boundPacket->data().toName, data.toName );
pSessionSource->getChatConnection()->queueOutPacket( boundPacket ); server.queueChatForPlayer( player.getCharacterId(), boundPacket );
return; return;
} }
@ -524,7 +522,7 @@ void Sapphire::Network::GameConnection::tellHandler( const Packets::FFXIVARR_PAC
{ {
auto busyPacket = makeChatPacket< Packets::Server::FFXIVRecvBusyStatus >( player.getId() ); auto busyPacket = makeChatPacket< Packets::Server::FFXIVRecvBusyStatus >( player.getId() );
strcpy( busyPacket->data().toName, data.toName ); strcpy( busyPacket->data().toName, data.toName );
pSessionSource->getChatConnection()->queueOutPacket( busyPacket ); server.queueChatForPlayer( player.getCharacterId(), busyPacket );
return; return;
} }
@ -537,8 +535,7 @@ void Sapphire::Network::GameConnection::tellHandler( const Packets::FFXIVARR_PAC
{ {
tellPacket->data().type |= ChatFromType::GmTellMsg; //TODO: Is there an enum for this? or is it only GM? tellPacket->data().type |= ChatFromType::GmTellMsg; //TODO: Is there an enum for this? or is it only GM?
} }
server.queueChatForPlayer( pTargetPlayer->getCharacterId(), tellPacket );
server.getSession( pTargetPlayer->getCharacterId() )->getChatConnection()->queueOutPacket( tellPacket );
} }
void Sapphire::Network::GameConnection::chatToChannelHandler( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player ) void Sapphire::Network::GameConnection::chatToChannelHandler( const Packets::FFXIVARR_PACKET_RAW& inPacket, Entity::Player& player )

View file

@ -505,6 +505,17 @@ void WorldServer::queueForPlayer( uint64_t characterId, Sapphire::Network::Packe
pZoneCon->queueOutPacket( pPacket ); pZoneCon->queueOutPacket( pPacket );
} }
void WorldServer::queueChatForPlayer( uint64_t characterId, Sapphire::Network::Packets::FFXIVPacketBasePtr pPacket )
{
auto pSession = getSession( characterId );
if( !pSession )
return;
auto pChatCon = pSession->getChatConnection();
if( pChatCon )
pChatCon->queueOutPacket( pPacket );
}
void WorldServer::queueForPlayers( const std::set< uint64_t >& characterIds, Sapphire::Network::Packets::FFXIVPacketBasePtr pPacket ) void WorldServer::queueForPlayers( const std::set< uint64_t >& characterIds, Sapphire::Network::Packets::FFXIVPacketBasePtr pPacket )
{ {
if( characterIds.empty() ) if( characterIds.empty() )

View file

@ -44,6 +44,7 @@ namespace Sapphire::World
bool loadSettings( int32_t argc, char* argv[] ); bool loadSettings( int32_t argc, char* argv[] );
void queueForPlayer( uint64_t characterId, Sapphire::Network::Packets::FFXIVPacketBasePtr pPacket ); void queueForPlayer( uint64_t characterId, Sapphire::Network::Packets::FFXIVPacketBasePtr pPacket );
void queueChatForPlayer( uint64_t characterId, Sapphire::Network::Packets::FFXIVPacketBasePtr pPacket );
void queueForPlayers( const std::set< uint64_t >& characterIds, Sapphire::Network::Packets::FFXIVPacketBasePtr pPacket ); void queueForPlayers( const std::set< uint64_t >& characterIds, Sapphire::Network::Packets::FFXIVPacketBasePtr pPacket );
void queueForPlayer( uint64_t characterId, std::vector< Sapphire::Network::Packets::FFXIVPacketBasePtr > packets ); void queueForPlayer( uint64_t characterId, std::vector< Sapphire::Network::Packets::FFXIVPacketBasePtr > packets );
void queueForPlayers( const std::set< uint64_t >& characterIds, std::vector< Sapphire::Network::Packets::FFXIVPacketBasePtr > packets ); void queueForPlayers( const std::set< uint64_t >& characterIds, std::vector< Sapphire::Network::Packets::FFXIVPacketBasePtr > packets );