package pers.xanadu.enderdragon.script; import java.lang.reflect.Method; import java.util.concurrent.atomic.AtomicLong; import java.util.function.Consumer; import org.bukkit.Bukkit; import org.bukkit.event.Event; import org.bukkit.event.EventPriority; import org.bukkit.event.HandlerList; import org.bukkit.event.Listener; import org.bukkit.plugin.EventExecutor; import org.jetbrains.annotations.NotNull; import pers.xanadu.enderdragon.manager.GroovyManager; import static pers.xanadu.enderdragon.EnderDragon.plugin; public class Events implements Listener, EventExecutor { private final Consumer consumer; private final Class clazz; private boolean disabled; private final AtomicLong expireTime; public Events(Class clazz, Consumer consumer) { this.clazz = clazz; this.consumer = consumer; this.expireTime = new AtomicLong(-1L); this.disabled = false; } public void unregister() { if (!this.disabled) { try { Method method = this.clazz.getMethod("getHandlerList"); HandlerList handlerList = (HandlerList) method.invoke(null); if (Bukkit.isPrimaryThread()) { handlerList.unregister(this); } else { Bukkit.getScheduler().runTask(plugin, () -> handlerList.unregister(this)); } } catch (Exception e) { e.printStackTrace(); } this.disabled = true; } } public static Events registerPersistently(Class clazz, Consumer consumer) { return Events.registerPersistently(clazz, EventPriority.NORMAL, false, consumer); } public static Events registerPersistently(Class clazz, EventPriority priority, boolean ignoreCancelled, Consumer consumer) { Events tmp = new Events<>(clazz, consumer); if (Bukkit.isPrimaryThread()) { Bukkit.getPluginManager().registerEvent(clazz,tmp,priority,tmp,plugin,ignoreCancelled); } else { Bukkit.getScheduler().runTask(plugin, () -> Bukkit.getPluginManager().registerEvent(clazz,tmp,priority,tmp,plugin,ignoreCancelled)); } return tmp; } public static Events register(Class clazz, Consumer consumer) { return Events.register(clazz, EventPriority.NORMAL, false, consumer); } public static Events register(Class clazz, EventPriority priority, boolean ignoreCancelled, Consumer consumer) { Events tmp = new Events<>(clazz, consumer); if (Bukkit.isPrimaryThread()) { Bukkit.getPluginManager().registerEvent(clazz,tmp,priority,tmp,plugin,ignoreCancelled); } else { Bukkit.getScheduler().runTask(plugin, () -> Bukkit.getPluginManager().registerEvent(clazz,tmp,priority,tmp,plugin,ignoreCancelled)); } GroovyManager.event_set.add(tmp); return tmp; } @Override public void execute(@NotNull Listener listener, @NotNull Event event) { if (this.expireTime.get() > 0L && System.currentTimeMillis() > this.expireTime.get()) { Bukkit.getScheduler().runTask(plugin, this::unregister); return; } if (this.clazz.isInstance(event)) { this.consumer.accept((T) event); } } public Events withTime(long time) { this.expireTime.set(time); return this; } public boolean cancelIfExpired() { if (this.expireTime.get() > 0L && System.currentTimeMillis() > this.expireTime.get()) { this.unregister(); return true; } return false; } }