mirror of
https://github.com/BentoBoxWorld/BentoBox.git
synced 2024-11-23 19:25:12 +01:00
Prevent home teleport when already home teleporting
Home teleporting is async so it's possible to issue the command multiple times. This puts a flag in so that if a playeer is mid-teleport, then issuing the go command will just repeat the text that the player is teleporting home. https://github.com/BentoBoxWorld/BentoBox/issues/1637
This commit is contained in:
parent
23857501f5
commit
5bb12d53bd
@ -32,6 +32,12 @@ public class IslandGoCommand extends DelayedTeleportCommand {
|
||||
|
||||
@Override
|
||||
public boolean canExecute(User user, String label, List<String> args) {
|
||||
// Check if mid-teleport
|
||||
if (getIslands().isGoingHome(user)) {
|
||||
// Tell them again that it's in progress
|
||||
user.sendMessage("commands.island.go.teleport");
|
||||
return false;
|
||||
}
|
||||
// Check if the island is reserved
|
||||
Island island = getIslands().getIsland(getWorld(), user.getUniqueId());
|
||||
if (island == null) {
|
||||
|
@ -104,6 +104,8 @@ public class IslandsManager {
|
||||
|
||||
private boolean isSaveTaskRunning;
|
||||
|
||||
private final Set<UUID> goingHome;
|
||||
|
||||
/**
|
||||
* Islands Manager
|
||||
* @param plugin - plugin
|
||||
@ -119,6 +121,8 @@ public class IslandsManager {
|
||||
// This list should always be empty unless database deletion failed
|
||||
// In that case a purge utility may be required in the future
|
||||
deletedIslands = new ArrayList<>();
|
||||
// Mid-teleport players going home
|
||||
goingHome = new HashSet<>();
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1057,6 +1061,7 @@ public class IslandsManager {
|
||||
CompletableFuture<Boolean> result = new CompletableFuture<>();
|
||||
User user = User.getInstance(player);
|
||||
user.sendMessage("commands.island.go.teleport");
|
||||
goingHome.add(user.getUniqueId());
|
||||
// Stop any gliding
|
||||
player.setGliding(false);
|
||||
// Check if the player is a passenger in a boat
|
||||
@ -1156,6 +1161,8 @@ public class IslandsManager {
|
||||
|
||||
// Set the game mode
|
||||
user.setGameMode(plugin.getIWM().getDefaultGameMode(world));
|
||||
// Remove from mid-teleport set
|
||||
goingHome.remove(user.getUniqueId());
|
||||
}
|
||||
}
|
||||
|
||||
@ -1882,4 +1889,12 @@ public class IslandsManager {
|
||||
return r;
|
||||
}
|
||||
|
||||
/**
|
||||
* Is user mid home teleport?
|
||||
* @return true or false
|
||||
*/
|
||||
public boolean isGoingHome(User user) {
|
||||
return goingHome.contains(user.getUniqueId());
|
||||
}
|
||||
|
||||
}
|
||||
|
@ -186,6 +186,16 @@ public class IslandGoCommandTest {
|
||||
Mockito.framework().clearInlineMocks();
|
||||
}
|
||||
|
||||
/**
|
||||
* Test method for {@link IslandGoCommand#canExecute(User, String, List)}
|
||||
*/
|
||||
@Test
|
||||
public void testExecuteMidTeleport() {
|
||||
when(im.isGoingHome(user)).thenReturn(true);
|
||||
assertFalse(igc.canExecute(user, igc.getLabel(), Collections.emptyList()));
|
||||
verify(player).sendMessage("commands.island.go.teleport");
|
||||
}
|
||||
|
||||
/**
|
||||
* Test method for {@link IslandGoCommand#canExecute(User, String, List)}
|
||||
*/
|
||||
|
Loading…
Reference in New Issue
Block a user