Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
25 changes: 24 additions & 1 deletion src/main/java/world/bentobox/islandfly/IslandFlyAddon.java
Original file line number Diff line number Diff line change
@@ -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;


Expand All @@ -18,6 +28,8 @@ public class IslandFlyAddon extends Addon {
* Settings object for IslandFlyAddon
*/
private Settings settings;

private Set<GameModeAddon> hookedGameModes = new HashSet<>();

/**
* Level addon instance.
Expand Down Expand Up @@ -90,6 +102,8 @@ public void onEnable() {
});

ISLAND_FLY_PROTECTION.addGameModeAddon(gameModeAddon);

hookedGameModes.add(gameModeAddon);
}
});

Expand Down Expand Up @@ -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));
}
}
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -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();
Expand Down
29 changes: 18 additions & 11 deletions src/main/java/world/bentobox/islandfly/listeners/FlyListener.java
Original file line number Diff line number Diff line change
Expand Up @@ -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());
});

}
}
Expand All @@ -61,20 +66,22 @@ 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);
}

@EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true)
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));
}
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -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)
Expand Down
Original file line number Diff line number Diff line change
@@ -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;
Expand Down Expand Up @@ -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())
{
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -73,6 +75,8 @@ public class FlyFlagListenerTest {
private Island island;
@Mock
private Spigot spigot;
@Mock
private IslandWorldManager iwm;

/**
* @throws java.lang.Exception
Expand Down Expand Up @@ -102,20 +106,24 @@ public void setUp() throws Exception {
@NonNull
List<Player> 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);
Expand All @@ -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);
}

Expand Down