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:
parent
0116272e69
commit
cd01ed7295
6 changed files with 47 additions and 48 deletions
|
@ -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 ) :
|
||||||
|
|
|
@ -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 );
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -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 )
|
||||||
{
|
{
|
||||||
|
|
|
@ -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 )
|
||||||
|
|
|
@ -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() )
|
||||||
|
|
|
@ -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 );
|
||||||
|
|
Loading…
Add table
Reference in a new issue