package net.minecraft.world.level.biome; import com.mojang.datafixers.util.Pair; import java.util.List; import java.util.function.Consumer; import net.minecraft.SharedConstants; import net.minecraft.core.HolderGetter; import net.minecraft.core.HolderLookup; import net.minecraft.core.registries.Registries; import net.minecraft.data.registries.VanillaRegistries; import net.minecraft.data.worldgen.TerrainProvider; import net.minecraft.resources.ResourceKey; import net.minecraft.util.CubicSpline; import net.minecraft.util.ToFloatFunction; import net.minecraft.util.VisibleForDebug; import net.minecraft.world.level.levelgen.DensityFunction; import net.minecraft.world.level.levelgen.DensityFunctions; import net.minecraft.world.level.levelgen.NoiseRouterData; public final class OverworldBiomeBuilder { private static final float VALLEY_SIZE = 0.05F; private static final float LOW_START = 0.26666668F; public static final float HIGH_START = 0.4F; private static final float HIGH_END = 0.93333334F; private static final float PEAK_SIZE = 0.1F; public static final float PEAK_START = 0.56666666F; private static final float PEAK_END = 0.7666667F; public static final float NEAR_INLAND_START = -0.11F; public static final float MID_INLAND_START = 0.03F; public static final float FAR_INLAND_START = 0.3F; public static final float EROSION_INDEX_1_START = -0.78F; public static final float EROSION_INDEX_2_START = -0.375F; private static final float EROSION_DEEP_DARK_DRYNESS_THRESHOLD = -0.225F; private static final float DEPTH_DEEP_DARK_DRYNESS_THRESHOLD = 0.9F; private final Climate.Parameter FULL_RANGE = Climate.Parameter.span(-1.0F, 1.0F); private final Climate.Parameter[] temperatures = new Climate.Parameter[]{ Climate.Parameter.span(-1.0F, -0.45F), Climate.Parameter.span(-0.45F, -0.15F), Climate.Parameter.span(-0.15F, 0.2F), Climate.Parameter.span(0.2F, 0.55F), Climate.Parameter.span(0.55F, 1.0F) }; private final Climate.Parameter[] humidities = new Climate.Parameter[]{ Climate.Parameter.span(-1.0F, -0.35F), Climate.Parameter.span(-0.35F, -0.1F), Climate.Parameter.span(-0.1F, 0.1F), Climate.Parameter.span(0.1F, 0.3F), Climate.Parameter.span(0.3F, 1.0F) }; private final Climate.Parameter[] erosions = new Climate.Parameter[]{ Climate.Parameter.span(-1.0F, -0.78F), Climate.Parameter.span(-0.78F, -0.375F), Climate.Parameter.span(-0.375F, -0.2225F), Climate.Parameter.span(-0.2225F, 0.05F), Climate.Parameter.span(0.05F, 0.45F), Climate.Parameter.span(0.45F, 0.55F), Climate.Parameter.span(0.55F, 1.0F) }; private final Climate.Parameter FROZEN_RANGE = this.temperatures[0]; private final Climate.Parameter UNFROZEN_RANGE = Climate.Parameter.span(this.temperatures[1], this.temperatures[4]); private final Climate.Parameter mushroomFieldsContinentalness = Climate.Parameter.span(-1.2F, -1.05F); private final Climate.Parameter deepOceanContinentalness = Climate.Parameter.span(-1.05F, -0.455F); private final Climate.Parameter oceanContinentalness = Climate.Parameter.span(-0.455F, -0.19F); private final Climate.Parameter coastContinentalness = Climate.Parameter.span(-0.19F, -0.11F); private final Climate.Parameter inlandContinentalness = Climate.Parameter.span(-0.11F, 0.55F); private final Climate.Parameter nearInlandContinentalness = Climate.Parameter.span(-0.11F, 0.03F); private final Climate.Parameter midInlandContinentalness = Climate.Parameter.span(0.03F, 0.3F); private final Climate.Parameter farInlandContinentalness = Climate.Parameter.span(0.3F, 1.0F); private final ResourceKey[][] OCEANS = new ResourceKey[][]{ {Biomes.DEEP_FROZEN_OCEAN, Biomes.DEEP_COLD_OCEAN, Biomes.DEEP_OCEAN, Biomes.DEEP_LUKEWARM_OCEAN, Biomes.WARM_OCEAN}, {Biomes.FROZEN_OCEAN, Biomes.COLD_OCEAN, Biomes.OCEAN, Biomes.LUKEWARM_OCEAN, Biomes.WARM_OCEAN} }; private final ResourceKey[][] MIDDLE_BIOMES = new ResourceKey[][]{ {Biomes.SNOWY_PLAINS, Biomes.SNOWY_PLAINS, Biomes.SNOWY_PLAINS, Biomes.SNOWY_TAIGA, Biomes.TAIGA}, {Biomes.PLAINS, Biomes.PLAINS, Biomes.FOREST, Biomes.TAIGA, Biomes.OLD_GROWTH_SPRUCE_TAIGA}, {Biomes.FLOWER_FOREST, Biomes.PLAINS, Biomes.FOREST, Biomes.BIRCH_FOREST, Biomes.DARK_FOREST}, {Biomes.SAVANNA, Biomes.SAVANNA, Biomes.FOREST, Biomes.JUNGLE, Biomes.JUNGLE}, {Biomes.DESERT, Biomes.DESERT, Biomes.DESERT, Biomes.DESERT, Biomes.DESERT} }; private final ResourceKey[][] MIDDLE_BIOMES_VARIANT = new ResourceKey[][]{ {Biomes.ICE_SPIKES, null, Biomes.SNOWY_TAIGA, null, null}, {null, null, null, null, Biomes.OLD_GROWTH_PINE_TAIGA}, {Biomes.SUNFLOWER_PLAINS, null, null, Biomes.OLD_GROWTH_BIRCH_FOREST, null}, {null, null, Biomes.PLAINS, Biomes.SPARSE_JUNGLE, Biomes.BAMBOO_JUNGLE}, {null, null, null, null, null} }; private final ResourceKey[][] PLATEAU_BIOMES = new ResourceKey[][]{ {Biomes.SNOWY_PLAINS, Biomes.SNOWY_PLAINS, Biomes.SNOWY_PLAINS, Biomes.SNOWY_TAIGA, Biomes.SNOWY_TAIGA}, {Biomes.MEADOW, Biomes.MEADOW, Biomes.FOREST, Biomes.TAIGA, Biomes.OLD_GROWTH_SPRUCE_TAIGA}, {Biomes.MEADOW, Biomes.MEADOW, Biomes.MEADOW, Biomes.MEADOW, Biomes.PALE_GARDEN}, {Biomes.SAVANNA_PLATEAU, Biomes.SAVANNA_PLATEAU, Biomes.FOREST, Biomes.FOREST, Biomes.JUNGLE}, {Biomes.BADLANDS, Biomes.BADLANDS, Biomes.BADLANDS, Biomes.WOODED_BADLANDS, Biomes.WOODED_BADLANDS} }; private final ResourceKey[][] PLATEAU_BIOMES_VARIANT = new ResourceKey[][]{ {Biomes.ICE_SPIKES, null, null, null, null}, {Biomes.CHERRY_GROVE, null, Biomes.MEADOW, Biomes.MEADOW, Biomes.OLD_GROWTH_PINE_TAIGA}, {Biomes.CHERRY_GROVE, Biomes.CHERRY_GROVE, Biomes.FOREST, Biomes.BIRCH_FOREST, null}, {null, null, null, null, null}, {Biomes.ERODED_BADLANDS, Biomes.ERODED_BADLANDS, null, null, null} }; private final ResourceKey[][] SHATTERED_BIOMES = new ResourceKey[][]{ {Biomes.WINDSWEPT_GRAVELLY_HILLS, Biomes.WINDSWEPT_GRAVELLY_HILLS, Biomes.WINDSWEPT_HILLS, Biomes.WINDSWEPT_FOREST, Biomes.WINDSWEPT_FOREST}, {Biomes.WINDSWEPT_GRAVELLY_HILLS, Biomes.WINDSWEPT_GRAVELLY_HILLS, Biomes.WINDSWEPT_HILLS, Biomes.WINDSWEPT_FOREST, Biomes.WINDSWEPT_FOREST}, {Biomes.WINDSWEPT_HILLS, Biomes.WINDSWEPT_HILLS, Biomes.WINDSWEPT_HILLS, Biomes.WINDSWEPT_FOREST, Biomes.WINDSWEPT_FOREST}, {null, null, null, null, null}, {null, null, null, null, null} }; public List spawnTarget() { Climate.Parameter climate$parameter = Climate.Parameter.point(0.0F); float f = 0.16F; return List.of( new Climate.ParameterPoint( this.FULL_RANGE, this.FULL_RANGE, Climate.Parameter.span(this.inlandContinentalness, this.FULL_RANGE), this.FULL_RANGE, climate$parameter, Climate.Parameter.span(-1.0F, -0.16F), 0L ), new Climate.ParameterPoint( this.FULL_RANGE, this.FULL_RANGE, Climate.Parameter.span(this.inlandContinentalness, this.FULL_RANGE), this.FULL_RANGE, climate$parameter, Climate.Parameter.span(0.16F, 1.0F), 0L ) ); } protected void addBiomes(Consumer>> p_187176_) { if (SharedConstants.debugGenerateSquareTerrainWithoutNoise) { this.addDebugBiomes(p_187176_); } else { this.addOffCoastBiomes(p_187176_); this.addInlandBiomes(p_187176_); this.addUndergroundBiomes(p_187176_); } } private void addDebugBiomes(Consumer>> p_256276_) { HolderLookup.Provider holderlookup$provider = VanillaRegistries.createLookup(); HolderGetter holdergetter = holderlookup$provider.lookupOrThrow(Registries.DENSITY_FUNCTION); DensityFunctions.Spline.Coordinate densityfunctions$spline$coordinate = new DensityFunctions.Spline.Coordinate( holdergetter.getOrThrow(NoiseRouterData.CONTINENTS) ); DensityFunctions.Spline.Coordinate densityfunctions$spline$coordinate1 = new DensityFunctions.Spline.Coordinate( holdergetter.getOrThrow(NoiseRouterData.EROSION) ); DensityFunctions.Spline.Coordinate densityfunctions$spline$coordinate2 = new DensityFunctions.Spline.Coordinate( holdergetter.getOrThrow(NoiseRouterData.RIDGES_FOLDED) ); p_256276_.accept( Pair.of( Climate.parameters(this.FULL_RANGE, this.FULL_RANGE, this.FULL_RANGE, this.FULL_RANGE, Climate.Parameter.point(0.0F), this.FULL_RANGE, 0.01F), Biomes.PLAINS ) ); if (TerrainProvider.buildErosionOffsetSpline( densityfunctions$spline$coordinate1, densityfunctions$spline$coordinate2, -0.15F, 0.0F, 0.0F, 0.1F, 0.0F, -0.03F, false, false, ToFloatFunction.IDENTITY ) instanceof CubicSpline.Multipoint multipoint) { ResourceKey resourcekey = Biomes.DESERT; for (float f : multipoint.locations()) { p_256276_.accept( Pair.of( Climate.parameters( this.FULL_RANGE, this.FULL_RANGE, this.FULL_RANGE, Climate.Parameter.point(f), Climate.Parameter.point(0.0F), this.FULL_RANGE, 0.0F ), resourcekey ) ); resourcekey = resourcekey == Biomes.DESERT ? Biomes.BADLANDS : Biomes.DESERT; } } if (TerrainProvider.overworldOffset(densityfunctions$spline$coordinate, densityfunctions$spline$coordinate1, densityfunctions$spline$coordinate2, false) instanceof CubicSpline.Multipoint multipoint1 ) { for (float f1 : multipoint1.locations()) { p_256276_.accept( Pair.of( Climate.parameters( this.FULL_RANGE, this.FULL_RANGE, Climate.Parameter.point(f1), this.FULL_RANGE, Climate.Parameter.point(0.0F), this.FULL_RANGE, 0.0F ), Biomes.SNOWY_TAIGA ) ); } } } private void addOffCoastBiomes(Consumer>> p_187196_) { this.addSurfaceBiome(p_187196_, this.FULL_RANGE, this.FULL_RANGE, this.mushroomFieldsContinentalness, this.FULL_RANGE, this.FULL_RANGE, 0.0F, Biomes.MUSHROOM_FIELDS); for (int i = 0; i < this.temperatures.length; i++) { Climate.Parameter climate$parameter = this.temperatures[i]; this.addSurfaceBiome(p_187196_, climate$parameter, this.FULL_RANGE, this.deepOceanContinentalness, this.FULL_RANGE, this.FULL_RANGE, 0.0F, this.OCEANS[0][i]); this.addSurfaceBiome(p_187196_, climate$parameter, this.FULL_RANGE, this.oceanContinentalness, this.FULL_RANGE, this.FULL_RANGE, 0.0F, this.OCEANS[1][i]); } } private void addInlandBiomes(Consumer>> p_187216_) { this.addMidSlice(p_187216_, Climate.Parameter.span(-1.0F, -0.93333334F)); this.addHighSlice(p_187216_, Climate.Parameter.span(-0.93333334F, -0.7666667F)); this.addPeaks(p_187216_, Climate.Parameter.span(-0.7666667F, -0.56666666F)); this.addHighSlice(p_187216_, Climate.Parameter.span(-0.56666666F, -0.4F)); this.addMidSlice(p_187216_, Climate.Parameter.span(-0.4F, -0.26666668F)); this.addLowSlice(p_187216_, Climate.Parameter.span(-0.26666668F, -0.05F)); this.addValleys(p_187216_, Climate.Parameter.span(-0.05F, 0.05F)); this.addLowSlice(p_187216_, Climate.Parameter.span(0.05F, 0.26666668F)); this.addMidSlice(p_187216_, Climate.Parameter.span(0.26666668F, 0.4F)); this.addHighSlice(p_187216_, Climate.Parameter.span(0.4F, 0.56666666F)); this.addPeaks(p_187216_, Climate.Parameter.span(0.56666666F, 0.7666667F)); this.addHighSlice(p_187216_, Climate.Parameter.span(0.7666667F, 0.93333334F)); this.addMidSlice(p_187216_, Climate.Parameter.span(0.93333334F, 1.0F)); } private void addPeaks(Consumer>> p_187178_, Climate.Parameter p_187179_) { for (int i = 0; i < this.temperatures.length; i++) { Climate.Parameter climate$parameter = this.temperatures[i]; for (int j = 0; j < this.humidities.length; j++) { Climate.Parameter climate$parameter1 = this.humidities[j]; ResourceKey resourcekey = this.pickMiddleBiome(i, j, p_187179_); ResourceKey resourcekey1 = this.pickMiddleBiomeOrBadlandsIfHot(i, j, p_187179_); ResourceKey resourcekey2 = this.pickMiddleBiomeOrBadlandsIfHotOrSlopeIfCold(i, j, p_187179_); ResourceKey resourcekey3 = this.pickPlateauBiome(i, j, p_187179_); ResourceKey resourcekey4 = this.pickShatteredBiome(i, j, p_187179_); ResourceKey resourcekey5 = this.maybePickWindsweptSavannaBiome(i, j, p_187179_, resourcekey4); ResourceKey resourcekey6 = this.pickPeakBiome(i, j, p_187179_); this.addSurfaceBiome( p_187178_, climate$parameter, climate$parameter1, Climate.Parameter.span(this.coastContinentalness, this.farInlandContinentalness), this.erosions[0], p_187179_, 0.0F, resourcekey6 ); this.addSurfaceBiome( p_187178_, climate$parameter, climate$parameter1, Climate.Parameter.span(this.coastContinentalness, this.nearInlandContinentalness), this.erosions[1], p_187179_, 0.0F, resourcekey2 ); this.addSurfaceBiome( p_187178_, climate$parameter, climate$parameter1, Climate.Parameter.span(this.midInlandContinentalness, this.farInlandContinentalness), this.erosions[1], p_187179_, 0.0F, resourcekey6 ); this.addSurfaceBiome( p_187178_, climate$parameter, climate$parameter1, Climate.Parameter.span(this.coastContinentalness, this.nearInlandContinentalness), Climate.Parameter.span(this.erosions[2], this.erosions[3]), p_187179_, 0.0F, resourcekey ); this.addSurfaceBiome( p_187178_, climate$parameter, climate$parameter1, Climate.Parameter.span(this.midInlandContinentalness, this.farInlandContinentalness), this.erosions[2], p_187179_, 0.0F, resourcekey3 ); this.addSurfaceBiome(p_187178_, climate$parameter, climate$parameter1, this.midInlandContinentalness, this.erosions[3], p_187179_, 0.0F, resourcekey1); this.addSurfaceBiome(p_187178_, climate$parameter, climate$parameter1, this.farInlandContinentalness, this.erosions[3], p_187179_, 0.0F, resourcekey3); this.addSurfaceBiome( p_187178_, climate$parameter, climate$parameter1, Climate.Parameter.span(this.coastContinentalness, this.farInlandContinentalness), this.erosions[4], p_187179_, 0.0F, resourcekey ); this.addSurfaceBiome( p_187178_, climate$parameter, climate$parameter1, Climate.Parameter.span(this.coastContinentalness, this.nearInlandContinentalness), this.erosions[5], p_187179_, 0.0F, resourcekey5 ); this.addSurfaceBiome( p_187178_, climate$parameter, climate$parameter1, Climate.Parameter.span(this.midInlandContinentalness, this.farInlandContinentalness), this.erosions[5], p_187179_, 0.0F, resourcekey4 ); this.addSurfaceBiome( p_187178_, climate$parameter, climate$parameter1, Climate.Parameter.span(this.coastContinentalness, this.farInlandContinentalness), this.erosions[6], p_187179_, 0.0F, resourcekey ); } } } private void addHighSlice(Consumer>> p_187198_, Climate.Parameter p_187199_) { for (int i = 0; i < this.temperatures.length; i++) { Climate.Parameter climate$parameter = this.temperatures[i]; for (int j = 0; j < this.humidities.length; j++) { Climate.Parameter climate$parameter1 = this.humidities[j]; ResourceKey resourcekey = this.pickMiddleBiome(i, j, p_187199_); ResourceKey resourcekey1 = this.pickMiddleBiomeOrBadlandsIfHot(i, j, p_187199_); ResourceKey resourcekey2 = this.pickMiddleBiomeOrBadlandsIfHotOrSlopeIfCold(i, j, p_187199_); ResourceKey resourcekey3 = this.pickPlateauBiome(i, j, p_187199_); ResourceKey resourcekey4 = this.pickShatteredBiome(i, j, p_187199_); ResourceKey resourcekey5 = this.maybePickWindsweptSavannaBiome(i, j, p_187199_, resourcekey); ResourceKey resourcekey6 = this.pickSlopeBiome(i, j, p_187199_); ResourceKey resourcekey7 = this.pickPeakBiome(i, j, p_187199_); this.addSurfaceBiome( p_187198_, climate$parameter, climate$parameter1, this.coastContinentalness, Climate.Parameter.span(this.erosions[0], this.erosions[1]), p_187199_, 0.0F, resourcekey ); this.addSurfaceBiome(p_187198_, climate$parameter, climate$parameter1, this.nearInlandContinentalness, this.erosions[0], p_187199_, 0.0F, resourcekey6); this.addSurfaceBiome( p_187198_, climate$parameter, climate$parameter1, Climate.Parameter.span(this.midInlandContinentalness, this.farInlandContinentalness), this.erosions[0], p_187199_, 0.0F, resourcekey7 ); this.addSurfaceBiome(p_187198_, climate$parameter, climate$parameter1, this.nearInlandContinentalness, this.erosions[1], p_187199_, 0.0F, resourcekey2); this.addSurfaceBiome( p_187198_, climate$parameter, climate$parameter1, Climate.Parameter.span(this.midInlandContinentalness, this.farInlandContinentalness), this.erosions[1], p_187199_, 0.0F, resourcekey6 ); this.addSurfaceBiome( p_187198_, climate$parameter, climate$parameter1, Climate.Parameter.span(this.coastContinentalness, this.nearInlandContinentalness), Climate.Parameter.span(this.erosions[2], this.erosions[3]), p_187199_, 0.0F, resourcekey ); this.addSurfaceBiome( p_187198_, climate$parameter, climate$parameter1, Climate.Parameter.span(this.midInlandContinentalness, this.farInlandContinentalness), this.erosions[2], p_187199_, 0.0F, resourcekey3 ); this.addSurfaceBiome(p_187198_, climate$parameter, climate$parameter1, this.midInlandContinentalness, this.erosions[3], p_187199_, 0.0F, resourcekey1); this.addSurfaceBiome(p_187198_, climate$parameter, climate$parameter1, this.farInlandContinentalness, this.erosions[3], p_187199_, 0.0F, resourcekey3); this.addSurfaceBiome( p_187198_, climate$parameter, climate$parameter1, Climate.Parameter.span(this.coastContinentalness, this.farInlandContinentalness), this.erosions[4], p_187199_, 0.0F, resourcekey ); this.addSurfaceBiome( p_187198_, climate$parameter, climate$parameter1, Climate.Parameter.span(this.coastContinentalness, this.nearInlandContinentalness), this.erosions[5], p_187199_, 0.0F, resourcekey5 ); this.addSurfaceBiome( p_187198_, climate$parameter, climate$parameter1, Climate.Parameter.span(this.midInlandContinentalness, this.farInlandContinentalness), this.erosions[5], p_187199_, 0.0F, resourcekey4 ); this.addSurfaceBiome( p_187198_, climate$parameter, climate$parameter1, Climate.Parameter.span(this.coastContinentalness, this.farInlandContinentalness), this.erosions[6], p_187199_, 0.0F, resourcekey ); } } } private void addMidSlice(Consumer>> p_187218_, Climate.Parameter p_187219_) { this.addSurfaceBiome( p_187218_, this.FULL_RANGE, this.FULL_RANGE, this.coastContinentalness, Climate.Parameter.span(this.erosions[0], this.erosions[2]), p_187219_, 0.0F, Biomes.STONY_SHORE ); this.addSurfaceBiome( p_187218_, Climate.Parameter.span(this.temperatures[1], this.temperatures[2]), this.FULL_RANGE, Climate.Parameter.span(this.nearInlandContinentalness, this.farInlandContinentalness), this.erosions[6], p_187219_, 0.0F, Biomes.SWAMP ); this.addSurfaceBiome( p_187218_, Climate.Parameter.span(this.temperatures[3], this.temperatures[4]), this.FULL_RANGE, Climate.Parameter.span(this.nearInlandContinentalness, this.farInlandContinentalness), this.erosions[6], p_187219_, 0.0F, Biomes.MANGROVE_SWAMP ); for (int i = 0; i < this.temperatures.length; i++) { Climate.Parameter climate$parameter = this.temperatures[i]; for (int j = 0; j < this.humidities.length; j++) { Climate.Parameter climate$parameter1 = this.humidities[j]; ResourceKey resourcekey = this.pickMiddleBiome(i, j, p_187219_); ResourceKey resourcekey1 = this.pickMiddleBiomeOrBadlandsIfHot(i, j, p_187219_); ResourceKey resourcekey2 = this.pickMiddleBiomeOrBadlandsIfHotOrSlopeIfCold(i, j, p_187219_); ResourceKey resourcekey3 = this.pickShatteredBiome(i, j, p_187219_); ResourceKey resourcekey4 = this.pickPlateauBiome(i, j, p_187219_); ResourceKey resourcekey5 = this.pickBeachBiome(i, j); ResourceKey resourcekey6 = this.maybePickWindsweptSavannaBiome(i, j, p_187219_, resourcekey); ResourceKey resourcekey7 = this.pickShatteredCoastBiome(i, j, p_187219_); ResourceKey resourcekey8 = this.pickSlopeBiome(i, j, p_187219_); this.addSurfaceBiome( p_187218_, climate$parameter, climate$parameter1, Climate.Parameter.span(this.nearInlandContinentalness, this.farInlandContinentalness), this.erosions[0], p_187219_, 0.0F, resourcekey8 ); this.addSurfaceBiome( p_187218_, climate$parameter, climate$parameter1, Climate.Parameter.span(this.nearInlandContinentalness, this.midInlandContinentalness), this.erosions[1], p_187219_, 0.0F, resourcekey2 ); this.addSurfaceBiome( p_187218_, climate$parameter, climate$parameter1, this.farInlandContinentalness, this.erosions[1], p_187219_, 0.0F, i == 0 ? resourcekey8 : resourcekey4 ); this.addSurfaceBiome(p_187218_, climate$parameter, climate$parameter1, this.nearInlandContinentalness, this.erosions[2], p_187219_, 0.0F, resourcekey); this.addSurfaceBiome(p_187218_, climate$parameter, climate$parameter1, this.midInlandContinentalness, this.erosions[2], p_187219_, 0.0F, resourcekey1); this.addSurfaceBiome(p_187218_, climate$parameter, climate$parameter1, this.farInlandContinentalness, this.erosions[2], p_187219_, 0.0F, resourcekey4); this.addSurfaceBiome( p_187218_, climate$parameter, climate$parameter1, Climate.Parameter.span(this.coastContinentalness, this.nearInlandContinentalness), this.erosions[3], p_187219_, 0.0F, resourcekey ); this.addSurfaceBiome( p_187218_, climate$parameter, climate$parameter1, Climate.Parameter.span(this.midInlandContinentalness, this.farInlandContinentalness), this.erosions[3], p_187219_, 0.0F, resourcekey1 ); if (p_187219_.max() < 0L) { this.addSurfaceBiome(p_187218_, climate$parameter, climate$parameter1, this.coastContinentalness, this.erosions[4], p_187219_, 0.0F, resourcekey5); this.addSurfaceBiome( p_187218_, climate$parameter, climate$parameter1, Climate.Parameter.span(this.nearInlandContinentalness, this.farInlandContinentalness), this.erosions[4], p_187219_, 0.0F, resourcekey ); } else { this.addSurfaceBiome( p_187218_, climate$parameter, climate$parameter1, Climate.Parameter.span(this.coastContinentalness, this.farInlandContinentalness), this.erosions[4], p_187219_, 0.0F, resourcekey ); } this.addSurfaceBiome(p_187218_, climate$parameter, climate$parameter1, this.coastContinentalness, this.erosions[5], p_187219_, 0.0F, resourcekey7); this.addSurfaceBiome(p_187218_, climate$parameter, climate$parameter1, this.nearInlandContinentalness, this.erosions[5], p_187219_, 0.0F, resourcekey6); this.addSurfaceBiome( p_187218_, climate$parameter, climate$parameter1, Climate.Parameter.span(this.midInlandContinentalness, this.farInlandContinentalness), this.erosions[5], p_187219_, 0.0F, resourcekey3 ); if (p_187219_.max() < 0L) { this.addSurfaceBiome(p_187218_, climate$parameter, climate$parameter1, this.coastContinentalness, this.erosions[6], p_187219_, 0.0F, resourcekey5); } else { this.addSurfaceBiome(p_187218_, climate$parameter, climate$parameter1, this.coastContinentalness, this.erosions[6], p_187219_, 0.0F, resourcekey); } if (i == 0) { this.addSurfaceBiome( p_187218_, climate$parameter, climate$parameter1, Climate.Parameter.span(this.nearInlandContinentalness, this.farInlandContinentalness), this.erosions[6], p_187219_, 0.0F, resourcekey ); } } } } private void addLowSlice(Consumer>> p_187229_, Climate.Parameter p_187230_) { this.addSurfaceBiome( p_187229_, this.FULL_RANGE, this.FULL_RANGE, this.coastContinentalness, Climate.Parameter.span(this.erosions[0], this.erosions[2]), p_187230_, 0.0F, Biomes.STONY_SHORE ); this.addSurfaceBiome( p_187229_, Climate.Parameter.span(this.temperatures[1], this.temperatures[2]), this.FULL_RANGE, Climate.Parameter.span(this.nearInlandContinentalness, this.farInlandContinentalness), this.erosions[6], p_187230_, 0.0F, Biomes.SWAMP ); this.addSurfaceBiome( p_187229_, Climate.Parameter.span(this.temperatures[3], this.temperatures[4]), this.FULL_RANGE, Climate.Parameter.span(this.nearInlandContinentalness, this.farInlandContinentalness), this.erosions[6], p_187230_, 0.0F, Biomes.MANGROVE_SWAMP ); for (int i = 0; i < this.temperatures.length; i++) { Climate.Parameter climate$parameter = this.temperatures[i]; for (int j = 0; j < this.humidities.length; j++) { Climate.Parameter climate$parameter1 = this.humidities[j]; ResourceKey resourcekey = this.pickMiddleBiome(i, j, p_187230_); ResourceKey resourcekey1 = this.pickMiddleBiomeOrBadlandsIfHot(i, j, p_187230_); ResourceKey resourcekey2 = this.pickMiddleBiomeOrBadlandsIfHotOrSlopeIfCold(i, j, p_187230_); ResourceKey resourcekey3 = this.pickBeachBiome(i, j); ResourceKey resourcekey4 = this.maybePickWindsweptSavannaBiome(i, j, p_187230_, resourcekey); ResourceKey resourcekey5 = this.pickShatteredCoastBiome(i, j, p_187230_); this.addSurfaceBiome( p_187229_, climate$parameter, climate$parameter1, this.nearInlandContinentalness, Climate.Parameter.span(this.erosions[0], this.erosions[1]), p_187230_, 0.0F, resourcekey1 ); this.addSurfaceBiome( p_187229_, climate$parameter, climate$parameter1, Climate.Parameter.span(this.midInlandContinentalness, this.farInlandContinentalness), Climate.Parameter.span(this.erosions[0], this.erosions[1]), p_187230_, 0.0F, resourcekey2 ); this.addSurfaceBiome( p_187229_, climate$parameter, climate$parameter1, this.nearInlandContinentalness, Climate.Parameter.span(this.erosions[2], this.erosions[3]), p_187230_, 0.0F, resourcekey ); this.addSurfaceBiome( p_187229_, climate$parameter, climate$parameter1, Climate.Parameter.span(this.midInlandContinentalness, this.farInlandContinentalness), Climate.Parameter.span(this.erosions[2], this.erosions[3]), p_187230_, 0.0F, resourcekey1 ); this.addSurfaceBiome( p_187229_, climate$parameter, climate$parameter1, this.coastContinentalness, Climate.Parameter.span(this.erosions[3], this.erosions[4]), p_187230_, 0.0F, resourcekey3 ); this.addSurfaceBiome( p_187229_, climate$parameter, climate$parameter1, Climate.Parameter.span(this.nearInlandContinentalness, this.farInlandContinentalness), this.erosions[4], p_187230_, 0.0F, resourcekey ); this.addSurfaceBiome(p_187229_, climate$parameter, climate$parameter1, this.coastContinentalness, this.erosions[5], p_187230_, 0.0F, resourcekey5); this.addSurfaceBiome(p_187229_, climate$parameter, climate$parameter1, this.nearInlandContinentalness, this.erosions[5], p_187230_, 0.0F, resourcekey4); this.addSurfaceBiome( p_187229_, climate$parameter, climate$parameter1, Climate.Parameter.span(this.midInlandContinentalness, this.farInlandContinentalness), this.erosions[5], p_187230_, 0.0F, resourcekey ); this.addSurfaceBiome(p_187229_, climate$parameter, climate$parameter1, this.coastContinentalness, this.erosions[6], p_187230_, 0.0F, resourcekey3); if (i == 0) { this.addSurfaceBiome( p_187229_, climate$parameter, climate$parameter1, Climate.Parameter.span(this.nearInlandContinentalness, this.farInlandContinentalness), this.erosions[6], p_187230_, 0.0F, resourcekey ); } } } } private void addValleys(Consumer>> p_187238_, Climate.Parameter p_187239_) { this.addSurfaceBiome( p_187238_, this.FROZEN_RANGE, this.FULL_RANGE, this.coastContinentalness, Climate.Parameter.span(this.erosions[0], this.erosions[1]), p_187239_, 0.0F, p_187239_.max() < 0L ? Biomes.STONY_SHORE : Biomes.FROZEN_RIVER ); this.addSurfaceBiome( p_187238_, this.UNFROZEN_RANGE, this.FULL_RANGE, this.coastContinentalness, Climate.Parameter.span(this.erosions[0], this.erosions[1]), p_187239_, 0.0F, p_187239_.max() < 0L ? Biomes.STONY_SHORE : Biomes.RIVER ); this.addSurfaceBiome( p_187238_, this.FROZEN_RANGE, this.FULL_RANGE, this.nearInlandContinentalness, Climate.Parameter.span(this.erosions[0], this.erosions[1]), p_187239_, 0.0F, Biomes.FROZEN_RIVER ); this.addSurfaceBiome( p_187238_, this.UNFROZEN_RANGE, this.FULL_RANGE, this.nearInlandContinentalness, Climate.Parameter.span(this.erosions[0], this.erosions[1]), p_187239_, 0.0F, Biomes.RIVER ); this.addSurfaceBiome( p_187238_, this.FROZEN_RANGE, this.FULL_RANGE, Climate.Parameter.span(this.coastContinentalness, this.farInlandContinentalness), Climate.Parameter.span(this.erosions[2], this.erosions[5]), p_187239_, 0.0F, Biomes.FROZEN_RIVER ); this.addSurfaceBiome( p_187238_, this.UNFROZEN_RANGE, this.FULL_RANGE, Climate.Parameter.span(this.coastContinentalness, this.farInlandContinentalness), Climate.Parameter.span(this.erosions[2], this.erosions[5]), p_187239_, 0.0F, Biomes.RIVER ); this.addSurfaceBiome(p_187238_, this.FROZEN_RANGE, this.FULL_RANGE, this.coastContinentalness, this.erosions[6], p_187239_, 0.0F, Biomes.FROZEN_RIVER); this.addSurfaceBiome(p_187238_, this.UNFROZEN_RANGE, this.FULL_RANGE, this.coastContinentalness, this.erosions[6], p_187239_, 0.0F, Biomes.RIVER); this.addSurfaceBiome( p_187238_, Climate.Parameter.span(this.temperatures[1], this.temperatures[2]), this.FULL_RANGE, Climate.Parameter.span(this.inlandContinentalness, this.farInlandContinentalness), this.erosions[6], p_187239_, 0.0F, Biomes.SWAMP ); this.addSurfaceBiome( p_187238_, Climate.Parameter.span(this.temperatures[3], this.temperatures[4]), this.FULL_RANGE, Climate.Parameter.span(this.inlandContinentalness, this.farInlandContinentalness), this.erosions[6], p_187239_, 0.0F, Biomes.MANGROVE_SWAMP ); this.addSurfaceBiome( p_187238_, this.FROZEN_RANGE, this.FULL_RANGE, Climate.Parameter.span(this.inlandContinentalness, this.farInlandContinentalness), this.erosions[6], p_187239_, 0.0F, Biomes.FROZEN_RIVER ); for (int i = 0; i < this.temperatures.length; i++) { Climate.Parameter climate$parameter = this.temperatures[i]; for (int j = 0; j < this.humidities.length; j++) { Climate.Parameter climate$parameter1 = this.humidities[j]; ResourceKey resourcekey = this.pickMiddleBiomeOrBadlandsIfHot(i, j, p_187239_); this.addSurfaceBiome( p_187238_, climate$parameter, climate$parameter1, Climate.Parameter.span(this.midInlandContinentalness, this.farInlandContinentalness), Climate.Parameter.span(this.erosions[0], this.erosions[1]), p_187239_, 0.0F, resourcekey ); } } } private void addUndergroundBiomes(Consumer>> p_187227_) { this.addUndergroundBiome( p_187227_, this.FULL_RANGE, this.FULL_RANGE, Climate.Parameter.span(0.8F, 1.0F), this.FULL_RANGE, this.FULL_RANGE, 0.0F, Biomes.DRIPSTONE_CAVES ); this.addUndergroundBiome( p_187227_, this.FULL_RANGE, Climate.Parameter.span(0.7F, 1.0F), this.FULL_RANGE, this.FULL_RANGE, this.FULL_RANGE, 0.0F, Biomes.LUSH_CAVES ); this.addBottomBiome( p_187227_, this.FULL_RANGE, this.FULL_RANGE, this.FULL_RANGE, Climate.Parameter.span(this.erosions[0], this.erosions[1]), this.FULL_RANGE, 0.0F, Biomes.DEEP_DARK ); } private ResourceKey pickMiddleBiome(int p_187164_, int p_187165_, Climate.Parameter p_187166_) { if (p_187166_.max() < 0L) { return this.MIDDLE_BIOMES[p_187164_][p_187165_]; } else { ResourceKey resourcekey = this.MIDDLE_BIOMES_VARIANT[p_187164_][p_187165_]; return resourcekey == null ? this.MIDDLE_BIOMES[p_187164_][p_187165_] : resourcekey; } } private ResourceKey pickMiddleBiomeOrBadlandsIfHot(int p_187192_, int p_187193_, Climate.Parameter p_187194_) { return p_187192_ == 4 ? this.pickBadlandsBiome(p_187193_, p_187194_) : this.pickMiddleBiome(p_187192_, p_187193_, p_187194_); } private ResourceKey pickMiddleBiomeOrBadlandsIfHotOrSlopeIfCold(int p_187212_, int p_187213_, Climate.Parameter p_187214_) { return p_187212_ == 0 ? this.pickSlopeBiome(p_187212_, p_187213_, p_187214_) : this.pickMiddleBiomeOrBadlandsIfHot(p_187212_, p_187213_, p_187214_); } private ResourceKey maybePickWindsweptSavannaBiome(int p_201991_, int p_201992_, Climate.Parameter p_201993_, ResourceKey p_201994_) { return p_201991_ > 1 && p_201992_ < 4 && p_201993_.max() >= 0L ? Biomes.WINDSWEPT_SAVANNA : p_201994_; } private ResourceKey pickShatteredCoastBiome(int p_187223_, int p_187224_, Climate.Parameter p_187225_) { ResourceKey resourcekey = p_187225_.max() >= 0L ? this.pickMiddleBiome(p_187223_, p_187224_, p_187225_) : this.pickBeachBiome(p_187223_, p_187224_); return this.maybePickWindsweptSavannaBiome(p_187223_, p_187224_, p_187225_, resourcekey); } private ResourceKey pickBeachBiome(int p_187161_, int p_187162_) { if (p_187161_ == 0) { return Biomes.SNOWY_BEACH; } else { return p_187161_ == 4 ? Biomes.DESERT : Biomes.BEACH; } } private ResourceKey pickBadlandsBiome(int p_187173_, Climate.Parameter p_187174_) { if (p_187173_ < 2) { return p_187174_.max() < 0L ? Biomes.BADLANDS : Biomes.ERODED_BADLANDS; } else { return p_187173_ < 3 ? Biomes.BADLANDS : Biomes.WOODED_BADLANDS; } } private ResourceKey pickPlateauBiome(int p_187234_, int p_187235_, Climate.Parameter p_187236_) { if (p_187236_.max() >= 0L) { ResourceKey resourcekey = this.PLATEAU_BIOMES_VARIANT[p_187234_][p_187235_]; if (resourcekey != null) { return resourcekey; } } return this.PLATEAU_BIOMES[p_187234_][p_187235_]; } private ResourceKey pickPeakBiome(int p_187241_, int p_187242_, Climate.Parameter p_187243_) { if (p_187241_ <= 2) { return p_187243_.max() < 0L ? Biomes.JAGGED_PEAKS : Biomes.FROZEN_PEAKS; } else { return p_187241_ == 3 ? Biomes.STONY_PEAKS : this.pickBadlandsBiome(p_187242_, p_187243_); } } private ResourceKey pickSlopeBiome(int p_187245_, int p_187246_, Climate.Parameter p_187247_) { if (p_187245_ >= 3) { return this.pickPlateauBiome(p_187245_, p_187246_, p_187247_); } else { return p_187246_ <= 1 ? Biomes.SNOWY_SLOPES : Biomes.GROVE; } } private ResourceKey pickShatteredBiome(int p_202002_, int p_202003_, Climate.Parameter p_202004_) { ResourceKey resourcekey = this.SHATTERED_BIOMES[p_202002_][p_202003_]; return resourcekey == null ? this.pickMiddleBiome(p_202002_, p_202003_, p_202004_) : resourcekey; } private void addSurfaceBiome( Consumer>> p_187181_, Climate.Parameter p_187182_, Climate.Parameter p_187183_, Climate.Parameter p_187184_, Climate.Parameter p_187185_, Climate.Parameter p_187186_, float p_187187_, ResourceKey p_187188_ ) { p_187181_.accept( Pair.of(Climate.parameters(p_187182_, p_187183_, p_187184_, p_187185_, Climate.Parameter.point(0.0F), p_187186_, p_187187_), p_187188_) ); p_187181_.accept( Pair.of(Climate.parameters(p_187182_, p_187183_, p_187184_, p_187185_, Climate.Parameter.point(1.0F), p_187186_, p_187187_), p_187188_) ); } private void addUndergroundBiome( Consumer>> p_187201_, Climate.Parameter p_187202_, Climate.Parameter p_187203_, Climate.Parameter p_187204_, Climate.Parameter p_187205_, Climate.Parameter p_187206_, float p_187207_, ResourceKey p_187208_ ) { p_187201_.accept( Pair.of(Climate.parameters(p_187202_, p_187203_, p_187204_, p_187205_, Climate.Parameter.span(0.2F, 0.9F), p_187206_, p_187207_), p_187208_) ); } private void addBottomBiome( Consumer>> p_220669_, Climate.Parameter p_220670_, Climate.Parameter p_220671_, Climate.Parameter p_220672_, Climate.Parameter p_220673_, Climate.Parameter p_220674_, float p_220675_, ResourceKey p_220676_ ) { p_220669_.accept( Pair.of(Climate.parameters(p_220670_, p_220671_, p_220672_, p_220673_, Climate.Parameter.point(1.1F), p_220674_, p_220675_), p_220676_) ); } public static boolean isDeepDarkRegion(DensityFunction p_252040_, DensityFunction p_250447_, DensityFunction.FunctionContext p_249270_) { return p_252040_.compute(p_249270_) < -0.225F && p_250447_.compute(p_249270_) > 0.9F; } public static String getDebugStringForPeaksAndValleys(double p_187156_) { if (p_187156_ < NoiseRouterData.peaksAndValleys(0.05F)) { return "Valley"; } else if (p_187156_ < NoiseRouterData.peaksAndValleys(0.26666668F)) { return "Low"; } else if (p_187156_ < NoiseRouterData.peaksAndValleys(0.4F)) { return "Mid"; } else { return p_187156_ < NoiseRouterData.peaksAndValleys(0.56666666F) ? "High" : "Peak"; } } public String getDebugStringForContinentalness(double p_187190_) { double d0 = Climate.quantizeCoord((float)p_187190_); if (d0 < this.mushroomFieldsContinentalness.max()) { return "Mushroom fields"; } else if (d0 < this.deepOceanContinentalness.max()) { return "Deep ocean"; } else if (d0 < this.oceanContinentalness.max()) { return "Ocean"; } else if (d0 < this.coastContinentalness.max()) { return "Coast"; } else if (d0 < this.nearInlandContinentalness.max()) { return "Near inland"; } else { return d0 < this.midInlandContinentalness.max() ? "Mid inland" : "Far inland"; } } public String getDebugStringForErosion(double p_187210_) { return getDebugStringForNoiseValue(p_187210_, this.erosions); } public String getDebugStringForTemperature(double p_187221_) { return getDebugStringForNoiseValue(p_187221_, this.temperatures); } public String getDebugStringForHumidity(double p_187232_) { return getDebugStringForNoiseValue(p_187232_, this.humidities); } private static String getDebugStringForNoiseValue(double p_187158_, Climate.Parameter[] p_187159_) { double d0 = Climate.quantizeCoord((float)p_187158_); for (int i = 0; i < p_187159_.length; i++) { if (d0 < p_187159_[i].max()) { return i + ""; } } return "?"; } @VisibleForDebug public Climate.Parameter[] getTemperatureThresholds() { return this.temperatures; } @VisibleForDebug public Climate.Parameter[] getHumidityThresholds() { return this.humidities; } @VisibleForDebug public Climate.Parameter[] getErosionThresholds() { return this.erosions; } @VisibleForDebug public Climate.Parameter[] getContinentalnessThresholds() { return new Climate.Parameter[]{this.mushroomFieldsContinentalness, this.deepOceanContinentalness, this.oceanContinentalness, this.coastContinentalness, this.nearInlandContinentalness, this.midInlandContinentalness, this.farInlandContinentalness}; } @VisibleForDebug public Climate.Parameter[] getPeaksAndValleysThresholds() { return new Climate.Parameter[]{ Climate.Parameter.span(-2.0F, NoiseRouterData.peaksAndValleys(0.05F)), Climate.Parameter.span(NoiseRouterData.peaksAndValleys(0.05F), NoiseRouterData.peaksAndValleys(0.26666668F)), Climate.Parameter.span(NoiseRouterData.peaksAndValleys(0.26666668F), NoiseRouterData.peaksAndValleys(0.4F)), Climate.Parameter.span(NoiseRouterData.peaksAndValleys(0.4F), NoiseRouterData.peaksAndValleys(0.56666666F)), Climate.Parameter.span(NoiseRouterData.peaksAndValleys(0.56666666F), 2.0F) }; } @VisibleForDebug public Climate.Parameter[] getWeirdnessThresholds() { return new Climate.Parameter[]{Climate.Parameter.span(-2.0F, 0.0F), Climate.Parameter.span(0.0F, 2.0F)}; } }