WIP block loading

This commit is contained in:
TheMode 2021-06-14 00:07:51 +02:00
parent b464b637a4
commit adba6c3d40
2 changed files with 65 additions and 0 deletions

View File

@ -1,24 +1,66 @@
package net.minestom.server.instance.block;
import com.google.gson.JsonArray;
import com.google.gson.JsonObject;
import it.unimi.dsi.fastutil.ints.Int2ObjectAVLTreeMap;
import it.unimi.dsi.fastutil.ints.Int2ObjectSortedMap;
import it.unimi.dsi.fastutil.shorts.Short2ObjectAVLTreeMap;
import it.unimi.dsi.fastutil.shorts.Short2ObjectSortedMap;
import net.minestom.server.registry.Registry;
import net.minestom.server.utils.NamespaceID;
import net.minestom.server.utils.math.IntRange;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;
import java.util.stream.IntStream;
class BlockRegistry {
// Property name -> values
private static final Map<String, List<String>> PROPERTIES_MAP = new ConcurrentHashMap<>();
// Block namespace -> registry data
private static final Map<String, JsonObject> BLOCK_MAP = new ConcurrentHashMap<>();
private static final Map<NamespaceID, Block> namespaceMap = new HashMap<>();
private static final Int2ObjectSortedMap<Block> blockSet = new Int2ObjectAVLTreeMap<>();
private static final Short2ObjectSortedMap<Block.Supplier> stateSet = new Short2ObjectAVLTreeMap<>();
static {
// Load data from file
// Block properties
JsonObject properties = Registry.load(Registry.Resource.BLOCK_PROPERTY);
properties.keySet().forEach(propertyName -> {
final JsonObject propertyObject = properties.getAsJsonObject(propertyName);
final String key = propertyObject.get("key").getAsString();
final JsonArray values = propertyObject.getAsJsonArray("values");
List<String> stringValues = new ArrayList<>(values.size());
values.forEach(jsonElement -> stringValues.add(jsonElement.toString()));
PROPERTIES_MAP.put(key, stringValues);
});
// Blocks
JsonObject blocks = Registry.load(Registry.Resource.BLOCK);
blocks.keySet().forEach(blockNamespace -> {
final JsonObject blockObject = properties.getAsJsonObject(blockNamespace);
BLOCK_MAP.put(blockNamespace, blockObject);
final JsonObject propertiesObject = blockObject.getAsJsonObject("properties");
final JsonArray statesObject = blockObject.getAsJsonArray("states");
{
// To do not be cloned over and over
blockObject.remove("properties");
blockObject.remove("states");
}
});
}
public static synchronized @Nullable Block fromNamespaceId(@NotNull NamespaceID namespaceID) {
return namespaceMap.get(namespaceID);
}

View File

@ -1,17 +1,22 @@
package net.minestom.server.registry;
import com.google.gson.Gson;
import com.google.gson.GsonBuilder;
import com.google.gson.JsonElement;
import com.google.gson.JsonObject;
import net.minestom.server.MinecraftServer;
import net.minestom.server.instance.block.Block;
import org.jetbrains.annotations.ApiStatus;
import org.jetbrains.annotations.NotNull;
import java.io.InputStreamReader;
import java.util.concurrent.ConcurrentHashMap;
import java.util.function.Function;
public class Registry {
private static final Loader LOADER = new Loader();
protected static final Gson GSON = new GsonBuilder().setPrettyPrinting().disableHtmlEscaping().create();
public static BlockEntry block(@NotNull Block block) {
return loader().block(block.getName());
@ -22,6 +27,24 @@ public class Registry {
return LOADER;
}
@ApiStatus.Internal
public static JsonObject load(Resource resource) {
final String path = String.format("/%s_%s.json", MinecraftServer.VERSION_NAME_UNDERSCORED, resource.name);
final var resourceStream = Registry.class.getResourceAsStream(path);
return GSON.fromJson(new InputStreamReader(resourceStream), JsonObject.class);
}
public enum Resource {
BLOCK("blocks"),
BLOCK_PROPERTY("block_properties");
private final String name;
Resource(String name) {
this.name = name;
}
}
public static class BlockEntry extends Entry {
private BlockEntry(JsonObject json) {
super(json);