From 99c39b1d57063d89a16339a9b378f7b6eacc1a8f Mon Sep 17 00:00:00 2001 From: Headline <michaelwflaherty@me.com> Date: Wed, 10 Mar 2021 15:21:57 -0800 Subject: [PATCH] Update IPlugin reference on cmd hook removal (#1439) --- core/ConCmdManager.cpp | 11 ++++++++--- core/ConCmdManager.h | 4 +++- 2 files changed, 11 insertions(+), 4 deletions(-) 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<CommandGroup> 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<AdminCmdInfo>(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<CmdHook> 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<CmdHook> Type type; ConCmdInfo *info; IPluginFunction *pf; /* function hook */ + IPlugin *plugin; /* owning plugin */ std::string helptext; /* help text */ std::unique_ptr<AdminCmdInfo> admin; /* admin requirements, if any */ };