From 2c363a76d82ff8dada1fb71b8aaba2b6323f178f Mon Sep 17 00:00:00 2001 From: Goldenfield192 <1437356849@qq.com> Date: Tue, 20 Jan 2026 17:39:32 +0800 Subject: [PATCH] feat: add flushable events support --- src/main/java/cam72cam/mod/event/Event.java | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/main/java/cam72cam/mod/event/Event.java b/src/main/java/cam72cam/mod/event/Event.java index 0b27f95b9..a7b533184 100644 --- a/src/main/java/cam72cam/mod/event/Event.java +++ b/src/main/java/cam72cam/mod/event/Event.java @@ -8,31 +8,46 @@ public class Event { private final Set pre = new LinkedHashSet<>(); private final Set callbacks = new LinkedHashSet<>(); + private final Set flushableCallbacks = new LinkedHashSet<>(); private final Set post = new LinkedHashSet<>(); public void pre(Runnable callback) { pre.add(callback); } + + //If this event is fired only 1 time per game launch or should be handled indifferently public void subscribe(T callback) { callbacks.add(callback); } + + //If this event is fired multiple times per game launch and should be handled separately + public void subscribeFlushable(T callback) { + subscribe(callback); + flushableCallbacks.add(callback); + } + public void post(Runnable callback) { post.add(callback); } + void execute(Consumer handler) { pre.forEach(Runnable::run); callbacks.forEach(handler); + callbacks.removeAll(flushableCallbacks); + post.forEach(Runnable::run); } boolean executeCancellable(Function handler) { pre.forEach(Runnable::run); - for (T callback : callbacks) { + for (T callback : new LinkedHashSet<>(callbacks)) { if (!handler.apply(callback)) { + callbacks.removeAll(flushableCallbacks); return false; } } post.forEach(Runnable::run); + callbacks.removeAll(flushableCallbacks); return true; } }