From 89a3bc8642378790f4562a0b9d17d03c0370d124 Mon Sep 17 00:00:00 2001 From: Ben Woo <30431861+benwoo1110@users.noreply.github.com> Date: Wed, 6 May 2026 15:28:15 +0800 Subject: [PATCH] Migrate to use dynamic listener API to support PaperMC specific events --- .../multiverse/portals/MultiversePortals.java | 26 +++++---- .../portals/listeners/MVPBlockListener.java | 11 ++-- .../portals/listeners/MVPCoreListener.java | 18 +++---- .../listeners/MVPEntityMoveListener.java | 54 +++++++++++-------- .../listeners/MVPEntityPortalListener.java | 12 +++-- .../portals/listeners/MVPPlayerListener.java | 24 ++++----- .../listeners/MVPPlayerMoveListener.java | 14 +++-- .../listeners/MVPPlayerPortalListener.java | 7 +-- .../portals/listeners/MVPVehicleListener.java | 11 ++-- .../portals/listeners/PortalsListener.java | 3 +- 10 files changed, 105 insertions(+), 75 deletions(-) diff --git a/src/main/java/org/mvplugins/multiverse/portals/MultiversePortals.java b/src/main/java/org/mvplugins/multiverse/portals/MultiversePortals.java index 239a7a1c..c835979c 100644 --- a/src/main/java/org/mvplugins/multiverse/portals/MultiversePortals.java +++ b/src/main/java/org/mvplugins/multiverse/portals/MultiversePortals.java @@ -20,7 +20,9 @@ import org.mvplugins.multiverse.core.config.CoreConfig; import org.mvplugins.multiverse.core.destination.DestinationsProvider; import org.mvplugins.multiverse.core.command.MVCommandManager; +import org.mvplugins.multiverse.core.dynamiclistener.DynamicListenerRegistration; import org.mvplugins.multiverse.core.module.MultiverseModule; +import org.mvplugins.multiverse.core.utils.ReflectHelper; import org.mvplugins.multiverse.core.utils.StringFormatter; import org.mvplugins.multiverse.external.jakarta.inject.Inject; import org.mvplugins.multiverse.external.jakarta.inject.Provider; @@ -74,6 +76,8 @@ public class MultiversePortals extends MultiverseModule { private Provider metricsConfiguratorProvider; @Inject private Provider actionHandlerProvider; + @Inject + protected Provider dynamicListenerRegistrationProvider; private FileConfiguration MVPPortalConfig; private WorldEditConnection worldEditConnection; @@ -140,23 +144,23 @@ private boolean setupConfig() { } private void registerEvents() { - var pluginManager = getServer().getPluginManager(); - - Try.run(() -> serviceLocator.getAllServices(PortalsListener.class).forEach( - listener -> pluginManager.registerEvents(listener, this))) - .onFailure(e -> { - throw new RuntimeException("Failed to register listeners. Terminating...", e); - }); + registerDynamicListeners(PortalsListener.class); + DynamicListenerRegistration dynamicListenerRegistration = dynamicListenerRegistrationProvider.get(); if (portalsConfigProvider.get().getTeleportVehicles()) { - pluginManager.registerEvents(serviceLocator.getService(MVPVehicleListener.class), this); + dynamicListenerRegistration.register(serviceLocator.getService(MVPVehicleListener.class), this); } if (portalsConfigProvider.get().getTeleportEntities()) { - pluginManager.registerEvents(serviceLocator.getService(MVPEntityPortalListener.class), this); + dynamicListenerRegistration.register(serviceLocator.getService(MVPEntityPortalListener.class), this); } if (portalsConfigProvider.get().getUseOnMove()) { - pluginManager.registerEvents(serviceLocator.getService(MVPPlayerMoveListener.class), this); + dynamicListenerRegistration.register(serviceLocator.getService(MVPPlayerMoveListener.class), this); if (portalsConfigProvider.get().getTeleportEntities()) { - pluginManager.registerEvents(serviceLocator.getService(MVPEntityMoveListener.class), this); + dynamicListenerRegistration.register(serviceLocator.getService(MVPEntityMoveListener.class), this); + if (!ReflectHelper.hasClass("io.papermc.paper.event.entity.EntityMoveEvent")) { + Logging.warning("Teleporting entities on custom/empty fills without nether portals requires" + + "PaperMC to work. You may experience issues with entities not teleporting when using custom " + + "fills if you are not using PaperMC or a fork that includes the EntityMoveEvent."); + } } } } diff --git a/src/main/java/org/mvplugins/multiverse/portals/listeners/MVPBlockListener.java b/src/main/java/org/mvplugins/multiverse/portals/listeners/MVPBlockListener.java index c6288c5e..f2ec76e6 100644 --- a/src/main/java/org/mvplugins/multiverse/portals/listeners/MVPBlockListener.java +++ b/src/main/java/org/mvplugins/multiverse/portals/listeners/MVPBlockListener.java @@ -8,11 +8,13 @@ package org.mvplugins.multiverse.portals.listeners; import org.bukkit.Material; -import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.block.BlockFromToEvent; import org.bukkit.event.block.BlockPhysicsEvent; +import org.mvplugins.multiverse.core.dynamiclistener.annotations.DefaultEventPriority; +import org.mvplugins.multiverse.core.dynamiclistener.annotations.EventMethod; +import org.mvplugins.multiverse.core.dynamiclistener.annotations.IgnoreIfCancelled; import org.mvplugins.multiverse.external.jetbrains.annotations.NotNull; import org.mvplugins.multiverse.external.jakarta.inject.Inject; import org.jvnet.hk2.annotations.Service; @@ -30,7 +32,8 @@ final class MVPBlockListener implements PortalsListener { this.portalsConfig = portalsConfig; } - @EventHandler(ignoreCancelled = true) + @EventMethod + @IgnoreIfCancelled void blockPhysics(BlockPhysicsEvent event) { if (event.getChangedType() == Material.NETHER_PORTAL || event.getBlock().getType() == Material.NETHER_PORTAL) { if (portalManager.isPortal(event.getBlock().getLocation())) { @@ -39,7 +42,9 @@ void blockPhysics(BlockPhysicsEvent event) { } } - @EventHandler(ignoreCancelled = true, priority = EventPriority.LOW) + @EventMethod + @IgnoreIfCancelled + @DefaultEventPriority(EventPriority.LOW) void blockFromTo(BlockFromToEvent event) { // The to block should never be null, but apparently it is sometimes... if (event.getBlock() == null || event.getToBlock() == null) { diff --git a/src/main/java/org/mvplugins/multiverse/portals/listeners/MVPCoreListener.java b/src/main/java/org/mvplugins/multiverse/portals/listeners/MVPCoreListener.java index be4dc81b..c3b4583b 100644 --- a/src/main/java/org/mvplugins/multiverse/portals/listeners/MVPCoreListener.java +++ b/src/main/java/org/mvplugins/multiverse/portals/listeners/MVPCoreListener.java @@ -10,6 +10,7 @@ import java.io.File; import com.dumptruckman.minecraft.util.Logging; +import org.mvplugins.multiverse.core.dynamiclistener.annotations.EventMethod; import org.mvplugins.multiverse.core.event.MVConfigReloadEvent; import org.mvplugins.multiverse.core.event.MVDebugModeEvent; import org.mvplugins.multiverse.core.event.MVDumpsDebugInfoEvent; @@ -19,7 +20,6 @@ import org.jvnet.hk2.annotations.Service; import org.mvplugins.multiverse.portals.MVPortal; import org.bukkit.Location; -import org.bukkit.event.EventHandler; import org.mvplugins.multiverse.portals.MultiversePortals; import org.mvplugins.multiverse.portals.config.PortalsConfig; @@ -42,8 +42,8 @@ final class MVPCoreListener implements PortalsListener { * This method is called when Multiverse-Core wants to know what version we are. * @param event The Version event. */ - @EventHandler - public void dumpsDebugInfoRequest(MVDumpsDebugInfoEvent event) { + @EventMethod + void dumpsDebugInfoRequest(MVDumpsDebugInfoEvent event) { event.appendDebugInfo(this.plugin.getVersionInfo()); File configFile = new File(this.plugin.getDataFolder(), "config.yml"); File portalsFile = new File(this.plugin.getDataFolder(), "portals.yml"); @@ -55,15 +55,15 @@ public void dumpsDebugInfoRequest(MVDumpsDebugInfoEvent event) { * This method is called when Multiverse-Core wants to reload the configs. * @param event The Config Reload event. */ - @EventHandler - public void configReload(MVConfigReloadEvent event) { + @EventMethod + void configReload(MVConfigReloadEvent event) { plugin.reloadConfigs(); event.addConfig("Multiverse-Portals - portals.yml"); event.addConfig("Multiverse-Portals - config.yml"); } - @EventHandler - public void debugModeChange(MVDebugModeEvent event) { + @EventMethod + void debugModeChange(MVDebugModeEvent event) { Logging.setDebugLevel(event.getLevel()); } @@ -72,8 +72,8 @@ public void debugModeChange(MVDebugModeEvent event) { * It's used to handle the intriquite messiness of priority between MV plugins. * @param event The PTP event. */ - @EventHandler - public void portalTouchEvent(MVPlayerTouchedPortalEvent event) { + @EventMethod + void portalTouchEvent(MVPlayerTouchedPortalEvent event) { Logging.finer("Found The TouchedPortal event."); Location l = event.getBlockTouched(); if (!event.canUseThisPortal() || (!this.portalManager.isPortal(l))) { diff --git a/src/main/java/org/mvplugins/multiverse/portals/listeners/MVPEntityMoveListener.java b/src/main/java/org/mvplugins/multiverse/portals/listeners/MVPEntityMoveListener.java index 4c2ba8f8..f8f9498b 100644 --- a/src/main/java/org/mvplugins/multiverse/portals/listeners/MVPEntityMoveListener.java +++ b/src/main/java/org/mvplugins/multiverse/portals/listeners/MVPEntityMoveListener.java @@ -4,17 +4,21 @@ import io.papermc.paper.event.entity.EntityMoveEvent; import org.bukkit.Location; import org.bukkit.entity.LivingEntity; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; +import org.jetbrains.annotations.ApiStatus; import org.jvnet.hk2.annotations.Service; +import org.mvplugins.multiverse.core.dynamiclistener.DynamicListener; +import org.mvplugins.multiverse.core.dynamiclistener.EventRunnable; +import org.mvplugins.multiverse.core.dynamiclistener.annotations.EventClass; +import org.mvplugins.multiverse.core.dynamiclistener.annotations.IgnoreIfCancelled; import org.mvplugins.multiverse.external.jakarta.inject.Inject; import org.mvplugins.multiverse.external.jetbrains.annotations.NotNull; import org.mvplugins.multiverse.portals.MVPortal; import org.mvplugins.multiverse.portals.config.PortalsConfig; import org.mvplugins.multiverse.portals.utils.PortalManager; +@ApiStatus.Internal @Service -public final class MVPEntityMoveListener implements Listener { +public final class MVPEntityMoveListener implements DynamicListener { private final PortalListenerHelper helper; private final PortalManager portalManager; @@ -29,24 +33,30 @@ public final class MVPEntityMoveListener implements Listener { this.portalsConfig = portalsConfig; } - @EventHandler(ignoreCancelled = true) - void entityMove(EntityMoveEvent event) { - if (helper.isWithinSameBlock(event.getFrom(), event.getTo())) { - return; - } - - LivingEntity entity = event.getEntity(); - Location location = entity.getLocation(); - - MVPortal portal = portalManager.getPortal(location); - if (portal == null - || !portal.getTeleportNonPlayers() - || (portalsConfig.getNetherAnimation() && !portal.isLegacyPortal())) { - return; - } - - Logging.fine("[EntityMoveEvent] Portal action for entity: " + entity); - helper.stateSuccess(entity.getName(), portal.getName()); - portal.runActionFor(entity); + @EventClass("io.papermc.paper.event.entity.EntityMoveEvent") + @IgnoreIfCancelled + EventRunnable entityMove() { + return new EventRunnable() { + @Override + public void onEvent(EntityMoveEvent event) { + if (helper.isWithinSameBlock(event.getFrom(), event.getTo())) { + return; + } + + LivingEntity entity = event.getEntity(); + Location location = entity.getLocation(); + + MVPortal portal = portalManager.getPortal(location); + if (portal == null + || !portal.getTeleportNonPlayers() + || (portalsConfig.getNetherAnimation() && !portal.isLegacyPortal())) { + return; + } + + Logging.fine("[EntityMoveEvent] Portal action for entity: " + entity); + helper.stateSuccess(entity.getName(), portal.getName()); + portal.runActionFor(entity); + } + }; } } diff --git a/src/main/java/org/mvplugins/multiverse/portals/listeners/MVPEntityPortalListener.java b/src/main/java/org/mvplugins/multiverse/portals/listeners/MVPEntityPortalListener.java index 2eb9ee8f..cdfda536 100644 --- a/src/main/java/org/mvplugins/multiverse/portals/listeners/MVPEntityPortalListener.java +++ b/src/main/java/org/mvplugins/multiverse/portals/listeners/MVPEntityPortalListener.java @@ -3,10 +3,12 @@ import com.dumptruckman.minecraft.util.Logging; import org.bukkit.Location; import org.bukkit.entity.Entity; -import org.bukkit.event.EventHandler; -import org.bukkit.event.Listener; import org.bukkit.event.entity.EntityPortalEvent; +import org.jetbrains.annotations.ApiStatus; import org.jvnet.hk2.annotations.Service; +import org.mvplugins.multiverse.core.dynamiclistener.DynamicListener; +import org.mvplugins.multiverse.core.dynamiclistener.annotations.EventMethod; +import org.mvplugins.multiverse.core.dynamiclistener.annotations.IgnoreIfCancelled; import org.mvplugins.multiverse.core.teleportation.BlockSafety; import org.mvplugins.multiverse.external.jakarta.inject.Inject; import org.mvplugins.multiverse.external.jetbrains.annotations.NotNull; @@ -14,8 +16,9 @@ import org.mvplugins.multiverse.portals.config.PortalsConfig; import org.mvplugins.multiverse.portals.utils.PortalManager; +@ApiStatus.Internal @Service -public final class MVPEntityPortalListener implements Listener { +public final class MVPEntityPortalListener implements DynamicListener { private final PortalManager portalManager; private final PortalsConfig portalsConfig; @@ -33,7 +36,8 @@ public final class MVPEntityPortalListener implements Listener { this.helper = helper; } - @EventHandler(ignoreCancelled = true) + @EventMethod + @IgnoreIfCancelled void entityPortal(EntityPortalEvent event) { Entity entity = event.getEntity(); Location location = entity.getLocation(); diff --git a/src/main/java/org/mvplugins/multiverse/portals/listeners/MVPPlayerListener.java b/src/main/java/org/mvplugins/multiverse/portals/listeners/MVPPlayerListener.java index 8712e8f8..a500cb24 100644 --- a/src/main/java/org/mvplugins/multiverse/portals/listeners/MVPPlayerListener.java +++ b/src/main/java/org/mvplugins/multiverse/portals/listeners/MVPPlayerListener.java @@ -8,10 +8,9 @@ package org.mvplugins.multiverse.portals.listeners; import com.dumptruckman.minecraft.util.Logging; -import org.mvplugins.multiverse.core.teleportation.BlockSafety; +import org.mvplugins.multiverse.core.dynamiclistener.annotations.DefaultEventPriority; +import org.mvplugins.multiverse.core.dynamiclistener.annotations.EventMethod; import org.mvplugins.multiverse.core.teleportation.LocationManipulation; -import org.mvplugins.multiverse.core.destination.DestinationInstance; -import org.mvplugins.multiverse.core.economy.MVEconomist; import org.mvplugins.multiverse.core.world.LoadedMultiverseWorld; import org.mvplugins.multiverse.core.world.WorldManager; import org.mvplugins.multiverse.external.jakarta.inject.Inject; @@ -22,22 +21,17 @@ import org.mvplugins.multiverse.portals.PortalPlayerSession; import org.mvplugins.multiverse.portals.WorldEditConnection; import org.mvplugins.multiverse.portals.config.PortalsConfig; -import org.mvplugins.multiverse.portals.event.MVPortalEvent; import org.mvplugins.multiverse.portals.utils.PortalFiller; import org.mvplugins.multiverse.portals.utils.PortalManager; -import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; -import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.block.Action; import org.bukkit.event.player.PlayerBucketEmptyEvent; import org.bukkit.event.player.PlayerBucketFillEvent; import org.bukkit.event.player.PlayerInteractEvent; -import org.bukkit.event.player.PlayerPortalEvent; import org.bukkit.event.player.PlayerQuitEvent; import org.bukkit.event.player.PlayerTeleportEvent; import org.bukkit.inventory.EquipmentSlot; @@ -68,12 +62,13 @@ final class MVPPlayerListener implements PortalsListener { this.worldManager = worldManager; } - @EventHandler + @EventMethod void playerQuit(PlayerQuitEvent event) { this.plugin.destroyPortalSession(event.getPlayer()); } - @EventHandler(priority = EventPriority.MONITOR) + @EventMethod + @DefaultEventPriority(EventPriority.MONITOR) void playerTeleport(PlayerTeleportEvent event) { if (event.isCancelled()) { Logging.fine("The PlayerTeleportEvent was already cancelled. Doing nothing."); @@ -83,7 +78,8 @@ void playerTeleport(PlayerTeleportEvent event) { ps.playerDidTeleport(event.getTo()); } - @EventHandler(priority = EventPriority.LOW) + @EventMethod + @DefaultEventPriority(EventPriority.LOW) void playerBucketFill(PlayerBucketFillEvent event) { if (event.isCancelled()) { Logging.fine("The PlayerBucketFillEvent was already cancelled. Doing nothing."); @@ -112,7 +108,8 @@ void playerBucketFill(PlayerBucketFillEvent event) { event.getPlayer()); } - @EventHandler(priority = EventPriority.LOW) + @EventMethod + @DefaultEventPriority(EventPriority.LOW) void playerBucketEmpty(PlayerBucketEmptyEvent event) { if (event.isCancelled()) { Logging.fine("The PlayerBucketEmptyEvent was already cancelled. Doing nothing."); @@ -153,7 +150,8 @@ void playerBucketEmpty(PlayerBucketEmptyEvent event) { this.filler.fillRegion(portal.getPortalLocation().getRegion(), translatedLocation, fillMaterial, event.getPlayer()); } - @EventHandler(priority = EventPriority.LOW) + @EventMethod + @DefaultEventPriority(EventPriority.LOW) void playerInteract(PlayerInteractEvent event) { if (event.isCancelled()) { Logging.fine("The PlayerInteractEvent was already cancelled. Doing nothing."); diff --git a/src/main/java/org/mvplugins/multiverse/portals/listeners/MVPPlayerMoveListener.java b/src/main/java/org/mvplugins/multiverse/portals/listeners/MVPPlayerMoveListener.java index 0dcb2aab..a7d68ff6 100644 --- a/src/main/java/org/mvplugins/multiverse/portals/listeners/MVPPlayerMoveListener.java +++ b/src/main/java/org/mvplugins/multiverse/portals/listeners/MVPPlayerMoveListener.java @@ -8,7 +8,11 @@ package org.mvplugins.multiverse.portals.listeners; import com.dumptruckman.minecraft.util.Logging; -import org.bukkit.event.Listener; +import org.jetbrains.annotations.ApiStatus; +import org.mvplugins.multiverse.core.dynamiclistener.DynamicListener; +import org.mvplugins.multiverse.core.dynamiclistener.annotations.DefaultEventPriority; +import org.mvplugins.multiverse.core.dynamiclistener.annotations.EventMethod; +import org.mvplugins.multiverse.core.dynamiclistener.annotations.IgnoreIfCancelled; import org.mvplugins.multiverse.external.jakarta.inject.Inject; import org.mvplugins.multiverse.external.jetbrains.annotations.NotNull; import org.jvnet.hk2.annotations.Service; @@ -21,12 +25,12 @@ import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; import org.bukkit.event.player.PlayerMoveEvent; +@ApiStatus.Internal @Service -public final class MVPPlayerMoveListener implements Listener { +public final class MVPPlayerMoveListener implements DynamicListener { private final MultiversePortals plugin; private final PortalsConfig portalsConfig; @@ -42,7 +46,9 @@ public final class MVPPlayerMoveListener implements Listener { this.helper = helper; } - @EventHandler(ignoreCancelled = true, priority = EventPriority.LOW) + @EventMethod + @IgnoreIfCancelled + @DefaultEventPriority(EventPriority.LOW) void playerMove(PlayerMoveEvent event) { Player player = event.getPlayer(); // Grab Player Location loc = player.getLocation(); // Grab Location diff --git a/src/main/java/org/mvplugins/multiverse/portals/listeners/MVPPlayerPortalListener.java b/src/main/java/org/mvplugins/multiverse/portals/listeners/MVPPlayerPortalListener.java index b9a1fb5e..6e971f15 100644 --- a/src/main/java/org/mvplugins/multiverse/portals/listeners/MVPPlayerPortalListener.java +++ b/src/main/java/org/mvplugins/multiverse/portals/listeners/MVPPlayerPortalListener.java @@ -4,11 +4,11 @@ import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.entity.Player; -import org.bukkit.event.EventHandler; import org.bukkit.event.player.PlayerPortalEvent; import org.jvnet.hk2.annotations.Service; +import org.mvplugins.multiverse.core.dynamiclistener.annotations.EventMethod; +import org.mvplugins.multiverse.core.dynamiclistener.annotations.IgnoreIfCancelled; import org.mvplugins.multiverse.core.teleportation.BlockSafety; -import org.mvplugins.multiverse.core.world.WorldManager; import org.mvplugins.multiverse.external.jakarta.inject.Inject; import org.mvplugins.multiverse.external.jetbrains.annotations.NotNull; import org.mvplugins.multiverse.portals.MVPortal; @@ -41,7 +41,8 @@ final class MVPPlayerPortalListener implements PortalsListener { this.helper = helper; } - @EventHandler(ignoreCancelled = true) + @EventMethod + @IgnoreIfCancelled void playerPortal(PlayerPortalEvent event) { Logging.finer("onPlayerPortal called!"); Player player = event.getPlayer(); diff --git a/src/main/java/org/mvplugins/multiverse/portals/listeners/MVPVehicleListener.java b/src/main/java/org/mvplugins/multiverse/portals/listeners/MVPVehicleListener.java index 561d9a31..de55371d 100644 --- a/src/main/java/org/mvplugins/multiverse/portals/listeners/MVPVehicleListener.java +++ b/src/main/java/org/mvplugins/multiverse/portals/listeners/MVPVehicleListener.java @@ -12,8 +12,9 @@ import java.util.List; import com.dumptruckman.minecraft.util.Logging; -import org.bukkit.event.Listener; -import org.mvplugins.multiverse.core.teleportation.AsyncSafetyTeleporter; +import org.jetbrains.annotations.ApiStatus; +import org.mvplugins.multiverse.core.dynamiclistener.DynamicListener; +import org.mvplugins.multiverse.core.dynamiclistener.annotations.EventMethod; import org.mvplugins.multiverse.external.jakarta.inject.Inject; import org.mvplugins.multiverse.external.jetbrains.annotations.NotNull; import org.jvnet.hk2.annotations.Service; @@ -21,7 +22,6 @@ import org.bukkit.entity.Entity; import org.bukkit.entity.Player; import org.bukkit.entity.Vehicle; -import org.bukkit.event.EventHandler; import org.bukkit.event.vehicle.VehicleMoveEvent; import org.mvplugins.multiverse.portals.MVPortal; @@ -29,8 +29,9 @@ import org.mvplugins.multiverse.portals.PortalPlayerSession; import org.mvplugins.multiverse.portals.utils.PortalManager; +@ApiStatus.Internal @Service -public final class MVPVehicleListener implements Listener { +public final class MVPVehicleListener implements DynamicListener { private final MultiversePortals plugin; private final PortalManager portalManager; private final PortalListenerHelper helper; @@ -46,7 +47,7 @@ public final class MVPVehicleListener implements Listener { this.helper = helper; } - @EventHandler + @EventMethod void vehicleMove(VehicleMoveEvent event) { if (helper.isWithinSameBlock(event.getFrom(), event.getTo())) { return; diff --git a/src/main/java/org/mvplugins/multiverse/portals/listeners/PortalsListener.java b/src/main/java/org/mvplugins/multiverse/portals/listeners/PortalsListener.java index f686289c..c76c4e35 100644 --- a/src/main/java/org/mvplugins/multiverse/portals/listeners/PortalsListener.java +++ b/src/main/java/org/mvplugins/multiverse/portals/listeners/PortalsListener.java @@ -2,10 +2,11 @@ import org.bukkit.event.Listener; import org.jvnet.hk2.annotations.Contract; +import org.mvplugins.multiverse.core.dynamiclistener.DynamicListener; /** * Base implementation for all portal listeners */ @Contract -public interface PortalsListener extends Listener { +public interface PortalsListener extends DynamicListener { }