diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/access/GenerationSettingsAccessor.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/access/GenerationSettingsAccessor.java new file mode 100644 index 000000000..58d9f751d --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/access/GenerationSettingsAccessor.java @@ -0,0 +1,21 @@ +package com.dfsek.terra.fabric.mixin.access; + +import net.minecraft.world.biome.GenerationSettings; +import net.minecraft.world.gen.feature.ConfiguredFeature; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.Mutable; +import org.spongepowered.asm.mixin.gen.Accessor; + +import java.util.List; +import java.util.function.Supplier; + + +@Mixin(GenerationSettings.class) +public interface GenerationSettingsAccessor { + @Mutable + @Accessor("flowerFeatures") + void setFlowerFeatures(Supplier>> flowerFeatures); + + @Accessor("flowerFeatures") + Supplier>> getFlowerFeaturesSupplier(); +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/lifecycle/DataPackContentsMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/lifecycle/DataPackContentsMixin.java index cac25f64d..3364b5e17 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/lifecycle/DataPackContentsMixin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/lifecycle/DataPackContentsMixin.java @@ -1,9 +1,11 @@ package com.dfsek.terra.fabric.mixin.lifecycle; +import com.dfsek.terra.fabric.util.BiomeUtil; import com.dfsek.terra.fabric.util.TagUtil; import net.minecraft.server.DataPackContents; import net.minecraft.util.registry.DynamicRegistryManager; import net.minecraft.util.registry.Registry; +import net.minecraft.world.biome.Biome; import org.spongepowered.asm.mixin.Mixin; import org.spongepowered.asm.mixin.injection.At; import org.spongepowered.asm.mixin.injection.Inject; @@ -17,6 +19,7 @@ public class DataPackContentsMixin { */ @Inject(method = "refresh(Lnet/minecraft/util/registry/DynamicRegistryManager;)V", at = @At("RETURN")) private void injectReload(DynamicRegistryManager dynamicRegistryManager, CallbackInfo ci) { - TagUtil.registerTags(dynamicRegistryManager.get(Registry.BIOME_KEY)); + Registry biomeRegistry = dynamicRegistryManager.get(Registry.BIOME_KEY); + TagUtil.registerTags(biomeRegistry); } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/BiomeUtil.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/BiomeUtil.java index 63779cb06..e333a8a44 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/BiomeUtil.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/BiomeUtil.java @@ -5,6 +5,7 @@ import com.dfsek.terra.api.world.biome.Biome; import com.dfsek.terra.fabric.FabricEntryPoint; import com.dfsek.terra.fabric.config.PreLoadCompatibilityOptions; import com.dfsek.terra.fabric.config.VanillaBiomeProperties; +import com.dfsek.terra.fabric.mixin.access.GenerationSettingsAccessor; import net.minecraft.util.Identifier; import net.minecraft.util.registry.BuiltinRegistries; @@ -16,12 +17,7 @@ import net.minecraft.world.biome.GenerationSettings; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.List; -import java.util.Locale; -import java.util.Map; -import java.util.Objects; +import java.util.*; public final class BiomeUtil { @@ -136,13 +132,19 @@ public final class BiomeUtil { builder.precipitation(vanilla.getPrecipitation()) .category(vanilla.getCategory()); } + + GenerationSettings settings = generationSettings.build(); + + ((GenerationSettingsAccessor) settings) + .setFlowerFeatures(((GenerationSettingsAccessor) vanilla.getGenerationSettings()) + .getFlowerFeaturesSupplier()); return builder .temperature(vanilla.getTemperature()) .downfall(vanilla.getDownfall()) .effects(effects.build()) .spawnSettings(vanilla.getSpawnSettings()) - .generationSettings(generationSettings.build()) + .generationSettings(settings) .build(); } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/TagUtil.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/TagUtil.java index 0c48f4548..303d02ed0 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/TagUtil.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/TagUtil.java @@ -16,6 +16,7 @@ import java.util.Map; public final class TagUtil { private static final Logger logger = LoggerFactory.getLogger(TagUtil.class); + private TagUtil() { } @@ -29,26 +30,46 @@ public final class TagUtil { map.put(pair.getFirst(), new ArrayList<>(pair.getSecond().stream().toList())), HashMap::putAll); - BiomeUtil.getTerraBiomeMap().forEach((vb, terraBiomes) -> FabricUtil.getEntry(registry, vb) - .ifPresentOrElse(vanilla -> terraBiomes.forEach(tb -> FabricUtil.getEntry(registry, tb) - .ifPresentOrElse( - terra -> { - logger.debug(vanilla.getKey().orElseThrow().getValue() + " (vanilla for " + - terra.getKey().orElseThrow().getValue() + ": " + - vanilla.streamTags().toList()); - - vanilla.streamTags() - .forEach( - tag -> collect - .computeIfAbsent(tag, t -> new ArrayList<>()) - .add(FabricUtil.getEntry(registry, - terra.getKey() - .orElseThrow() - .getValue()).orElseThrow())); - - }, - () -> logger.error("No such biome: {}", tb))), - () -> logger.error("No vanilla biome: {}", vb))); + BiomeUtil + .getTerraBiomeMap() + .forEach((vb, terraBiomes) -> + FabricUtil.getEntry(registry, vb) + .ifPresentOrElse(vanilla -> terraBiomes + .forEach(tb -> FabricUtil + .getEntry(registry, tb) + .ifPresentOrElse( + terra -> { + logger.debug( + vanilla.getKey() + .orElseThrow() + .getValue() + + " (vanilla for " + + terra.getKey() + .orElseThrow() + .getValue() + + ": " + + vanilla.streamTags() + .toList()); + + vanilla.streamTags() + .forEach( + tag -> collect + .computeIfAbsent( + tag, + t -> new ArrayList<>()) + .add(FabricUtil + .getEntry( + registry, + terra.getKey() + .orElseThrow() + .getValue()) + .orElseThrow())); + + }, + () -> logger.error( + "No such biome: {}", + tb))), + () -> logger.error("No vanilla biome: {}", vb))); registry.clearTags(); registry.populateTags(ImmutableMap.copyOf(collect)); diff --git a/platforms/fabric/src/main/resources/terra.mixins.json b/platforms/fabric/src/main/resources/terra.mixins.json index a203ea8c4..5811220d6 100644 --- a/platforms/fabric/src/main/resources/terra.mixins.json +++ b/platforms/fabric/src/main/resources/terra.mixins.json @@ -4,6 +4,7 @@ "package": "com.dfsek.terra.fabric.mixin", "compatibilityLevel": "JAVA_17", "mixins": [ + "access.GenerationSettingsAccessor", "access.MobSpawnerLogicAccessor", "access.StateAccessor", "access.StructureAccessorAccessor",