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