139 lines
7.8 KiB
Java
139 lines
7.8 KiB
Java
package net.minecraft.world.level.levelgen.presets;
|
|
|
|
import java.util.Map;
|
|
import java.util.Optional;
|
|
import net.minecraft.core.Holder;
|
|
import net.minecraft.core.HolderGetter;
|
|
import net.minecraft.core.HolderLookup;
|
|
import net.minecraft.core.Holder.Reference;
|
|
import net.minecraft.core.registries.Registries;
|
|
import net.minecraft.data.worldgen.BootstrapContext;
|
|
import net.minecraft.resources.ResourceKey;
|
|
import net.minecraft.resources.ResourceLocation;
|
|
import net.minecraft.world.level.biome.Biome;
|
|
import net.minecraft.world.level.biome.BiomeSource;
|
|
import net.minecraft.world.level.biome.Biomes;
|
|
import net.minecraft.world.level.biome.FixedBiomeSource;
|
|
import net.minecraft.world.level.biome.MultiNoiseBiomeSource;
|
|
import net.minecraft.world.level.biome.MultiNoiseBiomeSourceParameterList;
|
|
import net.minecraft.world.level.biome.MultiNoiseBiomeSourceParameterLists;
|
|
import net.minecraft.world.level.biome.TheEndBiomeSource;
|
|
import net.minecraft.world.level.chunk.ChunkGenerator;
|
|
import net.minecraft.world.level.dimension.BuiltinDimensionTypes;
|
|
import net.minecraft.world.level.dimension.DimensionType;
|
|
import net.minecraft.world.level.dimension.LevelStem;
|
|
import net.minecraft.world.level.levelgen.DebugLevelSource;
|
|
import net.minecraft.world.level.levelgen.FlatLevelSource;
|
|
import net.minecraft.world.level.levelgen.NoiseBasedChunkGenerator;
|
|
import net.minecraft.world.level.levelgen.NoiseGeneratorSettings;
|
|
import net.minecraft.world.level.levelgen.WorldDimensions;
|
|
import net.minecraft.world.level.levelgen.flat.FlatLevelGeneratorSettings;
|
|
import net.minecraft.world.level.levelgen.placement.PlacedFeature;
|
|
import net.minecraft.world.level.levelgen.structure.StructureSet;
|
|
|
|
public class WorldPresets {
|
|
public static final ResourceKey<WorldPreset> NORMAL = register("normal");
|
|
public static final ResourceKey<WorldPreset> FLAT = register("flat");
|
|
public static final ResourceKey<WorldPreset> LARGE_BIOMES = register("large_biomes");
|
|
public static final ResourceKey<WorldPreset> AMPLIFIED = register("amplified");
|
|
public static final ResourceKey<WorldPreset> SINGLE_BIOME_SURFACE = register("single_biome_surface");
|
|
public static final ResourceKey<WorldPreset> DEBUG = register("debug_all_block_states");
|
|
|
|
public static void bootstrap(BootstrapContext<WorldPreset> context) {
|
|
new WorldPresets.Bootstrap(context).bootstrap();
|
|
}
|
|
|
|
private static ResourceKey<WorldPreset> register(String name) {
|
|
return ResourceKey.create(Registries.WORLD_PRESET, ResourceLocation.withDefaultNamespace(name));
|
|
}
|
|
|
|
public static Optional<ResourceKey<WorldPreset>> fromSettings(WorldDimensions worldDimensions) {
|
|
return worldDimensions.get(LevelStem.OVERWORLD).flatMap(levelStem -> {
|
|
return switch (levelStem.generator()) {
|
|
case FlatLevelSource flatLevelSource -> Optional.of(FLAT);
|
|
case DebugLevelSource debugLevelSource -> Optional.of(DEBUG);
|
|
case NoiseBasedChunkGenerator noiseBasedChunkGenerator -> Optional.of(NORMAL);
|
|
default -> Optional.empty();
|
|
};
|
|
});
|
|
}
|
|
|
|
public static WorldDimensions createNormalWorldDimensions(HolderLookup.Provider registries) {
|
|
return registries.lookupOrThrow(Registries.WORLD_PRESET).getOrThrow(NORMAL).value().createWorldDimensions();
|
|
}
|
|
|
|
public static LevelStem getNormalOverworld(HolderLookup.Provider registries) {
|
|
return (LevelStem)registries.lookupOrThrow(Registries.WORLD_PRESET).getOrThrow(NORMAL).value().overworld().orElseThrow();
|
|
}
|
|
|
|
public static WorldDimensions createFlatWorldDimensions(HolderLookup.Provider registries) {
|
|
return registries.lookupOrThrow(Registries.WORLD_PRESET).getOrThrow(FLAT).value().createWorldDimensions();
|
|
}
|
|
|
|
static class Bootstrap {
|
|
private final BootstrapContext<WorldPreset> context;
|
|
private final HolderGetter<NoiseGeneratorSettings> noiseSettings;
|
|
private final HolderGetter<Biome> biomes;
|
|
private final HolderGetter<PlacedFeature> placedFeatures;
|
|
private final HolderGetter<StructureSet> structureSets;
|
|
private final HolderGetter<MultiNoiseBiomeSourceParameterList> multiNoiseBiomeSourceParameterLists;
|
|
private final Holder<DimensionType> overworldDimensionType;
|
|
private final LevelStem netherStem;
|
|
private final LevelStem endStem;
|
|
|
|
Bootstrap(BootstrapContext<WorldPreset> context) {
|
|
this.context = context;
|
|
HolderGetter<DimensionType> holderGetter = context.lookup(Registries.DIMENSION_TYPE);
|
|
this.noiseSettings = context.lookup(Registries.NOISE_SETTINGS);
|
|
this.biomes = context.lookup(Registries.BIOME);
|
|
this.placedFeatures = context.lookup(Registries.PLACED_FEATURE);
|
|
this.structureSets = context.lookup(Registries.STRUCTURE_SET);
|
|
this.multiNoiseBiomeSourceParameterLists = context.lookup(Registries.MULTI_NOISE_BIOME_SOURCE_PARAMETER_LIST);
|
|
this.overworldDimensionType = holderGetter.getOrThrow(BuiltinDimensionTypes.OVERWORLD);
|
|
Holder<DimensionType> holder = holderGetter.getOrThrow(BuiltinDimensionTypes.NETHER);
|
|
Holder<NoiseGeneratorSettings> holder2 = this.noiseSettings.getOrThrow(NoiseGeneratorSettings.NETHER);
|
|
Reference<MultiNoiseBiomeSourceParameterList> reference = this.multiNoiseBiomeSourceParameterLists.getOrThrow(MultiNoiseBiomeSourceParameterLists.NETHER);
|
|
this.netherStem = new LevelStem(holder, new NoiseBasedChunkGenerator(MultiNoiseBiomeSource.createFromPreset(reference), holder2));
|
|
Holder<DimensionType> holder3 = holderGetter.getOrThrow(BuiltinDimensionTypes.END);
|
|
Holder<NoiseGeneratorSettings> holder4 = this.noiseSettings.getOrThrow(NoiseGeneratorSettings.END);
|
|
this.endStem = new LevelStem(holder3, new NoiseBasedChunkGenerator(TheEndBiomeSource.create(this.biomes), holder4));
|
|
}
|
|
|
|
private LevelStem makeOverworld(ChunkGenerator generator) {
|
|
return new LevelStem(this.overworldDimensionType, generator);
|
|
}
|
|
|
|
private LevelStem makeNoiseBasedOverworld(BiomeSource biomeSource, Holder<NoiseGeneratorSettings> settings) {
|
|
return this.makeOverworld(new NoiseBasedChunkGenerator(biomeSource, settings));
|
|
}
|
|
|
|
private WorldPreset createPresetWithCustomOverworld(LevelStem overworldStem) {
|
|
return new WorldPreset(Map.of(LevelStem.OVERWORLD, overworldStem, LevelStem.NETHER, this.netherStem, LevelStem.END, this.endStem));
|
|
}
|
|
|
|
private void registerCustomOverworldPreset(ResourceKey<WorldPreset> dimensionKey, LevelStem levelStem) {
|
|
this.context.register(dimensionKey, this.createPresetWithCustomOverworld(levelStem));
|
|
}
|
|
|
|
private void registerOverworlds(BiomeSource biomeSource) {
|
|
Holder<NoiseGeneratorSettings> holder = this.noiseSettings.getOrThrow(NoiseGeneratorSettings.OVERWORLD);
|
|
this.registerCustomOverworldPreset(WorldPresets.NORMAL, this.makeNoiseBasedOverworld(biomeSource, holder));
|
|
Holder<NoiseGeneratorSettings> holder2 = this.noiseSettings.getOrThrow(NoiseGeneratorSettings.LARGE_BIOMES);
|
|
this.registerCustomOverworldPreset(WorldPresets.LARGE_BIOMES, this.makeNoiseBasedOverworld(biomeSource, holder2));
|
|
Holder<NoiseGeneratorSettings> holder3 = this.noiseSettings.getOrThrow(NoiseGeneratorSettings.AMPLIFIED);
|
|
this.registerCustomOverworldPreset(WorldPresets.AMPLIFIED, this.makeNoiseBasedOverworld(biomeSource, holder3));
|
|
}
|
|
|
|
public void bootstrap() {
|
|
Reference<MultiNoiseBiomeSourceParameterList> reference = this.multiNoiseBiomeSourceParameterLists.getOrThrow(MultiNoiseBiomeSourceParameterLists.OVERWORLD);
|
|
this.registerOverworlds(MultiNoiseBiomeSource.createFromPreset(reference));
|
|
Holder<NoiseGeneratorSettings> holder = this.noiseSettings.getOrThrow(NoiseGeneratorSettings.OVERWORLD);
|
|
Reference<Biome> reference2 = this.biomes.getOrThrow(Biomes.PLAINS);
|
|
this.registerCustomOverworldPreset(WorldPresets.SINGLE_BIOME_SURFACE, this.makeNoiseBasedOverworld(new FixedBiomeSource(reference2), holder));
|
|
this.registerCustomOverworldPreset(
|
|
WorldPresets.FLAT, this.makeOverworld(new FlatLevelSource(FlatLevelGeneratorSettings.getDefault(this.biomes, this.structureSets, this.placedFeatures)))
|
|
);
|
|
this.registerCustomOverworldPreset(WorldPresets.DEBUG, this.makeOverworld(new DebugLevelSource(reference2)));
|
|
}
|
|
}
|
|
}
|