diff --git a/core-legacy/CPlugin.cpp b/core-legacy/CPlugin.cpp index 3d74003..ac102c3 100644 --- a/core-legacy/CPlugin.cpp +++ b/core-legacy/CPlugin.cpp @@ -37,6 +37,26 @@ using namespace SourceMM; CPluginManager g_PluginMngr; +void NotifyConCommandBaseDrop(PluginId id, ConCommandBase *base) +{ + CPluginManager::CPlugin *pl; + SourceHook::List::iterator event; + IMetamodListener *api; + for (PluginIter iter = g_PluginMngr._begin(); iter != g_PluginMngr._end(); iter++) + { + pl = (*iter); + if (pl->m_Status < Pl_Paused) + continue; + if (pl->m_API->GetApiVersion() < 11) + continue; + for (event = pl->m_Events.begin(); event != pl->m_Events.end(); event++) + { + api = (*event).event; + api->OnUnlinkConCommandBase(id, base); + } + } +} + CPluginManager::CPluginManager() { m_LastId = Pl_MinId; @@ -653,13 +673,19 @@ void CPluginManager::UnregAllConCmds(CPlugin *pl) { SourceHook::List::iterator i; - for (i=pl->m_Cvars.begin(); i!=pl->m_Cvars.end(); i++) - g_SMConVarAccessor.Unregister( (*i) ); + for (i = pl->m_Cvars.begin(); i != pl->m_Cvars.end(); i++) + { + NotifyConCommandBaseDrop(pl->m_Id, (*i)); + g_SMConVarAccessor.Unregister((*i)); + } pl->m_Cvars.clear(); - for (i=pl->m_Cmds.begin(); i!=pl->m_Cmds.end(); i++) - g_SMConVarAccessor.Unregister( (*i) ); + for (i = pl->m_Cmds.begin(); i != pl->m_Cmds.end(); i++) + { + NotifyConCommandBaseDrop(pl->m_Id, (*i)); + g_SMConVarAccessor.Unregister((*i)); + } pl->m_Cmds.clear(); } diff --git a/core-legacy/CPlugin.h b/core-legacy/CPlugin.h index 12f810b..4e2cf91 100644 --- a/core-legacy/CPlugin.h +++ b/core-legacy/CPlugin.h @@ -149,6 +149,8 @@ namespace SourceMM }; }; +void NotifyConCommandBaseDrop(PluginId id, ConCommandBase *base); + typedef SourceHook::List::iterator PluginIter; /** @brief Singleton for plugin manager */ diff --git a/core-legacy/CSmmAPI.cpp b/core-legacy/CSmmAPI.cpp index 516fd2f..b463fbb 100644 --- a/core-legacy/CSmmAPI.cpp +++ b/core-legacy/CSmmAPI.cpp @@ -118,6 +118,11 @@ void CSmmAPI::UnregisterConCmdBase(ISmmPlugin *plugin, ConCommandBase *pCommand) g_PluginMngr.RemovePluginCvar(plugin, pCommand); } + CPluginManager::CPlugin *pPlugin = g_PluginMngr.FindByAPI(plugin); + PluginId id = (pPlugin != NULL) ? pPlugin->m_Id : Pl_BadLoad; + + NotifyConCommandBaseDrop(id, pCommand); + g_SMConVarAccessor.Unregister(pCommand); } diff --git a/core-legacy/ISmmAPI.h b/core-legacy/ISmmAPI.h index 80b0346..210e90c 100644 --- a/core-legacy/ISmmAPI.h +++ b/core-legacy/ISmmAPI.h @@ -315,7 +315,7 @@ public: // Added in 1.4 (1:5) * 1.2.2 Added API for printing to client console (with string formatting). * 1.3 Added new interface search API. * 1.4 Added VSP listener and user message API. - * 1.8 Added VP hooks to SH-legacy. + * 1.8 Added VP hooks to SH-legacy, new API for cvars. */ #endif //_INCLUDE_ISMM_API_H diff --git a/core-legacy/ISmmPlugin.h b/core-legacy/ISmmPlugin.h index 152b7e1..67315ff 100644 --- a/core-legacy/ISmmPlugin.h +++ b/core-legacy/ISmmPlugin.h @@ -316,6 +316,20 @@ public: virtual void OnVSPListening(IServerPluginCallbacks *iface) { } + + /** + * @brief Called when Metamod:Source knows that a specific ConCommandBase is + * about to be unregistered. This is only called for ConCommandBases + * registered by Metamod:Source plugins. + * + * This is only invoked on Metamod:Source 1.8 or higher (PLAPI_VERSION >= 11). + * + * @param plugin Plugin owning the ConCommandBase. + * @param base ConCommandBase that is being unlinked. + */ + virtual void OnUnlinkConCommandBase(PluginId id, ConCommandBase *base) + { + } }; #define PL_EXPOSURE CreateInterface