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:
@ -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;
|
||||||
|
@ -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 );
|
||||||
|
@ -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 );
|
||||||
|
Reference in New Issue
Block a user