Updated for latest hl2sdk-dota changes.
1 //========= Copyright � 1996-2005, Valve Corporation, All rights reserved. ============//
6 // $Date: 2006-08-13 06:34:30 -0500 (Sun, 13 Aug 2006) $
8 //-----------------------------------------------------------------------------
10 //=============================================================================//
18 #include "tier0/dbg.h"
21 #define FORCEINLINE_CVAR FORCEINLINE
23 #define FORCEINLINE_CVAR __inline__ FORCEINLINE
28 // The default, no flags at all
31 // Command to ConVars and ConCommands
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))
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
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
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
72 #define FCVAR_NOT_CONNECTED (1<<22) // cvar cannot be changed by a client that is connected to a server
74 #define FCVAR_ARCHIVE_XBOX (1<<24) // cvar written to config.cfg on the Xbox
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)
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
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;
99 // You don't have to instantiate one of these, just call its
100 // OneTimeInit function when your executable is initializing.
101 class ConCommandBaseMgr
104 // Call this ONCE when the executable starts up.
105 static void OneTimeInit( IConCommandBaseAccessor *pAccessor );
107 static bool Fixup( ConCommandBase* pConCommandBase );
109 static void PublishCommands( bool bForce );
114 // Called when a ConVar changes value
115 typedef void ( *FnChangeCallback )( ConVar *var, char const *pOldString );
117 // Called when a ConCommand needs to execute
118 typedef void ( *FnCommandCallback )( void );
120 #define COMMAND_COMPLETION_MAXITEMS 64
121 #define COMMAND_COMPLETION_ITEM_LENGTH 64
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 ] );
126 //-----------------------------------------------------------------------------
127 // Purpose: The base console invoked command/cvar interface
128 //-----------------------------------------------------------------------------
131 friend class ConCommandBaseMgr;
134 friend class ConCommand;
137 ConCommandBase( void );
138 ConCommandBase( char const *pName, char const *pHelpString = 0,
141 virtual ~ConCommandBase( void );
143 virtual bool IsCommand( void ) const;
146 virtual bool IsBitSet( int flag ) const;
148 virtual void AddFlags( int flags );
150 // Return name of cvar
151 virtual char const *GetName( void ) const;
153 // Return help text for cvar
154 virtual char const *GetHelpText( void ) const;
156 // Deal with next pointer
157 const ConCommandBase *GetNext( void ) const;
158 void SetNext( ConCommandBase *next );
160 virtual bool IsRegistered( void ) const;
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 );
170 virtual void Create( char const *pName, char const *pHelpString = 0,
173 // Used internally by OneTimeInit to initialize.
176 // Internal copy routine ( uses new operator from correct module )
177 char *CopyString( char const *from );
179 // Next ConVar in chain
180 ConCommandBase *m_pNext;
183 // Has the cvar been added to the global list?
187 char const *m_pszName;
188 char const *m_pszHelpString;
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;
199 // ConVars in this executable use this 'global' to access values.
200 static IConCommandBaseAccessor *s_pAccessor;
202 public: // Hackalicous
203 inline int GetFlags() const
207 inline void SetFlags(int flags)
213 //-----------------------------------------------------------------------------
214 // Purpose: The console invoked command
215 //-----------------------------------------------------------------------------
216 class ConCommand : public ConCommandBase
218 friend class ConCommandBaseMgr;
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;
229 typedef ConCommandBase BaseClass;
232 ConCommand( char const *pName, FnCommandCallback callback,
233 char const *pHelpString = 0, int flags = 0, FnCommandCompletionCallback completionFunc = 0 );
235 virtual ~ConCommand( void );
237 virtual bool IsCommand( void ) const;
239 virtual int AutoCompleteSuggest( char const *partial, char commands[ COMMAND_COMPLETION_MAXITEMS ][ COMMAND_COMPLETION_ITEM_LENGTH ] );
241 virtual bool CanAutoComplete( void );
243 // Invoke the function
244 virtual void Dispatch( void );
246 virtual void Create( char const *pName, FnCommandCallback callback,
247 char const *pHelpString = 0, int flags = 0, FnCommandCompletionCallback completionFunc = 0 );
249 // Call this function when executing the command
250 FnCommandCallback m_fnCommandCallback;
252 FnCommandCompletionCallback m_fnCompletionCallback;
253 bool m_bHasCompletionCallback;
254 public: // Hackalicous
255 inline FnCommandCallback GetCallback() const
257 return m_fnCommandCallback;
261 //-----------------------------------------------------------------------------
262 // Purpose: A console variable
263 //-----------------------------------------------------------------------------
264 class ConVar : public ConCommandBase
266 friend class ConCommandBaseMgr;
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;
278 typedef ConCommandBase BaseClass;
280 ConVar( char const *pName, char const *pDefaultValue, int flags = 0);
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 );
292 virtual ~ConVar( void );
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;
301 // Install a change callback (there shouldn't already be one....)
302 void InstallChangeCallback( FnChangeCallback callback );
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;
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.
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 );
318 // Reset to default value
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;
326 static void RevertAll( void );
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 );
334 virtual bool ClampValue( float& value );
335 virtual void ChangeStringValue( char const *tempVal );
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 );
341 // Used internally by OneTimeInit to initialize.
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).
352 char const *m_pszDefaultValue;
355 // Dynamically allocated
369 // Call this function when ConVar changes
370 FnChangeCallback m_fnChangeCallback;
371 public: // Hackalicous
372 inline FnChangeCallback GetCallback() const
374 return m_fnChangeCallback;
376 inline void SetMin(bool set, float min=0.0)
381 inline void SetMax(bool set, float max=0.0)
389 //-----------------------------------------------------------------------------
390 // Purpose: Return ConVar value as a float
392 //-----------------------------------------------------------------------------
393 FORCEINLINE_CVAR float ConVar::GetFloat( void ) const
395 return m_pParent->m_fValue;
398 //-----------------------------------------------------------------------------
399 // Purpose: Return ConVar value as an int
401 //-----------------------------------------------------------------------------
402 FORCEINLINE_CVAR int ConVar::GetInt( void ) const
404 return m_pParent->m_nValue;
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
414 if ( m_nFlags & FCVAR_NEVER_AS_STRING )
416 return "FCVAR_NEVER_AS_STRING";
419 return ( m_pParent->m_pszString ) ? m_pParent->m_pszString : "";
423 #ifdef _STATIC_LINKED
424 // identifies subsystem via piggybacking constructors with flags
425 class G_ConCommand : public ConCommand
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) {}
431 class C_ConCommand : public ConCommand
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) {}
437 class M_ConCommand : public ConCommand
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) {}
443 class S_ConCommand : public ConCommand
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) {}
449 class D_ConCommand : public ConCommand
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) {}
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 );
461 class G_ConVar : public ConVar
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 ) {}
471 class C_ConVar : public ConVar
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 ) {}
481 class M_ConVar : public ConVar
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 ) {}
491 class S_ConVar : public ConVar
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 ) {}
501 class D_ConVar : public ConVar
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 ) {}
511 // redirect these declarations to their specific subsystem
513 #define ConCommand G_ConCommand
514 #define ConVar G_ConVar
517 #define ConCommand C_ConCommand
518 #define ConVar C_ConVar
520 #ifdef MATERIALSYSTEM_DLL
521 #define ConCommand M_ConCommand
522 #define ConVar M_ConVar
524 #ifdef STUDIORENDER_DLL
525 #define ConCommand S_ConCommand
526 #define ConVar S_ConVar
529 #define ConCommand D_ConCommand
530 #define ConVar D_ConVar
532 #endif // _STATIC_LINKED
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 ); \
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 ); \