33import com .pyjavabridge .PyJavaBridgePlugin ;
44import com .pyjavabridge .BridgeInstance ;
55
6- import org .bukkit .Bukkit ;
76import org .bukkit .event .Event ;
87import org .bukkit .event .EventPriority ;
98import org .bukkit .event .HandlerList ;
109import org .bukkit .event .Listener ;
1110import org .bukkit .plugin .EventExecutor ;
11+ import org .bukkit .plugin .RegisteredListener ;
1212
13+ import java .lang .reflect .Method ;
1314import java .util .concurrent .ConcurrentHashMap ;
1415import java .util .concurrent .atomic .AtomicLong ;
1516
@@ -18,7 +19,7 @@ public class EventSubscription implements Listener {
1819 private static final ConcurrentHashMap <String , Class <? extends Event >> eventClassCache = new ConcurrentHashMap <>();
1920
2021 private final PyJavaBridgePlugin pluginRef ;
21- private final Class <? extends Event > eventClass ;
22+ private final Class <?> eventClass ;
2223 private final EventPriority priority ;
2324 private final AtomicLong lastTick = new AtomicLong (-1 );
2425 private volatile long lastDispatchNano = 0 ;
@@ -67,7 +68,9 @@ public EventSubscription(PyJavaBridgePlugin plugin, BridgeInstance instance, Str
6768
6869 public void register () {
6970 // Do not ignore cancelled events: some events (e.g. interact air) are pre-cancelled by Bukkit.
70- Bukkit .getPluginManager ().registerEvent (eventClass , this , this .priority , executor , pluginRef , false );
71+ HandlerList handlerList = resolveHandlerList (this .eventClass );
72+ RegisteredListener listener = new RegisteredListener (this , this .executor , this .priority , this .pluginRef , false );
73+ handlerList .register (listener );
7174 }
7275
7376 public void unregister () {
@@ -116,6 +119,24 @@ static Class<? extends Event> resolveEventClass(String eventName) throws ClassNo
116119 throw new ClassNotFoundException ("Event not found for " + eventName );
117120 }
118121
122+ private static HandlerList resolveHandlerList (Class <?> type ) {
123+ if (!Event .class .isAssignableFrom (type )) {
124+ throw new IllegalStateException ("Type is not a Bukkit event: " + type .getName ());
125+ }
126+
127+ try {
128+ Method method = type .getMethod ("getHandlerList" );
129+ Object value = method .invoke (null );
130+ if (value instanceof HandlerList ) {
131+ return (HandlerList ) value ;
132+ }
133+ } catch (ReflectiveOperationException ex ) {
134+ throw new IllegalStateException ("Unable to resolve handler list for event type: " + type .getName (), ex );
135+ }
136+
137+ throw new IllegalStateException ("Event type does not expose static getHandlerList(): " + type .getName ());
138+ }
139+
119140 static String toPascalCase (String value ) {
120141 StringBuilder builder = new StringBuilder ();
121142 for (String part : value .split ("_" )) {
0 commit comments