From 8a76ec3c034894386f7d4f6b1d0bc077e53c5aea Mon Sep 17 00:00:00 2001 From: youhavetrouble Date: Sun, 7 May 2023 00:34:20 +0200 Subject: [PATCH] allow set and replace commands to take block data along with materials as args --- .../blockedit/commands/ReplaceCommand.java | 37 +++++++---- .../blockedit/commands/SetCommand.java | 66 +++++-------------- .../commands/arguments/BlockDataArgument.java | 37 +++++++++++ .../arguments/InvalidDataException.java | 9 +++ .../arguments/InvalidMaterialException.java | 9 +++ .../operations/ReplaceOperation.java | 4 +- 6 files changed, 98 insertions(+), 64 deletions(-) create mode 100644 src/main/java/me/youhavetrouble/blockedit/commands/arguments/BlockDataArgument.java create mode 100644 src/main/java/me/youhavetrouble/blockedit/commands/arguments/InvalidDataException.java create mode 100644 src/main/java/me/youhavetrouble/blockedit/commands/arguments/InvalidMaterialException.java diff --git a/src/main/java/me/youhavetrouble/blockedit/commands/ReplaceCommand.java b/src/main/java/me/youhavetrouble/blockedit/commands/ReplaceCommand.java index f05f57a..cc32663 100644 --- a/src/main/java/me/youhavetrouble/blockedit/commands/ReplaceCommand.java +++ b/src/main/java/me/youhavetrouble/blockedit/commands/ReplaceCommand.java @@ -2,6 +2,9 @@ package me.youhavetrouble.blockedit.commands; import me.youhavetrouble.blockedit.BEPlayer; import me.youhavetrouble.blockedit.api.BlockEditAPI; +import me.youhavetrouble.blockedit.commands.arguments.BlockDataArgument; +import me.youhavetrouble.blockedit.commands.arguments.InvalidDataException; +import me.youhavetrouble.blockedit.commands.arguments.InvalidMaterialException; import me.youhavetrouble.blockedit.operations.ReplaceOperation; import me.youhavetrouble.blockedit.util.Selection; import net.kyori.adventure.text.Component; @@ -28,8 +31,7 @@ public class ReplaceCommand extends Command { if (args.length == 1 || args.length == 2) { ArrayList suggestions = new ArrayList<>(); for (Material material : Material.values()) { - if (material.isBlock()) - suggestions.add(material.name().toLowerCase()); + if (material.isBlock()) suggestions.add(material.name().toLowerCase()); } return StringUtil.copyPartialMatches(args[args.length-1], suggestions, new ArrayList<>()); } @@ -47,26 +49,39 @@ public class ReplaceCommand extends Command { player.sendMessage(Component.text("You need to provide block type to replace")); return true; } - Material materialToReplace = Material.getMaterial(args[1].toUpperCase()); - if (materialToReplace == null) { - player.sendMessage(Component.text("Provided material does not exist")); + + BlockData blockData = null; + BlockData blockDataToReplaceWith = null; + + try { + blockData = BlockDataArgument.getBlockData(args[0]); + } catch (InvalidMaterialException e) { + player.sendMessage(Component.text("Provided block type does not exist")); return true; - } - Material material = Material.getMaterial(args[0].toUpperCase()); - if (material == null) { - player.sendMessage(Component.text("Provided material does not exist")); + } catch (InvalidDataException e) { + player.sendMessage(Component.text("Provided block data is invalid")); + return true; + } + + try { + blockDataToReplaceWith = BlockDataArgument.getBlockData(args[1]); + } catch (InvalidMaterialException e) { + player.sendMessage(Component.text("Provided block type does not exist")); + return true; + } catch (InvalidDataException e) { + player.sendMessage(Component.text("Provided block data is invalid")); return true; } - BlockData blockData = material.createBlockData(); - BlockData blockDataToReplaceWith = materialToReplace.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 ReplaceOperation(blockData, blockDataToReplaceWith)); + player.sendMessage(Component.text("Replacing blocks...")); return true; } } diff --git a/src/main/java/me/youhavetrouble/blockedit/commands/SetCommand.java b/src/main/java/me/youhavetrouble/blockedit/commands/SetCommand.java index 4c58b8c..d88ad30 100644 --- a/src/main/java/me/youhavetrouble/blockedit/commands/SetCommand.java +++ b/src/main/java/me/youhavetrouble/blockedit/commands/SetCommand.java @@ -2,6 +2,9 @@ package me.youhavetrouble.blockedit.commands; import me.youhavetrouble.blockedit.BEPlayer; import me.youhavetrouble.blockedit.api.BlockEditAPI; +import me.youhavetrouble.blockedit.commands.arguments.BlockDataArgument; +import me.youhavetrouble.blockedit.commands.arguments.InvalidDataException; +import me.youhavetrouble.blockedit.commands.arguments.InvalidMaterialException; import me.youhavetrouble.blockedit.operations.SetOperation; import me.youhavetrouble.blockedit.util.Selection; import net.kyori.adventure.text.Component; @@ -33,37 +36,6 @@ public class SetCommand extends Command { } return StringUtil.copyPartialMatches(args[0], suggestions, 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("\\["); - if (nameAndDatas.length != 2) return suggestions; - 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; } @@ -79,37 +51,29 @@ public class SetCommand extends Command { return true; } - if (args.length == 0) { - player.sendMessage(Component.text("You need to provide block type")); - return true; + if (args.length != 1) { + return false; } BlockData blockData; try { - blockData = getBlockData(args); - } catch (IllegalArgumentException e) { + blockData = BlockDataArgument.getBlockData(args[0]); + } catch (InvalidMaterialException e) { + player.sendMessage(Component.text("Provided block type does not exist")); + return true; + } catch (InvalidDataException 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)); + player.sendMessage(Component.text("Setting blocks...")); 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); + @Override + public @NotNull String getUsage() { + return "/set "; } + } diff --git a/src/main/java/me/youhavetrouble/blockedit/commands/arguments/BlockDataArgument.java b/src/main/java/me/youhavetrouble/blockedit/commands/arguments/BlockDataArgument.java new file mode 100644 index 0000000..305d42c --- /dev/null +++ b/src/main/java/me/youhavetrouble/blockedit/commands/arguments/BlockDataArgument.java @@ -0,0 +1,37 @@ +package me.youhavetrouble.blockedit.commands.arguments; + +import org.bukkit.Material; +import org.bukkit.block.data.BlockData; + +import java.util.Locale; + + +public class BlockDataArgument { + + public static BlockData getBlockData(String string) throws InvalidMaterialException, InvalidDataException { + + String[] split = string.split("\\["); + Material material = null; + BlockData blockData = null; + if (split.length >= 1) { + String materialString = split[0].toUpperCase(Locale.ENGLISH); + material = Material.getMaterial(materialString); + if (material == null) throw new InvalidMaterialException(); + } + + if (split.length == 1) { + blockData = material.createBlockData(); + } + if (split.length == 2) { + try { + blockData = material.createBlockData("[" + split[1]); + } catch (IllegalArgumentException e) { + throw new InvalidDataException(); + } + } + + return blockData; + + } + +} diff --git a/src/main/java/me/youhavetrouble/blockedit/commands/arguments/InvalidDataException.java b/src/main/java/me/youhavetrouble/blockedit/commands/arguments/InvalidDataException.java new file mode 100644 index 0000000..7f5b1c0 --- /dev/null +++ b/src/main/java/me/youhavetrouble/blockedit/commands/arguments/InvalidDataException.java @@ -0,0 +1,9 @@ +package me.youhavetrouble.blockedit.commands.arguments; + +public class InvalidDataException extends IllegalArgumentException { + + public InvalidDataException() { + super(); + } + +} diff --git a/src/main/java/me/youhavetrouble/blockedit/commands/arguments/InvalidMaterialException.java b/src/main/java/me/youhavetrouble/blockedit/commands/arguments/InvalidMaterialException.java new file mode 100644 index 0000000..c153af2 --- /dev/null +++ b/src/main/java/me/youhavetrouble/blockedit/commands/arguments/InvalidMaterialException.java @@ -0,0 +1,9 @@ +package me.youhavetrouble.blockedit.commands.arguments; + +public class InvalidMaterialException extends IllegalArgumentException { + + public InvalidMaterialException() { + super(); + } + +} diff --git a/src/main/java/me/youhavetrouble/blockedit/operations/ReplaceOperation.java b/src/main/java/me/youhavetrouble/blockedit/operations/ReplaceOperation.java index 00414ab..e249adb 100644 --- a/src/main/java/me/youhavetrouble/blockedit/operations/ReplaceOperation.java +++ b/src/main/java/me/youhavetrouble/blockedit/operations/ReplaceOperation.java @@ -8,7 +8,7 @@ public record ReplaceOperation(BlockData blockToReplace, BlockData blockToSet) i @Override public void transformBlock(Block block) { - if (block.getBlockData().matches(blockToReplace)) - block.setBlockData(blockToSet); + if (!block.getBlockData().matches(blockToReplace)) return; + block.setBlockData(blockToSet); } }