diff --git a/public/tier1/convar.h b/public/tier1/convar.h index a75f111e..060a755c 100644 --- a/public/tier1/convar.h +++ b/public/tier1/convar.h @@ -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: diff --git a/tier1/convar.cpp b/tier1/convar.cpp index 5707396d..756b4ba3 100644 --- a/tier1/convar.cpp +++ b/tier1/convar.cpp @@ -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(); }