From f37e7155549436f68dc4696aa38ea7f3e09a7715 Mon Sep 17 00:00:00 2001
From: TelepathicGrunt <40846040+telepathicgrunt@users.noreply.github.com>
Date: Tue, 25 May 2021 13:02:16 -0400
Subject: [PATCH] Fixed Biome Modification API not working for datapack
 provided biomes (#1463)

* Fixed Biome Modification API not working for json biome

* upgraded test to add to all deserts and added json biome. (note the test mod won't load the json biome tho. Make it into a datapack so it works)

* switched set of rgeistrykeys to set of biome instances

* added datapack as backup to test mod

* removed unused imports

* removed the biome json file from the test mod's data folder
---
 .../modification/BiomeModificationImpl.java   |   4 +--
 .../BiomeModificationTracker.java             |   3 +-
 .../DynamicRegistryManagerImplMixin.java      |   5 ++-
 .../fabric/test/biome/FabricBiomeTest.java    |  14 ++++++++
 .../test/biome/mixin/DecoratorsAccessor.java  |  30 ++++++++++++++++++
 .../src/testmod/resources/desert_test.zip     | Bin 0 -> 1055 bytes
 .../fabric-biome-testmod-api-v1.mixins.json   |  11 +++++++
 .../src/testmod/resources/fabric.mod.json     |   5 ++-
 8 files changed, 64 insertions(+), 8 deletions(-)
 create mode 100644 fabric-biome-api-v1/src/testmod/java/net/fabricmc/fabric/test/biome/mixin/DecoratorsAccessor.java
 create mode 100644 fabric-biome-api-v1/src/testmod/resources/desert_test.zip
 create mode 100644 fabric-biome-api-v1/src/testmod/resources/fabric-biome-testmod-api-v1.mixins.json

diff --git a/fabric-biome-api-v1/src/main/java/net/fabricmc/fabric/impl/biome/modification/BiomeModificationImpl.java b/fabric-biome-api-v1/src/main/java/net/fabricmc/fabric/impl/biome/modification/BiomeModificationImpl.java
index e1eb4fce2..63bccaa8d 100644
--- a/fabric-biome-api-v1/src/main/java/net/fabricmc/fabric/impl/biome/modification/BiomeModificationImpl.java
+++ b/fabric-biome-api-v1/src/main/java/net/fabricmc/fabric/impl/biome/modification/BiomeModificationImpl.java
@@ -111,7 +111,7 @@ public class BiomeModificationImpl {
 		// which usually will not result in a reload of objects, since it reuses existing objects
 		// from the manager when they are being referenced.
 		BiomeModificationTracker modificationTracker = (BiomeModificationTracker) (Object) impl;
-		Set<RegistryKey<Biome>> modifiedBiomes = modificationTracker.fabric_getModifiedBiomes();
+		Set<Biome> modifiedBiomes = modificationTracker.fabric_getModifiedBiomes();
 
 		Registry<Biome> biomes = impl.get(Registry.BIOME_KEY);
 
@@ -131,7 +131,7 @@ public class BiomeModificationImpl {
 		for (RegistryKey<Biome> key : keys) {
 			Biome biome = biomes.getOrThrow(key);
 
-			if (!modifiedBiomes.add(key)) {
+			if (!modifiedBiomes.add(biome)) {
 				continue; // Do not modify the same biome twice
 			}
 
diff --git a/fabric-biome-api-v1/src/main/java/net/fabricmc/fabric/impl/biome/modification/BiomeModificationTracker.java b/fabric-biome-api-v1/src/main/java/net/fabricmc/fabric/impl/biome/modification/BiomeModificationTracker.java
index 331fe21ee..02e138dbd 100644
--- a/fabric-biome-api-v1/src/main/java/net/fabricmc/fabric/impl/biome/modification/BiomeModificationTracker.java
+++ b/fabric-biome-api-v1/src/main/java/net/fabricmc/fabric/impl/biome/modification/BiomeModificationTracker.java
@@ -20,7 +20,6 @@ import java.util.Set;
 
 import org.jetbrains.annotations.ApiStatus;
 
-import net.minecraft.util.registry.RegistryKey;
 import net.minecraft.world.biome.Biome;
 
 /**
@@ -29,5 +28,5 @@ import net.minecraft.world.biome.Biome;
  */
 @ApiStatus.Internal
 public interface BiomeModificationTracker {
-	Set<RegistryKey<Biome>> fabric_getModifiedBiomes();
+	Set<Biome> fabric_getModifiedBiomes();
 }
diff --git a/fabric-biome-api-v1/src/main/java/net/fabricmc/fabric/mixin/biome/modification/DynamicRegistryManagerImplMixin.java b/fabric-biome-api-v1/src/main/java/net/fabricmc/fabric/mixin/biome/modification/DynamicRegistryManagerImplMixin.java
index a7e6668de..dca4cda73 100644
--- a/fabric-biome-api-v1/src/main/java/net/fabricmc/fabric/mixin/biome/modification/DynamicRegistryManagerImplMixin.java
+++ b/fabric-biome-api-v1/src/main/java/net/fabricmc/fabric/mixin/biome/modification/DynamicRegistryManagerImplMixin.java
@@ -23,7 +23,6 @@ import org.spongepowered.asm.mixin.Mixin;
 import org.spongepowered.asm.mixin.Unique;
 
 import net.minecraft.util.registry.DynamicRegistryManager;
-import net.minecraft.util.registry.RegistryKey;
 import net.minecraft.world.biome.Biome;
 
 import net.fabricmc.fabric.impl.biome.modification.BiomeModificationTracker;
@@ -35,10 +34,10 @@ import net.fabricmc.fabric.impl.biome.modification.BiomeModificationTracker;
 @Mixin(DynamicRegistryManager.Impl.class)
 public class DynamicRegistryManagerImplMixin implements BiomeModificationTracker {
 	@Unique
-	private final Set<RegistryKey<Biome>> modifiedBiomes = new HashSet<>();
+	private final Set<Biome> modifiedBiomes = new HashSet<>();
 
 	@Override
-	public Set<RegistryKey<Biome>> fabric_getModifiedBiomes() {
+	public Set<Biome> fabric_getModifiedBiomes() {
 		return this.modifiedBiomes;
 	}
 }
diff --git a/fabric-biome-api-v1/src/testmod/java/net/fabricmc/fabric/test/biome/FabricBiomeTest.java b/fabric-biome-api-v1/src/testmod/java/net/fabricmc/fabric/test/biome/FabricBiomeTest.java
index 9be893ea1..df9d9dedf 100644
--- a/fabric-biome-api-v1/src/testmod/java/net/fabricmc/fabric/test/biome/FabricBiomeTest.java
+++ b/fabric-biome-api-v1/src/testmod/java/net/fabricmc/fabric/test/biome/FabricBiomeTest.java
@@ -30,9 +30,12 @@ import net.minecraft.world.biome.DefaultBiomeCreator;
 import net.minecraft.world.biome.GenerationSettings;
 import net.minecraft.world.biome.SpawnSettings;
 import net.minecraft.world.gen.GenerationStep;
+import net.minecraft.world.gen.feature.ConfiguredFeature;
 import net.minecraft.world.gen.feature.ConfiguredFeatures;
 import net.minecraft.world.gen.feature.ConfiguredStructureFeatures;
 import net.minecraft.world.gen.feature.DefaultBiomeFeatures;
+import net.minecraft.world.gen.feature.Feature;
+import net.minecraft.world.gen.feature.FeatureConfig;
 import net.minecraft.world.gen.surfacebuilder.ConfiguredSurfaceBuilders;
 import net.minecraft.world.gen.surfacebuilder.ConfiguredSurfaceBuilder;
 import net.minecraft.world.gen.surfacebuilder.SurfaceBuilder;
@@ -47,6 +50,7 @@ import net.fabricmc.fabric.api.biome.v1.NetherBiomes;
 import net.fabricmc.fabric.api.biome.v1.OverworldBiomes;
 import net.fabricmc.fabric.api.biome.v1.OverworldClimate;
 import net.fabricmc.fabric.api.biome.v1.TheEndBiomes;
+import net.fabricmc.fabric.test.biome.mixin.DecoratorsAccessor;
 
 /**
  * <b>NOTES FOR TESTING:</b>
@@ -97,6 +101,9 @@ public class FabricBiomeTest implements ModInitializer {
 
 		OverworldBiomes.addContinentalBiome(BiomeKeys.END_HIGHLANDS, OverworldClimate.DRY, 0.5);
 
+		ConfiguredFeature<?, ?> COMMON_DESERT_WELL = Feature.DESERT_WELL.configure(FeatureConfig.DEFAULT).decorate(DecoratorsAccessor.getSQUARE_HEIGHTMAP());
+		Registry.register(BuiltinRegistries.CONFIGURED_FEATURE, new Identifier(MOD_ID, "common_desert_well"), COMMON_DESERT_WELL);
+
 		BiomeModifications.create(new Identifier("fabric:test_mod"))
 				.add(ModificationPhase.ADDITIONS,
 						BiomeSelectors.foundInOverworld(),
@@ -107,6 +114,13 @@ public class FabricBiomeTest implements ModInitializer {
 						),
 						context -> {
 							context.getGenerationSettings().setBuiltInSurfaceBuilder(ConfiguredSurfaceBuilders.CRIMSON_FOREST);
+						})
+				.add(ModificationPhase.ADDITIONS,
+						BiomeSelectors.categories(Biome.Category.DESERT),
+						context -> {
+							context.getGenerationSettings().addFeature(GenerationStep.Feature.TOP_LAYER_MODIFICATION,
+									BuiltinRegistries.CONFIGURED_FEATURE.getKey(COMMON_DESERT_WELL).get()
+							);
 						});
 	}
 
diff --git a/fabric-biome-api-v1/src/testmod/java/net/fabricmc/fabric/test/biome/mixin/DecoratorsAccessor.java b/fabric-biome-api-v1/src/testmod/java/net/fabricmc/fabric/test/biome/mixin/DecoratorsAccessor.java
new file mode 100644
index 000000000..7df10d7d8
--- /dev/null
+++ b/fabric-biome-api-v1/src/testmod/java/net/fabricmc/fabric/test/biome/mixin/DecoratorsAccessor.java
@@ -0,0 +1,30 @@
+/*
+ * Copyright (c) 2016, 2017, 2018, 2019 FabricMC
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+package net.fabricmc.fabric.test.biome.mixin;
+
+import org.spongepowered.asm.mixin.Mixin;
+import org.spongepowered.asm.mixin.gen.Accessor;
+
+import net.minecraft.world.gen.decorator.ConfiguredDecorator;
+
+@Mixin(targets = "net.minecraft.world.gen.feature.ConfiguredFeatures$Decorators")
+public interface DecoratorsAccessor {
+	@Accessor
+	static ConfiguredDecorator<?> getSQUARE_HEIGHTMAP() {
+		throw new UnsupportedOperationException("");
+	}
+}
diff --git a/fabric-biome-api-v1/src/testmod/resources/desert_test.zip b/fabric-biome-api-v1/src/testmod/resources/desert_test.zip
new file mode 100644
index 0000000000000000000000000000000000000000..712003a324b72ab557a6f50a6e286e4335b98c29
GIT binary patch
literal 1055
zcmWIWW@Zs#0D%u(+k(IhD8Ub;QxZ!O^>Z`xQj?1k(@OLMa4MF-R9v24l#`O4nukZ1
z93EXsnfbY?aJ?K1-+<0r?e%$A5+ehH12Y4ICPBR^sl};9C3;!K`FV4LV*8s61Ztj#
z&#=2M8Q^dGpUW^sH+ucXEh*7odOq&I@5HG1@#Q>^^tASy{qCD0I6}BmKRnt{@nLe~
zshyiXtlRjs!_bOh(Iqj}MlSXhep0y+UON{3kZ5r{?H#zN(R%gv%vpVBPFgIpVLCaV
zsh;`zrWE^6ewzKdTcVc9e(Ra?VS2UV+`=O<+v47TTYYug@+sE)SG;*$ZEs}G;i0_!
z?wd=oyXF^OzBSMP*L<$~6PP-WuDrO+WtMr|B6qIX(@spW6V)Cw-(B_jamG>sC+8bp
zpZq4tC->B3{CS%5psBS{yQ5FK<^Mmmz3m?uS40=x+n>GTX5_n5k@6GVJa0=MeG$AS
z{+Gxr^}lX1GtE_}ek-zDswc4i@bTcDgtOsC*d_)a(Oa5%-mCGWglJ39bt{Jp=e9*}
zI(IBtgmJZ0=7}TbR~Ihb9jRx|v(#3_^6AaMY@KDRbvN?a&(*tqq({i-_1BXg(`+W&
z!;%IE19$hfpoYk@gO<Pu@&saTATCHu&eqFK&P^>zT>b3nqYy0*pL1cGf>y9?Qk?T+
z%b!JejtDK7F_SOCKy|CdPL0hARE+KUH8>tE6Pv2h@RjjtcID12#sF_dCJ_eQX%%P<
z5C}jh%#@2;Gbrss07$bg5Thk~q?C-?6i`}*0FWukK#a>2SjvW(g*|P9%wl9v0Fv{8
p7{6IaDIF0?*kb}{7Svb|CX{#y@MdKLNwNZAJTQ-~0!lM5007BfS)Bj?

literal 0
HcmV?d00001

diff --git a/fabric-biome-api-v1/src/testmod/resources/fabric-biome-testmod-api-v1.mixins.json b/fabric-biome-api-v1/src/testmod/resources/fabric-biome-testmod-api-v1.mixins.json
new file mode 100644
index 000000000..c58e62ba0
--- /dev/null
+++ b/fabric-biome-api-v1/src/testmod/resources/fabric-biome-testmod-api-v1.mixins.json
@@ -0,0 +1,11 @@
+{
+  "required": true,
+  "package": "net.fabricmc.fabric.test.biome.mixin",
+  "compatibilityLevel": "JAVA_16",
+  "client": [
+    "DecoratorsAccessor"
+  ],
+  "injectors": {
+    "defaultRequire": 1
+  }
+}
diff --git a/fabric-biome-api-v1/src/testmod/resources/fabric.mod.json b/fabric-biome-api-v1/src/testmod/resources/fabric.mod.json
index b3fbb654b..f15168368 100644
--- a/fabric-biome-api-v1/src/testmod/resources/fabric.mod.json
+++ b/fabric-biome-api-v1/src/testmod/resources/fabric.mod.json
@@ -12,5 +12,8 @@
     "main": [
       "net.fabricmc.fabric.test.biome.FabricBiomeTest"
     ]
-  }
+  },
+  "mixins": [
+    "fabric-biome-testmod-api-v1.mixins.json"
+  ]
 }