diff --git a/src/main/java/net/minecraftforge/eventbus/EventBus.java b/src/main/java/net/minecraftforge/eventbus/EventBus.java index 46ccbf88..48ba4f03 100644 --- a/src/main/java/net/minecraftforge/eventbus/EventBus.java +++ b/src/main/java/net/minecraftforge/eventbus/EventBus.java @@ -25,7 +25,7 @@ public class EventBus implements IEventExceptionHandler, IEventBus { private static final Logger LOGGER = LogManager.getLogger(); private static final boolean checkTypesOnDispatchProperty = Boolean.parseBoolean(System.getProperty("eventbus.checkTypesOnDispatch", "false")); private static final AtomicInteger maxID = new AtomicInteger(0); - private final boolean trackPhases; + final boolean trackPhases; private final ConcurrentHashMap> listeners = new ConcurrentHashMap<>(); private final int busID = maxID.getAndIncrement(); @@ -268,7 +268,7 @@ private void register(Class eventType, Object target, Method method) { private void addToListeners(final Object target, final Class eventType, final IEventListener listener, final EventPriority priority) { ListenerList listenerList = EventListenerHelper.getListenerList(eventType); - listenerList.register(busID, priority, listener); + listenerList.register(busID, this, priority, listener); List others = listeners.computeIfAbsent(target, k -> Collections.synchronizedList(new ArrayList<>())); others.add(listener); } @@ -298,7 +298,6 @@ public boolean post(Event event, IEventBusInvokeDispatcher wrapper) { int index = 0; try { for (; index < listeners.length; index++) { - if (!trackPhases && listeners[index].getClass() == EventPriority.class) continue; wrapper.invoke(listeners[index], event); } } catch (Throwable throwable) { diff --git a/src/main/java/net/minecraftforge/eventbus/ListenerList.java b/src/main/java/net/minecraftforge/eventbus/ListenerList.java index 1cc53dee..771e74e0 100644 --- a/src/main/java/net/minecraftforge/eventbus/ListenerList.java +++ b/src/main/java/net/minecraftforge/eventbus/ListenerList.java @@ -85,6 +85,12 @@ public void register(int id, EventPriority priority, IEventListener listener) { lists[id].register(priority, listener); } + public void register(int id, EventBus eventBus, EventPriority priority, IEventListener listener) { + var list = lists[id]; + list.phaseTracking = eventBus.trackPhases; + list.register(priority, listener); + } + public void unregister(int id, IEventListener listener) { lists[id].unregister(listener); } @@ -114,6 +120,7 @@ private static class ListenerListInst { private ListenerListInst parent; private List children; + private boolean phaseTracking = true; private final Semaphore writeLock = new Semaphore(1, true); private ListenerListInst() {} @@ -212,7 +219,7 @@ private IEventListener[] buildCache() { for (EventPriority value : EVENT_PRIORITY_VALUES) { List listeners = getListeners(value); if (listeners.isEmpty()) continue; - ret.add(value); // Add the priority to notify the event of its current phase. + if (phaseTracking) ret.add(value); // Add the priority to notify the event of its current phase. ret.addAll(listeners); }