From f4f2e85432b1310e993720d250befd9857a36700 Mon Sep 17 00:00:00 2001 From: Frank Date: Mon, 23 May 2022 01:25:32 +0200 Subject: [PATCH] Create new Generator with settings from DataPack --- .../NoiseGeneratorSettingsProvider.java | 2 + .../common/NoiseBasedChunkGeneratorMixin.java | 5 ++ .../bclib/presets/worldgen/WorldPresets.java | 51 ++++++++++++++++--- 3 files changed, 52 insertions(+), 6 deletions(-) diff --git a/src/main/java/org/betterx/bclib/interfaces/NoiseGeneratorSettingsProvider.java b/src/main/java/org/betterx/bclib/interfaces/NoiseGeneratorSettingsProvider.java index 1077c6b1..24dbb70f 100644 --- a/src/main/java/org/betterx/bclib/interfaces/NoiseGeneratorSettingsProvider.java +++ b/src/main/java/org/betterx/bclib/interfaces/NoiseGeneratorSettingsProvider.java @@ -1,11 +1,13 @@ package org.betterx.bclib.interfaces; +import net.minecraft.core.Holder; import net.minecraft.core.Registry; import net.minecraft.world.level.levelgen.NoiseGeneratorSettings; import net.minecraft.world.level.levelgen.synth.NormalNoise; public interface NoiseGeneratorSettingsProvider { NoiseGeneratorSettings bclib_getNoiseGeneratorSettings(); + Holder bclib_getNoiseGeneratorSettingHolders(); Registry bclib_getNoises(); } diff --git a/src/main/java/org/betterx/bclib/mixin/common/NoiseBasedChunkGeneratorMixin.java b/src/main/java/org/betterx/bclib/mixin/common/NoiseBasedChunkGeneratorMixin.java index 93647365..97d98dea 100644 --- a/src/main/java/org/betterx/bclib/mixin/common/NoiseBasedChunkGeneratorMixin.java +++ b/src/main/java/org/betterx/bclib/mixin/common/NoiseBasedChunkGeneratorMixin.java @@ -39,6 +39,11 @@ public abstract class NoiseBasedChunkGeneratorMixin implements SurfaceProvider, return settings.value(); } + @Override + public Holder bclib_getNoiseGeneratorSettingHolders() { + return settings; + } + @Override public Registry bclib_getNoises() { return noises; diff --git a/src/main/java/org/betterx/bclib/presets/worldgen/WorldPresets.java b/src/main/java/org/betterx/bclib/presets/worldgen/WorldPresets.java index 70425f82..8aacb05f 100644 --- a/src/main/java/org/betterx/bclib/presets/worldgen/WorldPresets.java +++ b/src/main/java/org/betterx/bclib/presets/worldgen/WorldPresets.java @@ -24,6 +24,8 @@ import com.mojang.serialization.Lifecycle; import org.betterx.bclib.BCLib; import org.betterx.bclib.api.tag.TagAPI; import org.betterx.bclib.api.tag.TagType; +import org.betterx.bclib.interfaces.ChunkGeneratorAccessor; +import org.betterx.bclib.interfaces.NoiseGeneratorSettingsProvider; import org.betterx.bclib.world.generator.BCLBiomeSource; import org.betterx.bclib.world.generator.BCLibEndBiomeSource; import org.betterx.bclib.world.generator.BCLibNetherBiomeSource; @@ -136,8 +138,6 @@ public class WorldPresets { ResourceKey dimensionTypeKey, WorldGenSettings settings) { var oldNether = settings.dimensions().getHolder(dimensionKey); - //TODO: Make sure our BiomeSource reuses the BiomeList from the Datapack Source - int loaderVersion = BCLChunkGenerator.getBiomeVersionForGenerator(oldNether .map(h -> h.value().generator()) .orElse(null)); @@ -145,12 +145,38 @@ public class WorldPresets { int targetVersion = BCLChunkGenerator.getBiomeVersionForCurrentWorld(dimensionKey); if (loaderVersion != targetVersion) { BCLib.LOGGER.info("Enforcing Correct Generator for " + dimensionKey.location().toString() + "."); + var chunkGenerator = oldNether.map(h -> h.value().generator()).orElse(null); RegistryAccess access = RegistryAccess.builtinCopy(); - return WorldPresets.replaceGenerator(dimensionKey, - dimensionTypeKey, + Optional> refLevelStem = BCLChunkGenerator.referenceStemForVersion( + dimensionKey, targetVersion, access, - settings); + settings.seed(), + settings.generateStructures(), + settings.generateStructures() + ); + + ChunkGenerator referenceGenerator = refLevelStem.map(h -> h.value().generator()).orElse(null); + if (referenceGenerator == null) { + BCLib.LOGGER.error("Failed to create Generator for " + dimensionKey.location().toString()); + return settings; + } + + if (chunkGenerator instanceof ChunkGeneratorAccessor generator) { + if (chunkGenerator instanceof NoiseGeneratorSettingsProvider noiseProvider) { + //TODO: Make sure our BiomeSource reuses the BiomeList from the Datapack Source + referenceGenerator = new BCLChunkGenerator(generator.bclib_getStructureSetsRegistry(), + noiseProvider.bclib_getNoises(), + referenceGenerator.getBiomeSource(), + noiseProvider.bclib_getNoiseGeneratorSettingHolders()); + } + } + + return WorldPresets.replaceGenerator(dimensionKey, + dimensionTypeKey, + access, + settings, + referenceGenerator); } return settings; } @@ -170,11 +196,24 @@ public class WorldPresets { worldGenSettings.generateStructures(), worldGenSettings.generateStructures() ); + return replaceGenerator(dimensionKey, + dimensionTypeKey, + registryAccess, + worldGenSettings, + oLevelStem.map(l -> l.value().generator()).orElseThrow()); + } + public static WorldGenSettings replaceGenerator( + ResourceKey dimensionKey, + ResourceKey dimensionTypeKey, + RegistryAccess registryAccess, + WorldGenSettings worldGenSettings, + ChunkGenerator generator + ) { Registry registry = registryAccess.registryOrThrow(Registry.DIMENSION_TYPE_REGISTRY); Registry registry2 = withDimension(dimensionKey, dimensionTypeKey, registry, worldGenSettings.dimensions(), - oLevelStem.map(l -> l.value().generator()).orElseThrow()); + generator); return new WorldGenSettings(worldGenSettings.seed(), worldGenSettings.generateStructures(), worldGenSettings.generateBonusChest(),