diff --git a/src/main/java/cam72cam/mod/event/Event.java b/src/main/java/cam72cam/mod/event/Event.java index 0b27f95b..a7b53318 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; } }