2020-08-18 20:42:30 +00:00
# include "CNProtocol.hpp"
# include "CNStructs.hpp"
# include "CNShardServer.hpp"
# include "PlayerManager.hpp"
# include "CNShared.hpp"
2020-08-22 17:39:13 +00:00
# include "settings.hpp"
2020-08-18 20:42:30 +00:00
# include <iostream>
# include <sstream>
# include <cstdlib>
std : : map < uint32_t , PacketHandler > CNShardServer : : ShardPackets ;
2020-08-24 21:11:40 +00:00
std : : list < TimerEvent > CNShardServer : : Timers ;
2020-08-18 20:42:30 +00:00
CNShardServer : : CNShardServer ( uint16_t p ) {
port = p ;
pHandler = & CNShardServer : : handlePacket ;
2020-08-24 21:11:40 +00:00
REGISTER_SHARD_TIMER ( keepAliveTimer , 2000 ) ;
2020-08-18 20:42:30 +00:00
init ( ) ;
}
void CNShardServer : : handlePacket ( CNSocket * sock , CNPacketData * data ) {
2020-08-23 21:09:31 +00:00
printPacket ( data , CL2FE ) ;
2020-08-22 17:39:13 +00:00
2020-08-18 20:42:30 +00:00
if ( ShardPackets . find ( data - > type ) ! = ShardPackets . end ( ) )
ShardPackets [ data - > type ] ( sock , data ) ;
2020-08-31 22:54:49 +00:00
else if ( settings : : VERBOSITY > 0 )
2020-08-22 17:19:46 +00:00
std : : cerr < < " OpenFusion: SHARD UNIMPLM ERR. PacketType: " < < Defines : : p2str ( CL2FE , data - > type ) < < " ( " < < data - > type < < " ) " < < std : : endl ;
2020-08-18 20:42:30 +00:00
}
2020-08-24 21:11:40 +00:00
void CNShardServer : : keepAliveTimer ( CNServer * serv , uint64_t currTime ) {
auto cachedPlayers = PlayerManager : : players ;
for ( auto pair : cachedPlayers ) {
2020-08-27 02:35:13 +00:00
if ( pair . second . lastHeartbeat ! = 0 & & currTime - pair . second . lastHeartbeat > 60000 ) { // if the client hadn't responded in 60 seconds, its a dead connection so throw it out
2020-08-24 21:11:40 +00:00
pair . first - > kill ( ) ;
continue ;
}
// passed the heartbeat, send another
INITSTRUCT ( sP_FE2CL_REQ_LIVE_CHECK , data ) ;
pair . first - > sendPacket ( ( void * ) & data , P_FE2CL_REQ_LIVE_CHECK , sizeof ( sP_FE2CL_REQ_LIVE_CHECK ) ) ;
}
}
2020-08-22 23:31:09 +00:00
void CNShardServer : : newConnection ( CNSocket * cns ) {
cns - > setActiveKey ( SOCKETKEY_E ) ; // by default they accept keys encrypted with the default key
}
2020-08-18 20:42:30 +00:00
void CNShardServer : : killConnection ( CNSocket * cns ) {
2020-08-24 22:02:07 +00:00
// check if the player ever sent a REQ_PC_ENTER
if ( PlayerManager : : players . find ( cns ) = = PlayerManager : : players . end ( ) )
return ;
2020-08-22 17:39:13 +00:00
// remove from CNSharedData
2020-08-24 22:02:07 +00:00
int64_t key = PlayerManager : : getPlayer ( cns ) - > SerialKey ;
2020-08-18 20:42:30 +00:00
PlayerManager : : removePlayer ( cns ) ;
2020-08-24 22:02:07 +00:00
CNSharedData : : erasePlayer ( key ) ;
2020-08-19 01:34:39 +00:00
}
2020-08-24 21:11:40 +00:00
void CNShardServer : : onStep ( ) {
2020-08-22 18:38:27 +00:00
uint64_t currTime = getTime ( ) ;
2020-08-19 01:34:39 +00:00
2020-08-24 21:11:40 +00:00
for ( TimerEvent & event : Timers ) {
if ( event . scheduledEvent = = 0 ) {
// event hasn't been queued yet, go ahead and do that
event . scheduledEvent = currTime + event . delta ;
2020-08-19 01:34:39 +00:00
continue ;
}
2020-08-24 21:11:40 +00:00
if ( event . scheduledEvent < currTime ) {
// timer needs to be called
event . handlr ( this , currTime ) ;
event . scheduledEvent = currTime + event . delta ;
}
2020-08-19 01:34:39 +00:00
}
2020-08-22 17:19:46 +00:00
}