From eea91b6269c7d74dbbbf96c1b401186e3bb8403f Mon Sep 17 00:00:00 2001 From: Florian CUNY Date: Wed, 28 Aug 2019 14:44:55 +0200 Subject: [PATCH] Added 'island.name.uniqueness' in the config Implements https://github.com/BentoBoxWorld/BentoBox/issues/899 Edited IslandsManager#nameExists(...) to strip colors. --- .../world/bentobox/bentobox/Settings.java | 19 ++++++++++++ .../commands/island/IslandSetnameCommand.java | 29 +++++++++++-------- .../bentobox/managers/IslandsManager.java | 4 ++- src/main/resources/locales/en-US.yml | 1 + 4 files changed, 40 insertions(+), 13 deletions(-) diff --git a/src/main/java/world/bentobox/bentobox/Settings.java b/src/main/java/world/bentobox/bentobox/Settings.java index 0c8f473b4..0d05773fa 100644 --- a/src/main/java/world/bentobox/bentobox/Settings.java +++ b/src/main/java/world/bentobox/bentobox/Settings.java @@ -149,6 +149,11 @@ public class Settings implements ConfigObject { @ConfigComment("Sets the maximum length an island custom name cannot exceed.") @ConfigEntry(path = "island.name.max-length") private int nameMaxLength = 20; + @ConfigComment("Requires island custom names to be unique in the gamemode the island is in.") + @ConfigComment("As a result, only one island per gamemode are allowed to share the same name.") + @ConfigComment("Note that island names are purely cosmetics and are not used as a way to programmatically identify islands.") + @ConfigEntry(path = "island.name.uniqueness", since = "1.7.0") + private boolean nameUniqueness = false; @ConfigComment("Remove hostile mob on teleport box radius") @ConfigComment("If hostile mobs are cleared on player teleport, then this sized box will be cleared") @@ -395,6 +400,20 @@ public class Settings implements ConfigObject { this.nameMaxLength = nameMaxLength; } + /** + * @since 1.7.0 + */ + public boolean isNameUniqueness() { + return nameUniqueness; + } + + /** + * @since 1.7.0 + */ + public void setNameUniqueness(boolean nameUniqueness) { + this.nameUniqueness = nameUniqueness; + } + /** * @param pasteSpeed the pasteSpeed to set */ diff --git a/src/main/java/world/bentobox/bentobox/api/commands/island/IslandSetnameCommand.java b/src/main/java/world/bentobox/bentobox/api/commands/island/IslandSetnameCommand.java index a99386bee..34b42653e 100644 --- a/src/main/java/world/bentobox/bentobox/api/commands/island/IslandSetnameCommand.java +++ b/src/main/java/world/bentobox/bentobox/api/commands/island/IslandSetnameCommand.java @@ -29,22 +29,22 @@ public class IslandSetnameCommand extends CompositeCommand { @Override public boolean execute(User user, String label, List args) { + // Explain command + if (args.isEmpty()) { + showHelp(this, user); + return false; + } + UUID playerUUID = user.getUniqueId(); if (!getIslands().hasIsland(getWorld(), playerUUID)) { user.sendMessage("general.errors.no-island"); return false; } - if (!getIslands().isOwner(getWorld(), playerUUID)) { user.sendMessage("general.errors.not-owner"); return false; } - // Explain command - if (args.isEmpty()) { - showHelp(this, user); - return false; - } // Naming the island - join all the arguments with spaces. String name = String.join(" ", args); @@ -59,15 +59,20 @@ public class IslandSetnameCommand extends CompositeCommand { return false; } - // Set the name - if (user.hasPermission(this.getPermissionPrefix() + "island.name.format")) { - getIslands().getIsland(getWorld(), playerUUID).setName(ChatColor.translateAlternateColorCodes('&', name)); - } else { - getIslands().getIsland(getWorld(), playerUUID).setName(name); + // Apply colors + if (user.hasPermission(getPermissionPrefix() + "island.name.format")) { + name = ChatColor.translateAlternateColorCodes('&', name); } + // Check if the name doesn't already exist in the gamemode + if (getSettings().isNameUniqueness() && getIslands().nameExists(getWorld(), name)) { + user.sendMessage("commands.island.setname.name-already-exists"); + return false; + } + + // Everything's good! + getIslands().getIsland(getWorld(), playerUUID).setName(name); user.sendMessage("general.success"); 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 eafc381a3..ca2456d0c 100644 --- a/src/main/java/world/bentobox/bentobox/managers/IslandsManager.java +++ b/src/main/java/world/bentobox/bentobox/managers/IslandsManager.java @@ -14,6 +14,7 @@ import java.util.UUID; import java.util.stream.Collectors; import org.bukkit.Bukkit; +import org.bukkit.ChatColor; import org.bukkit.Location; import org.bukkit.Material; import org.bukkit.TreeSpecies; @@ -1208,6 +1209,7 @@ public class IslandsManager { * @since 1.7.0 */ public boolean nameExists(@NonNull World world, @NonNull String name) { - return getIslands(world).stream().filter(island -> island.getName() != null).map(Island::getName).anyMatch(n -> n.equals(name)); + return getIslands(world).stream().filter(island -> island.getName() != null).map(Island::getName) + .anyMatch(n -> ChatColor.stripColor(n).equals(ChatColor.stripColor(name))); } } diff --git a/src/main/resources/locales/en-US.yml b/src/main/resources/locales/en-US.yml index 9c5f5c1df..7d5fc1ecc 100644 --- a/src/main/resources/locales/en-US.yml +++ b/src/main/resources/locales/en-US.yml @@ -439,6 +439,7 @@ commands: description: "set a name for your island" name-too-short: "&cToo short. Minimum size is [number] characters." name-too-long: "&cToo long. Maximum size is [number] characters." + name-already-exists: "&cThere is already an island with that name in this gamemode." parameters: "" resetname: description: "reset your island name"