1
0
mirror of https://github.com/alliedmodders/hl2sdk.git synced 2025-01-03 16:13:22 +08:00

Initial changes for Left 4 Dead 2.

* Added/removed various functions from the following interfaces: IVEngineServer, IServerGameDLL, IServerGameClients, IFilesystem, and IConVar
* Added new functions to ConVar for setting Color values
* Updated SendProp structure with unknown member
* Recompiled tier1 static library for Windows and Linux
* Fixed up some tier0 exports in public/tier0/dbg.h
* Rebuilt tier0 import libary for Windows
* Replaced tier0_i486.so and vstdlib_i486.so with the newly renamed versions: tier0_linux.so and vstdlib_linux.so

--HG--
rename : lib/linux/tier0_i486.so => lib/linux/tier0_linux.so
rename : lib/linux/vstdlib_i486.so => lib/linux/vstdlib_linux.so
This commit is contained in:
Scott Ehlert 2009-10-28 21:16:05 -05:00
parent cd122aa43b
commit f77a985f91
19 changed files with 105 additions and 97 deletions

Binary file not shown.

BIN
lib/linux/tier0_linux.so Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

BIN
lib/linux/vstdlib_linux.so Normal file

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@ -2,8 +2,8 @@
* About *
*********
This version of the Source SDK is meant only for compiling server plugins for
the engine that runs Valve's Left 4 Dead game. An official SDK is not yet
the engine that runs Valve's Left 4 Dead 2 game. An official SDK is not yet
available.
This is a modified version of the Orange Box SDK. Changes to it were reverse
engineered from the Left 4 Dead engine and game binaries.
engineered from the Left 4 Dead 2 engine and game binaries.

View File

@ -266,6 +266,8 @@ public:
private:
unsigned char m_Unknown2;
int m_Flags; // SPROP_ flags.
SendVarProxyFn m_ProxyFn; // NULL for DPT_DataTable.

View File

@ -91,6 +91,8 @@ public:
// Is in Hammer editing mode?
virtual int IsInEditMode( void ) = 0;
virtual KeyValues *GetLaunchOptions( void ) = 0;
// Add to the server/client lookup/precache table, the specified string is given a unique index
// NOTE: The indices for PrecacheModel are 1 based
// a 0 returned from those methods indicates the model or sound was not correctly precached
@ -202,7 +204,7 @@ public:
virtual void SetView( const edict_t *pClient, const edict_t *pViewent ) = 0;
// Get a high precision timer for doing profiling work
virtual float Time( void ) = 0;
virtual float OBSOLETE_Time( void ) = 0;
// Set the player's crosshair angle
virtual void CrosshairAngle( const edict_t *pClient, float pitch, float yaw ) = 0;
@ -295,7 +297,9 @@ public:
virtual const CBitVec<MAX_EDICTS>* GetEntityTransmitBitsForClient( int iClientIndex ) = 0;
// Is the game paused?
virtual bool IsPaused() = 0;
virtual bool IsPaused( void ) = 0;
virtual float GetTimescale( void ) const = 0;
// Marks the filename for consistency checking. This should be called after precaching the file.
virtual void ForceExactFile( const char *s ) = 0;
@ -344,10 +348,6 @@ public:
virtual int GetLightForPointListenServerOnly(const Vector &, bool, Vector *) = 0;
virtual int TraceLightingListenServerOnly(const Vector &, const Vector &, Vector *, Vector *) = 0;
// Matchmaking
virtual void MultiplayerEndGame() = 0;
virtual void ChangeTeam( const char *pTeamName ) = 0;
// Cleans up the cluster list
virtual void CleanUpEntityClusterList( PVSInfo_t *pPVSInfo ) = 0;
@ -376,6 +376,10 @@ public:
// Returns true if this client has been fully authenticated by Steam
virtual bool IsClientFullyAuthenticated( edict_t *pEdict ) = 0;
// This makes the host run 1 tick per frame instead of checking the system timer to see how many ticks to run in a certain frame.
// i.e. it does the same thing timedemo does.
virtual void SetDedicatedServerBenchmarkMode( bool bBenchmarkMode ) = 0;
virtual bool IsSplitScreenPlayer( int ) = 0;
virtual int GetSplitScreenPlayerAttachToEdict( int ) = 0;
virtual int GetNumSplitScreenUsersAttachedToEdict( int ) = 0;
@ -396,12 +400,21 @@ public:
virtual void Pause( bool, bool ) = 0;
virtual void SetTimescale( float ) = 0;
// Methods to set/get a gamestats data container so client & server running in same process can send combined data
virtual void SetGamestatsData( CGamestatsData *pGamestatsData ) = 0;
virtual CGamestatsData *GetGamestatsData() = 0;
// Returns the SteamID of the specified player. It'll be NULL if the player hasn't authenticated yet.
virtual const CSteamID *GetClientSteamID( edict_t *pPlayerEdict ) = 0;
virtual void HostValidateSession() = 0;
virtual void RefreshScreenIfNecessary() = 0;
virtual void *AllocLevelStaticDataName( unsigned int, const char * ) = 0;
virtual void ClientCommandKeyValues( edict_t *pEdict, KeyValues * ) = 0;
virtual int64 GetClientXUID( edict_t * ) = 0;
};
#define INTERFACEVERSION_SERVERGAMEDLL_VERSION_4 "ServerGameDLL004"
@ -474,6 +487,7 @@ public:
virtual void ReadRestoreHeaders( CSaveRestoreData * ) = 0;
virtual void Restore( CSaveRestoreData *, bool ) = 0;
virtual bool IsRestoring() = 0;
virtual bool SupportsSaveRestore() = 0;
// Returns the number of entities moved across the transition
virtual int CreateEntityTransitionList( CSaveRestoreData *, int ) = 0;
@ -512,9 +526,10 @@ public:
virtual void PostToolsInit( void ) = 0;
virtual void ApplyGameSettings( KeyValues * ) = 0;
virtual const char * GetGameModeConfigFile( int ) = 0;
virtual int GameGameModePlayerSlots( int ) = 0;
virtual void GetMatchmakingTags( char *, unsigned int ) = 0;
virtual void ServerHibernationUpdate( bool ) = 0;
virtual void GenerateLumpFileName( const char *, char *, int, int ) = 0;
virtual void *GetMatchmakingGameData( char *, unsigned int ) = 0;
};
//-----------------------------------------------------------------------------
@ -618,6 +633,8 @@ public:
virtual int GetMaxSplitscreenPlayers( void ) = 0;
virtual int GetMaxHumanPlayers( void ) = 0;
virtual void ClientCommandKeyValues( edict_t *pEdict, KeyValues * ) = 0;
};
#define INTERFACEVERSION_UPLOADGAMESTATS "ServerUploadGameStats001"

View File

@ -640,13 +640,10 @@ public:
NUM_PRELOAD_TYPES
};
virtual void LoadCompiledKeyValues( KeyValuesPreloadType_t type, char const *archiveFile ) = 0;
// If the "PreloadedData" hasn't been purged, then this'll try and instance the KeyValues using the fast path of compiled keyvalues loaded during startup.
// Otherwise, it'll just fall through to the regular KeyValues loading routines
virtual KeyValues *LoadKeyValues( KeyValuesPreloadType_t type, char const *filename, char const *pPathID = 0 ) = 0;
virtual bool LoadKeyValues( KeyValues& head, KeyValuesPreloadType_t type, char const *filename, char const *pPathID = 0 ) = 0;
virtual bool ExtractRootKeyName( KeyValuesPreloadType_t type, char *outbuf, size_t bufsize, char const *filename, char const *pPathID = 0 ) = 0;
virtual FSAsyncStatus_t AsyncWrite(const char *pFileName, const void *pSrc, int nSrcBytes, bool bFreeMemory, bool bAppend = false, FSAsyncControl_t *pControl = NULL ) = 0;
virtual FSAsyncStatus_t AsyncWriteFile(const char *pFileName, const CUtlBuffer *pSrc, int nSrcBytes, bool bFreeMemory, bool bAppend = false, FSAsyncControl_t *pControl = NULL ) = 0;
@ -746,7 +743,7 @@ public:
virtual FSDirtyDiskReportFunc_t GetDirtyDiskReportFunc( void ) = 0;
virtual int AddVPKFile( const char *file ) = 0;
virtual int AddVPKFile( const char *file, SearchPathAdd_t ) = 0;
};
//-----------------------------------------------------------------------------

View File

@ -188,13 +188,11 @@ public:
virtual void SetupPreloadData() {}
virtual void DiscardPreloadData() {}
virtual void LoadCompiledKeyValues( KeyValuesPreloadType_t type, char const *archiveFile ) { m_pFileSystemPassThru->LoadCompiledKeyValues( type, archiveFile ); }
// If the "PreloadedData" hasn't been purged, then this'll try and instance the KeyValues using the fast path of compiled keyvalues loaded during startup.
// Otherwise, it'll just fall through to the regular KeyValues loading routines
virtual KeyValues *LoadKeyValues( KeyValuesPreloadType_t type, char const *filename, char const *pPathID = 0 ) { return m_pFileSystemPassThru->LoadKeyValues( type, filename, pPathID ); }
virtual bool LoadKeyValues( KeyValues& head, KeyValuesPreloadType_t type, char const *filename, char const *pPathID = 0 ) { return m_pFileSystemPassThru->LoadKeyValues( head, type, filename, pPathID ); }
virtual bool ExtractRootKeyName( KeyValuesPreloadType_t type, char *outbuf, size_t bufsize, char const *filename, char const *pPathID = 0 ) { return m_pFileSystemPassThru->ExtractRootKeyName( type, outbuf, bufsize, filename, pPathID ); }
virtual bool GetFileTypeForFullPath( char const *pFullPath, wchar_t *buf, size_t bufSizeInBytes ) { return m_pFileSystemPassThru->GetFileTypeForFullPath( pFullPath, buf, bufSizeInBytes ); }
@ -236,7 +234,7 @@ public:
virtual void GetSearchPathID( char *a, int b ) { m_pFileSystemPassThru->GetSearchPathID(a, b); }
virtual bool FixupSearchPathsAfterInstall() { return m_pFileSystemPassThru->FixupSearchPathsAfterInstall(); }
virtual FSDirtyDiskReportFunc_t GetDirtyDiskReportFunc() { return m_pFileSystemPassThru->GetDirtyDiskReportFunc(); }
virtual int AddVPKFile( const char *file ) { return m_pFileSystemPassThru->AddVPKFile(file); }
virtual int AddVPKFile( const char *file, SearchPathAdd_t path ) { return m_pFileSystemPassThru->AddVPKFile(file, path); }
protected:
IFileSystem *m_pFileSystemPassThru;

View File

@ -75,13 +75,13 @@ public:
// Data access
virtual bool GetBool( const char *keyName = NULL, bool defaultValue = false ) = 0;
virtual int GetInt( const char *keyName = NULL, int defaultValue = 0 ) = 0;
virtual unsigned long long GetUint64 ( const char *keyName = NULL, unsigned long long defaultValue = 0) = 0;
virtual uint64 GetUint64 ( const char *keyName = NULL, unsigned long long defaultValue = 0) = 0;
virtual float GetFloat( const char *keyName = NULL, float defaultValue = 0.0f ) = 0;
virtual const char *GetString( const char *keyName = NULL, const char *defaultValue = "" ) = 0;
virtual void SetBool( const char *keyName, bool value ) = 0;
virtual void SetInt( const char *keyName, int value ) = 0;
virtual void SetUint64( const char *keyName, unsigned long long value ) = 0;
virtual void SetUint64( const char *keyName, uint64 value ) = 0;
virtual void SetFloat( const char *keyName, float value ) = 0;
virtual void SetString( const char *keyName, const char *value ) = 0;
};

View File

@ -69,11 +69,6 @@ public:
p##name->m_pMessageHandler = this; \
chan->RegisterMessage( p##name ); \
#define REGISTER_MM_MSG( name ) \
MM_##name * p##name = new MM_##name(); \
p##name->m_pMessageHandler = this; \
chan->RegisterMessage( p##name ); \
class NET_Tick;
class NET_StringCmd;
class NET_SetConVar;
@ -101,6 +96,7 @@ class CLC_RespondCvarValue;
class CLC_SplitPlayerConnect;
class CLC_FileCRCCheck;
class CLC_LoadingProgress;
class CLC_CmdKeyValues;
class IClientMessageHandler : public INetMessageHandler
{
@ -116,6 +112,7 @@ public:
PROCESS_CLC_MESSAGE( SplitPlayerConnect ) = 0;
PROCESS_CLC_MESSAGE( FileCRCCheck ) = 0;
PROCESS_CLC_MESSAGE( LoadingProgress ) = 0;
PROCESS_CLC_MESSAGE( CmdKeyValues ) = 0;
};
class SVC_Print;
@ -142,6 +139,7 @@ class SVC_Menu;
class SVC_GameEventList;
class SVC_GetCvarValue;
class SVC_SplitScreen;
class SVC_CmdKeyValues;
class IServerMessageHandler : public INetMessageHandler
{
@ -172,34 +170,7 @@ public:
PROCESS_SVC_MESSAGE( GameEventList ) = 0;
PROCESS_SVC_MESSAGE( GetCvarValue ) = 0;
PROCESS_SVC_MESSAGE( SplitScreen ) = 0;
};
class MM_Heartbeat;
class MM_ClientInfo;
class MM_ClientJoinRequest;
class MM_RegisterResponse;
class MM_Mutelist;
class MM_Checkpoint;
class MM_JoinResponse;
class MM_Migrate;
class MM_ClientChat;
class MM_ClientRequest;
class IMatchmakingMessageHandler : public INetMessageHandler
{
public:
virtual ~IMatchmakingMessageHandler( void ) {};
PROCESS_MM_MESSAGE( Heartbeat ) = 0;
PROCESS_MM_MESSAGE( ClientInfo ) = 0;
PROCESS_MM_MESSAGE( ClientJoinRequest ) = 0;
PROCESS_MM_MESSAGE( RegisterResponse ) = 0;
PROCESS_MM_MESSAGE( Mutelist ) = 0;
PROCESS_MM_MESSAGE( Checkpoint) = 0;
PROCESS_MM_MESSAGE( JoinResponse ) = 0;
PROCESS_MM_MESSAGE( Migrate ) = 0;
PROCESS_MM_MESSAGE( ClientChat ) = 0;
PROCESS_MM_MESSAGE( ClientRequest ) = 0;
PROCESS_SVC_MESSAGE( CmdKeyValues ) = 0;
};
class IConnectionlessPacketHandler

View File

@ -175,6 +175,7 @@ enum SpewRetval_t
SPEW_ABORT
};
#if 0
/* type of externally defined function used to display debug spew */
typedef SpewRetval_t (*SpewOutputFunc_t)( SpewType_t spewType, const tchar *pMsg );
@ -198,6 +199,9 @@ DBG_INTERFACE void _SpewInfo( SpewType_t type, const tchar* pFile, int line );
DBG_INTERFACE SpewRetval_t _SpewMessage( const tchar* pMsg, ... );
DBG_INTERFACE SpewRetval_t _DSpewMessage( const tchar *pGroupName, int level, const tchar* pMsg, ... );
DBG_INTERFACE SpewRetval_t ColorSpewMessage( SpewType_t type, const Color *pColor, const tchar* pMsg, ... );
#endif
DBG_INTERFACE int LoggingSystem_LogAssert( const tchar *pMsg, ... );
DBG_INTERFACE void _ExitOnFatalAssert( const tchar* pFile, int line );
DBG_INTERFACE bool ShouldUseNewAssertDialog();
@ -212,10 +216,9 @@ DBG_INTERFACE bool DoNewAssertDialog( const tchar *pFile, int line, const tchar
do { \
if (!(_exp)) \
{ \
_SpewInfo( SPEW_ASSERT, __TFILE__, __LINE__ ); \
SpewRetval_t ret = _SpewMessage("%s", _msg); \
int ret = LoggingSystem_LogAssert("%s", _msg); \
_executeExp; \
if ( ret == SPEW_DEBUGGER) \
if ( ret ) \
{ \
if ( !ShouldUseNewAssertDialog() || DoNewAssertDialog( __TFILE__, __LINE__, _msg ) ) \
DebuggerBreak(); \
@ -345,24 +348,13 @@ DBG_INTERFACE bool DoNewAssertDialog( const tchar *pFile, int line, const tchar
/* These are always compiled in */
DBG_INTERFACE void Msg( const tchar* pMsg, ... );
DBG_INTERFACE void DMsg( const tchar *pGroupName, int level, const tchar *pMsg, ... );
DBG_INTERFACE void Warning( const tchar *pMsg, ... );
DBG_INTERFACE void DWarning( const tchar *pGroupName, int level, const tchar *pMsg, ... );
DBG_INTERFACE void Log( const tchar *pMsg, ... );
DBG_INTERFACE void DLog( const tchar *pGroupName, int level, const tchar *pMsg, ... );
DBG_INTERFACE void Error( const tchar *pMsg, ... );
#else
inline void Msg( ... ) {}
inline void DMsg( ... ) {}
inline void Warning( const tchar *pMsg, ... ) {}
inline void DWarning( ... ) {}
inline void Log( ... ) {}
inline void DLog( ... ) {}
inline void Error( ... ) {}
#endif
@ -386,48 +378,25 @@ inline void Error( ... ) {}
/* These looked at the "developer" group */
DBG_INTERFACE void DevMsg( int level, const tchar* pMsg, ... );
DBG_INTERFACE void DevWarning( int level, const tchar *pMsg, ... );
DBG_INTERFACE void DevLog( int level, const tchar *pMsg, ... );
/* default level versions (level 1) */
DBG_OVERLOAD void DevMsg( const tchar* pMsg, ... );
DBG_OVERLOAD void DevWarning( const tchar *pMsg, ... );
DBG_OVERLOAD void DevLog( const tchar *pMsg, ... );
/* These looked at the "console" group */
DBG_INTERFACE void ConColorMsg( int level, const Color& clr, const tchar* pMsg, ... );
DBG_INTERFACE void ConMsg( int level, const tchar* pMsg, ... );
DBG_INTERFACE void ConWarning( int level, const tchar *pMsg, ... );
DBG_INTERFACE void ConLog( int level, const tchar *pMsg, ... );
/* default console version (level 1) */
DBG_OVERLOAD void ConColorMsg( const Color& clr, const tchar* pMsg, ... );
DBG_OVERLOAD void ConMsg( const tchar* pMsg, ... );
DBG_OVERLOAD void ConWarning( const tchar *pMsg, ... );
DBG_OVERLOAD void ConLog( const tchar *pMsg, ... );
/* developer console version (level 2) */
DBG_INTERFACE void ConDColorMsg( const Color& clr, const tchar* pMsg, ... );
DBG_INTERFACE void ConDMsg( const tchar* pMsg, ... );
DBG_INTERFACE void ConDWarning( const tchar *pMsg, ... );
DBG_INTERFACE void ConDLog( const tchar *pMsg, ... );
/* These looked at the "network" group */
DBG_INTERFACE void NetMsg( int level, const tchar* pMsg, ... );
DBG_INTERFACE void NetWarning( int level, const tchar *pMsg, ... );
DBG_INTERFACE void NetLog( int level, const tchar *pMsg, ... );
void ValidateSpew( class CValidator &validator );
#else
inline void DevMsg( ... ) {}
inline void DevWarning( ... ) {}
inline void DevLog( ... ) {}
inline void ConColorMsg( ... ) {}
inline void ConMsg( ... ) {}
inline void ConLog( ... ) {}
inline void NetMsg( ... ) {}
inline void NetWarning( ... ) {}
inline void NetLog( ... ) {}
inline void ConDMsg( ... ) {}
#endif

View File

@ -21,6 +21,7 @@
#include "tier1/utlvector.h"
#include "tier1/utlstring.h"
#include "icvar.h"
#include "Color.h"
#ifdef _WIN32
#define FORCEINLINE_CVAR FORCEINLINE
@ -362,6 +363,7 @@ public:
FORCEINLINE_CVAR int GetInt( void ) const;
FORCEINLINE_CVAR bool GetBool() const { return !!GetInt(); }
FORCEINLINE_CVAR char const *GetString( void ) const;
FORCEINLINE_CVAR Color GetColor ( void ) const;
// Used internally by OneTimeInit to initialize.
virtual void Init();
@ -376,6 +378,7 @@ public:
virtual void SetValue( const char *value );
virtual void SetValue( float value );
virtual void SetValue( int value );
virtual void SetValue( Color value );
// Reset to default value
void Revert( void );
@ -391,6 +394,7 @@ private:
// For CVARs marked FCVAR_NEVER_AS_STRING
virtual void InternalSetFloatValue( float fNewValue );
virtual void InternalSetIntValue( int nValue );
virtual void InternalSetColorValue( Color cValue );
virtual bool ClampValue( float& value );
virtual void ChangeStringValue( const char *tempVal, float flOldValue );
@ -460,6 +464,18 @@ FORCEINLINE_CVAR const char *ConVar::GetString( void ) const
return ( m_pParent->m_pszString ) ? m_pParent->m_pszString : "";
}
//-----------------------------------------------------------------------------
// Purpose: Return ConVar value as a Color
// Output : int
//-----------------------------------------------------------------------------
FORCEINLINE_CVAR Color ConVar::GetColor( void ) const
{
Color color = Color();
color.SetRawColor(m_pParent->m_nValue);
return color;
}
//-----------------------------------------------------------------------------
// Used to read/write convars that already exist (replaces the FindVar method)
@ -481,11 +497,13 @@ public:
int GetInt( void ) const;
bool GetBool() const { return !!GetInt(); }
const char *GetString( void ) const;
Color GetColor( void ) const;
void SetValue( const char *pValue );
void SetValue( float flValue );
void SetValue( int nValue );
void SetValue( bool bValue );
void SetValue( Color cValue );
const char *GetName() const;
@ -542,6 +560,16 @@ FORCEINLINE_CVAR const char *ConVarRef::GetString( void ) const
return m_pConVarState->m_pszString;
}
//-----------------------------------------------------------------------------
// Purpose: Return ConVar value as a Color
//-----------------------------------------------------------------------------
FORCEINLINE_CVAR Color ConVarRef::GetColor( void ) const
{
Color color = Color();
color.SetRawColor(m_pConVarState->m_nValue);
return color;
}
FORCEINLINE_CVAR void ConVarRef::SetValue( const char *pValue )
{
@ -563,6 +591,11 @@ FORCEINLINE_CVAR void ConVarRef::SetValue( bool bValue )
m_pConVar->SetValue( bValue ? 1 : 0 );
}
FORCEINLINE_CVAR void ConVarRef::SetValue( Color cValue )
{
m_pConVar->SetValue( cValue );
}
FORCEINLINE_CVAR const char *ConVarRef::GetDefault() const
{
return m_pConVarState->m_pszDefaultValue;

View File

@ -101,6 +101,7 @@ public:
virtual void SetValue( const char *pValue ) = 0;
virtual void SetValue( float flValue ) = 0;
virtual void SetValue( int nValue ) = 0;
virtual void SetValue( Color cValue ) = 0;
// Return name of command
virtual const char *GetName( void ) const = 0;

View File

@ -251,10 +251,9 @@ protected:
do { \
if (!(_exp)) \
{ \
_SpewInfo( SPEW_ASSERT, __TFILE__, __LINE__ ); \
SpewRetval_t ret = _SpewMessage(_msg); \
int ret = LoggingSystem_LogAssert("%s", _msg); \
_executeExp; \
if ( ret == SPEW_DEBUGGER) \
if ( ret ) \
{ \
if ( !ShouldUseNewAssertDialog() || DoNewAssertDialog( __TFILE__, __LINE__, _msg ) ) \
DebuggerBreak(); \

View File

@ -925,6 +925,16 @@ void ConVar::InternalSetIntValue( int nValue )
}
}
//-----------------------------------------------------------------------------
// Purpose:
// Input : *value -
//-----------------------------------------------------------------------------
void ConVar::InternalSetColorValue( Color cValue )
{
int color = cValue.GetRawColor();
InternalSetIntValue( color );
}
//-----------------------------------------------------------------------------
// Purpose: Private creation
//-----------------------------------------------------------------------------
@ -999,6 +1009,16 @@ void ConVar::SetValue( int value )
var->InternalSetIntValue( value );
}
//-----------------------------------------------------------------------------
// Purpose:
// Input : value -
//-----------------------------------------------------------------------------
void ConVar::SetValue( Color value )
{
ConVar *var = ( ConVar * )m_pParent;
var->InternalSetColorValue( value );
}
//-----------------------------------------------------------------------------
// Purpose: Reset to default value
//-----------------------------------------------------------------------------
@ -1052,6 +1072,7 @@ public:
virtual void SetValue( const char *pValue ) {}
virtual void SetValue( float flValue ) {}
virtual void SetValue( int nValue ) {}
virtual void SetValue( Color cValue ) {}
virtual const char *GetName( void ) const { return ""; }
virtual bool IsFlagSet( int nFlags ) const { return false; }
};