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.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 NORMAL = register("normal"); public static final ResourceKey FLAT = register("flat"); public static final ResourceKey LARGE_BIOMES = register("large_biomes"); public static final ResourceKey AMPLIFIED = register("amplified"); public static final ResourceKey SINGLE_BIOME_SURFACE = register("single_biome_surface"); public static final ResourceKey DEBUG = register("debug_all_block_states"); public static void bootstrap(BootstrapContext p_329030_) { new WorldPresets.Bootstrap(p_329030_).bootstrap(); } private static ResourceKey register(String p_226460_) { return ResourceKey.create(Registries.WORLD_PRESET, ResourceLocation.withDefaultNamespace(p_226460_)); } public static Optional> fromSettings(WorldDimensions p_329954_) { return p_329954_.get(LevelStem.OVERWORLD).flatMap(p_341908_ -> { return switch (p_341908_.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 p_369091_) { return p_369091_.lookupOrThrow(Registries.WORLD_PRESET).getOrThrow(NORMAL).value().createWorldDimensions(); } public static LevelStem getNormalOverworld(HolderLookup.Provider p_365099_) { return p_365099_.lookupOrThrow(Registries.WORLD_PRESET).getOrThrow(NORMAL).value().overworld().orElseThrow(); } public static WorldDimensions createFlatWorldDimensions(HolderLookup.Provider p_363959_) { return p_363959_.lookupOrThrow(Registries.WORLD_PRESET).getOrThrow(FLAT).value().createWorldDimensions(); } static class Bootstrap { private final BootstrapContext context; private final HolderGetter noiseSettings; private final HolderGetter biomes; private final HolderGetter placedFeatures; private final HolderGetter structureSets; private final HolderGetter multiNoiseBiomeSourceParameterLists; private final Holder overworldDimensionType; private final LevelStem netherStem; private final LevelStem endStem; Bootstrap(BootstrapContext p_335809_) { this.context = p_335809_; HolderGetter holdergetter = p_335809_.lookup(Registries.DIMENSION_TYPE); this.noiseSettings = p_335809_.lookup(Registries.NOISE_SETTINGS); this.biomes = p_335809_.lookup(Registries.BIOME); this.placedFeatures = p_335809_.lookup(Registries.PLACED_FEATURE); this.structureSets = p_335809_.lookup(Registries.STRUCTURE_SET); this.multiNoiseBiomeSourceParameterLists = p_335809_.lookup(Registries.MULTI_NOISE_BIOME_SOURCE_PARAMETER_LIST); this.overworldDimensionType = holdergetter.getOrThrow(BuiltinDimensionTypes.OVERWORLD); Holder holder = holdergetter.getOrThrow(BuiltinDimensionTypes.NETHER); Holder holder1 = this.noiseSettings.getOrThrow(NoiseGeneratorSettings.NETHER); Holder.Reference reference = this.multiNoiseBiomeSourceParameterLists.getOrThrow(MultiNoiseBiomeSourceParameterLists.NETHER); this.netherStem = new LevelStem(holder, new NoiseBasedChunkGenerator(MultiNoiseBiomeSource.createFromPreset(reference), holder1)); Holder holder2 = holdergetter.getOrThrow(BuiltinDimensionTypes.END); Holder holder3 = this.noiseSettings.getOrThrow(NoiseGeneratorSettings.END); this.endStem = new LevelStem(holder2, new NoiseBasedChunkGenerator(TheEndBiomeSource.create(this.biomes), holder3)); } private LevelStem makeOverworld(ChunkGenerator p_226488_) { return new LevelStem(this.overworldDimensionType, p_226488_); } private LevelStem makeNoiseBasedOverworld(BiomeSource p_226485_, Holder p_226486_) { return this.makeOverworld(new NoiseBasedChunkGenerator(p_226485_, p_226486_)); } private WorldPreset createPresetWithCustomOverworld(LevelStem p_226490_) { return new WorldPreset(Map.of(LevelStem.OVERWORLD, p_226490_, LevelStem.NETHER, this.netherStem, LevelStem.END, this.endStem)); } private void registerCustomOverworldPreset(ResourceKey p_256570_, LevelStem p_256269_) { this.context.register(p_256570_, this.createPresetWithCustomOverworld(p_256269_)); } private void registerOverworlds(BiomeSource p_273133_) { Holder holder = this.noiseSettings.getOrThrow(NoiseGeneratorSettings.OVERWORLD); this.registerCustomOverworldPreset(WorldPresets.NORMAL, this.makeNoiseBasedOverworld(p_273133_, holder)); Holder holder1 = this.noiseSettings.getOrThrow(NoiseGeneratorSettings.LARGE_BIOMES); this.registerCustomOverworldPreset(WorldPresets.LARGE_BIOMES, this.makeNoiseBasedOverworld(p_273133_, holder1)); Holder holder2 = this.noiseSettings.getOrThrow(NoiseGeneratorSettings.AMPLIFIED); this.registerCustomOverworldPreset(WorldPresets.AMPLIFIED, this.makeNoiseBasedOverworld(p_273133_, holder2)); } public void bootstrap() { Holder.Reference reference = this.multiNoiseBiomeSourceParameterLists.getOrThrow(MultiNoiseBiomeSourceParameterLists.OVERWORLD); this.registerOverworlds(MultiNoiseBiomeSource.createFromPreset(reference)); Holder holder = this.noiseSettings.getOrThrow(NoiseGeneratorSettings.OVERWORLD); Holder.Reference reference1 = this.biomes.getOrThrow(Biomes.PLAINS); this.registerCustomOverworldPreset(WorldPresets.SINGLE_BIOME_SURFACE, this.makeNoiseBasedOverworld(new FixedBiomeSource(reference1), 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(reference1))); } } }