diff --git a/src/main/java/me/youhavetrouble/blockedit/commands/SetCommand.java b/src/main/java/me/youhavetrouble/blockedit/commands/SetCommand.java index 2d1da39..75bfc18 100644 --- a/src/main/java/me/youhavetrouble/blockedit/commands/SetCommand.java +++ b/src/main/java/me/youhavetrouble/blockedit/commands/SetCommand.java @@ -25,39 +25,90 @@ public class SetCommand extends Command { @Override public @NotNull List tabComplete(@NotNull CommandSender sender, @NotNull String alias, @NotNull String[] args) { + ArrayList suggestions = new ArrayList<>(); if (args.length == 1) { - ArrayList suggestions = new ArrayList<>(); for (Material material : Material.values()) { if (material.isBlock()) suggestions.add(material.name().toLowerCase()); } return StringUtil.copyPartialMatches(args[0], suggestions, new ArrayList<>()); } - return new ArrayList<>(); + // TODO refactor and/or abstract this + if (args.length > 1) { + Material material = Material.getMaterial(args[0].toUpperCase()); + if (material == null) return suggestions; + if (!material.isBlock()) return suggestions; + BlockData blockData = material.createBlockData(); + String[] split = args[args.length-1].split("="); + if (split.length == 1) { + String datas = blockData.getAsString(false); + String[] nameAndDatas = datas.split("\\["); + datas = nameAndDatas[1].substring(0, nameAndDatas[1].length()-2); + String[] splitDatas = datas.split(","); + for (String data : splitDatas) { + String[] splitData = data.split("="); + if (splitData.length != 2) continue; + String suggestion = splitData[0]+"="; + boolean alreadyUsed = false; + for (String arg : args) { + if (arg.startsWith(suggestion)) { + alreadyUsed = true; + break; + }; + } + if (alreadyUsed) continue; + suggestions.add(suggestion); + } + return StringUtil.copyPartialMatches(split[0], suggestions, new ArrayList<>()); + } + + } + return suggestions; } @Override public boolean execute(@NotNull CommandSender commandSender, @NotNull String s, @NotNull String[] args) { if (!(commandSender instanceof Player player)) return true; + + BEPlayer bePlayer = BEPlayer.getByPlayer(player); + Selection selection = bePlayer.getSelection(); + if (selection == null) { + player.sendMessage(Component.text("You need to select 2 points to do this")); + return true; + } + if (args.length == 0) { player.sendMessage(Component.text("You need to provide block type")); return true; - } else { - Material material = Material.getMaterial(args[0].toUpperCase()); - if (material == null) { - player.sendMessage(Component.text("Provided material does not exist")); - return true; - } - BlockData blockData = material.createBlockData(); - BEPlayer bePlayer = BEPlayer.getByPlayer(player); - Selection selection = bePlayer.getSelection(); - if (selection == null) { - player.sendMessage(Component.text("You need to select 2 points to do this")); - return true; - } - BlockEditAPI.runOperation(selection, 1, new SetOperation(blockData)); } + + BlockData blockData; + try { + blockData = getBlockData(args); + } catch (IllegalArgumentException e) { + player.sendMessage(Component.text("Provided block data is invalid")); + return true; + } + + if (blockData == null) { + player.sendMessage(Component.text("Provided material does not exist")); + return true; + } + + BlockEditAPI.runOperation(selection, 1, new SetOperation(blockData)); return true; } + + + private BlockData getBlockData(String[] args) throws IllegalArgumentException { + ArrayList argsList = new ArrayList<>(List.of(args)); + if (argsList.size() == 0) return null; + Material material = Material.getMaterial(argsList.get(0).toUpperCase()); + if (material == null) return null; + argsList.remove(0); + if (argsList.size() == 0) return material.createBlockData(); + String dataString = "[" + String.join(",", argsList) + "]"; + return material.createBlockData(dataString); + } }