2012-06-14 09:06:06 -04:00
// cServer.h
// Interfaces to the cServer object representing the network server
# pragma once
2012-09-23 17:23:33 -04:00
# include "OSSupport/SocketThreads.h"
2013-03-05 15:47:29 -05:00
# include "OSSupport/ListenThread.h"
2014-01-05 17:06:17 -05:00
# include "RCONServer.h"
# ifdef _MSC_VER
# pragma warning(push)
# pragma warning(disable:4127)
# pragma warning(disable:4244)
# pragma warning(disable:4231)
# pragma warning(disable:4189)
# pragma warning(disable:4702)
# endif
2014-04-29 05:04:54 -04:00
# include "PolarSSL++/RsaPrivateKey.h"
2014-01-05 17:06:17 -05:00
# ifdef _MSC_VER
# pragma warning(pop)
# endif
2012-06-14 09:06:06 -04:00
2013-06-29 11:30:05 -04:00
// fwd:
2012-06-14 09:06:06 -04:00
class cPlayer ;
class cClientHandle ;
2012-11-11 09:23:47 -05:00
class cIniFile ;
2014-07-14 14:49:31 -04:00
class cCommandOutputCallback ;
2012-06-14 09:06:06 -04:00
typedef std : : list < cClientHandle * > cClientHandleList ;
2014-07-15 19:03:47 -04:00
namespace Json
{
class Value ;
}
2012-06-14 09:06:06 -04:00
2014-07-17 10:33:09 -04:00
class cServer // tolua_export
2013-03-04 16:13:08 -05:00
: public cListenThread : : cCallback
2014-07-17 10:33:09 -04:00
{ // tolua_export
public : // tolua_export
2013-12-21 10:38:37 -05:00
virtual ~ cServer ( ) { }
2014-10-17 07:57:18 -04:00
bool InitServer ( cIniFile & a_SettingsIni , bool a_ShouldAuth ) ;
2012-06-14 09:06:06 -04:00
2013-08-11 13:18:06 -04:00
// tolua_begin
const AString & GetDescription ( void ) const { return m_Description ; }
// Player counts:
2014-07-26 18:39:39 -04:00
int GetMaxPlayers ( void ) const { return m_MaxPlayers ; }
2014-04-19 11:53:02 -04:00
int GetNumPlayers ( void ) const ;
2013-08-11 13:18:06 -04:00
void SetMaxPlayers ( int a_MaxPlayers ) { m_MaxPlayers = a_MaxPlayers ; }
2014-12-08 17:33:59 -05:00
/** Check if the player is queued to be transferred to a World.
2014-12-09 06:06:25 -05:00
Returns true is Player is found in queue . */
2014-12-08 03:45:29 -05:00
bool IsPlayerInQueue ( AString a_Username ) ;
2014-11-29 03:36:15 -05:00
2014-12-11 08:34:09 -05:00
/** Can login more than once with same username.
2014-12-09 06:06:25 -05:00
Returns false if it is not allowed , true otherwise . */
bool DoesAllowMultiLogin ( void ) { return m_bAllowMultiLogin ; }
2014-11-29 03:36:15 -05:00
2013-11-04 16:51:24 -05:00
// Hardcore mode or not:
2014-07-26 18:39:39 -04:00
bool IsHardcore ( void ) const { return m_bIsHardcore ; }
2013-11-04 16:51:24 -05:00
2013-08-12 01:55:53 -04:00
// tolua_end
2012-06-14 09:06:06 -04:00
2013-03-04 16:13:08 -05:00
bool Start ( void ) ;
2012-06-14 09:06:06 -04:00
2013-06-22 15:08:34 -04:00
bool Command ( cClientHandle & a_Client , AString & a_Cmd ) ;
2013-06-29 11:30:05 -04:00
2014-01-28 17:53:07 -05:00
/** Executes the console command, sends output through the specified callback */
2013-06-29 11:30:05 -04:00
void ExecuteConsoleCommand ( const AString & a_Cmd , cCommandOutputCallback & a_Output ) ;
2013-11-13 09:56:40 -05:00
2014-01-28 17:53:07 -05:00
/** Lists all available console commands and their helpstrings */
2013-11-13 09:56:40 -05:00
void PrintHelp ( const AStringVector & a_Split , cCommandOutputCallback & a_Output ) ;
2013-02-15 08:00:59 -05:00
2014-01-28 17:53:07 -05:00
/** Binds the built-in console commands with the plugin manager */
2013-02-15 08:00:59 -05:00
static void BindBuiltInConsoleCommands ( void ) ;
2013-08-11 14:16:41 -04:00
void Shutdown ( void ) ;
2012-06-14 09:06:06 -04:00
void KickUser ( int a_ClientID , const AString & a_Reason ) ;
2014-07-15 19:03:47 -04:00
/** Authenticates the specified user, called by cAuthenticator */
void AuthenticateUser ( int a_ClientID , const AString & a_Name , const AString & a_UUID , const Json : : Value & a_Properties ) ;
2012-06-14 09:06:06 -04:00
2013-08-11 13:46:27 -04:00
const AString & GetServerID ( void ) const { return m_ServerID ; } // tolua_export
2012-06-14 09:06:06 -04:00
2014-01-19 13:31:43 -05:00
/** Called by cClientHandle's destructor; stop m_SocketThreads from calling back into a_Client */
void ClientDestroying ( const cClientHandle * a_Client ) ;
2012-06-14 09:06:06 -04:00
2014-01-19 13:31:43 -05:00
/** Notifies m_SocketThreads that client has something to be written */
void NotifyClientWrite ( const cClientHandle * a_Client ) ;
2012-06-14 09:06:06 -04:00
2012-09-25 04:23:19 -04:00
void WriteToClient ( const cClientHandle * a_Client , const AString & a_Data ) ; // Queues outgoing data for the client through m_SocketThreads
2012-06-14 09:06:06 -04:00
2012-09-25 04:23:19 -04:00
void RemoveClient ( const cClientHandle * a_Client ) ; // Removes the clienthandle from m_SocketThreads
2012-06-14 09:06:06 -04:00
2014-01-28 17:53:07 -05:00
/** Don't tick a_Client anymore, it will be ticked from its cPlayer instead */
2013-08-12 02:35:13 -04:00
void ClientMovedToWorld ( const cClientHandle * a_Client ) ;
2014-01-28 17:53:07 -05:00
/** Notifies the server that a player was created; the server uses this to adjust the number of players */
2013-08-14 04:24:34 -04:00
void PlayerCreated ( const cPlayer * a_Player ) ;
2014-01-28 17:53:07 -05:00
/** Notifies the server that a player is being destroyed; the server uses this to adjust the number of players */
2013-08-14 13:11:54 -04:00
void PlayerDestroying ( const cPlayer * a_Player ) ;
2014-01-07 10:31:06 -05:00
2014-01-10 15:31:05 -05:00
/** Returns base64 encoded favicon data (obtained from favicon.png) */
2014-01-07 11:53:40 -05:00
const AString & GetFaviconData ( void ) const { return m_FaviconData ; }
2013-08-14 04:24:34 -04:00
2014-04-29 05:04:54 -04:00
cRsaPrivateKey & GetPrivateKey ( void ) { return m_PrivateKey ; }
2014-01-23 17:35:23 -05:00
const AString & GetPublicKeyDER ( void ) const { return m_PublicKeyDER ; }
2012-08-30 17:06:13 -04:00
2014-07-11 07:13:10 -04:00
/** Returns true if authentication has been turned on in server settings. */
2014-08-20 16:21:41 -04:00
bool ShouldAuthenticate ( void ) const { return m_ShouldAuthenticate ; } // tolua_export
2014-01-28 17:53:07 -05:00
2014-07-11 07:13:10 -04:00
/** Returns true if offline UUIDs should be used to load data for players whose normal UUIDs cannot be found.
Loaded from the settings . ini [ PlayerData ] . LoadOfflinePlayerData setting . */
bool ShouldLoadOfflinePlayerData ( void ) const { return m_ShouldLoadOfflinePlayerData ; }
/** Returns true if old-style playernames should be used to load data for players whose regular datafiles cannot be found.
This allows a seamless transition from name - based to UUID - based player storage .
Loaded from the settings . ini [ PlayerData ] . LoadNamedPlayerData setting . */
bool ShouldLoadNamedPlayerData ( void ) const { return m_ShouldLoadNamedPlayerData ; }
2014-09-17 14:55:46 -04:00
/** Returns true if BungeeCord logins (that specify the player's UUID) are allowed.
Read from settings , admins should set this to true only when they chain to BungeeCord ,
it makes the server vulnerable to identity theft through direct connections . */
bool ShouldAllowBungeeCord ( void ) const { return m_ShouldAllowBungeeCord ; }
2012-06-14 09:06:06 -04:00
private :
2014-07-17 13:13:23 -04:00
friend class cRoot ; // so cRoot can create and destroy cServer
2012-06-14 09:06:06 -04:00
2014-01-28 17:53:07 -05:00
/** When NotifyClientWrite() is called, it is queued for this thread to process (to avoid deadlocks between cSocketThreads, cClientHandle and cChunkMap) */
2012-06-14 09:06:06 -04:00
class cNotifyWriteThread :
public cIsThread
{
typedef cIsThread super ;
cEvent m_Event ; // Set when m_Clients gets appended
cServer * m_Server ;
cCriticalSection m_CS ;
cClientHandleList m_Clients ;
virtual void Execute ( void ) ;
2014-07-17 10:33:09 -04:00
public :
2012-06-14 09:06:06 -04:00
cNotifyWriteThread ( void ) ;
~ cNotifyWriteThread ( ) ;
bool Start ( cServer * a_Server ) ;
void NotifyClientWrite ( const cClientHandle * a_Client ) ;
} ;
2014-01-28 17:53:07 -05:00
/** The server tick thread takes care of the players who aren't yet spawned in a world */
2013-08-11 13:46:27 -04:00
class cTickThread :
public cIsThread
{
typedef cIsThread super ;
public :
cTickThread ( cServer & a_Server ) ;
protected :
cServer & m_Server ;
// cIsThread overrides:
virtual void Execute ( void ) override ;
} ;
2012-06-14 09:06:06 -04:00
cNotifyWriteThread m_NotifyWriteThread ;
2013-03-05 04:53:29 -05:00
2013-06-27 11:14:20 -04:00
cListenThread m_ListenThreadIPv4 ;
cListenThread m_ListenThreadIPv6 ;
2012-06-14 09:06:06 -04:00
2013-08-13 16:45:29 -04:00
cCriticalSection m_CSClients ; ///< Locks client lists
cClientHandleList m_Clients ; ///< Clients that are connected to the server and not yet assigned to a cWorld
cClientHandleList m_ClientsToRemove ; ///< Clients that have just been moved into a world and are to be removed from m_Clients in the next Tick()
2012-06-14 09:06:06 -04:00
2014-04-19 11:53:02 -04:00
mutable cCriticalSection m_CSPlayerCount ; ///< Locks the m_PlayerCount
2013-08-14 04:24:34 -04:00
int m_PlayerCount ; ///< Number of players currently playing in the server
cCriticalSection m_CSPlayerCountDiff ; ///< Locks the m_PlayerCountDiff
int m_PlayerCountDiff ; ///< Adjustment to m_PlayerCount to be applied in the Tick thread
2012-06-14 09:06:06 -04:00
cSocketThreads m_SocketThreads ;
int m_ClientViewDistance ; // The default view distance for clients; settable in Settings.ini
2014-07-17 13:13:23 -04:00
bool m_bIsConnected ; // true - connected false - not connected
2012-06-14 09:06:06 -04:00
bool m_bRestarting ;
2012-08-30 17:06:13 -04:00
2014-01-23 17:35:23 -05:00
/** The private key used for the assymetric encryption start in the protocols */
2014-04-29 05:04:54 -04:00
cRsaPrivateKey m_PrivateKey ;
2014-01-23 17:35:23 -05:00
/** Public key for m_PrivateKey, ASN1-DER-encoded */
AString m_PublicKeyDER ;
2013-06-27 11:14:20 -04:00
cRCONServer m_RCONServer ;
2013-08-11 13:18:06 -04:00
AString m_Description ;
2014-01-07 10:40:59 -05:00
AString m_FaviconData ;
2013-08-11 13:18:06 -04:00
int m_MaxPlayers ;
2013-11-04 16:51:24 -05:00
bool m_bIsHardcore ;
2013-08-11 13:18:06 -04:00
2014-11-29 03:36:15 -05:00
/** True - allow same username to login more than once False - only once */
2014-12-11 08:34:09 -05:00
bool m_bAllowMultiLogin ;
2014-11-29 03:36:15 -05:00
2013-08-11 13:46:27 -04:00
cTickThread m_TickThread ;
cEvent m_RestartEvent ;
2014-01-28 17:53:07 -05:00
/** The server ID used for client authentication */
2013-08-11 13:46:27 -04:00
AString m_ServerID ;
2014-01-28 17:53:07 -05:00
/** If true, players will be online-authenticated agains Mojang servers.
This setting is the same as the " online-mode " setting in Vanilla . */
bool m_ShouldAuthenticate ;
2014-07-11 07:13:10 -04:00
/** True if offline UUIDs should be used to load data for players whose normal UUIDs cannot be found.
This allows transitions from an offline ( no - auth ) server to an online one .
Loaded from the settings . ini [ PlayerData ] . LoadOfflinePlayerData setting . */
bool m_ShouldLoadOfflinePlayerData ;
/** True if old-style playernames should be used to load data for players whose regular datafiles cannot be found.
This allows a seamless transition from name - based to UUID - based player storage .
Loaded from the settings . ini [ PlayerData ] . LoadNamedPlayerData setting . */
bool m_ShouldLoadNamedPlayerData ;
2014-09-17 14:55:46 -04:00
/** True if BungeeCord handshake packets (with player UUID) should be accepted. */
bool m_ShouldAllowBungeeCord ;
2014-07-11 07:13:10 -04:00
2012-06-14 09:06:06 -04:00
2013-03-04 16:13:08 -05:00
cServer ( void ) ;
2012-06-14 09:06:06 -04:00
2014-01-28 17:53:07 -05:00
/** Loads, or generates, if missing, RSA keys for protocol encryption */
2012-08-30 17:06:13 -04:00
void PrepareKeys ( void ) ;
2013-03-04 16:13:08 -05:00
2013-08-11 13:46:27 -04:00
bool Tick ( float a_Dt ) ;
2013-08-13 16:45:29 -04:00
2014-01-28 17:53:07 -05:00
/** Ticks the clients in m_Clients, manages the list in respect to removing clients */
2013-08-13 16:45:29 -04:00
void TickClients ( float a_Dt ) ;
2013-08-11 13:46:27 -04:00
2013-03-04 16:13:08 -05:00
// cListenThread::cCallback overrides:
virtual void OnConnectionAccepted ( cSocket & a_Socket ) override ;
2014-07-17 13:13:23 -04:00
} ; // tolua_export
2012-06-14 09:06:06 -04:00