core/convar_sm.h
author David Anderson <dvander@alliedmods.net>
Fri Feb 16 03:47:10 2007 +0000 (2007-02-16)
changeset 501 e209a7296936
parent 457 9b8a85bf4175
child 714 93b19876407e
permissions -rw-r--r--
removed this potential feature, not useful enough
     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 	int GetFlags()				{ return m_nFlags; }
   204 	void SetFlags(int flags)	{ m_nFlags = flags; }
   205 };
   206 
   207 //-----------------------------------------------------------------------------
   208 // Purpose: The console invoked command
   209 //-----------------------------------------------------------------------------
   210 class ConCommand : public ConCommandBase
   211 {
   212 friend class ConCommandBaseMgr;
   213 friend class CCvar;
   214 #ifdef _STATIC_LINKED
   215 friend class G_ConCommand;
   216 friend class C_ConCommand;
   217 friend class M_ConCommand;
   218 friend class S_ConCommand;
   219 friend class D_ConCommand;
   220 #endif
   221 
   222 public:
   223 	typedef ConCommandBase BaseClass;
   224 
   225 								ConCommand( void );
   226 								ConCommand( char const *pName, FnCommandCallback callback, 
   227 									char const *pHelpString = 0, int flags = 0, FnCommandCompletionCallback completionFunc = 0 );
   228 
   229 	virtual						~ConCommand( void );
   230 
   231 	virtual	bool				IsCommand( void ) const;
   232 
   233 	virtual int					AutoCompleteSuggest( char const *partial, char commands[ COMMAND_COMPLETION_MAXITEMS ][ COMMAND_COMPLETION_ITEM_LENGTH ] );
   234 
   235 	virtual bool				CanAutoComplete( void );
   236 
   237 	// Invoke the function
   238 	virtual void				Dispatch( void );
   239 private:
   240 	virtual void				Create( char const *pName, FnCommandCallback callback, 
   241 									char const *pHelpString = 0, int flags = 0, FnCommandCompletionCallback completionFunc = 0 );
   242 
   243 	// Call this function when executing the command
   244 	FnCommandCallback			m_fnCommandCallback;
   245 
   246 	FnCommandCompletionCallback	m_fnCompletionCallback;
   247 	bool						m_bHasCompletionCallback;
   248 public: // Hackalicous
   249 	FnCommandCallback			GetCallback() { return m_fnCommandCallback; }
   250 };
   251 
   252 //-----------------------------------------------------------------------------
   253 // Purpose: A console variable
   254 //-----------------------------------------------------------------------------
   255 class ConVar : public ConCommandBase
   256 {
   257 friend class ConCommandBaseMgr;
   258 friend class CCvar;
   259 friend class CDefaultCvar;
   260 #ifdef _STATIC_LINKED
   261 friend class G_ConVar;
   262 friend class C_ConVar;
   263 friend class M_ConVar;
   264 friend class S_ConVar;
   265 friend class D_ConVar;
   266 #endif
   267 
   268 public:
   269 	typedef ConCommandBase BaseClass;
   270 
   271 								ConVar( char const *pName, char const *pDefaultValue, int flags = 0);
   272 
   273 								ConVar( char const *pName, char const *pDefaultValue, int flags, 
   274 									char const *pHelpString );
   275 								ConVar( char const *pName, char const *pDefaultValue, int flags, 
   276 									char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax );
   277 								ConVar( char const *pName, char const *pDefaultValue, int flags, 
   278 									char const *pHelpString, FnChangeCallback callback );
   279 								ConVar( char const *pName, char const *pDefaultValue, int flags, 
   280 									char const *pHelpString, bool bMin, float fMin, bool bMax, float fMax,
   281 									FnChangeCallback callback );
   282 
   283 	virtual						~ConVar( void );
   284 
   285 	virtual bool				IsBitSet( int flag ) const;
   286 	virtual char const*			GetHelpText( void ) const;
   287 	virtual bool				IsRegistered( void ) const;
   288 	virtual char const			*GetName( void ) const;
   289 	virtual void				AddFlags( int flags );
   290 	virtual	bool				IsCommand( void ) const;
   291 
   292 	// Install a change callback (there shouldn't already be one....)
   293 	void InstallChangeCallback( FnChangeCallback callback );
   294 
   295 	// Retrieve value
   296 	FORCEINLINE_CVAR float			GetFloat( void ) const;
   297 	FORCEINLINE_CVAR int				GetInt( void ) const;
   298 	FORCEINLINE_CVAR bool			GetBool() const {  return !!GetInt(); }
   299 	FORCEINLINE_CVAR char const	   *GetString( void ) const;
   300 
   301 	// Any function that allocates/frees memory needs to be virtual or else you'll have crashes
   302 	//  from alloc/free across dll/exe boundaries.
   303 	
   304 	// These just call into the IConCommandBaseAccessor to check flags and set the var (which ends up calling InternalSetValue).
   305 	virtual void				SetValue( char const *value );
   306 	virtual void				SetValue( float value );
   307 	virtual void				SetValue( int value );
   308 	
   309 	// Reset to default value
   310 	void						Revert( void );
   311 
   312 	// True if it has a min/max setting
   313 	bool						GetMin( float& minVal ) const;
   314 	bool						GetMax( float& maxVal ) const;
   315 	char const					*GetDefault( void ) const;
   316 
   317 	static void					RevertAll( void );
   318 private:
   319 	// Called by CCvar when the value of a var is changing.
   320 	virtual void				InternalSetValue(char const *value);
   321 	// For CVARs marked FCVAR_NEVER_AS_STRING
   322 	virtual void				InternalSetFloatValue( float fNewValue );
   323 	virtual void				InternalSetIntValue( int nValue );
   324 
   325 	virtual bool				ClampValue( float& value );
   326 	virtual void				ChangeStringValue( char const *tempVal );
   327 
   328 	virtual void				Create( char const *pName, char const *pDefaultValue, int flags = 0,
   329 									char const *pHelpString = 0, bool bMin = false, float fMin = 0.0,
   330 									bool bMax = false, float fMax = false, FnChangeCallback callback = 0 );
   331 
   332 	// Used internally by OneTimeInit to initialize.
   333 	virtual void				Init();
   334 
   335 private:
   336 
   337 	// This either points to "this" or it points to the original declaration of a ConVar.
   338 	// This allows ConVars to exist in separate modules, and they all use the first one to be declared.
   339 	// m_pParent->m_pParent must equal m_pParent (ie: m_pParent must be the root, or original, ConVar).
   340 	ConVar						*m_pParent;
   341 
   342 	// Static data
   343 	char const					*m_pszDefaultValue;
   344 	
   345 	// Value
   346 	// Dynamically allocated
   347 	char						*m_pszString;
   348 	int							m_StringLength;
   349 
   350 	// Values
   351 	float						m_fValue;
   352 	int							m_nValue;
   353 
   354 	// Min/Max values
   355 	bool						m_bHasMin;
   356 	float						m_fMinVal;
   357 	bool						m_bHasMax;
   358 	float						m_fMaxVal;
   359 	
   360 	// Call this function when ConVar changes
   361 	FnChangeCallback			m_fnChangeCallback;
   362 public: // Hackalicous
   363 	FnChangeCallback			GetCallback() { return m_fnChangeCallback; }
   364 };
   365 
   366 
   367 //-----------------------------------------------------------------------------
   368 // Purpose: Return ConVar value as a float
   369 // Output : float
   370 //-----------------------------------------------------------------------------
   371 FORCEINLINE_CVAR float ConVar::GetFloat( void ) const
   372 {
   373 	return m_pParent->m_fValue;
   374 }
   375 
   376 //-----------------------------------------------------------------------------
   377 // Purpose: Return ConVar value as an int
   378 // Output : int
   379 //-----------------------------------------------------------------------------
   380 FORCEINLINE_CVAR int ConVar::GetInt( void ) const 
   381 {
   382 	return m_pParent->m_nValue;
   383 }
   384 
   385 
   386 //-----------------------------------------------------------------------------
   387 // Purpose: Return ConVar value as a string, return "" for bogus string pointer, etc.
   388 // Output : char const *
   389 //-----------------------------------------------------------------------------
   390 FORCEINLINE_CVAR char const *ConVar::GetString( void ) const 
   391 {
   392 	if ( m_nFlags & FCVAR_NEVER_AS_STRING )
   393 	{
   394 		return "FCVAR_NEVER_AS_STRING";
   395 	}
   396 
   397 	return ( m_pParent->m_pszString ) ? m_pParent->m_pszString : "";
   398 }
   399 
   400 
   401 #ifdef _STATIC_LINKED
   402 // identifies subsystem via piggybacking constructors with flags
   403 class G_ConCommand : public ConCommand
   404 {
   405 public:
   406 	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) {}
   407 };
   408 
   409 class C_ConCommand : public ConCommand
   410 {
   411 public:
   412 	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) {}
   413 };
   414 
   415 class M_ConCommand : public ConCommand
   416 {
   417 public:
   418 	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) {}
   419 };
   420 
   421 class S_ConCommand : public ConCommand
   422 {
   423 public:
   424 	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) {}
   425 };
   426 
   427 class D_ConCommand : public ConCommand
   428 {
   429 public:
   430 	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) {}
   431 };
   432 
   433 typedef void ( *G_FnChangeCallback )( G_ConVar *var, char const *pOldString );
   434 typedef void ( *C_FnChangeCallback )( C_ConVar *var, char const *pOldString );
   435 typedef void ( *M_FnChangeCallback )( M_ConVar *var, char const *pOldString );
   436 typedef void ( *S_FnChangeCallback )( S_ConVar *var, char const *pOldString );
   437 typedef void ( *D_FnChangeCallback )( D_ConVar *var, char const *pOldString );
   438 
   439 class G_ConVar : public ConVar
   440 {
   441 public:
   442 	G_ConVar( char const *pName, char const *pDefaultValue, int flags = 0) : ConVar(pName, pDefaultValue, flags|FCVAR_GAMEDLL) {}
   443 	G_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString ) : ConVar(pName, pDefaultValue, flags|FCVAR_GAMEDLL, pHelpString ) {}
   444 	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) {}
   445 	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 ) {}
   446 	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 ) {}
   447 };
   448 
   449 class C_ConVar : public ConVar
   450 {
   451 public:
   452 	C_ConVar( char const *pName, char const *pDefaultValue, int flags = 0) : ConVar(pName, pDefaultValue, flags|FCVAR_CLIENTDLL) {}
   453 	C_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString ) : ConVar(pName, pDefaultValue, flags|FCVAR_CLIENTDLL, pHelpString ) {}
   454 	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) {}
   455 	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 ) {}
   456 	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 ) {}
   457 };
   458 
   459 class M_ConVar : public ConVar
   460 {
   461 public:
   462 	M_ConVar( char const *pName, char const *pDefaultValue, int flags = 0) : ConVar(pName, pDefaultValue, flags|FCVAR_MATERIAL_SYSTEM) {}
   463 	M_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString ) : ConVar(pName, pDefaultValue, flags|FCVAR_MATERIAL_SYSTEM, pHelpString ) {}
   464 	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) {}
   465 	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 ) {}
   466 	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 ) {}
   467 };
   468 
   469 class S_ConVar : public ConVar
   470 {
   471 public:
   472 	S_ConVar( char const *pName, char const *pDefaultValue, int flags = 0) : ConVar(pName, pDefaultValue, flags|FCVAR_STUDIORENDER) {}
   473 	S_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString ) : ConVar(pName, pDefaultValue, flags|FCVAR_STUDIORENDER, pHelpString ) {}
   474 	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) {}
   475 	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 ) {}
   476 	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 ) {}
   477 };
   478 
   479 class D_ConVar : public ConVar
   480 {
   481 public:
   482 	D_ConVar( char const *pName, char const *pDefaultValue, int flags = 0) : ConVar(pName, pDefaultValue, flags|FCVAR_DATACACHE) {}
   483 	D_ConVar( char const *pName, char const *pDefaultValue, int flags, char const *pHelpString ) : ConVar(pName, pDefaultValue, flags|FCVAR_DATACACHE, pHelpString ) {}
   484 	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) {}
   485 	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 ) {}
   486 	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 ) {}
   487 };
   488 
   489 // redirect these declarations to their specific subsystem
   490 #ifdef GAME_DLL
   491 #define ConCommand	G_ConCommand
   492 #define ConVar		G_ConVar
   493 #endif
   494 #ifdef CLIENT_DLL
   495 #define ConCommand	C_ConCommand
   496 #define ConVar		C_ConVar
   497 #endif
   498 #ifdef MATERIALSYSTEM_DLL
   499 #define ConCommand	M_ConCommand
   500 #define ConVar		M_ConVar
   501 #endif
   502 #ifdef STUDIORENDER_DLL
   503 #define ConCommand	S_ConCommand
   504 #define ConVar		S_ConVar
   505 #endif
   506 #ifdef DATACACHE_DLL
   507 #define ConCommand	D_ConCommand
   508 #define ConVar		D_ConVar
   509 #endif
   510 #endif // _STATIC_LINKED
   511 
   512 //-----------------------------------------------------------------------------
   513 // Purpose: Utility to quicky generate a simple console command
   514 //-----------------------------------------------------------------------------
   515 #define CON_COMMAND( name, description ) \
   516    static void name(); \
   517    static ConCommand name##_command( #name, name, description ); \
   518    static void name()
   519 
   520 //-----------------------------------------------------------------------------
   521 // Purpose: Utility to quicky generate a simple console command
   522 //-----------------------------------------------------------------------------
   523 #define CON_COMMAND_F( name, description, flags ) \
   524    static void name(); \
   525    static ConCommand name##_command( #name, name, description, flags ); \
   526    static void name()
   527 
   528 
   529 #endif // CONVAR_H