mirror of
https://github.com/alliedmodders/hl2sdk.git
synced 2025-09-19 20:16:10 +08:00
Update ICvar interface
This commit is contained in:
@ -18,6 +18,7 @@
|
|||||||
#include "tier0/memalloc.h"
|
#include "tier0/memalloc.h"
|
||||||
#include "convar.h"
|
#include "convar.h"
|
||||||
#include <cstdint>
|
#include <cstdint>
|
||||||
|
#include <functional>
|
||||||
|
|
||||||
// Shorthand helper to iterate registered convars
|
// Shorthand helper to iterate registered convars
|
||||||
// Example usage:
|
// Example usage:
|
||||||
@ -42,10 +43,12 @@
|
|||||||
struct ConVarSnapshot_t;
|
struct ConVarSnapshot_t;
|
||||||
class KeyValues;
|
class KeyValues;
|
||||||
|
|
||||||
|
typedef std::function<void( FnGenericChangeCallbackProvider_t, FnGenericChangeCallback_t )> FnCvarCallbacksReader_t;
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// Called when a ConVar changes value
|
// Called when a ConVar changes value
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
typedef void(*FnChangeCallbackGlobal_t)(ConVarRefAbstract* ref, CSplitScreenSlot nSlot, const char *pNewValue, const char *pOldValue);
|
typedef void(*FnChangeCallbackGlobal_t)(ConVarRefAbstract* ref, CSplitScreenSlot nSlot, const char *pNewValue, const char *pOldValue, void *__unk01);
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------
|
//-----------------------------------------------------------------------------
|
||||||
// ConVar & ConCommand creation listener callbacks
|
// ConVar & ConCommand creation listener callbacks
|
||||||
@ -67,7 +70,10 @@ public:
|
|||||||
virtual ConVarRef FindConVar( const char *name, bool allow_defensive = false ) = 0;
|
virtual ConVarRef FindConVar( const char *name, bool allow_defensive = false ) = 0;
|
||||||
virtual ConVarRef FindFirstConVar() = 0;
|
virtual ConVarRef FindFirstConVar() = 0;
|
||||||
virtual ConVarRef FindNextConVar( ConVarRef prev ) = 0;
|
virtual ConVarRef FindNextConVar( ConVarRef prev ) = 0;
|
||||||
virtual void CallChangeCallback( ConVarRef cvar, const CSplitScreenSlot nSlot, const CVValue_t* pNewValue, const CVValue_t* pOldValue ) = 0;
|
|
||||||
|
virtual void CallChangeCallback( ConVarRef cvar, const CSplitScreenSlot nSlot, const CVValue_t* pNewValue, const CVValue_t* pOldValue, void *__unk01 = nullptr ) = 0;
|
||||||
|
// Would call cb for every change callback defined for this cvar
|
||||||
|
virtual void IterateConVarCallbacks( ConVarRef cvar, FnCvarCallbacksReader_t cb ) = 0;
|
||||||
|
|
||||||
// allow_defensive - Allows finding commands with FCVAR_DEFENSIVE flag
|
// allow_defensive - Allows finding commands with FCVAR_DEFENSIVE flag
|
||||||
virtual ConCommandRef FindConCommand( const char *name, bool allow_defensive = false ) = 0;
|
virtual ConCommandRef FindConCommand( const char *name, bool allow_defensive = false ) = 0;
|
||||||
@ -78,7 +84,7 @@ public:
|
|||||||
// Install a global change callback (to be called when any convar changes)
|
// Install a global change callback (to be called when any convar changes)
|
||||||
virtual void InstallGlobalChangeCallback( FnChangeCallbackGlobal_t callback ) = 0;
|
virtual void InstallGlobalChangeCallback( FnChangeCallbackGlobal_t callback ) = 0;
|
||||||
virtual void RemoveGlobalChangeCallback( FnChangeCallbackGlobal_t callback ) = 0;
|
virtual void RemoveGlobalChangeCallback( FnChangeCallbackGlobal_t callback ) = 0;
|
||||||
virtual void CallGlobalChangeCallbacks( ConVarRefAbstract* ref, CSplitScreenSlot nSlot, const char* newValue, const char* oldValue ) = 0;
|
virtual void CallGlobalChangeCallbacks( ConVarRefAbstract* ref, CSplitScreenSlot nSlot, const char* newValue, const char* oldValue, void *__unk01 = nullptr ) = 0;
|
||||||
|
|
||||||
// Reverts cvars to default values which contain a specific flag,
|
// Reverts cvars to default values which contain a specific flag,
|
||||||
// cvars with a flag FCVAR_COMMANDLINE_ENFORCED would be skipped
|
// cvars with a flag FCVAR_COMMANDLINE_ENFORCED would be skipped
|
||||||
@ -107,6 +113,12 @@ public:
|
|||||||
// that have FCVAR_DEFENSIVE set
|
// that have FCVAR_DEFENSIVE set
|
||||||
virtual void StripDevelopmentFlags() = 0;
|
virtual void StripDevelopmentFlags() = 0;
|
||||||
|
|
||||||
|
// Returns total bytesize needed to store all the FCVAR_USERINFO cvar values
|
||||||
|
virtual int GetTotalUserInfoCvarsByteSize() = 0;
|
||||||
|
// Copies default values of all cvars which have FCVAR_USERINFO flag to the buffer in a byte range from->to
|
||||||
|
// if copy_or_cleanup is true, if false would cleanup the buffer
|
||||||
|
virtual void CopyUserInfoCvarDefaults( uint8* buffer, int from, int to, bool copy_or_cleanup ) = 0;
|
||||||
|
|
||||||
// Register, unregister vars
|
// Register, unregister vars
|
||||||
virtual void RegisterConVar( const ConVarCreation_t& setup, uint64 nAdditionalFlags, ConVarRef* pCvarRef, ConVarData** pCvarData ) = 0;
|
virtual void RegisterConVar( const ConVarCreation_t& setup, uint64 nAdditionalFlags, ConVarRef* pCvarRef, ConVarData** pCvarData ) = 0;
|
||||||
// Unregisters convar change callback, but leaves the convar in the lists,
|
// Unregisters convar change callback, but leaves the convar in the lists,
|
||||||
@ -126,7 +138,7 @@ public:
|
|||||||
virtual ConCommandData* GetConCommandData( ConCommandRef cmd ) = 0;
|
virtual ConCommandData* GetConCommandData( ConCommandRef cmd ) = 0;
|
||||||
|
|
||||||
// Queues up value (creates a copy of it) to be set when convar is ready to be edited
|
// Queues up value (creates a copy of it) to be set when convar is ready to be edited
|
||||||
virtual void QueueThreadSetValue( ConVarRefAbstract* ref, CSplitScreenSlot nSlot, CVValue_t* value ) = 0;
|
virtual void QueueThreadSetValue( ConVarRefAbstract* ref, CSplitScreenSlot nSlot, void* __unk01, CVValue_t* value ) = 0;
|
||||||
};
|
};
|
||||||
|
|
||||||
#include "memdbgon.h"
|
#include "memdbgon.h"
|
||||||
@ -185,6 +197,7 @@ public:
|
|||||||
|
|
||||||
struct CConVarChangeCallbackNode_t
|
struct CConVarChangeCallbackNode_t
|
||||||
{
|
{
|
||||||
|
FnGenericChangeCallbackProvider_t m_pProviderCallBack;
|
||||||
FnGenericChangeCallback_t m_pCallback;
|
FnGenericChangeCallback_t m_pCallback;
|
||||||
|
|
||||||
// Register index of cvar which change cb comes from
|
// Register index of cvar which change cb comes from
|
||||||
@ -205,6 +218,7 @@ public:
|
|||||||
{
|
{
|
||||||
ConVarRefAbstract *m_ConVar;
|
ConVarRefAbstract *m_ConVar;
|
||||||
CSplitScreenSlot m_Slot;
|
CSplitScreenSlot m_Slot;
|
||||||
|
void *m_unk001;
|
||||||
CVValue_t *m_Value;
|
CVValue_t *m_Value;
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -236,6 +250,11 @@ public:
|
|||||||
|
|
||||||
CUtlVector<QueuedConVarSet_t> m_SetValueQueue;
|
CUtlVector<QueuedConVarSet_t> m_SetValueQueue;
|
||||||
|
|
||||||
|
CUtlVector<ConVarRef> m_SetToDefaultValueQueue;
|
||||||
|
bool m_LockDefaultValueInit;
|
||||||
|
|
||||||
|
int m_UserInfoCvarsTotalByteSize;
|
||||||
|
|
||||||
CConCommandMemberAccessor<CCvar> m_FindCmd;
|
CConCommandMemberAccessor<CCvar> m_FindCmd;
|
||||||
CConCommandMemberAccessor<CCvar> m_DumpChannelsCmd;
|
CConCommandMemberAccessor<CCvar> m_DumpChannelsCmd;
|
||||||
CConCommandMemberAccessor<CCvar> m_LogLevelCmd;
|
CConCommandMemberAccessor<CCvar> m_LogLevelCmd;
|
||||||
|
@ -607,7 +607,16 @@ private:
|
|||||||
void Destroy( );
|
void Destroy( );
|
||||||
};
|
};
|
||||||
|
|
||||||
using FnGenericChangeCallback_t = void(*)(ConVarRefAbstract* ref, CSplitScreenSlot nSlot, const CVValue_t* pNewValue, const CVValue_t* pOldValue);
|
template <typename T>
|
||||||
|
class CConVar;
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
using FnTypedChangeCallback_t = void (*)(CConVar<T> *cvar, CSplitScreenSlot nSlot, const T *pNewValue, const T *pOldValue);
|
||||||
|
template <typename T>
|
||||||
|
using FnTypedChangeCallbackProvider_t = void(*)(CConVar<T> *cvar, CSplitScreenSlot slot, const T *pNewValue, const T *pOldValue, void *__unk01, FnTypedChangeCallback_t<T> cb);
|
||||||
|
|
||||||
|
using FnGenericChangeCallback_t = void(*)(ConVarRefAbstract *ref, CSplitScreenSlot nSlot, const CVValue_t *pNewValue, const CVValue_t *pOldValue);
|
||||||
|
using FnGenericChangeCallbackProvider_t = void(*)(ConVarRefAbstract *ref, CSplitScreenSlot nSlot, const CVValue_t *pNewValue, const CVValue_t *pOldValue, void *__unk01, FnGenericChangeCallback_t cb);
|
||||||
|
|
||||||
struct ConVarValueInfo_t
|
struct ConVarValueInfo_t
|
||||||
{
|
{
|
||||||
@ -644,6 +653,19 @@ struct ConVarValueInfo_t
|
|||||||
*reinterpret_cast<T *>(m_maxValue) = max;
|
*reinterpret_cast<T *>(m_maxValue) = max;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename T>
|
||||||
|
void SetCallback( FnTypedChangeCallback_t<T> cb )
|
||||||
|
{
|
||||||
|
if(cb)
|
||||||
|
{
|
||||||
|
m_fnProviderCallBack = []( ConVarRefAbstract *ref, CSplitScreenSlot nSlot, const CVValue_t *pNewValue, const CVValue_t *pOldValue, void *__unk01, FnGenericChangeCallback_t cb ) {
|
||||||
|
reinterpret_cast<FnTypedChangeCallback_t<T>>(cb)(reinterpret_cast<CConVar<T> *>(ref), nSlot, reinterpret_cast<const T *>(pNewValue), reinterpret_cast<const T *>(pOldValue));
|
||||||
|
};
|
||||||
|
|
||||||
|
m_fnCallBack = reinterpret_cast<FnGenericChangeCallback_t>(cb);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int32 m_Version;
|
int32 m_Version;
|
||||||
|
|
||||||
bool m_bHasDefault;
|
bool m_bHasDefault;
|
||||||
@ -858,6 +880,7 @@ public:
|
|||||||
|
|
||||||
int GetGameInfoFlags() const { return m_GameInfoFlags; }
|
int GetGameInfoFlags() const { return m_GameInfoFlags; }
|
||||||
int GetCallbackIndex() const { return m_iCallbackIndex; }
|
int GetCallbackIndex() const { return m_iCallbackIndex; }
|
||||||
|
int GetUserInfoByteIndex() const { return m_UserInfoByteIndex; }
|
||||||
|
|
||||||
int GetMaxSplitScreenSlots() const;
|
int GetMaxSplitScreenSlots() const;
|
||||||
|
|
||||||
@ -945,10 +968,11 @@ private:
|
|||||||
unsigned int m_iCallbackIndex;
|
unsigned int m_iCallbackIndex;
|
||||||
|
|
||||||
int m_GameInfoFlags;
|
int m_GameInfoFlags;
|
||||||
|
int m_UserInfoByteIndex;
|
||||||
|
|
||||||
// At convar registration this is trimmed to better match convar type being used
|
// At convar registration this is trimmed to better match convar type being used
|
||||||
// or if it was initialized as EConVarType_Invalid it would be of this size
|
// or if it was initialized as EConVarType_Invalid it would be of this size
|
||||||
uint8 m_Values[sizeof( CVValue_t ) * MAX_SPLITSCREEN_CLIENTS];
|
alignas( CVValue_t ) uint8 m_Values[sizeof( CVValue_t ) * MAX_SPLITSCREEN_CLIENTS];
|
||||||
};
|
};
|
||||||
|
|
||||||
static ConVarData *GetInvalidConVarData( EConVarType type )
|
static ConVarData *GetInvalidConVarData( EConVarType type )
|
||||||
|
@ -590,7 +590,7 @@ void ConVarRefAbstract::QueueSetValueInternal( CSplitScreenSlot slot, CVValue_t
|
|||||||
TypeTraits()->Clamp( value, m_ConVarData->MinValue(), m_ConVarData->MaxValue() );
|
TypeTraits()->Clamp( value, m_ConVarData->MinValue(), m_ConVarData->MaxValue() );
|
||||||
|
|
||||||
if(!m_ConVarData->IsEqual( slot, value ))
|
if(!m_ConVarData->IsEqual( slot, value ))
|
||||||
g_pCVar->QueueThreadSetValue( this, slot, value );
|
g_pCVar->QueueThreadSetValue( this, slot, nullptr, value );
|
||||||
}
|
}
|
||||||
|
|
||||||
void ConVarRefAbstract::SetValueInternal( CSplitScreenSlot slot, CVValue_t *value )
|
void ConVarRefAbstract::SetValueInternal( CSplitScreenSlot slot, CVValue_t *value )
|
||||||
|
Reference in New Issue
Block a user