diff --git a/core/src/main/java/com/volmit/iris/core/link/ExternalDataProvider.java b/core/src/main/java/com/volmit/iris/core/link/ExternalDataProvider.java index bbc7e8088..d88e9f831 100644 --- a/core/src/main/java/com/volmit/iris/core/link/ExternalDataProvider.java +++ b/core/src/main/java/com/volmit/iris/core/link/ExternalDataProvider.java @@ -1,6 +1,8 @@ package com.volmit.iris.core.link; import com.volmit.iris.core.link.data.DataType; +import com.volmit.iris.core.nms.container.BiomeColor; +import com.volmit.iris.core.nms.container.BlockProperty; import com.volmit.iris.core.nms.container.Pair; import com.volmit.iris.engine.data.cache.Cache; import com.volmit.iris.engine.framework.Engine; @@ -22,7 +24,9 @@ import org.bukkit.plugin.Plugin; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; +import java.util.Arrays; import java.util.Collection; +import java.util.List; import java.util.MissingResourceException; @Getter @@ -66,6 +70,18 @@ public abstract class ExternalDataProvider implements Listener { throw new MissingResourceException("Failed to find BlockData!", blockId.namespace(), blockId.key()); } + /** + * Retrieves a list of all {@link BlockProperty} objects associated with the specified block identifier. + * + * @param blockId The identifier of the block whose properties are to be retrieved. Must not be null. + * @return A list of {@link BlockProperty} objects representing the properties of the block. + * @throws MissingResourceException If the specified block identifier is invalid or cannot be found. + */ + @NotNull + public List getBlockProperties(@NotNull Identifier blockId) throws MissingResourceException { + return List.of(); + } + /** * @see ExternalDataProvider#getItemStack(Identifier) */ @@ -137,4 +153,18 @@ public abstract class ExternalDataProvider implements Listener { return new Pair<>(yaw, face); } + + protected static List YAW_FACE_BIOME_PROPERTIES = List.of( + BlockProperty.ofEnum(BiomeColor.class, "matchBiome", null), + BlockProperty.ofBoolean("randomYaw", false), + BlockProperty.ofFloat("yaw", 0, 0, 360f, false, true), + BlockProperty.ofBoolean("randomFace", true), + new BlockProperty( + "face", + BlockFace.class, + BlockFace.NORTH, + Arrays.asList(BlockFace.values()).subList(0, BlockFace.values().length - 1), + BlockFace::name + ) + ); } diff --git a/core/src/main/java/com/volmit/iris/core/link/data/MythicCrucibleDataProvider.java b/core/src/main/java/com/volmit/iris/core/link/data/MythicCrucibleDataProvider.java index 4194f0c16..86d2ce327 100644 --- a/core/src/main/java/com/volmit/iris/core/link/data/MythicCrucibleDataProvider.java +++ b/core/src/main/java/com/volmit/iris/core/link/data/MythicCrucibleDataProvider.java @@ -23,6 +23,7 @@ import com.volmit.iris.core.link.ExternalDataProvider; import com.volmit.iris.core.link.Identifier; import com.volmit.iris.core.nms.INMS; import com.volmit.iris.core.nms.container.BiomeColor; +import com.volmit.iris.core.nms.container.BlockProperty; import com.volmit.iris.core.service.ExternalDataSVC; import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.util.collection.KMap; @@ -41,6 +42,7 @@ import org.bukkit.inventory.ItemStack; import org.jetbrains.annotations.NotNull; import java.util.Collection; +import java.util.List; import java.util.MissingResourceException; import java.util.Optional; @@ -77,6 +79,19 @@ public class MythicCrucibleDataProvider extends ExternalDataProvider { throw new MissingResourceException("Failed to find BlockData!", blockId.namespace(), blockId.key()); } + @Override + public @NotNull List getBlockProperties(@NotNull Identifier blockId) throws MissingResourceException { + CrucibleItem crucibleItem = this.itemManager.getItem(blockId.key()) + .orElseThrow(() -> new MissingResourceException("Failed to find BlockData!", blockId.namespace(), blockId.key())); + + if (crucibleItem.getFurnitureData() != null) { + return YAW_FACE_BIOME_PROPERTIES; + } else if (crucibleItem.getBlockData() != null) { + return List.of(); + } + throw new MissingResourceException("Failed to find BlockData!", blockId.namespace(), blockId.key()); + } + @NotNull @Override public ItemStack getItemStack(@NotNull Identifier itemId, @NotNull KMap customNbt) throws MissingResourceException { diff --git a/core/src/main/java/com/volmit/iris/core/link/data/NexoDataProvider.java b/core/src/main/java/com/volmit/iris/core/link/data/NexoDataProvider.java index 58baa6e59..a0029c320 100644 --- a/core/src/main/java/com/volmit/iris/core/link/data/NexoDataProvider.java +++ b/core/src/main/java/com/volmit/iris/core/link/data/NexoDataProvider.java @@ -8,6 +8,7 @@ import com.volmit.iris.core.link.ExternalDataProvider; import com.volmit.iris.core.link.Identifier; import com.volmit.iris.core.nms.INMS; import com.volmit.iris.core.nms.container.BiomeColor; +import com.volmit.iris.core.nms.container.BlockProperty; import com.volmit.iris.core.service.ExternalDataSVC; import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.util.collection.KMap; @@ -56,6 +57,15 @@ public class NexoDataProvider extends ExternalDataProvider { throw new MissingResourceException("Failed to find BlockData!", blockId.namespace(), blockId.key()); } + @Override + public @NotNull List getBlockProperties(@NotNull Identifier blockId) throws MissingResourceException { + if (!NexoItems.exists(blockId.key())) { + throw new MissingResourceException("Failed to find BlockData!", blockId.namespace(), blockId.key()); + } + + return NexoFurniture.isFurniture(blockId.key()) ? YAW_FACE_BIOME_PROPERTIES : List.of(); + } + @NotNull @Override public ItemStack getItemStack(@NotNull Identifier itemId, @NotNull KMap customNbt) throws MissingResourceException { @@ -63,7 +73,12 @@ public class NexoDataProvider extends ExternalDataProvider { if (builder == null) { throw new MissingResourceException("Failed to find ItemData!", itemId.namespace(), itemId.key()); } - return builder.build(); + try { + return builder.build(); + } catch (Exception e) { + e.printStackTrace(); + throw new MissingResourceException("Failed to find ItemData!", itemId.namespace(), itemId.key()); + } } @Override diff --git a/core/src/main/java/com/volmit/iris/core/nms/INMSBinding.java b/core/src/main/java/com/volmit/iris/core/nms/INMSBinding.java index 29fa4e37d..da039f6e9 100644 --- a/core/src/main/java/com/volmit/iris/core/nms/INMSBinding.java +++ b/core/src/main/java/com/volmit/iris/core/nms/INMSBinding.java @@ -19,6 +19,7 @@ package com.volmit.iris.core.nms; import com.volmit.iris.core.nms.container.BiomeColor; +import com.volmit.iris.core.nms.container.BlockProperty; import com.volmit.iris.core.nms.datapack.DataVersion; import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.engine.platform.PlatformChunkGenerator; @@ -36,9 +37,9 @@ import org.bukkit.entity.EntityType; import org.bukkit.event.entity.CreatureSpawnEvent; import org.bukkit.generator.ChunkGenerator; import org.bukkit.inventory.ItemStack; -import org.jetbrains.annotations.Nullable; import java.awt.Color; +import java.util.List; public interface INMSBinding { boolean hasTile(Material material); @@ -133,4 +134,6 @@ public interface INMSBinding { default boolean injectBukkit() { return true; } + + KMap> getBlockProperties(); } diff --git a/core/src/main/java/com/volmit/iris/core/nms/container/BlockProperty.java b/core/src/main/java/com/volmit/iris/core/nms/container/BlockProperty.java new file mode 100644 index 000000000..e10d65472 --- /dev/null +++ b/core/src/main/java/com/volmit/iris/core/nms/container/BlockProperty.java @@ -0,0 +1,154 @@ +package com.volmit.iris.core.nms.container; + +import com.volmit.iris.util.json.JSONArray; +import com.volmit.iris.util.json.JSONObject; +import org.jetbrains.annotations.NotNull; + +import java.util.*; +import java.util.function.Function; + +public class BlockProperty { + private static final Set> NATIVES = Set.of(Byte.class, Short.class, Integer.class, Long.class, Float.class, Double.class, Boolean.class, String.class); + private final String name; + private final Class type; + + private final Object defaultValue; + private final Set values; + private final Function nameFunction; + private final Function jsonFunction; + + public > BlockProperty( + String name, + Class type, + T defaultValue, + Collection values, + Function nameFunction + ) { + this.name = name; + this.type = type; + this.defaultValue = defaultValue; + this.values = Collections.unmodifiableSet(new TreeSet<>(values)); + this.nameFunction = (Function) (Object) nameFunction; + jsonFunction = NATIVES.contains(type) ? Function.identity() : this.nameFunction::apply; + } + + public static > BlockProperty ofEnum(Class type, String name, T defaultValue) { + return new BlockProperty( + name, + type, + defaultValue, + Arrays.asList(type.getEnumConstants()), + val -> val == null ? "null" : val.name() + ); + } + + public static BlockProperty ofFloat(String name, float defaultValue, float min, float max, boolean exclusiveMin, boolean exclusiveMax) { + return new BoundedDouble( + name, + defaultValue, + min, + max, + exclusiveMin, + exclusiveMax, + (f) -> String.format("%.2f", f) + ); + } + + public static BlockProperty ofBoolean(String name, boolean defaultValue) { + return new BlockProperty( + name, + Boolean.class, + defaultValue, + List.of(true, false), + (b) -> b ? "true" : "false" + ); + } + + @Override + public @NotNull String toString() { + return name + "=" + nameFunction.apply(defaultValue) + " [" + String.join(",", names()) + "]"; + } + + public String name() { + return name; + } + + public String defaultValue() { + return nameFunction.apply(defaultValue); + } + + public List names() { + return values.stream().map(nameFunction).toList(); + } + + public Object defaultValueAsJson() { + return jsonFunction.apply(defaultValue); + } + + public JSONArray valuesAsJson() { + return new JSONArray(values.stream().map(jsonFunction).toList()); + } + + public JSONObject buildJson() { + var json = new JSONObject(); + json.put("type", jsonType()); + json.put("default", defaultValueAsJson()); + if (!values.isEmpty()) json.put("enum", valuesAsJson()); + return json; + } + + public String jsonType() { + if (type == Boolean.class) + return "boolean"; + if (type == Byte.class || type == Short.class || type == Integer.class || type == Long.class) + return "integer"; + if (type == Float.class || type == Double.class) + return "number"; + return "string"; + } + + @Override + public boolean equals(Object obj) { + if (obj == this) return true; + if (obj == null || obj.getClass() != this.getClass()) return false; + var that = (BlockProperty) obj; + return Objects.equals(this.name, that.name) && + Objects.equals(this.values, that.values) && + Objects.equals(this.type, that.type); + } + + @Override + public int hashCode() { + return Objects.hash(name, values, type); + } + + private static class BoundedDouble extends BlockProperty { + private final double min, max; + private final boolean exclusiveMin, exclusiveMax; + + public BoundedDouble( + String name, + double defaultValue, + double min, + double max, + boolean exclusiveMin, + boolean exclusiveMax, + Function nameFunction + ) { + super(name, Double.class, defaultValue, List.of(), nameFunction); + this.min = min; + this.max = max; + this.exclusiveMin = exclusiveMin; + this.exclusiveMax = exclusiveMax; + } + + @Override + public JSONObject buildJson() { + return super.buildJson() + .put("minimum", min) + .put("maximum", max) + .put("exclusiveMinimum", exclusiveMin) + .put("exclusiveMaximum", exclusiveMax); + } + } +} diff --git a/core/src/main/java/com/volmit/iris/core/nms/v1X/NMSBinding1X.java b/core/src/main/java/com/volmit/iris/core/nms/v1X/NMSBinding1X.java index e180ab8d2..4c13db4f4 100644 --- a/core/src/main/java/com/volmit/iris/core/nms/v1X/NMSBinding1X.java +++ b/core/src/main/java/com/volmit/iris/core/nms/v1X/NMSBinding1X.java @@ -21,6 +21,7 @@ package com.volmit.iris.core.nms.v1X; import com.volmit.iris.Iris; import com.volmit.iris.core.nms.INMSBinding; import com.volmit.iris.core.nms.container.BiomeColor; +import com.volmit.iris.core.nms.container.BlockProperty; import com.volmit.iris.core.nms.datapack.DataVersion; import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.util.collection.KList; @@ -40,6 +41,7 @@ import org.bukkit.generator.structure.Structure; import org.bukkit.inventory.ItemStack; import java.awt.Color; +import java.util.List; import java.util.stream.StreamSupport; public class NMSBinding1X implements INMSBinding { @@ -124,6 +126,15 @@ public class NMSBinding1X implements INMSBinding { return false; } + @Override + public KMap> getBlockProperties() { + KMap> map = new KMap<>(); + for (Material m : Material.values()) { + if (m.isBlock()) map.put(m, List.of()); + } + return map; + } + @Override public CompoundTag serializeEntity(Entity location) { return null; diff --git a/core/src/main/java/com/volmit/iris/core/project/SchemaBuilder.java b/core/src/main/java/com/volmit/iris/core/project/SchemaBuilder.java index 1570ca6d8..7e61233f3 100644 --- a/core/src/main/java/com/volmit/iris/core/project/SchemaBuilder.java +++ b/core/src/main/java/com/volmit/iris/core/project/SchemaBuilder.java @@ -115,6 +115,7 @@ public class SchemaBuilder { o.put("x-intellij-html-description", desc.replace("\n", "
")); o.put("type", getType(c)); JSONArray required = new JSONArray(); + JSONArray extended = new JSONArray(); if (c.isAssignableFrom(IrisRegistrant.class) || IrisRegistrant.class.isAssignableFrom(c)) { for (Field k : IrisRegistrant.class.getDeclaredFields()) { @@ -126,11 +127,15 @@ public class SchemaBuilder { JSONObject property = buildProperty(k, c); - if (property.getBoolean("!required")) { + if (Boolean.TRUE == property.remove("!required")) { required.put(k.getName()); } - property.remove("!required"); + if (Boolean.TRUE == property.remove("!top")) { + extended.put(property); + continue; + } + properties.put(k.getName(), property); } } @@ -144,15 +149,24 @@ public class SchemaBuilder { JSONObject property = buildProperty(k, c); - if (property.getBoolean("!required")) + if (Boolean.TRUE == property.remove("!required")) { required.put(k.getName()); - property.remove("!required"); + } + + if (Boolean.TRUE == property.remove("!top")) { + extended.put(property); + continue; + } + properties.put(k.getName(), property); } if (required.length() > 0) { o.put("required", required); } + if (extended.length() > 0) { + o.put("allOf", extended); + } o.put("properties", properties); @@ -345,13 +359,63 @@ public class SchemaBuilder { } } case "object" -> { - fancyType = k.getType().getSimpleName().replaceAll("\\QIris\\E", "") + " (Object)"; - String key = "obj-" + k.getType().getCanonicalName().replaceAll("\\Q.\\E", "-").toLowerCase(); - if (!definitions.containsKey(key)) { - definitions.put(key, new JSONObject()); - definitions.put(key, buildProperties(k.getType())); + //TODO add back descriptions + if (k.isAnnotationPresent(RegistryMapBlockState.class)) { + String blockType = k.getDeclaredAnnotation(RegistryMapBlockState.class).value(); + fancyType = "Block State"; + prop.put("!top", true); + JSONArray any = new JSONArray(); + prop.put("anyOf", any); + + B.getBlockStates().forEach((blocks, properties) -> { + if (blocks.isEmpty()) return; + + String raw = blocks.getFirst().replace(':', '_'); + String enumKey = "enum-block-state-" + raw; + String propertiesKey = "obj-block-state-" + raw; + + any.put(new JSONObject() + .put("if", new JSONObject() + .put("properties", new JSONObject() + .put(blockType, new JSONObject() + .put("type", "string") + .put("$ref", "#/definitions/" + enumKey)))) + .put("then", new JSONObject() + .put("properties", new JSONObject() + .put(k.getName(), new JSONObject() + .put("type", "object") + .put("$ref", "#/definitions/" + propertiesKey)))) + .put("else", false)); + + if (!definitions.containsKey(enumKey)) { + JSONArray filters = new JSONArray(); + blocks.forEach(filters::put); + + definitions.put(enumKey, new JSONObject() + .put("type", "string") + .put("enum", filters)); + } + + if (!definitions.containsKey(propertiesKey)) { + JSONObject props = new JSONObject(); + properties.forEach(property -> { + props.put(property.name(), property.buildJson()); + }); + + definitions.put(propertiesKey, new JSONObject() + .put("type", "object") + .put("properties", props)); + } + }); + } else { + fancyType = k.getType().getSimpleName().replaceAll("\\QIris\\E", "") + " (Object)"; + String key = "obj-" + k.getType().getCanonicalName().replaceAll("\\Q.\\E", "-").toLowerCase(); + if (!definitions.containsKey(key)) { + definitions.put(key, new JSONObject()); + definitions.put(key, buildProperties(k.getType())); + } + prop.put("$ref", "#/definitions/" + key); } - prop.put("$ref", "#/definitions/" + key); } case "array" -> { fancyType = "List of Something...?"; diff --git a/core/src/main/java/com/volmit/iris/core/service/ExternalDataSVC.java b/core/src/main/java/com/volmit/iris/core/service/ExternalDataSVC.java index 42d82d3ab..528e41869 100644 --- a/core/src/main/java/com/volmit/iris/core/service/ExternalDataSVC.java +++ b/core/src/main/java/com/volmit/iris/core/service/ExternalDataSVC.java @@ -21,6 +21,7 @@ package com.volmit.iris.core.service; import com.volmit.iris.Iris; import com.volmit.iris.core.link.*; import com.volmit.iris.core.link.data.DataType; +import com.volmit.iris.core.nms.container.BlockProperty; import com.volmit.iris.core.nms.container.Pair; import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.util.collection.KList; @@ -107,6 +108,18 @@ public class ExternalDataSVC implements IrisService { } } + public Optional> getBlockProperties(final Identifier key) { + Optional provider = activeProviders.stream().filter(p -> p.isValidProvider(key, DataType.BLOCK)).findFirst(); + if (provider.isEmpty()) + return Optional.empty(); + try { + return Optional.of(provider.get().getBlockProperties(key)); + } catch (MissingResourceException e) { + Iris.error(e.getMessage() + " - [" + e.getClassName() + ":" + e.getKey() + "]"); + return Optional.empty(); + } + } + public Optional getItemStack(Identifier key, KMap customNbt) { Optional provider = activeProviders.stream().filter(p -> p.isValidProvider(key, DataType.ITEM)).findFirst(); if (provider.isEmpty()) { @@ -150,6 +163,14 @@ public class ExternalDataSVC implements IrisService { .toList(); } + public Collection>> getAllBlockProperties() { + return activeProviders.stream() + .flatMap(p -> p.getTypes(DataType.BLOCK) + .stream() + .map(id -> new Pair<>(id, p.getBlockProperties(id)))) + .toList(); + } + public static Pair> parseState(Identifier key) { if (!key.key().contains("[") || !key.key().contains("]")) { return new Pair<>(key, new KMap<>()); diff --git a/core/src/main/java/com/volmit/iris/engine/object/IrisBlockData.java b/core/src/main/java/com/volmit/iris/engine/object/IrisBlockData.java index f3f162a7d..1c9cb514d 100644 --- a/core/src/main/java/com/volmit/iris/engine/object/IrisBlockData.java +++ b/core/src/main/java/com/volmit/iris/engine/object/IrisBlockData.java @@ -61,6 +61,7 @@ public class IrisBlockData extends IrisRegistrant { private int weight = 1; @Desc("If the block cannot be created on this version, Iris will attempt to use this backup block data instead.") private IrisBlockData backup = null; + @RegistryMapBlockState("block") @Desc("Optional properties for this block data such as 'waterlogged': true") private KMap data = new KMap<>(); @Desc("Optional tile data for this block data") diff --git a/core/src/main/java/com/volmit/iris/engine/object/annotations/RegistryMapBlockState.java b/core/src/main/java/com/volmit/iris/engine/object/annotations/RegistryMapBlockState.java new file mode 100644 index 000000000..4bcf14cef --- /dev/null +++ b/core/src/main/java/com/volmit/iris/engine/object/annotations/RegistryMapBlockState.java @@ -0,0 +1,12 @@ +package com.volmit.iris.engine.object.annotations; + +import java.lang.annotation.ElementType; +import java.lang.annotation.Retention; +import java.lang.annotation.RetentionPolicy; +import java.lang.annotation.Target; + +@Retention(RetentionPolicy.RUNTIME) +@Target(ElementType.FIELD) +public @interface RegistryMapBlockState { + String value(); +} diff --git a/core/src/main/java/com/volmit/iris/util/data/B.java b/core/src/main/java/com/volmit/iris/util/data/B.java index 1bf8edb2f..7f98d13f9 100644 --- a/core/src/main/java/com/volmit/iris/util/data/B.java +++ b/core/src/main/java/com/volmit/iris/util/data/B.java @@ -22,6 +22,8 @@ import com.volmit.iris.Iris; import com.volmit.iris.core.IrisSettings; import com.volmit.iris.core.link.Identifier; import com.volmit.iris.core.link.data.DataType; +import com.volmit.iris.core.nms.INMS; +import com.volmit.iris.core.nms.container.BlockProperty; import com.volmit.iris.core.service.ExternalDataSVC; import com.volmit.iris.util.collection.KList; import com.volmit.iris.util.collection.KMap; @@ -35,10 +37,7 @@ import org.bukkit.block.data.Waterlogged; import org.bukkit.block.data.type.Leaves; import org.bukkit.block.data.type.PointedDripstone; -import java.util.Arrays; -import java.util.HashMap; -import java.util.Map; -import java.util.Optional; +import java.util.*; import java.util.stream.Collectors; import static org.bukkit.Material.*; @@ -680,6 +679,28 @@ public class B { return bt.toArray(new String[0]); } + public synchronized static KMap, List> getBlockStates() { + KMap, List> flipped = new KMap<>(); + INMS.get().getBlockProperties().forEach((k, v) -> { + flipped.computeIfAbsent(v, $ -> new KList<>()).add(k.getKey().toString()); + }); + + var emptyStates = flipped.computeIfAbsent(new KList<>(0), $ -> new KList<>()); + for (var pair : Iris.service(ExternalDataSVC.class).getAllBlockProperties()) { + if (pair.getB().isEmpty()) emptyStates.add(pair.getA().toString()); + else flipped.computeIfAbsent(pair.getB(), $ -> new KList<>()).add(pair.getA().toString()); + } + emptyStates.addAll(custom.k()); + + KMap, List> states = new KMap<>(); + flipped.forEach((k, v) -> { + var old = states.put(v, k); + if (old != null) Iris.error("Duplicate block state: " + v + " (" + old + " and " + k + ")"); + }); + + return states; + } + public static String[] getItemTypes() { KList bt = new KList<>(); diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 1a52c0d2c..41302ef62 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -44,7 +44,7 @@ kotlin-coroutines = "1.10.2" maven-core = "3.9.10" # Third Party Integrations -nexo = "1.8.0" # https://repo.nexomc.com/#/releases/com/nexomc/nexo +nexo = "1.10.0" # https://repo.nexomc.com/#/releases/com/nexomc/nexo itemsadder = "4.0.10" # https://github.com/LoneDev6/API-ItemsAdder placeholderApi = "2.11.6" # https://repo.extendedclip.com/#/releases/me/clip/placeholderapi score = "5.25.3.9" # https://github.com/Ssomar-Developement/SCore diff --git a/nms/v1_20_R1/src/main/java/com/volmit/iris/core/nms/v1_20_R1/NMSBinding.java b/nms/v1_20_R1/src/main/java/com/volmit/iris/core/nms/v1_20_R1/NMSBinding.java index 9b28f5456..f2b923c30 100644 --- a/nms/v1_20_R1/src/main/java/com/volmit/iris/core/nms/v1_20_R1/NMSBinding.java +++ b/nms/v1_20_R1/src/main/java/com/volmit/iris/core/nms/v1_20_R1/NMSBinding.java @@ -5,6 +5,7 @@ import com.mojang.datafixers.util.Pair; import com.volmit.iris.Iris; import com.volmit.iris.core.nms.INMSBinding; import com.volmit.iris.core.nms.container.BiomeColor; +import com.volmit.iris.core.nms.container.BlockProperty; import com.volmit.iris.engine.data.cache.AtomicCache; import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.engine.platform.PlatformChunkGenerator; @@ -47,6 +48,7 @@ import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.EntityBlock; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.Property; import net.minecraft.world.level.chunk.ChunkAccess; import net.minecraft.world.level.chunk.ChunkStatus; import net.minecraft.world.level.chunk.LevelChunk; @@ -68,6 +70,7 @@ import org.bukkit.craftbukkit.v1_20_R1.block.CraftBlockState; import org.bukkit.craftbukkit.v1_20_R1.block.CraftBlockStates; import org.bukkit.craftbukkit.v1_20_R1.block.data.CraftBlockData; import org.bukkit.craftbukkit.v1_20_R1.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_20_R1.util.CraftMagicNumbers; import org.bukkit.entity.Entity; import org.bukkit.event.entity.CreatureSpawnEvent; import org.bukkit.generator.BiomeProvider; @@ -679,6 +682,28 @@ public class NMSBinding implements INMSBinding { return false; } + @Override + public KMap> getBlockProperties() { + KMap> states = new KMap<>(); + + for (var block : registry().registryOrThrow(Registries.BLOCK)) { + var state = block.defaultBlockState(); + if (state == null) state = block.getStateDefinition().any(); + final var finalState = state; + + states.put(CraftMagicNumbers.getMaterial(block), block.getStateDefinition() + .getProperties() + .stream() + .map(p -> createProperty(p, finalState)) + .toList()); + } + return states; + } + + private > BlockProperty createProperty(Property property, BlockState state) { + return new BlockProperty(property.getName(), property.getValueClass(), state.getValue(property), property.getPossibleValues(), property::getName); + } + public LevelStem levelStem(RegistryAccess access, ChunkGenerator raw) { if (!(raw instanceof PlatformChunkGenerator gen)) throw new IllegalStateException("Generator is not platform chunk generator!"); diff --git a/nms/v1_20_R2/src/main/java/com/volmit/iris/core/nms/v1_20_R2/NMSBinding.java b/nms/v1_20_R2/src/main/java/com/volmit/iris/core/nms/v1_20_R2/NMSBinding.java index 99187723f..0086ff9d9 100644 --- a/nms/v1_20_R2/src/main/java/com/volmit/iris/core/nms/v1_20_R2/NMSBinding.java +++ b/nms/v1_20_R2/src/main/java/com/volmit/iris/core/nms/v1_20_R2/NMSBinding.java @@ -5,6 +5,7 @@ import com.mojang.datafixers.util.Pair; import com.volmit.iris.Iris; import com.volmit.iris.core.nms.INMSBinding; import com.volmit.iris.core.nms.container.BiomeColor; +import com.volmit.iris.core.nms.container.BlockProperty; import com.volmit.iris.engine.data.cache.AtomicCache; import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.engine.platform.PlatformChunkGenerator; @@ -48,6 +49,7 @@ import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.EntityBlock; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.Property; import net.minecraft.world.level.chunk.ChunkAccess; import net.minecraft.world.level.chunk.ChunkStatus; import net.minecraft.world.level.chunk.LevelChunk; @@ -68,6 +70,7 @@ import org.bukkit.craftbukkit.v1_20_R2.block.CraftBlockState; import org.bukkit.craftbukkit.v1_20_R2.block.CraftBlockStates; import org.bukkit.craftbukkit.v1_20_R2.block.data.CraftBlockData; import org.bukkit.craftbukkit.v1_20_R2.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_20_R2.util.CraftMagicNumbers; import org.bukkit.craftbukkit.v1_20_R2.util.CraftNamespacedKey; import org.bukkit.entity.Entity; import org.bukkit.event.entity.CreatureSpawnEvent; @@ -682,6 +685,28 @@ public class NMSBinding implements INMSBinding { return false; } + @Override + public KMap> getBlockProperties() { + KMap> states = new KMap<>(); + + for (var block : registry().registryOrThrow(Registries.BLOCK)) { + var state = block.defaultBlockState(); + if (state == null) state = block.getStateDefinition().any(); + final var finalState = state; + + states.put(CraftMagicNumbers.getMaterial(block), block.getStateDefinition() + .getProperties() + .stream() + .map(p -> createProperty(p, finalState)) + .toList()); + } + return states; + } + + private > BlockProperty createProperty(Property property, BlockState state) { + return new BlockProperty(property.getName(), property.getValueClass(), state.getValue(property), property.getPossibleValues(), property::getName); + } + public LevelStem levelStem(RegistryAccess access, ChunkGenerator raw) { if (!(raw instanceof PlatformChunkGenerator gen)) throw new IllegalStateException("Generator is not platform chunk generator!"); diff --git a/nms/v1_20_R3/src/main/java/com/volmit/iris/core/nms/v1_20_R3/NMSBinding.java b/nms/v1_20_R3/src/main/java/com/volmit/iris/core/nms/v1_20_R3/NMSBinding.java index c1680fb93..de96f541c 100644 --- a/nms/v1_20_R3/src/main/java/com/volmit/iris/core/nms/v1_20_R3/NMSBinding.java +++ b/nms/v1_20_R3/src/main/java/com/volmit/iris/core/nms/v1_20_R3/NMSBinding.java @@ -5,6 +5,7 @@ import com.mojang.datafixers.util.Pair; import com.volmit.iris.Iris; import com.volmit.iris.core.nms.INMSBinding; import com.volmit.iris.core.nms.container.BiomeColor; +import com.volmit.iris.core.nms.container.BlockProperty; import com.volmit.iris.engine.data.cache.AtomicCache; import com.volmit.iris.engine.framework.Engine; import com.volmit.iris.engine.platform.PlatformChunkGenerator; @@ -48,6 +49,7 @@ import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.EntityBlock; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.Property; import net.minecraft.world.level.chunk.ChunkAccess; import net.minecraft.world.level.chunk.ChunkStatus; import net.minecraft.world.level.chunk.LevelChunk; @@ -68,6 +70,7 @@ import org.bukkit.craftbukkit.v1_20_R3.block.CraftBlockState; import org.bukkit.craftbukkit.v1_20_R3.block.CraftBlockStates; import org.bukkit.craftbukkit.v1_20_R3.block.data.CraftBlockData; import org.bukkit.craftbukkit.v1_20_R3.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_20_R3.util.CraftMagicNumbers; import org.bukkit.craftbukkit.v1_20_R3.util.CraftNamespacedKey; import org.bukkit.entity.Entity; import org.bukkit.event.entity.CreatureSpawnEvent; @@ -683,6 +686,28 @@ public class NMSBinding implements INMSBinding { return false; } + @Override + public KMap> getBlockProperties() { + KMap> states = new KMap<>(); + + for (var block : registry().registryOrThrow(Registries.BLOCK)) { + var state = block.defaultBlockState(); + if (state == null) state = block.getStateDefinition().any(); + final var finalState = state; + + states.put(CraftMagicNumbers.getMaterial(block), block.getStateDefinition() + .getProperties() + .stream() + .map(p -> createProperty(p, finalState)) + .toList()); + } + return states; + } + + private > BlockProperty createProperty(Property property, BlockState state) { + return new BlockProperty(property.getName(), property.getValueClass(), state.getValue(property), property.getPossibleValues(), property::getName); + } + public LevelStem levelStem(RegistryAccess access, ChunkGenerator raw) { if (!(raw instanceof PlatformChunkGenerator gen)) throw new IllegalStateException("Generator is not platform chunk generator!"); diff --git a/nms/v1_20_R4/src/main/java/com/volmit/iris/core/nms/v1_20_R4/NMSBinding.java b/nms/v1_20_R4/src/main/java/com/volmit/iris/core/nms/v1_20_R4/NMSBinding.java index 1ce8b16b4..ded43678c 100644 --- a/nms/v1_20_R4/src/main/java/com/volmit/iris/core/nms/v1_20_R4/NMSBinding.java +++ b/nms/v1_20_R4/src/main/java/com/volmit/iris/core/nms/v1_20_R4/NMSBinding.java @@ -5,6 +5,7 @@ import com.mojang.datafixers.util.Pair; import com.volmit.iris.Iris; import com.volmit.iris.core.nms.INMSBinding; import com.volmit.iris.core.nms.container.BiomeColor; +import com.volmit.iris.core.nms.container.BlockProperty; import com.volmit.iris.core.nms.datapack.DataVersion; import com.volmit.iris.engine.data.cache.AtomicCache; import com.volmit.iris.engine.framework.Engine; @@ -49,6 +50,7 @@ import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.EntityBlock; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.Property; import net.minecraft.world.level.chunk.ChunkAccess; import net.minecraft.world.level.chunk.LevelChunk; import net.minecraft.world.level.chunk.ProtoChunk; @@ -69,6 +71,7 @@ import org.bukkit.craftbukkit.v1_20_R4.block.CraftBlockState; import org.bukkit.craftbukkit.v1_20_R4.block.CraftBlockStates; import org.bukkit.craftbukkit.v1_20_R4.block.data.CraftBlockData; import org.bukkit.craftbukkit.v1_20_R4.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_20_R4.util.CraftMagicNumbers; import org.bukkit.craftbukkit.v1_20_R4.util.CraftNamespacedKey; import org.bukkit.entity.Entity; import org.bukkit.event.entity.CreatureSpawnEvent; @@ -701,6 +704,28 @@ public class NMSBinding implements INMSBinding { return false; } + @Override + public KMap> getBlockProperties() { + KMap> states = new KMap<>(); + + for (var block : registry().registryOrThrow(Registries.BLOCK)) { + var state = block.defaultBlockState(); + if (state == null) state = block.getStateDefinition().any(); + final var finalState = state; + + states.put(CraftMagicNumbers.getMaterial(block), block.getStateDefinition() + .getProperties() + .stream() + .map(p -> createProperty(p, finalState)) + .toList()); + } + return states; + } + + private > BlockProperty createProperty(Property property, BlockState state) { + return new BlockProperty(property.getName(), property.getValueClass(), state.getValue(property), property.getPossibleValues(), property::getName); + } + public LevelStem levelStem(RegistryAccess access, ChunkGenerator raw) { if (!(raw instanceof PlatformChunkGenerator gen)) throw new IllegalStateException("Generator is not platform chunk generator!"); diff --git a/nms/v1_21_R1/src/main/java/com/volmit/iris/core/nms/v1_21_R1/NMSBinding.java b/nms/v1_21_R1/src/main/java/com/volmit/iris/core/nms/v1_21_R1/NMSBinding.java index 485b44e0c..758d57b8c 100644 --- a/nms/v1_21_R1/src/main/java/com/volmit/iris/core/nms/v1_21_R1/NMSBinding.java +++ b/nms/v1_21_R1/src/main/java/com/volmit/iris/core/nms/v1_21_R1/NMSBinding.java @@ -5,6 +5,7 @@ import com.mojang.datafixers.util.Pair; import com.volmit.iris.Iris; import com.volmit.iris.core.nms.INMSBinding; import com.volmit.iris.core.nms.container.BiomeColor; +import com.volmit.iris.core.nms.container.BlockProperty; import com.volmit.iris.core.nms.datapack.DataVersion; import com.volmit.iris.engine.data.cache.AtomicCache; import com.volmit.iris.engine.framework.Engine; @@ -52,6 +53,7 @@ import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.EntityBlock; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.Property; import net.minecraft.world.level.chunk.ChunkAccess; import net.minecraft.world.level.chunk.LevelChunk; import net.minecraft.world.level.chunk.ProtoChunk; @@ -73,6 +75,7 @@ import org.bukkit.craftbukkit.v1_21_R1.block.CraftBlockState; import org.bukkit.craftbukkit.v1_21_R1.block.CraftBlockStates; import org.bukkit.craftbukkit.v1_21_R1.block.data.CraftBlockData; import org.bukkit.craftbukkit.v1_21_R1.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_21_R1.util.CraftMagicNumbers; import org.bukkit.craftbukkit.v1_21_R1.util.CraftNamespacedKey; import org.bukkit.entity.Entity; import org.bukkit.event.entity.CreatureSpawnEvent; @@ -712,6 +715,28 @@ public class NMSBinding implements INMSBinding { return false; } + @Override + public KMap> getBlockProperties() { + KMap> states = new KMap<>(); + + for (var block : registry().registryOrThrow(Registries.BLOCK)) { + var state = block.defaultBlockState(); + if (state == null) state = block.getStateDefinition().any(); + final var finalState = state; + + states.put(CraftMagicNumbers.getMaterial(block), block.getStateDefinition() + .getProperties() + .stream() + .map(p -> createProperty(p, finalState)) + .toList()); + } + return states; + } + + private > BlockProperty createProperty(Property property, BlockState state) { + return new BlockProperty(property.getName(), property.getValueClass(), state.getValue(property), property.getPossibleValues(), property::getName); + } + public LevelStem levelStem(RegistryAccess access, ChunkGenerator raw) { if (!(raw instanceof PlatformChunkGenerator gen)) throw new IllegalStateException("Generator is not platform chunk generator!"); diff --git a/nms/v1_21_R2/src/main/java/com/volmit/iris/core/nms/v1_21_R2/NMSBinding.java b/nms/v1_21_R2/src/main/java/com/volmit/iris/core/nms/v1_21_R2/NMSBinding.java index dff3db099..c724806c3 100644 --- a/nms/v1_21_R2/src/main/java/com/volmit/iris/core/nms/v1_21_R2/NMSBinding.java +++ b/nms/v1_21_R2/src/main/java/com/volmit/iris/core/nms/v1_21_R2/NMSBinding.java @@ -4,6 +4,7 @@ import com.mojang.brigadier.exceptions.CommandSyntaxException; import com.volmit.iris.Iris; import com.volmit.iris.core.nms.INMSBinding; import com.volmit.iris.core.nms.container.BiomeColor; +import com.volmit.iris.core.nms.container.BlockProperty; import com.volmit.iris.core.nms.datapack.DataVersion; import com.volmit.iris.engine.data.cache.AtomicCache; import com.volmit.iris.engine.framework.Engine; @@ -49,6 +50,7 @@ import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.EntityBlock; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.Property; import net.minecraft.world.level.chunk.ChunkAccess; import net.minecraft.world.level.chunk.LevelChunk; import net.minecraft.world.level.chunk.ProtoChunk; @@ -70,6 +72,7 @@ import org.bukkit.craftbukkit.v1_21_R2.block.CraftBlockState; import org.bukkit.craftbukkit.v1_21_R2.block.CraftBlockStates; import org.bukkit.craftbukkit.v1_21_R2.block.data.CraftBlockData; import org.bukkit.craftbukkit.v1_21_R2.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_21_R2.util.CraftMagicNumbers; import org.bukkit.craftbukkit.v1_21_R2.util.CraftNamespacedKey; import org.bukkit.entity.Entity; import org.bukkit.event.entity.CreatureSpawnEvent; @@ -709,6 +712,28 @@ public class NMSBinding implements INMSBinding { return false; } + @Override + public KMap> getBlockProperties() { + KMap> states = new KMap<>(); + + for (var block : registry().lookupOrThrow(Registries.BLOCK)) { + var state = block.defaultBlockState(); + if (state == null) state = block.getStateDefinition().any(); + final var finalState = state; + + states.put(CraftMagicNumbers.getMaterial(block), block.getStateDefinition() + .getProperties() + .stream() + .map(p -> createProperty(p, finalState)) + .toList()); + } + return states; + } + + private > BlockProperty createProperty(Property property, BlockState state) { + return new BlockProperty(property.getName(), property.getValueClass(), state.getValue(property), property.getPossibleValues(), property::getName); + } + public LevelStem levelStem(RegistryAccess access, ChunkGenerator raw) { if (!(raw instanceof PlatformChunkGenerator gen)) throw new IllegalStateException("Generator is not platform chunk generator!"); diff --git a/nms/v1_21_R3/src/main/java/com/volmit/iris/core/nms/v1_21_R3/NMSBinding.java b/nms/v1_21_R3/src/main/java/com/volmit/iris/core/nms/v1_21_R3/NMSBinding.java index ca046a955..9f2449ec4 100644 --- a/nms/v1_21_R3/src/main/java/com/volmit/iris/core/nms/v1_21_R3/NMSBinding.java +++ b/nms/v1_21_R3/src/main/java/com/volmit/iris/core/nms/v1_21_R3/NMSBinding.java @@ -4,6 +4,7 @@ import com.mojang.brigadier.exceptions.CommandSyntaxException; import com.volmit.iris.Iris; import com.volmit.iris.core.nms.INMSBinding; import com.volmit.iris.core.nms.container.BiomeColor; +import com.volmit.iris.core.nms.container.BlockProperty; import com.volmit.iris.core.nms.datapack.DataVersion; import com.volmit.iris.engine.data.cache.AtomicCache; import com.volmit.iris.engine.framework.Engine; @@ -50,6 +51,7 @@ import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.EntityBlock; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.Property; import net.minecraft.world.level.chunk.ChunkAccess; import net.minecraft.world.level.chunk.LevelChunk; import net.minecraft.world.level.chunk.ProtoChunk; @@ -71,6 +73,7 @@ import org.bukkit.craftbukkit.v1_21_R3.block.CraftBlockState; import org.bukkit.craftbukkit.v1_21_R3.block.CraftBlockStates; import org.bukkit.craftbukkit.v1_21_R3.block.data.CraftBlockData; import org.bukkit.craftbukkit.v1_21_R3.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_21_R3.util.CraftMagicNumbers; import org.bukkit.craftbukkit.v1_21_R3.util.CraftNamespacedKey; import org.bukkit.entity.Entity; import org.bukkit.event.entity.CreatureSpawnEvent; @@ -709,6 +712,28 @@ public class NMSBinding implements INMSBinding { return false; } + @Override + public KMap> getBlockProperties() { + KMap> states = new KMap<>(); + + for (var block : registry().lookupOrThrow(Registries.BLOCK)) { + var state = block.defaultBlockState(); + if (state == null) state = block.getStateDefinition().any(); + final var finalState = state; + + states.put(CraftMagicNumbers.getMaterial(block), block.getStateDefinition() + .getProperties() + .stream() + .map(p -> createProperty(p, finalState)) + .toList()); + } + return states; + } + + private > BlockProperty createProperty(Property property, BlockState state) { + return new BlockProperty(property.getName(), property.getValueClass(), state.getValue(property), property.getPossibleValues(), property::getName); + } + public LevelStem levelStem(RegistryAccess access, ChunkGenerator raw) { if (!(raw instanceof PlatformChunkGenerator gen)) throw new IllegalStateException("Generator is not platform chunk generator!"); diff --git a/nms/v1_21_R4/src/main/java/com/volmit/iris/core/nms/v1_21_R4/NMSBinding.java b/nms/v1_21_R4/src/main/java/com/volmit/iris/core/nms/v1_21_R4/NMSBinding.java index a376cb83d..ddcd66bdd 100644 --- a/nms/v1_21_R4/src/main/java/com/volmit/iris/core/nms/v1_21_R4/NMSBinding.java +++ b/nms/v1_21_R4/src/main/java/com/volmit/iris/core/nms/v1_21_R4/NMSBinding.java @@ -4,6 +4,7 @@ import com.mojang.brigadier.exceptions.CommandSyntaxException; import com.volmit.iris.Iris; import com.volmit.iris.core.nms.INMSBinding; import com.volmit.iris.core.nms.container.BiomeColor; +import com.volmit.iris.core.nms.container.BlockProperty; import com.volmit.iris.core.nms.datapack.DataVersion; import com.volmit.iris.engine.data.cache.AtomicCache; import com.volmit.iris.engine.framework.Engine; @@ -49,6 +50,7 @@ import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.EntityBlock; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.Property; import net.minecraft.world.level.chunk.ChunkAccess; import net.minecraft.world.level.chunk.LevelChunk; import net.minecraft.world.level.chunk.ProtoChunk; @@ -71,6 +73,7 @@ import org.bukkit.craftbukkit.v1_21_R4.block.CraftBlockState; import org.bukkit.craftbukkit.v1_21_R4.block.CraftBlockStates; import org.bukkit.craftbukkit.v1_21_R4.block.data.CraftBlockData; import org.bukkit.craftbukkit.v1_21_R4.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_21_R4.util.CraftMagicNumbers; import org.bukkit.craftbukkit.v1_21_R4.util.CraftNamespacedKey; import org.bukkit.entity.Entity; import org.bukkit.event.entity.CreatureSpawnEvent; @@ -709,6 +712,28 @@ public class NMSBinding implements INMSBinding { return false; } + @Override + public KMap> getBlockProperties() { + KMap> states = new KMap<>(); + + for (var block : registry().lookupOrThrow(Registries.BLOCK)) { + var state = block.defaultBlockState(); + if (state == null) state = block.getStateDefinition().any(); + final var finalState = state; + + states.put(CraftMagicNumbers.getMaterial(block), block.getStateDefinition() + .getProperties() + .stream() + .map(p -> createProperty(p, finalState)) + .toList()); + } + return states; + } + + private > BlockProperty createProperty(Property property, BlockState state) { + return new BlockProperty(property.getName(), property.getValueClass(), state.getValue(property), property.getPossibleValues(), property::getName); + } + public LevelStem levelStem(RegistryAccess access, ChunkGenerator raw) { if (!(raw instanceof PlatformChunkGenerator gen)) throw new IllegalStateException("Generator is not platform chunk generator!"); diff --git a/nms/v1_21_R5/src/main/java/com/volmit/iris/core/nms/v1_21_R5/NMSBinding.java b/nms/v1_21_R5/src/main/java/com/volmit/iris/core/nms/v1_21_R5/NMSBinding.java index 425dd25a7..c8f50cbb2 100644 --- a/nms/v1_21_R5/src/main/java/com/volmit/iris/core/nms/v1_21_R5/NMSBinding.java +++ b/nms/v1_21_R5/src/main/java/com/volmit/iris/core/nms/v1_21_R5/NMSBinding.java @@ -4,6 +4,7 @@ import com.mojang.brigadier.exceptions.CommandSyntaxException; import com.volmit.iris.Iris; import com.volmit.iris.core.nms.INMSBinding; import com.volmit.iris.core.nms.container.BiomeColor; +import com.volmit.iris.core.nms.container.BlockProperty; import com.volmit.iris.core.nms.datapack.DataVersion; import com.volmit.iris.engine.data.cache.AtomicCache; import com.volmit.iris.engine.framework.Engine; @@ -49,6 +50,7 @@ import net.minecraft.world.level.block.Blocks; import net.minecraft.world.level.block.EntityBlock; import net.minecraft.world.level.block.entity.BlockEntity; import net.minecraft.world.level.block.state.BlockState; +import net.minecraft.world.level.block.state.properties.Property; import net.minecraft.world.level.chunk.ChunkAccess; import net.minecraft.world.level.chunk.LevelChunk; import net.minecraft.world.level.chunk.ProtoChunk; @@ -70,6 +72,7 @@ import org.bukkit.craftbukkit.v1_21_R5.block.CraftBlockState; import org.bukkit.craftbukkit.v1_21_R5.block.CraftBlockStates; import org.bukkit.craftbukkit.v1_21_R5.block.data.CraftBlockData; import org.bukkit.craftbukkit.v1_21_R5.inventory.CraftItemStack; +import org.bukkit.craftbukkit.v1_21_R5.util.CraftMagicNumbers; import org.bukkit.craftbukkit.v1_21_R5.util.CraftNamespacedKey; import org.bukkit.entity.Entity; import org.bukkit.event.entity.CreatureSpawnEvent; @@ -708,6 +711,28 @@ public class NMSBinding implements INMSBinding { return false; } + @Override + public KMap> getBlockProperties() { + KMap> states = new KMap<>(); + + for (var block : registry().lookupOrThrow(Registries.BLOCK)) { + var state = block.defaultBlockState(); + if (state == null) state = block.getStateDefinition().any(); + final var finalState = state; + + states.put(CraftMagicNumbers.getMaterial(block), block.getStateDefinition() + .getProperties() + .stream() + .map(p -> createProperty(p, finalState)) + .toList()); + } + return states; + } + + private > BlockProperty createProperty(Property property, BlockState state) { + return new BlockProperty(property.getName(), property.getValueClass(), state.getValue(property), property.getPossibleValues(), property::getName); + } + public LevelStem levelStem(RegistryAccess access, ChunkGenerator raw) { if (!(raw instanceof PlatformChunkGenerator gen)) throw new IllegalStateException("Generator is not platform chunk generator!");