diff options
author | Dico200 <dico.karssiens@gmail.com> | 2018-07-25 01:53:02 +0100 |
---|---|---|
committer | Dico200 <dico.karssiens@gmail.com> | 2018-07-25 01:53:02 +0100 |
commit | 5e168847c2624b767deb9da310ecfdf169e0f43c (patch) | |
tree | 56b76556a6837fff20b800d5a22218286a975581 /dicore3/core/src/main/java/io/dico/dicore/event/HandlerList.java | |
parent | 60503351a30a91985b95ee8aa64e163ef084b34b (diff) |
Add dicore3-core, without really irrelevant packages
Diffstat (limited to 'dicore3/core/src/main/java/io/dico/dicore/event/HandlerList.java')
-rw-r--r-- | dicore3/core/src/main/java/io/dico/dicore/event/HandlerList.java | 91 |
1 files changed, 91 insertions, 0 deletions
diff --git a/dicore3/core/src/main/java/io/dico/dicore/event/HandlerList.java b/dicore3/core/src/main/java/io/dico/dicore/event/HandlerList.java new file mode 100644 index 0000000..56265bb --- /dev/null +++ b/dicore3/core/src/main/java/io/dico/dicore/event/HandlerList.java @@ -0,0 +1,91 @@ +package io.dico.dicore.event; + +import org.bukkit.event.Cancellable; +import org.bukkit.event.EventPriority; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.Comparator; +import java.util.List; +import java.util.function.Consumer; + +public final class HandlerList<T> { + private final List<Listener<T>> source = new ArrayList<>(); + private Listener<T>[] listeners = newArray(0); + + public void refresh() { + source.sort(Comparator.comparingInt(l -> l.getPriority().ordinal())); + listeners = source.toArray(newArray(source.size())); + } + + @SuppressWarnings("unchecked") + private static <T> Listener<T>[] newArray(int length) { + return new Listener[length]; + } + + public void register(Listener<T> listener) { + if (!source.contains(listener) && source.add(listener)) { + refresh(); + } + } + + public ListenerHandle getListenerHandle(Listener<T> listener) { + return new ListenerHandle() { + @Override + public void register() { + HandlerList.this.register(listener); + } + + @Override + public void unregister() { + HandlerList.this.unregister(listener); + } + }; + } + + public void register(EventPriority priority, Consumer<T> listener) { + register(new Listener<T>() { + @Override + public EventPriority getPriority() { + return priority; + } + + @Override + public void accept(T event) { + listener.accept(event); + } + }); + } + + public List<Listener<T>> getRegistrations() { + return Collections.unmodifiableList(source); + } + + public void unregister(Listener<T> listener) { + if (source.remove(listener)) { + refresh(); + } + } + + public void callEvent(T event) { + if (event instanceof Cancellable) { + Cancellable c = (Cancellable) event; + boolean cancelled = c.isCancelled(); + for (Listener<T> listener : listeners) { + if (listener.listensToCancelledState(cancelled)) { + //EnchantsPlugin.getInstance().debug("Listener acceptance: " + listener.getClass().getSimpleName()); + listener.accept(event); + cancelled = c.isCancelled(); + } /*else { + EnchantsPlugin.getInstance().debug("Listener does not listen to cancelled state of " + cancelled + ": " + listener.getClass().getSimpleName()); + }*/ + } + } else { + for (Listener<T> listener : listeners) { + //EnchantsPlugin.getInstance().debug("Listener acceptance: " + listener.getClass().getSimpleName()); + listener.accept(event); + } + } + } + +} |