1
0
mirror of https://github.com/alliedmodders/hl2sdk.git synced 2025-09-19 20:16:10 +08:00

Update ICvar, ConVarData & ConVarValueInfo_t

This commit is contained in:
GAMMACASE
2025-08-15 02:38:48 +03:00
parent 9261be1f73
commit 92e02ab8dd
3 changed files with 80 additions and 14 deletions

View File

@ -74,6 +74,8 @@ public:
virtual void CallChangeCallback( ConVarRef cvar, const CSplitScreenSlot nSlot, const CVValue_t* pNewValue, const CVValue_t* pOldValue, void *__unk01 = nullptr ) = 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 // Would call cb for every change callback defined for this cvar
virtual void IterateConVarCallbacks( ConVarRef cvar, FnCvarCallbacksReader_t cb ) = 0; virtual void IterateConVarCallbacks( ConVarRef cvar, FnCvarCallbacksReader_t cb ) = 0;
// If returns false value shouldn't be modified
virtual bool CallFilterCallback( ConVarRef cvar, const CSplitScreenSlot nSlot, const CVValue_t *pNewValue, const CVValue_t *pOldValue, void *__unk01 = nullptr ) = 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;
@ -198,7 +200,7 @@ public:
return base; return base;
} }
struct CConVarChangeCallbackNode_t struct ConVarChangeCallbackData_t
{ {
FnGenericChangeCallbackProvider_t m_pProviderCallBack; FnGenericChangeCallbackProvider_t m_pProviderCallBack;
FnGenericChangeCallback_t m_pCallback; FnGenericChangeCallback_t m_pCallback;
@ -207,6 +209,15 @@ public:
int m_ConVarIndex; int m_ConVarIndex;
}; };
struct ConVarFilterCallbackData_t
{
FnGenericFilterCallbackProvider_t m_pProviderCallBack;
FnGenericFilterCallback_t m_pCallback;
// Register index of cvar which change cb comes from
int m_ConVarIndex;
};
struct ConCommandCallbackInfoNode_t struct ConCommandCallbackInfoNode_t
{ {
ConCommandCallbackInfo_t m_CB; ConCommandCallbackInfo_t m_CB;
@ -232,7 +243,8 @@ public:
CUtlLinkedList<ConVarData *> m_ConVarList; CUtlLinkedList<ConVarData *> m_ConVarList;
CUtlHashtable<CUtlStringToken, uint16> m_ConVarHashes; CUtlHashtable<CUtlStringToken, uint16> m_ConVarHashes;
CUtlLinkedList<CConVarChangeCallbackNode_t, unsigned short, true> m_ConVarChangeCBList; CUtlLinkedList<ConVarChangeCallbackData_t, unsigned short, true> m_ConVarChangeCBList;
CUtlLinkedList<ConVarFilterCallbackData_t, unsigned short, true> m_ConVarFilterCBList;
int m_ConVarCount; int m_ConVarCount;
CUtlVector<IConVarListener *> m_CvarCreationListeners; CUtlVector<IConVarListener *> m_CvarCreationListeners;

View File

@ -618,6 +618,14 @@ using FnTypedChangeCallbackProvider_t = void(*)(CConVar<T> *cvar, CSplitScreenSl
using FnGenericChangeCallback_t = void(*)(ConVarRefAbstract *ref, CSplitScreenSlot nSlot, const CVValue_t *pNewValue, const CVValue_t *pOldValue); 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); using FnGenericChangeCallbackProvider_t = void(*)(ConVarRefAbstract *ref, CSplitScreenSlot nSlot, const CVValue_t *pNewValue, const CVValue_t *pOldValue, void *__unk01, FnGenericChangeCallback_t cb);
template <typename T>
using FnTypedFilterCallback_t = void (*)(CConVar<T> *cvar, CSplitScreenSlot nSlot, const T *pNewValue, const T *pOldValue);
template <typename T>
using FnTypedFilterCallbackProvider_t = void(*)(CConVar<T> *cvar, CSplitScreenSlot slot, const T *pNewValue, const T *pOldValue, void *__unk01, FnTypedFilterCallback_t<T> cb);
using FnGenericFilterCallback_t = bool(*)(ConVarRefAbstract *ref, CSplitScreenSlot nSlot, const CVValue_t *pNewValue, const CVValue_t *pOldValue);
using FnGenericFilterCallbackProvider_t = bool(*)(ConVarRefAbstract *ref, CSplitScreenSlot nSlot, const CVValue_t *pNewValue, const CVValue_t *pOldValue, void *__unk01, FnGenericFilterCallback_t cb);
struct ConVarValueInfo_t struct ConVarValueInfo_t
{ {
ConVarValueInfo_t( EConVarType type = EConVarType_Invalid ) : ConVarValueInfo_t( EConVarType type = EConVarType_Invalid ) :
@ -630,6 +638,8 @@ struct ConVarValueInfo_t
m_maxValue {}, m_maxValue {},
m_fnProviderCallBack( nullptr ), m_fnProviderCallBack( nullptr ),
m_fnCallBack( nullptr ), m_fnCallBack( nullptr ),
m_fnProviderFilterCallBack( nullptr ),
m_fnFilterCallBack( nullptr ),
m_eVarType( type ) m_eVarType( type )
{} {}
@ -667,6 +677,19 @@ struct ConVarValueInfo_t
} }
} }
template <typename T>
void SetFilterCallback( FnTypedFilterCallback_t<T> cb )
{
if(cb)
{
m_fnProviderFilterCallBack = []( ConVarRefAbstract *ref, CSplitScreenSlot nSlot, const CVValue_t *pNewValue, const CVValue_t *pOldValue, void *__unk01, FnGenericFilterCallback_t cb ) {
return reinterpret_cast<FnTypedFilterCallback_t<T>>(cb)(reinterpret_cast<CConVar<T> *>(ref), nSlot, reinterpret_cast<const T *>(pNewValue), reinterpret_cast<const T *>(pOldValue));
};
m_fnFilterCallBack = reinterpret_cast<FnGenericFilterCallback_t>(cb);
}
}
int32 m_Version; int32 m_Version;
bool m_bHasDefault; bool m_bHasDefault;
@ -683,6 +706,9 @@ public:
FnGenericChangeCallbackProvider_t m_fnProviderCallBack; FnGenericChangeCallbackProvider_t m_fnProviderCallBack;
FnGenericChangeCallback_t m_fnCallBack; FnGenericChangeCallback_t m_fnCallBack;
FnGenericFilterCallbackProvider_t m_fnProviderFilterCallBack;
FnGenericFilterCallback_t m_fnFilterCallBack;
EConVarType m_eVarType; EConVarType m_eVarType;
}; };
@ -861,6 +887,7 @@ public:
m_iTimesChanged = 0; m_iTimesChanged = 0;
m_nFlags = FCVAR_REFERENCE; m_nFlags = FCVAR_REFERENCE;
m_iCallbackIndex = 0; m_iCallbackIndex = 0;
m_iFilterCBIndex = 0;
m_GameInfoFlags = 0; m_GameInfoFlags = 0;
} }
@ -969,6 +996,8 @@ private:
// Index into a linked list of cvar callbacks // Index into a linked list of cvar callbacks
unsigned int m_iCallbackIndex; unsigned int m_iCallbackIndex;
// Index into a linked list of cvar filter callbacks
unsigned int m_iFilterCBIndex;
int m_GameInfoFlags; int m_GameInfoFlags;
int m_UserInfoByteIndex; int m_UserInfoByteIndex;
@ -1273,6 +1302,28 @@ public:
BaseClass::Register( name, flags, help_string, value_info ); BaseClass::Register( name, flags, help_string, value_info );
} }
CConVar( const char *name, uint64 flags, const char *help_string, const T &default_value, bool min, const T &minValue, bool max, const T &maxValue, FnTypedChangeCallback_t<T> cb = nullptr, FnTypedFilterCallback_t<T> filter_cb = nullptr )
: BaseClass()
{
Assert( name );
BaseClass::Init( ConVarRef(), TranslateConVarType<T>() );
ConVarValueInfo_t value_info( TranslateConVarType<T>() );
value_info.SetDefaultValue( default_value );
if(min)
value_info.SetMinValue( minValue );
if(max)
value_info.SetMaxValue( maxValue );
value_info.SetCallback( cb );
value_info.SetFilterCallback( filter_cb );
BaseClass::Register( name, flags, help_string, value_info );
}
~CConVar() ~CConVar()
{ {
UnRegisterConVar( this ); UnRegisterConVar( this );

View File

@ -599,24 +599,27 @@ void ConVarRefAbstract::SetValueInternal( CSplitScreenSlot slot, CVValue_t *valu
CVValue_t prev; CVValue_t prev;
TypeTraits()->Construct( &prev ); TypeTraits()->Construct( &prev );
TypeTraits()->Copy( &prev, *curr_value ); TypeTraits()->Copy( &prev, *curr_value );
TypeTraits()->Destruct( curr_value );
TypeTraits()->Construct( curr_value ); if(g_pCVar->CallFilterCallback( *this, slot, value, &prev ))
TypeTraits()->Copy( curr_value, *value );
m_ConVarData->Clamp( slot );
if(!m_ConVarData->IsEqual( slot, &prev ))
{ {
CBufferString prev_str, new_str; TypeTraits()->Destruct( curr_value );
TypeTraits()->ValueToString( &prev, prev_str ); TypeTraits()->Construct( curr_value );
TypeTraits()->ValueToString( curr_value, new_str ); TypeTraits()->Copy( curr_value, *value );
m_ConVarData->Clamp( slot );
m_ConVarData->IncrementTimesChanged(); if(!m_ConVarData->IsEqual( slot, &prev ))
{
CBufferString prev_str, new_str;
CallChangeCallbacks( slot, curr_value, &prev, new_str.Get(), prev_str.Get() ); TypeTraits()->ValueToString( &prev, prev_str );
TypeTraits()->ValueToString( curr_value, new_str );
m_ConVarData->IncrementTimesChanged();
CallChangeCallbacks( slot, curr_value, &prev, new_str.Get(), prev_str.Get() );
}
} }
TypeTraits()->Destruct( &prev ); TypeTraits()->Destruct( &prev );