From 65e415cb4cb5fe9463751258a8b884ae4b9380bc Mon Sep 17 00:00:00 2001
From: modmuss50 <modmuss50@gmail.com>
Date: Sat, 26 Nov 2022 19:58:25 +0000
Subject: [PATCH] Add some useful helper methods to
 FabricDynamicRegistryProvider.Entries (#2692)

* Add some useful helper methods to FabricDynamicRegistryProvider.Entries

* Update fabric-data-generation-api-v1/src/main/java/net/fabricmc/fabric/api/datagen/v1/provider/FabricDynamicRegistryProvider.java

Co-authored-by: Juuz <6596629+Juuxel@users.noreply.github.com>

Co-authored-by: Juuz <6596629+Juuxel@users.noreply.github.com>
---
 .../fabric/test/biome/WorldgenProvider.java   | 13 +--------
 .../FabricDynamicRegistryProvider.java        | 29 +++++++++++++++++--
 2 files changed, 27 insertions(+), 15 deletions(-)

diff --git a/fabric-biome-api-v1/src/testmod/java/net/fabricmc/fabric/test/biome/WorldgenProvider.java b/fabric-biome-api-v1/src/testmod/java/net/fabricmc/fabric/test/biome/WorldgenProvider.java
index fb5c682a9..89d4a2198 100644
--- a/fabric-biome-api-v1/src/testmod/java/net/fabricmc/fabric/test/biome/WorldgenProvider.java
+++ b/fabric-biome-api-v1/src/testmod/java/net/fabricmc/fabric/test/biome/WorldgenProvider.java
@@ -19,7 +19,6 @@ package net.fabricmc.fabric.test.biome;
 import java.util.List;
 import java.util.concurrent.CompletableFuture;
 
-import net.minecraft.registry.RegistryKey;
 import net.minecraft.registry.RegistryKeys;
 import net.minecraft.registry.RegistryWrapper;
 import net.minecraft.registry.entry.RegistryEntry;
@@ -44,17 +43,7 @@ public class WorldgenProvider extends FabricDynamicRegistryProvider {
 	protected void configure(RegistryWrapper.WrapperLookup registries, Entries entries) {
 		final RegistryWrapper.Impl<Biome> biomeRegistry = registries.getWrapperOrThrow(RegistryKeys.BIOME);
 
-		List<RegistryKey<Biome>> allBiomes = List.of(
-				TestBiomes.TEST_CRIMSON_FOREST,
-				TestBiomes.CUSTOM_PLAINS,
-				TestBiomes.TEST_END_HIGHLANDS,
-				TestBiomes.TEST_END_MIDLANDS,
-				TestBiomes.TEST_END_BARRRENS
-		);
-
-		for (RegistryKey<Biome> biomeRegistryKey : allBiomes) {
-			entries.add(biomeRegistryKey, biomeRegistry.getOrThrow(biomeRegistryKey).value());
-		}
+		entries.addAll(biomeRegistry);
 
 		ConfiguredFeature<?, ?> COMMON_DESERT_WELL = new ConfiguredFeature<>(Feature.DESERT_WELL, DefaultFeatureConfig.INSTANCE);
 
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 efe604305..71588502d 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
@@ -74,15 +74,17 @@ public abstract class FabricDynamicRegistryProvider implements DataProvider {
 		private final RegistryWrapper.WrapperLookup registries;
 		// Registry ID -> Entries for that registry
 		private final Map<Identifier, RegistryEntries<?>> queuedEntries;
+		private final String modId;
 
 		@ApiStatus.Internal
-		Entries(RegistryWrapper.WrapperLookup registries) {
+		Entries(RegistryWrapper.WrapperLookup registries, String modId) {
 			this.registries = registries;
 			this.queuedEntries = RegistryLoader.DYNAMIC_REGISTRIES.stream()
 					.collect(Collectors.toMap(
 							e -> e.key().getValue(),
 							e -> RegistryEntries.create(registries, e)
 					));
+			this.modId = modId;
 		}
 
 		/**
@@ -122,12 +124,33 @@ public abstract class FabricDynamicRegistryProvider implements DataProvider {
 		}
 
 		/**
-		 * Adds a new object to be data generated and returns a reference to it for use in other objects.
+		 * Adds a new object to be data generated.
+		 *
+		 * @return a reference to it for use in other objects.
 		 */
 		public <T> RegistryEntry<T> add(RegistryKey<T> registry, T object) {
 			return getQueuedEntries(registry).add(registry.getValue(), object);
 		}
 
+		/**
+		 * Adds a new {@link RegistryKey} from a given {@link RegistryWrapper.Impl} to be data generated.
+		 *
+		 * @return a reference to it for use in other objects.
+		 */
+		public <T> RegistryEntry<T> add(RegistryWrapper.Impl<T> registry, RegistryKey<T> valueKey) {
+			return add(valueKey, registry.getOrThrow(valueKey).value());
+		}
+
+		/**
+		 * All the registry entries whose namespace matches the current effective mod ID will be data generated.
+		 */
+		public <T> List<RegistryEntry<T>> addAll(RegistryWrapper.Impl<T> registry) {
+			return registry.streamKeys()
+					.filter(registryKey -> registryKey.getValue().getNamespace().equals(modId))
+					.map(key -> add(registry, key))
+					.toList();
+		}
+
 		@SuppressWarnings("unchecked")
 		<T> RegistryEntries<T> getQueuedEntries(RegistryKey<T> key) {
 			RegistryEntries<?> regEntries = queuedEntries.get(key.getRegistry());
@@ -177,7 +200,7 @@ public abstract class FabricDynamicRegistryProvider implements DataProvider {
 		return registriesFuture.thenCompose(registries -> {
 			return CompletableFuture
 					.supplyAsync(() -> {
-						Entries entries = new Entries(registries);
+						Entries entries = new Entries(registries, output.getModId());
 						configure(registries, entries);
 						return entries;
 					})