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 */
 };