Create new Generator with settings from DataPack

This commit is contained in:
Frank 2022-05-23 01:25:32 +02:00
parent 781d6d4709
commit f4f2e85432
3 changed files with 52 additions and 6 deletions

View file

@ -1,11 +1,13 @@
package org.betterx.bclib.interfaces; package org.betterx.bclib.interfaces;
import net.minecraft.core.Holder;
import net.minecraft.core.Registry; import net.minecraft.core.Registry;
import net.minecraft.world.level.levelgen.NoiseGeneratorSettings; import net.minecraft.world.level.levelgen.NoiseGeneratorSettings;
import net.minecraft.world.level.levelgen.synth.NormalNoise; import net.minecraft.world.level.levelgen.synth.NormalNoise;
public interface NoiseGeneratorSettingsProvider { public interface NoiseGeneratorSettingsProvider {
NoiseGeneratorSettings bclib_getNoiseGeneratorSettings(); NoiseGeneratorSettings bclib_getNoiseGeneratorSettings();
Holder<NoiseGeneratorSettings> bclib_getNoiseGeneratorSettingHolders();
Registry<NormalNoise.NoiseParameters> bclib_getNoises(); Registry<NormalNoise.NoiseParameters> bclib_getNoises();
} }

View file

@ -39,6 +39,11 @@ public abstract class NoiseBasedChunkGeneratorMixin implements SurfaceProvider,
return settings.value(); return settings.value();
} }
@Override
public Holder<NoiseGeneratorSettings> bclib_getNoiseGeneratorSettingHolders() {
return settings;
}
@Override @Override
public Registry<NormalNoise.NoiseParameters> bclib_getNoises() { public Registry<NormalNoise.NoiseParameters> bclib_getNoises() {
return noises; return noises;

View file

@ -24,6 +24,8 @@ import com.mojang.serialization.Lifecycle;
import org.betterx.bclib.BCLib; import org.betterx.bclib.BCLib;
import org.betterx.bclib.api.tag.TagAPI; import org.betterx.bclib.api.tag.TagAPI;
import org.betterx.bclib.api.tag.TagType; 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.BCLBiomeSource;
import org.betterx.bclib.world.generator.BCLibEndBiomeSource; import org.betterx.bclib.world.generator.BCLibEndBiomeSource;
import org.betterx.bclib.world.generator.BCLibNetherBiomeSource; import org.betterx.bclib.world.generator.BCLibNetherBiomeSource;
@ -136,8 +138,6 @@ public class WorldPresets {
ResourceKey<DimensionType> dimensionTypeKey, ResourceKey<DimensionType> dimensionTypeKey,
WorldGenSettings settings) { WorldGenSettings settings) {
var oldNether = settings.dimensions().getHolder(dimensionKey); var oldNether = settings.dimensions().getHolder(dimensionKey);
//TODO: Make sure our BiomeSource reuses the BiomeList from the Datapack Source
int loaderVersion = BCLChunkGenerator.getBiomeVersionForGenerator(oldNether int loaderVersion = BCLChunkGenerator.getBiomeVersionForGenerator(oldNether
.map(h -> h.value().generator()) .map(h -> h.value().generator())
.orElse(null)); .orElse(null));
@ -145,12 +145,38 @@ public class WorldPresets {
int targetVersion = BCLChunkGenerator.getBiomeVersionForCurrentWorld(dimensionKey); int targetVersion = BCLChunkGenerator.getBiomeVersionForCurrentWorld(dimensionKey);
if (loaderVersion != targetVersion) { if (loaderVersion != targetVersion) {
BCLib.LOGGER.info("Enforcing Correct Generator for " + dimensionKey.location().toString() + "."); BCLib.LOGGER.info("Enforcing Correct Generator for " + dimensionKey.location().toString() + ".");
var chunkGenerator = oldNether.map(h -> h.value().generator()).orElse(null);
RegistryAccess access = RegistryAccess.builtinCopy(); RegistryAccess access = RegistryAccess.builtinCopy();
return WorldPresets.replaceGenerator(dimensionKey, Optional<Holder<LevelStem>> refLevelStem = BCLChunkGenerator.referenceStemForVersion(
dimensionTypeKey, dimensionKey,
targetVersion, targetVersion,
access, 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; return settings;
} }
@ -170,11 +196,24 @@ public class WorldPresets {
worldGenSettings.generateStructures(), worldGenSettings.generateStructures(),
worldGenSettings.generateStructures() worldGenSettings.generateStructures()
); );
return replaceGenerator(dimensionKey,
dimensionTypeKey,
registryAccess,
worldGenSettings,
oLevelStem.map(l -> l.value().generator()).orElseThrow());
}
public static WorldGenSettings replaceGenerator(
ResourceKey<LevelStem> dimensionKey,
ResourceKey<DimensionType> dimensionTypeKey,
RegistryAccess registryAccess,
WorldGenSettings worldGenSettings,
ChunkGenerator generator
) {
Registry<DimensionType> registry = registryAccess.registryOrThrow(Registry.DIMENSION_TYPE_REGISTRY); Registry<DimensionType> registry = registryAccess.registryOrThrow(Registry.DIMENSION_TYPE_REGISTRY);
Registry<LevelStem> registry2 = withDimension(dimensionKey, dimensionTypeKey, registry, Registry<LevelStem> registry2 = withDimension(dimensionKey, dimensionTypeKey, registry,
worldGenSettings.dimensions(), worldGenSettings.dimensions(),
oLevelStem.map(l -> l.value().generator()).orElseThrow()); generator);
return new WorldGenSettings(worldGenSettings.seed(), return new WorldGenSettings(worldGenSettings.seed(),
worldGenSettings.generateStructures(), worldGenSettings.generateStructures(),
worldGenSettings.generateBonusChest(), worldGenSettings.generateBonusChest(),