//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: Expose things from GameInterface.cpp. Mostly the engine interfaces. // // $NoKeywords: $ //=============================================================================// #ifndef GAMEINTERFACE_H #define GAMEINTERFACE_H #ifdef _WIN32 #pragma once #endif #include "mapentities.h" class IReplayFactory; extern INetworkStringTable *g_pStringTableInfoPanel; extern INetworkStringTable *g_pStringTableServerMapCycle; #ifdef TF_DLL extern INetworkStringTable *g_pStringTableServerPopFiles; #endif // Player / Client related functions // Most of this is implemented in gameinterface.cpp, but some of it is per-mod in files like cs_gameinterface.cpp, etc. class CServerGameClients : public IServerGameClients { public: virtual bool ClientConnect( edict_t *pEntity, char const* pszName, char const* pszAddress, char *reject, int maxrejectlen ) OVERRIDE; virtual void ClientActive( edict_t *pEntity, bool bLoadGame ) OVERRIDE; virtual void ClientDisconnect( edict_t *pEntity ) OVERRIDE; virtual void ClientPutInServer( edict_t *pEntity, const char *playername ) OVERRIDE; virtual void ClientCommand( edict_t *pEntity, const CCommand &args ) OVERRIDE; virtual void ClientSettingsChanged( edict_t *pEntity ) OVERRIDE; virtual void ClientSetupVisibility( edict_t *pViewEntity, edict_t *pClient, unsigned char *pvs, int pvssize ) OVERRIDE; virtual float ProcessUsercmds( edict_t *player, bf_read *buf, int numcmds, int totalcmds, int dropped_packets, bool ignore, bool paused ) OVERRIDE; // Player is running a command virtual void PostClientMessagesSent_DEPRECIATED( void ) OVERRIDE; virtual void SetCommandClient( int index ) OVERRIDE; virtual CPlayerState *GetPlayerState( edict_t *player ) OVERRIDE; virtual void ClientEarPosition( edict_t *pEntity, Vector *pEarOrigin ) OVERRIDE; virtual void GetPlayerLimits( int& minplayers, int& maxplayers, int &defaultMaxPlayers ) const OVERRIDE; // returns number of delay ticks if player is in Replay mode (0 = no delay) virtual int GetReplayDelay( edict_t *player, int& entity ) OVERRIDE; // Anything this game .dll wants to add to the bug reporter text (e.g., the entity/model under the picker crosshair) // can be added here virtual void GetBugReportInfo( char *buf, int buflen ) OVERRIDE; virtual void NetworkIDValidated( const char *pszUserName, const char *pszNetworkID ) OVERRIDE; // The client has submitted a keyvalues command virtual void ClientCommandKeyValues( edict_t *pEntity, KeyValues *pKeyValues ) OVERRIDE; // Notify that the player is spawned virtual void ClientSpawned( edict_t *pPlayer ) OVERRIDE; }; class CServerGameDLL : public IServerGameDLL { public: virtual bool DLLInit(CreateInterfaceFn engineFactory, CreateInterfaceFn physicsFactory, CreateInterfaceFn fileSystemFactory, CGlobalVars *pGlobals) OVERRIDE; virtual void DLLShutdown( void ) OVERRIDE; // Get the simulation interval (must be compiled with identical values into both client and game .dll for MOD!!!) virtual bool ReplayInit( CreateInterfaceFn fnReplayFactory ) OVERRIDE; virtual float GetTickInterval( void ) const OVERRIDE; virtual bool GameInit( void ) OVERRIDE; virtual void GameShutdown( void ) OVERRIDE; virtual bool LevelInit( const char *pMapName, char const *pMapEntities, char const *pOldLevel, char const *pLandmarkName, bool loadGame, bool background ) OVERRIDE; virtual void ServerActivate( edict_t *pEdictList, int edictCount, int clientMax ) OVERRIDE; virtual void LevelShutdown( void ) OVERRIDE; virtual void GameFrame( bool simulating ) OVERRIDE; // could be called multiple times before sending data to clients virtual void PreClientUpdate( bool simulating ) OVERRIDE; // called after all GameFrame() calls, before sending data to clients virtual ServerClass* GetAllServerClasses( void ) OVERRIDE; virtual const char *GetGameDescription( void ) OVERRIDE; virtual void CreateNetworkStringTables( void ) OVERRIDE; // Save/restore system hooks virtual CSaveRestoreData *SaveInit( int size ) OVERRIDE; virtual void SaveWriteFields( CSaveRestoreData *, char const* , void *, datamap_t *, typedescription_t *, int ) OVERRIDE; virtual void SaveReadFields( CSaveRestoreData *, char const* , void *, datamap_t *, typedescription_t *, int ) OVERRIDE; virtual void SaveGlobalState( CSaveRestoreData * ) OVERRIDE; virtual void RestoreGlobalState( CSaveRestoreData * ) OVERRIDE; virtual int CreateEntityTransitionList( CSaveRestoreData *, int ) OVERRIDE; virtual void BuildAdjacentMapList( void ) OVERRIDE; virtual void PreSave( CSaveRestoreData * ) OVERRIDE; virtual void Save( CSaveRestoreData * ) OVERRIDE; virtual void GetSaveComment( char *comment, int maxlength, float flMinutes, float flSeconds, bool bNoTime = false ) OVERRIDE; #ifdef _XBOX virtual void GetTitleName( const char *pMapName, char* pTitleBuff, int titleBuffSize ) OVERRIDE; #endif virtual void WriteSaveHeaders( CSaveRestoreData * ) OVERRIDE; virtual void ReadRestoreHeaders( CSaveRestoreData * ) OVERRIDE; virtual void Restore( CSaveRestoreData *, bool ) OVERRIDE; virtual bool IsRestoring() OVERRIDE; // Retrieve info needed for parsing the specified user message virtual bool GetUserMessageInfo( int msg_type, char *name, int maxnamelength, int& size ) OVERRIDE; virtual CStandardSendProxies* GetStandardSendProxies() OVERRIDE; virtual void PostInit() OVERRIDE; virtual void Think( bool finalTick ) OVERRIDE; virtual void OnQueryCvarValueFinished( QueryCvarCookie_t iCookie, edict_t *pPlayerEntity, EQueryCvarValueStatus eStatus, const char *pCvarName, const char *pCvarValue ) OVERRIDE; virtual void PreSaveGameLoaded( char const *pSaveName, bool bInGame ) OVERRIDE; // Returns true if the game DLL wants the server not to be made public. // Used by commentary system to hide multiplayer commentary servers from the master. virtual bool ShouldHideServer( void ) OVERRIDE; virtual void InvalidateMdlCache() OVERRIDE; virtual void SetServerHibernation( bool bHibernating ) OVERRIDE; float m_fAutoSaveDangerousTime; float m_fAutoSaveDangerousMinHealthToCommit; bool m_bIsHibernating; // Called after the steam API has been activated post-level startup virtual void GameServerSteamAPIActivated( void ) OVERRIDE; // Called after the steam API has been shutdown post-level startup virtual void GameServerSteamAPIShutdown( void ) OVERRIDE; // interface to the new GC based lobby system virtual IServerGCLobby *GetServerGCLobby() OVERRIDE; virtual const char *GetServerBrowserMapOverride() OVERRIDE; virtual const char *GetServerBrowserGameData() OVERRIDE; // Called to add output to the status command virtual void Status( void (*print) (const char *fmt, ...) ) OVERRIDE; virtual void PrepareLevelResources( /* in/out */ char *pszMapName, size_t nMapNameSize, /* in/out */ char *pszMapFile, size_t nMapFileSize ) OVERRIDE; virtual ePrepareLevelResourcesResult AsyncPrepareLevelResources( /* in/out */ char *pszMapName, size_t nMapNameSize, /* in/out */ char *pszMapFile, size_t nMapFileSize, float *flProgress = NULL ) OVERRIDE; virtual eCanProvideLevelResult CanProvideLevel( /* in/out */ char *pMapName, int nMapNameMax ) OVERRIDE; // Called to see if the game server is okay with a manual changelevel or map command virtual bool IsManualMapChangeOkay( const char **pszReason ) OVERRIDE; private: // This can just be a wrapper on MapEntity_ParseAllEntities, but CS does some tricks in here // with the entity list. void LevelInit_ParseAllEntities( const char *pMapEntities ); void LoadMessageOfTheDay(); void LoadSpecificMOTDMsg( const ConVar &convar, const char *pszStringName ); }; // Normally, when the engine calls ClientPutInServer, it calls a global function in the game DLL // by the same name. Use this to override the function that it calls. This is used for bots. typedef CBasePlayer* (*ClientPutInServerOverrideFn)( edict_t *pEdict, const char *playername ); void ClientPutInServerOverride( ClientPutInServerOverrideFn fn ); // -------------------------------------------------------------------------------------------- // // Entity list management stuff. // -------------------------------------------------------------------------------------------- // // These are created for map entities in order as the map entities are spawned. class CMapEntityRef { public: int m_iEdict; // Which edict slot this entity got. -1 if CreateEntityByName failed. int m_iSerialNumber; // The edict serial number. TODO used anywhere ? }; extern CUtlLinkedList g_MapEntityRefs; //----------------------------------------------------------------------------- // Purpose: //----------------------------------------------------------------------------- class CMapLoadEntityFilter : public IMapEntityFilter { public: virtual bool ShouldCreateEntity( const char *pClassname ) { // During map load, create all the entities. return true; } virtual CBaseEntity* CreateNextEntity( const char *pClassname ) { CBaseEntity *pRet = CreateEntityByName( pClassname ); CMapEntityRef ref; ref.m_iEdict = -1; ref.m_iSerialNumber = -1; if ( pRet ) { ref.m_iEdict = pRet->entindex(); if ( pRet->edict() ) ref.m_iSerialNumber = pRet->edict()->m_NetworkSerialNumber; } g_MapEntityRefs.AddToTail( ref ); return pRet; } }; bool IsEngineThreaded(); class CServerGameTags : public IServerGameTags { public: virtual void GetTaggedConVarList( KeyValues *pCvarTagList ); }; EXPOSE_SINGLE_INTERFACE( CServerGameTags, IServerGameTags, INTERFACEVERSION_SERVERGAMETAGS ); #endif // GAMEINTERFACE_H