From f2f561ca4ed8e859df99c07fa15f0033f1652d1d Mon Sep 17 00:00:00 2001 From: Honahec Date: Mon, 23 Mar 2026 22:31:22 +0800 Subject: [PATCH 1/3] fix: multiple attempt to bind signal --- .../Patchs/Screens/NOverlayStackPatch.cs | 33 +++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 SlayTheSpire2.LAN.Multiplayer/Patchs/Screens/NOverlayStackPatch.cs diff --git a/SlayTheSpire2.LAN.Multiplayer/Patchs/Screens/NOverlayStackPatch.cs b/SlayTheSpire2.LAN.Multiplayer/Patchs/Screens/NOverlayStackPatch.cs new file mode 100644 index 0000000..99b6e78 --- /dev/null +++ b/SlayTheSpire2.LAN.Multiplayer/Patchs/Screens/NOverlayStackPatch.cs @@ -0,0 +1,33 @@ +using Godot; +using HarmonyLib; +using MegaCrit.Sts2.Core.Nodes.Screens.Overlays; + +// ReSharper disable UnusedMember.Global +// ReSharper disable UnusedType.Global + +namespace SlayTheSpire2.LAN.Multiplayer.Patchs.Screens +{ + [HarmonyPatch(typeof(NOverlayStack), "Remove")] + internal class NOverlayStackRemovePatch + { + private static bool Prefix(NOverlayStack __instance, NOverlay overlay) + { + if (overlay == null || !GodotObject.IsInstanceValid(overlay)) + { + return false; + } + + var connections = overlay.GetSignalConnectionList("Completed"); + foreach (var connection in connections) + { + if (connection["callable"].AsCallable().Target == __instance) + { + Plugin.Logger?.LogWarning("NOverlayStack.Remove called twice, preventing crash."); + return false; + } + } + + return true; + } + } +} From 3255748299ac5ee905410510eeb2dd93d7d88f11 Mon Sep 17 00:00:00 2001 From: Honahec Date: Mon, 23 Mar 2026 23:01:34 +0800 Subject: [PATCH 2/3] fix: namespace and log --- .../Patchs/Screens/NOverlayStackPatch.cs | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/SlayTheSpire2.LAN.Multiplayer/Patchs/Screens/NOverlayStackPatch.cs b/SlayTheSpire2.LAN.Multiplayer/Patchs/Screens/NOverlayStackPatch.cs index 99b6e78..471d436 100644 --- a/SlayTheSpire2.LAN.Multiplayer/Patchs/Screens/NOverlayStackPatch.cs +++ b/SlayTheSpire2.LAN.Multiplayer/Patchs/Screens/NOverlayStackPatch.cs @@ -7,10 +7,10 @@ using MegaCrit.Sts2.Core.Nodes.Screens.Overlays; namespace SlayTheSpire2.LAN.Multiplayer.Patchs.Screens { - [HarmonyPatch(typeof(NOverlayStack), "Remove")] + [HarmonyPatch("MegaCrit.Sts2.Core.Nodes.Screens.Overlays.NOverlayStack", "Remove")] internal class NOverlayStackRemovePatch { - private static bool Prefix(NOverlayStack __instance, NOverlay overlay) + private static bool Prefix(object __instance, GodotObject overlay) { if (overlay == null || !GodotObject.IsInstanceValid(overlay)) { @@ -22,7 +22,7 @@ namespace SlayTheSpire2.LAN.Multiplayer.Patchs.Screens { if (connection["callable"].AsCallable().Target == __instance) { - Plugin.Logger?.LogWarning("NOverlayStack.Remove called twice, preventing crash."); + GD.Print("NOverlayStack.Remove called twice, preventing crash."); return false; } } From cc3380f0d76751b2f08cb00dc9051157c16d592a Mon Sep 17 00:00:00 2001 From: Honahec Date: Mon, 23 Mar 2026 23:46:29 +0800 Subject: [PATCH 3/3] fix: parameter name --- .../Patchs/Screens/NOverlayStackPatch.cs | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/SlayTheSpire2.LAN.Multiplayer/Patchs/Screens/NOverlayStackPatch.cs b/SlayTheSpire2.LAN.Multiplayer/Patchs/Screens/NOverlayStackPatch.cs index 471d436..9ab6fc0 100644 --- a/SlayTheSpire2.LAN.Multiplayer/Patchs/Screens/NOverlayStackPatch.cs +++ b/SlayTheSpire2.LAN.Multiplayer/Patchs/Screens/NOverlayStackPatch.cs @@ -10,8 +10,9 @@ namespace SlayTheSpire2.LAN.Multiplayer.Patchs.Screens [HarmonyPatch("MegaCrit.Sts2.Core.Nodes.Screens.Overlays.NOverlayStack", "Remove")] internal class NOverlayStackRemovePatch { - private static bool Prefix(object __instance, GodotObject overlay) + private static bool Prefix(object __instance, object screen) { + var overlay = screen as GodotObject; if (overlay == null || !GodotObject.IsInstanceValid(overlay)) { return false;