allow set and replace commands to take block data along with materials as args

This commit is contained in:
2023-05-07 00:34:20 +02:00
parent c544d15a6a
commit 8a76ec3c03
6 changed files with 98 additions and 64 deletions
@@ -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<String> 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;
}
}
@@ -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;
}
@Override
public @NotNull String getUsage() {
return "/set <block[block=data]>";
}
private BlockData getBlockData(String[] args) throws IllegalArgumentException {
ArrayList<String> 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);
}
}
@@ -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;
}
}
@@ -0,0 +1,9 @@
package me.youhavetrouble.blockedit.commands.arguments;
public class InvalidDataException extends IllegalArgumentException {
public InvalidDataException() {
super();
}
}
@@ -0,0 +1,9 @@
package me.youhavetrouble.blockedit.commands.arguments;
public class InvalidMaterialException extends IllegalArgumentException {
public InvalidMaterialException() {
super();
}
}
@@ -8,7 +8,7 @@ public record ReplaceOperation(BlockData blockToReplace, BlockData blockToSet) i
@Override
public void transformBlock(Block block) {
if (block.getBlockData().matches(blockToReplace))
if (!block.getBlockData().matches(blockToReplace)) return;
block.setBlockData(blockToSet);
}
}