From c787bcfe3c260206221f23661d762281587efd2e Mon Sep 17 00:00:00 2001 From: Frank van der Heijden Date: Sat, 30 Jan 2021 16:40:43 +0100 Subject: [PATCH] Implement PluginEvent API --- .../events/BukkitPluginDisableEvent.java | 23 ++++++++++++++++ .../events/BukkitPluginEnableEvent.java | 23 ++++++++++++++++ .../bukkit/events/BukkitPluginEvent.java | 26 +++++++++++++++++++ .../bukkit/events/BukkitPluginLoadEvent.java | 23 ++++++++++++++++ .../events/BukkitPluginUnloadEvent.java | 23 ++++++++++++++++ .../bukkit/managers/BukkitPluginManager.java | 16 +++++++++++- .../events/BungeePluginDisableEvent.java | 11 ++++++++ .../events/BungeePluginEnableEvent.java | 11 ++++++++ .../bungee/events/BungeePluginEvent.java | 26 +++++++++++++++++++ .../bungee/events/BungeePluginLoadEvent.java | 11 ++++++++ .../events/BungeePluginUnloadEvent.java | 11 ++++++++ .../bungee/managers/BungeePluginManager.java | 13 ++++++++++ .../common/events/PluginDisableEvent.java | 5 ++++ .../common/events/PluginEnableEvent.java | 5 ++++ .../common/events/PluginEvent.java | 14 ++++++++++ .../common/events/PluginLoadEvent.java | 5 ++++ .../common/events/PluginUnloadEvent.java | 5 ++++ 17 files changed, 250 insertions(+), 1 deletion(-) create mode 100644 Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/events/BukkitPluginDisableEvent.java create mode 100644 Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/events/BukkitPluginEnableEvent.java create mode 100644 Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/events/BukkitPluginEvent.java create mode 100644 Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/events/BukkitPluginLoadEvent.java create mode 100644 Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/events/BukkitPluginUnloadEvent.java create mode 100644 Bungee/src/main/java/net/frankheijden/serverutils/bungee/events/BungeePluginDisableEvent.java create mode 100644 Bungee/src/main/java/net/frankheijden/serverutils/bungee/events/BungeePluginEnableEvent.java create mode 100644 Bungee/src/main/java/net/frankheijden/serverutils/bungee/events/BungeePluginEvent.java create mode 100644 Bungee/src/main/java/net/frankheijden/serverutils/bungee/events/BungeePluginLoadEvent.java create mode 100644 Bungee/src/main/java/net/frankheijden/serverutils/bungee/events/BungeePluginUnloadEvent.java create mode 100644 Common/src/main/java/net/frankheijden/serverutils/common/events/PluginDisableEvent.java create mode 100644 Common/src/main/java/net/frankheijden/serverutils/common/events/PluginEnableEvent.java create mode 100644 Common/src/main/java/net/frankheijden/serverutils/common/events/PluginEvent.java create mode 100644 Common/src/main/java/net/frankheijden/serverutils/common/events/PluginLoadEvent.java create mode 100644 Common/src/main/java/net/frankheijden/serverutils/common/events/PluginUnloadEvent.java diff --git a/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/events/BukkitPluginDisableEvent.java b/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/events/BukkitPluginDisableEvent.java new file mode 100644 index 0000000..ae7a78e --- /dev/null +++ b/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/events/BukkitPluginDisableEvent.java @@ -0,0 +1,23 @@ +package net.frankheijden.serverutils.bukkit.events; + +import net.frankheijden.serverutils.common.events.PluginDisableEvent; +import org.bukkit.event.HandlerList; +import org.bukkit.plugin.Plugin; + +public class BukkitPluginDisableEvent extends BukkitPluginEvent implements PluginDisableEvent { + + private static final HandlerList handlers = new HandlerList(); + + public BukkitPluginDisableEvent(Plugin plugin, Stage stage) { + super(plugin, stage); + } + + @Override + public HandlerList getHandlers() { + return handlers; + } + + public static HandlerList getHandlerList() { + return handlers; + } +} diff --git a/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/events/BukkitPluginEnableEvent.java b/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/events/BukkitPluginEnableEvent.java new file mode 100644 index 0000000..5e2db46 --- /dev/null +++ b/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/events/BukkitPluginEnableEvent.java @@ -0,0 +1,23 @@ +package net.frankheijden.serverutils.bukkit.events; + +import net.frankheijden.serverutils.common.events.PluginEnableEvent; +import org.bukkit.event.HandlerList; +import org.bukkit.plugin.Plugin; + +public class BukkitPluginEnableEvent extends BukkitPluginEvent implements PluginEnableEvent { + + private static final HandlerList handlers = new HandlerList(); + + public BukkitPluginEnableEvent(Plugin plugin, Stage stage) { + super(plugin, stage); + } + + @Override + public HandlerList getHandlers() { + return handlers; + } + + public static HandlerList getHandlerList() { + return handlers; + } +} diff --git a/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/events/BukkitPluginEvent.java b/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/events/BukkitPluginEvent.java new file mode 100644 index 0000000..ed5f556 --- /dev/null +++ b/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/events/BukkitPluginEvent.java @@ -0,0 +1,26 @@ +package net.frankheijden.serverutils.bukkit.events; + +import net.frankheijden.serverutils.common.events.PluginEvent; +import org.bukkit.event.Event; +import org.bukkit.plugin.Plugin; + +public abstract class BukkitPluginEvent extends Event implements PluginEvent { + + private final Plugin plugin; + private final Stage stage; + + protected BukkitPluginEvent(Plugin plugin, Stage stage) { + this.plugin = plugin; + this.stage = stage; + } + + @Override + public Plugin getPlugin() { + return plugin; + } + + @Override + public Stage getStage() { + return stage; + } +} diff --git a/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/events/BukkitPluginLoadEvent.java b/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/events/BukkitPluginLoadEvent.java new file mode 100644 index 0000000..02b3fd1 --- /dev/null +++ b/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/events/BukkitPluginLoadEvent.java @@ -0,0 +1,23 @@ +package net.frankheijden.serverutils.bukkit.events; + +import net.frankheijden.serverutils.common.events.PluginLoadEvent; +import org.bukkit.event.HandlerList; +import org.bukkit.plugin.Plugin; + +public class BukkitPluginLoadEvent extends BukkitPluginEvent implements PluginLoadEvent { + + private static final HandlerList handlers = new HandlerList(); + + public BukkitPluginLoadEvent(Plugin plugin, Stage stage) { + super(plugin, stage); + } + + @Override + public HandlerList getHandlers() { + return handlers; + } + + public static HandlerList getHandlerList() { + return handlers; + } +} diff --git a/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/events/BukkitPluginUnloadEvent.java b/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/events/BukkitPluginUnloadEvent.java new file mode 100644 index 0000000..c54c99e --- /dev/null +++ b/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/events/BukkitPluginUnloadEvent.java @@ -0,0 +1,23 @@ +package net.frankheijden.serverutils.bukkit.events; + +import net.frankheijden.serverutils.common.events.PluginUnloadEvent; +import org.bukkit.event.HandlerList; +import org.bukkit.plugin.Plugin; + +public class BukkitPluginUnloadEvent extends BukkitPluginEvent implements PluginUnloadEvent { + + private static final HandlerList handlers = new HandlerList(); + + public BukkitPluginUnloadEvent(Plugin plugin, Stage stage) { + super(plugin, stage); + } + + @Override + public HandlerList getHandlers() { + return handlers; + } + + public static HandlerList getHandlerList() { + return handlers; + } +} diff --git a/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/managers/BukkitPluginManager.java b/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/managers/BukkitPluginManager.java index 65502f0..732ef41 100644 --- a/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/managers/BukkitPluginManager.java +++ b/Bukkit/src/main/java/net/frankheijden/serverutils/bukkit/managers/BukkitPluginManager.java @@ -13,6 +13,10 @@ import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; import net.frankheijden.serverutils.bukkit.entities.BukkitLoadResult; +import net.frankheijden.serverutils.bukkit.events.BukkitPluginDisableEvent; +import net.frankheijden.serverutils.bukkit.events.BukkitPluginEnableEvent; +import net.frankheijden.serverutils.bukkit.events.BukkitPluginLoadEvent; +import net.frankheijden.serverutils.bukkit.events.BukkitPluginUnloadEvent; import net.frankheijden.serverutils.bukkit.reflection.RCommandMap; import net.frankheijden.serverutils.bukkit.reflection.RCraftServer; import net.frankheijden.serverutils.bukkit.reflection.RCraftingManager; @@ -22,6 +26,7 @@ import net.frankheijden.serverutils.bukkit.reflection.RPluginClassLoader; import net.frankheijden.serverutils.bukkit.reflection.RSimplePluginManager; import net.frankheijden.serverutils.common.entities.CloseableResult; import net.frankheijden.serverutils.common.entities.Result; +import net.frankheijden.serverutils.common.events.PluginEvent; import net.frankheijden.serverutils.common.managers.AbstractPluginManager; import org.bukkit.Bukkit; import org.bukkit.command.Command; @@ -87,7 +92,9 @@ public class BukkitPluginManager extends AbstractPluginManager { } if (plugin == null) return new BukkitLoadResult(Result.INVALID_PLUGIN); + Bukkit.getPluginManager().callEvent(new BukkitPluginLoadEvent(plugin, PluginEvent.Stage.PRE)); plugin.onLoad(); + Bukkit.getPluginManager().callEvent(new BukkitPluginLoadEvent(plugin, PluginEvent.Stage.POST)); return new BukkitLoadResult(plugin); } @@ -109,6 +116,7 @@ public class BukkitPluginManager extends AbstractPluginManager { public Result disablePlugin(Plugin plugin) { if (plugin == null) return Result.NOT_ENABLED; if (!plugin.isEnabled()) return Result.ALREADY_DISABLED; + Bukkit.getPluginManager().callEvent(new BukkitPluginDisableEvent(plugin, PluginEvent.Stage.PRE)); try { Bukkit.getPluginManager().disablePlugin(plugin); RCraftingManager.removeRecipesFor(plugin); @@ -117,6 +125,7 @@ public class BukkitPluginManager extends AbstractPluginManager { return Result.ERROR; } unregisterCommands(plugin); + Bukkit.getPluginManager().callEvent(new BukkitPluginDisableEvent(plugin, PluginEvent.Stage.POST)); return Result.SUCCESS; } @@ -138,6 +147,7 @@ public class BukkitPluginManager extends AbstractPluginManager { @Override public CloseableResult unloadPlugin(Plugin plugin) { if (plugin == null) return new CloseableResult(Result.NOT_EXISTS); + Bukkit.getPluginManager().callEvent(new BukkitPluginUnloadEvent(plugin, PluginEvent.Stage.PRE)); List closeables = new ArrayList<>(); try { RSimplePluginManager.getPlugins(Bukkit.getPluginManager()).remove(plugin); @@ -155,6 +165,7 @@ public class BukkitPluginManager extends AbstractPluginManager { ex.printStackTrace(); return new CloseableResult(Result.ERROR); } + Bukkit.getPluginManager().callEvent(new BukkitPluginUnloadEvent(plugin, PluginEvent.Stage.POST)); return new CloseableResult(closeables); } @@ -183,10 +194,13 @@ public class BukkitPluginManager extends AbstractPluginManager { if (plugin == null) return Result.NOT_EXISTS; if (Bukkit.getPluginManager().isPluginEnabled(plugin.getName())) return Result.ALREADY_ENABLED; + Bukkit.getPluginManager().callEvent(new BukkitPluginEnableEvent(plugin, PluginEvent.Stage.PRE)); Bukkit.getPluginManager().enablePlugin(plugin); RCraftServer.syncCommands(); - return Bukkit.getPluginManager().isPluginEnabled(plugin.getName()) ? Result.SUCCESS : Result.ERROR; + if (!Bukkit.getPluginManager().isPluginEnabled(plugin.getName())) return Result.ERROR; + Bukkit.getPluginManager().callEvent(new BukkitPluginEnableEvent(plugin, PluginEvent.Stage.POST)); + return Result.SUCCESS; } /** diff --git a/Bungee/src/main/java/net/frankheijden/serverutils/bungee/events/BungeePluginDisableEvent.java b/Bungee/src/main/java/net/frankheijden/serverutils/bungee/events/BungeePluginDisableEvent.java new file mode 100644 index 0000000..8b3d2d1 --- /dev/null +++ b/Bungee/src/main/java/net/frankheijden/serverutils/bungee/events/BungeePluginDisableEvent.java @@ -0,0 +1,11 @@ +package net.frankheijden.serverutils.bungee.events; + +import net.frankheijden.serverutils.common.events.PluginDisableEvent; +import net.md_5.bungee.api.plugin.Plugin; + +public class BungeePluginDisableEvent extends BungeePluginEvent implements PluginDisableEvent { + + public BungeePluginDisableEvent(Plugin plugin, Stage stage) { + super(plugin, stage); + } +} diff --git a/Bungee/src/main/java/net/frankheijden/serverutils/bungee/events/BungeePluginEnableEvent.java b/Bungee/src/main/java/net/frankheijden/serverutils/bungee/events/BungeePluginEnableEvent.java new file mode 100644 index 0000000..34f2568 --- /dev/null +++ b/Bungee/src/main/java/net/frankheijden/serverutils/bungee/events/BungeePluginEnableEvent.java @@ -0,0 +1,11 @@ +package net.frankheijden.serverutils.bungee.events; + +import net.frankheijden.serverutils.common.events.PluginEnableEvent; +import net.md_5.bungee.api.plugin.Plugin; + +public class BungeePluginEnableEvent extends BungeePluginEvent implements PluginEnableEvent { + + public BungeePluginEnableEvent(Plugin plugin, Stage stage) { + super(plugin, stage); + } +} diff --git a/Bungee/src/main/java/net/frankheijden/serverutils/bungee/events/BungeePluginEvent.java b/Bungee/src/main/java/net/frankheijden/serverutils/bungee/events/BungeePluginEvent.java new file mode 100644 index 0000000..94c9ccb --- /dev/null +++ b/Bungee/src/main/java/net/frankheijden/serverutils/bungee/events/BungeePluginEvent.java @@ -0,0 +1,26 @@ +package net.frankheijden.serverutils.bungee.events; + +import net.frankheijden.serverutils.common.events.PluginEvent; +import net.md_5.bungee.api.plugin.Event; +import net.md_5.bungee.api.plugin.Plugin; + +public abstract class BungeePluginEvent extends Event implements PluginEvent { + + private final Plugin plugin; + private final Stage stage; + + protected BungeePluginEvent(Plugin plugin, Stage stage) { + this.plugin = plugin; + this.stage = stage; + } + + @Override + public Plugin getPlugin() { + return plugin; + } + + @Override + public Stage getStage() { + return stage; + } +} diff --git a/Bungee/src/main/java/net/frankheijden/serverutils/bungee/events/BungeePluginLoadEvent.java b/Bungee/src/main/java/net/frankheijden/serverutils/bungee/events/BungeePluginLoadEvent.java new file mode 100644 index 0000000..6dc6245 --- /dev/null +++ b/Bungee/src/main/java/net/frankheijden/serverutils/bungee/events/BungeePluginLoadEvent.java @@ -0,0 +1,11 @@ +package net.frankheijden.serverutils.bungee.events; + +import net.frankheijden.serverutils.common.events.PluginLoadEvent; +import net.md_5.bungee.api.plugin.Plugin; + +public class BungeePluginLoadEvent extends BungeePluginEvent implements PluginLoadEvent { + + public BungeePluginLoadEvent(Plugin plugin, Stage stage) { + super(plugin, stage); + } +} diff --git a/Bungee/src/main/java/net/frankheijden/serverutils/bungee/events/BungeePluginUnloadEvent.java b/Bungee/src/main/java/net/frankheijden/serverutils/bungee/events/BungeePluginUnloadEvent.java new file mode 100644 index 0000000..d249340 --- /dev/null +++ b/Bungee/src/main/java/net/frankheijden/serverutils/bungee/events/BungeePluginUnloadEvent.java @@ -0,0 +1,11 @@ +package net.frankheijden.serverutils.bungee.events; + +import net.frankheijden.serverutils.common.events.PluginUnloadEvent; +import net.md_5.bungee.api.plugin.Plugin; + +public class BungeePluginUnloadEvent extends BungeePluginEvent implements PluginUnloadEvent { + + public BungeePluginUnloadEvent(Plugin plugin, Stage stage) { + super(plugin, stage); + } +} diff --git a/Bungee/src/main/java/net/frankheijden/serverutils/bungee/managers/BungeePluginManager.java b/Bungee/src/main/java/net/frankheijden/serverutils/bungee/managers/BungeePluginManager.java index 83e344a..ccc4274 100644 --- a/Bungee/src/main/java/net/frankheijden/serverutils/bungee/managers/BungeePluginManager.java +++ b/Bungee/src/main/java/net/frankheijden/serverutils/bungee/managers/BungeePluginManager.java @@ -17,10 +17,15 @@ import java.util.jar.JarFile; import java.util.logging.Level; import java.util.stream.Collectors; import net.frankheijden.serverutils.bungee.entities.BungeeLoadResult; +import net.frankheijden.serverutils.bungee.events.BungeePluginDisableEvent; +import net.frankheijden.serverutils.bungee.events.BungeePluginEnableEvent; +import net.frankheijden.serverutils.bungee.events.BungeePluginLoadEvent; +import net.frankheijden.serverutils.bungee.events.BungeePluginUnloadEvent; import net.frankheijden.serverutils.bungee.reflection.RPluginClassLoader; import net.frankheijden.serverutils.bungee.reflection.RPluginManager; import net.frankheijden.serverutils.common.entities.CloseableResult; import net.frankheijden.serverutils.common.entities.Result; +import net.frankheijden.serverutils.common.events.PluginEvent; import net.frankheijden.serverutils.common.managers.AbstractPluginManager; import net.md_5.bungee.api.ProxyServer; import net.md_5.bungee.api.plugin.Plugin; @@ -84,10 +89,12 @@ public class BungeePluginManager extends AbstractPluginManager { Plugin plugin = (Plugin) main.getDeclaredConstructor().newInstance(); RPluginManager.getPlugins(proxy.getPluginManager()).put(desc.getName(), plugin); + proxy.getPluginManager().callEvent(new BungeePluginLoadEvent(plugin, PluginEvent.Stage.PRE)); plugin.onLoad(); proxy.getLogger().log(Level.INFO, "Loaded plugin {0} version {1} by {2}", new Object[] { desc.getName(), desc.getVersion(), desc.getAuthor() }); + proxy.getPluginManager().callEvent(new BungeePluginLoadEvent(plugin, PluginEvent.Stage.POST)); return new BungeeLoadResult(plugin); } catch (Throwable th) { proxy.getLogger().log(Level.WARNING, "Error loading plugin " + desc.getName(), th); @@ -99,10 +106,12 @@ public class BungeePluginManager extends AbstractPluginManager { public Result enablePlugin(Plugin plugin) { PluginDescription desc = plugin.getDescription(); String name = desc.getName(); + proxy.getPluginManager().callEvent(new BungeePluginEnableEvent(plugin, PluginEvent.Stage.PRE)); try { plugin.onEnable(); Object[] args = new Object[] { name, desc.getVersion(), desc.getAuthor() }; proxy.getLogger().log(Level.INFO, "Enabled plugin {0} version {1} by {2}", args); + proxy.getPluginManager().callEvent(new BungeePluginEnableEvent(plugin, PluginEvent.Stage.POST)); return Result.SUCCESS; } catch (Throwable th) { proxy.getLogger().log(Level.WARNING, "Exception encountered when loading plugin: " + name, th); @@ -114,8 +123,10 @@ public class BungeePluginManager extends AbstractPluginManager { public Result disablePlugin(Plugin plugin) { PluginDescription desc = plugin.getDescription(); String name = desc.getName(); + proxy.getPluginManager().callEvent(new BungeePluginDisableEvent(plugin, PluginEvent.Stage.PRE)); try { plugin.onDisable(); + proxy.getPluginManager().callEvent(new BungeePluginDisableEvent(plugin, PluginEvent.Stage.POST)); return Result.SUCCESS; } catch (Throwable th) { proxy.getLogger().log(Level.WARNING, "Exception encountered when disabling plugin: " + name, th); @@ -154,6 +165,7 @@ public class BungeePluginManager extends AbstractPluginManager { @Override public CloseableResult unloadPlugin(Plugin plugin) { + proxy.getPluginManager().callEvent(new BungeePluginUnloadEvent(plugin, PluginEvent.Stage.PRE)); plugin.onDisable(); proxy.getPluginManager().unregisterCommands(plugin); proxy.getPluginManager().unregisterListeners(plugin); @@ -167,6 +179,7 @@ public class BungeePluginManager extends AbstractPluginManager { ex.printStackTrace(); return new CloseableResult(Result.ERROR); } + proxy.getPluginManager().callEvent(new BungeePluginUnloadEvent(plugin, PluginEvent.Stage.POST)); return new CloseableResult(closeables); } diff --git a/Common/src/main/java/net/frankheijden/serverutils/common/events/PluginDisableEvent.java b/Common/src/main/java/net/frankheijden/serverutils/common/events/PluginDisableEvent.java new file mode 100644 index 0000000..392610d --- /dev/null +++ b/Common/src/main/java/net/frankheijden/serverutils/common/events/PluginDisableEvent.java @@ -0,0 +1,5 @@ +package net.frankheijden.serverutils.common.events; + +public interface PluginDisableEvent { + +} diff --git a/Common/src/main/java/net/frankheijden/serverutils/common/events/PluginEnableEvent.java b/Common/src/main/java/net/frankheijden/serverutils/common/events/PluginEnableEvent.java new file mode 100644 index 0000000..b37c7d4 --- /dev/null +++ b/Common/src/main/java/net/frankheijden/serverutils/common/events/PluginEnableEvent.java @@ -0,0 +1,5 @@ +package net.frankheijden.serverutils.common.events; + +public interface PluginEnableEvent { + +} diff --git a/Common/src/main/java/net/frankheijden/serverutils/common/events/PluginEvent.java b/Common/src/main/java/net/frankheijden/serverutils/common/events/PluginEvent.java new file mode 100644 index 0000000..5a328ba --- /dev/null +++ b/Common/src/main/java/net/frankheijden/serverutils/common/events/PluginEvent.java @@ -0,0 +1,14 @@ +package net.frankheijden.serverutils.common.events; + +public interface PluginEvent { + + enum Stage { + PRE, + POST + } + + T getPlugin(); + + Stage getStage(); + +} diff --git a/Common/src/main/java/net/frankheijden/serverutils/common/events/PluginLoadEvent.java b/Common/src/main/java/net/frankheijden/serverutils/common/events/PluginLoadEvent.java new file mode 100644 index 0000000..396be46 --- /dev/null +++ b/Common/src/main/java/net/frankheijden/serverutils/common/events/PluginLoadEvent.java @@ -0,0 +1,5 @@ +package net.frankheijden.serverutils.common.events; + +public interface PluginLoadEvent { + +} diff --git a/Common/src/main/java/net/frankheijden/serverutils/common/events/PluginUnloadEvent.java b/Common/src/main/java/net/frankheijden/serverutils/common/events/PluginUnloadEvent.java new file mode 100644 index 0000000..c867288 --- /dev/null +++ b/Common/src/main/java/net/frankheijden/serverutils/common/events/PluginUnloadEvent.java @@ -0,0 +1,5 @@ +package net.frankheijden.serverutils.common.events; + +public interface PluginUnloadEvent { + +}