2021-06-02 08:17:21 +02:00
|
|
|
package net.minestom.server.event;
|
|
|
|
|
2021-06-02 10:19:23 +02:00
|
|
|
import org.jetbrains.annotations.NotNull;
|
2021-06-02 08:17:21 +02:00
|
|
|
|
2021-06-02 10:19:23 +02:00
|
|
|
import java.util.Collections;
|
|
|
|
import java.util.List;
|
2021-06-02 11:08:48 +02:00
|
|
|
import java.util.Map;
|
|
|
|
import java.util.concurrent.ConcurrentHashMap;
|
2021-06-02 10:19:23 +02:00
|
|
|
import java.util.concurrent.CopyOnWriteArrayList;
|
2021-06-02 08:17:21 +02:00
|
|
|
import java.util.function.Consumer;
|
|
|
|
import java.util.function.Predicate;
|
|
|
|
|
2021-06-02 10:52:20 +02:00
|
|
|
public abstract class EventNode<T extends Event> {
|
2021-06-02 08:17:21 +02:00
|
|
|
|
2021-06-02 10:19:23 +02:00
|
|
|
private final String name = "debug";
|
2021-06-02 11:08:48 +02:00
|
|
|
|
|
|
|
private final Map<Class<? extends T>, List<EventListener<T>>> listenerMap = new ConcurrentHashMap<>();
|
2021-06-02 10:34:01 +02:00
|
|
|
private final List<EventNode<T>> children = new CopyOnWriteArrayList<>();
|
2021-06-02 10:19:23 +02:00
|
|
|
|
2021-06-02 10:52:20 +02:00
|
|
|
private static final EventNode<Event> EMPTY = new EventNode<>() {
|
|
|
|
@Override
|
|
|
|
protected boolean isValid(@NotNull Event event) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
};
|
2021-06-02 08:17:21 +02:00
|
|
|
|
2021-06-02 09:06:04 +02:00
|
|
|
public static EventNode<Event> create() {
|
2021-06-02 10:52:20 +02:00
|
|
|
return EMPTY;
|
2021-06-02 08:17:21 +02:00
|
|
|
}
|
|
|
|
|
2021-06-02 10:19:23 +02:00
|
|
|
public static <E extends Event> EventNode<E> conditional(@NotNull Class<E> type,
|
|
|
|
@NotNull Predicate<E> predicate) {
|
2021-06-02 11:08:48 +02:00
|
|
|
return new EventNodeConditional<>(type, predicate);
|
2021-06-02 08:17:21 +02:00
|
|
|
}
|
|
|
|
|
2021-06-02 10:19:23 +02:00
|
|
|
public static <E extends Event> EventNode<E> conditional(@NotNull Class<E> eventType) {
|
|
|
|
return conditional(eventType, t -> true);
|
2021-06-02 08:59:46 +02:00
|
|
|
}
|
|
|
|
|
2021-06-02 10:52:20 +02:00
|
|
|
protected abstract boolean isValid(@NotNull T event);
|
2021-06-02 08:17:21 +02:00
|
|
|
|
2021-06-02 10:34:01 +02:00
|
|
|
public void call(@NotNull T event) {
|
2021-06-02 10:52:20 +02:00
|
|
|
if (!isValid(event))
|
|
|
|
return;
|
2021-06-02 11:08:48 +02:00
|
|
|
final var listeners = listenerMap.get(event.getClass());
|
|
|
|
if (listeners != null && !listeners.isEmpty()) {
|
|
|
|
listeners.forEach(eventListener ->
|
|
|
|
eventListener.combined.accept(event));
|
|
|
|
}
|
2021-06-02 10:34:01 +02:00
|
|
|
this.children.forEach(eventNode -> eventNode.call(event));
|
|
|
|
}
|
|
|
|
|
2021-06-02 10:19:23 +02:00
|
|
|
public void addChild(@NotNull EventNode<? extends T> child) {
|
2021-06-02 10:34:01 +02:00
|
|
|
this.children.add((EventNode<T>) child);
|
2021-06-02 10:19:23 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
public void addListener(@NotNull EventListener<? extends T> listener) {
|
2021-06-02 11:08:48 +02:00
|
|
|
this.listenerMap.computeIfAbsent(listener.type, aClass -> new CopyOnWriteArrayList<>())
|
|
|
|
.add((EventListener<T>) listener);
|
2021-06-02 10:19:23 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
public <E extends T> void addListener(@NotNull Class<E> eventClass, @NotNull Consumer<@NotNull E> listener) {
|
|
|
|
addListener(EventListener.of(eventClass).handler(listener).build());
|
|
|
|
}
|
|
|
|
|
|
|
|
public @NotNull String getName() {
|
|
|
|
return name;
|
2021-06-02 09:50:18 +02:00
|
|
|
}
|
|
|
|
|
2021-06-02 10:52:20 +02:00
|
|
|
public @NotNull List<@NotNull EventNode<T>> getChildren() {
|
2021-06-02 10:19:23 +02:00
|
|
|
return Collections.unmodifiableList(children);
|
2021-06-02 08:17:21 +02:00
|
|
|
}
|
|
|
|
}
|