diff --git a/paper-api/src/main/java/org/bukkit/command/SimpleCommandMap.java b/paper-api/src/main/java/org/bukkit/command/SimpleCommandMap.java index 292f768630..7e007c5789 100644 --- a/paper-api/src/main/java/org/bukkit/command/SimpleCommandMap.java +++ b/paper-api/src/main/java/org/bukkit/command/SimpleCommandMap.java @@ -56,6 +56,7 @@ public class SimpleCommandMap implements CommandMap { fallbackCommands.add(new DifficultyCommand()); fallbackCommands.add(new WeatherCommand()); fallbackCommands.add(new SpawnpointCommand()); + fallbackCommands.add(new ClearCommand()); } public SimpleCommandMap(final Server server) { diff --git a/paper-api/src/main/java/org/bukkit/command/defaults/ClearCommand.java b/paper-api/src/main/java/org/bukkit/command/defaults/ClearCommand.java new file mode 100644 index 0000000000..c5fa41c1dc --- /dev/null +++ b/paper-api/src/main/java/org/bukkit/command/defaults/ClearCommand.java @@ -0,0 +1,109 @@ +package org.bukkit.command.defaults; + +import com.google.common.collect.ImmutableList; +import org.apache.commons.lang.Validate; +import org.bukkit.Bukkit; +import org.bukkit.ChatColor; +import org.bukkit.Material; +import org.bukkit.command.CommandSender; +import org.bukkit.entity.Player; +import org.bukkit.inventory.ItemStack; +import org.bukkit.util.StringUtil; + +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; + +public class ClearCommand extends VanillaCommand { + private static List materials; + static { + ArrayList materialList = new ArrayList(); + for (Material material : Material.values()) { + materialList.add(material.name()); + } + Collections.sort(materialList); + materials = ImmutableList.copyOf(materialList); + } + + public ClearCommand() { + super("clear"); + this.description = "Clears the player's inventory. Can specify item and data filters too."; + this.usageMessage = "/clear [item] [data]"; + this.setPermission("bukkit.command.clear"); + } + + @Override + public boolean execute(CommandSender sender, String currentAlias, String[] args) { + if (!testPermission(sender)) return true; + if ((args.length < 2)) { + sender.sendMessage(ChatColor.RED + "Usage: " + usageMessage); + return false; + } + + Player player = null; + if (args.length > 1) { + player = Bukkit.getPlayer(args[1]); + } else if (sender instanceof Player) { + player = (Player) sender; + } + + if (player != null) { + int id = args.length >= 2 ? getInteger(sender, args[1], 1) : -1; + int data = args.length >= 3 ? getInteger(sender, args[2], 0) : -1; + ItemStack matchItem = new ItemStack(); + player.getInventory().all(matchItem) + int count = player.getInventory().clear(id, data); + player.updateInventory(); + } else { + sender.sendMessage("Can't find user " + args[0]); + } + + return true; + } + + @Override + public boolean matches(String input) { + return input.equalsIgnoreCase("clear"); + } + + @Override + public List tabComplete(CommandSender sender, String alias, String[] args) throws IllegalArgumentException { + Validate.notNull(sender, "Sender cannot be null"); + Validate.notNull(args, "Arguments cannot be null"); + Validate.notNull(alias, "Alias cannot be null"); + + if (args.length == 1) { + return super.tabComplete(sender, alias, args); + } + if (args.length == 2) { + final String arg = args[1]; + final List materials = ClearCommand.materials; + List completion = null; + + final int size = materials.size(); + int i = Collections.binarySearch(materials, arg, String.CASE_INSENSITIVE_ORDER); + + if (i < 0) { + // Insertion (start) index + i = -1 - i; + } + + for ( ; i < size; i++) { + String material = materials.get(i); + if (StringUtil.startsWithIgnoreCase(material, arg)) { + if (completion == null) { + completion = new ArrayList(); + } + completion.add(material); + } else { + break; + } + } + + if (completion != null) { + return completion; + } + } + return ImmutableList.of(); + } +}