core/convar_sm.h
author Nicholas Hastings <skamonkey@gmail.com>
Mon Jul 29 10:03:18 2013 -0400 (2013-07-29)
changeset 3960 d50b36dc6821
parent 1952 b7aa2b626807
permissions -rw-r--r--
Updated for latest hl2sdk-dota changes.
     1 //========= Copyright � 1996-2005, Valve Corporation, All rights reserved. ============//
     2 //
     3 // Purpose: 
     4 //
     5 // $Workfile:     $
     6 // $Date: 2006-08-13 06:34:30 -0500 (Sun, 13 Aug 2006) $
     7 //
     8 //-----------------------------------------------------------------------------
     9 // $NoKeywords: $
    10 //=============================================================================//
    11 
    12 #ifndef CONVAR_H
    13 #define CONVAR_H
    14 #if _WIN32
    15 #pragma once
    16 #endif
    17 
    18 #include "tier0/dbg.h"
    19 
    20 #ifdef _WIN32
    21 #define FORCEINLINE_CVAR FORCEINLINE
    22 #elif _LINUX
    23 #define FORCEINLINE_CVAR __inline__ FORCEINLINE
    24 #else
    25 #error "implement me"
    26 #endif
    27 
    28 // The default, no flags at all
    29 #define FCVAR_NONE				0 
    30 
    31 // Command to ConVars and ConCommands
    32 // ConVar Systems
    33 #define FCVAR_UNREGISTERED		(1<<0)	// If this is set, don't add to linked list, etc.
    34 #define FCVAR_LAUNCHER			(1<<1)	// defined by launcher
    35 #define FCVAR_GAMEDLL			(1<<2)	// defined by the game DLL
    36 #define FCVAR_CLIENTDLL			(1<<3)  // defined by the client DLL
    37 #define FCVAR_MATERIAL_SYSTEM	(1<<4)	// Defined by the material system.
    38 #define FCVAR_DATACACHE			(1<<19)	// Defined by the datacache system.
    39 #define FCVAR_STUDIORENDER		(1<<15)	// Defined by the studiorender system.
    40 #define FCVAR_FILESYSTEM		(1<<21)	// Defined by the file system.
    41 #define FCVAR_PLUGIN			(1<<18)	// Defined by a 3rd party plugin.
    42 #define FCVAR_TOOLSYSTEM		(1<<20)	// Defined by an IToolSystem library
    43 #define FCVAR_SOUNDSYSTEM		(1<<23)	// Defined by the soundsystem library
    44 #define FCVAR_INPUTSYSTEM		(1<<25)	// Defined by the inputsystem dll
    45 #define FCVAR_NETWORKSYSTEM		(1<<26) // Defined by the network system
    46 // NOTE!! if you add a cvar system, add it here too!!!!
    47 // the engine lacks a cvar flag, but needs it for xbox
    48 // an engine cvar is thus a cvar not marked with any other system
    49 #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))
    50 
    51 // ConVar only
    52 #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
    53 #define FCVAR_SPONLY			(1<<6)  // This cvar cannot be changed by clients connected to a multiplayer server.
    54 #define	FCVAR_ARCHIVE			(1<<7)	// set to cause it to be saved to vars.rc
    55 #define	FCVAR_NOTIFY			(1<<8)	// notifies players when changed
    56 #define	FCVAR_USERINFO			(1<<9)	// changes the client's info string
    57 #define FCVAR_CHEAT				(1<<14) // Only useable in singleplayer / debug / multiplayer & sv_cheats
    58 
    59 #define FCVAR_PRINTABLEONLY		(1<<10)  // This cvar's string cannot contain unprintable characters ( e.g., used for player name etc ).
    60 #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
    61 #define FCVAR_NEVER_AS_STRING	(1<<12)  // never try to print that cvar
    62 
    63 // It's a ConVar that's shared between the client and the server.
    64 // At signon, the values of all such ConVars are sent from the server to the client (skipped for local
    65 //  client, of course )
    66 // If a change is requested it must come from the console (i.e., no remote client changes)
    67 // If a value is changed while a server is active, it's replicated to all connected clients
    68 #define FCVAR_REPLICATED		(1<<13)	// server setting enforced on clients, TODO rename to FCAR_SERVER at some time
    69 #define FCVAR_DEMO				(1<<16)  // record this cvar when starting a demo file
    70 #define FCVAR_DONTRECORD		(1<<17)  // don't record these command in demofiles
    71 
    72 #define FCVAR_NOT_CONNECTED		(1<<22)	// cvar cannot be changed by a client that is connected to a server
    73 
    74 #define FCVAR_ARCHIVE_XBOX		(1<<24) // cvar written to config.cfg on the Xbox
    75 
    76 
    77 // #define FCVAR_AVAILABLE			(1<<27)
    78 // #define FCVAR_AVAILABLE			(1<<28)
    79 // #define FCVAR_AVAILABLE			(1<<29)
    80 // #define FCVAR_AVAILABLE			(1<<30)
    81 // #define FCVAR_AVAILABLE			(1<<31)
    82 
    83 
    84 class ConVar;
    85 class ConCommand;
    86 class ConCommandBase;
    87 
    88 // Any executable that wants to use ConVars need to implement one of
    89 // these to hook up access to console variables.
    90 class IConCommandBaseAccessor
    91 {
    92 public:
    93 	// Flags is a combination of FCVAR flags in cvar.h.
    94 	// hOut is filled in with a handle to the variable.
    95 	virtual bool RegisterConCommandBase( ConCommandBase *pVar )=0;
    96 };
    97 
    98 
    99 // You don't have to instantiate one of these, just call its 
   100 // OneTimeInit function when your executable is initializing.
   101 class ConCommandBaseMgr
   102 {
   103 public:
   104 	// Call this ONCE when the executable starts up.
   105 	static void	OneTimeInit( IConCommandBaseAccessor *pAccessor );
   106 #ifdef _XBOX
   107 	static bool Fixup( ConCommandBase* pConCommandBase );
   108 #ifndef _RETAIL
   109 	static void PublishCommands( bool bForce );
   110 #endif
   111 #endif
   112 };
   113 
   114 // Called when a ConVar changes value
   115 typedef void ( *FnChangeCallback )( ConVar *var, char const *pOldString );
   116 
   117 // Called when a ConCommand needs to execute
   118 typedef void ( *FnCommandCallback )( void );
   119 
   120 #define COMMAND_COMPLETION_MAXITEMS		64
   121 #define COMMAND_COMPLETION_ITEM_LENGTH	64
   122 
   123 // Returns 0 to COMMAND_COMPLETION_MAXITEMS worth of completion strings
   124 typedef int  ( *FnCommandCompletionCallback )( char const *partial, char commands[ COMMAND_COMPLETION_MAXITEMS ][ COMMAND_COMPLETION_ITEM_LENGTH ] );
   125 
   126 //-----------------------------------------------------------------------------
   127 // Purpose: The base console invoked command/cvar interface
   128 //-----------------------------------------------------------------------------
   129 class ConCommandBase
   130 {
   131 	friend class ConCommandBaseMgr;
   132 	friend class CCvar;
   133 	friend class ConVar;
   134 	friend class ConCommand;
   135 
   136 public:
   137 								ConCommandBase( void );
   138 								ConCommandBase( char const *pName, char const *pHelpString = 0, 
   139 									int flags = 0 );
   140 
   141 	virtual						~ConCommandBase( void );
   142 
   143 	virtual	bool				IsCommand( void ) const;
   144 
   145 	// Check flag
   146 	virtual bool				IsBitSet( int flag ) const;
   147 	// Set flag
   148 	virtual void				AddFlags( int flags );
   149 
   150 	// Return name of cvar
   151 	virtual char const			*GetName( void ) const;
   152 
   153 	// Return help text for cvar
   154 	virtual char const			*GetHelpText( void ) const;
   155 
   156 	// Deal with next pointer
   157 	const ConCommandBase		*GetNext( void ) const;
   158 	void						SetNext( ConCommandBase *next );
   159 	
   160 	virtual bool				IsRegistered( void ) const;
   161 
   162 	// Global methods
   163 	static ConCommandBase const	*GetCommands( void );
   164 	static void					AddToList( ConCommandBase *var );
   165 	static void					RemoveFlaggedCommands( int flag );
   166 	static void					RevertFlaggedCvars( int flag );
   167 	static ConCommandBase const	*FindCommand( char const *name );
   168 
   169 protected:
   170 	virtual void				Create( char const *pName, char const *pHelpString = 0, 
   171 									int flags = 0 );
   172 
   173 	// Used internally by OneTimeInit to initialize.
   174 	virtual void				Init();
   175 
   176 	// Internal copy routine ( uses new operator from correct module )
   177 	char						*CopyString( char const *from );
   178 
   179 	// Next ConVar in chain
   180 	ConCommandBase				*m_pNext;
   181 
   182 private:
   183 	// Has the cvar been added to the global list?
   184 	bool						m_bRegistered;
   185 
   186 	// Static data
   187 	char const 					*m_pszName;
   188 	char const 					*m_pszHelpString;
   189 	
   190 	// ConVar flags
   191 	int							m_nFlags;
   192 
   193 protected:
   194 
   195 	// ConVars add themselves to this list for the executable. Then ConVarMgr::Init() runs through 
   196 	// all the console variables and registers them.
   197 	static ConCommandBase		*s_pConCommandBases;
   198 
   199 	// ConVars in this executable use this 'global' to access values.
   200 	static IConCommandBaseAccessor	*s_pAccessor;
   201 	
   202 public: // Hackalicous
   203 	inline int GetFlags() const
   204 	{
   205 		return m_nFlags;
   206 	}
   207 	inline void SetFlags(int flags)	
   208 	{ 
   209 		m_nFlags = flags; 
   210 	}
   211 };
   212 
   213 //-----------------------------------------------------------------------------
   214 // Purpose: The console invoked command
   215 //-----------------------------------------------------------------------------
   216 class ConCommand : public ConCommandBase
   217 {
   218 friend class ConCommandBaseMgr;
   219 friend class CCvar;
   220 #ifdef _STATIC_LINKED
   221 friend class G_ConCommand;
   222 friend class C_ConCommand;
   223 friend class M_ConCommand;
   224 friend class S_ConCommand;
   225 friend class D_ConCommand;
   226 #endif
   227 
   228 public:
   229 	typedef ConCommandBase BaseClass;
   230 
   231 								ConCommand( void );
   232 								ConCommand( char const *pName, FnCommandCallback callback, 
   233 									char const *pHelpString = 0, int flags = 0, FnCommandCompletionCallback completionFunc = 0 );
   234 
   235 	virtual						~ConCommand( void );
   236 
   237 	virtual	bool				IsCommand( void ) const;
   238 
   239 	virtual int					AutoCompleteSuggest( char const *partial, char commands[ COMMAND_COMPLETION_MAXITEMS ][ COMMAND_COMPLETION_ITEM_LENGTH ] );
   240 
   241 	virtual bool				CanAutoComplete( void );
   242 
   243 	// Invoke the function
   244 	virtual void				Dispatch( void );
   245 private:
   246 	virtual void				Create( char const *pName, FnCommandCallback callback, 
   247 									char const *pHelpString = 0, int flags = 0, FnCommandCompletionCallback completionFunc = 0 );
   248 
   249 	// Call this function when executing the command
   250 	FnCommandCallback			m_fnCommandCallback;
   251 
   252 	FnCommandCompletionCallback	m_fnCompletionCallback;
   253 	bool						m_bHasCompletionCallback;
   254 public: // Hackalicous
   255 	inline FnCommandCallback GetCallback() const
   256 	{ 
   257 		return m_fnCommandCallback; 
   258 	}
   259 };
   260 
   261 //-----------------------------------------------------------------------------
   262 // Purpose: A console variable
   263 //-----------------------------------------------------------------------------
   264 class ConVar : public ConCommandBase
   265 {
   266 friend class ConCommandBaseMgr;
   267 friend class CCvar;
   268 friend class CDefaultCvar;
   269 #ifdef _STATIC_LINKED
   270 friend class G_ConVar;
   271 friend class C_ConVar;
   272 friend class M_ConVar;
   273 friend class S_ConVar;
   274 friend class D_ConVar;
   275 #endif
   276 
   277 public:
   278 	typedef ConCommandBase BaseClass;
   279 
   280 								ConVar( char const *pName, char const *pDefaultValue, int flags = 0);
   281 
   282 								ConVar( char const *pName, char const *pDefaultValue, int flags, 
   283 									char const *pHelpString );
   284 								ConVar( char const *pName, char const *pDefaultValue, int flags, 
   285 									char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax );
   286 								ConVar( char const *pName, char const *pDefaultValue, int flags, 
   287 									char const *pHelpString, FnChangeCallback callback );
   288 								ConVar( char const *pName, char const *pDefaultValue, int flags, 
   289 									char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax,
   290 									FnChangeCallback callback );
   291 
   292 	virtual						~ConVar( void );
   293 
   294 	virtual bool				IsBitSet( int flag ) const;
   295 	virtual char const*			GetHelpText( void ) const;
   296 	virtual bool				IsRegistered( void ) const;
   297 	virtual char const			*GetName( void ) const;
   298 	virtual void				AddFlags( int flags );
   299 	virtual	bool				IsCommand( void ) const;
   300 
   301 	// Install a change callback (there shouldn't already be one....)
   302 	void InstallChangeCallback( FnChangeCallback callback );
   303 
   304 	// Retrieve value
   305 	FORCEINLINE_CVAR float			GetFloat( void ) const;
   306 	FORCEINLINE_CVAR int				GetInt( void ) const;
   307 	FORCEINLINE_CVAR bool			GetBool() const {  return !!GetInt(); }
   308 	FORCEINLINE_CVAR char const	   *GetString( void ) const;
   309 
   310 	// Any function that allocates/frees memory needs to be virtual or else you'll have crashes
   311 	//  from alloc/free across dll/exe boundaries.
   312 	
   313 	// These just call into the IConCommandBaseAccessor to check flags and set the var (which ends up calling InternalSetValue).
   314 	virtual void				SetValue( char const *value );
   315 	virtual void				SetValue( float value );
   316 	virtual void				SetValue( int value );
   317 	
   318 	// Reset to default value
   319 	void						Revert( void );
   320 
   321 	// True if it has a min/max setting
   322 	bool						GetMin( float& minVal ) const;
   323 	bool						GetMax( float& maxVal ) const;
   324 	char const					*GetDefault( void ) const;
   325 
   326 	static void					RevertAll( void );
   327 private:
   328 	// Called by CCvar when the value of a var is changing.
   329 	virtual void				InternalSetValue(char const *value);
   330 	// For CVARs marked FCVAR_NEVER_AS_STRING
   331 	virtual void				InternalSetFloatValue( float fNewValue );
   332 	virtual void				InternalSetIntValue( int nValue );
   333 
   334 	virtual bool				ClampValue( float& value );
   335 	virtual void				ChangeStringValue( char const *tempVal );
   336 
   337 	virtual void				Create( char const *pName, char const *pDefaultValue, int flags = 0,
   338 									char const *pHelpString = 0, bool bMin = false, float fMin = 0.0,
   339 									bool bMax = false, float fMax = false, FnChangeCallback callback = 0 );
   340 
   341 	// Used internally by OneTimeInit to initialize.
   342 	virtual void				Init();
   343 
   344 private:
   345 
   346 	// This either points to "this" or it points to the original declaration of a ConVar.
   347 	// This allows ConVars to exist in separate modules, and they all use the first one to be declared.
   348 	// m_pParent->m_pParent must equal m_pParent (ie: m_pParent must be the root, or original, ConVar).
   349 	ConVar						*m_pParent;
   350 
   351 	// Static data
   352 	char const					*m_pszDefaultValue;
   353 	
   354 	// Value
   355 	// Dynamically allocated
   356 	char						*m_pszString;
   357 	int							m_StringLength;
   358 
   359 	// Values
   360 	float						m_fValue;
   361 	int							m_nValue;
   362 
   363 	// Min/Max values
   364 	bool						m_bHasMin;
   365 	float						m_fMinVal;
   366 	bool						m_bHasMax;
   367 	float						m_fMaxVal;
   368 	
   369 	// Call this function when ConVar changes
   370 	FnChangeCallback			m_fnChangeCallback;
   371 public: // Hackalicous
   372 	inline FnChangeCallback	GetCallback() const
   373 	{
   374 		return m_fnChangeCallback;
   375 	}
   376 	inline void SetMin(bool set, float min=0.0)
   377 	{ 
   378 		m_bHasMin = set; 
   379 		m_fMinVal = min; 
   380 	}
   381 	inline void SetMax(bool set, float max=0.0)
   382 	{
   383 		m_bHasMax = set;
   384 		m_fMaxVal = max; 
   385 	}
   386 };
   387 
   388 
   389 //-----------------------------------------------------------------------------
   390 // Purpose: Return ConVar value as a float
   391 // Output : float
   392 //-----------------------------------------------------------------------------
   393 FORCEINLINE_CVAR float ConVar::GetFloat( void ) const
   394 {
   395 	return m_pParent->m_fValue;
   396 }
   397 
   398 //-----------------------------------------------------------------------------
   399 // Purpose: Return ConVar value as an int
   400 // Output : int
   401 //-----------------------------------------------------------------------------
   402 FORCEINLINE_CVAR int ConVar::GetInt( void ) const 
   403 {
   404 	return m_pParent->m_nValue;
   405 }
   406 
   407 
   408 //-----------------------------------------------------------------------------
   409 // Purpose: Return ConVar value as a string, return "" for bogus string pointer, etc.
   410 // Output : char const *
   411 //-----------------------------------------------------------------------------
   412 FORCEINLINE_CVAR char const *ConVar::GetString( void ) const 
   413 {
   414 	if ( m_nFlags & FCVAR_NEVER_AS_STRING )
   415 	{
   416 		return "FCVAR_NEVER_AS_STRING";
   417 	}
   418 
   419 	return ( m_pParent->m_pszString ) ? m_pParent->m_pszString : "";
   420 }
   421 
   422 
   423 #ifdef _STATIC_LINKED
   424 // identifies subsystem via piggybacking constructors with flags
   425 class G_ConCommand : public ConCommand
   426 {
   427 public:
   428 	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) {}
   429 };
   430 
   431 class C_ConCommand : public ConCommand
   432 {
   433 public:
   434 	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) {}
   435 };
   436 
   437 class M_ConCommand : public ConCommand
   438 {
   439 public:
   440 	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) {}
   441 };
   442 
   443 class S_ConCommand : public ConCommand
   444 {
   445 public:
   446 	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) {}
   447 };
   448 
   449 class D_ConCommand : public ConCommand
   450 {
   451 public:
   452 	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) {}
   453 };
   454 
   455 typedef void ( *G_FnChangeCallback )( G_ConVar *var, char const *pOldString );
   456 typedef void ( *C_FnChangeCallback )( C_ConVar *var, char const *pOldString );
   457 typedef void ( *M_FnChangeCallback )( M_ConVar *var, char const *pOldString );
   458 typedef void ( *S_FnChangeCallback )( S_ConVar *var, char const *pOldString );
   459 typedef void ( *D_FnChangeCallback )( D_ConVar *var, char const *pOldString );
   460 
   461 class G_ConVar : public ConVar
   462 {
   463 public:
   464 	G_ConVar( char const *pName, char const *pDefaultValue, int flags = 0) : ConVar(pName, pDefaultValue, flags|FCVAR_GAMEDLL) {}
   465 	G_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString ) : ConVar(pName, pDefaultValue, flags|FCVAR_GAMEDLL, pHelpString ) {}
   466 	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) {}
   467 	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 ) {}
   468 	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 ) {}
   469 };
   470 
   471 class C_ConVar : public ConVar
   472 {
   473 public:
   474 	C_ConVar( char const *pName, char const *pDefaultValue, int flags = 0) : ConVar(pName, pDefaultValue, flags|FCVAR_CLIENTDLL) {}
   475 	C_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString ) : ConVar(pName, pDefaultValue, flags|FCVAR_CLIENTDLL, pHelpString ) {}
   476 	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) {}
   477 	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 ) {}
   478 	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 ) {}
   479 };
   480 
   481 class M_ConVar : public ConVar
   482 {
   483 public:
   484 	M_ConVar( char const *pName, char const *pDefaultValue, int flags = 0) : ConVar(pName, pDefaultValue, flags|FCVAR_MATERIAL_SYSTEM) {}
   485 	M_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString ) : ConVar(pName, pDefaultValue, flags|FCVAR_MATERIAL_SYSTEM, pHelpString ) {}
   486 	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) {}
   487 	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 ) {}
   488 	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 ) {}
   489 };
   490 
   491 class S_ConVar : public ConVar
   492 {
   493 public:
   494 	S_ConVar( char const *pName, char const *pDefaultValue, int flags = 0) : ConVar(pName, pDefaultValue, flags|FCVAR_STUDIORENDER) {}
   495 	S_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString ) : ConVar(pName, pDefaultValue, flags|FCVAR_STUDIORENDER, pHelpString ) {}
   496 	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) {}
   497 	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 ) {}
   498 	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 ) {}
   499 };
   500 
   501 class D_ConVar : public ConVar
   502 {
   503 public:
   504 	D_ConVar( char const *pName, char const *pDefaultValue, int flags = 0) : ConVar(pName, pDefaultValue, flags|FCVAR_DATACACHE) {}
   505 	D_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString ) : ConVar(pName, pDefaultValue, flags|FCVAR_DATACACHE, pHelpString ) {}
   506 	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) {}
   507 	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 ) {}
   508 	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 ) {}
   509 };
   510 
   511 // redirect these declarations to their specific subsystem
   512 #ifdef GAME_DLL
   513 #define ConCommand	G_ConCommand
   514 #define ConVar		G_ConVar
   515 #endif
   516 #ifdef CLIENT_DLL
   517 #define ConCommand	C_ConCommand
   518 #define ConVar		C_ConVar
   519 #endif
   520 #ifdef MATERIALSYSTEM_DLL
   521 #define ConCommand	M_ConCommand
   522 #define ConVar		M_ConVar
   523 #endif
   524 #ifdef STUDIORENDER_DLL
   525 #define ConCommand	S_ConCommand
   526 #define ConVar		S_ConVar
   527 #endif
   528 #ifdef DATACACHE_DLL
   529 #define ConCommand	D_ConCommand
   530 #define ConVar		D_ConVar
   531 #endif
   532 #endif // _STATIC_LINKED
   533 
   534 //-----------------------------------------------------------------------------
   535 // Purpose: Utility to quicky generate a simple console command
   536 //-----------------------------------------------------------------------------
   537 #define CON_COMMAND( name, description ) \
   538    static void name(); \
   539    static ConCommand name##_command( #name, name, description ); \
   540    static void name()
   541 
   542 //-----------------------------------------------------------------------------
   543 // Purpose: Utility to quicky generate a simple console command
   544 //-----------------------------------------------------------------------------
   545 #define CON_COMMAND_F( name, description, flags ) \
   546    static void name(); \
   547    static ConCommand name##_command( #name, name, description, flags ); \
   548    static void name()
   549 
   550 
   551 #endif // CONVAR_H