diff --git a/src/main/java/world/bentobox/islandfly/IslandFlyAddon.java b/src/main/java/world/bentobox/islandfly/IslandFlyAddon.java index 9cedb82..28ec8f4 100644 --- a/src/main/java/world/bentobox/islandfly/IslandFlyAddon.java +++ b/src/main/java/world/bentobox/islandfly/IslandFlyAddon.java @@ -1,12 +1,22 @@ package world.bentobox.islandfly; +import java.util.HashSet; +import java.util.Set; + import org.bukkit.Material; +import org.bukkit.World; + import world.bentobox.bentobox.api.addons.Addon; +import world.bentobox.bentobox.api.addons.GameModeAddon; import world.bentobox.bentobox.api.configuration.Config; import world.bentobox.bentobox.api.flags.Flag; import world.bentobox.bentobox.managers.RanksManager; import world.bentobox.islandfly.config.Settings; -import world.bentobox.islandfly.listeners.*; +import world.bentobox.islandfly.listeners.FlyDeathListener; +import world.bentobox.islandfly.listeners.FlyFlagListener; +import world.bentobox.islandfly.listeners.FlyListener; +import world.bentobox.islandfly.listeners.FlyLoginListener; +import world.bentobox.islandfly.listeners.FlyLogoutListener; import world.bentobox.level.Level; @@ -18,6 +28,8 @@ public class IslandFlyAddon extends Addon { * Settings object for IslandFlyAddon */ private Settings settings; + + private Set hookedGameModes = new HashSet<>(); /** * Level addon instance. @@ -90,6 +102,8 @@ public void onEnable() { }); ISLAND_FLY_PROTECTION.addGameModeAddon(gameModeAddon); + + hookedGameModes.add(gameModeAddon); } }); @@ -163,4 +177,13 @@ public Level getLevelAddon() { return levelAddon; } + + /** + * Return if the world is covered by this addon + * @param world world to check + * @return true if it is + */ + public boolean inWorld(World world) { + return hookedGameModes.stream().anyMatch(gm -> gm.inWorld(world)); + } } diff --git a/src/main/java/world/bentobox/islandfly/listeners/FlyFlagListener.java b/src/main/java/world/bentobox/islandfly/listeners/FlyFlagListener.java index 69643b7..b8baed2 100644 --- a/src/main/java/world/bentobox/islandfly/listeners/FlyFlagListener.java +++ b/src/main/java/world/bentobox/islandfly/listeners/FlyFlagListener.java @@ -1,6 +1,7 @@ package world.bentobox.islandfly.listeners; import org.bukkit.Bukkit; +import org.bukkit.GameMode; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.Listener; @@ -30,13 +31,20 @@ public void onFlagChange(FlagProtectionChangeEvent e) { // the moment and warn them that their fly is about to turn off island.getPlayersOnIsland() .stream() - //.parallelStream() .filter(Player::isFlying) - .filter(p -> !p.isOp()) + .filter(this::checkPlayer) .filter(p -> !(island.isAllowed(User.getInstance(p), IslandFlyAddon.ISLAND_FLY_PROTECTION))) .forEach(p -> startDisabling(p, island)); } - + + private boolean checkPlayer(Player p) { + final String permPrefix = addon.getPlugin().getIWM().getPermissionPrefix(p.getWorld()); + return !(p.isOp() + || p.getGameMode().equals(GameMode.CREATIVE) + || p.getGameMode().equals(GameMode.SPECTATOR) + || p.hasPermission(permPrefix + "island.flybypass")); + } + private void startDisabling(Player p, Island island) { int flyTimeout = this.addon.getSettings().getFlyTimeout(); diff --git a/src/main/java/world/bentobox/islandfly/listeners/FlyListener.java b/src/main/java/world/bentobox/islandfly/listeners/FlyListener.java index 6df144a..18ba37c 100644 --- a/src/main/java/world/bentobox/islandfly/listeners/FlyListener.java +++ b/src/main/java/world/bentobox/islandfly/listeners/FlyListener.java @@ -39,15 +39,20 @@ public FlyListener(final IslandFlyAddon islandFlyAddon) { @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) public void onToggleFlight(final PlayerToggleFlightEvent event) { + // Check world + if (!addon.inWorld(event.getPlayer().getWorld())) { + // Ignore + return; + } final User user = User.getInstance(event.getPlayer()); if (checkUser(user)) { user.sendMessage("islandfly.not-allowed"); } else { addon.getIslands().getIslandAt(user.getLocation()) - .filter(i -> i.getMemberSet().contains(user.getUniqueId())).ifPresent(is -> { - user.putMetaData(ISLANDFLY + is.getUniqueId(), new MetaDataValue(event.isFlying())); - addon.getPlayers().savePlayer(user.getUniqueId()); - }); + .filter(i -> i.getMemberSet().contains(user.getUniqueId())).ifPresent(is -> { + user.putMetaData(ISLANDFLY + is.getUniqueId(), new MetaDataValue(event.isFlying())); + addon.getPlayers().savePlayer(user.getUniqueId()); + }); } } @@ -61,7 +66,9 @@ private boolean checkUser(User user) { // Ignore ops if (user.isOp() || user.getPlayer().getGameMode().equals(GameMode.CREATIVE) || user.getPlayer().getGameMode().equals(GameMode.SPECTATOR) - || user.hasPermission(permPrefix + "island.flybypass")) return false; + || user.hasPermission(permPrefix + "island.flybypass")) { + return false; + } return removeFly(user); } @@ -69,12 +76,12 @@ private boolean checkUser(User user) { public void onEnterIsland(final IslandEnterEvent event) { final User user = User.getInstance(event.getPlayerUUID()); user.getMetaData(ISLANDFLY + event.getIsland().getUniqueId()) - .ifPresent(mdv -> { - if (mdv.asBoolean()) { - user.getPlayer().setAllowFlight(true); - user.getPlayer().setFlying(mdv.asBoolean()); - } - }); + .ifPresent(mdv -> { + if (mdv.asBoolean()) { + user.getPlayer().setAllowFlight(true); + user.getPlayer().setFlying(mdv.asBoolean()); + } + }); // Wait until after arriving at the island Bukkit.getScheduler().runTask(this.addon.getPlugin(), () -> checkUser(user)); } diff --git a/src/main/java/world/bentobox/islandfly/listeners/FlyLoginListener.java b/src/main/java/world/bentobox/islandfly/listeners/FlyLoginListener.java index 64f7a3a..8705f8f 100644 --- a/src/main/java/world/bentobox/islandfly/listeners/FlyLoginListener.java +++ b/src/main/java/world/bentobox/islandfly/listeners/FlyLoginListener.java @@ -1,5 +1,6 @@ package world.bentobox.islandfly.listeners; +import org.bukkit.GameMode; import org.bukkit.block.Block; import org.bukkit.block.BlockFace; import org.bukkit.entity.Player; @@ -41,6 +42,11 @@ public void onLogin(final PlayerJoinEvent event) { final Player player = event.getPlayer(); final User user = User.getInstance(player); final String permPrefix = islandFlyAddon.getPlugin().getIWM().getPermissionPrefix(player.getWorld()); + if (user.isOp() || user.getPlayer().getGameMode().equals(GameMode.CREATIVE) + || user.getPlayer().getGameMode().equals(GameMode.SPECTATOR) + || user.hasPermission(permPrefix + "island.flybypass")) { + return; + } if (player.hasPermission(permPrefix + "island.fly") && !this.islandFlyAddon.getSettings().isFlyDisableOnLogout() && isInAir(player) diff --git a/src/main/java/world/bentobox/islandfly/listeners/FlyLogoutListener.java b/src/main/java/world/bentobox/islandfly/listeners/FlyLogoutListener.java index dd1d3b0..a3e3fce 100644 --- a/src/main/java/world/bentobox/islandfly/listeners/FlyLogoutListener.java +++ b/src/main/java/world/bentobox/islandfly/listeners/FlyLogoutListener.java @@ -1,5 +1,6 @@ package world.bentobox.islandfly.listeners; +import org.bukkit.GameMode; import org.bukkit.entity.Player; import org.bukkit.event.EventHandler; import org.bukkit.event.EventPriority; @@ -36,6 +37,12 @@ public FlyLogoutListener(IslandFlyAddon addon) @EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true) public void onLogout(final PlayerQuitEvent event) { final Player player = event.getPlayer(); + String permPrefix = addon.getPlugin().getIWM().getPermissionPrefix(player.getWorld()); + if (player.isOp() || player.getGameMode().equals(GameMode.CREATIVE) + || player.getGameMode().equals(GameMode.SPECTATOR) + || player.hasPermission(permPrefix + "island.flybypass")) { + return; + } if (player.getAllowFlight() && this.addon.getSettings().isFlyDisableOnLogout()) { diff --git a/src/test/java/world/bentobox/islandfly/listeners/FlyFlagListenerTest.java b/src/test/java/world/bentobox/islandfly/listeners/FlyFlagListenerTest.java index 4426484..4cc1d8b 100644 --- a/src/test/java/world/bentobox/islandfly/listeners/FlyFlagListenerTest.java +++ b/src/test/java/world/bentobox/islandfly/listeners/FlyFlagListenerTest.java @@ -15,6 +15,7 @@ import java.util.UUID; import org.bukkit.Bukkit; +import org.bukkit.GameMode; import org.bukkit.Location; import org.bukkit.entity.Player; import org.bukkit.entity.Player.Spigot; @@ -37,6 +38,7 @@ import world.bentobox.bentobox.api.flags.Flag; import world.bentobox.bentobox.api.user.User; import world.bentobox.bentobox.database.objects.Island; +import world.bentobox.bentobox.managers.IslandWorldManager; import world.bentobox.bentobox.managers.LocalesManager; import world.bentobox.bentobox.managers.PlaceholdersManager; import world.bentobox.islandfly.IslandFlyAddon; @@ -73,6 +75,8 @@ public class FlyFlagListenerTest { private Island island; @Mock private Spigot spigot; + @Mock + private IslandWorldManager iwm; /** * @throws java.lang.Exception @@ -102,20 +106,24 @@ public void setUp() throws Exception { @NonNull List list = new ArrayList<>(); when(p1.getUniqueId()).thenReturn(UUID.randomUUID()); + when(p1.getGameMode()).thenReturn(GameMode.SURVIVAL); when(p1.spigot()).thenReturn(spigot); User.getInstance(p1); when(p1.isFlying()).thenReturn(true); when(p2.getUniqueId()).thenReturn(UUID.randomUUID()); + when(p2.getGameMode()).thenReturn(GameMode.SURVIVAL); when(p2.spigot()).thenReturn(spigot); User.getInstance(p2); when(p2.isFlying()).thenReturn(true); when(p2.isOnline()).thenReturn(true); when(p2.getLocation()).thenReturn(mock(Location.class)); when(p3.getUniqueId()).thenReturn(UUID.randomUUID()); + when(p3.getGameMode()).thenReturn(GameMode.SURVIVAL); when(p3.spigot()).thenReturn(spigot); User.getInstance(p3); when(p3.isFlying()).thenReturn(false); when(op.getUniqueId()).thenReturn(UUID.randomUUID()); + when(op.getGameMode()).thenReturn(GameMode.SURVIVAL); when(op.spigot()).thenReturn(spigot); User.getInstance(op); when(op.isFlying()).thenReturn(true); @@ -129,6 +137,9 @@ public void setUp() throws Exception { when(island.isAllowed(any(), any())).thenReturn(true, false); when(island.onIsland(any())).thenReturn(true); + // IWM + when(plugin.getIWM()).thenReturn(iwm); + ffl = new FlyFlagListener(addon); }