diff --git a/src/main/java/net/minestom/server/event/EventNode.java b/src/main/java/net/minestom/server/event/EventNode.java index 230dd16ec..4260e0570 100644 --- a/src/main/java/net/minestom/server/event/EventNode.java +++ b/src/main/java/net/minestom/server/event/EventNode.java @@ -65,6 +65,7 @@ public class EventNode { } private static final Map, EventFilter> REDIRECTION_MAP = new ConcurrentHashMap<>(); + private static final Map, List>> REDIRECTION_CACHE = new ConcurrentHashMap<>(); private static void registerMapping(EventFilter filter) { final var type = filter.getEventType(); @@ -129,19 +130,16 @@ public class EventNode { // Process redirection if (!redirectionMap.isEmpty()) { // Loop through register redirection - REDIRECTION_MAP.forEach((aClass, f) -> { - if (aClass.isAssignableFrom(eventClass)) { - final Object handler = f.getHandler(event); - if (handler != null) { - final var node = redirectionMap.get(handler); - if (node != null) { - node.call(event); - } + getRedirectionCache(event).forEach(redirectionFilter -> { + final Object handler = redirectionFilter.getHandler(event); + if (handler != null) { + final var node = redirectionMap.get(handler); + if (node != null) { + node.call(event); } } }); } - // Process listener list final var listeners = listenerMap.get(eventClass); if (listeners != null && !listeners.isEmpty()) { @@ -290,4 +288,20 @@ public class EventNode { throw new IllegalStateException("Something wrong happened, listener count: " + result); } } + + private static List> getRedirectionCache(Event event) { + return REDIRECTION_CACHE.computeIfAbsent(event.getClass(), + aClass -> findFilters(event)); + } + + private static List> findFilters(Event event) { + final var eventClass = event.getClass(); + List> filters = new ArrayList<>(); + REDIRECTION_MAP.forEach((aClass, f) -> { + if (aClass.isAssignableFrom(eventClass)) { + filters.add(f); + } + }); + return filters; + } }