ds@1952: //========= Copyright © 1996-2005, Valve Corporation, All rights reserved. ============// ds@1952: // ds@1952: // Purpose: ds@1952: // ds@1952: // $Workfile: $ ds@1952: // $Date: 2006-08-13 06:34:30 -0500 (Sun, 13 Aug 2006) $ ds@1952: // ds@1952: //----------------------------------------------------------------------------- ds@1952: // $NoKeywords: $ ds@1952: //=============================================================================// ds@1952: ds@1952: #ifndef CONVAR_H ds@1952: #define CONVAR_H ds@1952: #if _WIN32 ds@1952: #pragma once ds@1952: #endif ds@1952: ds@1952: #include "tier0/dbg.h" ds@1952: ds@1952: #ifdef _WIN32 ds@1952: #define FORCEINLINE_CVAR FORCEINLINE ds@1952: #elif _LINUX ds@1952: #define FORCEINLINE_CVAR __inline__ FORCEINLINE ds@1952: #else ds@1952: #error "implement me" ds@1952: #endif ds@1952: ds@1952: // The default, no flags at all ds@1952: #define FCVAR_NONE 0 ds@1952: ds@1952: // Command to ConVars and ConCommands ds@1952: // ConVar Systems ds@1952: #define FCVAR_UNREGISTERED (1<<0) // If this is set, don't add to linked list, etc. ds@1952: #define FCVAR_LAUNCHER (1<<1) // defined by launcher ds@1952: #define FCVAR_GAMEDLL (1<<2) // defined by the game DLL ds@1952: #define FCVAR_CLIENTDLL (1<<3) // defined by the client DLL ds@1952: #define FCVAR_MATERIAL_SYSTEM (1<<4) // Defined by the material system. ds@1952: #define FCVAR_DATACACHE (1<<19) // Defined by the datacache system. ds@1952: #define FCVAR_STUDIORENDER (1<<15) // Defined by the studiorender system. ds@1952: #define FCVAR_FILESYSTEM (1<<21) // Defined by the file system. ds@1952: #define FCVAR_PLUGIN (1<<18) // Defined by a 3rd party plugin. ds@1952: #define FCVAR_TOOLSYSTEM (1<<20) // Defined by an IToolSystem library ds@1952: #define FCVAR_SOUNDSYSTEM (1<<23) // Defined by the soundsystem library ds@1952: #define FCVAR_INPUTSYSTEM (1<<25) // Defined by the inputsystem dll ds@1952: #define FCVAR_NETWORKSYSTEM (1<<26) // Defined by the network system ds@1952: // NOTE!! if you add a cvar system, add it here too!!!! ds@1952: // the engine lacks a cvar flag, but needs it for xbox ds@1952: // an engine cvar is thus a cvar not marked with any other system ds@1952: #define FCVAR_NON_ENGINE ((FCVAR_LAUNCHER|FCVAR_GAMEDLL|FCVAR_CLIENTDLL|FCVAR_MATERIAL_SYSTEM|FCVAR_DATACACHE|FCVAR_STUDIORENDER|FCVAR_FILESYSTEM|FCVAR_PLUGIN|FCVAR_TOOLSYSTEM|FCVAR_SOUNDSYSTEM|FCVAR_INPUTSYSTEM|FCVAR_NETWORKSYSTEM)) ds@1952: ds@1952: // ConVar only ds@1952: #define FCVAR_PROTECTED (1<<5) // It's a server cvar, but we don't send the data since it's a password, etc. Sends 1 if it's not bland/zero, 0 otherwise as value ds@1952: #define FCVAR_SPONLY (1<<6) // This cvar cannot be changed by clients connected to a multiplayer server. ds@1952: #define FCVAR_ARCHIVE (1<<7) // set to cause it to be saved to vars.rc ds@1952: #define FCVAR_NOTIFY (1<<8) // notifies players when changed ds@1952: #define FCVAR_USERINFO (1<<9) // changes the client's info string ds@1952: #define FCVAR_CHEAT (1<<14) // Only useable in singleplayer / debug / multiplayer & sv_cheats ds@1952: ds@1952: #define FCVAR_PRINTABLEONLY (1<<10) // This cvar's string cannot contain unprintable characters ( e.g., used for player name etc ). ds@1952: #define FCVAR_UNLOGGED (1<<11) // If this is a FCVAR_SERVER, don't log changes to the log file / console if we are creating a log ds@1952: #define FCVAR_NEVER_AS_STRING (1<<12) // never try to print that cvar ds@1952: ds@1952: // It's a ConVar that's shared between the client and the server. ds@1952: // At signon, the values of all such ConVars are sent from the server to the client (skipped for local ds@1952: // client, of course ) ds@1952: // If a change is requested it must come from the console (i.e., no remote client changes) ds@1952: // If a value is changed while a server is active, it's replicated to all connected clients ds@1952: #define FCVAR_REPLICATED (1<<13) // server setting enforced on clients, TODO rename to FCAR_SERVER at some time ds@1952: #define FCVAR_DEMO (1<<16) // record this cvar when starting a demo file ds@1952: #define FCVAR_DONTRECORD (1<<17) // don't record these command in demofiles ds@1952: ds@1952: #define FCVAR_NOT_CONNECTED (1<<22) // cvar cannot be changed by a client that is connected to a server ds@1952: ds@1952: #define FCVAR_ARCHIVE_XBOX (1<<24) // cvar written to config.cfg on the Xbox ds@1952: ds@1952: ds@1952: // #define FCVAR_AVAILABLE (1<<27) ds@1952: // #define FCVAR_AVAILABLE (1<<28) ds@1952: // #define FCVAR_AVAILABLE (1<<29) ds@1952: // #define FCVAR_AVAILABLE (1<<30) ds@1952: // #define FCVAR_AVAILABLE (1<<31) ds@1952: ds@1952: ds@1952: class ConVar; ds@1952: class ConCommand; ds@1952: class ConCommandBase; ds@1952: ds@1952: // Any executable that wants to use ConVars need to implement one of ds@1952: // these to hook up access to console variables. ds@1952: class IConCommandBaseAccessor ds@1952: { ds@1952: public: ds@1952: // Flags is a combination of FCVAR flags in cvar.h. ds@1952: // hOut is filled in with a handle to the variable. ds@1952: virtual bool RegisterConCommandBase( ConCommandBase *pVar )=0; ds@1952: }; ds@1952: ds@1952: ds@1952: // You don't have to instantiate one of these, just call its ds@1952: // OneTimeInit function when your executable is initializing. ds@1952: class ConCommandBaseMgr ds@1952: { ds@1952: public: ds@1952: // Call this ONCE when the executable starts up. ds@1952: static void OneTimeInit( IConCommandBaseAccessor *pAccessor ); ds@1952: #ifdef _XBOX ds@1952: static bool Fixup( ConCommandBase* pConCommandBase ); ds@1952: #ifndef _RETAIL ds@1952: static void PublishCommands( bool bForce ); ds@1952: #endif ds@1952: #endif ds@1952: }; ds@1952: ds@1952: // Called when a ConVar changes value ds@1952: typedef void ( *FnChangeCallback )( ConVar *var, char const *pOldString ); ds@1952: ds@1952: // Called when a ConCommand needs to execute ds@1952: typedef void ( *FnCommandCallback )( void ); ds@1952: ds@1952: #define COMMAND_COMPLETION_MAXITEMS 64 ds@1952: #define COMMAND_COMPLETION_ITEM_LENGTH 64 ds@1952: ds@1952: // Returns 0 to COMMAND_COMPLETION_MAXITEMS worth of completion strings ds@1952: typedef int ( *FnCommandCompletionCallback )( char const *partial, char commands[ COMMAND_COMPLETION_MAXITEMS ][ COMMAND_COMPLETION_ITEM_LENGTH ] ); ds@1952: ds@1952: //----------------------------------------------------------------------------- ds@1952: // Purpose: The base console invoked command/cvar interface ds@1952: //----------------------------------------------------------------------------- ds@1952: class ConCommandBase ds@1952: { ds@1952: friend class ConCommandBaseMgr; ds@1952: friend class CCvar; ds@1952: friend class ConVar; ds@1952: friend class ConCommand; ds@1952: ds@1952: public: ds@1952: ConCommandBase( void ); ds@1952: ConCommandBase( char const *pName, char const *pHelpString = 0, ds@1952: int flags = 0 ); ds@1952: ds@1952: virtual ~ConCommandBase( void ); ds@1952: ds@1952: virtual bool IsCommand( void ) const; ds@1952: ds@1952: // Check flag ds@1952: virtual bool IsBitSet( int flag ) const; ds@1952: // Set flag ds@1952: virtual void AddFlags( int flags ); ds@1952: ds@1952: // Return name of cvar ds@1952: virtual char const *GetName( void ) const; ds@1952: ds@1952: // Return help text for cvar ds@1952: virtual char const *GetHelpText( void ) const; ds@1952: ds@1952: // Deal with next pointer ds@1952: const ConCommandBase *GetNext( void ) const; ds@1952: void SetNext( ConCommandBase *next ); ds@1952: ds@1952: virtual bool IsRegistered( void ) const; ds@1952: ds@1952: // Global methods ds@1952: static ConCommandBase const *GetCommands( void ); ds@1952: static void AddToList( ConCommandBase *var ); ds@1952: static void RemoveFlaggedCommands( int flag ); ds@1952: static void RevertFlaggedCvars( int flag ); ds@1952: static ConCommandBase const *FindCommand( char const *name ); ds@1952: ds@1952: protected: ds@1952: virtual void Create( char const *pName, char const *pHelpString = 0, ds@1952: int flags = 0 ); ds@1952: ds@1952: // Used internally by OneTimeInit to initialize. ds@1952: virtual void Init(); ds@1952: ds@1952: // Internal copy routine ( uses new operator from correct module ) ds@1952: char *CopyString( char const *from ); ds@1952: ds@1952: // Next ConVar in chain ds@1952: ConCommandBase *m_pNext; ds@1952: ds@1952: private: ds@1952: // Has the cvar been added to the global list? ds@1952: bool m_bRegistered; ds@1952: ds@1952: // Static data ds@1952: char const *m_pszName; ds@1952: char const *m_pszHelpString; ds@1952: ds@1952: // ConVar flags ds@1952: int m_nFlags; ds@1952: ds@1952: protected: ds@1952: ds@1952: // ConVars add themselves to this list for the executable. Then ConVarMgr::Init() runs through ds@1952: // all the console variables and registers them. ds@1952: static ConCommandBase *s_pConCommandBases; ds@1952: ds@1952: // ConVars in this executable use this 'global' to access values. ds@1952: static IConCommandBaseAccessor *s_pAccessor; ds@1952: ds@1952: public: // Hackalicous ds@1952: inline int GetFlags() const ds@1952: { ds@1952: return m_nFlags; ds@1952: } ds@1952: inline void SetFlags(int flags) ds@1952: { ds@1952: m_nFlags = flags; ds@1952: } ds@1952: }; ds@1952: ds@1952: //----------------------------------------------------------------------------- ds@1952: // Purpose: The console invoked command ds@1952: //----------------------------------------------------------------------------- ds@1952: class ConCommand : public ConCommandBase ds@1952: { ds@1952: friend class ConCommandBaseMgr; ds@1952: friend class CCvar; ds@1952: #ifdef _STATIC_LINKED ds@1952: friend class G_ConCommand; ds@1952: friend class C_ConCommand; ds@1952: friend class M_ConCommand; ds@1952: friend class S_ConCommand; ds@1952: friend class D_ConCommand; ds@1952: #endif ds@1952: ds@1952: public: ds@1952: typedef ConCommandBase BaseClass; ds@1952: ds@1952: ConCommand( void ); ds@1952: ConCommand( char const *pName, FnCommandCallback callback, ds@1952: char const *pHelpString = 0, int flags = 0, FnCommandCompletionCallback completionFunc = 0 ); ds@1952: ds@1952: virtual ~ConCommand( void ); ds@1952: ds@1952: virtual bool IsCommand( void ) const; ds@1952: ds@1952: virtual int AutoCompleteSuggest( char const *partial, char commands[ COMMAND_COMPLETION_MAXITEMS ][ COMMAND_COMPLETION_ITEM_LENGTH ] ); ds@1952: ds@1952: virtual bool CanAutoComplete( void ); ds@1952: ds@1952: // Invoke the function ds@1952: virtual void Dispatch( void ); ds@1952: private: ds@1952: virtual void Create( char const *pName, FnCommandCallback callback, ds@1952: char const *pHelpString = 0, int flags = 0, FnCommandCompletionCallback completionFunc = 0 ); ds@1952: ds@1952: // Call this function when executing the command ds@1952: FnCommandCallback m_fnCommandCallback; ds@1952: ds@1952: FnCommandCompletionCallback m_fnCompletionCallback; ds@1952: bool m_bHasCompletionCallback; ds@1952: public: // Hackalicous ds@1952: inline FnCommandCallback GetCallback() const ds@1952: { ds@1952: return m_fnCommandCallback; ds@1952: } ds@1952: }; ds@1952: ds@1952: //----------------------------------------------------------------------------- ds@1952: // Purpose: A console variable ds@1952: //----------------------------------------------------------------------------- ds@1952: class ConVar : public ConCommandBase ds@1952: { ds@1952: friend class ConCommandBaseMgr; ds@1952: friend class CCvar; ds@1952: friend class CDefaultCvar; ds@1952: #ifdef _STATIC_LINKED ds@1952: friend class G_ConVar; ds@1952: friend class C_ConVar; ds@1952: friend class M_ConVar; ds@1952: friend class S_ConVar; ds@1952: friend class D_ConVar; ds@1952: #endif ds@1952: ds@1952: public: ds@1952: typedef ConCommandBase BaseClass; ds@1952: ds@1952: ConVar( char const *pName, char const *pDefaultValue, int flags = 0); ds@1952: ds@1952: ConVar( char const *pName, char const *pDefaultValue, int flags, ds@1952: char const *pHelpString ); ds@1952: ConVar( char const *pName, char const *pDefaultValue, int flags, ds@1952: char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax ); ds@1952: ConVar( char const *pName, char const *pDefaultValue, int flags, ds@1952: char const *pHelpString, FnChangeCallback callback ); ds@1952: ConVar( char const *pName, char const *pDefaultValue, int flags, ds@1952: char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax, ds@1952: FnChangeCallback callback ); ds@1952: ds@1952: virtual ~ConVar( void ); ds@1952: ds@1952: virtual bool IsBitSet( int flag ) const; ds@1952: virtual char const* GetHelpText( void ) const; ds@1952: virtual bool IsRegistered( void ) const; ds@1952: virtual char const *GetName( void ) const; ds@1952: virtual void AddFlags( int flags ); ds@1952: virtual bool IsCommand( void ) const; ds@1952: ds@1952: // Install a change callback (there shouldn't already be one....) ds@1952: void InstallChangeCallback( FnChangeCallback callback ); ds@1952: ds@1952: // Retrieve value ds@1952: FORCEINLINE_CVAR float GetFloat( void ) const; ds@1952: FORCEINLINE_CVAR int GetInt( void ) const; ds@1952: FORCEINLINE_CVAR bool GetBool() const { return !!GetInt(); } ds@1952: FORCEINLINE_CVAR char const *GetString( void ) const; ds@1952: ds@1952: // Any function that allocates/frees memory needs to be virtual or else you'll have crashes ds@1952: // from alloc/free across dll/exe boundaries. ds@1952: ds@1952: // These just call into the IConCommandBaseAccessor to check flags and set the var (which ends up calling InternalSetValue). ds@1952: virtual void SetValue( char const *value ); ds@1952: virtual void SetValue( float value ); ds@1952: virtual void SetValue( int value ); ds@1952: ds@1952: // Reset to default value ds@1952: void Revert( void ); ds@1952: ds@1952: // True if it has a min/max setting ds@1952: bool GetMin( float& minVal ) const; ds@1952: bool GetMax( float& maxVal ) const; ds@1952: char const *GetDefault( void ) const; ds@1952: ds@1952: static void RevertAll( void ); ds@1952: private: ds@1952: // Called by CCvar when the value of a var is changing. ds@1952: virtual void InternalSetValue(char const *value); ds@1952: // For CVARs marked FCVAR_NEVER_AS_STRING ds@1952: virtual void InternalSetFloatValue( float fNewValue ); ds@1952: virtual void InternalSetIntValue( int nValue ); ds@1952: ds@1952: virtual bool ClampValue( float& value ); ds@1952: virtual void ChangeStringValue( char const *tempVal ); ds@1952: ds@1952: virtual void Create( char const *pName, char const *pDefaultValue, int flags = 0, ds@1952: char const *pHelpString = 0, bool bMin = false, float fMin = 0.0, ds@1952: bool bMax = false, float fMax = false, FnChangeCallback callback = 0 ); ds@1952: ds@1952: // Used internally by OneTimeInit to initialize. ds@1952: virtual void Init(); ds@1952: ds@1952: private: ds@1952: ds@1952: // This either points to "this" or it points to the original declaration of a ConVar. ds@1952: // This allows ConVars to exist in separate modules, and they all use the first one to be declared. ds@1952: // m_pParent->m_pParent must equal m_pParent (ie: m_pParent must be the root, or original, ConVar). ds@1952: ConVar *m_pParent; ds@1952: ds@1952: // Static data ds@1952: char const *m_pszDefaultValue; ds@1952: ds@1952: // Value ds@1952: // Dynamically allocated ds@1952: char *m_pszString; ds@1952: int m_StringLength; ds@1952: ds@1952: // Values ds@1952: float m_fValue; ds@1952: int m_nValue; ds@1952: ds@1952: // Min/Max values ds@1952: bool m_bHasMin; ds@1952: float m_fMinVal; ds@1952: bool m_bHasMax; ds@1952: float m_fMaxVal; ds@1952: ds@1952: // Call this function when ConVar changes ds@1952: FnChangeCallback m_fnChangeCallback; ds@1952: public: // Hackalicous ds@1952: inline FnChangeCallback GetCallback() const ds@1952: { ds@1952: return m_fnChangeCallback; ds@1952: } ds@1952: inline void SetMin(bool set, float min=0.0) ds@1952: { ds@1952: m_bHasMin = set; ds@1952: m_fMinVal = min; ds@1952: } ds@1952: inline void SetMax(bool set, float max=0.0) ds@1952: { ds@1952: m_bHasMax = set; ds@1952: m_fMaxVal = max; ds@1952: } ds@1952: }; ds@1952: ds@1952: ds@1952: //----------------------------------------------------------------------------- ds@1952: // Purpose: Return ConVar value as a float ds@1952: // Output : float ds@1952: //----------------------------------------------------------------------------- ds@1952: FORCEINLINE_CVAR float ConVar::GetFloat( void ) const ds@1952: { ds@1952: return m_pParent->m_fValue; ds@1952: } ds@1952: ds@1952: //----------------------------------------------------------------------------- ds@1952: // Purpose: Return ConVar value as an int ds@1952: // Output : int ds@1952: //----------------------------------------------------------------------------- ds@1952: FORCEINLINE_CVAR int ConVar::GetInt( void ) const ds@1952: { ds@1952: return m_pParent->m_nValue; ds@1952: } ds@1952: ds@1952: ds@1952: //----------------------------------------------------------------------------- ds@1952: // Purpose: Return ConVar value as a string, return "" for bogus string pointer, etc. ds@1952: // Output : char const * ds@1952: //----------------------------------------------------------------------------- ds@1952: FORCEINLINE_CVAR char const *ConVar::GetString( void ) const ds@1952: { ds@1952: if ( m_nFlags & FCVAR_NEVER_AS_STRING ) ds@1952: { ds@1952: return "FCVAR_NEVER_AS_STRING"; ds@1952: } ds@1952: ds@1952: return ( m_pParent->m_pszString ) ? m_pParent->m_pszString : ""; ds@1952: } ds@1952: ds@1952: ds@1952: #ifdef _STATIC_LINKED ds@1952: // identifies subsystem via piggybacking constructors with flags ds@1952: class G_ConCommand : public ConCommand ds@1952: { ds@1952: public: ds@1952: G_ConCommand(char const *pName, FnCommandCallback callback, char const *pHelpString = 0, int flags = 0, FnCommandCompletionCallback completionFunc = 0 ) : ConCommand(pName, callback, pHelpString, flags|FCVAR_GAMEDLL, completionFunc) {} ds@1952: }; ds@1952: ds@1952: class C_ConCommand : public ConCommand ds@1952: { ds@1952: public: ds@1952: C_ConCommand(char const *pName, FnCommandCallback callback, char const *pHelpString = 0, int flags = 0, FnCommandCompletionCallback completionFunc = 0 ) : ConCommand(pName, callback, pHelpString, flags|FCVAR_CLIENTDLL, completionFunc) {} ds@1952: }; ds@1952: ds@1952: class M_ConCommand : public ConCommand ds@1952: { ds@1952: public: ds@1952: M_ConCommand(char const *pName, FnCommandCallback callback, char const *pHelpString = 0, int flags = 0, FnCommandCompletionCallback completionFunc = 0 ) : ConCommand(pName, callback, pHelpString, flags|FCVAR_MATERIAL_SYSTEM, completionFunc) {} ds@1952: }; ds@1952: ds@1952: class S_ConCommand : public ConCommand ds@1952: { ds@1952: public: ds@1952: S_ConCommand(char const *pName, FnCommandCallback callback, char const *pHelpString = 0, int flags = 0, FnCommandCompletionCallback completionFunc = 0 ) : ConCommand(pName, callback, pHelpString, flags|FCVAR_STUDIORENDER, completionFunc) {} ds@1952: }; ds@1952: ds@1952: class D_ConCommand : public ConCommand ds@1952: { ds@1952: public: ds@1952: D_ConCommand(char const *pName, FnCommandCallback callback, char const *pHelpString = 0, int flags = 0, FnCommandCompletionCallback completionFunc = 0 ) : ConCommand(pName, callback, pHelpString, flags|FCVAR_DATACACHE, completionFunc) {} ds@1952: }; ds@1952: ds@1952: typedef void ( *G_FnChangeCallback )( G_ConVar *var, char const *pOldString ); ds@1952: typedef void ( *C_FnChangeCallback )( C_ConVar *var, char const *pOldString ); ds@1952: typedef void ( *M_FnChangeCallback )( M_ConVar *var, char const *pOldString ); ds@1952: typedef void ( *S_FnChangeCallback )( S_ConVar *var, char const *pOldString ); ds@1952: typedef void ( *D_FnChangeCallback )( D_ConVar *var, char const *pOldString ); ds@1952: ds@1952: class G_ConVar : public ConVar ds@1952: { ds@1952: public: ds@1952: G_ConVar( char const *pName, char const *pDefaultValue, int flags = 0) : ConVar(pName, pDefaultValue, flags|FCVAR_GAMEDLL) {} ds@1952: G_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString ) : ConVar(pName, pDefaultValue, flags|FCVAR_GAMEDLL, pHelpString ) {} ds@1952: G_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax ) : ConVar(pName, pDefaultValue, flags|FCVAR_GAMEDLL, pHelpString, bMin, fMin, bMax, fMax) {} ds@1952: G_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, G_FnChangeCallback callback ) : ConVar(pName, pDefaultValue, flags|FCVAR_GAMEDLL, pHelpString, (FnChangeCallback)callback ) {} ds@1952: G_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax, G_FnChangeCallback callback ) : ConVar(pName, pDefaultValue, flags|FCVAR_GAMEDLL, pHelpString, bMin, fMin, bMax, fMax, (FnChangeCallback)callback ) {} ds@1952: }; ds@1952: ds@1952: class C_ConVar : public ConVar ds@1952: { ds@1952: public: ds@1952: C_ConVar( char const *pName, char const *pDefaultValue, int flags = 0) : ConVar(pName, pDefaultValue, flags|FCVAR_CLIENTDLL) {} ds@1952: C_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString ) : ConVar(pName, pDefaultValue, flags|FCVAR_CLIENTDLL, pHelpString ) {} ds@1952: C_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax ) : ConVar(pName, pDefaultValue, flags|FCVAR_CLIENTDLL, pHelpString, bMin, fMin, bMax, fMax) {} ds@1952: C_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, C_FnChangeCallback callback ) : ConVar(pName, pDefaultValue, flags|FCVAR_CLIENTDLL, pHelpString, (FnChangeCallback)callback ) {} ds@1952: C_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax, C_FnChangeCallback callback ) : ConVar(pName, pDefaultValue, flags|FCVAR_CLIENTDLL, pHelpString, bMin, fMin, bMax, fMax, (FnChangeCallback)callback ) {} ds@1952: }; ds@1952: ds@1952: class M_ConVar : public ConVar ds@1952: { ds@1952: public: ds@1952: M_ConVar( char const *pName, char const *pDefaultValue, int flags = 0) : ConVar(pName, pDefaultValue, flags|FCVAR_MATERIAL_SYSTEM) {} ds@1952: M_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString ) : ConVar(pName, pDefaultValue, flags|FCVAR_MATERIAL_SYSTEM, pHelpString ) {} ds@1952: M_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax ) : ConVar(pName, pDefaultValue, flags|FCVAR_MATERIAL_SYSTEM, pHelpString, bMin, fMin, bMax, fMax) {} ds@1952: M_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, M_FnChangeCallback callback ) : ConVar(pName, pDefaultValue, flags|FCVAR_MATERIAL_SYSTEM, pHelpString, (FnChangeCallback)callback ) {} ds@1952: M_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax, M_FnChangeCallback callback ) : ConVar(pName, pDefaultValue, flags|FCVAR_MATERIAL_SYSTEM, pHelpString, bMin, fMin, bMax, fMax, (FnChangeCallback)callback ) {} ds@1952: }; ds@1952: ds@1952: class S_ConVar : public ConVar ds@1952: { ds@1952: public: ds@1952: S_ConVar( char const *pName, char const *pDefaultValue, int flags = 0) : ConVar(pName, pDefaultValue, flags|FCVAR_STUDIORENDER) {} ds@1952: S_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString ) : ConVar(pName, pDefaultValue, flags|FCVAR_STUDIORENDER, pHelpString ) {} ds@1952: S_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax ) : ConVar(pName, pDefaultValue, flags|FCVAR_STUDIORENDER, pHelpString, bMin, fMin, bMax, fMax) {} ds@1952: S_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, M_FnChangeCallback callback ) : ConVar(pName, pDefaultValue, flags|FCVAR_STUDIORENDER, pHelpString, (FnChangeCallback)callback ) {} ds@1952: S_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax, S_FnChangeCallback callback ) : ConVar(pName, pDefaultValue, flags|FCVAR_STUDIORENDER, pHelpString, bMin, fMin, bMax, fMax, (FnChangeCallback)callback ) {} ds@1952: }; ds@1952: ds@1952: class D_ConVar : public ConVar ds@1952: { ds@1952: public: ds@1952: D_ConVar( char const *pName, char const *pDefaultValue, int flags = 0) : ConVar(pName, pDefaultValue, flags|FCVAR_DATACACHE) {} ds@1952: D_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString ) : ConVar(pName, pDefaultValue, flags|FCVAR_DATACACHE, pHelpString ) {} ds@1952: D_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax ) : ConVar(pName, pDefaultValue, flags|FCVAR_DATACACHE, pHelpString, bMin, fMin, bMax, fMax) {} ds@1952: D_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, M_FnChangeCallback callback ) : ConVar(pName, pDefaultValue, flags|FCVAR_DATACACHE, pHelpString, (FnChangeCallback)callback ) {} ds@1952: D_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax, D_FnChangeCallback callback ) : ConVar(pName, pDefaultValue, flags|FCVAR_DATACACHE, pHelpString, bMin, fMin, bMax, fMax, (FnChangeCallback)callback ) {} ds@1952: }; ds@1952: ds@1952: // redirect these declarations to their specific subsystem ds@1952: #ifdef GAME_DLL ds@1952: #define ConCommand G_ConCommand ds@1952: #define ConVar G_ConVar ds@1952: #endif ds@1952: #ifdef CLIENT_DLL ds@1952: #define ConCommand C_ConCommand ds@1952: #define ConVar C_ConVar ds@1952: #endif ds@1952: #ifdef MATERIALSYSTEM_DLL ds@1952: #define ConCommand M_ConCommand ds@1952: #define ConVar M_ConVar ds@1952: #endif ds@1952: #ifdef STUDIORENDER_DLL ds@1952: #define ConCommand S_ConCommand ds@1952: #define ConVar S_ConVar ds@1952: #endif ds@1952: #ifdef DATACACHE_DLL ds@1952: #define ConCommand D_ConCommand ds@1952: #define ConVar D_ConVar ds@1952: #endif ds@1952: #endif // _STATIC_LINKED ds@1952: ds@1952: //----------------------------------------------------------------------------- ds@1952: // Purpose: Utility to quicky generate a simple console command ds@1952: //----------------------------------------------------------------------------- ds@1952: #define CON_COMMAND( name, description ) \ ds@1952: static void name(); \ ds@1952: static ConCommand name##_command( #name, name, description ); \ ds@1952: static void name() ds@1952: ds@1952: //----------------------------------------------------------------------------- ds@1952: // Purpose: Utility to quicky generate a simple console command ds@1952: //----------------------------------------------------------------------------- ds@1952: #define CON_COMMAND_F( name, description, flags ) \ ds@1952: static void name(); \ ds@1952: static ConCommand name##_command( #name, name, description, flags ); \ ds@1952: static void name() ds@1952: ds@1952: ds@1952: #endif // CONVAR_H