Reuse block properties parsing

This commit is contained in:
TheMode 2021-06-22 18:43:48 +02:00
parent f0a73f25eb
commit 58ec228f70
3 changed files with 41 additions and 53 deletions

View File

@ -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);
}
}

View File

@ -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;
}
}

View File

@ -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;
}
}