mirror of
https://github.com/Minestom/Minestom.git
synced 2024-10-02 16:38:16 +02:00
Improve event calling performance
This commit is contained in:
parent
80c6bb3fa5
commit
a585e4e45b
@ -25,37 +25,43 @@ public class EventNode<T extends Event> {
|
|||||||
public static <E extends Event, V> EventNode<E> type(@NotNull String name,
|
public static <E extends Event, V> EventNode<E> type(@NotNull String name,
|
||||||
@NotNull EventFilter<E, V> filter,
|
@NotNull EventFilter<E, V> filter,
|
||||||
@NotNull BiPredicate<E, V> predicate) {
|
@NotNull BiPredicate<E, V> predicate) {
|
||||||
return new EventNode<>(name, filter, (e, o) -> predicate.test(e, (V) o));
|
return create(name, filter, predicate);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static <E extends Event, V> EventNode<E> type(@NotNull String name,
|
public static <E extends Event, V> EventNode<E> type(@NotNull String name,
|
||||||
@NotNull EventFilter<E, V> filter) {
|
@NotNull EventFilter<E, V> filter) {
|
||||||
return type(name, filter, (e, v) -> true);
|
return create(name, filter, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static <E extends Event, V> EventNode<E> event(@NotNull String name,
|
public static <E extends Event, V> EventNode<E> event(@NotNull String name,
|
||||||
@NotNull EventFilter<E, V> filter,
|
@NotNull EventFilter<E, V> filter,
|
||||||
@NotNull Predicate<E> predicate) {
|
@NotNull Predicate<E> predicate) {
|
||||||
return type(name, filter, (e, h) -> predicate.test(e));
|
return create(name, filter, (e, h) -> predicate.test(e));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static <E extends Event, V> EventNode<E> value(@NotNull String name,
|
public static <E extends Event, V> EventNode<E> value(@NotNull String name,
|
||||||
@NotNull EventFilter<E, V> filter,
|
@NotNull EventFilter<E, V> filter,
|
||||||
@NotNull Predicate<V> predicate) {
|
@NotNull Predicate<V> predicate) {
|
||||||
return type(name, filter, (e, h) -> predicate.test(h));
|
return create(name, filter, (e, h) -> predicate.test(h));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static <E extends Event> EventNode<E> tag(@NotNull String name,
|
public static <E extends Event> EventNode<E> tag(@NotNull String name,
|
||||||
@NotNull EventFilter<E, ? extends TagReadable> filter,
|
@NotNull EventFilter<E, ? extends TagReadable> filter,
|
||||||
@NotNull Tag<?> tag) {
|
@NotNull Tag<?> tag) {
|
||||||
return type(name, filter, (e, h) -> h.hasTag(tag));
|
return create(name, filter, (e, h) -> h.hasTag(tag));
|
||||||
}
|
}
|
||||||
|
|
||||||
public static <E extends Event, V> EventNode<E> tag(@NotNull String name,
|
public static <E extends Event, V> EventNode<E> tag(@NotNull String name,
|
||||||
@NotNull EventFilter<E, ? extends TagReadable> filter,
|
@NotNull EventFilter<E, ? extends TagReadable> filter,
|
||||||
@NotNull Tag<V> tag,
|
@NotNull Tag<V> tag,
|
||||||
@NotNull Predicate<@Nullable V> consumer) {
|
@NotNull Predicate<@Nullable V> consumer) {
|
||||||
return type(name, filter, (e, h) -> consumer.test(h.getTag(tag)));
|
return create(name, filter, (e, h) -> consumer.test(h.getTag(tag)));
|
||||||
|
}
|
||||||
|
|
||||||
|
private static <E extends Event, V> EventNode<E> create(@NotNull String name,
|
||||||
|
@NotNull EventFilter<E, V> filter,
|
||||||
|
@Nullable BiPredicate<E, V> predicate) {
|
||||||
|
return new EventNode<>(name, filter, predicate != null ? (e, o) -> predicate.test(e, (V) o) : null);
|
||||||
}
|
}
|
||||||
|
|
||||||
private final Map<Class<? extends T>, List<EventListener<T>>> listenerMap = new ConcurrentHashMap<>();
|
private final Map<Class<? extends T>, List<EventListener<T>>> listenerMap = new ConcurrentHashMap<>();
|
||||||
@ -73,7 +79,9 @@ public class EventNode<T extends Event> {
|
|||||||
private final Object lock = new Object();
|
private final Object lock = new Object();
|
||||||
private final Object2IntMap<Class<? extends T>> childEventMap = new Object2IntOpenHashMap<>();
|
private final Object2IntMap<Class<? extends T>> childEventMap = new Object2IntOpenHashMap<>();
|
||||||
|
|
||||||
protected EventNode(String name, EventFilter<T, ?> filter, BiPredicate<T, Object> predicate) {
|
protected EventNode(@NotNull String name,
|
||||||
|
@NotNull EventFilter<T, ?> filter,
|
||||||
|
@Nullable BiPredicate<T, Object> predicate) {
|
||||||
this.name = name;
|
this.name = name;
|
||||||
this.filter = filter;
|
this.filter = filter;
|
||||||
this.predicate = predicate;
|
this.predicate = predicate;
|
||||||
@ -87,6 +95,8 @@ public class EventNode<T extends Event> {
|
|||||||
* @return true to enter the node, false otherwise
|
* @return true to enter the node, false otherwise
|
||||||
*/
|
*/
|
||||||
protected boolean condition(@NotNull T event) {
|
protected boolean condition(@NotNull T event) {
|
||||||
|
if (predicate == null)
|
||||||
|
return true;
|
||||||
final var value = filter.getHandler(event);
|
final var value = filter.getHandler(event);
|
||||||
return predicate.test(event, value);
|
return predicate.test(event, value);
|
||||||
}
|
}
|
||||||
@ -102,13 +112,15 @@ public class EventNode<T extends Event> {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// Process redirection
|
// Process redirection
|
||||||
|
if (filter != null) {
|
||||||
final Object handler = filter.getHandler(event);
|
final Object handler = filter.getHandler(event);
|
||||||
if (handler != null) {
|
if (handler != null && !redirectionMap.isEmpty()) {
|
||||||
final var node = redirectionMap.get(handler);
|
final var node = redirectionMap.get(handler);
|
||||||
if (node != null) {
|
if (node != null) {
|
||||||
node.call(event);
|
node.call(event);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
// Process listener list
|
// Process listener list
|
||||||
final var listeners = listenerMap.get(eventClass);
|
final var listeners = listenerMap.get(eventClass);
|
||||||
if (listeners != null && !listeners.isEmpty()) {
|
if (listeners != null && !listeners.isEmpty()) {
|
||||||
|
Loading…
Reference in New Issue
Block a user