From bb08b55b43ed1bcca313e5d294c355d9d8628c3f Mon Sep 17 00:00:00 2001
From: Zachary McAlpin <choalover@gmail.com>
Date: Thu, 12 Mar 2020 12:22:04 -0500
Subject: [PATCH] Created GameQuit hook, but I need to decide where to execute
 it

---
 src/lua_hook.h    |  2 ++
 src/lua_hooklib.c | 24 ++++++++++++++++++++++++
 2 files changed, 26 insertions(+)

diff --git a/src/lua_hook.h b/src/lua_hook.h
index 265700e4f0..380e459916 100644
--- a/src/lua_hook.h
+++ b/src/lua_hook.h
@@ -58,6 +58,7 @@ enum hook {
 	hook_ViewpointSwitch,
 	hook_SeenPlayer,
 	hook_PlayerThink,
+	hook_GameQuit,
 
 	hook_MAX // last hook
 };
@@ -110,5 +111,6 @@ UINT8 LUAh_ViewpointSwitch(player_t *player, player_t *newdisplayplayer, boolean
 boolean LUAh_SeenPlayer(player_t *player, player_t *seenfriend); // Hook for MT_NAMECHECK
 #endif
 #define LUAh_PlayerThink(player) LUAh_PlayerHook(player, hook_PlayerThink) // Hook for P_PlayerThink
+void LUAh_GameQuit(void); // Hook for game quitting
 
 #endif
diff --git a/src/lua_hooklib.c b/src/lua_hooklib.c
index c29edbd617..dc66b39e8e 100644
--- a/src/lua_hooklib.c
+++ b/src/lua_hooklib.c
@@ -69,6 +69,7 @@ const char *const hookNames[hook_MAX+1] = {
 	"ViewpointSwitch",
 	"SeenPlayer",
 	"PlayerThink",
+	"GameQuit",
 	NULL
 };
 
@@ -1660,4 +1661,27 @@ boolean LUAh_SeenPlayer(player_t *player, player_t *seenfriend)
 }
 #endif // SEENAMES
 
+// Hook for game quitting
+void LUAh_GameQuit(void)
+{
+	hook_p hookp;
+	if (!gL || !(hooksAvailable[hook_GameQuit/8] & (1<<(hook_GameQuit%8))))
+		return;
+
+	for (hookp = roothook; hookp; hookp = hookp->next)
+	{
+		if (hookp->type != hook_GameQuit)
+			continue;
+
+		lua_pushfstring(gL, FMT_HOOKID, hookp->id);
+		lua_gettable(gL, LUA_REGISTRYINDEX);
+		if (lua_pcall(gL, 0, 0, 0)) {
+			if (!hookp->error || cv_debug & DBG_LUA)
+				CONS_Alert(CONS_WARNING,"%s\n",lua_tostring(gL, -1));
+			lua_pop(gL, 1);
+			hookp->error = true;
+		}
+	}
+}
+
 #endif
-- 
GitLab