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 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 context) { new WorldPresets.Bootstrap(context).bootstrap(); } private static ResourceKey register(String name) { return ResourceKey.create(Registries.WORLD_PRESET, ResourceLocation.withDefaultNamespace(name)); } public static Optional> 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 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 context) { this.context = context; HolderGetter 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 holder = holderGetter.getOrThrow(BuiltinDimensionTypes.NETHER); Holder holder2 = this.noiseSettings.getOrThrow(NoiseGeneratorSettings.NETHER); Reference reference = this.multiNoiseBiomeSourceParameterLists.getOrThrow(MultiNoiseBiomeSourceParameterLists.NETHER); this.netherStem = new LevelStem(holder, new NoiseBasedChunkGenerator(MultiNoiseBiomeSource.createFromPreset(reference), holder2)); Holder holder3 = holderGetter.getOrThrow(BuiltinDimensionTypes.END); Holder 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 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 dimensionKey, LevelStem levelStem) { this.context.register(dimensionKey, this.createPresetWithCustomOverworld(levelStem)); } private void registerOverworlds(BiomeSource biomeSource) { Holder holder = this.noiseSettings.getOrThrow(NoiseGeneratorSettings.OVERWORLD); this.registerCustomOverworldPreset(WorldPresets.NORMAL, this.makeNoiseBasedOverworld(biomeSource, holder)); Holder holder2 = this.noiseSettings.getOrThrow(NoiseGeneratorSettings.LARGE_BIOMES); this.registerCustomOverworldPreset(WorldPresets.LARGE_BIOMES, this.makeNoiseBasedOverworld(biomeSource, holder2)); Holder holder3 = this.noiseSettings.getOrThrow(NoiseGeneratorSettings.AMPLIFIED); this.registerCustomOverworldPreset(WorldPresets.AMPLIFIED, this.makeNoiseBasedOverworld(biomeSource, holder3)); } public void bootstrap() { Reference reference = this.multiNoiseBiomeSourceParameterLists.getOrThrow(MultiNoiseBiomeSourceParameterLists.OVERWORLD); this.registerOverworlds(MultiNoiseBiomeSource.createFromPreset(reference)); Holder holder = this.noiseSettings.getOrThrow(NoiseGeneratorSettings.OVERWORLD); Reference 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))); } } }