private void fireEvent(Event event) { HandlerList handlers = event.getHandlers(); RegisteredListener[] listeners = handlers.getRegisteredListeners(); for (RegisteredListener registration : listeners) { if (!registration.getPlugin().isEnabled()) { continue; } try { registration.callEvent(event); } catch (AuthorNagException ex) { Plugin plugin = registration.getPlugin(); if (plugin.isNaggable()) { plugin.setNaggable(false); server .getLogger() .log( Level.SEVERE, String.format( "Nag author(s): '%s' of '%s' about the following: %s", plugin.getDescription().getAuthors(), plugin.getDescription().getFullName(), ex.getMessage())); } } catch (Throwable ex) { server .getLogger() .log( Level.SEVERE, "Could not pass event " + event.getEventName() + " to " + registration.getPlugin().getDescription().getFullName(), ex); } } }
/** * Get a specific plugin's registered listeners associated with this handler list * * @param plugin the plugin to get the listeners of * @return the list of registered listeners */ public static ArrayList<RegisteredListener> getRegisteredListeners(EventPlugin plugin) { ArrayList<RegisteredListener> listeners = new ArrayList<RegisteredListener>(); synchronized (allLists) { for (HandlerList h : allLists) { synchronized (h) { for (List<RegisteredListener> list : h.handlerslots.values()) { for (RegisteredListener listener : list) { if (listener.getPlugin().equals(plugin)) { listeners.add(listener); } } } } } } return listeners; }
/** * Registers all the events in the given listener class. * * @param listener - listener to register * @param plugin - plugin to register */ public void registerEvents(Listener listener, Plugin plugin) { if (!plugin.isEnabled()) throw new IllegalPluginAccessException( "Plugin attempted to register " + listener + " while not enabled"); // Just in case Bukkit decides to validate the parameters in the future EventExecutor nullExecutor = (arg0, arg1) -> { throw new IllegalStateException("This method should never be called!"); }; for (Entry<Class<? extends Event>, Set<RegisteredListener>> entry : plugin.getPluginLoader().createRegisteredListeners(listener, plugin).entrySet()) { Collection<RegisteredListener> listeners = entry.getValue(); Collection<RegisteredListener> modified = Lists.newArrayList(); // Use our plugin specific logger instead for (final RegisteredListener delegate : listeners) { RegisteredListener customListener = new RegisteredListener( delegate.getListener(), nullExecutor, delegate.getPriority(), delegate.getPlugin(), delegate.isIgnoringCancelled()) { @Override public void callEvent(Event event) throws EventException { try { delegate.callEvent(event); } catch (AuthorNagException e) { // Let Bukkit handle that one throw e; } catch (Throwable e) { customHandler(event, e); } } }; modified.add(customListener); } getEventListeners(getRegistrationClass(entry.getKey())).registerAll(modified); } }