From 57b4bf6fe9c5b360b07cb7eb98e4276f3e358c96 Mon Sep 17 00:00:00 2001 From: kermandev <46640204+kermandev@users.noreply.github.com> Date: Mon, 14 Sep 2026 19:32:14 -0500 Subject: [PATCH 1/2] feat: Update to 26.3-rc-3 Improves some logic too with autoclose, and fixes some weird issues. Drops blocksMotion and solidBlocking (same thing) as we move towards the blocks_motion tag in Minestom --- .../net/minestom/datagen/DataGenType.java | 6 ++++- .../net/minestom/datagen/DataGenerator.java | 18 +++++++------ .../minestom/generators/BlockGenerator.java | 2 -- .../GeneratedResourceGenerator.java | 22 ++++++++++++++++ .../generators/GenericResourceGenerator.java | 8 +++--- .../generators/MaterialGenerator.java | 2 +- .../net/minestom/utils/ResourceUtils.java | 26 ++++++++++--------- gradle/libs.versions.toml | 2 +- 8 files changed, 58 insertions(+), 28 deletions(-) create mode 100644 DataGenerator/src/main/java/net/minestom/generators/GeneratedResourceGenerator.java diff --git a/DataGenerator/src/main/java/net/minestom/datagen/DataGenType.java b/DataGenerator/src/main/java/net/minestom/datagen/DataGenType.java index 95faba6..4000e4f 100644 --- a/DataGenerator/src/main/java/net/minestom/datagen/DataGenType.java +++ b/DataGenerator/src/main/java/net/minestom/datagen/DataGenType.java @@ -50,6 +50,8 @@ public enum DataGenType { BANNER_PATTERNS("banner_pattern", new GenericResourceGenerator("banner_pattern")), BIOMES("worldgen/biome", new GenericResourceGenerator("worldgen/biome")), + BLOCK_STATE_PROVIDERS("worldgen/block_state_provider", new GenericResourceGenerator("worldgen/block_state_provider")), + BLOCK_TRANSFORMERS("block_transformer", new GenericResourceGenerator("block_transformer")), CAT_VARIANTS("cat_variant", new GenericResourceGenerator("cat_variant")), CAT_SOUND_VARIANTS("cat_sound_variant", new GenericResourceGenerator("cat_sound_variant")), CHAT_TYPES("chat_type", new GenericResourceGenerator("chat_type")), @@ -58,6 +60,7 @@ public enum DataGenType { COW_VARIANTS("cow_variant", new GenericResourceGenerator("cow_variant")), COW_SOUND_VARIANTS("cow_sound_variant", new GenericResourceGenerator("cow_sound_variant")), DAMAGE_TYPES("damage_type", new GenericResourceGenerator("damage_type")), + DECORATED_POT_PATTERNS("decorated_pot_pattern", new GenericResourceGenerator("decorated_pot_pattern")), DIALOGS("dialog", new GenericResourceGenerator("dialog")), DIMENSION_TYPES("dimension_type", new GenericResourceGenerator("dimension_type")), ENCHANTMENTS("enchantment", new GenericResourceGenerator("enchantment")), @@ -67,6 +70,7 @@ public enum DataGenType { PAINTING_VARIANTS("painting_variant", new GenericResourceGenerator("painting_variant")), PIG_VARIANTS("pig_variant", new GenericResourceGenerator("pig_variant")), PIG_SOUND_VARIANTS("pig_sound_variant", new GenericResourceGenerator("pig_sound_variant")), + PREDICATES("predicate", new GeneratedResourceGenerator("predicate")), SULFUR_CUBE_ARCHETYPE("sulfur_cube_archetype", new GenericResourceGenerator("sulfur_cube_archetype")), TIMELINE("timeline", new GenericResourceGenerator("timeline")), TRIM_MATERIALS("trim_material", new GenericResourceGenerator("trim_material")), @@ -98,4 +102,4 @@ public String getFileName() { public DataGenerator getGenerator() { return generator; } -} \ No newline at end of file +} diff --git a/DataGenerator/src/main/java/net/minestom/datagen/DataGenerator.java b/DataGenerator/src/main/java/net/minestom/datagen/DataGenerator.java index 024a414..fc8e5d4 100644 --- a/DataGenerator/src/main/java/net/minestom/datagen/DataGenerator.java +++ b/DataGenerator/src/main/java/net/minestom/datagen/DataGenerator.java @@ -1,5 +1,6 @@ package net.minestom.datagen; +import com.google.gson.JsonElement; import com.google.gson.JsonObject; import com.google.gson.stream.JsonReader; import net.minecraft.SharedConstants; @@ -10,6 +11,7 @@ import java.io.File; import java.io.IOException; +import java.io.UncheckedIOException; import java.nio.file.Files; import java.nio.file.Path; @@ -55,22 +57,22 @@ protected void addDefaultable(JsonObject jsonObject, String key, double value, d protected JsonObject mergePath(Path directory) { final JsonObject result = new JsonObject(); - try { - Files.walk(directory).filter(Files::isRegularFile) + try (var paths = Files.walk(directory)) { + paths.filter(Files::isRegularFile) .forEach(path -> { - try { - JsonObject blockLootTable = DataGen.GSON.fromJson(new JsonReader(Files.newBufferedReader(path)), JsonObject.class); + try (var reader = Files.newBufferedReader(path); + var jsonReader = new JsonReader(reader)) { + JsonElement value = DataGen.GSON.fromJson(jsonReader, JsonElement.class); final String fileName = directory.relativize(path).toString(); final String tableName = (File.separatorChar == '\\' ? fileName.replace('\\', '/') : fileName) .replace(".json", ""); - result.add("minecraft:" + tableName, blockLootTable); + result.add("minecraft:" + tableName, value); } catch (IOException e) { - LOGGER.error("Failed to read block loot table located at '" + path + "'.", e); - e.printStackTrace(); + throw new UncheckedIOException("Failed to read generated resource '" + path + "'", e); } }); } catch (IOException e) { - e.printStackTrace(); + throw new UncheckedIOException("Failed to read generated resource directory '" + directory + "'", e); } return result; } diff --git a/DataGenerator/src/main/java/net/minestom/generators/BlockGenerator.java b/DataGenerator/src/main/java/net/minestom/generators/BlockGenerator.java index 39b90bd..35f8b6c 100644 --- a/DataGenerator/src/main/java/net/minestom/generators/BlockGenerator.java +++ b/DataGenerator/src/main/java/net/minestom/generators/BlockGenerator.java @@ -148,14 +148,12 @@ private void writeState(Identifier location, Block block, Map appendState(blockJson, state, "occludes", blockState.canOcclude(), boolean.class); appendState(blockJson, state, "requiresTool", blockState.requiresCorrectToolForDrops(), boolean.class); - appendState(blockJson, state, "blocksMotion", blockState.blocksMotion(), boolean.class); appendState(blockJson, state, "flammable", isFlammable(blockState), boolean.class); appendState(blockJson, state, "air", blockState.isAir(), false, boolean.class); appendState(blockJson, state, "liquid", blockState.liquid(), false, boolean.class); appendState(blockJson, state, "fluid", !blockState.getFluidState().isEmpty(), false, boolean.class); appendState(blockJson, state, "replaceable", blockState.canBeReplaced(), false, boolean.class); appendState(blockJson, state, "solid", blockState.isSolid(), boolean.class); - appendState(blockJson, state, "solidBlocking", blockState.blocksMotion(), boolean.class); appendState(blockJson, state, "lightBlock", blockState.getLightDampening(), int.class); // Sounds SoundType soundType = blockState.getSoundType(); diff --git a/DataGenerator/src/main/java/net/minestom/generators/GeneratedResourceGenerator.java b/DataGenerator/src/main/java/net/minestom/generators/GeneratedResourceGenerator.java new file mode 100644 index 0000000..b78ed40 --- /dev/null +++ b/DataGenerator/src/main/java/net/minestom/generators/GeneratedResourceGenerator.java @@ -0,0 +1,22 @@ +package net.minestom.generators; + +import com.google.gson.JsonObject; +import net.minestom.datagen.DataGenerator; +import org.jetbrains.annotations.NotNull; + +public final class GeneratedResourceGenerator extends DataGenerator { + private final String name; + + public GeneratedResourceGenerator(@NotNull String name) { + this.name = name; + } + + @Override + public JsonObject generate() { + var result = mergePath(DATA_FOLDER.resolve(name)); + if (result.isEmpty()) { + throw new IllegalStateException("Generated resource directory is empty: " + name); + } + return result; + } +} diff --git a/DataGenerator/src/main/java/net/minestom/generators/GenericResourceGenerator.java b/DataGenerator/src/main/java/net/minestom/generators/GenericResourceGenerator.java index 564b676..fcf972a 100644 --- a/DataGenerator/src/main/java/net/minestom/generators/GenericResourceGenerator.java +++ b/DataGenerator/src/main/java/net/minestom/generators/GenericResourceGenerator.java @@ -57,10 +57,12 @@ public Object generate() throws Exception { // only collect valid files if (content.length() > 0 && fileName.endsWith(".json")) { var key = "minecraft:" + fileName.substring(0, fileName.length() - 5); - var jsonObject = gson.fromJson(content.toString(), JsonObject.class); - exclusions.forEach(jsonObject::remove); + var json = gson.fromJson(content.toString(), JsonElement.class); + if (json instanceof JsonObject jsonObject) { + exclusions.forEach(jsonObject::remove); + } - result.add(key, jsonObject); + result.add(key, json); } } diff --git a/DataGenerator/src/main/java/net/minestom/generators/MaterialGenerator.java b/DataGenerator/src/main/java/net/minestom/generators/MaterialGenerator.java index aeaabbb..bcf31dc 100644 --- a/DataGenerator/src/main/java/net/minestom/generators/MaterialGenerator.java +++ b/DataGenerator/src/main/java/net/minestom/generators/MaterialGenerator.java @@ -65,7 +65,7 @@ public JsonObject generate() { } private static HolderLookup.Provider applyPendingComponents() { - HolderLookup.Provider lookup = VanillaRegistries.createLookup(); + HolderLookup.Provider lookup = VanillaRegistries.createWorldLookup(); var registry = BuiltInRegistries.DATA_COMPONENT_INITIALIZERS.build(lookup); registry.forEach(DataComponentInitializers.PendingComponents::apply); return lookup; diff --git a/DataGenerator/src/main/java/net/minestom/utils/ResourceUtils.java b/DataGenerator/src/main/java/net/minestom/utils/ResourceUtils.java index ffeb7c0..fb4f6ee 100644 --- a/DataGenerator/src/main/java/net/minestom/utils/ResourceUtils.java +++ b/DataGenerator/src/main/java/net/minestom/utils/ResourceUtils.java @@ -1,10 +1,11 @@ package net.minestom.utils; -import java.io.File; import java.io.IOException; import java.net.URISyntaxException; import java.net.URLDecoder; import java.nio.charset.StandardCharsets; +import java.nio.file.Files; +import java.nio.file.Path; import java.util.HashSet; import java.util.jar.JarFile; @@ -16,16 +17,22 @@ private ResourceUtils() {} * Get a resource listing from within a jar file * @param clazz The class to use the {@link ClassLoader} of * @param path The path within the classpath to list resources from - * @return An array containing all the path of all resources within the specified directory + * @return An array containing the path of all resources within the specified directory, + * relative to it and including any nested directories * @throws URISyntaxException * @throws IOException */ public static String[] getResourceListing(Class clazz, String path) throws URISyntaxException, IOException { var dirURL = clazz.getClassLoader().getResource(path); - // list use File#list in case path is just a regular file + // walk the directory in case path is just a regular file if (dirURL != null && dirURL.getProtocol().equals("file")) { - return new File(dirURL.toURI()).list(); + var root = Path.of(dirURL.toURI()); + try (var files = Files.walk(root)) { + return files.filter(Files::isRegularFile) + .map(file -> root.relativize(file).toString()) + .toArray(String[]::new); + } } if (dirURL == null) { @@ -43,17 +50,12 @@ public static String[] getResourceListing(Class clazz, String path) throws URISy try (var jar = new JarFile(URLDecoder.decode(jarPath, StandardCharsets.UTF_8))) { // get all files within the jar var entries = jar.entries(); - var result = new HashSet<>(); + var result = new HashSet(); while(entries.hasMoreElements()) { var name = entries.nextElement().getName(); - if (name.startsWith(path)) { - var entry = name.substring(path.length()); - int checkSubdir = entry.indexOf("/"); - if (checkSubdir >= 0) { - entry = entry.substring(0, checkSubdir); - } - result.add(entry); + if (name.startsWith(path) && !name.endsWith("/")) { + result.add(name.substring(path.length())); } } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 41a9ce3..d88deae 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -2,7 +2,7 @@ metadata.format.version = "1.1" [versions] gson = "2.14.0" -minecraft = "26.2" +minecraft = "26.3-rc-3" loom = "1.16-SNAPSHOT" nmcp = "1.6.2" From fb536d9f03788b57054a4285610eb9b8d2a967c9 Mon Sep 17 00:00:00 2001 From: kermandev <46640204+kermandev@users.noreply.github.com> Date: Tue, 15 Sep 2026 13:47:22 -0500 Subject: [PATCH 2/2] 26.3 release --- gradle/libs.versions.toml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index d88deae..9e1bd70 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -2,7 +2,7 @@ metadata.format.version = "1.1" [versions] gson = "2.14.0" -minecraft = "26.3-rc-3" +minecraft = "26.3" loom = "1.16-SNAPSHOT" nmcp = "1.6.2"