Create new Generator with settings from DataPack
This commit is contained in:
parent
781d6d4709
commit
f4f2e85432
3 changed files with 52 additions and 6 deletions
|
@ -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();
|
||||||
}
|
}
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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(),
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue