From 1e61dba1a0d7eb484397e452b3a118db934d0f3a Mon Sep 17 00:00:00 2001 From: apple502j <33279053+apple502j@users.noreply.github.com> Date: Tue, 25 Jul 2023 22:21:33 +0900 Subject: [PATCH] Fix data generation for custom dynamic registry (#3216) * Fix datagen for custom dynamic registry * Test datagen for custom dynamic registry * Check if the dynamic registry is registered with Fabric API * Cleanup testmod * Don't apply to registries not added using the fabric api. --------- Co-authored-by: modmuss50 <modmuss50@gmail.com> --- .../FabricDynamicRegistryProvider.java | 5 ++- .../datagen/DataGeneratorTestContent.java | 19 ++++++++++ .../datagen/DataGeneratorTestEntrypoint.java | 38 +++++++++++++++++++ 3 files changed, 61 insertions(+), 1 deletion(-) diff --git a/fabric-data-generation-api-v1/src/main/java/net/fabricmc/fabric/api/datagen/v1/provider/FabricDynamicRegistryProvider.java b/fabric-data-generation-api-v1/src/main/java/net/fabricmc/fabric/api/datagen/v1/provider/FabricDynamicRegistryProvider.java index 08c510757..f64f1ea83 100644 --- a/fabric-data-generation-api-v1/src/main/java/net/fabricmc/fabric/api/datagen/v1/provider/FabricDynamicRegistryProvider.java +++ b/fabric-data-generation-api-v1/src/main/java/net/fabricmc/fabric/api/datagen/v1/provider/FabricDynamicRegistryProvider.java @@ -52,6 +52,7 @@ import net.minecraft.world.gen.feature.PlacedFeature; import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput; import net.fabricmc.fabric.api.event.registry.DynamicRegistries; +import net.fabricmc.fabric.impl.registry.sync.DynamicRegistriesImpl; /** * A provider to help with data-generation of dynamic registry objects, @@ -220,7 +221,9 @@ public abstract class FabricDynamicRegistryProvider implements DataProvider { private <T> CompletableFuture<?> writeRegistryEntries(DataWriter writer, RegistryOps<JsonElement> ops, RegistryEntries<T> entries) { final RegistryKey<? extends Registry<T>> registry = entries.registry; - final DataOutput.PathResolver pathResolver = output.getResolver(DataOutput.OutputType.DATA_PACK, registry.getValue().getPath()); + final boolean shouldOmitNamespace = registry.getValue().getNamespace().equals(Identifier.DEFAULT_NAMESPACE) || !DynamicRegistriesImpl.FABRIC_DYNAMIC_REGISTRY_KEYS.contains(registry); + final String directoryName = shouldOmitNamespace ? registry.getValue().getPath() : registry.getValue().getNamespace() + "/" + registry.getValue().getPath(); + final DataOutput.PathResolver pathResolver = output.getResolver(DataOutput.OutputType.DATA_PACK, directoryName); final List<CompletableFuture<?>> futures = new ArrayList<>(); for (Map.Entry<RegistryKey<T>, T> entry : entries.entries.entrySet()) { diff --git a/fabric-data-generation-api-v1/src/testmod/java/net/fabricmc/fabric/test/datagen/DataGeneratorTestContent.java b/fabric-data-generation-api-v1/src/testmod/java/net/fabricmc/fabric/test/datagen/DataGeneratorTestContent.java index 0edda4431..f48369883 100644 --- a/fabric-data-generation-api-v1/src/testmod/java/net/fabricmc/fabric/test/datagen/DataGeneratorTestContent.java +++ b/fabric-data-generation-api-v1/src/testmod/java/net/fabricmc/fabric/test/datagen/DataGeneratorTestContent.java @@ -16,6 +16,9 @@ package net.fabricmc.fabric.test.datagen; +import com.mojang.serialization.Codec; +import com.mojang.serialization.codecs.RecordCodecBuilder; + import net.minecraft.block.AbstractBlock; import net.minecraft.block.Block; import net.minecraft.block.Blocks; @@ -32,6 +35,7 @@ import net.minecraft.text.Text; import net.minecraft.util.Identifier; import net.fabricmc.api.ModInitializer; +import net.fabricmc.fabric.api.event.registry.DynamicRegistries; import net.fabricmc.fabric.api.itemgroup.v1.FabricItemGroup; import net.fabricmc.fabric.api.itemgroup.v1.ItemGroupEvents; @@ -46,6 +50,13 @@ public class DataGeneratorTestContent implements ModInitializer { public static final RegistryKey<ItemGroup> SIMPLE_ITEM_GROUP = RegistryKey.of(RegistryKeys.ITEM_GROUP, new Identifier(MOD_ID, "simple")); + public static final RegistryKey<Registry<TestDatagenObject>> TEST_DATAGEN_DYNAMIC_REGISTRY_KEY = + RegistryKey.ofRegistry(new Identifier("fabric", "test_datagen_dynamic")); + public static final RegistryKey<TestDatagenObject> TEST_DYNAMIC_REGISTRY_ITEM_KEY = RegistryKey.of( + TEST_DATAGEN_DYNAMIC_REGISTRY_KEY, + new Identifier(MOD_ID, "tiny_potato") + ); + @Override public void onInitialize() { SIMPLE_BLOCK = createBlock("simple_block", true, AbstractBlock.Settings.create()); @@ -60,6 +71,8 @@ public class DataGeneratorTestContent implements ModInitializer { .icon(() -> new ItemStack(Items.DIAMOND_PICKAXE)) .displayName(Text.translatable("fabric-data-gen-api-v1-testmod.simple_item_group")) .build()); + + DynamicRegistries.register(TEST_DATAGEN_DYNAMIC_REGISTRY_KEY, TestDatagenObject.CODEC); } private static Block createBlock(String name, boolean hasItem, AbstractBlock.Settings settings) { @@ -72,4 +85,10 @@ public class DataGeneratorTestContent implements ModInitializer { return block; } + + public record TestDatagenObject(String value) { + public static final Codec<TestDatagenObject> CODEC = RecordCodecBuilder.create(instance -> instance.group( + Codec.STRING.fieldOf("value").forGetter(TestDatagenObject::value) + ).apply(instance, TestDatagenObject::new)); + } } diff --git a/fabric-data-generation-api-v1/src/testmod/java/net/fabricmc/fabric/test/datagen/DataGeneratorTestEntrypoint.java b/fabric-data-generation-api-v1/src/testmod/java/net/fabricmc/fabric/test/datagen/DataGeneratorTestEntrypoint.java index e99066128..3254b60d7 100644 --- a/fabric-data-generation-api-v1/src/testmod/java/net/fabricmc/fabric/test/datagen/DataGeneratorTestEntrypoint.java +++ b/fabric-data-generation-api-v1/src/testmod/java/net/fabricmc/fabric/test/datagen/DataGeneratorTestEntrypoint.java @@ -23,6 +23,8 @@ import static net.fabricmc.fabric.test.datagen.DataGeneratorTestContent.BLOCK_WI import static net.fabricmc.fabric.test.datagen.DataGeneratorTestContent.MOD_ID; import static net.fabricmc.fabric.test.datagen.DataGeneratorTestContent.SIMPLE_BLOCK; import static net.fabricmc.fabric.test.datagen.DataGeneratorTestContent.SIMPLE_ITEM_GROUP; +import static net.fabricmc.fabric.test.datagen.DataGeneratorTestContent.TEST_DATAGEN_DYNAMIC_REGISTRY_KEY; +import static net.fabricmc.fabric.test.datagen.DataGeneratorTestContent.TEST_DYNAMIC_REGISTRY_ITEM_KEY; import java.io.IOException; import java.lang.reflect.InvocationTargetException; @@ -55,6 +57,8 @@ import net.minecraft.loot.entry.ItemEntry; import net.minecraft.loot.provider.number.ConstantLootNumberProvider; import net.minecraft.recipe.Ingredient; import net.minecraft.recipe.book.RecipeCategory; +import net.minecraft.registry.Registerable; +import net.minecraft.registry.RegistryBuilder; import net.minecraft.registry.RegistryKeys; import net.minecraft.registry.RegistryWrapper; import net.minecraft.registry.tag.BlockTags; @@ -71,6 +75,7 @@ import net.fabricmc.fabric.api.datagen.v1.FabricDataGenerator; import net.fabricmc.fabric.api.datagen.v1.FabricDataOutput; import net.fabricmc.fabric.api.datagen.v1.provider.FabricAdvancementProvider; import net.fabricmc.fabric.api.datagen.v1.provider.FabricBlockLootTableProvider; +import net.fabricmc.fabric.api.datagen.v1.provider.FabricDynamicRegistryProvider; import net.fabricmc.fabric.api.datagen.v1.provider.FabricLanguageProvider; import net.fabricmc.fabric.api.datagen.v1.provider.FabricModelProvider; import net.fabricmc.fabric.api.datagen.v1.provider.FabricRecipeProvider; @@ -97,6 +102,7 @@ public class DataGeneratorTestEntrypoint implements DataGeneratorEntrypoint { pack.addProvider(TestBarterLootTableProvider::new); pack.addProvider(ExistingEnglishLangProvider::new); pack.addProvider(JapaneseLangProvider::new); + pack.addProvider(TestDynamicRegistryProvider::new); TestBlockTagProvider blockTagProvider = pack.addProvider(TestBlockTagProvider::new); pack.addProvider((output, registries) -> new TestItemTagProvider(output, registries, blockTagProvider)); @@ -114,6 +120,18 @@ public class DataGeneratorTestEntrypoint implements DataGeneratorEntrypoint { } } + @Override + public void buildRegistry(RegistryBuilder registryBuilder) { + registryBuilder.addRegistry( + TEST_DATAGEN_DYNAMIC_REGISTRY_KEY, + this::bootstrapTestDatagenRegistry + ); + } + + private void bootstrapTestDatagenRegistry(Registerable<DataGeneratorTestContent.TestDatagenObject> registerable) { + registerable.register(TEST_DYNAMIC_REGISTRY_ITEM_KEY, new DataGeneratorTestContent.TestDatagenObject(":tiny_potato:")); + } + private static class TestRecipeProvider extends FabricRecipeProvider { private TestRecipeProvider(FabricDataOutput output) { super(output); @@ -364,4 +382,24 @@ public class DataGeneratorTestEntrypoint implements DataGeneratorEntrypoint { ); } } + + /** + * Tests generating files for a custom dynamic registry. + * Note that Biome API testmod provides the test for vanilla dynamic registries. + */ + private static class TestDynamicRegistryProvider extends FabricDynamicRegistryProvider { + TestDynamicRegistryProvider(FabricDataOutput output, CompletableFuture<RegistryWrapper.WrapperLookup> registriesFuture) { + super(output, registriesFuture); + } + + @Override + protected void configure(RegistryWrapper.WrapperLookup registries, Entries entries) { + entries.add(registries.getWrapperOrThrow(TEST_DATAGEN_DYNAMIC_REGISTRY_KEY), TEST_DYNAMIC_REGISTRY_ITEM_KEY); + } + + @Override + public String getName() { + return "Test Dynamic Registry"; + } + } }