From d0dcd599cf455c809d4f34858015caa96b6a061e Mon Sep 17 00:00:00 2001 From: anth64 Date: Wed, 17 Jun 2026 19:13:14 +0200 Subject: [PATCH] fix(commandhookmodsystem): short-circuit Before dispatch on cancel FireBefore continued invoking every registered listener even after one had set Cancel, running callbacks against a command that was already dead. Break out of the loop as soon as Cancel is set. --- CommandHook/CommandHookModSystem.cs | 10 ++++++++-- CommandHook/modinfo.json | 4 +++- 2 files changed, 11 insertions(+), 3 deletions(-) diff --git a/CommandHook/CommandHookModSystem.cs b/CommandHook/CommandHookModSystem.cs index 32e144f..1b0ba29 100644 --- a/CommandHook/CommandHookModSystem.cs +++ b/CommandHook/CommandHookModSystem.cs @@ -109,8 +109,8 @@ public class CommandHookModSystem : ModSystem } foreach (var wildcard in wildcards) - foreach (var mods in builder.Values) - mods[wildcard.ModId] = wildcard.Registration; + foreach (var mods in builder.Values) + mods[wildcard.ModId] = wildcard.Registration; var pruned = new Dictionary>( builder.Count @@ -125,8 +125,14 @@ public class CommandHookModSystem : ModSystem internal bool FireBefore(string commandName, ref CommandData data) { if (registrations.TryGetValue(commandName, out var mods)) + { foreach (var (_, reg) in mods) + { reg.Before?.Invoke(ref data); + if (data.Cancel) + break; + } + } return data.Cancel; } diff --git a/CommandHook/modinfo.json b/CommandHook/modinfo.json index 6747edd..1f3db02 100644 --- a/CommandHook/modinfo.json +++ b/CommandHook/modinfo.json @@ -3,7 +3,9 @@ "modid": "commandhook", "name": "CommandHook", "description": "Exposes server command events for other mods to hook into.", - "authors": ["anth64"], + "authors": [ + "anth64" + ], "version": "0.1.0", "side": "Server", "dependencies": {