Compute block properties for arguments

This commit is contained in:
TheMode 2021-05-31 00:00:23 +02:00
parent 8b0991139d
commit 63bff29838
3 changed files with 79 additions and 32 deletions

View File

@ -0,0 +1,74 @@
package net.minestom.server.command.builder.arguments.minecraft;
import net.minestom.server.command.builder.NodeMaker;
import net.minestom.server.command.builder.arguments.Argument;
import net.minestom.server.command.builder.exception.ArgumentSyntaxException;
import net.minestom.server.instance.block.Block;
import net.minestom.server.network.packet.server.play.DeclareCommandsPacket;
import org.jetbrains.annotations.NotNull;
public class ArgumentBlockState extends Argument<Block> {
public static final int NO_BLOCK = 1;
public static final int INVALID_BLOCK = 2;
public ArgumentBlockState(@NotNull String id) {
super(id);
}
@Override
public @NotNull Block parse(@NotNull String input) throws ArgumentSyntaxException {
final int nbtIndex = input.indexOf("[");
if (nbtIndex == 0)
throw new ArgumentSyntaxException("No block type", input, NO_BLOCK);
if (nbtIndex == -1) {
// Only block name
final Block block = Block.fromNamespaceId(input);
if (block == null)
throw new ArgumentSyntaxException("Invalid block type", input, INVALID_BLOCK);
return block;
} else {
// Block state
final String blockName = input.substring(0, nbtIndex);
Block block = Block.fromNamespaceId(blockName);
if (block == null)
throw new ArgumentSyntaxException("Invalid block type", input, INVALID_BLOCK);
// Compute properties
final String propertiesString = input.substring(nbtIndex + 1, input.length() - 1);
StringBuilder keyBuilder = new StringBuilder();
StringBuilder valueBuilder = new StringBuilder();
StringBuilder builder = keyBuilder;
for (int i = 0; i < propertiesString.length(); i++) {
final char c = propertiesString.charAt(i);
if (c == '=') {
// Switch to value builder
builder = valueBuilder;
} else if (c == ',') {
// Append current text
block = block.withProperty(keyBuilder.toString(), valueBuilder.toString());
keyBuilder = new StringBuilder();
valueBuilder = new StringBuilder();
builder = keyBuilder;
} else if (c != ' ') {
builder.append(c);
}
}
return block.withProperty(keyBuilder.toString(), valueBuilder.toString());
}
}
@Override
public void processNodes(@NotNull NodeMaker nodeMaker, boolean executable) {
DeclareCommandsPacket.Node argumentNode = simpleArgumentNode(this, executable, false, false);
argumentNode.parser = "minecraft:block_state";
nodeMaker.addNodes(new DeclareCommandsPacket.Node[]{argumentNode});
}
@Override
public String toString() {
return String.format("BlockState<%s>", getId());
}
}

View File

@ -1,31 +0,0 @@
package net.minestom.server.command.builder.arguments.minecraft.registry;
import net.minestom.server.command.builder.NodeMaker;
import net.minestom.server.instance.block.Block;
import net.minestom.server.network.packet.server.play.DeclareCommandsPacket;
import org.jetbrains.annotations.NotNull;
public class ArgumentBlockState extends ArgumentRegistry<Block> {
public ArgumentBlockState(@NotNull String id) {
super(id);
}
@Override
public Block getRegistry(@NotNull String value) {
return Block.fromNamespaceId(value);
}
@Override
public void processNodes(@NotNull NodeMaker nodeMaker, boolean executable) {
DeclareCommandsPacket.Node argumentNode = simpleArgumentNode(this, executable, false, false);
argumentNode.parser = "minecraft:block_state";
nodeMaker.addNodes(new DeclareCommandsPacket.Node[]{argumentNode});
}
@Override
public String toString() {
return String.format("BlockState<%s>", getId());
}
}

View File

@ -4,6 +4,7 @@ import net.kyori.adventure.text.Component;
import net.minestom.server.command.CommandSender;
import net.minestom.server.command.builder.Command;
import net.minestom.server.command.builder.CommandContext;
import net.minestom.server.command.builder.arguments.ArgumentType;
public class TestCommand extends Command {
@ -11,7 +12,10 @@ public class TestCommand extends Command {
super("testcmd");
setDefaultExecutor(this::usage);
addSyntax((sender, context) -> System.out.println("executed"), "test Get integer<number>");
var block = ArgumentType.BlockState("block");
block.setCallback((sender, exception) -> exception.printStackTrace());
addSyntax((sender, context) -> System.out.println("executed"), block);
}
private void usage(CommandSender sender, CommandContext context) {