summaryrefslogtreecommitdiff
path: root/engine/baseserver.h
diff options
context:
space:
mode:
authorFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
committerFluorescentCIAAfricanAmerican <[email protected]>2020-04-22 12:56:21 -0400
commit3bf9df6b2785fa6d951086978a3e66f49427166a (patch)
tree2c0f1f0c63c4832882bc93814ebd2c2b1c6224e5 /engine/baseserver.h
downloadarchived-source-engine-2018-hl2-src-3bf9df6b2785fa6d951086978a3e66f49427166a.tar.xz
archived-source-engine-2018-hl2-src-3bf9df6b2785fa6d951086978a3e66f49427166a.zip
Diffstat (limited to 'engine/baseserver.h')
-rw-r--r--engine/baseserver.h267
1 files changed, 267 insertions, 0 deletions
diff --git a/engine/baseserver.h b/engine/baseserver.h
new file mode 100644
index 0000000..86f080b
--- /dev/null
+++ b/engine/baseserver.h
@@ -0,0 +1,267 @@
+//========= Copyright Valve Corporation, All rights reserved. ============//
+//
+// Purpose:
+//
+//=============================================================================//
+
+#ifndef BASESERVER_H
+#define BASESERVER_H
+#ifdef _WIN32
+#pragma once
+#endif
+
+#include <iserver.h>
+#include <netadr.h>
+#include <bitbuf.h>
+#include <utlvector.h>
+#include "baseclient.h"
+#include "netmessages.h"
+#include "net.h"
+#include "event_system.h"
+
+class CNetworkStringTableContainer;
+class PackedEntity;
+class ServerClass;
+class INetworkStringTable;
+
+enum server_state_t
+{
+ ss_dead = 0, // Dead
+ ss_loading, // Spawning
+ ss_active, // Running
+ ss_paused, // Running, but paused
+};
+
+// See baseserver.cpp for #define which controls this
+bool AllowDebugDedicatedServerOutsideSteam();
+
+// time a challenge nonce is valid for, in seconds
+#define CHALLENGE_NONCE_LIFETIME 6.0f
+
+// MAX_DELTA_TICKS defines the maximum delta difference allowed
+// for delta compression, if clients request on older tick as
+// delta baseline, send a full update.
+#define MAX_DELTA_TICKS 192 // this is about 3 seconds
+
+typedef struct
+{
+ netadr_t adr; // Address where challenge value was sent to.
+ int challenge; // To connect, adr IP address must respond with this #
+ float time; // # is valid for only a short duration.
+} challenge_t;
+
+
+class CBaseServer : public IServer
+{
+public:
+ CBaseServer();
+ virtual ~CBaseServer();
+
+ bool RestartOnLevelChange() { return m_bRestartOnLevelChange; }
+
+public: // IServer implementation
+
+ virtual int GetNumClients( void ) const; // returns current number of clients
+ virtual int GetNumProxies( void ) const; // returns number of attached HLTV proxies
+ virtual int GetNumFakeClients() const; // returns number of fake clients/bots
+ virtual int GetMaxClients( void ) const { return m_nMaxclients; } // returns current client limit
+ virtual int GetUDPPort( void ) const { return NET_GetUDPPort( m_Socket ); }
+ virtual IClient *GetClient( int index ) { return m_Clients[index]; } // returns interface to client
+ virtual int GetClientCount() const { return m_Clients.Count(); } // for iteration;
+ virtual float GetTime( void ) const;
+ virtual int GetTick( void ) const { return m_nTickCount; }
+ virtual float GetTickInterval( void ) const { return m_flTickInterval; }
+ virtual const char *GetName( void ) const;
+ virtual const char *GetMapName( void ) const { return m_szMapname; }
+ virtual int GetSpawnCount( void ) const { return m_nSpawnCount; }
+ virtual int GetNumClasses( void ) const { return serverclasses; }
+ virtual int GetClassBits( void ) const { return serverclassbits; }
+ virtual void GetNetStats( float &avgIn, float &avgOut );
+ virtual int GetNumPlayers();
+ virtual bool GetPlayerInfo( int nClientIndex, player_info_t *pinfo );
+ virtual float GetCPUUsage( void ) { return m_fCPUPercent; }
+
+ virtual bool IsActive( void ) const { return m_State >= ss_active; }
+ virtual bool IsLoading( void ) const { return m_State == ss_loading; }
+ virtual bool IsDedicated( void ) const { return m_bIsDedicated; }
+ virtual bool IsPaused( void ) const { return m_State == ss_paused; }
+ virtual bool IsMultiplayer( void ) const { return m_nMaxclients > 1; }
+ virtual bool IsPausable( void ) const { return false; }
+ virtual bool IsHLTV( void ) const { return false; }
+ virtual bool IsReplay( void ) const { return false; }
+
+ virtual void BroadcastMessage( INetMessage &msg, bool onlyActive = false, bool reliable = false );
+ virtual void BroadcastMessage( INetMessage &msg, IRecipientFilter &filter );
+ virtual void BroadcastPrintf ( PRINTF_FORMAT_STRING const char *fmt, ...) FMTFUNCTION( 2, 3 );
+
+ virtual const char * GetPassword() const;
+
+ virtual void SetMaxClients( int number );
+ virtual void SetPaused(bool paused);
+ virtual void SetPassword(const char *password);
+
+ virtual void DisconnectClient(IClient *client, const char *reason );
+
+ virtual void WriteDeltaEntities( CBaseClient *client, CClientFrame *to, CClientFrame *from, bf_write &pBuf );
+ virtual void WriteTempEntities( CBaseClient *client, CFrameSnapshot *to, CFrameSnapshot *from, bf_write &pBuf, int nMaxEnts );
+
+public: // IConnectionlessPacketHandler implementation
+
+ virtual bool ProcessConnectionlessPacket( netpacket_t * packet );
+
+ virtual void Init( bool isDedicated );
+ virtual void Clear( void );
+ virtual void Shutdown( void );
+ virtual CBaseClient *CreateFakeClient( const char *name );
+ virtual void RemoveClientFromGame( CBaseClient *client ) {};
+ virtual void SendClientMessages ( bool bSendSnapshots );
+ virtual void FillServerInfo(SVC_ServerInfo &serverinfo);
+ virtual void UserInfoChanged( int nClientIndex );
+
+ bool GetClassBaseline( ServerClass *pClass, void const **pData, int *pDatalen );
+ void RunFrame( void );
+ void InactivateClients( void );
+ void ReconnectClients( void );
+ void CheckTimeouts (void);
+ void UpdateUserSettings(void);
+ void SendPendingServerInfo(void);
+
+ const char *CompressPackedEntity(ServerClass *pServerClass, const char *data, int &bits);
+ const char *UncompressPackedEntity(PackedEntity *pPackedEntity, int &size);
+
+ INetworkStringTable *GetInstanceBaselineTable( void );
+ INetworkStringTable *GetLightStyleTable( void );
+ INetworkStringTable *GetUserInfoTable( void );
+
+ virtual void RejectConnection(const netadr_t &adr, int clientChallenge, const char *s );
+
+ float GetFinalTickTime( void ) const;
+
+ virtual bool CheckIPRestrictions( const netadr_t &adr, int nAuthProtocol );
+
+ void SetMasterServerRulesDirty();
+ void SendQueryPortToClient( netadr_t &adr );
+
+ void RecalculateTags( void );
+ void AddTag( const char *pszTag );
+ void RemoveTag( const char *pszTag );
+
+ int GetNumConnections( ) { return m_nNumConnections; }
+
+ void SetReportNewFakeClients( bool bReportNewFakeClients ) { m_bReportNewFakeClients = bReportNewFakeClients; }
+
+ void SetPausedForced( bool bPaused, float flDuration = -1.f );
+
+protected:
+
+ virtual IClient *ConnectClient ( netadr_t &adr, int protocol, int challenge, int clientChallenge, int authProtocol,
+ const char *name, const char *password, const char *hashedCDkey, int cdKeyLen );
+
+ virtual CBaseClient *GetFreeClient( netadr_t &adr );
+
+ virtual CBaseClient *CreateNewClient( int slot ) { AssertMsg( 0, "CBaseServer::CreateNewClient() being called - must be implemented in derived class!" ); return NULL; }; // must be derived
+
+
+ virtual bool FinishCertificateCheck( netadr_t &adr, int nAuthProtocol, const char *szRawCertificate, int clientChallenge ) { return true; };
+
+ virtual int GetChallengeNr ( netadr_t &adr );
+ virtual int GetChallengeType ( netadr_t &adr );
+
+ virtual bool CheckProtocol( netadr_t &adr, int nProtocol, int clientChallenge );
+ virtual bool CheckChallengeNr( netadr_t &adr, int nChallengeValue );
+ virtual bool CheckChallengeType( CBaseClient *client, int nNewUserID, netadr_t & adr, int nAuthProtocol, const char *pchLogonCookie, int cbCookie, int clientChallenge );
+ virtual bool CheckPassword( netadr_t &adr, const char *password, const char *name );
+ virtual bool CheckIPConnectionReuse( netadr_t &adr );
+
+ virtual void ReplyChallenge(netadr_t &adr, int clientChallenge);
+ virtual void ReplyServerChallenge(netadr_t &adr);
+
+ virtual void CalculateCPUUsage();
+
+ // Keep the master server data updated.
+ virtual bool ShouldUpdateMasterServer();
+
+ void CheckMasterServerRequestRestart();
+ void UpdateMasterServer();
+ void UpdateMasterServerRules();
+ virtual void UpdateMasterServerPlayers() {}
+ void ForwardPacketsFromMasterServerUpdater();
+
+ void SetRestartOnLevelChange(bool state) { m_bRestartOnLevelChange = state; }
+
+ bool RequireValidChallenge( netadr_t &adr );
+ bool ValidChallenge( netadr_t & adr, int challengeNr );
+ bool ValidInfoChallenge( netadr_t & adr, const char *nugget );
+
+ // Data
+public:
+
+ server_state_t m_State; // some actions are only valid during load
+ int m_Socket; // network socket
+ int m_nTickCount; // current server tick
+ bool m_bSimulatingTicks; // whether or not the server is currently simulating ticks
+ char m_szMapname[64]; // map name
+ char m_szMapFilename[64]; // map filename, may bear no resemblance to map name
+ char m_szSkyname[64]; // skybox name
+ char m_Password[32]; // server password
+
+ MD5Value_t worldmapMD5; // For detecting that client has a hacked local copy of map, the client will be dropped if this occurs.
+
+ CNetworkStringTableContainer *m_StringTables; // newtork string table container
+
+ INetworkStringTable *m_pInstanceBaselineTable;
+ INetworkStringTable *m_pLightStyleTable;
+ INetworkStringTable *m_pUserInfoTable;
+ INetworkStringTable *m_pServerStartupTable;
+ INetworkStringTable *m_pDownloadableFileTable;
+
+ // This will get set to NET_MAX_PAYLOAD if the server is MP.
+ bf_write m_Signon;
+ CUtlMemory<byte> m_SignonBuffer;
+
+ int serverclasses; // number of unique server classes
+ int serverclassbits; // log2 of serverclasses
+
+
+private:
+
+ // Gets the next user ID mod SHRT_MAX and unique (not used by any active clients).
+ int GetNextUserID();
+ int m_nUserid; // increases by one with every new client
+
+
+protected:
+
+ int m_nMaxclients; // Current max #
+ int m_nSpawnCount; // Number of servers spawned since start,
+ // used to check late spawns (e.g., when d/l'ing lots of
+ // data)
+ float m_flTickInterval; // time for 1 tick in seconds
+
+
+ CUtlVector<CBaseClient*> m_Clients; // array of up to [maxclients] client slots.
+
+ bool m_bIsDedicated;
+
+ uint32 m_CurrentRandomNonce;
+ uint32 m_LastRandomNonce;
+ float m_flLastRandomNumberGenerationTime;
+ float m_fCPUPercent;
+ float m_fStartTime;
+ float m_fLastCPUCheckTime;
+
+ // This is only used for Steam's master server updater to refer to this server uniquely.
+ bool m_bRestartOnLevelChange;
+
+ bool m_bMasterServerRulesDirty;
+ double m_flLastMasterServerUpdateTime;
+
+ int m_nNumConnections; //Number of successful client connections.
+
+ bool m_bReportNewFakeClients; // Whether or not newly created fake clients should be included in server browser totals
+ float m_flPausedTimeEnd;
+};
+
+extern CThreadFastMutex g_svInstanceBaselineMutex;
+
+#endif // BASESERVER_H