Created
February 7, 2017 06:51
-
-
Save SilverCory/83c50a2143a6e294db096f4cf1183d51 to your computer and use it in GitHub Desktop.
Register and unregisterable listeners in Bukkit.
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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()); | |
} | |
} | |
} | |
} | |
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
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