diff --git a/src/BizHawk.Client.EmuHawk/MainForm.cs b/src/BizHawk.Client.EmuHawk/MainForm.cs index 2fd399af341..71053ec3950 100644 --- a/src/BizHawk.Client.EmuHawk/MainForm.cs +++ b/src/BizHawk.Client.EmuHawk/MainForm.cs @@ -3942,6 +3942,8 @@ private bool CloseGame(bool clearSram = false) if (saveMovieResult == TryAgainResult.Canceled) return false; } + if (Tools.Has()) Tools.LuaConsole.CallScriptExitCallbacks(); // important to do this here with the stale `IEmulator`, see https://github.com/TASEmulators/BizHawk/issues/4629 + if (clearSram) { var path = Config.PathEntries.SaveRamAbsolutePath(Game, MovieSession.Movie); diff --git a/src/BizHawk.Client.EmuHawk/tools/Lua/LuaConsole.cs b/src/BizHawk.Client.EmuHawk/tools/Lua/LuaConsole.cs index 1e6eb414cbb..ca4cb608d74 100644 --- a/src/BizHawk.Client.EmuHawk/tools/Lua/LuaConsole.cs +++ b/src/BizHawk.Client.EmuHawk/tools/Lua/LuaConsole.cs @@ -568,6 +568,11 @@ public void CallStateLoadCallbacks(string userFriendlyStateName) public void CallStateSaveCallbacks(string userFriendlyStateName) => LuaImp.CallSaveStateEvent(userFriendlyStateName); + public void CallScriptExitCallbacks() + { + foreach (var lf in LuaImp.ScriptList) LuaImp.CallExitEvent(lf, alsoUnregister: true); + } + protected override void UpdateBefore() { if (LuaImp.IsUpdateSupressed) diff --git a/src/BizHawk.Client.EmuHawk/tools/Lua/LuaLibraries.cs b/src/BizHawk.Client.EmuHawk/tools/Lua/LuaLibraries.cs index 93e4ea1af05..3f7ea013359 100644 --- a/src/BizHawk.Client.EmuHawk/tools/Lua/LuaLibraries.cs +++ b/src/BizHawk.Client.EmuHawk/tools/Lua/LuaLibraries.cs @@ -279,7 +279,11 @@ public void CallFrameAfterEvent() } } - public void CallExitEvent(LuaFile lf) + /// + /// LuaConsole.CallScriptExitCallbacks passes for this so that the subsequent call to LuaConsole.Restart + /// doesn't cause those callbacks to run at a point where the core has already been disposed + /// + public void CallExitEvent(LuaFile lf, bool alsoUnregister = false) { foreach (var exitCallback in RegisteredFunctions .Where(l => l.Event == NamedLuaFunction.EVENT_TYPE_ENGINESTOP @@ -287,6 +291,7 @@ public void CallExitEvent(LuaFile lf) .ToList()) { exitCallback.Call(); + if (alsoUnregister) RegisteredFunctions.Remove(exitCallback); } }