mirror of
https://github.com/Minestom/Minestom.git
synced 2025-01-08 01:17:47 +01:00
Add node mapping support, for per-object listeners
This commit is contained in:
parent
8f3b52a8b9
commit
f8eb211d0d
@ -45,6 +45,10 @@ public interface EventNode<T extends Event> {
|
|||||||
|
|
||||||
void removeListener(@NotNull EventListener<? extends T> listener);
|
void removeListener(@NotNull EventListener<? extends T> listener);
|
||||||
|
|
||||||
|
<E extends T, V> void map(@NotNull EventFilter<E, V> filter, @NotNull V value, @NotNull EventNode<E> node);
|
||||||
|
|
||||||
|
void removeMap(@NotNull Object value);
|
||||||
|
|
||||||
@NotNull String getName();
|
@NotNull String getName();
|
||||||
|
|
||||||
@NotNull List<@NotNull EventNode<T>> getChildren();
|
@NotNull List<@NotNull EventNode<T>> getChildren();
|
||||||
|
@ -13,6 +13,7 @@ class EventNodeImpl<T extends Event, H> implements EventNode<T> {
|
|||||||
private final String name = "debug";
|
private final String name = "debug";
|
||||||
|
|
||||||
private final Map<Class<? extends T>, List<EventListener<T>>> listenerMap = new ConcurrentHashMap<>();
|
private final Map<Class<? extends T>, List<EventListener<T>>> listenerMap = new ConcurrentHashMap<>();
|
||||||
|
private final Map<Object, RedirectionEntry<T>> redirectionMap = new ConcurrentHashMap<>();
|
||||||
private final List<EventNode<T>> children = new CopyOnWriteArrayList<>();
|
private final List<EventNode<T>> children = new CopyOnWriteArrayList<>();
|
||||||
|
|
||||||
protected final EventFilter<T, H> filter;
|
protected final EventFilter<T, H> filter;
|
||||||
@ -41,6 +42,13 @@ class EventNodeImpl<T extends Event, H> implements EventNode<T> {
|
|||||||
// Cancelled by superclass
|
// Cancelled by superclass
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
// Process redirection
|
||||||
|
final H handler = filter.getHandler(event);
|
||||||
|
final var entry = redirectionMap.get(handler);
|
||||||
|
if (entry != null) {
|
||||||
|
entry.node.call(event);
|
||||||
|
}
|
||||||
|
// Process listener list
|
||||||
final var listeners = listenerMap.get(event.getClass());
|
final var listeners = listenerMap.get(event.getClass());
|
||||||
if (listeners != null && !listeners.isEmpty()) {
|
if (listeners != null && !listeners.isEmpty()) {
|
||||||
listeners.forEach(listener -> {
|
listeners.forEach(listener -> {
|
||||||
@ -50,6 +58,7 @@ class EventNodeImpl<T extends Event, H> implements EventNode<T> {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
// Process children
|
||||||
this.children.forEach(eventNode -> eventNode.call(event));
|
this.children.forEach(eventNode -> eventNode.call(event));
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -77,6 +86,19 @@ class EventNodeImpl<T extends Event, H> implements EventNode<T> {
|
|||||||
listeners.remove(listener);
|
listeners.remove(listener);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public <E extends T, V> void map(@NotNull EventFilter<E, V> filter, @NotNull V value, @NotNull EventNode<E> node) {
|
||||||
|
RedirectionEntry<E> entry = new RedirectionEntry<>();
|
||||||
|
entry.filter = filter;
|
||||||
|
entry.node = node;
|
||||||
|
this.redirectionMap.put(value, (RedirectionEntry<T>) entry);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void removeMap(@NotNull Object value) {
|
||||||
|
this.redirectionMap.remove(value);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public @NotNull String getName() {
|
public @NotNull String getName() {
|
||||||
return name;
|
return name;
|
||||||
@ -86,4 +108,9 @@ class EventNodeImpl<T extends Event, H> implements EventNode<T> {
|
|||||||
public @NotNull List<@NotNull EventNode<T>> getChildren() {
|
public @NotNull List<@NotNull EventNode<T>> getChildren() {
|
||||||
return Collections.unmodifiableList(children);
|
return Collections.unmodifiableList(children);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static class RedirectionEntry<E extends Event> {
|
||||||
|
EventFilter<E, ?> filter;
|
||||||
|
EventNode<E> node;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -147,13 +147,22 @@ public class PlayerInit {
|
|||||||
empty.addListener(EventListener.of(PlayerMoveEvent.class, (event) -> {
|
empty.addListener(EventListener.of(PlayerMoveEvent.class, (event) -> {
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Map a node to a single element
|
||||||
|
*
|
||||||
|
* var test = EventNode.type(EventFilter.ENTITY);
|
||||||
|
* test.addListener(EventListener.of(PlayerMoveEvent.class, (event) ->
|
||||||
|
* System.out.println("creative player moved")));
|
||||||
|
* empty.map(EventFilter.ENTITY, entity, test);
|
||||||
|
*/
|
||||||
|
|
||||||
var conditional = EventNode.conditionalHandler(EventFilter.PLAYER, Player::isCreative);
|
var conditional = EventNode.conditionalHandler(EventFilter.PLAYER, Player::isCreative);
|
||||||
conditional.addListener(EventListener.of(PlayerMoveEvent.class, (event) -> {
|
conditional.addListener(EventListener.of(PlayerMoveEvent.class, (event) ->
|
||||||
System.out.println("creative player moved");
|
System.out.println("creative player moved")));
|
||||||
}));
|
|
||||||
|
|
||||||
var list = EventNode.list(EventFilter.PLAYER);
|
var list = EventNode.list(EventFilter.PLAYER);
|
||||||
list.addListener(EventListener.of(PlayerMoveEvent.class, playerMoveEvent -> System.out.println("move")));
|
list.addListener(EventListener.of(PlayerMoveEvent.class, event ->
|
||||||
|
System.out.println("move")));
|
||||||
|
|
||||||
GlobalEventHandler globalEventHandler = MinecraftServer.getGlobalEventHandler();
|
GlobalEventHandler globalEventHandler = MinecraftServer.getGlobalEventHandler();
|
||||||
globalEventHandler.addEventCallback(EntityAttackEvent.class, event -> {
|
globalEventHandler.addEventCallback(EntityAttackEvent.class, event -> {
|
||||||
|
Loading…
Reference in New Issue
Block a user