diff --git a/DataGenerator/build.gradle.kts b/DataGenerator/build.gradle.kts index 4782c6a..03af87a 100644 --- a/DataGenerator/build.gradle.kts +++ b/DataGenerator/build.gradle.kts @@ -18,6 +18,10 @@ application { mainClass.set("net.minestom.datagen.DataGen") } +tasks.run { + args = arrayListOf(rootDir.resolve("src/main/resources/net/minestom/data").absolutePath) +} + java { sourceCompatibility = JavaVersion.VERSION_25 targetCompatibility = JavaVersion.VERSION_25 diff --git a/DataGenerator/src/main/java/net/minestom/datagen/DataGenType.java b/DataGenerator/src/main/java/net/minestom/datagen/DataGenType.java index ed92ea6..8b90be1 100644 --- a/DataGenerator/src/main/java/net/minestom/datagen/DataGenType.java +++ b/DataGenerator/src/main/java/net/minestom/datagen/DataGenType.java @@ -1,6 +1,7 @@ package net.minestom.datagen; import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.world.clock.ClockTimeMarkers; import net.minestom.generators.*; import net.minestom.generators.loot_tables.BlockLootTableGenerator; import net.minestom.generators.loot_tables.ChestLootTableGenerator; @@ -27,6 +28,8 @@ public enum DataGenType { SOUND_SOURCES("sound_sources", new SoundSourceGenerator()), VILLAGER_TYPES("villager_types", new GenericRegistryArrayGenerator<>(BuiltInRegistries.VILLAGER_TYPE)), BLOCK_ENTITY_TYPES("block_entity_types", new GenericRegistryObjectGenerator<>(BuiltInRegistries.BLOCK_ENTITY_TYPE)), + CLOCK_TIME_MARKERS("clock_time_marker", new ClockTimeMarkerGenerator()), + GAME_RULES("game_rule", new GameRuleGenerator()), // Static registries @@ -48,9 +51,12 @@ public enum DataGenType { BANNER_PATTERNS("banner_pattern", new GenericResourceGenerator("banner_pattern")), BIOMES("worldgen/biome", new GenericResourceGenerator("worldgen/biome")), 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")), CHICKEN_VARIANTS("chicken_variant", new GenericResourceGenerator("chicken_variant")), + CHICKEN_SOUND_VARIANTS("chicken_sound_variant", new GenericResourceGenerator("chicken_sound_variant")), 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")), DIALOGS("dialog", new GenericResourceGenerator("dialog")), DIMENSION_TYPES("dimension_type", new GenericResourceGenerator("dimension_type")), @@ -60,12 +66,14 @@ public enum DataGenType { INSTRUMENTS("instrument", new GenericResourceGenerator("instrument")), 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")), TIMELINE("timeline", new GenericResourceGenerator("timeline")), TRIM_MATERIALS("trim_material", new GenericResourceGenerator("trim_material")), TRIM_PATTERNS("trim_pattern", new GenericResourceGenerator("trim_pattern")), WOLF_VARIANTS("wolf_variant", new GenericResourceGenerator("wolf_variant")), WOLF_SOUND_VARIANTS("wolf_sound_variant", new GenericResourceGenerator("wolf_sound_variant")), ZOMBIE_NAUTILUS_VARIANTS("zombie_nautilus_variant", new GenericResourceGenerator("zombie_nautilus_variant")), + WORLD_CLOCKS("world_clock", new GenericResourceGenerator("world_clock")), // Loot tables (only included for legacy reasons, Minestom doesn't use them) diff --git a/DataGenerator/src/main/java/net/minestom/generators/BannerPatternGenerator.java b/DataGenerator/src/main/java/net/minestom/generators/BannerPatternGenerator.java deleted file mode 100644 index aff8277..0000000 --- a/DataGenerator/src/main/java/net/minestom/generators/BannerPatternGenerator.java +++ /dev/null @@ -1,25 +0,0 @@ -package net.minestom.generators; - -import com.google.gson.JsonElement; -import com.google.gson.JsonObject; -import net.minecraft.core.registries.BuiltInRegistries; -import net.minecraft.world.level.block.entity.BannerPattern; -import net.minestom.datagen.DataGenerator; - -public class BannerPatternGenerator extends DataGenerator { - - @Override - public JsonElement generate() throws Exception { - JsonObject patternTypes = new JsonObject(); - //todo do we need to generate anything here now that they are sent from the server? -// var registry = BuiltInRegistries.BANNER_PATTERN; -// for (BannerPattern bannerPattern : registry) { -// JsonObject pattern = new JsonObject(); -// pattern.addProperty("id", registry.getId(bannerPattern)); -// pattern.addProperty("identifier", bannerPattern.getHashname()); -// patternTypes.add(registry.getKey(bannerPattern).toString(), pattern); -// } - return patternTypes; - } - -} diff --git a/DataGenerator/src/main/java/net/minestom/generators/BlockGenerator.java b/DataGenerator/src/main/java/net/minestom/generators/BlockGenerator.java index 3d46a63..8c70431 100644 --- a/DataGenerator/src/main/java/net/minestom/generators/BlockGenerator.java +++ b/DataGenerator/src/main/java/net/minestom/generators/BlockGenerator.java @@ -20,6 +20,7 @@ import java.lang.reflect.Method; import java.lang.reflect.Modifier; import java.util.*; +import java.util.stream.Collectors; public final class BlockGenerator extends DataGenerator { @Override @@ -82,18 +83,12 @@ public JsonObject generate() { state.addProperty("stateId", Block.BLOCK_STATE_REGISTRY.getId(bs)); writeState(location, block, blockSoundTypes, bs, blockJson, state); - StringBuilder stateName = new StringBuilder("["); - for (var propertyEntry : bs.getValues().entrySet()) { - if (stateName.length() > 1) { - stateName.append(","); - } - stateName.append(propertyEntry.getKey().getName().toLowerCase(Locale.ROOT)) - .append("=") - .append(propertyEntry.getValue().toString().toLowerCase(Locale.ROOT)); - } - stateName.append("]"); + //[property=value,property2=value2,...] + String stateName = bs.getValues() + .map(v -> v.toString().toLowerCase(Locale.ROOT)) + .collect(Collectors.joining(",", "[", "]")); - blockStates.add(stateName.toString(), state); + blockStates.add(stateName, state); } blockJson.add("states", blockStates); blocks.add(location.toString(), blockJson); diff --git a/DataGenerator/src/main/java/net/minestom/generators/ClockTimeMarkerGenerator.java b/DataGenerator/src/main/java/net/minestom/generators/ClockTimeMarkerGenerator.java new file mode 100644 index 0000000..d3afc36 --- /dev/null +++ b/DataGenerator/src/main/java/net/minestom/generators/ClockTimeMarkerGenerator.java @@ -0,0 +1,26 @@ +package net.minestom.generators; + +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.clock.ClockTimeMarker; +import net.minecraft.world.clock.ClockTimeMarkers; +import net.minestom.datagen.DataGenerator; + +import java.lang.reflect.Field; + +public class ClockTimeMarkerGenerator extends DataGenerator { + + @Override + @SuppressWarnings("unchecked") + public JsonElement generate() throws Exception { + JsonObject markers = new JsonObject(); + for (Field declaredField : ClockTimeMarkers.class.getDeclaredFields()) { + if (declaredField.getType() != ResourceKey.class) continue; + ResourceKey marker = (ResourceKey) declaredField.get(null); + // I'm expecting this to become a dynamic registry at some point. + markers.add(marker.identifier().toString(), new JsonObject()); + } + return markers; + } +} diff --git a/DataGenerator/src/main/java/net/minestom/generators/ComponentGenerator.java b/DataGenerator/src/main/java/net/minestom/generators/ComponentGenerator.java deleted file mode 100644 index e12b765..0000000 --- a/DataGenerator/src/main/java/net/minestom/generators/ComponentGenerator.java +++ /dev/null @@ -1,23 +0,0 @@ -package net.minestom.generators; - -import com.google.gson.JsonObject; -import net.minecraft.core.registries.BuiltInRegistries; -import net.minestom.datagen.DataGenerator; - -public class ComponentGenerator extends DataGenerator { - @Override - public JsonObject generate() throws Exception { - JsonObject result = new JsonObject(); - var registry = BuiltInRegistries.DATA_COMPONENT_TYPE; - for (var componentType : registry) { - var name = registry.getKey(componentType); - var id = registry.getId(componentType); - var componentJson = new JsonObject(); - componentJson.addProperty("id", id); - componentJson.addProperty("transient", componentType.isTransient()); - componentJson.addProperty("persistent", componentType.codec() != null); - result.add(name.toString(), componentJson); - } - return result; - } -} diff --git a/DataGenerator/src/main/java/net/minestom/generators/DimensionTypeGenerator.java b/DataGenerator/src/main/java/net/minestom/generators/DimensionTypeGenerator.java deleted file mode 100644 index e20f93d..0000000 --- a/DataGenerator/src/main/java/net/minestom/generators/DimensionTypeGenerator.java +++ /dev/null @@ -1,70 +0,0 @@ -package net.minestom.generators; - -import com.google.gson.Gson; -import com.google.gson.JsonObject; -import net.minestom.datagen.DataGenerator; -import net.minestom.utils.ResourceUtils; - -import java.io.IOException; -import java.net.URISyntaxException; -import java.util.HashMap; -import java.util.Map; -import java.util.Scanner; - -public final class DimensionTypeGenerator extends DataGenerator { - - private static final String DIMENSION_TYPES_DIR = "data/minecraft/dimension_type/"; - private static final Gson gson = new Gson(); - - @Override - public JsonObject generate() throws Exception { - var dimensionTypesJson = new JsonObject(); - var dimensionTypes = readDimensionTypes(); - for (var entry : dimensionTypes.entrySet()) { - dimensionTypesJson.add(entry.getKey(), entry.getValue()); - } - return dimensionTypesJson; - } - - private Map readDimensionTypes() throws URISyntaxException, IOException { - // get all files from the dimension types directory - var files = ResourceUtils.getResourceListing( - net.minecraft.server.MinecraftServer.class, DIMENSION_TYPES_DIR); - - Map dimensionTypesJson = new HashMap<>(); - for (String fileName : files) { - var file = net.minecraft.server.MinecraftServer.class - .getClassLoader() - .getResourceAsStream(DIMENSION_TYPES_DIR + fileName); - var scanner = new Scanner(file); - var content = new StringBuilder(); - while (scanner.hasNextLine()) { - content.append(scanner.nextLine()); - } - scanner.close(); - - // only collect valid dimension type files - if (content.length() > 0 && fileName.endsWith(".json")) { - var biomeKey = "minecraft:" + fileName.substring(0, fileName.length() - 5); - var json = gson.fromJson(content.toString(), JsonObject.class); - var dimensionType = new JsonObject(); - dimensionType.addProperty("bedWorks", json.get("bed_works").getAsBoolean()); - dimensionType.addProperty("coordinateScale", json.get("coordinate_scale").getAsDouble()); - dimensionType.addProperty("ceiling", json.get("has_ceiling").getAsBoolean()); - dimensionType.addProperty("fixedTime", json.has("fixed_time")); - dimensionType.addProperty("raids", json.get("has_raids").getAsBoolean()); - dimensionType.addProperty("skyLight", json.get("has_skylight").getAsBoolean()); - dimensionType.addProperty("piglinSafe", json.get("piglin_safe").getAsBoolean()); - dimensionType.addProperty("logicalHeight", json.get("logical_height").getAsInt()); - dimensionType.addProperty("natural", json.get("natural").getAsBoolean()); - dimensionType.addProperty("ultraWarm", json.get("ultrawarm").getAsBoolean()); - dimensionType.addProperty("respawnAnchorWorks", json.get("respawn_anchor_works").getAsBoolean()); - dimensionType.addProperty("minY", json.get("min_y").getAsInt()); - dimensionType.addProperty("height", json.get("height").getAsInt()); - dimensionTypesJson.put(biomeKey, dimensionType); - } - } - - return dimensionTypesJson; - } -} diff --git a/DataGenerator/src/main/java/net/minestom/generators/GameRuleGenerator.java b/DataGenerator/src/main/java/net/minestom/generators/GameRuleGenerator.java new file mode 100644 index 0000000..9d95678 --- /dev/null +++ b/DataGenerator/src/main/java/net/minestom/generators/GameRuleGenerator.java @@ -0,0 +1,28 @@ +package net.minestom.generators; + +import com.google.gson.JsonElement; +import com.google.gson.JsonObject; +import net.minecraft.core.registries.BuiltInRegistries; +import net.minecraft.core.registries.Registries; +import net.minecraft.resources.ResourceKey; +import net.minecraft.world.clock.ClockTimeMarker; +import net.minecraft.world.clock.ClockTimeMarkers; +import net.minestom.datagen.DataGenerator; + +import java.lang.reflect.Field; + +public class GameRuleGenerator extends DataGenerator { + + @Override + public JsonElement generate() throws Exception { + JsonObject markers = new JsonObject(); + for (var gameRule : BuiltInRegistries.GAME_RULE) { + var ruleJson = new JsonObject(); + ruleJson.addProperty("id", BuiltInRegistries.GAME_RULE.getId(gameRule)); + ruleJson.addProperty("default", String.valueOf(gameRule.defaultValue())); + ruleJson.addProperty("type", gameRule.gameRuleType().getSerializedName()); + markers.add(gameRule.getIdentifier().toShortString(), ruleJson); + } + return markers; + } +} diff --git a/build.gradle.kts b/build.gradle.kts index b37a093..d39bd7e 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -41,10 +41,7 @@ tasks.register("generateData") { logger.warn("The data may or may not be the intellectual property of Mojang Studios.") logger.warn("") - // Simplified by Sponge's VanillaGradle - dependsOn(project(":DataGenerator").tasks.getByName("run") { - args = arrayListOf(rootDir.resolve("src/main/resources/net/minestom/data").absolutePath) - }) + dependsOn(project(":DataGenerator").tasks.getByName("run")) } tasks.processResources.get().dependsOn("generateData") diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index c77b530..0dc7766 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -2,12 +2,12 @@ metadata.format.version = "1.1" [versions] gson = "2.13.2" -minecraft = "26.1-snapshot-11" +minecraft = "26.1" slf4j-api = "2.0.17" logback = "1.5.22" -loom = "1.14-SNAPSHOT" +loom = "1.15-SNAPSHOT" nmcp = "1.3.0" [libraries]