diff --git a/pom.xml b/pom.xml index 383f1b4..b5763e8 100644 --- a/pom.xml +++ b/pom.xml @@ -42,6 +42,7 @@ 1.19.2-R0.1-SNAPSHOT provided + org.jetbrains @@ -56,6 +57,46 @@ provided + + + org.reflections + reflections + 0.10.2 + + + + + org.apache.maven.plugins + maven-assembly-plugin + + + package + + single + + + + + wtf.beatrice.limbomanager.LimboManager + + + + jar-with-dependencies + + + + + + + + org.apache.maven.plugins + maven-javadoc-plugin + 3.4.1 + + + + + \ No newline at end of file diff --git a/src/main/java/wtf/beatrice/limbomanager/LimboManager.java b/src/main/java/wtf/beatrice/limbomanager/LimboManager.java index 43cf60a..2836af4 100644 --- a/src/main/java/wtf/beatrice/limbomanager/LimboManager.java +++ b/src/main/java/wtf/beatrice/limbomanager/LimboManager.java @@ -37,6 +37,10 @@ public class LimboManager extends JavaPlugin { pluginManager.registerEvents(new WorldLoadHandler(), this); pluginManager.registerEvents(new PlayerChatManager(), this); + SuperListener superListener = new SuperListener(); + pluginManager.registerEvents(superListener, this); + superListener.doStuff(); + // no need to check if folder exists, it will just skip creation. getDataFolder().mkdirs(); schematicsFolderPath = getDataFolder().getAbsolutePath() + File.separator + "schematics"; diff --git a/src/main/java/wtf/beatrice/limbomanager/listeners/SuperListener.java b/src/main/java/wtf/beatrice/limbomanager/listeners/SuperListener.java new file mode 100644 index 0000000..c0d2233 --- /dev/null +++ b/src/main/java/wtf/beatrice/limbomanager/listeners/SuperListener.java @@ -0,0 +1,72 @@ +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", "InventoryOpenEvent" + + }; + + private final String[] allowed = {"PlayerMoveEvent", "PlayerTeleportEvent", "ServerCommandEvent", + "StandardPaperServerListPingEventImpl", "PlayerGameModeChangeEvent", "WorldUnloadEvent", + "TimeSkipEvent", "PlayerToggleSprintEvent", "PlayerChatEvent", "AsyncPlayerChatEvent", + "GenericGameEvent", "InventoryCreativeEvent", "PlayerItemHeldEvent", "PlayerInteractEvent", + "BlockPlaceEvent", "BlockBreakEvent", "PlayerToggleSneakEvent", "PlayerKickEvent", + "InventoryClickEvent" + + }; + + public void iGetCalledForEveryEvent(Event event) { + if (Arrays.stream(dontLog).anyMatch(ignored -> event.getEventName().equals(ignored))) { + return; + } + + if(Arrays.stream(allowed).noneMatch(allowed -> event.getEventName().equals(allowed))) { + if(event instanceof Cancellable) + { + ((Cancellable) event).setCancelled(true); + } + } + + if(event instanceof Cancellable) + { + if(Arrays.stream(allowed).noneMatch(allowed -> event.getEventName().equals(allowed))) { + LimboManager.getInstance().getLogger().warning(event.getEventName() + " was called!"); + } + } + + } + +}