Skip to content

Instantly share code, notes, and snippets.

@SilverCory
Created February 7, 2017 06:51
Show Gist options
  • Save SilverCory/83c50a2143a6e294db096f4cf1183d51 to your computer and use it in GitHub Desktop.
Save SilverCory/83c50a2143a6e294db096f4cf1183d51 to your computer and use it in GitHub Desktop.
Register and unregisterable listeners in Bukkit.
package co.ryred.util.event;
import org.bukkit.event.Event;
import org.bukkit.event.HandlerList;
import org.bukkit.plugin.IllegalPluginAccessException;
import org.bukkit.plugin.Plugin;
import org.bukkit.plugin.RegisteredListener;
import java.lang.reflect.Method;
import java.util.Collection;
import java.util.Map;
import java.util.Set;
/**
* Created by Cory Redmond on 07/02/2017.
* [email protected]
*/
public class EventUtils {
public static void registerEvents(UnregisterableListener listener, Plugin plugin) {
if (!plugin.isEnabled()) {
throw new IllegalPluginAccessException("Plugin attempted to register " + listener + " while not enabled");
}
listener.setEventHandlers(plugin.getPluginLoader().createRegisteredListeners(listener, plugin));
if( listener.getEventHandlers() == null ) return;
for (Map.Entry<Class<? extends Event>, Set<RegisteredListener>> entry : listener.getEventHandlers().entrySet()) {
getEventListeners(getRegistrationClass(entry.getKey())).registerAll(entry.getValue());
}
}
public static void unregisterEvents(UnregisterableListener listener, Plugin plugin) {
if (!plugin.isEnabled()) {
throw new IllegalPluginAccessException("Plugin attempted to register " + listener + " while not enabled");
}
if( listener.getEventHandlers() == null ) return;
for (Map.Entry<Class<? extends Event>, Set<RegisteredListener>> entry : listener.getEventHandlers().entrySet()) {
unregisterAll(getEventListeners(getRegistrationClass(entry.getKey())), entry.getValue());
}
listener.setEventHandlers(null);
}
private static void unregisterAll(HandlerList handlerList, Collection<RegisteredListener> registeredListeners) {
registeredListeners.forEach(handlerList::unregister);
}
/**
* Stolen from Bukkit.
*/
private static HandlerList getEventListeners(Class<? extends Event> type) {
try {
Method method = getRegistrationClass(type).getDeclaredMethod("getHandlerList");
method.setAccessible(true);
return (HandlerList) method.invoke(null);
} catch (Exception e) {
throw new IllegalPluginAccessException(e.toString());
}
}
/**
* Stolen from Bukkit.
*/
private static Class<? extends Event> getRegistrationClass(Class<? extends Event> clazz) {
try {
clazz.getDeclaredMethod("getHandlerList");
return clazz;
} catch (NoSuchMethodException e) {
if (clazz.getSuperclass() != null
&& !clazz.getSuperclass().equals(Event.class)
&& Event.class.isAssignableFrom(clazz.getSuperclass())) {
return getRegistrationClass(clazz.getSuperclass().asSubclass(Event.class));
} else {
throw new IllegalPluginAccessException("Unable to find handler list for event " + clazz.getName());
}
}
}
}
package co.ryred.util.event;
import lombok.AccessLevel;
import lombok.Getter;
import lombok.Setter;
import org.bukkit.event.Event;
import org.bukkit.event.Listener;
import org.bukkit.plugin.RegisteredListener;
import java.util.Map;
import java.util.Set;
/**
* Created by Cory Redmond on 07/02/2017.
* [email protected]
*/
public abstract class UnregisterableListener implements Listener {
@Setter(AccessLevel.PACKAGE)// Lombok because it's godlike.
@Getter(AccessLevel.PACKAGE)// Aww you aren't using Lombok.. Time for change.
private transient Map<Class<? extends Event>, Set<RegisteredListener>> eventHandlers = null;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment