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!");
+ }
+ }
+
+ }
+
+}