package org.stevewinfield.suja.idk.game.event; import org.apache.log4j.Logger; import org.stevewinfield.suja.idk.game.event.impl.EventBus; import org.stevewinfield.suja.idk.game.plugins.GamePlugin; import org.stevewinfield.suja.idk.game.plugins.PluginInterfaces; import javax.script.Invocable; public class EventManager { private final static Logger logger = Logger.getLogger(EventManager.class); public void addEventListener(final GamePlugin plugin, final Class<? extends Event> eventClass, final String obj) { final IEventListener executor = ((Invocable) plugin.getScript()) .getInterface( plugin.getScript().get(obj), IEventListener.class ); if (executor == null) { logger.error("Invalid event executor"); logger.warn("You didn't set the method onEvent in " + obj); return; } eventBus.registerListener(eventClass, new IEventListener() { @Override public void onEvent(Event event) { executor.onEvent(event); } }); } /** * Registers a listener * @param plugin The plugin for which this event listener is registered * @param eventClass Event for which the event listener must be called * @param eventListener Listener that may or may not have a generic type attached * @param eventPriority Priority of the event */ public void registerListener(final GamePlugin plugin, final Class<? extends Event> eventClass, final IEventListener eventListener, final EventPriority eventPriority) { eventBus.registerListener(eventClass, eventListener, eventPriority); } /** * Registers a listener with the {@link EventPriority#DEFAULT} priority * @param plugin The plugin for which this event listener is registered * @param eventClass Event for which the event listener must be called * @param eventListener Listener that may or may not have a generic type attached */ public void registerListener(final GamePlugin plugin, final Class<? extends Event> eventClass, final IEventListener eventListener) { eventBus.registerListener(eventClass, eventListener); } /** * Registers a listener, automatically detecting the event class * @param plugin The plugin for which this event listener is registered * @param eventListener Must have a generic type attached so it can detect the event for which this listener must be registered * @param eventPriority Priority of the event */ public void registerListener(final GamePlugin plugin, final IEventListener eventListener, final EventPriority eventPriority) { eventBus.registerListener(eventListener, eventPriority); } /** * Registers a listener with the {@link EventPriority#DEFAULT} priority, automatically detecting the event class * @param plugin The plugin for which this event listener is registered * @param eventListener Must have a generic type attached so it can detect the event for which this listener must be registered */ public void registerListener(final GamePlugin plugin, final IEventListener eventListener) { eventBus.registerListener(eventListener); } /** * Unregisters a listener, it will be unregistered from all events for which this listener is listed * @param plugin The plugin for which this event listener is registered * @param eventListener Event listener that will be unregistered */ public void unregisterListener(final GamePlugin plugin, final IEventListener eventListener) { eventBus.unregisterListener(eventListener); } /** * Calls an event * @param event Calls an event, propagating it to all associated listeners * @param <T> Type of event * @return The supplied event */ public <T extends Event> T callEvent(final T event) { long start = System.nanoTime(); try { eventBus.post(event); } catch (Throwable t) { logger.error("Plugin error", t); } long elapsed = start - System.nanoTime(); if (elapsed > 250000) { logger.warn("Event " + event.getClass().getName() + " took " + elapsed + "ns to process!"); } return event; } private final EventBus eventBus = new EventBus(); }