text: //========= Copyright Valve Corporation, All rights reserved. ============//
  //
  // Purpose: 
  //
  // $Workfile:     $
  // $Date:         $
  //
  //-----------------------------------------------------------------------------
  // $NoKeywords: $
  //===========================================================================//
  
  #ifndef ICONVAR_H
  #define ICONVAR_H
  
  #if _WIN32
  #pragma once
  #endif
  
  #include "tier0/dbg.h"
  #include "tier0/platform.h"
  #include "tier1/strtools.h"
  
  
  //-----------------------------------------------------------------------------
  // Forward declarations
  //-----------------------------------------------------------------------------
  class IConVar;
  class CCommand;
  
  
  //-----------------------------------------------------------------------------
  // ConVar flags
  //-----------------------------------------------------------------------------
  // The default, no flags at all
  #define FCVAR_NONE				0 
  
  // Command to ConVars and ConCommands
  // ConVar Systems
  #define FCVAR_UNREGISTERED		(1<<0)	// If this is set, don't add to linked list, etc.
  #define FCVAR_DEVELOPMENTONLY	(1<<1)	// Hidden in released products. Flag is removed automatically if ALLOW_DEVELOPMENT_CVARS is defined.
  #define FCVAR_GAMEDLL			(1<<2)	// defined by the game DLL
  #define FCVAR_CLIENTDLL			(1<<3)  // defined by the client DLL
  #define FCVAR_HIDDEN			(1<<4)	// Hidden. Doesn't appear in find or autocomplete. Like DEVELOPMENTONLY, but can't be compiled out.
  
  // ConVar only
  #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
  #define FCVAR_SPONLY			(1<<6)  // This cvar cannot be changed by clients connected to a multiplayer server.
  #define	FCVAR_ARCHIVE			(1<<7)	// set to cause it to be saved to vars.rc
  #define	FCVAR_NOTIFY			(1<<8)	// notifies players when changed
  #define	FCVAR_USERINFO			(1<<9)	// changes the client's info string
  #define FCVAR_CHEAT				(1<<14) // Only useable in singleplayer / debug / multiplayer & sv_cheats
  
  #define FCVAR_PRINTABLEONLY		(1<<10)  // This cvar's string cannot contain unprintable characters ( e.g., used for player name etc ).
  #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
  #define FCVAR_NEVER_AS_STRING	(1<<12)  // never try to print that cvar
  
  // It's a ConVar that's shared between the client and the server.
  // At signon, the values of all such ConVars are sent from the server to the client (skipped for local
  //  client, of course )
  // If a change is requested it must come from the console (i.e., no remote client changes)
  // If a value is changed while a server is active, it's replicated to all connected clients
  #define FCVAR_REPLICATED		(1<<13)	// server setting enforced on clients, TODO rename to FCAR_SERVER at some time
  #define FCVAR_DEMO				(1<<16)  // record this cvar when starting a demo file
  #define FCVAR_DONTRECORD		(1<<17)  // don't record these command in demofiles
  #define FCVAR_RELOAD_MATERIALS	(1<<20)	// If this cvar changes, it forces a material reload
  #define FCVAR_RELOAD_TEXTURES	(1<<21)	// If this cvar changes, if forces a texture reload
  
  #define FCVAR_NOT_CONNECTED		(1<<22)	// cvar cannot be changed by a client that is connected to a server
  #define FCVAR_MATERIAL_SYSTEM_THREAD (1<<23)	// Indicates this cvar is read from the material system thread
  #define FCVAR_ARCHIVE_XBOX		(1<<24) // cvar written to config.cfg on the Xbox
  
  #define FCVAR_ACCESSIBLE_FROM_THREADS	(1<<25)	// used as a debugging tool necessary to check material system thread convars
  
  #define FCVAR_SERVER_CAN_EXECUTE	(1<<28)// the server is allowed to execute this command on clients via ClientCommand/NET_StringCmd/CBaseClientState::ProcessStringCmd.
  #define FCVAR_SERVER_CANNOT_QUERY	(1<<29)// If this is set, then the server is not allowed to query this cvar's value (via IServerPluginHelpers::StartQueryCvarValue).
  #define FCVAR_CLIENTCMD_CAN_EXECUTE	(1<<30)	// IVEngineClient::ClientCmd is allowed to execute this command. 
  											// Note: IVEngineClient::ClientCmd_Unrestricted can run any client command.
  #define FCVAR_EXEC_DESPITE_DEFAULT	(1<<31) // -default causes a lot of commands to be ignored (but still be recorded as though they had run). 
  											// This causes them to be executed anyways.
  
  #define FCVAR_INTERNAL_USE		(1<<15)	// This var isn't archived, but is exposed to players--and its use is allowed in competitive play.
  #define FCVAR_ALLOWED_IN_COMPETITIVE	(1<<18) // This convar can be changed in competitive (strict) settings mode even though it is not archived. Meant for one-offs like cl_showfps that are not user facing settings but are benign
  // #define FCVAR_AVAILABLE			(1<<19)
  // #define FCVAR_AVAILABLE			(1<<26)
  // #define FCVAR_AVAILABLE			(1<<27)
  
  #define FCVAR_MATERIAL_THREAD_MASK ( FCVAR_RELOAD_MATERIALS | FCVAR_RELOAD_TEXTURES | FCVAR_MATERIAL_SYSTEM_THREAD )	
  
  //-----------------------------------------------------------------------------
  // Called when a ConVar changes value
  // NOTE: For FCVAR_NEVER_AS_STRING ConVars, pOldValue == NULL
  //-----------------------------------------------------------------------------
  typedef void ( *FnChangeCallback_t )( IConVar *var, const char *pOldValue, float flOldValue );
  
  
  //-----------------------------------------------------------------------------
  // Abstract interface for ConVars
  //-----------------------------------------------------------------------------
  abstract_class IConVar
  {
  public:
  	// Value set
  	virtual void SetValue( const char *pValue ) = 0;
  	virtual void SetValue( float flValue ) = 0;
  	virtual void SetValue( int nValue ) = 0;
  
  	// Return name of command
  	virtual const char *GetName( void ) const = 0;
  
  	// Accessors.. not as efficient as using GetState()/GetInfo()
  	// if you call these methods multiple times on the same IConVar
  	virtual bool IsFlagSet( int nFlag ) const = 0;
  };
  
  
  #endif // ICONVAR_H
  