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.
This commit is contained in:
@@ -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<string, FrozenDictionary<string, CommandRegistration>>(
|
||||
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;
|
||||
}
|
||||
|
||||
@@ -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": {
|
||||
|
||||
Reference in New Issue
Block a user