diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java index 0bfe69dbc..9cfb726eb 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/TerraFabricPlugin.java @@ -43,6 +43,7 @@ import com.dfsek.terra.fabric.generation.PopulatorFeature; import com.dfsek.terra.fabric.generation.TerraBiomeSource; import com.dfsek.terra.fabric.handle.FabricItemHandle; import com.dfsek.terra.fabric.handle.FabricWorldHandle; +import com.dfsek.terra.fabric.util.ProtoBiome; import com.dfsek.terra.profiler.Profiler; import com.dfsek.terra.profiler.ProfilerImpl; import com.dfsek.terra.registry.exception.DuplicateEntryException; @@ -120,9 +121,16 @@ public class TerraFabricPlugin implements TerraPlugin, ModInitializer { private final PluginConfig config = new PluginConfig(); - private final Transformer biomeFixer = new Transformer.Builder() - .addTransform(id -> BuiltinRegistries.BIOME.get(Identifier.tryParse(id)), Validator.notNull()) - .addTransform(id -> BuiltinRegistries.BIOME.get(Identifier.tryParse("minecraft:" + id.toLowerCase())), Validator.notNull()).build(); + private final Transformer biomeFixer = new Transformer.Builder() + .addTransform(this::parseBiome, Validator.notNull()) + .addTransform(id -> parseBiome("minecraft:" + id.toLowerCase()), Validator.notNull()).build(); + + private ProtoBiome parseBiome(String id) { + Identifier identifier = Identifier.tryParse(id); + if(BuiltinRegistries.BIOME.get(identifier) == null) return null; // failure. + return new ProtoBiome(identifier); + } + private File dataFolder; private final CommandManager manager = new TerraCommandManager(this); diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/TerraGeneratorType.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/TerraGeneratorType.java index ec89f02c3..cfecda8a2 100644 --- a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/TerraGeneratorType.java +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/generation/TerraGeneratorType.java @@ -5,8 +5,10 @@ import com.dfsek.terra.fabric.TerraFabricPlugin; import com.dfsek.terra.fabric.util.FabricUtil; import net.minecraft.client.world.GeneratorType; import net.minecraft.util.Identifier; +import net.minecraft.util.registry.DynamicRegistryManager; import net.minecraft.util.registry.Registry; import net.minecraft.world.biome.Biome; +import net.minecraft.world.gen.GeneratorOptions; import net.minecraft.world.gen.chunk.ChunkGenerator; import net.minecraft.world.gen.chunk.ChunkGeneratorSettings; @@ -18,9 +20,16 @@ public class TerraGeneratorType extends GeneratorType { this.pack = pack; } + @Override + public GeneratorOptions createDefaultOptions(DynamicRegistryManager.Impl registryManager, long seed, boolean generateStructures, boolean bonusChest) { + GeneratorOptions options = super.createDefaultOptions(registryManager, seed, generateStructures, bonusChest); + Registry biomeRegistry = registryManager.get(Registry.BIOME_KEY); + TerraFabricPlugin.getInstance().getConfigRegistry().forEach(pack -> pack.getBiomeRegistry().forEach((id, biome) -> Registry.register(biomeRegistry, new Identifier("terra", FabricUtil.createBiomeID(pack, id)), FabricUtil.createBiome(TerraFabricPlugin.getInstance().getFabricAddon(), biome, pack, registryManager)))); // Register all Terra biomes. + return options; + } + @Override protected ChunkGenerator getChunkGenerator(Registry biomeRegistry, Registry chunkGeneratorSettingsRegistry, long seed) { - TerraFabricPlugin.getInstance().getConfigRegistry().forEach(pack -> pack.getBiomeRegistry().forEach((id, biome) -> Registry.register(biomeRegistry, new Identifier("terra", FabricUtil.createBiomeID(pack, id)), FabricUtil.createBiome(TerraFabricPlugin.getInstance().getFabricAddon(), biome, pack)))); // Register all Terra biomes. return new FabricChunkGeneratorWrapper(new TerraBiomeSource(biomeRegistry, seed, pack), seed, pack); } } 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 c761cade4..0f5edafcd 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 @@ -9,7 +9,8 @@ import com.dfsek.terra.fabric.config.PostLoadCompatibilityOptions; import com.dfsek.terra.fabric.config.PreLoadCompatibilityOptions; import com.dfsek.terra.fabric.mixin.access.BiomeEffectsAccessor; import net.minecraft.util.Identifier; -import net.minecraft.util.registry.BuiltinRegistries; +import net.minecraft.util.registry.DynamicRegistryManager; +import net.minecraft.util.registry.Registry; import net.minecraft.world.biome.Biome; import net.minecraft.world.biome.BiomeEffects; import net.minecraft.world.biome.GenerationSettings; @@ -37,11 +38,12 @@ public final class FabricUtil { * @param pack The ConfigPack this biome belongs to. * @return The Minecraft delegate biome. */ - public static Biome createBiome(TerraFabricPlugin.FabricAddon fabricAddon, BiomeBuilder biome, ConfigPack pack) { + public static Biome createBiome(TerraFabricPlugin.FabricAddon fabricAddon, BiomeBuilder biome, ConfigPack pack, DynamicRegistryManager.Impl registryManager) { BiomeTemplate template = biome.getTemplate(); Map colors = template.getColors(); - Biome vanilla = (Biome) (new ArrayList<>(biome.getVanillaBiomes().getContents()).get(0)).getHandle(); + Registry biomeRegistry = registryManager.get(Registry.BIOME_KEY); + Biome vanilla = ((ProtoBiome) (new ArrayList<>(biome.getVanillaBiomes().getContents()).get(0))).get(biomeRegistry); GenerationSettings.Builder generationSettings = new GenerationSettings.Builder(); @@ -63,8 +65,9 @@ public final class FabricUtil { TerraFabricPlugin.getInstance().getDebugLogger().info("Injecting Vanilla structures and features into Terra biome " + biome.getTemplate().getID()); + Registry> configuredStructureFeatureRegistry = registryManager.get(Registry.CONFIGURED_STRUCTURE_FEATURE_KEY); for(Supplier> structureFeature : vanilla.getGenerationSettings().getStructureFeatures()) { - Identifier key = BuiltinRegistries.CONFIGURED_STRUCTURE_FEATURE.getId(structureFeature.get()); + Identifier key = configuredStructureFeatureRegistry.getId(structureFeature.get()); if(!compatibilityOptions.getExcludedBiomeStructures().contains(key) && !postLoadCompatibilityOptions.getExcludedPerBiomeStructures().getOrDefault(biome, Collections.emptySet()).contains(key)) { generationSettings.structureFeature(structureFeature.get()); TerraFabricPlugin.getInstance().getDebugLogger().info("Injected structure " + key); @@ -72,9 +75,10 @@ public final class FabricUtil { } if(compatibilityOptions.doBiomeInjection()) { + Registry> configuredFeatureRegistry = registryManager.get(Registry.CONFIGURED_FEATURE_KEY); for(int step = 0; step < vanilla.getGenerationSettings().getFeatures().size(); step++) { for(Supplier> featureSupplier : vanilla.getGenerationSettings().getFeatures().get(step)) { - Identifier key = BuiltinRegistries.CONFIGURED_FEATURE.getId(featureSupplier.get()); + Identifier key = configuredFeatureRegistry.getId(featureSupplier.get()); if(!compatibilityOptions.getExcludedBiomeFeatures().contains(key) && !postLoadCompatibilityOptions.getExcludedPerBiomeFeatures().getOrDefault(biome, Collections.emptySet()).contains(key)) { generationSettings.feature(step, featureSupplier); TerraFabricPlugin.getInstance().getDebugLogger().info("Injected feature " + key + " at stage " + step); diff --git a/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/ProtoBiome.java b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/ProtoBiome.java new file mode 100644 index 000000000..a7ff41ecd --- /dev/null +++ b/platforms/fabric/src/main/java/com/dfsek/terra/fabric/util/ProtoBiome.java @@ -0,0 +1,22 @@ +package com.dfsek.terra.fabric.util; + +import com.dfsek.terra.api.platform.world.Biome; +import net.minecraft.util.Identifier; +import net.minecraft.util.registry.Registry; + +public class ProtoBiome implements Biome { + private final Identifier identifier; + + public ProtoBiome(Identifier identifier) { + this.identifier = identifier; + } + + public net.minecraft.world.biome.Biome get(Registry registry) { + return registry.get(identifier); + } + + @Override + public Object getHandle() { + return identifier; + } +}