From f2021cd60e6e28e676ee20e7ede150992bd1c53f Mon Sep 17 00:00:00 2001 From: fullwall Date: Thu, 8 Sep 2022 03:01:39 +0800 Subject: [PATCH] Use @Arg in NPCCommands --- main/pom.xml | 2 +- .../main/java/net/citizensnpcs/Citizens.java | 36 +--- .../citizensnpcs/commands/NPCCommands.java | 158 ++++++++++-------- .../net/citizensnpcs/trait/Controllable.java | 4 +- .../main/java/net/citizensnpcs/util/Util.java | 4 - 5 files changed, 94 insertions(+), 110 deletions(-) diff --git a/main/pom.xml b/main/pom.xml index 63e875f85..e3c1681f9 100644 --- a/main/pom.xml +++ b/main/pom.xml @@ -12,7 +12,7 @@ UTF-8 1.19.2-R0.1-SNAPSHOT - 2.10.9 + 2.11.2 ${project.version} 7.0.4 1.4.12 diff --git a/main/src/main/java/net/citizensnpcs/Citizens.java b/main/src/main/java/net/citizensnpcs/Citizens.java index f8e5da0d7..542bb9863 100644 --- a/main/src/main/java/net/citizensnpcs/Citizens.java +++ b/main/src/main/java/net/citizensnpcs/Citizens.java @@ -10,7 +10,6 @@ import java.util.UUID; import java.util.concurrent.Callable; import org.bukkit.Bukkit; -import org.bukkit.ChatColor; import org.bukkit.command.CommandSender; import org.bukkit.entity.Player; import org.bukkit.event.HandlerList; @@ -35,7 +34,6 @@ import net.citizensnpcs.api.InventoryHelper; import net.citizensnpcs.api.SkullMetaProvider; import net.citizensnpcs.api.ai.speech.SpeechFactory; import net.citizensnpcs.api.command.CommandManager; -import net.citizensnpcs.api.command.CommandManager.CommandInfo; import net.citizensnpcs.api.command.Injector; import net.citizensnpcs.api.event.CitizensDisableEvent; import net.citizensnpcs.api.event.CitizensEnableEvent; @@ -43,7 +41,6 @@ import net.citizensnpcs.api.event.CitizensPreReloadEvent; import net.citizensnpcs.api.event.CitizensReloadEvent; import net.citizensnpcs.api.event.DespawnReason; import net.citizensnpcs.api.exception.NPCLoadException; -import net.citizensnpcs.api.npc.NPC; import net.citizensnpcs.api.npc.NPCDataStore; import net.citizensnpcs.api.npc.NPCRegistry; import net.citizensnpcs.api.npc.SimpleNPCDataStore; @@ -74,7 +71,6 @@ import net.citizensnpcs.trait.ShopTrait; import net.citizensnpcs.util.Messages; import net.citizensnpcs.util.NMS; import net.citizensnpcs.util.PlayerUpdateTask; -import net.citizensnpcs.util.StringHelper; import net.citizensnpcs.util.Util; import net.milkbowl.vault.economy.Economy; @@ -197,12 +193,9 @@ public class Citizens extends JavaPlugin implements CitizensPlugin { NMS.loadPlugins(); } - public CommandInfo getCommandInfo(String rootCommand, String modifier) { - return commands.getCommand(rootCommand, modifier); - } - - public Iterable getCommands(String base) { - return commands.getCommands(base); + @Override + public CommandManager getCommandManager() { + return commands; } @Override @@ -291,17 +284,8 @@ public class Citizens extends JavaPlugin implements CitizensPlugin { @Override public boolean onCommand(CommandSender sender, org.bukkit.command.Command command, String cmdName, String[] args) { - String modifier = args.length > 0 ? args[0] : ""; - if (!commands.hasCommand(command, modifier) && !modifier.isEmpty()) { - return suggestClosestModifier(sender, command.getName(), modifier); - } - - NPC npc = selector == null ? null : selector.getSelected(sender); - // TODO: change the args supplied to a context style system for - // flexibility (ie. adding more context in the future without - // changing everything) - - Object[] methodArgs = { sender, npc }; + // TODO: use injector? + Object[] methodArgs = { sender, selector == null ? null : selector.getSelected(sender) }; return commands.executeSafe(command, args, sender, methodArgs); } @@ -530,16 +514,6 @@ public class Citizens extends JavaPlugin implements CitizensPlugin { } } - private boolean suggestClosestModifier(CommandSender sender, String command, String modifier) { - String closest = commands.getClosestCommandModifier(command, modifier); - if (!closest.isEmpty()) { - sender.sendMessage(ChatColor.GRAY + Messaging.tr(Messages.UNKNOWN_COMMAND)); - sender.sendMessage(StringHelper.wrap(" /") + command + " " + StringHelper.wrap(closest)); - return true; - } - return false; - } - private class CitizensLoadTask implements Runnable { @Override public void run() { diff --git a/main/src/main/java/net/citizensnpcs/commands/NPCCommands.java b/main/src/main/java/net/citizensnpcs/commands/NPCCommands.java index 50c1a6355..00c0bc42c 100644 --- a/main/src/main/java/net/citizensnpcs/commands/NPCCommands.java +++ b/main/src/main/java/net/citizensnpcs/commands/NPCCommands.java @@ -28,6 +28,7 @@ import org.bukkit.command.BlockCommandSender; import org.bukkit.command.CommandSender; import org.bukkit.command.ConsoleCommandSender; import org.bukkit.entity.Ageable; +import org.bukkit.entity.ArmorStand; import org.bukkit.entity.Damageable; import org.bukkit.entity.Entity; import org.bukkit.entity.EntityType; @@ -54,6 +55,7 @@ import net.citizensnpcs.Settings.Setting; import net.citizensnpcs.api.CitizensAPI; import net.citizensnpcs.api.ai.speech.SpeechContext; import net.citizensnpcs.api.ai.tree.StatusMapper; +import net.citizensnpcs.api.command.Arg; import net.citizensnpcs.api.command.Command; import net.citizensnpcs.api.command.CommandContext; import net.citizensnpcs.api.command.CommandMessages; @@ -153,7 +155,7 @@ public class NPCCommands { @Command( aliases = { "npc" }, - usage = "age [age] (-l)", + usage = "age [age] (-l(ock))", desc = "Set the age of a NPC", help = Messages.COMMAND_AGE_HELP, flags = "l", @@ -205,13 +207,9 @@ public class NPCCommands { min = 1, max = 2, permission = "citizens.npc.ai") - public void ai(CommandContext args, CommandSender sender, NPC npc) throws CommandException { - boolean useAI = npc.useMinecraftAI(); - if (args.argsLength() == 1) { - useAI = !useAI; - } else { - useAI = Boolean.parseBoolean(args.getString(1)); - } + public void ai(CommandContext args, CommandSender sender, NPC npc, @Arg(1) Boolean explicit) + throws CommandException { + boolean useAI = explicit == null ? !npc.useMinecraftAI() : explicit; npc.setUseMinecraftAI(useAI); Messaging.sendTr(sender, useAI ? Messages.USING_MINECRAFT_AI : Messages.NOT_USING_MINECRAFT_AI); } @@ -296,11 +294,12 @@ public class NPCCommands { @Command( aliases = { "npc" }, - usage = "armorstand --visible [visible] --small [small] --gravity [gravity] --arms [arms] --baseplate [baseplate]", + usage = "armorstand --visible [visible] --small [small] --gravity [gravity] --arms [arms] --baseplate [baseplate] --(body|leftarm|leftleg|rightarm|rightleg)pose [angle x,y,z]", desc = "Edit armorstand properties", modifiers = { "armorstand" }, min = 1, max = 1, + valueFlags = { "bodypose", "leftarmpose", "rightarmpose", "leftlegpose", "rightlegpose" }, permission = "citizens.npc.armorstand") @Requirements(selected = true, ownership = true, types = EntityType.ARMOR_STAND) public void armorstand(CommandContext args, CommandSender sender, NPC npc, @Flag("visible") Boolean visible, @@ -322,6 +321,22 @@ public class NPCCommands { if (baseplate != null) { trait.setHasBaseplate(baseplate); } + ArmorStand ent = (ArmorStand) npc.getEntity(); + if (args.hasValueFlag("bodypose")) { + ent.setBodyPose(args.parseEulerAngle(args.getFlag("bodypose"))); + } + if (args.hasValueFlag("leftarmpose")) { + ent.setLeftArmPose(args.parseEulerAngle(args.getFlag("leftarmpose"))); + } + if (args.hasValueFlag("leftlegpose")) { + ent.setLeftLegPose(args.parseEulerAngle(args.getFlag("leftlegpose"))); + } + if (args.hasValueFlag("rightarmpose")) { + ent.setRightArmPose(args.parseEulerAngle(args.getFlag("rightarmpose"))); + } + if (args.hasValueFlag("rightlegpose")) { + ent.setRightLegPose(args.parseEulerAngle(args.getFlag("rightlegpose"))); + } } @Command( @@ -394,11 +409,16 @@ public class NPCCommands { public void command(CommandContext args, CommandSender sender, NPC npc, @Flag("permissions") String permissions, @Flag(value = "cooldown", defValue = "0") int cooldown, @Flag(value = "gcooldown", defValue = "0") int gcooldown, @Flag(value = "n", defValue = "-1") int n, - @Flag(value = "delay", defValue = "0") int delay) throws CommandException { + @Flag(value = "delay", defValue = "0") int delay, + @Arg( + value = 1, + completions = { "add", "remove", "permissions", "sequential", "random", "hideerrors", "errormsg", + "expcost", "itemcost" }) String action) + throws CommandException { CommandTrait commands = npc.getOrAddTrait(CommandTrait.class); if (args.argsLength() == 1) { commands.describe(sender); - } else if (args.getString(1).equalsIgnoreCase("add")) { + } else if (action.equalsIgnoreCase("add")) { if (args.argsLength() == 2) throw new CommandUsageException(); String command = args.getJoinedStrings(2); @@ -416,13 +436,13 @@ public class NPCCommands { } catch (NumberFormatException ex) { throw new CommandException(CommandMessages.INVALID_NUMBER); } - } else if (args.getString(1).equalsIgnoreCase("sequential")) { + } else if (action.equalsIgnoreCase("sequential")) { commands.setExecutionMode(commands.getExecutionMode() == ExecutionMode.SEQUENTIAL ? ExecutionMode.LINEAR : ExecutionMode.SEQUENTIAL); Messaging.sendTr(sender, commands.getExecutionMode() == ExecutionMode.SEQUENTIAL ? Messages.COMMANDS_SEQUENTIAL_SET : Messages.COMMANDS_SEQUENTIAL_UNSET); - } else if (args.getString(1).equalsIgnoreCase("remove")) { + } else if (action.equalsIgnoreCase("remove")) { if (args.argsLength() == 2) throw new CommandUsageException(); int id = args.getInteger(2, -1); @@ -430,31 +450,31 @@ public class NPCCommands { throw new CommandException(Messages.COMMAND_UNKNOWN_COMMAND_ID, id); commands.removeCommandById(id); Messaging.sendTr(sender, Messages.COMMAND_REMOVED, id); - } else if (args.getString(1).equalsIgnoreCase("permissions") || args.getString(1).equalsIgnoreCase("perms")) { + } else if (action.equalsIgnoreCase("permissions") || action.equalsIgnoreCase("perms")) { List temporaryPermissions = Arrays.asList(args.getSlice(2)); commands.setTemporaryPermissions(temporaryPermissions); Messaging.sendTr(sender, Messages.COMMAND_TEMPORARY_PERMISSIONS_SET, Joiner.on(' ').join(temporaryPermissions)); - } else if (args.getString(1).equalsIgnoreCase("cost")) { + } else if (action.equalsIgnoreCase("cost")) { commands.setCost(args.getDouble(2)); Messaging.sendTr(sender, Messages.COMMAND_COST_SET, args.getDouble(2)); - } else if (args.getString(1).equalsIgnoreCase("expcost")) { + } else if (action.equalsIgnoreCase("expcost")) { commands.setExperienceCost((float) args.getDouble(2)); Messaging.sendTr(sender, Messages.COMMAND_EXPERIENCE_COST_SET, args.getDouble(2)); - } else if (args.getString(1).equalsIgnoreCase("hideerrors")) { + } else if (action.equalsIgnoreCase("hideerrors")) { commands.setHideErrorMessages(!commands.isHideErrorMessages()); Messaging.sendTr(sender, commands.isHideErrorMessages() ? Messages.COMMAND_HIDE_ERROR_MESSAGES_SET : Messages.COMMAND_HIDE_ERROR_MESSAGES_UNSET); - } else if (args.getString(1).equalsIgnoreCase("random")) { + } else if (action.equalsIgnoreCase("random")) { commands.setExecutionMode( commands.getExecutionMode() == ExecutionMode.RANDOM ? ExecutionMode.LINEAR : ExecutionMode.RANDOM); Messaging.sendTr(sender, commands.getExecutionMode() == ExecutionMode.RANDOM ? Messages.COMMANDS_RANDOM_SET : Messages.COMMANDS_RANDOM_UNSET); - } else if (args.getString(1).equalsIgnoreCase("itemcost")) { + } else if (action.equalsIgnoreCase("itemcost")) { if (!(sender instanceof Player)) throw new CommandException(CommandMessages.MUST_BE_INGAME); InventoryMenu.createSelfRegistered(new ItemRequirementGUI(commands)).present(((Player) sender)); - } else if (args.getString(1).equalsIgnoreCase("errormsg")) { + } else if (action.equalsIgnoreCase("errormsg")) { CommandTraitMessages which = Util.matchEnum(CommandTraitMessages.values(), args.getString(2)); if (which == null) throw new CommandException(Messages.NPC_COMMAND_INVALID_ERROR_MESSAGE, @@ -806,10 +826,11 @@ public class NPCCommands { ownership = true, excludedTypes = { EntityType.BAT, EntityType.BLAZE, EntityType.ENDER_DRAGON, EntityType.GHAST, EntityType.WITHER }) - public void flyable(CommandContext args, CommandSender sender, NPC npc) throws CommandException { - boolean flyable = args.argsLength() == 2 ? args.getString(1).equals("true") : !npc.isFlyable(); + public void flyable(CommandContext args, CommandSender sender, NPC npc, @Arg(1) Boolean explicit) + throws CommandException { + boolean flyable = explicit != null ? explicit : !npc.isFlyable(); npc.setFlyable(flyable); - flyable = npc.isFlyable(); // may not have applied, eg bats always flyable + flyable = npc.isFlyable(); // may not have applied, eg bats are always flyable Messaging.sendTr(sender, flyable ? Messages.FLYABLE_SET : Messages.FLYABLE_UNSET, npc.getName()); } @@ -867,29 +888,19 @@ public class NPCCommands { max = 2, permission = "citizens.npc.gamemode") @Requirements(selected = true, ownership = true, types = { EntityType.PLAYER }) - public void gamemode(CommandContext args, CommandSender sender, NPC npc) { + public void gamemode(CommandContext args, CommandSender sender, NPC npc, @Arg(1) GameMode mode) { Player player = (Player) npc.getEntity(); if (args.argsLength() == 1) { Messaging.sendTr(sender, Messages.GAMEMODE_DESCRIBE, npc.getName(), player.getGameMode().name().toLowerCase()); return; } - GameMode mode = null; - try { - int value = args.getInteger(1); - mode = GameMode.getByValue(value); - } catch (NumberFormatException ex) { - try { - mode = GameMode.valueOf(args.getString(1).toUpperCase()); - } catch (IllegalArgumentException e) { - } - } if (mode == null) { Messaging.sendErrorTr(sender, Messages.GAMEMODE_INVALID, args.getString(1)); return; } npc.getOrAddTrait(GameModeTrait.class).setGameMode(mode); - Messaging.sendTr(sender, Messages.GAMEMODE_SET, mode.name().toLowerCase()); + Messaging.sendTr(sender, Messages.GAMEMODE_SET, Util.prettyEnum(mode)); } @Command( @@ -951,7 +962,9 @@ public class NPCCommands { min = 1, max = -1, permission = "citizens.npc.hologram") - public void hologram(CommandContext args, CommandSender sender, NPC npc) throws CommandException { + public void hologram(CommandContext args, CommandSender sender, NPC npc, + @Arg(value = 1, completions = { "add", "set", "remove", "clear", "lineheight", "direction" }) String action) + throws CommandException { HologramTrait trait = npc.getOrAddTrait(HologramTrait.class); if (args.argsLength() == 1) { String output = Messaging.tr(Messages.HOLOGRAM_DESCRIBE_HEADER, npc.getName()); @@ -964,7 +977,7 @@ public class NPCCommands { return; } - if (args.getString(1).equalsIgnoreCase("set")) { + if (action.equalsIgnoreCase("set")) { if (args.argsLength() == 2) { throw new CommandException(Messages.HOLOGRAM_INVALID_LINE); } @@ -980,14 +993,14 @@ public class NPCCommands { trait.setLine(idx, args.getJoinedStrings(3)); Messaging.sendTr(sender, Messages.HOLOGRAM_LINE_SET, idx, args.getJoinedStrings(3)); - } else if (args.getString(1).equalsIgnoreCase("add")) { + } else if (action.equalsIgnoreCase("add")) { if (args.argsLength() == 2) { throw new CommandException(Messages.HOLOGRAM_TEXT_MISSING); } trait.addLine(args.getJoinedStrings(2)); Messaging.sendTr(sender, Messages.HOLOGRAM_LINE_ADD, args.getJoinedStrings(2)); - } else if (args.getString(1).equalsIgnoreCase("remove")) { + } else if (action.equalsIgnoreCase("remove")) { if (args.argsLength() == 2) { throw new CommandException(Messages.HOLOGRAM_INVALID_LINE); } @@ -999,13 +1012,13 @@ public class NPCCommands { trait.removeLine(idx); Messaging.sendTr(sender, Messages.HOLOGRAM_LINE_REMOVED, idx); - } else if (args.getString(1).equalsIgnoreCase("clear")) { + } else if (action.equalsIgnoreCase("clear")) { trait.clear(); Messaging.sendTr(sender, Messages.HOLOGRAM_CLEARED); - } else if (args.getString(1).equalsIgnoreCase("lineheight")) { + } else if (action.equalsIgnoreCase("lineheight")) { trait.setLineHeight(args.getDouble(2)); Messaging.sendTr(sender, Messages.HOLOGRAM_LINE_HEIGHT_SET, args.getDouble(2)); - } else if (args.getString(1).equalsIgnoreCase("direction")) { + } else if (action.equalsIgnoreCase("direction")) { HologramDirection direction = args.getString(2).equalsIgnoreCase("up") ? HologramDirection.BOTTOM_UP : HologramDirection.TOP_DOWN; trait.setDirection(direction); @@ -1114,8 +1127,7 @@ public class NPCCommands { selected = true, ownership = true, types = { EntityType.DROPPED_ITEM, EntityType.ITEM_FRAME, EntityType.FALLING_BLOCK }) - public void item(CommandContext args, CommandSender sender, NPC npc) throws CommandException { - Material mat = Material.matchMaterial(args.getString(1)); + public void item(CommandContext args, CommandSender sender, NPC npc, @Arg(1) Material mat) throws CommandException { if (mat == null) throw new CommandException(Messages.UNKNOWN_MATERIAL); int data = args.getInteger(2, 0); @@ -1302,8 +1314,8 @@ public class NPCCommands { max = 4, permission = "citizens.npc.metadata") @Requirements(selected = true, ownership = true) - public void metadata(CommandContext args, CommandSender sender, NPC npc) throws CommandException { - String command = args.getString(1).toLowerCase(); + public void metadata(CommandContext args, CommandSender sender, NPC npc, + @Arg(value = 1, completions = { "set", "get", "remove" }) String command) throws CommandException { String key = args.getString(2); try { key = NPC.Metadata.valueOf(key.toUpperCase()).getKey(); @@ -1439,6 +1451,7 @@ public class NPCCommands { desc = "Teleports a NPC to a given location", modifiers = "moveto", min = 1, + valueFlags = { "x", "y", "z", "yaw", "pitch", "world" }, permission = "citizens.npc.moveto") public void moveto(CommandContext args, CommandSender sender, NPC npc) throws CommandException { if (!npc.isSpawned()) { @@ -1562,7 +1575,7 @@ public class NPCCommands { @Command( aliases = { "npc" }, - usage = "owner [uuid]", + usage = "owner [uuid|SERVER]", desc = "Set the owner of an NPC", modifiers = { "owner" }, min = 1, @@ -1683,12 +1696,13 @@ public class NPCCommands { min = 2, max = 4, permission = "citizens.npc.pathto") - public void pathto(CommandContext args, CommandSender sender, NPC npc) throws CommandException { + public void pathto(CommandContext args, CommandSender sender, NPC npc, + @Arg(value = 1, completions = { "me", "here", "cursor" }) String option) throws CommandException { Location loc = npc.getStoredLocation(); if (args.argsLength() == 2) { - if ((args.getString(1).equalsIgnoreCase("me") || args.getString(1).equalsIgnoreCase("here"))) { + if ((option.equalsIgnoreCase("me") || option.equalsIgnoreCase("here"))) { loc = args.getSenderLocation(); - } else if (args.getString(1).equalsIgnoreCase("cursor")) { + } else if (option.equalsIgnoreCase("cursor")) { loc = ((Player) sender).getTargetBlockExact(32).getLocation(); } else { throw new CommandUsageException(); @@ -1725,8 +1739,8 @@ public class NPCCommands { max = 2, permission = "citizens.npc.panimate") @Requirements(selected = true, ownership = true, types = EntityType.PLAYER) - public void playerAnimate(CommandContext args, CommandSender sender, NPC npc) throws CommandException { - PlayerAnimation animation = Util.matchEnum(PlayerAnimation.values(), args.getString(1)); + public void playerAnimate(CommandContext args, CommandSender sender, NPC npc, @Arg(1) PlayerAnimation animation) + throws CommandException { if (animation == null) { Messaging.sendErrorTr(sender, Messages.UNKNOWN_PLAYER_ANIMATION, Util.listValuesPretty(PlayerAnimation.values())); @@ -1855,20 +1869,19 @@ public class NPCCommands { max = 2, permission = "citizens.npc.profession") @Requirements(selected = true, ownership = true) - public void profession(CommandContext args, CommandSender sender, NPC npc) throws CommandException { + public void profession(CommandContext args, CommandSender sender, NPC npc, @Arg(1) Profession parsed) + throws CommandException { EntityType type = npc.getOrAddTrait(MobType.class).getType(); if (type != EntityType.VILLAGER && !type.name().equals("ZOMBIE_VILLAGER")) { throw new RequirementMissingException(Messaging.tr(CommandMessages.REQUIREMENTS_INVALID_MOB_TYPE, type.name().toLowerCase().replace('_', ' '))); } - String profession = args.getString(1); - Profession parsed = Util.matchEnum(Profession.values(), profession.toUpperCase()); if (parsed == null) { throw new CommandException(Messages.INVALID_PROFESSION, args.getString(1), Util.listValuesPretty(Profession.values())); } npc.getOrAddTrait(VillagerProfession.class).setProfession(parsed); - Messaging.sendTr(sender, Messages.PROFESSION_SET, npc.getName(), profession); + Messaging.sendTr(sender, Messages.PROFESSION_SET, npc.getName(), Util.prettyEnum(parsed)); } @Command( @@ -1879,13 +1892,11 @@ public class NPCCommands { min = 2, permission = "citizens.npc.rabbittype") @Requirements(selected = true, ownership = true, types = { EntityType.RABBIT }) - public void rabbitType(CommandContext args, CommandSender sender, NPC npc) throws CommandException { - Rabbit.Type type; - try { - type = Rabbit.Type.valueOf(args.getString(1).toUpperCase()); - } catch (IllegalArgumentException ex) { + public void rabbitType(CommandContext args, CommandSender sender, NPC npc, @Arg(1) Rabbit.Type type) + throws CommandException { + if (type == null) throw new CommandException(Messages.INVALID_RABBIT_TYPE, Util.listValuesPretty(Rabbit.Type.values())); - } + npc.getOrAddTrait(RabbitType.class).setType(type); Messaging.sendTr(sender, Messages.RABBIT_TYPE_SET, npc.getName(), type.name()); } @@ -1899,7 +1910,8 @@ public class NPCCommands { max = 2) @Requirements public void remove(final CommandContext args, final CommandSender sender, NPC npc, @Flag("owner") String owner, - @Flag("eid") UUID eid, @Flag("world") String world) throws CommandException { + @Flag("eid") UUID eid, @Flag("world") String world, @Arg(value = 1, completions = "all") String action) + throws CommandException { if (owner != null) { Player playerOwner = Bukkit.getPlayerExact(owner); for (NPC rem : Lists.newArrayList(CitizensAPI.getNPCRegistry())) { @@ -1945,7 +1957,7 @@ public class NPCCommands { } } if (args.argsLength() == 2) { - if (args.getString(1).equalsIgnoreCase("all")) { + if ("all".equalsIgnoreCase(action)) { if (!sender.hasPermission("citizens.admin.remove.all") && !sender.hasPermission("citizens.admin")) throw new NoPermissionsException(); for (NPC rem : CitizensAPI.getNPCRegistry()) { @@ -2176,21 +2188,22 @@ public class NPCCommands { min = 1, max = 3, permission = "citizens.npc.shop") - public void shop(CommandContext args, Player sender, NPC npc) throws CommandException { + public void shop(CommandContext args, Player sender, NPC npc, + @Arg(value = 1, completions = { "edit", "show" }) String action) throws CommandException { ShopTrait trait = npc.getOrAddTrait(ShopTrait.class); NPCShop shop = trait.getDefaultShop(); if (args.argsLength() > 1) { if (args.argsLength() == 3) { - if (args.getString(1).equalsIgnoreCase("edit") + if (action.equalsIgnoreCase("edit") && !sender.hasPermission("citizens.npc.shop.edit." + args.getString(2).toLowerCase())) throw new NoPermissionsException(); shop = trait.getShop(args.getString(2).toLowerCase()); } - if (args.getString(1).equalsIgnoreCase("edit")) { + if (action.equalsIgnoreCase("edit")) { if (!sender.hasPermission("citizens.npc.shop.edit")) throw new NoPermissionsException(); shop.displayEditor(sender); - } else if (args.getString(1).equalsIgnoreCase("show")) { + } else if (action.equalsIgnoreCase("show")) { shop.display(sender); } else { throw new CommandUsageException(); @@ -2716,8 +2729,8 @@ public class NPCCommands { min = 2, max = 2, permission = "citizens.npc.type") - public void type(CommandContext args, CommandSender sender, NPC npc) throws CommandException { - EntityType type = Util.matchEntityType(args.getString(1)); + public void type(CommandContext args, CommandSender sender, NPC npc, @Arg(1) EntityType type) + throws CommandException { if (type == null) throw new CommandException(Messages.INVALID_ENTITY_TYPE, args.getString(1)); npc.setBukkitEntityType(type); @@ -2733,8 +2746,9 @@ public class NPCCommands { max = 2, permission = "citizens.npc.undo") @Requirements - public void undo(CommandContext args, CommandSender sender, NPC npc) throws CommandException { - if (args.argsLength() > 1 && args.getString(1).equals("all")) { + public void undo(CommandContext args, CommandSender sender, NPC npc, + @Arg(value = 1, completions = "all") String action) throws CommandException { + if ("all".equalsIgnoreCase(action)) { while (history.undo(sender)) { } } else if (history.undo(sender)) { diff --git a/main/src/main/java/net/citizensnpcs/trait/Controllable.java b/main/src/main/java/net/citizensnpcs/trait/Controllable.java index 1d7d7fcbf..7af7bf34f 100644 --- a/main/src/main/java/net/citizensnpcs/trait/Controllable.java +++ b/main/src/main/java/net/citizensnpcs/trait/Controllable.java @@ -72,7 +72,7 @@ public class Controllable extends Trait implements Toggleable, CommandConfigurab } else if (args.hasFlag('r')) { explicitType = null; } else if (args.hasValueFlag("explicittype")) { - explicitType = Util.matchEntityType(args.getFlag("explicittype")); + explicitType = Util.matchEnum(EntityType.values(), args.getFlag("explicittype")); } if (npc.isSpawned()) { @@ -101,7 +101,7 @@ public class Controllable extends Trait implements Toggleable, CommandConfigurab @Override public void load(DataKey key) throws NPCLoadException { if (key.keyExists("explicittype")) { - explicitType = Util.matchEntityType(key.getString("explicittype")); + explicitType = Util.matchEnum(EntityType.values(), key.getString("explicittype")); } } diff --git a/main/src/main/java/net/citizensnpcs/util/Util.java b/main/src/main/java/net/citizensnpcs/util/Util.java index a66726a05..64e18cf34 100644 --- a/main/src/main/java/net/citizensnpcs/util/Util.java +++ b/main/src/main/java/net/citizensnpcs/util/Util.java @@ -276,10 +276,6 @@ public class Util { return current.distance(target) <= range; } - public static EntityType matchEntityType(String toMatch) { - return matchEnum(EntityType.values(), toMatch); - } - public static > T matchEnum(T[] values, String toMatch) { toMatch = toMatch.toLowerCase().replace('-', '_').replace(' ', '_'); for (T check : values) {