faluco@1541: //===== Copyright © 1996-2005, Valve Corporation, All rights reserved. ======// faluco@1541: // faluco@1541: // Purpose: faluco@1541: // faluco@1541: // $Workfile: $ faluco@1541: // $Date: $ faluco@1541: // faluco@1541: //----------------------------------------------------------------------------- faluco@1541: // $NoKeywords: $ faluco@1541: //===========================================================================// faluco@1541: faluco@1541: #ifndef CONVAR_H faluco@1541: #define CONVAR_H faluco@1541: faluco@1541: #if _WIN32 faluco@1541: #pragma once faluco@1541: #endif faluco@1541: faluco@1541: #include "tier0/dbg.h" faluco@1541: #include "tier1/iconvar.h" faluco@1541: #include "tier1/utlvector.h" faluco@1541: #include "tier1/utlstring.h" faluco@1541: #include "icvar.h" faluco@1541: faluco@1541: #ifdef _WIN32 faluco@1541: #define FORCEINLINE_CVAR FORCEINLINE faluco@1541: #elif _LINUX faluco@1541: #define FORCEINLINE_CVAR inline faluco@1541: #else faluco@1541: #error "implement me" faluco@1541: #endif faluco@1541: faluco@1541: faluco@1541: //----------------------------------------------------------------------------- faluco@1541: // Forward declarations faluco@1541: //----------------------------------------------------------------------------- faluco@1541: class ConVar; faluco@1541: class CCommand; faluco@1541: class ConCommand; faluco@1541: class ConCommandBase; faluco@1541: struct characterset_t; faluco@1541: faluco@1541: faluco@1541: faluco@1541: //----------------------------------------------------------------------------- faluco@1541: // Any executable that wants to use ConVars need to implement one of faluco@1541: // these to hook up access to console variables. faluco@1541: //----------------------------------------------------------------------------- faluco@1541: class IConCommandBaseAccessor faluco@1541: { faluco@1541: public: faluco@1541: // Flags is a combination of FCVAR flags in cvar.h. faluco@1541: // hOut is filled in with a handle to the variable. faluco@1541: virtual bool RegisterConCommandBase( ConCommandBase *pVar ) = 0; faluco@1541: }; faluco@1541: faluco@1541: faluco@1541: //----------------------------------------------------------------------------- faluco@1541: // Helper method for console development faluco@1541: //----------------------------------------------------------------------------- faluco@1541: #if defined( _X360 ) && !defined( _RETAIL ) faluco@1541: void ConVar_PublishToVXConsole(); faluco@1541: #endif faluco@1541: faluco@1541: faluco@1541: //----------------------------------------------------------------------------- faluco@1541: // Called when a ConCommand needs to execute faluco@1541: //----------------------------------------------------------------------------- faluco@1541: typedef void ( *FnCommandCallbackV1_t )( void ); faluco@1541: typedef void ( *FnCommandCallback_t )( const CCommand &command ); faluco@1541: faluco@1541: #define COMMAND_COMPLETION_MAXITEMS 64 faluco@1541: #define COMMAND_COMPLETION_ITEM_LENGTH 64 faluco@1541: faluco@1541: //----------------------------------------------------------------------------- faluco@1541: // Returns 0 to COMMAND_COMPLETION_MAXITEMS worth of completion strings faluco@1541: //----------------------------------------------------------------------------- faluco@1541: typedef int ( *FnCommandCompletionCallback )( const char *partial, char commands[ COMMAND_COMPLETION_MAXITEMS ][ COMMAND_COMPLETION_ITEM_LENGTH ] ); faluco@1541: faluco@1541: faluco@1541: //----------------------------------------------------------------------------- faluco@1541: // Interface version faluco@1541: //----------------------------------------------------------------------------- faluco@1541: class ICommandCallback faluco@1541: { faluco@1541: public: faluco@1541: virtual void CommandCallback( const CCommand &command ) = 0; faluco@1541: }; faluco@1541: faluco@1541: class ICommandCompletionCallback faluco@1541: { faluco@1541: public: faluco@1541: virtual int CommandCompletionCallback( const char *pPartial, CUtlVector< CUtlString > &commands ) = 0; faluco@1541: }; faluco@1541: faluco@1541: //----------------------------------------------------------------------------- faluco@1541: // Purpose: The base console invoked command/cvar interface faluco@1541: //----------------------------------------------------------------------------- faluco@1541: class ConCommandBase faluco@1541: { faluco@1541: friend class CCvar; faluco@1541: friend class ConVar; faluco@1541: friend class ConCommand; faluco@1541: friend void ConVar_Register( int nCVarFlag, IConCommandBaseAccessor *pAccessor ); faluco@1541: friend void ConVar_PublishToVXConsole(); faluco@1541: faluco@1541: // FIXME: Remove when ConVar changes are done faluco@1541: friend class CDefaultCvar; faluco@1541: faluco@1541: public: faluco@1541: ConCommandBase( void ); faluco@1541: ConCommandBase( const char *pName, const char *pHelpString = 0, faluco@1541: int flags = 0 ); faluco@1541: faluco@1541: virtual ~ConCommandBase( void ); faluco@1541: faluco@1541: virtual bool IsCommand( void ) const; faluco@1541: faluco@1541: // Check flag faluco@1541: virtual bool IsFlagSet( int flag ) const; faluco@1541: // Set flag faluco@1541: virtual void AddFlags( int flags ); faluco@1541: faluco@1541: // Return name of cvar faluco@1541: virtual const char *GetName( void ) const; faluco@1541: faluco@1541: // Return help text for cvar faluco@1541: virtual const char *GetHelpText( void ) const; faluco@1541: faluco@1541: // Deal with next pointer faluco@1541: const ConCommandBase *GetNext( void ) const; faluco@1541: ConCommandBase *GetNext( void ); faluco@1541: faluco@1541: void SetNext(ConCommandBase *pBase) faluco@1541: { faluco@1541: m_pNext = pBase; faluco@1541: } faluco@1541: faluco@1541: virtual bool IsRegistered( void ) const; faluco@1541: faluco@1541: // Returns the DLL identifier faluco@1541: virtual CVarDLLIdentifier_t GetDLLIdentifier() const; faluco@1541: faluco@1541: protected: faluco@1541: virtual void Create( const char *pName, const char *pHelpString = 0, faluco@1541: int flags = 0 ); faluco@1541: faluco@1541: // Used internally by OneTimeInit to initialize/shutdown faluco@1541: virtual void Init(); faluco@1541: void Shutdown(); faluco@1541: faluco@1541: // Internal copy routine ( uses new operator from correct module ) faluco@1541: char *CopyString( const char *from ); faluco@1541: faluco@1541: private: faluco@1541: // Next ConVar in chain faluco@1541: // Prior to register, it points to the next convar in the DLL. faluco@1541: // Once registered, though, m_pNext is reset to point to the next faluco@1541: // convar in the global list faluco@1541: ConCommandBase *m_pNext; faluco@1541: faluco@1541: // Has the cvar been added to the global list? faluco@1541: bool m_bRegistered; faluco@1541: faluco@1541: // Static data faluco@1541: const char *m_pszName; faluco@1541: const char *m_pszHelpString; faluco@1541: faluco@1541: // ConVar flags faluco@1541: int m_nFlags; faluco@1541: faluco@1541: protected: faluco@1541: // ConVars add themselves to this list for the executable. faluco@1541: // Then ConVar_Register runs through all the console variables faluco@1541: // and registers them into a global list stored in vstdlib.dll faluco@1541: static ConCommandBase *s_pConCommandBases; faluco@1541: faluco@1541: // ConVars in this executable use this 'global' to access values. faluco@1541: static IConCommandBaseAccessor *s_pAccessor; faluco@1541: public: // Hackalicous faluco@1541: inline int GetFlags() const faluco@1541: { faluco@1541: return m_nFlags; faluco@1541: } faluco@1541: inline void SetFlags(int flags) faluco@1541: { faluco@1541: m_nFlags = flags; faluco@1541: } faluco@1541: }; faluco@1541: faluco@1541: faluco@1541: //----------------------------------------------------------------------------- faluco@1541: // Command tokenizer faluco@1541: //----------------------------------------------------------------------------- faluco@1541: class CCommand faluco@1541: { faluco@1541: public: faluco@1541: CCommand(); faluco@1541: CCommand( int nArgC, const char **ppArgV ); faluco@1541: bool Tokenize( const char *pCommand, characterset_t *pBreakSet = NULL ); faluco@1541: void Reset(); faluco@1541: faluco@1541: int ArgC() const; faluco@1541: const char **ArgV() const; faluco@1541: const char *ArgS() const; // All args that occur after the 0th arg, in string form faluco@1541: const char *GetCommandString() const; // The entire command in string form, including the 0th arg faluco@1541: const char *operator[]( int nIndex ) const; // Gets at arguments faluco@1541: const char *Arg( int nIndex ) const; // Gets at arguments faluco@1541: faluco@1541: // Helper functions to parse arguments to commands. faluco@1541: const char* FindArg( const char *pName ) const; faluco@1541: int FindArgInt( const char *pName, int nDefaultVal ) const; faluco@1541: faluco@1541: static int MaxCommandLength(); faluco@1541: static characterset_t* DefaultBreakSet(); faluco@1541: faluco@1541: private: faluco@1541: enum faluco@1541: { faluco@1541: COMMAND_MAX_ARGC = 64, faluco@1541: COMMAND_MAX_LENGTH = 512, faluco@1541: }; faluco@1541: faluco@1541: int m_nArgc; faluco@1541: int m_nArgv0Size; faluco@1541: char m_pArgSBuffer[ COMMAND_MAX_LENGTH ]; faluco@1541: char m_pArgvBuffer[ COMMAND_MAX_LENGTH ]; faluco@1541: const char* m_ppArgv[ COMMAND_MAX_ARGC ]; faluco@1541: }; faluco@1541: faluco@1541: inline int CCommand::MaxCommandLength() faluco@1541: { faluco@1541: return COMMAND_MAX_LENGTH - 1; faluco@1541: } faluco@1541: faluco@1541: inline int CCommand::ArgC() const faluco@1541: { faluco@1541: return m_nArgc; faluco@1541: } faluco@1541: faluco@1541: inline const char **CCommand::ArgV() const faluco@1541: { faluco@1541: return m_nArgc ? (const char**)m_ppArgv : NULL; faluco@1541: } faluco@1541: faluco@1541: inline const char *CCommand::ArgS() const faluco@1541: { faluco@1541: return m_nArgv0Size ? &m_pArgSBuffer[m_nArgv0Size] : ""; faluco@1541: } faluco@1541: faluco@1541: inline const char *CCommand::GetCommandString() const faluco@1541: { faluco@1541: return m_nArgc ? m_pArgSBuffer : ""; faluco@1541: } faluco@1541: faluco@1541: inline const char *CCommand::Arg( int nIndex ) const faluco@1541: { faluco@1541: // FIXME: Many command handlers appear to not be particularly careful faluco@1541: // about checking for valid argc range. For now, we're going to faluco@1541: // do the extra check and return an empty string if it's out of range faluco@1541: if ( nIndex < 0 || nIndex >= m_nArgc ) faluco@1541: return ""; faluco@1541: return m_ppArgv[nIndex]; faluco@1541: } faluco@1541: faluco@1541: inline const char *CCommand::operator[]( int nIndex ) const faluco@1541: { faluco@1541: return Arg( nIndex ); faluco@1541: } faluco@1541: faluco@1541: faluco@1541: //----------------------------------------------------------------------------- faluco@1541: // Purpose: The console invoked command faluco@1541: //----------------------------------------------------------------------------- faluco@1541: class ConCommand : public ConCommandBase faluco@1541: { faluco@1541: friend class CCvar; faluco@1541: faluco@1541: public: faluco@1541: typedef ConCommandBase BaseClass; faluco@1541: faluco@1541: ConCommand( const char *pName, FnCommandCallbackV1_t callback, faluco@1541: const char *pHelpString = 0, int flags = 0, FnCommandCompletionCallback completionFunc = 0 ); faluco@1541: ConCommand( const char *pName, FnCommandCallback_t callback, faluco@1541: const char *pHelpString = 0, int flags = 0, FnCommandCompletionCallback completionFunc = 0 ); faluco@1541: ConCommand( const char *pName, ICommandCallback *pCallback, faluco@1541: const char *pHelpString = 0, int flags = 0, ICommandCompletionCallback *pCommandCompletionCallback = 0 ); faluco@1541: faluco@1541: virtual ~ConCommand( void ); faluco@1541: faluco@1541: virtual bool IsCommand( void ) const; faluco@1541: faluco@1541: virtual int AutoCompleteSuggest( const char *partial, CUtlVector< CUtlString > &commands ); faluco@1541: faluco@1541: virtual bool CanAutoComplete( void ); faluco@1541: faluco@1541: // Invoke the function faluco@1541: virtual void Dispatch( const CCommand &command ); faluco@1541: faluco@1541: private: faluco@1541: // NOTE: To maintain backward compat, we have to be very careful: faluco@1541: // All public virtual methods must appear in the same order always faluco@1541: // since engine code will be calling into this code, which *does not match* faluco@1541: // in the mod code; it's using slightly different, but compatible versions faluco@1541: // of this class. Also: Be very careful about adding new fields to this class. faluco@1541: // Those fields will not exist in the version of this class that is instanced faluco@1541: // in mod code. faluco@1541: faluco@1541: // Call this function when executing the command faluco@1541: union faluco@1541: { faluco@1541: FnCommandCallbackV1_t m_fnCommandCallbackV1; faluco@1541: FnCommandCallback_t m_fnCommandCallback; faluco@1541: ICommandCallback *m_pCommandCallback; faluco@1541: }; faluco@1541: faluco@1541: union faluco@1541: { faluco@1541: FnCommandCompletionCallback m_fnCompletionCallback; faluco@1541: ICommandCompletionCallback *m_pCommandCompletionCallback; faluco@1541: }; faluco@1541: faluco@1541: bool m_bHasCompletionCallback : 1; faluco@1541: bool m_bUsingNewCommandCallback : 1; faluco@1541: bool m_bUsingCommandCallbackInterface : 1; faluco@1541: public: // Hackalicous faluco@1541: inline FnCommandCallback_t GetCallback() const faluco@1541: { faluco@1541: return m_fnCommandCallback; faluco@1541: } faluco@1541: }; faluco@1541: faluco@1541: faluco@1541: //----------------------------------------------------------------------------- faluco@1541: // Purpose: A console variable faluco@1541: //----------------------------------------------------------------------------- faluco@1541: class ConVar : public ConCommandBase, public IConVar faluco@1541: { faluco@1541: friend class CCvar; faluco@1541: friend class ConVarRef; faluco@1541: faluco@1541: public: faluco@1541: typedef ConCommandBase BaseClass; faluco@1541: faluco@1541: ConVar( const char *pName, const char *pDefaultValue, int flags = 0); faluco@1541: faluco@1541: ConVar( const char *pName, const char *pDefaultValue, int flags, faluco@1541: const char *pHelpString ); faluco@1541: ConVar( const char *pName, const char *pDefaultValue, int flags, faluco@1541: const char *pHelpString, bool bMin, float fMin, bool bMax, float fMax ); faluco@1541: ConVar( const char *pName, const char *pDefaultValue, int flags, faluco@1541: const char *pHelpString, FnChangeCallback_t callback ); faluco@1541: ConVar( const char *pName, const char *pDefaultValue, int flags, faluco@1541: const char *pHelpString, bool bMin, float fMin, bool bMax, float fMax, faluco@1541: FnChangeCallback_t callback ); faluco@1541: faluco@1541: virtual ~ConVar( void ); faluco@1541: faluco@1541: virtual bool IsFlagSet( int flag ) const; faluco@1541: virtual const char* GetHelpText( void ) const; faluco@1541: virtual bool IsRegistered( void ) const; faluco@1541: virtual const char *GetName( void ) const; faluco@1541: virtual void AddFlags( int flags ); faluco@1541: virtual bool IsCommand( void ) const; faluco@1541: faluco@1541: // Install a change callback (there shouldn't already be one....) faluco@1541: void InstallChangeCallback( FnChangeCallback_t callback ); faluco@1541: faluco@1541: // Retrieve value faluco@1541: FORCEINLINE_CVAR float GetFloat( void ) const; faluco@1541: FORCEINLINE_CVAR int GetInt( void ) const; faluco@1541: FORCEINLINE_CVAR bool GetBool() const { return !!GetInt(); } faluco@1541: FORCEINLINE_CVAR char const *GetString( void ) const; faluco@1541: faluco@1541: // Any function that allocates/frees memory needs to be virtual or else you'll have crashes faluco@1541: // from alloc/free across dll/exe boundaries. faluco@1541: faluco@1541: // These just call into the IConCommandBaseAccessor to check flags and set the var (which ends up calling InternalSetValue). faluco@1541: virtual void SetValue( const char *value ); faluco@1541: virtual void SetValue( float value ); faluco@1541: virtual void SetValue( int value ); faluco@1541: faluco@1541: // Reset to default value faluco@1541: void Revert( void ); faluco@1541: faluco@1541: // True if it has a min/max setting faluco@1541: bool GetMin( float& minVal ) const; faluco@1541: bool GetMax( float& maxVal ) const; faluco@1541: const char *GetDefault( void ) const; faluco@1541: faluco@1541: private: faluco@1541: // Called by CCvar when the value of a var is changing. faluco@1541: virtual void InternalSetValue(const char *value); faluco@1541: // For CVARs marked FCVAR_NEVER_AS_STRING faluco@1541: virtual void InternalSetFloatValue( float fNewValue ); faluco@1541: virtual void InternalSetIntValue( int nValue ); faluco@1541: faluco@1541: virtual bool ClampValue( float& value ); faluco@1541: virtual void ChangeStringValue( const char *tempVal, float flOldValue ); faluco@1541: faluco@1541: virtual void Create( const char *pName, const char *pDefaultValue, int flags = 0, faluco@1541: const char *pHelpString = 0, bool bMin = false, float fMin = 0.0, faluco@1541: bool bMax = false, float fMax = false, FnChangeCallback_t callback = 0 ); faluco@1541: faluco@1541: // Used internally by OneTimeInit to initialize. faluco@1541: virtual void Init(); faluco@1541: faluco@1541: private: faluco@1541: faluco@1541: // This either points to "this" or it points to the original declaration of a ConVar. faluco@1541: // This allows ConVars to exist in separate modules, and they all use the first one to be declared. faluco@1541: // m_pParent->m_pParent must equal m_pParent (ie: m_pParent must be the root, or original, ConVar). faluco@1541: ConVar *m_pParent; faluco@1541: faluco@1541: // Static data faluco@1541: const char *m_pszDefaultValue; faluco@1541: faluco@1541: // Value faluco@1541: // Dynamically allocated faluco@1541: char *m_pszString; faluco@1541: int m_StringLength; faluco@1541: faluco@1541: // Values faluco@1541: float m_fValue; faluco@1541: int m_nValue; faluco@1541: faluco@1541: // Min/Max values faluco@1541: bool m_bHasMin; faluco@1541: float m_fMinVal; faluco@1541: bool m_bHasMax; faluco@1541: float m_fMaxVal; faluco@1541: faluco@1541: // Call this function when ConVar changes faluco@1541: FnChangeCallback_t m_fnChangeCallback; faluco@1541: public: // Hackalicous faluco@1541: inline FnChangeCallback_t GetCallback() const faluco@1541: { faluco@1541: return m_fnChangeCallback; faluco@1541: } faluco@1541: inline void SetMin(bool set, float min=0.0) faluco@1541: { faluco@1541: m_bHasMin = set; faluco@1541: m_fMinVal = min; faluco@1541: } faluco@1541: inline void SetMax(bool set, float max=0.0) faluco@1541: { faluco@1541: m_bHasMax = set; faluco@1541: m_fMaxVal = max; faluco@1541: } faluco@1541: }; faluco@1541: faluco@1541: faluco@1541: //----------------------------------------------------------------------------- faluco@1541: // Purpose: Return ConVar value as a float faluco@1541: // Output : float faluco@1541: //----------------------------------------------------------------------------- faluco@1541: FORCEINLINE_CVAR float ConVar::GetFloat( void ) const faluco@1541: { faluco@1541: return m_pParent->m_fValue; faluco@1541: } faluco@1541: faluco@1541: //----------------------------------------------------------------------------- faluco@1541: // Purpose: Return ConVar value as an int faluco@1541: // Output : int faluco@1541: //----------------------------------------------------------------------------- faluco@1541: FORCEINLINE_CVAR int ConVar::GetInt( void ) const faluco@1541: { faluco@1541: return m_pParent->m_nValue; faluco@1541: } faluco@1541: faluco@1541: faluco@1541: //----------------------------------------------------------------------------- faluco@1541: // Purpose: Return ConVar value as a string, return "" for bogus string pointer, etc. faluco@1541: // Output : const char * faluco@1541: //----------------------------------------------------------------------------- faluco@1541: FORCEINLINE_CVAR const char *ConVar::GetString( void ) const faluco@1541: { faluco@1541: if ( m_nFlags & FCVAR_NEVER_AS_STRING ) faluco@1541: return "FCVAR_NEVER_AS_STRING"; faluco@1541: faluco@1541: return ( m_pParent->m_pszString ) ? m_pParent->m_pszString : ""; faluco@1541: } faluco@1541: faluco@1541: faluco@1541: //----------------------------------------------------------------------------- faluco@1541: // Used to read/write convars that already exist (replaces the FindVar method) faluco@1541: //----------------------------------------------------------------------------- faluco@1541: class ConVarRef faluco@1541: { faluco@1541: public: faluco@1541: ConVarRef( const char *pName ); faluco@1541: ConVarRef( const char *pName, bool bIgnoreMissing ); faluco@1541: ConVarRef( IConVar *pConVar ); faluco@1541: faluco@1541: void Init( const char *pName, bool bIgnoreMissing ); faluco@1541: bool IsValid() const; faluco@1541: bool IsFlagSet( int nFlags ) const; faluco@1541: IConVar *GetLinkedConVar(); faluco@1541: faluco@1541: // Get/Set value faluco@1541: float GetFloat( void ) const; faluco@1541: int GetInt( void ) const; faluco@1541: bool GetBool() const { return !!GetInt(); } faluco@1541: const char *GetString( void ) const; faluco@1541: faluco@1541: void SetValue( const char *pValue ); faluco@1541: void SetValue( float flValue ); faluco@1541: void SetValue( int nValue ); faluco@1541: void SetValue( bool bValue ); faluco@1541: faluco@1541: const char *GetName() const; faluco@1541: faluco@1541: const char *GetDefault() const; faluco@1541: faluco@1541: private: faluco@1541: // High-speed method to read convar data faluco@1541: IConVar *m_pConVar; faluco@1541: ConVar *m_pConVarState; faluco@1541: }; faluco@1541: faluco@1541: faluco@1541: //----------------------------------------------------------------------------- faluco@1541: // Did we find an existing convar of that name? faluco@1541: //----------------------------------------------------------------------------- faluco@1541: FORCEINLINE_CVAR bool ConVarRef::IsFlagSet( int nFlags ) const faluco@1541: { faluco@1541: return ( m_pConVar->IsFlagSet( nFlags ) != 0 ); faluco@1541: } faluco@1541: faluco@1541: FORCEINLINE_CVAR IConVar *ConVarRef::GetLinkedConVar() faluco@1541: { faluco@1541: return m_pConVar; faluco@1541: } faluco@1541: faluco@1541: FORCEINLINE_CVAR const char *ConVarRef::GetName() const faluco@1541: { faluco@1541: return m_pConVar->GetName(); faluco@1541: } faluco@1541: faluco@1541: faluco@1541: //----------------------------------------------------------------------------- faluco@1541: // Purpose: Return ConVar value as a float faluco@1541: //----------------------------------------------------------------------------- faluco@1541: FORCEINLINE_CVAR float ConVarRef::GetFloat( void ) const faluco@1541: { faluco@1541: return m_pConVarState->m_fValue; faluco@1541: } faluco@1541: faluco@1541: //----------------------------------------------------------------------------- faluco@1541: // Purpose: Return ConVar value as an int faluco@1541: //----------------------------------------------------------------------------- faluco@1541: FORCEINLINE_CVAR int ConVarRef::GetInt( void ) const faluco@1541: { faluco@1541: return m_pConVarState->m_nValue; faluco@1541: } faluco@1541: faluco@1541: //----------------------------------------------------------------------------- faluco@1541: // Purpose: Return ConVar value as a string, return "" for bogus string pointer, etc. faluco@1541: //----------------------------------------------------------------------------- faluco@1541: FORCEINLINE_CVAR const char *ConVarRef::GetString( void ) const faluco@1541: { faluco@1541: Assert( !IsFlagSet( FCVAR_NEVER_AS_STRING ) ); faluco@1541: return m_pConVarState->m_pszString; faluco@1541: } faluco@1541: faluco@1541: faluco@1541: FORCEINLINE_CVAR void ConVarRef::SetValue( const char *pValue ) faluco@1541: { faluco@1541: m_pConVar->SetValue( pValue ); faluco@1541: } faluco@1541: faluco@1541: FORCEINLINE_CVAR void ConVarRef::SetValue( float flValue ) faluco@1541: { faluco@1541: m_pConVar->SetValue( flValue ); faluco@1541: } faluco@1541: faluco@1541: FORCEINLINE_CVAR void ConVarRef::SetValue( int nValue ) faluco@1541: { faluco@1541: m_pConVar->SetValue( nValue ); faluco@1541: } faluco@1541: faluco@1541: FORCEINLINE_CVAR void ConVarRef::SetValue( bool bValue ) faluco@1541: { faluco@1541: m_pConVar->SetValue( bValue ? 1 : 0 ); faluco@1541: } faluco@1541: faluco@1541: FORCEINLINE_CVAR const char *ConVarRef::GetDefault() const faluco@1541: { faluco@1541: return m_pConVarState->m_pszDefaultValue; faluco@1541: } faluco@1541: faluco@1541: faluco@1541: //----------------------------------------------------------------------------- faluco@1541: // Called by the framework to register ConCommands with the ICVar faluco@1541: //----------------------------------------------------------------------------- faluco@1541: void ConVar_Register( int nCVarFlag = 0, IConCommandBaseAccessor *pAccessor = NULL ); faluco@1541: void ConVar_Unregister( ); faluco@1541: faluco@1541: faluco@1541: //----------------------------------------------------------------------------- faluco@1541: // Utility methods faluco@1541: //----------------------------------------------------------------------------- faluco@1541: void ConVar_PrintFlags( const ConCommandBase *var ); faluco@1541: void ConVar_PrintDescription( const ConCommandBase *pVar ); faluco@1541: faluco@1541: faluco@1541: //----------------------------------------------------------------------------- faluco@1541: // Purpose: Utility class to quickly allow ConCommands to call member methods faluco@1541: //----------------------------------------------------------------------------- faluco@1541: #if defined _MSC_VER faluco@1541: #pragma warning (disable : 4355 ) faluco@1541: #endif faluco@1541: faluco@1541: template< class T > faluco@1541: class CConCommandMemberAccessor : public ConCommand, public ICommandCallback, public ICommandCompletionCallback faluco@1541: { faluco@1541: typedef ConCommand BaseClass; faluco@1541: typedef void ( T::*FnMemberCommandCallback_t )( const CCommand &command ); faluco@1541: typedef int ( T::*FnMemberCommandCompletionCallback_t )( const char *pPartial, CUtlVector< CUtlString > &commands ); faluco@1541: faluco@1541: public: faluco@1541: CConCommandMemberAccessor( T* pOwner, const char *pName, FnMemberCommandCallback_t callback, const char *pHelpString = 0, faluco@1541: int flags = 0, FnMemberCommandCompletionCallback_t completionFunc = 0 ) : faluco@1541: BaseClass( pName, this, pHelpString, flags, ( completionFunc != 0 ) ? this : NULL ) faluco@1541: { faluco@1541: m_pOwner = pOwner; faluco@1541: m_Func = callback; faluco@1541: m_CompletionFunc = completionFunc; faluco@1541: } faluco@1541: faluco@1541: ~CConCommandMemberAccessor() faluco@1541: { faluco@1541: Shutdown(); faluco@1541: } faluco@1541: faluco@1541: void SetOwner( T* pOwner ) faluco@1541: { faluco@1541: m_pOwner = pOwner; faluco@1541: } faluco@1541: faluco@1541: virtual void CommandCallback( const CCommand &command ) faluco@1541: { faluco@1541: Assert( m_pOwner && m_Func ); faluco@1541: (m_pOwner->*m_Func)( command ); faluco@1541: } faluco@1541: faluco@1541: virtual int CommandCompletionCallback( const char *pPartial, CUtlVector< CUtlString > &commands ) faluco@1541: { faluco@1541: Assert( m_pOwner && m_CompletionFunc ); faluco@1541: return (m_pOwner->*m_CompletionFunc)( pPartial, commands ); faluco@1541: } faluco@1541: faluco@1541: private: faluco@1541: T* m_pOwner; faluco@1541: FnMemberCommandCallback_t m_Func; faluco@1541: FnMemberCommandCompletionCallback_t m_CompletionFunc; faluco@1541: }; faluco@1541: faluco@1541: #if defined _MSC_VER faluco@1541: #pragma warning ( default : 4355 ) faluco@1541: #endif faluco@1541: faluco@1541: faluco@1541: //----------------------------------------------------------------------------- faluco@1541: // Purpose: Utility macros to quicky generate a simple console command faluco@1541: //----------------------------------------------------------------------------- faluco@1541: #define CON_COMMAND( name, description ) \ faluco@1541: static void name( const CCommand &args ); \ faluco@1541: static ConCommand name##_command( #name, name, description ); \ faluco@1541: static void name( const CCommand &args ) faluco@1541: faluco@1541: #define CON_COMMAND_F( name, description, flags ) \ faluco@1541: static void name( const CCommand &args ); \ faluco@1541: static ConCommand name##_command( #name, name, description, flags ); \ faluco@1541: static void name( const CCommand &args ) faluco@1541: faluco@1541: #define CON_COMMAND_F_COMPLETION( name, description, flags, completion ) \ faluco@1541: static void name( const CCommand &args ); \ faluco@1541: static ConCommand name##_command( #name, name, description, flags, completion ); \ faluco@1541: static void name( const CCommand &args ) faluco@1541: faluco@1541: #define CON_COMMAND_EXTERN( name, _funcname, description ) \ faluco@1541: void _funcname( const CCommand &args ); \ faluco@1541: static ConCommand name##_command( #name, _funcname, description ); \ faluco@1541: void _funcname( const CCommand &args ) faluco@1541: faluco@1541: #define CON_COMMAND_EXTERN_F( name, _funcname, description, flags ) \ faluco@1541: void _funcname( const CCommand &args ); \ faluco@1541: static ConCommand name##_command( #name, _funcname, description, flags ); \ faluco@1541: void _funcname( const CCommand &args ) faluco@1541: faluco@1541: #define CON_COMMAND_MEMBER_F( _thisclass, name, _funcname, description, flags ) \ faluco@1541: void _funcname( const CCommand &args ); \ faluco@1541: friend class CCommandMemberInitializer_##_funcname; \ faluco@1541: class CCommandMemberInitializer_##_funcname \ faluco@1541: { \ faluco@1541: public: \ faluco@1541: CCommandMemberInitializer_##_funcname() : m_ConCommandAccessor( NULL, name, &_thisclass::_funcname, description, flags ) \ faluco@1541: { \ faluco@1541: m_ConCommandAccessor.SetOwner( GET_OUTER( _thisclass, m_##_funcname##_register ) ); \ faluco@1541: } \ faluco@1541: private: \ faluco@1541: CConCommandMemberAccessor< _thisclass > m_ConCommandAccessor; \ faluco@1541: }; \ faluco@1541: \ faluco@1541: CCommandMemberInitializer_##_funcname m_##_funcname##_register; \ faluco@1541: faluco@1541: faluco@1541: #endif // CONVAR_H