You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
200 lines
5.9 KiB
200 lines
5.9 KiB
//========= Copyright Valve Corporation, All rights reserved. ============// |
|
// |
|
// Purpose: |
|
// |
|
// $Workfile: $ |
|
// $NoKeywords: $ |
|
//=============================================================================// |
|
#if !defined( SERVER_H ) |
|
#define SERVER_H |
|
#ifdef _WIN32 |
|
#pragma once |
|
#endif |
|
|
|
|
|
#include "basetypes.h" |
|
#include "filesystem.h" |
|
#include "packed_entity.h" |
|
#include "bitbuf.h" |
|
#include "netadr.h" |
|
#include "checksum_crc.h" |
|
#include "quakedef.h" |
|
#include "engine/IEngineSound.h" |
|
#include "precache.h" |
|
#include "sv_client.h" |
|
#include "baseserver.h" |
|
#include <ihltvdirector.h> |
|
|
|
|
|
class CGameTrace; |
|
class ITraceFilter; |
|
class CEventInfo; |
|
typedef CGameTrace trace_t; |
|
typedef int TABLEID; |
|
class IChangeInfoAccessor; |
|
class CPureServerWhitelist; |
|
|
|
|
|
// find a server class |
|
ServerClass* SV_FindServerClass( const char *pName ); |
|
ServerClass* SV_FindServerClass( int index ); |
|
|
|
|
|
//============================================================================= |
|
|
|
// Max # of master servers this server can be associated with |
|
|
|
class CGameServer : public CBaseServer |
|
{ |
|
|
|
public: |
|
CGameServer(); |
|
virtual ~CGameServer(); |
|
|
|
|
|
public: // IServer implementation |
|
|
|
bool IsPausable( void ) const; |
|
void Init( bool isDedicated ); |
|
void Clear( void ); |
|
void Shutdown( void ); |
|
void SetMaxClients(int number); |
|
|
|
public: |
|
void InitMaxClients( void ); |
|
bool SpawnServer( const char *szMapName, const char *szMapFile, const char *startspot ); |
|
void SetQueryPortFromSteamServer(); |
|
void CopyPureServerWhitelistToStringTable(); |
|
void RemoveClientFromGame( CBaseClient *client ); |
|
void SendClientMessages ( bool bSendSnapshots ); |
|
void FinishRestore(); |
|
void BroadcastSound( SoundInfo_t &sound, IRecipientFilter &filter ); |
|
bool IsLevelMainMenuBackground( void ) { return m_bIsLevelMainMenuBackground; } |
|
|
|
// This is true when we start a level and sv_pure is set to 1. |
|
bool IsInPureServerMode() const; |
|
CPureServerWhitelist * GetPureServerWhitelist() const; |
|
|
|
inline CGameClient *Client( int i ) { return static_cast<CGameClient*>(m_Clients[i]); }; |
|
|
|
protected : |
|
|
|
// Reload the whitelist files for pure server mode. |
|
void ReloadWhitelist( const char *pMapName ); |
|
|
|
CBaseClient *CreateNewClient( int slot ); |
|
bool FinishCertificateCheck( netadr_t &adr, int nAuthProtocol, const char *szRawCertificate, int clientChallenge ); |
|
void SendClientDatagrams ( int clientCount, CGameClient** clients, CFrameSnapshot* pSnapshot ); |
|
void CopyTempEntities( CFrameSnapshot* pSnapshot ); |
|
void AssignClassIds(); |
|
|
|
virtual void UpdateMasterServerPlayers(); |
|
|
|
// Data |
|
public: |
|
|
|
bool m_bLoadgame; // handle connections specially |
|
|
|
char m_szStartspot[64]; |
|
|
|
int num_edicts; |
|
int max_edicts; |
|
int free_edicts; // how many edicts in num_edicts are free, in use is num_edicts - free_edicts |
|
edict_t *edicts; // Can array index now, edict_t is fixed |
|
IChangeInfoAccessor *edictchangeinfo; // HACK to allow backward compat since we can't change edict_t layout |
|
|
|
int m_nMaxClientsLimit; // Max allowed on server. |
|
|
|
bool allowsignonwrites; |
|
bool dll_initialized; // Have we loaded the game dll. |
|
|
|
bool m_bIsLevelMainMenuBackground; // true if the level running only as the background to the main menu |
|
|
|
CUtlVector<CEventInfo*> m_TempEntities; // temp entities |
|
|
|
bf_write m_FullSendTables; |
|
CUtlMemory<byte> m_FullSendTablesBuffer; |
|
|
|
bool m_bLoadedPlugins; |
|
|
|
public: |
|
|
|
// New style precache lists are done this way |
|
void CreateEngineStringTables( void ); |
|
|
|
INetworkStringTable *GetModelPrecacheTable( void ) const; |
|
INetworkStringTable *GetGenericPrecacheTable( void ) const; |
|
INetworkStringTable *GetSoundPrecacheTable( void ) const; |
|
INetworkStringTable *GetDecalPrecacheTable( void ) const; |
|
|
|
INetworkStringTable *GetDynamicModelsTable( void ) const { return m_pDynamicModelsTable; } |
|
|
|
|
|
// Accessors to model precaching stuff |
|
int PrecacheModel( char const *name, int flags, model_t *model = NULL ); |
|
model_t *GetModel( int index ); |
|
int LookupModelIndex( char const *name ); |
|
|
|
// Accessors to model precaching stuff |
|
int PrecacheSound( char const *name, int flags ); |
|
char const *GetSound( int index ); |
|
int LookupSoundIndex( char const *name ); |
|
|
|
int PrecacheGeneric( char const *name, int flags ); |
|
char const *GetGeneric( int index ); |
|
int LookupGenericIndex( char const *name ); |
|
|
|
int PrecacheDecal( char const *name, int flags ); |
|
int LookupDecalIndex( char const *name ); |
|
|
|
void DumpPrecacheStats( INetworkStringTable *table ); |
|
|
|
bool IsHibernating() const; |
|
void UpdateHibernationState(); |
|
|
|
private: |
|
void SetHibernating( bool bHibernating ); |
|
|
|
CPrecacheItem model_precache[ MAX_MODELS ]; |
|
CPrecacheItem generic_precache[ MAX_GENERIC ]; |
|
CPrecacheItem sound_precache[ MAX_SOUNDS ]; |
|
CPrecacheItem decal_precache[ MAX_BASE_DECALS ]; |
|
|
|
INetworkStringTable *m_pModelPrecacheTable; |
|
INetworkStringTable *m_pSoundPrecacheTable; |
|
INetworkStringTable *m_pGenericPrecacheTable; |
|
INetworkStringTable *m_pDecalPrecacheTable; |
|
|
|
INetworkStringTable *m_pDynamicModelsTable; |
|
|
|
CPureServerWhitelist *m_pPureServerWhitelist; |
|
bool m_bHibernating; // Are we hibernating. Hibernation makes server process consume approx 0 CPU when no clients are connected |
|
}; |
|
|
|
//============================================================================ |
|
|
|
class IServerGameDLL; |
|
class IServerGameEnts; |
|
class IServerGameClients; |
|
class IServerGameTags; |
|
extern IServerGameDLL *serverGameDLL; |
|
extern int g_iServerGameDLLVersion; |
|
extern IServerGameEnts *serverGameEnts; |
|
|
|
extern IServerGameClients *serverGameClients; |
|
extern int g_iServerGameClientsVersion; // This matches the number at the end of the interface name (so for "ServerGameClients004", this would be 4). |
|
|
|
extern IHLTVDirector *serverGameDirector; |
|
|
|
extern IServerGameTags *serverGameTags; |
|
|
|
// Master server address struct for use in building heartbeats |
|
extern ConVar skill; |
|
extern ConVar deathmatch; |
|
extern ConVar coop; |
|
|
|
extern CGameServer sv; // local server |
|
extern CGameClient *host_client; // current processing client |
|
|
|
|
|
#endif // SERVER_H
|
|
|