Skip to content

Commit

Permalink
Fix data generation for custom dynamic registry (#3216)
Browse files Browse the repository at this point in the history
* 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 <[email protected]>
  • Loading branch information
2 people authored and Su5eD committed Jul 27, 2023
1 parent 2a0bf6d commit 04fbe96
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 1 deletion.
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@

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,
Expand Down Expand Up @@ -220,7 +221,9 @@ public CompletableFuture<?> run(DataWriter writer) {

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()) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,13 @@

package net.fabricmc.fabric.test.datagen;

import com.mojang.serialization.Codec;
import com.mojang.serialization.codecs.RecordCodecBuilder;

import net.minecraft.registry.Registry;
import net.minecraft.registry.RegistryKey;
import net.minecraft.util.Identifier;

import net.minecraftforge.eventbus.api.IEventBus;
import net.minecraftforge.fml.common.Mod;
import net.minecraftforge.fml.javafmlmod.FMLJavaModLoadingContext;
Expand All @@ -34,6 +41,7 @@
import net.minecraft.registry.RegistryKeys;
import net.minecraft.text.Text;

import net.fabricmc.fabric.api.event.registry.DynamicRegistries;
import net.fabricmc.fabric.api.itemgroup.v1.FabricItemGroup;
import net.fabricmc.fabric.api.itemgroup.v1.ItemGroupEvents;

Expand All @@ -56,6 +64,13 @@ public class DataGeneratorTestContent {
.displayName(Text.translatable("fabric-data-gen-api-v1-testmod.simple_item_group"))
.build());

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")
);

public DataGeneratorTestContent() {
IEventBus bus = FMLJavaModLoadingContext.get().getModEventBus();
BLOCKS.register(bus);
Expand All @@ -64,6 +79,8 @@ public DataGeneratorTestContent() {
bus.addListener(DataGeneratorTestEntrypoint::onGatherData);

ItemGroupEvents.modifyEntriesEvent(SIMPLE_ITEM_GROUP.getKey()).register(entries -> entries.add(SIMPLE_BLOCK.get()));

DynamicRegistries.register(TEST_DATAGEN_DYNAMIC_REGISTRY_KEY, TestDatagenObject.CODEC);
}

private static RegistryObject<Block> register(String name, boolean hasItem, AbstractBlock.Settings settings) {
Expand All @@ -73,4 +90,10 @@ private static RegistryObject<Block> register(String name, boolean hasItem, Abst
}
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));
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -20,11 +20,13 @@

import java.io.IOException;
import java.nio.file.Path;
import java.util.Set;
import java.util.concurrent.CompletableFuture;
import java.util.function.BiConsumer;
import java.util.function.Consumer;

import net.minecraftforge.api.distmarker.Dist;
import net.minecraftforge.common.data.DatapackBuiltinEntriesProvider;
import net.minecraftforge.data.event.GatherDataEvent;
import net.minecraftforge.fml.loading.FMLLoader;

Expand All @@ -48,6 +50,8 @@
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;
Expand All @@ -62,6 +66,7 @@
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;
Expand All @@ -88,6 +93,10 @@ public static void onGatherData(GatherDataEvent event) {
pack.addProvider(ExistingEnglishLangProvider::new);
pack.addProvider(JapaneseLangProvider::new);

final RegistryBuilder builder = new RegistryBuilder().addRegistry(TEST_DATAGEN_DYNAMIC_REGISTRY_KEY, DataGeneratorTestEntrypoint::bootstrapTestDatagenRegistry);
DatapackBuiltinEntriesProvider builtinEntries = pack.addProvider((output, registries) -> new DatapackBuiltinEntriesProvider(event.getGenerator().output, registries, builder, Set.of(MOD_ID)));
pack.addProvider((output, registries) -> new TestDynamicRegistryProvider(output, builtinEntries.getRegistryProvider()));

TestBlockTagProvider blockTagProvider = pack.addProvider(TestBlockTagProvider::new);
pack.addProvider((output, registries) -> new TestItemTagProvider(output, registries, blockTagProvider));
pack.addProvider(TestBiomeTagProvider::new);
Expand All @@ -98,6 +107,10 @@ public static void onGatherData(GatherDataEvent event) {
}
}

private static 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);
Expand Down Expand Up @@ -344,4 +357,24 @@ public void accept(BiConsumer<Identifier, LootTable.Builder> consumer) {
);
}
}

/**
* 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";
}
}
}

0 comments on commit 04fbe96

Please sign in to comment.