1
0
mirror of https://github.com/alliedmodders/hl2sdk.git synced 2026-10-10 03:43:06 +08:00

Extend ConVar_Unregister to actually unregister all cvars/cmds

This commit is contained in:
GAMMACASE
2026-09-25 17:27:19 +03:00
parent 6315f0104d
commit 2fa8e05360
2 changed files with 70 additions and 22 deletions
+4
View File
@@ -1562,6 +1562,7 @@ class ConCommandRegList
{
public:
friend void ConVar_Register( uint64 nCVarFlag, FnConVarRegisterCallback cvar_reg_cb, FnConCommandRegisterCallback cmd_reg_cb );
friend void ConVar_Unregister();
friend void SetupConCommand( ConCommand *cmd, const ConCommandCreation_t &info );
struct Entry_t
@@ -1573,6 +1574,7 @@ public:
private:
static void RegisterConCommand( const Entry_t &cmd );
static void RegisterAll();
static void UnregisterAll();
static void AddToList( const Entry_t &cmd );
public:
@@ -1590,6 +1592,7 @@ class ConVarRegList
{
public:
friend void ConVar_Register( uint64 nCVarFlag, FnConVarRegisterCallback cvar_reg_cb, FnConCommandRegisterCallback cmd_reg_cb );
friend void ConVar_Unregister();
friend void SetupConVar( ConVarRefAbstract *cvar, ConVarData **cvar_data, ConVarCreation_t &info );
struct Entry_t
@@ -1603,6 +1606,7 @@ public:
private:
static void RegisterConVar( const Entry_t &cvar );
static void RegisterAll();
static void UnregisterAll();
static void AddToList( const Entry_t &cvar );
public:
+66 -22
View File
@@ -39,6 +39,17 @@ static bool s_bRegistered = false;
bool ConCommandRegList::s_bConCommandsRegistered = false;
ConCommandRegList *ConCommandRegList::s_pRoot = nullptr;
void UnRegisterConCommand( ConCommandRef *cmd )
{
if(cmd->IsValidRef())
{
if(g_pCVar)
g_pCVar->UnregisterConCommandCallbacks( *cmd );
cmd->InvalidateRef();
}
}
void ConCommandRegList::RegisterConCommand( const Entry_t &cmd )
{
*cmd.m_Command = g_pCVar->RegisterConCommand( cmd.m_Info, s_nCVarFlag );
@@ -65,6 +76,25 @@ void ConCommandRegList::RegisterAll()
RegisterConCommand( list->m_Entries[i] );
}
prev = list->m_pPrev;
};
}
}
void ConCommandRegList::UnregisterAll()
{
if(s_bConCommandsRegistered && g_pCVar)
{
s_bConCommandsRegistered = false;
ConCommandRegList *prev = nullptr;
for(auto list = s_pRoot; list; list = prev)
{
for(size_t i = 0; i < list->m_nSize; i++)
{
UnRegisterConCommand( list->m_Entries[i].m_Command );
}
prev = list->m_pPrev;
delete list;
};
@@ -102,20 +132,20 @@ void SetupConCommand( ConCommand *cmd, const ConCommandCreation_t& info )
ConCommandRegList::AddToList( entry );
}
void UnRegisterConCommand( ConCommand *cmd )
{
if(cmd->IsValidRef())
{
if(g_pCVar)
g_pCVar->UnregisterConCommandCallbacks( *cmd );
cmd->InvalidateRef();
}
}
bool ConVarRegList::s_bConVarsRegistered = false;
ConVarRegList *ConVarRegList::s_pRoot = nullptr;
void UnRegisterConVar( ConVarRef *cvar )
{
if(cvar->IsValidRef())
{
if(g_pCVar)
g_pCVar->UnregisterConVarCallbacks( *cvar );
cvar->InvalidateRef();
}
}
void ConVarRegList::RegisterConVar( const Entry_t &cvar )
{
g_pCVar->RegisterConVar( cvar.m_Info, s_nCVarFlag, cvar.m_pConVar, cvar.m_pConVarData );
@@ -143,6 +173,25 @@ void ConVarRegList::RegisterAll()
RegisterConVar( list->m_Entries[i] );
}
prev = list->m_pPrev;
};
}
}
void ConVarRegList::UnregisterAll()
{
if(s_bConVarsRegistered && g_pCVar)
{
s_bConVarsRegistered = false;
ConVarRegList *prev = nullptr;
for(auto list = s_pRoot; list; list = prev)
{
for(size_t i = 0; i < list->m_nSize; i++)
{
UnRegisterConVar( list->m_Entries[i].m_pConVar );
}
prev = list->m_pPrev;
delete list;
};
@@ -181,17 +230,6 @@ void SetupConVar( ConVarRefAbstract *cvar, ConVarData **cvar_data, ConVarCreatio
ConVarRegList::AddToList( entry );
}
void UnRegisterConVar( ConVarRef *cvar )
{
if(cvar->IsValidRef())
{
if(g_pCVar)
g_pCVar->UnregisterConVarCallbacks( *cvar );
cvar->InvalidateRef();
}
}
uint64 SanitiseConVarFlags( uint64 flags )
{
#ifdef SANITIZE_CVAR_FLAGS
@@ -236,6 +274,12 @@ void ConVar_Unregister( )
return;
s_bRegistered = false;
s_nCVarFlag = FCVAR_NONE;
s_ConVarRegCB = nullptr;
s_ConCommandRegCB = nullptr;
ConCommandRegList::UnregisterAll();
ConVarRegList::UnregisterAll();
}