From a4d87a428c32ef2a7efc89125fff99a84b78e939 Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 29 May 2022 03:05:01 -0700 Subject: [PATCH] add vanilla bonemeal flowers to Terra biomes --- .../access/GenerationSettingsAccessor.java | 21 ---- .../GenerationSettingsFloraFeaturesMixin.java | 32 ++++++ .../lifecycle/DataPackContentsMixin.java | 1 + .../dfsek/terra/fabric/util/BiomeUtil.java | 32 ++++-- .../terra/fabric/util/FloraFeatureHolder.java | 10 ++ .../src/main/resources/terra.mixins.json | 98 +++++++++---------- 6 files changed, 116 insertions(+), 78 deletions(-) delete mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/access/GenerationSettingsAccessor.java create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/compat/GenerationSettingsFloraFeaturesMixin.java create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/FloraFeatureHolder.java 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 deleted file mode 100644 index 58d9f751d..000000000 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/access/GenerationSettingsAccessor.java +++ /dev/null @@ -1,21 +0,0 @@ -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/compat/GenerationSettingsFloraFeaturesMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/compat/GenerationSettingsFloraFeaturesMixin.java new file mode 100644 index 000000000..f625fb1ba --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/compat/GenerationSettingsFloraFeaturesMixin.java @@ -0,0 +1,32 @@ +package com.dfsek.terra.fabric.mixin.compat; + +import com.dfsek.terra.fabric.util.FloraFeatureHolder; + +import net.minecraft.world.biome.GenerationSettings; +import net.minecraft.world.gen.feature.ConfiguredFeature; +import org.spongepowered.asm.mixin.Implements; +import org.spongepowered.asm.mixin.Interface; +import org.spongepowered.asm.mixin.Mixin; +import org.spongepowered.asm.mixin.injection.At; +import org.spongepowered.asm.mixin.injection.Inject; +import org.spongepowered.asm.mixin.injection.callback.CallbackInfoReturnable; + +import java.util.List; + + +@Mixin(GenerationSettings.class) +@Implements(@Interface(iface = FloraFeatureHolder.class, prefix = "terra$")) +public class GenerationSettingsFloraFeaturesMixin { + private List> flora; + + public void terra$setFloraFeatures(List> features) { + this.flora = features; + } + + @Inject(method = "getFlowerFeatures", cancellable = true, at = @At("HEAD")) + public void inject(CallbackInfoReturnable>> cir) { + if(flora != null) { + cir.setReturnValue(flora); + } + } +} 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 3364b5e17..fc4597597 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 @@ -21,5 +21,6 @@ public class DataPackContentsMixin { private void injectReload(DynamicRegistryManager dynamicRegistryManager, CallbackInfo ci) { Registry biomeRegistry = dynamicRegistryManager.get(Registry.BIOME_KEY); TagUtil.registerTags(biomeRegistry); + BiomeUtil.registerFlora(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 e333a8a44..b02f0b08b 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,7 +5,6 @@ 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; @@ -14,6 +13,7 @@ import net.minecraft.util.registry.RegistryKey; import net.minecraft.world.biome.Biome.Builder; import net.minecraft.world.biome.BiomeEffects; import net.minecraft.world.biome.GenerationSettings; +import net.minecraft.world.gen.feature.ConfiguredFeature; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -41,6 +41,7 @@ public final class BiomeUtil { pack.getCheckedRegistry(Biome.class) .forEach((id, biome) -> registerBiome(biome, pack, id)); }); + registerFlora(BuiltinRegistries.BIOME); logger.info("Terra biomes registered."); } @@ -50,7 +51,7 @@ public final class BiomeUtil { * @param biome The Terra BiomeBuilder. * @param pack The ConfigPack this biome belongs to. */ - public static void registerBiome(Biome biome, ConfigPack pack, + private static void registerBiome(Biome biome, ConfigPack pack, com.dfsek.terra.api.registry.key.RegistryKey id) { Registry registry = BuiltinRegistries.BIOME; RegistryKey vanilla = ((ProtoPlatformBiome) biome.getPlatformBiome()).get(registry); @@ -78,6 +79,26 @@ public final class BiomeUtil { } } + public static void registerFlora(Registry biomes) { + logger.info("Injecting flora into Terra biomes..."); + TERRA_BIOME_MAP + .forEach((vb, terraBiomes) -> + biomes.getOrEmpty(vb) + .ifPresentOrElse(vanilla -> terraBiomes + .forEach(tb -> biomes.getOrEmpty(tb) + .ifPresentOrElse( + terra -> { + List> flowerFeatures = List.copyOf(vanilla.getGenerationSettings().getFlowerFeatures()); + logger.debug("Injecting flora into biome {} : {}", tb, flowerFeatures); + ((FloraFeatureHolder) terra.getGenerationSettings()).setFloraFeatures(flowerFeatures); + }, + () -> logger.error( + "No such biome: {}", + tb))), + () -> logger.error("No vanilla biome: {}", vb))); + + } + public static Map> getTerraBiomeMap() { return Map.copyOf(TERRA_BIOME_MAP); } @@ -133,18 +154,13 @@ public final class BiomeUtil { .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(settings) + .generationSettings(generationSettings.build()) .build(); } } diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/FloraFeatureHolder.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/FloraFeatureHolder.java new file mode 100644 index 000000000..9b2157d72 --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/FloraFeatureHolder.java @@ -0,0 +1,10 @@ +package com.dfsek.terra.fabric.util; + +import net.minecraft.world.gen.feature.ConfiguredFeature; + +import java.util.List; + + +public interface FloraFeatureHolder { + void setFloraFeatures(List> features); +} diff --git a/platforms/fabric/src/main/resources/terra.mixins.json b/platforms/fabric/src/main/resources/terra.mixins.json index 5811220d6..1a638ef5f 100644 --- a/platforms/fabric/src/main/resources/terra.mixins.json +++ b/platforms/fabric/src/main/resources/terra.mixins.json @@ -1,51 +1,51 @@ { - "required": true, - "minVersion": "0.8", - "package": "com.dfsek.terra.fabric.mixin", - "compatibilityLevel": "JAVA_17", - "mixins": [ - "access.GenerationSettingsAccessor", - "access.MobSpawnerLogicAccessor", - "access.StateAccessor", - "access.StructureAccessorAccessor", - "implementations.BiomeMixin", - "implementations.HandleImplementationMixin", - "implementations.block.BlockMixin", - "implementations.block.entity.BlockEntityMixin", - "implementations.block.entity.LootableContainerBlockEntityMixin", - "implementations.block.entity.MobSpawnerBlockEntityMixin", - "implementations.block.entity.SignBlockEntityMixin", - "implementations.block.state.BlockStateMixin", - "implementations.block.state.PropertyMixin", - "implementations.chunk.ChunkRegionMixin", - "implementations.chunk.WorldChunkMixin", - "implementations.chunk.data.ProtoChunkMixin", - "implementations.entity.EntityMixin", - "implementations.entity.EntityTypeMixin", - "implementations.entity.PlayerEntityMixin", - "implementations.entity.ServerCommandSourceMixin", - "implementations.inventory.LockableContainerBlockEntityMixin", - "implementations.inventory.item.ItemMixin", - "implementations.inventory.item.ItemStackMixin", - "implementations.inventory.meta.EnchantmentMixin", - "implementations.inventory.meta.ItemStackDamageableMixin", - "implementations.inventory.meta.ItemStackMetaMixin", - "implementations.world.ChunkRegionMixin", - "implementations.world.ServerWorldMixin", - "lifecycle.DataPackContentsMixin", - "lifecycle.MinecraftServerMixin", - "lifecycle.RegistryMixin" - ], - "client": [ - "access.GeneratorTypeAccessor", - "lifecycle.client.MinecraftClientMixin" - ], - "server": [ - "lifecycle.server.GeneratorOptionsMixin", - "lifecycle.server.ServerMainMixin" - ], - "injectors": { - "defaultRequire": 1 - }, - "refmap": "terra-refmap.json" + "required": true, + "minVersion": "0.8", + "package": "com.dfsek.terra.fabric.mixin", + "compatibilityLevel": "JAVA_17", + "mixins": [ + "access.MobSpawnerLogicAccessor", + "access.StateAccessor", + "access.StructureAccessorAccessor", + "compat.GenerationSettingsFloraFeaturesMixin", + "implementations.BiomeMixin", + "implementations.HandleImplementationMixin", + "implementations.block.BlockMixin", + "implementations.block.entity.BlockEntityMixin", + "implementations.block.entity.LootableContainerBlockEntityMixin", + "implementations.block.entity.MobSpawnerBlockEntityMixin", + "implementations.block.entity.SignBlockEntityMixin", + "implementations.block.state.BlockStateMixin", + "implementations.block.state.PropertyMixin", + "implementations.chunk.ChunkRegionMixin", + "implementations.chunk.WorldChunkMixin", + "implementations.chunk.data.ProtoChunkMixin", + "implementations.entity.EntityMixin", + "implementations.entity.EntityTypeMixin", + "implementations.entity.PlayerEntityMixin", + "implementations.entity.ServerCommandSourceMixin", + "implementations.inventory.LockableContainerBlockEntityMixin", + "implementations.inventory.item.ItemMixin", + "implementations.inventory.item.ItemStackMixin", + "implementations.inventory.meta.EnchantmentMixin", + "implementations.inventory.meta.ItemStackDamageableMixin", + "implementations.inventory.meta.ItemStackMetaMixin", + "implementations.world.ChunkRegionMixin", + "implementations.world.ServerWorldMixin", + "lifecycle.DataPackContentsMixin", + "lifecycle.MinecraftServerMixin", + "lifecycle.RegistryMixin" + ], + "client": [ + "access.GeneratorTypeAccessor", + "lifecycle.client.MinecraftClientMixin" + ], + "server": [ + "lifecycle.server.GeneratorOptionsMixin", + "lifecycle.server.ServerMainMixin" + ], + "injectors": { + "defaultRequire": 1 + }, + "refmap": "terra-refmap.json" } \ No newline at end of file