diff --git a/src/d_clisrv.c b/src/d_clisrv.c
index 8ecafcc1b29f7d78872cd80bc7d6e35c917b86c4..9a24546ea6fe4235fa89496612186fbf10892124 100644
--- a/src/d_clisrv.c
+++ b/src/d_clisrv.c
@@ -3032,7 +3032,7 @@ static void Got_KickCmd(UINT8 **p, INT32 playernum)
 
 	if (pnum == consoleplayer)
 	{
-		LUAh_GameQuit(false);
+		LUA_HookBool(false, Hook(GameQuit));
 #ifdef DUMPCONSISTENCY
 		if (msg == KICK_MSG_CON_FAIL) SV_SavedGame();
 #endif
@@ -3732,7 +3732,7 @@ static void HandleConnect(SINT8 node)
 static void HandleShutdown(SINT8 node)
 {
 	(void)node;
-	LUAh_GameQuit(false);
+	LUA_HookBool(false, Hook(GameQuit));
 	D_QuitNetGame();
 	CL_Reset();
 	D_StartTitle();
@@ -3747,7 +3747,7 @@ static void HandleShutdown(SINT8 node)
 static void HandleTimeout(SINT8 node)
 {
 	(void)node;
-	LUAh_GameQuit(false);
+	LUA_HookBool(false, Hook(GameQuit));
 	D_QuitNetGame();
 	CL_Reset();
 	D_StartTitle();
diff --git a/src/d_netcmd.c b/src/d_netcmd.c
index d2f6add0c7930e5f6bde8b8e43e12190154d18ff..25b4b0aa1ff0f353df916dbb92b120f398d12483 100644
--- a/src/d_netcmd.c
+++ b/src/d_netcmd.c
@@ -3612,7 +3612,7 @@ static void Command_Playintro_f(void)
   */
 FUNCNORETURN static ATTRNORETURN void Command_Quit_f(void)
 {
-	LUAh_GameQuit(true);
+	LUA_HookBool(true, Hook(GameQuit));
 	I_Quit();
 }
 
@@ -4274,7 +4274,7 @@ void Command_ExitGame_f(void)
 {
 	INT32 i;
 
-	LUAh_GameQuit(false);
+	LUA_HookBool(false, Hook(GameQuit));
 
 	D_QuitNetGame();
 	CL_Reset();
diff --git a/src/lua_hook.h b/src/lua_hook.h
index f44a2e305f5bbc7553eab8f9ea3a708601201174..873c146433d7cd00959587e2195d68bc4641d7bf 100644
--- a/src/lua_hook.h
+++ b/src/lua_hook.h
@@ -84,6 +84,7 @@ void    LUA_Hook(int hook);
 int  LUA_HookMobj(mobj_t *, int hook);
 int  LUA_Hook2Mobj(mobj_t *, mobj_t *, int hook);
 void LUA_HookInt(INT32 integer, int hook);
+void LUA_HookBool(boolean value, int hook);
 int  LUA_HookPlayer(player_t *, int hook);
 int  LUA_HookTiccmd(player_t *, ticcmd_t *, int hook);
 
diff --git a/src/lua_hooklib.c b/src/lua_hooklib.c
index 1ac9a6952159e52af70f9d9d68e5a71af52ab5ce..5492c7921b8ad3dcce74c2dda882faf12c305ff2 100644
--- a/src/lua_hooklib.c
+++ b/src/lua_hooklib.c
@@ -561,6 +561,16 @@ void LUA_HookInt(INT32 number, int hook_type)
 	}
 }
 
+void LUA_HookBool(boolean value, int hook_type)
+{
+	Hook_State hook;
+	if (prepare_hook(&hook, 0, hook_type))
+	{
+		lua_pushboolean(gL, value);
+		call_hooks(&hook, 1, 0, res_none);
+	}
+}
+
 int LUA_HookPlayer(player_t *player, int hook_type)
 {
 	Hook_State hook;
diff --git a/src/m_menu.c b/src/m_menu.c
index 5ec9132f748e6ab8a82b55e72585f6da89a3a208..c6b1b2b8ab52ed89ac539deb18245f4ac39e4e9f 100644
--- a/src/m_menu.c
+++ b/src/m_menu.c
@@ -6937,7 +6937,7 @@ static void M_SelectableClearMenus(INT32 choice)
 static void M_UltimateCheat(INT32 choice)
 {
 	(void)choice;
-	LUAh_GameQuit(true);
+	LUA_HookBool(true, Hook(GameQuit));
 	I_Quit();
 }
 
@@ -13371,7 +13371,7 @@ void M_QuitResponse(INT32 ch)
 
 	if (ch != 'y' && ch != KEY_ENTER)
 		return;
-	LUAh_GameQuit(true);
+	LUA_HookBool(true, Hook(GameQuit));
 	if (!(netgame || cv_debug))
 	{
 		S_ResetCaptions();
diff --git a/src/sdl/i_video.c b/src/sdl/i_video.c
index 5ebff87001f962d8a63bc5a8a6c5b6535176523d..f3da446d867d5ac5a625f23b21fd825a15081afa 100644
--- a/src/sdl/i_video.c
+++ b/src/sdl/i_video.c
@@ -1057,7 +1057,7 @@ void I_GetEvent(void)
 					M_SetupJoystickMenu(0);
 			 	break;
 			case SDL_QUIT:
-				LUAh_GameQuit(true);
+				LUA_HookBool(true, Hook(GameQuit));
 				I_Quit();
 				break;
 		}