diff --git a/core/ConCmdManager.cpp b/core/ConCmdManager.cpp index 91c21190..790e29c7 100644 --- a/core/ConCmdManager.cpp +++ b/core/ConCmdManager.cpp @@ -121,8 +121,13 @@ void ConCmdManager::OnPluginDestroyed(IPlugin *plugin) if (hook->admin) hook->admin->group->hooks.remove(hook); - if (hook->info->hooks.empty()) + if (hook->info->hooks.empty()) { RemoveConCmd(hook->info, hook->info->pCmd->GetName(), true); + } + else { // update plugin reference to next hook in line + auto next = *hook->info->hooks.begin(); + next->info->pPlugin = next->plugin; + } iter = pList->erase(iter); delete hook; @@ -360,7 +365,7 @@ bool ConCmdManager::AddAdminCommand(IPluginFunction *pFunction, } RefPtr cmdgroup = i->value; - CmdHook *pHook = new CmdHook(CmdHook::Client, pInfo, pFunction, description); + CmdHook *pHook = new CmdHook(CmdHook::Client, pInfo, pFunction, description, pPlugin); pHook->admin = std::make_unique(cmdgroup, adminflags); /* First get the command group override, if any */ @@ -399,7 +404,7 @@ bool ConCmdManager::AddServerCommand(IPluginFunction *pFunction, if (!pInfo) return false; - CmdHook *pHook = new CmdHook(CmdHook::Server, pInfo, pFunction, description); + CmdHook *pHook = new CmdHook(CmdHook::Server, pInfo, pFunction, description, pPlugin); pInfo->hooks.append(pHook); RegisterInPlugin(pHook); diff --git a/core/ConCmdManager.h b/core/ConCmdManager.h index ee788d21..899fdcff 100644 --- a/core/ConCmdManager.h +++ b/core/ConCmdManager.h @@ -80,10 +80,11 @@ struct CmdHook : public ke::InlineListNode Client }; - CmdHook(Type type, ConCmdInfo *cmd, IPluginFunction *fun, const char *description) + CmdHook(Type type, ConCmdInfo *cmd, IPluginFunction *fun, const char *description, IPlugin *plugin) : type(type), info(cmd), pf(fun), + plugin(plugin), helptext(description) { } @@ -91,6 +92,7 @@ struct CmdHook : public ke::InlineListNode Type type; ConCmdInfo *info; IPluginFunction *pf; /* function hook */ + IPlugin *plugin; /* owning plugin */ std::string helptext; /* help text */ std::unique_ptr admin; /* admin requirements, if any */ };