From 7126e837edeb1a185f8efb7f33c8d1bbc34fd6e4 Mon Sep 17 00:00:00 2001 From: tastybento Date: Thu, 16 May 2024 21:02:45 -0700 Subject: [PATCH] Admin command updates (#2367) * Enables tp'ing to specific islands of a player * Admin delete command. Fixes to admin tp command. --- .../bentobox/bentobox/api/addons/Pladdon.java | 5 - .../commands/admin/AdminDeleteCommand.java | 126 ++++++++--- .../commands/admin/AdminTeleportCommand.java | 105 ++++++--- .../admin/AdminTeleportUserCommand.java | 199 ++++++++++++++++++ src/main/resources/locales/en-US.yml | 2 +- .../admin/AdminDeleteCommandTest.java | 18 +- 6 files changed, 390 insertions(+), 65 deletions(-) create mode 100644 src/main/java/world/bentobox/bentobox/api/commands/admin/AdminTeleportUserCommand.java diff --git a/src/main/java/world/bentobox/bentobox/api/addons/Pladdon.java b/src/main/java/world/bentobox/bentobox/api/addons/Pladdon.java index 20c4ec72c..af11005db 100644 --- a/src/main/java/world/bentobox/bentobox/api/addons/Pladdon.java +++ b/src/main/java/world/bentobox/bentobox/api/addons/Pladdon.java @@ -7,8 +7,6 @@ import org.bukkit.plugin.java.JavaPlugin; import com.google.common.io.Files; -import world.bentobox.bentobox.BentoBox; - /** * Provides a shell for addons to become Plugins so that other Plugins * can tap into their API more easily. Plugin + addon = Pladdon @@ -18,8 +16,6 @@ import world.bentobox.bentobox.BentoBox; public abstract class Pladdon extends JavaPlugin { private static final String ADDONS_FOLDER = "BentoBox" + File.separator + "addons"; - private static final String PAPER_REMAPPED = "plugins" + File.separator + ".paper-remapped" + File.separator - + "unknown-origin"; /** * This must return a new instance of the addon. It is called when the Pladdon is loaded. @@ -30,7 +26,6 @@ public abstract class Pladdon extends JavaPlugin { @Override public void onLoad() { String parentFolder = getFile().getParent(); - BentoBox.getInstance().logDebug("LOOK HERE: " + parentFolder); if (parentFolder == null || !parentFolder.endsWith(ADDONS_FOLDER)) { // Jar is in the wrong place. Let's move it //moveJar(); diff --git a/src/main/java/world/bentobox/bentobox/api/commands/admin/AdminDeleteCommand.java b/src/main/java/world/bentobox/bentobox/api/commands/admin/AdminDeleteCommand.java index 1c3a4c652..2ea7e5ded 100644 --- a/src/main/java/world/bentobox/bentobox/api/commands/admin/AdminDeleteCommand.java +++ b/src/main/java/world/bentobox/bentobox/api/commands/admin/AdminDeleteCommand.java @@ -1,10 +1,14 @@ package world.bentobox.bentobox.api.commands.admin; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; import java.util.Optional; import java.util.UUID; +import org.eclipse.jdt.annotation.Nullable; + import world.bentobox.bentobox.api.commands.CompositeCommand; import world.bentobox.bentobox.api.commands.ConfirmableCommand; import world.bentobox.bentobox.api.events.island.IslandEvent; @@ -16,6 +20,9 @@ import world.bentobox.bentobox.util.Util; public class AdminDeleteCommand extends ConfirmableCommand { + private @Nullable UUID targetUUID; + private Island island; + public AdminDeleteCommand(CompositeCommand parent) { super(parent, "delete"); } @@ -29,56 +36,93 @@ public class AdminDeleteCommand extends ConfirmableCommand { @Override public boolean canExecute(User user, String label, List args) { - if (args.size() != 1) { - showHelp(this, user); + if (args.isEmpty()) { + this.showHelp(this, user); return false; } - // Get target - UUID targetUUID = Util.getUUID(args.get(0)); + // Convert name to a UUID + targetUUID = Util.getUUID(args.get(0)); if (targetUUID == null) { user.sendMessage("general.errors.unknown-player", TextVariables.NAME, args.get(0)); return false; } - Island island = getIslands().getIsland(getWorld(), user); - if (island == null) { + // Check island exists + if (!getIslands().hasIsland(getWorld(), targetUUID) && !getIslands().inTeam(getWorld(), targetUUID)) { user.sendMessage("general.errors.player-has-no-island"); return false; } + if (args.size() == 1) { + // Check if player is owner of any islands + if (getIslands().getIslands(getWorld(), targetUUID).stream().filter(Island::hasTeam) + .anyMatch(is -> targetUUID.equals(is.getOwner()))) { + user.sendMessage("commands.admin.delete.cannot-delete-owner"); + return false; + } + // This is a delete everything request + return true; + } + + // Get the island + User target = User.getInstance(targetUUID); + // They named the island to go to + Map names = getNameIslandMap(target); + final String name = String.join(" ", args.subList(1, args.size())); + if (!names.containsKey(name)) { + // Failed home name check + user.sendMessage("commands.island.go.unknown-home"); + user.sendMessage("commands.island.sethome.homes-are"); + names.keySet() + .forEach(n -> user.sendMessage("commands.island.sethome.home-list-syntax", TextVariables.NAME, n)); + return false; + } else { + IslandInfo info = names.get(name); + island = info.island; + } + // Team members should be kicked before deleting otherwise the whole team will become weird - if (island.hasTeam() && user.getUniqueId().equals(island.getOwner())) { + if (island.hasTeam() && targetUUID.equals(island.getOwner())) { user.sendMessage("commands.admin.delete.cannot-delete-owner"); return false; } + if (names.size() == 1) { + // This is the only island they have so, no need to specify it + island = null; + } return true; } @Override public boolean execute(User user, String label, List args) { - // Get target - UUID targetUUID = getPlayers().getUUID(args.get(0)); // Confirm - askConfirmation(user, () -> deletePlayer(user, targetUUID)); + if (island == null) { + // Delete the player entirely + askConfirmation(user, () -> deletePlayer(user)); + } else { + // Just delete the player's island + askConfirmation(user, () -> deleteIsland(user, island)); + } return true; } - private void deletePlayer(User user, UUID targetUUID) { + private void deleteIsland(User user, Island oldIsland) { + // Fire island preclear event + IslandEvent.builder().involvedPlayer(user.getUniqueId()).reason(Reason.PRECLEAR).island(oldIsland) + .oldIsland(oldIsland).location(oldIsland.getCenter()).build(); + user.sendMessage("commands.admin.delete.deleted-island", TextVariables.XYZ, + Util.xyz(oldIsland.getCenter().toVector())); + getIslands().deleteIsland(oldIsland, true, targetUUID); + + } + + private void deletePlayer(User user) { // Delete player and island for (Island oldIsland : getIslands().getIslands(getWorld(), targetUUID)) { - // Fire island preclear event - IslandEvent.builder() - .involvedPlayer(user.getUniqueId()) - .reason(Reason.PRECLEAR) - .island(oldIsland) - .oldIsland(oldIsland) - .location(oldIsland.getCenter()) - .build(); - user.sendMessage("commands.admin.delete.deleted-island", TextVariables.XYZ, Util.xyz(oldIsland.getCenter().toVector())); - getIslands().deleteIsland(oldIsland, true, targetUUID); + deleteIsland(user, oldIsland); } // Check if player is online and on the island User target = User.getInstance(targetUUID); - // Remove them from this island (it still exists and will be deleted later) + // Remove target from any and all islands in the world getIslands().removePlayer(getWorld(), targetUUID); if (target.isPlayer() && target.isOnline()) { cleanUp(target); @@ -120,6 +164,31 @@ public class AdminDeleteCommand extends ConfirmableCommand { Util.runCommands(target, target.getName(), getIWM().getOnLeaveCommands(getWorld()), "leave"); } + private record IslandInfo(Island island, boolean islandName) { + } + + private Map getNameIslandMap(User target) { + Map islandMap = new HashMap<>(); + int index = 0; + for (Island island : getIslands().getIslands(getWorld(), target.getUniqueId())) { + index++; + if (island.getName() != null && !island.getName().isBlank()) { + // Name has been set + islandMap.put(island.getName(), new IslandInfo(island, true)); + } else { + // Name has not been set + String text = target.getTranslation("protection.flags.ENTER_EXIT_MESSAGES.island", TextVariables.NAME, + target.getName(), TextVariables.DISPLAY_NAME, target.getDisplayName()) + " " + index; + islandMap.put(text, new IslandInfo(island, true)); + } + // Add homes. Homes do not need an island specified + island.getHomes().keySet().forEach(n -> islandMap.put(n, new IslandInfo(island, false))); + } + + return islandMap; + + } + @Override public Optional> tabComplete(User user, String alias, List args) { String lastArg = !args.isEmpty() ? args.get(args.size()-1) : ""; @@ -127,7 +196,16 @@ public class AdminDeleteCommand extends ConfirmableCommand { // Don't show every player on the server. Require at least the first letter return Optional.empty(); } - List options = new ArrayList<>(Util.getOnlinePlayerList(user)); - return Optional.of(Util.tabLimit(options, lastArg)); + if (args.size() == 2) { + return Optional.of(Util.tabLimit(new ArrayList<>(Util.getOnlinePlayerList(user)), lastArg)); + } + if (args.size() == 3) { + UUID target = Util.getUUID(args.get(1)); + return target == null ? Optional.empty() + : Optional.of(Util.tabLimit(new ArrayList<>(getNameIslandMap(User.getInstance(target)).keySet()), + lastArg)); + } + return Optional.empty(); } + } diff --git a/src/main/java/world/bentobox/bentobox/api/commands/admin/AdminTeleportCommand.java b/src/main/java/world/bentobox/bentobox/api/commands/admin/AdminTeleportCommand.java index 74dfe764e..16d13a5a8 100644 --- a/src/main/java/world/bentobox/bentobox/api/commands/admin/AdminTeleportCommand.java +++ b/src/main/java/world/bentobox/bentobox/api/commands/admin/AdminTeleportCommand.java @@ -1,7 +1,10 @@ package world.bentobox.bentobox.api.commands.admin; import java.util.ArrayList; +import java.util.HashMap; import java.util.List; +import java.util.Map; +import java.util.Objects; import java.util.Optional; import java.util.UUID; @@ -17,11 +20,17 @@ import world.bentobox.bentobox.database.objects.Island; import world.bentobox.bentobox.util.Util; import world.bentobox.bentobox.util.teleport.SafeSpotTeleport; +/** + * Enables admins to teleport to a player's island, nether or end islands, + * + * For example /acid tp tastybento [island name] would teleport to tastybento's [named] island + * + */ public class AdminTeleportCommand extends CompositeCommand { private static final String NOT_SAFE = "general.errors.no-safe-location-found"; private @Nullable UUID targetUUID; - private @Nullable User userToTeleport; + private Location warpSpot; /** * @param parent - parent command @@ -41,12 +50,12 @@ public class AdminTeleportCommand extends CompositeCommand { @Override public boolean canExecute(User user, String label, List args) { - if (args.size() != 1 && args.size() != 2) { + if (args.isEmpty()) { this.showHelp(this, user); return false; } // Check for console or not - if (!user.isPlayer() && args.size() != 2) { + if (!user.isPlayer()) { user.sendMessage("general.errors.use-in-game"); return false; } @@ -62,25 +71,6 @@ public class AdminTeleportCommand extends CompositeCommand { return false; } - if (args.size() == 2) { - // We are trying to teleport another player - UUID playerToTeleportUUID = Util.getUUID(args.get(1)); - if (playerToTeleportUUID == null) { - user.sendMessage("general.errors.unknown-player", TextVariables.NAME, args.get(1)); - return false; - } else { - userToTeleport = User.getInstance(playerToTeleportUUID); - if (!userToTeleport.isOnline()) { - user.sendMessage("general.errors.offline-player"); - return false; - } - } - } - return true; - } - - @Override - public boolean execute(User user, String label, List args) { World world = getWorld(); if (getLabel().equals("tpnether")) { world = getPlugin().getIWM().getNetherWorld(getWorld()); @@ -91,19 +81,46 @@ public class AdminTeleportCommand extends CompositeCommand { user.sendMessage(NOT_SAFE); return false; } - Location warpSpot = getSpot(world); + // Get default location if there are no arguments + warpSpot = getSpot(world); if (warpSpot == null) { user.sendMessage(NOT_SAFE); return false; } + if (args.size() == 1) { + return true; + } + // They named the island to go to + Map names = getNameIslandMap(User.getInstance(targetUUID)); + final String name = String.join(" ", args.subList(1, args.size())); + if (!names.containsKey(name)) { + // Failed home name check + user.sendMessage("commands.island.go.unknown-home"); + user.sendMessage("commands.island.sethome.homes-are"); + names.keySet() + .forEach(n -> user.sendMessage("commands.island.sethome.home-list-syntax", TextVariables.NAME, n)); + return false; + } else if (names.size() > 1) { + IslandInfo info = names.get(name); + Island island = info.island; + warpSpot = island.getSpawnPoint(world.getEnvironment()) != null + ? island.getSpawnPoint(world.getEnvironment()) + : island.getProtectionCenter().toVector().toLocation(world); + } + return true; + } + + @Override + public boolean execute(User user, String label, List args) { + Objects.requireNonNull(warpSpot); // Otherwise, ask the admin to go to a safe spot String failureMessage = user.getTranslation("commands.admin.tp.manual", "[location]", warpSpot.getBlockX() + " " + warpSpot.getBlockY() + " " + warpSpot.getBlockZ()); // Set the player - Player player = args.size() == 2 ? userToTeleport.getPlayer() : user.getPlayer(); + Player player = args.size() == 2 ? user.getPlayer() : user.getPlayer(); if (args.size() == 2) { - failureMessage = userToTeleport.getTranslation(NOT_SAFE); + failureMessage = user.getTranslation(NOT_SAFE); } // Teleport @@ -124,6 +141,31 @@ public class AdminTeleportCommand extends CompositeCommand { return island.getSpawnPoint(world.getEnvironment()) != null ? island.getSpawnPoint(world.getEnvironment()) : island.getProtectionCenter().toVector().toLocation(world); } + private record IslandInfo(Island island, boolean islandName) { + } + + private Map getNameIslandMap(User target) { + Map islandMap = new HashMap<>(); + int index = 0; + for (Island island : getIslands().getIslands(getWorld(), target.getUniqueId())) { + index++; + if (island.getName() != null && !island.getName().isBlank()) { + // Name has been set + islandMap.put(island.getName(), new IslandInfo(island, true)); + } else { + // Name has not been set + String text = target.getTranslation("protection.flags.ENTER_EXIT_MESSAGES.island", TextVariables.NAME, + target.getName(), TextVariables.DISPLAY_NAME, target.getDisplayName()) + " " + index; + islandMap.put(text, new IslandInfo(island, true)); + } + // Add homes. Homes do not need an island specified + island.getHomes().keySet().forEach(n -> islandMap.put(n, new IslandInfo(island, false))); + } + + return islandMap; + + } + @Override public Optional> tabComplete(User user, String alias, List args) { String lastArg = !args.isEmpty() ? args.get(args.size()-1) : ""; @@ -131,8 +173,17 @@ public class AdminTeleportCommand extends CompositeCommand { // Don't show every player on the server. Require at least the first letter return Optional.empty(); } - List options = new ArrayList<>(Util.getOnlinePlayerList(user)); - return Optional.of(Util.tabLimit(options, lastArg)); + if (args.size() == 2) { + return Optional.of(Util.tabLimit(new ArrayList<>(Util.getOnlinePlayerList(user)), lastArg)); + } + + if (args.size() == 3) { + UUID target = Util.getUUID(args.get(1)); + return target == null ? Optional.empty() + : Optional + .of(Util.tabLimit(new ArrayList<>(getNameIslandMap(User.getInstance(target)).keySet()), lastArg)); + } + return Optional.empty(); } } diff --git a/src/main/java/world/bentobox/bentobox/api/commands/admin/AdminTeleportUserCommand.java b/src/main/java/world/bentobox/bentobox/api/commands/admin/AdminTeleportUserCommand.java new file mode 100644 index 000000000..e0b322c80 --- /dev/null +++ b/src/main/java/world/bentobox/bentobox/api/commands/admin/AdminTeleportUserCommand.java @@ -0,0 +1,199 @@ +package world.bentobox.bentobox.api.commands.admin; + +import java.util.ArrayList; +import java.util.HashMap; +import java.util.List; +import java.util.Map; +import java.util.Optional; +import java.util.UUID; + +import org.bukkit.Location; +import org.bukkit.World; +import org.bukkit.entity.Player; +import org.eclipse.jdt.annotation.Nullable; + +import world.bentobox.bentobox.api.commands.CompositeCommand; +import world.bentobox.bentobox.api.localization.TextVariables; +import world.bentobox.bentobox.api.user.User; +import world.bentobox.bentobox.database.objects.Island; +import world.bentobox.bentobox.util.Util; +import world.bentobox.bentobox.util.teleport.SafeSpotTeleport; + +/** + * Enables admins to teleport to a player's island, nether or end islands, or to teleport another player + * to a player's island + * + * For example /acid tp tastybento boxmanager would teleport BoxManager to tastybento's overwold island + * + * If the user has multiple islands, then the format is: + * [admin_command] [user with island] [island to go to] + */ +public class AdminTeleportUserCommand extends CompositeCommand { + + private static final String NOT_SAFE = "general.errors.no-safe-location-found"; + private @Nullable UUID targetUUID; + private @Nullable User userToTeleport; + + /** + * @param parent - parent command + * @param tpCommand - should be "tp", "tpnether" or "tpend" + */ + public AdminTeleportUserCommand(CompositeCommand parent, String tpCommand) { + super(parent, tpCommand); + } + + @Override + public void setup() { + // Permission + setPermission("admin.tp"); + setParametersHelp("commands.admin.tp.parameters"); + setDescription("commands.admin.tp.description"); + } + + @Override + public boolean canExecute(User user, String label, List args) { + if (args.isEmpty() || args.size() > 3) { + this.showHelp(this, user); + return false; + } + // Check for console or not + if (!user.isPlayer() && args.size() == 1) { + user.sendMessage("general.errors.use-in-game"); + return false; + } + // Convert name to a UUID + targetUUID = Util.getUUID(args.get(0)); + if (targetUUID == null) { + user.sendMessage("general.errors.unknown-player", TextVariables.NAME, args.get(0)); + return false; + } + // Check island exists + if (!getIslands().hasIsland(getWorld(), targetUUID) && !getIslands().inTeam(getWorld(), targetUUID)) { + user.sendMessage("general.errors.player-has-no-island"); + return false; + } + + if (args.size() == 2) { + // We are trying to teleport another player + UUID playerToTeleportUUID = Util.getUUID(args.get(1)); + if (playerToTeleportUUID == null) { + user.sendMessage("general.errors.unknown-player", TextVariables.NAME, args.get(1)); + return false; + } else { + userToTeleport = User.getInstance(playerToTeleportUUID); + if (!userToTeleport.isOnline()) { + user.sendMessage("general.errors.offline-player"); + return false; + } + } + } + return true; + } + + @Override + public boolean execute(User user, String label, List args) { + World world = getWorld(); + if (getLabel().equals("tpnether")) { + world = getPlugin().getIWM().getNetherWorld(getWorld()); + } else if (getLabel().equals("tpend")) { + world = getPlugin().getIWM().getEndWorld(getWorld()); + } + if (world == null) { + user.sendMessage(NOT_SAFE); + return false; + } + // Get default location if there are no arguments + Location warpSpot = getSpot(world); + if (warpSpot == null) { + user.sendMessage(NOT_SAFE); + return false; + } + // See if there is a quoted island name + if (args.size() == 2) { + Map names = getNameIslandMap(user); + final String name = String.join(" ", args); + if (!names.containsKey(name)) { + // Failed home name check + user.sendMessage("commands.island.go.unknown-home"); + user.sendMessage("commands.island.sethome.homes-are"); + names.keySet().forEach( + n -> user.sendMessage("commands.island.sethome.home-list-syntax", TextVariables.NAME, n)); + return false; + } else { + IslandInfo info = names.get(name); + Island island = info.island; + warpSpot = island.getSpawnPoint(world.getEnvironment()) != null + ? island.getSpawnPoint(world.getEnvironment()) + : island.getProtectionCenter().toVector().toLocation(world); + } + } + + // Otherwise, ask the admin to go to a safe spot + String failureMessage = user.getTranslation("commands.admin.tp.manual", "[location]", warpSpot.getBlockX() + " " + warpSpot.getBlockY() + " " + + warpSpot.getBlockZ()); + // Set the player + Player player = args.size() == 2 ? userToTeleport.getPlayer() : user.getPlayer(); + if (args.size() == 2) { + failureMessage = userToTeleport.getTranslation(NOT_SAFE); + } + + // Teleport + new SafeSpotTeleport.Builder(getPlugin()) + .entity(player) + .location(warpSpot) + .failureMessage(failureMessage) + .thenRun(() -> user.sendMessage("general.success")) + .build(); + return true; + } + + private Location getSpot(World world) { + Island island = getIslands().getIsland(world, targetUUID); + if (island == null) { + return null; + } + return island.getSpawnPoint(world.getEnvironment()) != null ? island.getSpawnPoint(world.getEnvironment()) : island.getProtectionCenter().toVector().toLocation(world); + } + + private record IslandInfo(Island island, boolean islandName) { + } + + private Map getNameIslandMap(User user) { + Map islandMap = new HashMap<>(); + int index = 0; + for (Island island : getIslands().getIslands(getWorld(), user.getUniqueId())) { + index++; + if (island.getName() != null && !island.getName().isBlank()) { + // Name has been set + islandMap.put(island.getName(), new IslandInfo(island, true)); + } else { + // Name has not been set + String text = user.getTranslation("protection.flags.ENTER_EXIT_MESSAGES.island", TextVariables.NAME, + user.getName(), TextVariables.DISPLAY_NAME, user.getDisplayName()) + " " + index; + islandMap.put(text, new IslandInfo(island, true)); + } + // Add homes. Homes do not need an island specified + island.getHomes().keySet().forEach(n -> islandMap.put(n, new IslandInfo(island, false))); + } + + return islandMap; + + } + + @Override + public Optional> tabComplete(User user, String alias, List args) { + String lastArg = !args.isEmpty() ? args.get(args.size()-1) : ""; + if (args.isEmpty()) { + // Don't show every player on the server. Require at least the first letter + return Optional.empty(); + } + if (args.size() == 1) { + return Optional.of(Util.tabLimit(new ArrayList<>(Util.getOnlinePlayerList(user)), lastArg)); + } + if (args.size() == 2) { + return Optional.of(Util.tabLimit(new ArrayList<>(getNameIslandMap(user).keySet()), lastArg)); + } + return Optional.empty(); + } + +} diff --git a/src/main/resources/locales/en-US.yml b/src/main/resources/locales/en-US.yml index 0777e21b9..41dcd3d6e 100644 --- a/src/main/resources/locales/en-US.yml +++ b/src/main/resources/locales/en-US.yml @@ -267,7 +267,7 @@ commands: reload: description: reload tp: - parameters: [player to teleport] + parameters: [player's island] description: teleport to a player's island manual: '&c No safe warp found! Manually tp near to &b [location] &c and check it out' diff --git a/src/test/java/world/bentobox/bentobox/api/commands/admin/AdminDeleteCommandTest.java b/src/test/java/world/bentobox/bentobox/api/commands/admin/AdminDeleteCommandTest.java index b678482fa..4eb96ad22 100644 --- a/src/test/java/world/bentobox/bentobox/api/commands/admin/AdminDeleteCommandTest.java +++ b/src/test/java/world/bentobox/bentobox/api/commands/admin/AdminDeleteCommandTest.java @@ -117,6 +117,7 @@ public class AdminDeleteCommandTest { // when(im.isOwner(any(),any())).thenReturn(true); // when(im.getOwner(any(),any())).thenReturn(uuid); when(im.getIsland(world, user)).thenReturn(island); + when(im.getIslands(world, notUUID)).thenReturn(List.of(island)); when(plugin.getIslands()).thenReturn(im); // Island @@ -179,7 +180,8 @@ public class AdminDeleteCommandTest { public void testExecutePlayerNoIsland() { AdminDeleteCommand itl = new AdminDeleteCommand(ac); when(pm.getUUID(any())).thenReturn(notUUID); - when(im.getIsland(world, user)).thenReturn(null); + when(im.hasIsland(world, notUUID)).thenReturn(false); + when(im.inTeam(world, notUUID)).thenReturn(false); assertFalse(itl.canExecute(user, "", List.of("tastybento"))); verify(user).sendMessage(eq("general.errors.player-has-no-island")); } @@ -189,14 +191,13 @@ public class AdminDeleteCommandTest { */ @Test public void testExecuteOwner() { - - when(im.inTeam(any(),any())).thenReturn(true); - when(island.inTeam(notUUID)).thenReturn(true); - //when(im.getOwner(any(), any())).thenReturn(notUUID); - String[] name = {"tastybento"}; + when(im.hasIsland(world, notUUID)).thenReturn(true); + when(im.inTeam(world, notUUID)).thenReturn(true); + when(island.getOwner()).thenReturn(notUUID); + when(island.hasTeam()).thenReturn(true); when(pm.getUUID(any())).thenReturn(notUUID); AdminDeleteCommand itl = new AdminDeleteCommand(ac); - assertFalse(itl.canExecute(user, itl.getLabel(), Arrays.asList(name))); + assertFalse(itl.canExecute(user, itl.getLabel(), List.of("tastybento"))); verify(user).sendMessage("commands.admin.delete.cannot-delete-owner"); } @@ -205,6 +206,7 @@ public class AdminDeleteCommandTest { */ @Test public void testcanExecuteSuccessUUID() { + when(im.hasIsland(world, uuid)).thenReturn(true); when(island.hasTeam()).thenReturn(false); when(im.inTeam(any(), any())).thenReturn(false); //when(im.getOwner(any(), any())).thenReturn(uuid); @@ -212,7 +214,7 @@ public class AdminDeleteCommandTest { Location loc = mock(Location.class); when(loc.toVector()).thenReturn(new Vector(123,123,432)); when(is.getCenter()).thenReturn(loc); - when(im.getIsland(any(), any(UUID.class))).thenReturn(is); + when(im.getIslands(any(), any(UUID.class))).thenReturn(List.of(is)); // No such name when(pm.getUUID(any())).thenReturn(null);