diff --git a/src/main/java/world/bentobox/bentobox/api/commands/admin/team/AdminTeamSetownerCommand.java b/src/main/java/world/bentobox/bentobox/api/commands/admin/team/AdminTeamSetownerCommand.java index c812cb789..d0ef29b61 100644 --- a/src/main/java/world/bentobox/bentobox/api/commands/admin/team/AdminTeamSetownerCommand.java +++ b/src/main/java/world/bentobox/bentobox/api/commands/admin/team/AdminTeamSetownerCommand.java @@ -1,9 +1,14 @@ package world.bentobox.bentobox.api.commands.admin.team; import java.util.List; +import java.util.Objects; +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; import world.bentobox.bentobox.api.events.team.TeamEvent; import world.bentobox.bentobox.api.localization.TextVariables; @@ -17,7 +22,11 @@ import world.bentobox.bentobox.util.Util; * * @author tastybento */ -public class AdminTeamSetownerCommand extends CompositeCommand { +public class AdminTeamSetownerCommand extends ConfirmableCommand { + + private @Nullable UUID targetUUID; + private Island island; + private @Nullable UUID previousOwnerUUID; public AdminTeamSetownerCommand(CompositeCommand parent) { super(parent, "setowner"); @@ -28,17 +37,19 @@ public class AdminTeamSetownerCommand extends CompositeCommand { setPermission("mod.team.setowner"); setParametersHelp("commands.admin.team.setowner.parameters"); setDescription("commands.admin.team.setowner.description"); + this.setOnlyPlayer(true); } @Override - public boolean execute(User user, String label, List args) { + public boolean canExecute(User user, String label, List args) { // If args are not right, show help if (args.size() != 1) { showHelp(this, user); return false; } + // Get target - UUID targetUUID = Util.getUUID(args.get(0)); + targetUUID = Util.getUUID(args.get(0)); if (targetUUID == null) { user.sendMessage("general.errors.unknown-player", TextVariables.NAME, args.get(0)); return false; @@ -47,16 +58,33 @@ public class AdminTeamSetownerCommand extends CompositeCommand { user.sendMessage("general.errors.not-in-team"); return false; } - Island island = getIslands().getPrimaryIsland(getWorld(), targetUUID); - UUID previousOwnerUUID = island.getOwner(); + // Check that user is on an island + Optional opIsland = getIslands().getIslandAt(user.getLocation()); + if (opIsland.isEmpty()) { + user.sendMessage("commands.admin.team.setowner.must-be-on-island"); + return false; + } + island = opIsland.get(); + previousOwnerUUID = island.getOwner(); if (targetUUID.equals(previousOwnerUUID)) { user.sendMessage("commands.admin.team.setowner.already-owner", TextVariables.NAME, args.get(0)); return false; } + return true; + } - // Get the User corresponding to the current owner + public boolean execute(User user, String label, List args) { + Objects.requireNonNull(island); + Objects.requireNonNull(targetUUID); + + this.askConfirmation(user, user.getTranslation("commands.admin.team.setowner.confirmation", TextVariables.NAME, + args.get(0), TextVariables.XYZ, Util.xyz(island.getCenter().toVector())), () -> changeOwner(user)); + return true; + + } + + private void changeOwner(User user) { User target = User.getInstance(targetUUID); - // Fire event so add-ons know // Call the setowner event TeamEvent.builder().island(island).reason(TeamEvent.Reason.SETOWNER).involvedPlayer(targetUUID).admin(true) @@ -70,8 +98,8 @@ public class AdminTeamSetownerCommand extends CompositeCommand { .build(); // Make new owner - getIslands().setOwner(getWorld(), user, targetUUID); - user.sendMessage("commands.admin.team.setowner.success", TextVariables.NAME, args.get(0)); + getIslands().setOwner(user, targetUUID, island, RanksManager.MEMBER_RANK); + user.sendMessage("commands.admin.team.setowner.success", TextVariables.NAME, target.getName()); // Call the rank change event for the old island owner if (previousOwnerUUID != null) { @@ -80,6 +108,6 @@ public class AdminTeamSetownerCommand extends CompositeCommand { .reason(IslandEvent.Reason.RANK_CHANGE) .rankChange(RanksManager.OWNER_RANK, island.getRank(previousOwnerUUID)).build(); } - return true; + } } diff --git a/src/main/java/world/bentobox/bentobox/managers/IslandsManager.java b/src/main/java/world/bentobox/bentobox/managers/IslandsManager.java index 08a257c15..0ed4c2ab1 100644 --- a/src/main/java/world/bentobox/bentobox/managers/IslandsManager.java +++ b/src/main/java/world/bentobox/bentobox/managers/IslandsManager.java @@ -1520,7 +1520,7 @@ public class IslandsManager { /** * Sets this target as the owner for this island * - * @param user previous owner + * @param user user making the change * @param targetUUID new owner * @param island island to register * @param rank rank to which to set old owner. @@ -1528,8 +1528,8 @@ public class IslandsManager { public void setOwner(User user, UUID targetUUID, Island island, int rank) { islandCache.setOwner(island, targetUUID); // Set old owner as sub-owner on island. - if (rank > RanksManager.VISITOR_RANK) { - island.setRank(user, rank); + if (rank > RanksManager.VISITOR_RANK && island.getOwner() != null) { + island.setRank(island.getOwner(), rank); } user.sendMessage("commands.island.team.setowner.name-is-the-owner", "[name]", diff --git a/src/main/resources/locales/en-US.yml b/src/main/resources/locales/en-US.yml index ac0a963ab..a10f99ed0 100644 --- a/src/main/resources/locales/en-US.yml +++ b/src/main/resources/locales/en-US.yml @@ -144,6 +144,8 @@ commands: parameters: description: transfers island ownership to the player already-owner: '&c [name] is already the owner of this island!' + must-be-on-island: '&c You must be on the island to set the owner' + confirmation: '&a Are you sure you want to set [name] to be the owner of the island at [xyz]?' success: '&b [name]&a is now the owner of this island.' range: description: admin island range command