Skip to content

Commit a97fa8a

Browse files
authored
Merge pull request #129 from BentoBoxWorld/113_flying_in_other_worlds
Fixes issue where fly is disabled in other worlds #113
2 parents 35f5163 + 7a42830 commit a97fa8a

File tree

6 files changed

+77
-15
lines changed

6 files changed

+77
-15
lines changed

src/main/java/world/bentobox/islandfly/IslandFlyAddon.java

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,22 @@
11
package world.bentobox.islandfly;
22

3+
import java.util.HashSet;
4+
import java.util.Set;
5+
36
import org.bukkit.Material;
7+
import org.bukkit.World;
8+
49
import world.bentobox.bentobox.api.addons.Addon;
10+
import world.bentobox.bentobox.api.addons.GameModeAddon;
511
import world.bentobox.bentobox.api.configuration.Config;
612
import world.bentobox.bentobox.api.flags.Flag;
713
import world.bentobox.bentobox.managers.RanksManager;
814
import world.bentobox.islandfly.config.Settings;
9-
import world.bentobox.islandfly.listeners.*;
15+
import world.bentobox.islandfly.listeners.FlyDeathListener;
16+
import world.bentobox.islandfly.listeners.FlyFlagListener;
17+
import world.bentobox.islandfly.listeners.FlyListener;
18+
import world.bentobox.islandfly.listeners.FlyLoginListener;
19+
import world.bentobox.islandfly.listeners.FlyLogoutListener;
1020
import world.bentobox.level.Level;
1121

1222

@@ -18,6 +28,8 @@ public class IslandFlyAddon extends Addon {
1828
* Settings object for IslandFlyAddon
1929
*/
2030
private Settings settings;
31+
32+
private Set<GameModeAddon> hookedGameModes = new HashSet<>();
2133

2234
/**
2335
* Level addon instance.
@@ -90,6 +102,8 @@ public void onEnable() {
90102
});
91103

92104
ISLAND_FLY_PROTECTION.addGameModeAddon(gameModeAddon);
105+
106+
hookedGameModes.add(gameModeAddon);
93107
}
94108
});
95109

@@ -163,4 +177,13 @@ public Level getLevelAddon()
163177
{
164178
return levelAddon;
165179
}
180+
181+
/**
182+
* Return if the world is covered by this addon
183+
* @param world world to check
184+
* @return true if it is
185+
*/
186+
public boolean inWorld(World world) {
187+
return hookedGameModes.stream().anyMatch(gm -> gm.inWorld(world));
188+
}
166189
}

src/main/java/world/bentobox/islandfly/listeners/FlyFlagListener.java

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package world.bentobox.islandfly.listeners;
22

33
import org.bukkit.Bukkit;
4+
import org.bukkit.GameMode;
45
import org.bukkit.entity.Player;
56
import org.bukkit.event.EventHandler;
67
import org.bukkit.event.Listener;
@@ -30,13 +31,20 @@ public void onFlagChange(FlagProtectionChangeEvent e) {
3031
// the moment and warn them that their fly is about to turn off
3132
island.getPlayersOnIsland()
3233
.stream()
33-
//.parallelStream()
3434
.filter(Player::isFlying)
35-
.filter(p -> !p.isOp())
35+
.filter(this::checkPlayer)
3636
.filter(p -> !(island.isAllowed(User.getInstance(p), IslandFlyAddon.ISLAND_FLY_PROTECTION)))
3737
.forEach(p -> startDisabling(p, island));
3838
}
39-
39+
40+
private boolean checkPlayer(Player p) {
41+
final String permPrefix = addon.getPlugin().getIWM().getPermissionPrefix(p.getWorld());
42+
return !(p.isOp()
43+
|| p.getGameMode().equals(GameMode.CREATIVE)
44+
|| p.getGameMode().equals(GameMode.SPECTATOR)
45+
|| p.hasPermission(permPrefix + "island.flybypass"));
46+
}
47+
4048
private void startDisabling(Player p, Island island) {
4149

4250
int flyTimeout = this.addon.getSettings().getFlyTimeout();

src/main/java/world/bentobox/islandfly/listeners/FlyListener.java

Lines changed: 18 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -39,15 +39,20 @@ public FlyListener(final IslandFlyAddon islandFlyAddon) {
3939

4040
@EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true)
4141
public void onToggleFlight(final PlayerToggleFlightEvent event) {
42+
// Check world
43+
if (!addon.inWorld(event.getPlayer().getWorld())) {
44+
// Ignore
45+
return;
46+
}
4247
final User user = User.getInstance(event.getPlayer());
4348
if (checkUser(user)) {
4449
user.sendMessage("islandfly.not-allowed");
4550
} else {
4651
addon.getIslands().getIslandAt(user.getLocation())
47-
.filter(i -> i.getMemberSet().contains(user.getUniqueId())).ifPresent(is -> {
48-
user.putMetaData(ISLANDFLY + is.getUniqueId(), new MetaDataValue(event.isFlying()));
49-
addon.getPlayers().savePlayer(user.getUniqueId());
50-
});
52+
.filter(i -> i.getMemberSet().contains(user.getUniqueId())).ifPresent(is -> {
53+
user.putMetaData(ISLANDFLY + is.getUniqueId(), new MetaDataValue(event.isFlying()));
54+
addon.getPlayers().savePlayer(user.getUniqueId());
55+
});
5156

5257
}
5358
}
@@ -61,20 +66,22 @@ private boolean checkUser(User user) {
6166
// Ignore ops
6267
if (user.isOp() || user.getPlayer().getGameMode().equals(GameMode.CREATIVE)
6368
|| user.getPlayer().getGameMode().equals(GameMode.SPECTATOR)
64-
|| user.hasPermission(permPrefix + "island.flybypass")) return false;
69+
|| user.hasPermission(permPrefix + "island.flybypass")) {
70+
return false;
71+
}
6572
return removeFly(user);
6673
}
6774

6875
@EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true)
6976
public void onEnterIsland(final IslandEnterEvent event) {
7077
final User user = User.getInstance(event.getPlayerUUID());
7178
user.getMetaData(ISLANDFLY + event.getIsland().getUniqueId())
72-
.ifPresent(mdv -> {
73-
if (mdv.asBoolean()) {
74-
user.getPlayer().setAllowFlight(true);
75-
user.getPlayer().setFlying(mdv.asBoolean());
76-
}
77-
});
79+
.ifPresent(mdv -> {
80+
if (mdv.asBoolean()) {
81+
user.getPlayer().setAllowFlight(true);
82+
user.getPlayer().setFlying(mdv.asBoolean());
83+
}
84+
});
7885
// Wait until after arriving at the island
7986
Bukkit.getScheduler().runTask(this.addon.getPlugin(), () -> checkUser(user));
8087
}

src/main/java/world/bentobox/islandfly/listeners/FlyLoginListener.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package world.bentobox.islandfly.listeners;
22

3+
import org.bukkit.GameMode;
34
import org.bukkit.block.Block;
45
import org.bukkit.block.BlockFace;
56
import org.bukkit.entity.Player;
@@ -41,6 +42,11 @@ public void onLogin(final PlayerJoinEvent event) {
4142
final Player player = event.getPlayer();
4243
final User user = User.getInstance(player);
4344
final String permPrefix = islandFlyAddon.getPlugin().getIWM().getPermissionPrefix(player.getWorld());
45+
if (user.isOp() || user.getPlayer().getGameMode().equals(GameMode.CREATIVE)
46+
|| user.getPlayer().getGameMode().equals(GameMode.SPECTATOR)
47+
|| user.hasPermission(permPrefix + "island.flybypass")) {
48+
return;
49+
}
4450
if (player.hasPermission(permPrefix + "island.fly")
4551
&& !this.islandFlyAddon.getSettings().isFlyDisableOnLogout()
4652
&& isInAir(player)

src/main/java/world/bentobox/islandfly/listeners/FlyLogoutListener.java

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package world.bentobox.islandfly.listeners;
22

3+
import org.bukkit.GameMode;
34
import org.bukkit.entity.Player;
45
import org.bukkit.event.EventHandler;
56
import org.bukkit.event.EventPriority;
@@ -36,6 +37,12 @@ public FlyLogoutListener(IslandFlyAddon addon)
3637
@EventHandler(priority = EventPriority.NORMAL, ignoreCancelled = true)
3738
public void onLogout(final PlayerQuitEvent event) {
3839
final Player player = event.getPlayer();
40+
String permPrefix = addon.getPlugin().getIWM().getPermissionPrefix(player.getWorld());
41+
if (player.isOp() || player.getGameMode().equals(GameMode.CREATIVE)
42+
|| player.getGameMode().equals(GameMode.SPECTATOR)
43+
|| player.hasPermission(permPrefix + "island.flybypass")) {
44+
return;
45+
}
3946

4047
if (player.getAllowFlight() && this.addon.getSettings().isFlyDisableOnLogout())
4148
{

src/test/java/world/bentobox/islandfly/listeners/FlyFlagListenerTest.java

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515
import java.util.UUID;
1616

1717
import org.bukkit.Bukkit;
18+
import org.bukkit.GameMode;
1819
import org.bukkit.Location;
1920
import org.bukkit.entity.Player;
2021
import org.bukkit.entity.Player.Spigot;
@@ -37,6 +38,7 @@
3738
import world.bentobox.bentobox.api.flags.Flag;
3839
import world.bentobox.bentobox.api.user.User;
3940
import world.bentobox.bentobox.database.objects.Island;
41+
import world.bentobox.bentobox.managers.IslandWorldManager;
4042
import world.bentobox.bentobox.managers.LocalesManager;
4143
import world.bentobox.bentobox.managers.PlaceholdersManager;
4244
import world.bentobox.islandfly.IslandFlyAddon;
@@ -73,6 +75,8 @@ public class FlyFlagListenerTest {
7375
private Island island;
7476
@Mock
7577
private Spigot spigot;
78+
@Mock
79+
private IslandWorldManager iwm;
7680

7781
/**
7882
* @throws java.lang.Exception
@@ -102,20 +106,24 @@ public void setUp() throws Exception {
102106
@NonNull
103107
List<Player> list = new ArrayList<>();
104108
when(p1.getUniqueId()).thenReturn(UUID.randomUUID());
109+
when(p1.getGameMode()).thenReturn(GameMode.SURVIVAL);
105110
when(p1.spigot()).thenReturn(spigot);
106111
User.getInstance(p1);
107112
when(p1.isFlying()).thenReturn(true);
108113
when(p2.getUniqueId()).thenReturn(UUID.randomUUID());
114+
when(p2.getGameMode()).thenReturn(GameMode.SURVIVAL);
109115
when(p2.spigot()).thenReturn(spigot);
110116
User.getInstance(p2);
111117
when(p2.isFlying()).thenReturn(true);
112118
when(p2.isOnline()).thenReturn(true);
113119
when(p2.getLocation()).thenReturn(mock(Location.class));
114120
when(p3.getUniqueId()).thenReturn(UUID.randomUUID());
121+
when(p3.getGameMode()).thenReturn(GameMode.SURVIVAL);
115122
when(p3.spigot()).thenReturn(spigot);
116123
User.getInstance(p3);
117124
when(p3.isFlying()).thenReturn(false);
118125
when(op.getUniqueId()).thenReturn(UUID.randomUUID());
126+
when(op.getGameMode()).thenReturn(GameMode.SURVIVAL);
119127
when(op.spigot()).thenReturn(spigot);
120128
User.getInstance(op);
121129
when(op.isFlying()).thenReturn(true);
@@ -129,6 +137,9 @@ public void setUp() throws Exception {
129137
when(island.isAllowed(any(), any())).thenReturn(true, false);
130138
when(island.onIsland(any())).thenReturn(true);
131139

140+
// IWM
141+
when(plugin.getIWM()).thenReturn(iwm);
142+
132143
ffl = new FlyFlagListener(addon);
133144
}
134145

0 commit comments

Comments
 (0)