From 1442660e490382d55b733361f88dde2b6db6d68d Mon Sep 17 00:00:00 2001 From: dfsek Date: Sun, 5 Dec 2021 12:20:04 -0700 Subject: [PATCH] register structures to Terra biomes --- .../com/dfsek/terra/fabric/FabricAddon.java | 12 +----- .../FabricChunkGeneratorWrapper.java | 6 --- .../ConfiguredStructureFeaturesMixin.java | 41 +++++++++++++++++++ .../dfsek/terra/fabric/util/FabricUtil.java | 22 ++++++++-- .../src/main/resources/terra.mixins.json | 3 +- 5 files changed, 63 insertions(+), 21 deletions(-) create mode 100644 platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/ConfiguredStructureFeaturesMixin.java diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/FabricAddon.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/FabricAddon.java index ed622fe72..ce54953f2 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/FabricAddon.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/FabricAddon.java @@ -20,10 +20,6 @@ package com.dfsek.terra.fabric; import ca.solostudios.strata.Versions; import ca.solostudios.strata.version.Version; import com.dfsek.tectonic.exception.ConfigException; - -import com.dfsek.terra.api.world.biome.Biome; - -import net.minecraft.util.Identifier; import net.minecraft.util.registry.Registry; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -37,6 +33,7 @@ import com.dfsek.terra.api.event.events.config.pack.ConfigPackPostLoadEvent; import com.dfsek.terra.api.event.events.config.pack.ConfigPackPreLoadEvent; import com.dfsek.terra.api.event.functional.FunctionalEventHandler; import com.dfsek.terra.api.util.generic.pair.Pair.Mutable; +import com.dfsek.terra.api.world.biome.Biome; import com.dfsek.terra.fabric.config.PostLoadCompatibilityOptions; import com.dfsek.terra.fabric.config.PreLoadCompatibilityOptions; import com.dfsek.terra.fabric.event.BiomeRegistrationEvent; @@ -91,12 +88,7 @@ public final class FabricAddon implements BaseAddon { Registry biomeRegistry = event.getRegistryManager().get(Registry.BIOME_KEY); terraFabricPlugin.getConfigRegistry().forEach(pack -> { // Register all Terra biomes. pack.getCheckedRegistry(Biome.class) - .forEach((id, biome) -> { - Identifier identifier = new Identifier("terra", FabricUtil.createBiomeID(pack, id)); - net.minecraft.world.biome.Biome fabricBiome = FabricUtil.createBiome(biome, pack, event.getRegistryManager()); - - FabricUtil.registerOrOverwrite(biomeRegistry, Registry.BIOME_KEY, identifier, fabricBiome); - }); + .forEach((id, biome) -> FabricUtil.registerBiome(biome, pack, event.getRegistryManager(), id)); }); logger.info("Biomes registered."); }) diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/FabricChunkGeneratorWrapper.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/FabricChunkGeneratorWrapper.java index d2bddbca9..a1b824d16 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/FabricChunkGeneratorWrapper.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/FabricChunkGeneratorWrapper.java @@ -190,12 +190,6 @@ public class FabricChunkGeneratorWrapper extends net.minecraft.world.gen.chunk.C } } - @Override - public void setStructureStarts(DynamicRegistryManager dynamicRegistryManager, StructureAccessor structureAccessor, Chunk chunk, - StructureManager structureManager, long worldSeed) { - super.setStructureStarts(dynamicRegistryManager, structureAccessor, chunk, structureManager, worldSeed); - } - @Override public CompletableFuture populateNoise(Executor executor, Blender arg, StructureAccessor structureAccessor, Chunk chunk) { return CompletableFuture.supplyAsync(() -> { diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/ConfiguredStructureFeaturesMixin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/ConfiguredStructureFeaturesMixin.java new file mode 100644 index 000000000..78192f894 --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/mixin/ConfiguredStructureFeaturesMixin.java @@ -0,0 +1,41 @@ +package com.dfsek.terra.fabric.mixin; + +import com.dfsek.terra.fabric.util.FabricUtil; + +import net.minecraft.util.registry.RegistryKey; +import net.minecraft.world.biome.Biome; +import net.minecraft.world.gen.feature.ConfiguredStructureFeature; +import net.minecraft.world.gen.feature.ConfiguredStructureFeatures; +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.CallbackInfo; + +import java.util.Set; +import java.util.function.BiConsumer; + + +@Mixin(ConfiguredStructureFeatures.class) +public class ConfiguredStructureFeaturesMixin { + @Inject(method = "register(Ljava/util/function/BiConsumer;Lnet/minecraft/world/gen/feature/ConfiguredStructureFeature;Lnet/minecraft/util/registry/RegistryKey;)V", at = @At("HEAD")) + private static void addStructuresToTerraBiomes(BiConsumer, RegistryKey> registrar, + ConfiguredStructureFeature feature, + RegistryKey biome, + CallbackInfo ci) { + if(FabricUtil.getTerraVanillaBiomes().containsKey(biome)) { + FabricUtil.getTerraVanillaBiomes().get(biome).forEach(biomeRegistryKey -> registrar.accept(feature, biomeRegistryKey)); + } + } + + @Inject(method = "register(Ljava/util/function/BiConsumer;Lnet/minecraft/world/gen/feature/ConfiguredStructureFeature;Ljava/util/Set;)V", + at = @At("HEAD")) + private static void addStructuresToTerraBiomes(BiConsumer, RegistryKey> registrar, + ConfiguredStructureFeature feature, Set> biomes, + CallbackInfo ci) { + biomes.forEach(biome -> { + if(FabricUtil.getTerraVanillaBiomes().containsKey(biome)) { + FabricUtil.getTerraVanillaBiomes().get(biome).forEach(biomeRegistryKey -> registrar.accept(feature, biomeRegistryKey)); + } + }); + } +} diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/FabricUtil.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/FabricUtil.java index 49431fe9e..a8d1635c1 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/FabricUtil.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/FabricUtil.java @@ -33,7 +33,9 @@ import net.minecraft.world.biome.GenerationSettings; import net.minecraft.world.gen.GenerationStep; import net.minecraft.world.gen.carver.ConfiguredCarver; +import java.util.ArrayList; import java.util.HashMap; +import java.util.List; import java.util.Locale; import java.util.Map; import java.util.function.Supplier; @@ -48,6 +50,10 @@ import com.dfsek.terra.fabric.mixin.access.BiomeEffectsAccessor; public final class FabricUtil { + + private static final Map, List>> + terraVanillaBiomes = new HashMap<>(); + public static String createBiomeID(ConfigPack pack, String biomeID) { return pack.getID().toLowerCase() + "/" + biomeID.toLowerCase(Locale.ROOT); } @@ -57,10 +63,8 @@ public final class FabricUtil { * * @param biome The Terra BiomeBuilder. * @param pack The ConfigPack this biome belongs to. - * - * @return The Minecraft delegate biome. */ - public static net.minecraft.world.biome.Biome createBiome(Biome biome, ConfigPack pack, DynamicRegistryManager registryManager) { + public static void registerBiome(Biome biome, ConfigPack pack, DynamicRegistryManager registryManager, String id) { // BiomeTemplate template = biome.getTemplate(); Map colors = new HashMap<>(); // template.getColors(); @@ -133,7 +137,7 @@ public final class FabricUtil { accessor.getFoliageColor().ifPresent(effects::foliageColor); } - return new net.minecraft.world.biome.Biome.Builder() + net.minecraft.world.biome.Biome minecraftBiome = new net.minecraft.world.biome.Biome.Builder() .precipitation(vanilla.getPrecipitation()) .category(vanilla.getCategory()) .temperature(vanilla.getTemperature()) @@ -142,6 +146,16 @@ public final class FabricUtil { .spawnSettings(vanilla.getSpawnSettings()) .generationSettings(generationSettings.build()) .build(); + Identifier identifier = new Identifier("terra", FabricUtil.createBiomeID(pack, id)); + FabricUtil.registerOrOverwrite(biomeRegistry, Registry.BIOME_KEY, identifier, minecraftBiome); + + terraVanillaBiomes.computeIfAbsent(biomeRegistry.getKey(vanilla).orElseThrow(), b -> new ArrayList<>()).add( + biomeRegistry.getKey(minecraftBiome).orElseThrow()); + + } + + public static Map, List>> getTerraVanillaBiomes() { + return terraVanillaBiomes; } public static void registerOrOverwrite(Registry registry, RegistryKey> key, Identifier identifier, T item) { diff --git a/platforms/fabric/src/main/resources/terra.mixins.json b/platforms/fabric/src/main/resources/terra.mixins.json index b646dc95c..33a19f06f 100644 --- a/platforms/fabric/src/main/resources/terra.mixins.json +++ b/platforms/fabric/src/main/resources/terra.mixins.json @@ -5,11 +5,12 @@ "compatibilityLevel": "JAVA_16", "mixins": [ "CommandManagerMixin", + "ConfiguredStructureFeaturesMixin", "ServerWorldMixin", - "access.StructureAccessorAccessor", "access.BiomeEffectsAccessor", "access.MobSpawnerLogicAccessor", "access.StateAccessor", + "access.StructureAccessorAccessor", "implementations.BiomeMixin", "implementations.block.BlockEntityMixin", "implementations.block.BlockMixin",