diff --git a/pom.xml b/pom.xml
index 0983cfa..6924fac 100644
--- a/pom.xml
+++ b/pom.xml
@@ -50,7 +50,7 @@
${build.version}-SNAPSHOT
- 1.14.2
+ 1.14.3
-LOCAL
BentoBoxWorld_Boxed
bentobox-world
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);
}