package wtf.beatrice.limbomanager.listeners; import org.bukkit.event.Cancellable; import org.bukkit.event.Event; import org.bukkit.event.EventPriority; import org.bukkit.event.Listener; import org.bukkit.plugin.EventExecutor; import org.reflections.Reflections; import wtf.beatrice.limbomanager.LimboManager; import java.util.Arrays; import java.util.Set; import java.util.stream.Collectors; public class SuperListener implements Listener { public void doStuff() { // search event classes Reflections reflections = new Reflections("org.bukkit");// change to also find custom events Set> eventClasses = reflections.getSubTypesOf(Event.class).stream(). filter(clazz -> Arrays.stream(clazz.getDeclaredFields()) .anyMatch(field -> field.getType().getName().endsWith("HandlerList"))) .collect(Collectors.toSet()); LimboManager.getInstance().getLogger().info("Found " + eventClasses.size() + " available events!"); LimboManager.getInstance().getLogger() .info(eventClasses.stream().map(Class::getName).collect(Collectors.joining(", "))); // register events EventExecutor eventExecutor = (listener, event) -> iGetCalledForEveryEvent(event); eventClasses.forEach(clazz -> LimboManager.getInstance().getServer().getPluginManager() .registerEvent(clazz, this, EventPriority.MONITOR, eventExecutor, LimboManager.getInstance())); } private final String[] dontLog = { "PlayerMoveEvent", "BlockFadeEvent", "BlockPhysicsEvent", "LeavesDecayEvent", "PlayerStatisticIncrementEvent", "PlayerRecipeDiscoverEvent", "PlayerArmSwingEvent", "BlockDropItemEvent", "BlockFertilizeEvent", "AsyncPlayerChatPreviewEvent", "ItemSpawnEvent", "InventoryOpenEvent", "BlockIgniteEvent" }; private final String[] allowed = {"PlayerMoveEvent", "PlayerTeleportEvent", "ServerCommandEvent", "StandardPaperServerListPingEventImpl", "PlayerGameModeChangeEvent", "WorldUnloadEvent", "TimeSkipEvent", "PlayerToggleSprintEvent", "PlayerChatEvent", "AsyncPlayerChatEvent", "GenericGameEvent", "InventoryCreativeEvent", "PlayerItemHeldEvent", "PlayerInteractEvent", "BlockPlaceEvent", "BlockBreakEvent", "PlayerToggleSneakEvent", "PlayerKickEvent", "InventoryClickEvent", "PlayerDropItemEvent", "PlayerCommandPreprocessEvent", "BlockMultiPlaceEvent" }; public void iGetCalledForEveryEvent(Event event) { if(Arrays.stream(allowed).noneMatch(allowed -> event.getEventName().equals(allowed))) { if(event instanceof Cancellable) { ((Cancellable) event).setCancelled(true); } } if (Arrays.stream(dontLog).anyMatch(ignored -> event.getEventName().equals(ignored))) { return; } if(event instanceof Cancellable) { if(Arrays.stream(allowed).noneMatch(allowed -> event.getEventName().equals(allowed))) { LimboManager.getInstance().getLogger().warning(event.getEventName() + " was called!"); } } } }