mirror of
https://github.com/Minestom/Minestom.git
synced 2025-02-21 23:01:32 +01:00
WIP block loading
This commit is contained in:
parent
b464b637a4
commit
adba6c3d40
@ -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);
|
||||
}
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user