mirror of
https://github.com/Minestom/Minestom.git
synced 2024-09-28 14:37:31 +02:00
Reuse block properties parsing
This commit is contained in:
parent
f0a73f25eb
commit
58ec228f70
@ -5,6 +5,7 @@ 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 net.minestom.server.utils.block.BlockUtils;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
|
||||
public class ArgumentBlockState extends Argument<Block> {
|
||||
@ -14,7 +15,7 @@ public class ArgumentBlockState extends Argument<Block> {
|
||||
public static final int INVALID_PROPERTY = 3;
|
||||
|
||||
public ArgumentBlockState(@NotNull String id) {
|
||||
super(id);
|
||||
super(id, true, false);
|
||||
}
|
||||
|
||||
@Override
|
||||
@ -39,26 +40,9 @@ public class ArgumentBlockState extends Argument<Block> {
|
||||
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());
|
||||
final String query = input.substring(nbtIndex);
|
||||
final var propertyMap = BlockUtils.parseProperties(query);
|
||||
return block.withProperties(propertyMap);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -2,12 +2,10 @@ package net.minestom.server.instance.block;
|
||||
|
||||
import com.google.gson.JsonObject;
|
||||
import net.minestom.server.registry.Registry;
|
||||
import net.minestom.server.utils.StringUtils;
|
||||
import net.minestom.server.utils.block.BlockUtils;
|
||||
import org.jetbrains.annotations.NotNull;
|
||||
import org.jetbrains.annotations.Nullable;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
import java.util.concurrent.ConcurrentHashMap;
|
||||
|
||||
@ -77,39 +75,11 @@ class BlockRegistry {
|
||||
final String query = stateEntry.getKey();
|
||||
JsonObject stateOverride = stateEntry.getValue().getAsJsonObject();
|
||||
final int stateId = stateOverride.get("stateId").getAsInt();
|
||||
final var propertyMap = getPropertyMap(query);
|
||||
final var propertyMap = BlockUtils.parseProperties(query);
|
||||
final Block block = new BlockTest(Registry.block(object, stateOverride), propertyMap);
|
||||
BLOCK_STATE_MAP.put(stateId, block);
|
||||
propertyEntry.propertyMap.put(propertyMap, block);
|
||||
});
|
||||
BLOCK_PROPERTY_MAP.put(namespace, propertyEntry);
|
||||
}
|
||||
|
||||
private static Map<String, String> getPropertyMap(String query) {
|
||||
if (query.equals("[]")) {
|
||||
return Collections.emptyMap();
|
||||
}
|
||||
final int capacity = StringUtils.countMatches(query, ',') + 1;
|
||||
Map<String, String> result = new HashMap<>(capacity);
|
||||
final String propertiesString = query.substring(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 == ',' || c == ']') {
|
||||
// Append current text
|
||||
result.put(keyBuilder.toString().intern(), valueBuilder.toString().intern());
|
||||
keyBuilder = new StringBuilder();
|
||||
valueBuilder = new StringBuilder();
|
||||
builder = keyBuilder;
|
||||
} else if (c != ' ') {
|
||||
builder.append(c);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
@ -3,6 +3,11 @@ package net.minestom.server.utils.block;
|
||||
import net.minestom.server.instance.Instance;
|
||||
import net.minestom.server.instance.block.Block;
|
||||
import net.minestom.server.utils.BlockPosition;
|
||||
import net.minestom.server.utils.StringUtils;
|
||||
|
||||
import java.util.Collections;
|
||||
import java.util.HashMap;
|
||||
import java.util.Map;
|
||||
|
||||
public class BlockUtils {
|
||||
|
||||
@ -50,4 +55,33 @@ public class BlockUtils {
|
||||
public boolean equals(Block block) {
|
||||
return getBlock() == block;
|
||||
}
|
||||
|
||||
public static Map<String, String> parseProperties(String query) {
|
||||
if (!query.startsWith("[") || !query.endsWith("]") ||
|
||||
query.equals("[]")) {
|
||||
return Collections.emptyMap();
|
||||
}
|
||||
final int capacity = StringUtils.countMatches(query, ',') + 1;
|
||||
Map<String, String> result = new HashMap<>(capacity);
|
||||
final String propertiesString = query.substring(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 == ',' || c == ']') {
|
||||
// Append current text
|
||||
result.put(keyBuilder.toString().intern(), valueBuilder.toString().intern());
|
||||
keyBuilder = new StringBuilder();
|
||||
valueBuilder = new StringBuilder();
|
||||
builder = keyBuilder;
|
||||
} else if (c != ' ') {
|
||||
builder.append(c);
|
||||
}
|
||||
}
|
||||
return result;
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user