minecraft-src/net/minecraft/world/level/biome/OverworldBiomeBuilder.java
2025-07-04 03:45:38 +03:00

847 lines
36 KiB
Java

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.ToFloatFunction;
import net.minecraft.util.VisibleForDebug;
import net.minecraft.util.CubicSpline.Multipoint;
import net.minecraft.world.level.biome.Climate.Parameter;
import net.minecraft.world.level.biome.Climate.ParameterPoint;
import net.minecraft.world.level.levelgen.DensityFunction;
import net.minecraft.world.level.levelgen.NoiseRouterData;
import net.minecraft.world.level.levelgen.DensityFunctions.Spline.Coordinate;
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 Parameter FULL_RANGE = Parameter.span(-1.0F, 1.0F);
private final Parameter[] temperatures = new Parameter[]{
Parameter.span(-1.0F, -0.45F), Parameter.span(-0.45F, -0.15F), Parameter.span(-0.15F, 0.2F), Parameter.span(0.2F, 0.55F), Parameter.span(0.55F, 1.0F)
};
private final Parameter[] humidities = new Parameter[]{
Parameter.span(-1.0F, -0.35F), Parameter.span(-0.35F, -0.1F), Parameter.span(-0.1F, 0.1F), Parameter.span(0.1F, 0.3F), Parameter.span(0.3F, 1.0F)
};
private final Parameter[] erosions = new Parameter[]{
Parameter.span(-1.0F, -0.78F),
Parameter.span(-0.78F, -0.375F),
Parameter.span(-0.375F, -0.2225F),
Parameter.span(-0.2225F, 0.05F),
Parameter.span(0.05F, 0.45F),
Parameter.span(0.45F, 0.55F),
Parameter.span(0.55F, 1.0F)
};
private final Parameter FROZEN_RANGE = this.temperatures[0];
private final Parameter UNFROZEN_RANGE = Parameter.span(this.temperatures[1], this.temperatures[4]);
private final Parameter mushroomFieldsContinentalness = Parameter.span(-1.2F, -1.05F);
private final Parameter deepOceanContinentalness = Parameter.span(-1.05F, -0.455F);
private final Parameter oceanContinentalness = Parameter.span(-0.455F, -0.19F);
private final Parameter coastContinentalness = Parameter.span(-0.19F, -0.11F);
private final Parameter inlandContinentalness = Parameter.span(-0.11F, 0.55F);
private final Parameter nearInlandContinentalness = Parameter.span(-0.11F, 0.03F);
private final Parameter midInlandContinentalness = Parameter.span(0.03F, 0.3F);
private final Parameter farInlandContinentalness = Parameter.span(0.3F, 1.0F);
private final ResourceKey<Biome>[][] 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<Biome>[][] 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<Biome>[][] 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<Biome>[][] 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<Biome>[][] 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<Biome>[][] 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<ParameterPoint> spawnTarget() {
Parameter parameter = Parameter.point(0.0F);
float f = 0.16F;
return List.of(
new ParameterPoint(
this.FULL_RANGE,
this.FULL_RANGE,
Parameter.span(this.inlandContinentalness, this.FULL_RANGE),
this.FULL_RANGE,
parameter,
Parameter.span(-1.0F, -0.16F),
0L
),
new ParameterPoint(
this.FULL_RANGE, this.FULL_RANGE, Parameter.span(this.inlandContinentalness, this.FULL_RANGE), this.FULL_RANGE, parameter, Parameter.span(0.16F, 1.0F), 0L
)
);
}
protected void addBiomes(Consumer<Pair<ParameterPoint, ResourceKey<Biome>>> key) {
if (SharedConstants.debugGenerateSquareTerrainWithoutNoise) {
this.addDebugBiomes(key);
} else {
this.addOffCoastBiomes(key);
this.addInlandBiomes(key);
this.addUndergroundBiomes(key);
}
}
private void addDebugBiomes(Consumer<Pair<ParameterPoint, ResourceKey<Biome>>> key) {
HolderLookup.Provider provider = VanillaRegistries.createLookup();
HolderGetter<DensityFunction> holderGetter = provider.lookupOrThrow(Registries.DENSITY_FUNCTION);
Coordinate coordinate = new Coordinate(holderGetter.getOrThrow(NoiseRouterData.CONTINENTS));
Coordinate coordinate2 = new Coordinate(holderGetter.getOrThrow(NoiseRouterData.EROSION));
Coordinate coordinate3 = new Coordinate(holderGetter.getOrThrow(NoiseRouterData.RIDGES_FOLDED));
key.accept(
Pair.of(Climate.parameters(this.FULL_RANGE, this.FULL_RANGE, this.FULL_RANGE, this.FULL_RANGE, Parameter.point(0.0F), this.FULL_RANGE, 0.01F), Biomes.PLAINS)
);
if (TerrainProvider.buildErosionOffsetSpline(coordinate2, coordinate3, -0.15F, 0.0F, 0.0F, 0.1F, 0.0F, -0.03F, false, false, ToFloatFunction.IDENTITY) instanceof Multipoint<?, ?> multipoint
)
{
ResourceKey<Biome> resourceKey = Biomes.DESERT;
for (float f : multipoint.locations()) {
key.accept(
Pair.of(
Climate.parameters(this.FULL_RANGE, this.FULL_RANGE, this.FULL_RANGE, Parameter.point(f), Parameter.point(0.0F), this.FULL_RANGE, 0.0F), resourceKey
)
);
resourceKey = resourceKey == Biomes.DESERT ? Biomes.BADLANDS : Biomes.DESERT;
}
}
if (TerrainProvider.overworldOffset(coordinate, coordinate2, coordinate3, false) instanceof Multipoint<?, ?> multipoint2) {
for (float f : multipoint2.locations()) {
key.accept(
Pair.of(
Climate.parameters(this.FULL_RANGE, this.FULL_RANGE, Parameter.point(f), this.FULL_RANGE, Parameter.point(0.0F), this.FULL_RANGE, 0.0F),
Biomes.SNOWY_TAIGA
)
);
}
}
}
private void addOffCoastBiomes(Consumer<Pair<ParameterPoint, ResourceKey<Biome>>> consumer) {
this.addSurfaceBiome(
consumer, 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++) {
Parameter parameter = this.temperatures[i];
this.addSurfaceBiome(consumer, parameter, this.FULL_RANGE, this.deepOceanContinentalness, this.FULL_RANGE, this.FULL_RANGE, 0.0F, this.OCEANS[0][i]);
this.addSurfaceBiome(consumer, parameter, this.FULL_RANGE, this.oceanContinentalness, this.FULL_RANGE, this.FULL_RANGE, 0.0F, this.OCEANS[1][i]);
}
}
private void addInlandBiomes(Consumer<Pair<ParameterPoint, ResourceKey<Biome>>> consumer) {
this.addMidSlice(consumer, Parameter.span(-1.0F, -0.93333334F));
this.addHighSlice(consumer, Parameter.span(-0.93333334F, -0.7666667F));
this.addPeaks(consumer, Parameter.span(-0.7666667F, -0.56666666F));
this.addHighSlice(consumer, Parameter.span(-0.56666666F, -0.4F));
this.addMidSlice(consumer, Parameter.span(-0.4F, -0.26666668F));
this.addLowSlice(consumer, Parameter.span(-0.26666668F, -0.05F));
this.addValleys(consumer, Parameter.span(-0.05F, 0.05F));
this.addLowSlice(consumer, Parameter.span(0.05F, 0.26666668F));
this.addMidSlice(consumer, Parameter.span(0.26666668F, 0.4F));
this.addHighSlice(consumer, Parameter.span(0.4F, 0.56666666F));
this.addPeaks(consumer, Parameter.span(0.56666666F, 0.7666667F));
this.addHighSlice(consumer, Parameter.span(0.7666667F, 0.93333334F));
this.addMidSlice(consumer, Parameter.span(0.93333334F, 1.0F));
}
private void addPeaks(Consumer<Pair<ParameterPoint, ResourceKey<Biome>>> consumer, Parameter param) {
for (int i = 0; i < this.temperatures.length; i++) {
Parameter parameter = this.temperatures[i];
for (int j = 0; j < this.humidities.length; j++) {
Parameter parameter2 = this.humidities[j];
ResourceKey<Biome> resourceKey = this.pickMiddleBiome(i, j, param);
ResourceKey<Biome> resourceKey2 = this.pickMiddleBiomeOrBadlandsIfHot(i, j, param);
ResourceKey<Biome> resourceKey3 = this.pickMiddleBiomeOrBadlandsIfHotOrSlopeIfCold(i, j, param);
ResourceKey<Biome> resourceKey4 = this.pickPlateauBiome(i, j, param);
ResourceKey<Biome> resourceKey5 = this.pickShatteredBiome(i, j, param);
ResourceKey<Biome> resourceKey6 = this.maybePickWindsweptSavannaBiome(i, j, param, resourceKey5);
ResourceKey<Biome> resourceKey7 = this.pickPeakBiome(i, j, param);
this.addSurfaceBiome(
consumer, parameter, parameter2, Parameter.span(this.coastContinentalness, this.farInlandContinentalness), this.erosions[0], param, 0.0F, resourceKey7
);
this.addSurfaceBiome(
consumer, parameter, parameter2, Parameter.span(this.coastContinentalness, this.nearInlandContinentalness), this.erosions[1], param, 0.0F, resourceKey3
);
this.addSurfaceBiome(
consumer, parameter, parameter2, Parameter.span(this.midInlandContinentalness, this.farInlandContinentalness), this.erosions[1], param, 0.0F, resourceKey7
);
this.addSurfaceBiome(
consumer,
parameter,
parameter2,
Parameter.span(this.coastContinentalness, this.nearInlandContinentalness),
Parameter.span(this.erosions[2], this.erosions[3]),
param,
0.0F,
resourceKey
);
this.addSurfaceBiome(
consumer, parameter, parameter2, Parameter.span(this.midInlandContinentalness, this.farInlandContinentalness), this.erosions[2], param, 0.0F, resourceKey4
);
this.addSurfaceBiome(consumer, parameter, parameter2, this.midInlandContinentalness, this.erosions[3], param, 0.0F, resourceKey2);
this.addSurfaceBiome(consumer, parameter, parameter2, this.farInlandContinentalness, this.erosions[3], param, 0.0F, resourceKey4);
this.addSurfaceBiome(
consumer, parameter, parameter2, Parameter.span(this.coastContinentalness, this.farInlandContinentalness), this.erosions[4], param, 0.0F, resourceKey
);
this.addSurfaceBiome(
consumer, parameter, parameter2, Parameter.span(this.coastContinentalness, this.nearInlandContinentalness), this.erosions[5], param, 0.0F, resourceKey6
);
this.addSurfaceBiome(
consumer, parameter, parameter2, Parameter.span(this.midInlandContinentalness, this.farInlandContinentalness), this.erosions[5], param, 0.0F, resourceKey5
);
this.addSurfaceBiome(
consumer, parameter, parameter2, Parameter.span(this.coastContinentalness, this.farInlandContinentalness), this.erosions[6], param, 0.0F, resourceKey
);
}
}
}
private void addHighSlice(Consumer<Pair<ParameterPoint, ResourceKey<Biome>>> consumer, Parameter param) {
for (int i = 0; i < this.temperatures.length; i++) {
Parameter parameter = this.temperatures[i];
for (int j = 0; j < this.humidities.length; j++) {
Parameter parameter2 = this.humidities[j];
ResourceKey<Biome> resourceKey = this.pickMiddleBiome(i, j, param);
ResourceKey<Biome> resourceKey2 = this.pickMiddleBiomeOrBadlandsIfHot(i, j, param);
ResourceKey<Biome> resourceKey3 = this.pickMiddleBiomeOrBadlandsIfHotOrSlopeIfCold(i, j, param);
ResourceKey<Biome> resourceKey4 = this.pickPlateauBiome(i, j, param);
ResourceKey<Biome> resourceKey5 = this.pickShatteredBiome(i, j, param);
ResourceKey<Biome> resourceKey6 = this.maybePickWindsweptSavannaBiome(i, j, param, resourceKey);
ResourceKey<Biome> resourceKey7 = this.pickSlopeBiome(i, j, param);
ResourceKey<Biome> resourceKey8 = this.pickPeakBiome(i, j, param);
this.addSurfaceBiome(
consumer, parameter, parameter2, this.coastContinentalness, Parameter.span(this.erosions[0], this.erosions[1]), param, 0.0F, resourceKey
);
this.addSurfaceBiome(consumer, parameter, parameter2, this.nearInlandContinentalness, this.erosions[0], param, 0.0F, resourceKey7);
this.addSurfaceBiome(
consumer, parameter, parameter2, Parameter.span(this.midInlandContinentalness, this.farInlandContinentalness), this.erosions[0], param, 0.0F, resourceKey8
);
this.addSurfaceBiome(consumer, parameter, parameter2, this.nearInlandContinentalness, this.erosions[1], param, 0.0F, resourceKey3);
this.addSurfaceBiome(
consumer, parameter, parameter2, Parameter.span(this.midInlandContinentalness, this.farInlandContinentalness), this.erosions[1], param, 0.0F, resourceKey7
);
this.addSurfaceBiome(
consumer,
parameter,
parameter2,
Parameter.span(this.coastContinentalness, this.nearInlandContinentalness),
Parameter.span(this.erosions[2], this.erosions[3]),
param,
0.0F,
resourceKey
);
this.addSurfaceBiome(
consumer, parameter, parameter2, Parameter.span(this.midInlandContinentalness, this.farInlandContinentalness), this.erosions[2], param, 0.0F, resourceKey4
);
this.addSurfaceBiome(consumer, parameter, parameter2, this.midInlandContinentalness, this.erosions[3], param, 0.0F, resourceKey2);
this.addSurfaceBiome(consumer, parameter, parameter2, this.farInlandContinentalness, this.erosions[3], param, 0.0F, resourceKey4);
this.addSurfaceBiome(
consumer, parameter, parameter2, Parameter.span(this.coastContinentalness, this.farInlandContinentalness), this.erosions[4], param, 0.0F, resourceKey
);
this.addSurfaceBiome(
consumer, parameter, parameter2, Parameter.span(this.coastContinentalness, this.nearInlandContinentalness), this.erosions[5], param, 0.0F, resourceKey6
);
this.addSurfaceBiome(
consumer, parameter, parameter2, Parameter.span(this.midInlandContinentalness, this.farInlandContinentalness), this.erosions[5], param, 0.0F, resourceKey5
);
this.addSurfaceBiome(
consumer, parameter, parameter2, Parameter.span(this.coastContinentalness, this.farInlandContinentalness), this.erosions[6], param, 0.0F, resourceKey
);
}
}
}
private void addMidSlice(Consumer<Pair<ParameterPoint, ResourceKey<Biome>>> consumer, Parameter param) {
this.addSurfaceBiome(
consumer, this.FULL_RANGE, this.FULL_RANGE, this.coastContinentalness, Parameter.span(this.erosions[0], this.erosions[2]), param, 0.0F, Biomes.STONY_SHORE
);
this.addSurfaceBiome(
consumer,
Parameter.span(this.temperatures[1], this.temperatures[2]),
this.FULL_RANGE,
Parameter.span(this.nearInlandContinentalness, this.farInlandContinentalness),
this.erosions[6],
param,
0.0F,
Biomes.SWAMP
);
this.addSurfaceBiome(
consumer,
Parameter.span(this.temperatures[3], this.temperatures[4]),
this.FULL_RANGE,
Parameter.span(this.nearInlandContinentalness, this.farInlandContinentalness),
this.erosions[6],
param,
0.0F,
Biomes.MANGROVE_SWAMP
);
for (int i = 0; i < this.temperatures.length; i++) {
Parameter parameter = this.temperatures[i];
for (int j = 0; j < this.humidities.length; j++) {
Parameter parameter2 = this.humidities[j];
ResourceKey<Biome> resourceKey = this.pickMiddleBiome(i, j, param);
ResourceKey<Biome> resourceKey2 = this.pickMiddleBiomeOrBadlandsIfHot(i, j, param);
ResourceKey<Biome> resourceKey3 = this.pickMiddleBiomeOrBadlandsIfHotOrSlopeIfCold(i, j, param);
ResourceKey<Biome> resourceKey4 = this.pickShatteredBiome(i, j, param);
ResourceKey<Biome> resourceKey5 = this.pickPlateauBiome(i, j, param);
ResourceKey<Biome> resourceKey6 = this.pickBeachBiome(i, j);
ResourceKey<Biome> resourceKey7 = this.maybePickWindsweptSavannaBiome(i, j, param, resourceKey);
ResourceKey<Biome> resourceKey8 = this.pickShatteredCoastBiome(i, j, param);
ResourceKey<Biome> resourceKey9 = this.pickSlopeBiome(i, j, param);
this.addSurfaceBiome(
consumer,
parameter,
parameter2,
Parameter.span(this.nearInlandContinentalness, this.farInlandContinentalness),
this.erosions[0],
param,
0.0F,
resourceKey9
);
this.addSurfaceBiome(
consumer,
parameter,
parameter2,
Parameter.span(this.nearInlandContinentalness, this.midInlandContinentalness),
this.erosions[1],
param,
0.0F,
resourceKey3
);
this.addSurfaceBiome(consumer, parameter, parameter2, this.farInlandContinentalness, this.erosions[1], param, 0.0F, i == 0 ? resourceKey9 : resourceKey5);
this.addSurfaceBiome(consumer, parameter, parameter2, this.nearInlandContinentalness, this.erosions[2], param, 0.0F, resourceKey);
this.addSurfaceBiome(consumer, parameter, parameter2, this.midInlandContinentalness, this.erosions[2], param, 0.0F, resourceKey2);
this.addSurfaceBiome(consumer, parameter, parameter2, this.farInlandContinentalness, this.erosions[2], param, 0.0F, resourceKey5);
this.addSurfaceBiome(
consumer, parameter, parameter2, Parameter.span(this.coastContinentalness, this.nearInlandContinentalness), this.erosions[3], param, 0.0F, resourceKey
);
this.addSurfaceBiome(
consumer, parameter, parameter2, Parameter.span(this.midInlandContinentalness, this.farInlandContinentalness), this.erosions[3], param, 0.0F, resourceKey2
);
if (param.max() < 0L) {
this.addSurfaceBiome(consumer, parameter, parameter2, this.coastContinentalness, this.erosions[4], param, 0.0F, resourceKey6);
this.addSurfaceBiome(
consumer,
parameter,
parameter2,
Parameter.span(this.nearInlandContinentalness, this.farInlandContinentalness),
this.erosions[4],
param,
0.0F,
resourceKey
);
} else {
this.addSurfaceBiome(
consumer, parameter, parameter2, Parameter.span(this.coastContinentalness, this.farInlandContinentalness), this.erosions[4], param, 0.0F, resourceKey
);
}
this.addSurfaceBiome(consumer, parameter, parameter2, this.coastContinentalness, this.erosions[5], param, 0.0F, resourceKey8);
this.addSurfaceBiome(consumer, parameter, parameter2, this.nearInlandContinentalness, this.erosions[5], param, 0.0F, resourceKey7);
this.addSurfaceBiome(
consumer, parameter, parameter2, Parameter.span(this.midInlandContinentalness, this.farInlandContinentalness), this.erosions[5], param, 0.0F, resourceKey4
);
if (param.max() < 0L) {
this.addSurfaceBiome(consumer, parameter, parameter2, this.coastContinentalness, this.erosions[6], param, 0.0F, resourceKey6);
} else {
this.addSurfaceBiome(consumer, parameter, parameter2, this.coastContinentalness, this.erosions[6], param, 0.0F, resourceKey);
}
if (i == 0) {
this.addSurfaceBiome(
consumer,
parameter,
parameter2,
Parameter.span(this.nearInlandContinentalness, this.farInlandContinentalness),
this.erosions[6],
param,
0.0F,
resourceKey
);
}
}
}
}
private void addLowSlice(Consumer<Pair<ParameterPoint, ResourceKey<Biome>>> consumer, Parameter param) {
this.addSurfaceBiome(
consumer, this.FULL_RANGE, this.FULL_RANGE, this.coastContinentalness, Parameter.span(this.erosions[0], this.erosions[2]), param, 0.0F, Biomes.STONY_SHORE
);
this.addSurfaceBiome(
consumer,
Parameter.span(this.temperatures[1], this.temperatures[2]),
this.FULL_RANGE,
Parameter.span(this.nearInlandContinentalness, this.farInlandContinentalness),
this.erosions[6],
param,
0.0F,
Biomes.SWAMP
);
this.addSurfaceBiome(
consumer,
Parameter.span(this.temperatures[3], this.temperatures[4]),
this.FULL_RANGE,
Parameter.span(this.nearInlandContinentalness, this.farInlandContinentalness),
this.erosions[6],
param,
0.0F,
Biomes.MANGROVE_SWAMP
);
for (int i = 0; i < this.temperatures.length; i++) {
Parameter parameter = this.temperatures[i];
for (int j = 0; j < this.humidities.length; j++) {
Parameter parameter2 = this.humidities[j];
ResourceKey<Biome> resourceKey = this.pickMiddleBiome(i, j, param);
ResourceKey<Biome> resourceKey2 = this.pickMiddleBiomeOrBadlandsIfHot(i, j, param);
ResourceKey<Biome> resourceKey3 = this.pickMiddleBiomeOrBadlandsIfHotOrSlopeIfCold(i, j, param);
ResourceKey<Biome> resourceKey4 = this.pickBeachBiome(i, j);
ResourceKey<Biome> resourceKey5 = this.maybePickWindsweptSavannaBiome(i, j, param, resourceKey);
ResourceKey<Biome> resourceKey6 = this.pickShatteredCoastBiome(i, j, param);
this.addSurfaceBiome(
consumer, parameter, parameter2, this.nearInlandContinentalness, Parameter.span(this.erosions[0], this.erosions[1]), param, 0.0F, resourceKey2
);
this.addSurfaceBiome(
consumer,
parameter,
parameter2,
Parameter.span(this.midInlandContinentalness, this.farInlandContinentalness),
Parameter.span(this.erosions[0], this.erosions[1]),
param,
0.0F,
resourceKey3
);
this.addSurfaceBiome(
consumer, parameter, parameter2, this.nearInlandContinentalness, Parameter.span(this.erosions[2], this.erosions[3]), param, 0.0F, resourceKey
);
this.addSurfaceBiome(
consumer,
parameter,
parameter2,
Parameter.span(this.midInlandContinentalness, this.farInlandContinentalness),
Parameter.span(this.erosions[2], this.erosions[3]),
param,
0.0F,
resourceKey2
);
this.addSurfaceBiome(
consumer, parameter, parameter2, this.coastContinentalness, Parameter.span(this.erosions[3], this.erosions[4]), param, 0.0F, resourceKey4
);
this.addSurfaceBiome(
consumer, parameter, parameter2, Parameter.span(this.nearInlandContinentalness, this.farInlandContinentalness), this.erosions[4], param, 0.0F, resourceKey
);
this.addSurfaceBiome(consumer, parameter, parameter2, this.coastContinentalness, this.erosions[5], param, 0.0F, resourceKey6);
this.addSurfaceBiome(consumer, parameter, parameter2, this.nearInlandContinentalness, this.erosions[5], param, 0.0F, resourceKey5);
this.addSurfaceBiome(
consumer, parameter, parameter2, Parameter.span(this.midInlandContinentalness, this.farInlandContinentalness), this.erosions[5], param, 0.0F, resourceKey
);
this.addSurfaceBiome(consumer, parameter, parameter2, this.coastContinentalness, this.erosions[6], param, 0.0F, resourceKey4);
if (i == 0) {
this.addSurfaceBiome(
consumer,
parameter,
parameter2,
Parameter.span(this.nearInlandContinentalness, this.farInlandContinentalness),
this.erosions[6],
param,
0.0F,
resourceKey
);
}
}
}
}
private void addValleys(Consumer<Pair<ParameterPoint, ResourceKey<Biome>>> consumer, Parameter param) {
this.addSurfaceBiome(
consumer,
this.FROZEN_RANGE,
this.FULL_RANGE,
this.coastContinentalness,
Parameter.span(this.erosions[0], this.erosions[1]),
param,
0.0F,
param.max() < 0L ? Biomes.STONY_SHORE : Biomes.FROZEN_RIVER
);
this.addSurfaceBiome(
consumer,
this.UNFROZEN_RANGE,
this.FULL_RANGE,
this.coastContinentalness,
Parameter.span(this.erosions[0], this.erosions[1]),
param,
0.0F,
param.max() < 0L ? Biomes.STONY_SHORE : Biomes.RIVER
);
this.addSurfaceBiome(
consumer,
this.FROZEN_RANGE,
this.FULL_RANGE,
this.nearInlandContinentalness,
Parameter.span(this.erosions[0], this.erosions[1]),
param,
0.0F,
Biomes.FROZEN_RIVER
);
this.addSurfaceBiome(
consumer,
this.UNFROZEN_RANGE,
this.FULL_RANGE,
this.nearInlandContinentalness,
Parameter.span(this.erosions[0], this.erosions[1]),
param,
0.0F,
Biomes.RIVER
);
this.addSurfaceBiome(
consumer,
this.FROZEN_RANGE,
this.FULL_RANGE,
Parameter.span(this.coastContinentalness, this.farInlandContinentalness),
Parameter.span(this.erosions[2], this.erosions[5]),
param,
0.0F,
Biomes.FROZEN_RIVER
);
this.addSurfaceBiome(
consumer,
this.UNFROZEN_RANGE,
this.FULL_RANGE,
Parameter.span(this.coastContinentalness, this.farInlandContinentalness),
Parameter.span(this.erosions[2], this.erosions[5]),
param,
0.0F,
Biomes.RIVER
);
this.addSurfaceBiome(consumer, this.FROZEN_RANGE, this.FULL_RANGE, this.coastContinentalness, this.erosions[6], param, 0.0F, Biomes.FROZEN_RIVER);
this.addSurfaceBiome(consumer, this.UNFROZEN_RANGE, this.FULL_RANGE, this.coastContinentalness, this.erosions[6], param, 0.0F, Biomes.RIVER);
this.addSurfaceBiome(
consumer,
Parameter.span(this.temperatures[1], this.temperatures[2]),
this.FULL_RANGE,
Parameter.span(this.inlandContinentalness, this.farInlandContinentalness),
this.erosions[6],
param,
0.0F,
Biomes.SWAMP
);
this.addSurfaceBiome(
consumer,
Parameter.span(this.temperatures[3], this.temperatures[4]),
this.FULL_RANGE,
Parameter.span(this.inlandContinentalness, this.farInlandContinentalness),
this.erosions[6],
param,
0.0F,
Biomes.MANGROVE_SWAMP
);
this.addSurfaceBiome(
consumer,
this.FROZEN_RANGE,
this.FULL_RANGE,
Parameter.span(this.inlandContinentalness, this.farInlandContinentalness),
this.erosions[6],
param,
0.0F,
Biomes.FROZEN_RIVER
);
for (int i = 0; i < this.temperatures.length; i++) {
Parameter parameter = this.temperatures[i];
for (int j = 0; j < this.humidities.length; j++) {
Parameter parameter2 = this.humidities[j];
ResourceKey<Biome> resourceKey = this.pickMiddleBiomeOrBadlandsIfHot(i, j, param);
this.addSurfaceBiome(
consumer,
parameter,
parameter2,
Parameter.span(this.midInlandContinentalness, this.farInlandContinentalness),
Parameter.span(this.erosions[0], this.erosions[1]),
param,
0.0F,
resourceKey
);
}
}
}
private void addUndergroundBiomes(Consumer<Pair<ParameterPoint, ResourceKey<Biome>>> consume) {
this.addUndergroundBiome(
consume, this.FULL_RANGE, this.FULL_RANGE, Parameter.span(0.8F, 1.0F), this.FULL_RANGE, this.FULL_RANGE, 0.0F, Biomes.DRIPSTONE_CAVES
);
this.addUndergroundBiome(consume, this.FULL_RANGE, Parameter.span(0.7F, 1.0F), this.FULL_RANGE, this.FULL_RANGE, this.FULL_RANGE, 0.0F, Biomes.LUSH_CAVES);
this.addBottomBiome(
consume, this.FULL_RANGE, this.FULL_RANGE, this.FULL_RANGE, Parameter.span(this.erosions[0], this.erosions[1]), this.FULL_RANGE, 0.0F, Biomes.DEEP_DARK
);
}
private ResourceKey<Biome> pickMiddleBiome(int temperature, int humidity, Parameter param) {
if (param.max() < 0L) {
return this.MIDDLE_BIOMES[temperature][humidity];
} else {
ResourceKey<Biome> resourceKey = this.MIDDLE_BIOMES_VARIANT[temperature][humidity];
return resourceKey == null ? this.MIDDLE_BIOMES[temperature][humidity] : resourceKey;
}
}
private ResourceKey<Biome> pickMiddleBiomeOrBadlandsIfHot(int temperature, int humidity, Parameter param) {
return temperature == 4 ? this.pickBadlandsBiome(humidity, param) : this.pickMiddleBiome(temperature, humidity, param);
}
private ResourceKey<Biome> pickMiddleBiomeOrBadlandsIfHotOrSlopeIfCold(int temperature, int humidity, Parameter param) {
return temperature == 0 ? this.pickSlopeBiome(temperature, humidity, param) : this.pickMiddleBiomeOrBadlandsIfHot(temperature, humidity, param);
}
private ResourceKey<Biome> maybePickWindsweptSavannaBiome(int temperature, int humidity, Parameter param, ResourceKey<Biome> key) {
return temperature > 1 && humidity < 4 && param.max() >= 0L ? Biomes.WINDSWEPT_SAVANNA : key;
}
private ResourceKey<Biome> pickShatteredCoastBiome(int temperature, int humidity, Parameter param) {
ResourceKey<Biome> resourceKey = param.max() >= 0L ? this.pickMiddleBiome(temperature, humidity, param) : this.pickBeachBiome(temperature, humidity);
return this.maybePickWindsweptSavannaBiome(temperature, humidity, param, resourceKey);
}
private ResourceKey<Biome> pickBeachBiome(int temperature, int humidity) {
if (temperature == 0) {
return Biomes.SNOWY_BEACH;
} else {
return temperature == 4 ? Biomes.DESERT : Biomes.BEACH;
}
}
private ResourceKey<Biome> pickBadlandsBiome(int humidity, Parameter param) {
if (humidity < 2) {
return param.max() < 0L ? Biomes.BADLANDS : Biomes.ERODED_BADLANDS;
} else {
return humidity < 3 ? Biomes.BADLANDS : Biomes.WOODED_BADLANDS;
}
}
private ResourceKey<Biome> pickPlateauBiome(int temperature, int humidity, Parameter param) {
if (param.max() >= 0L) {
ResourceKey<Biome> resourceKey = this.PLATEAU_BIOMES_VARIANT[temperature][humidity];
if (resourceKey != null) {
return resourceKey;
}
}
return this.PLATEAU_BIOMES[temperature][humidity];
}
private ResourceKey<Biome> pickPeakBiome(int temperature, int humidity, Parameter param) {
if (temperature <= 2) {
return param.max() < 0L ? Biomes.JAGGED_PEAKS : Biomes.FROZEN_PEAKS;
} else {
return temperature == 3 ? Biomes.STONY_PEAKS : this.pickBadlandsBiome(humidity, param);
}
}
private ResourceKey<Biome> pickSlopeBiome(int temperature, int humidity, Parameter param) {
if (temperature >= 3) {
return this.pickPlateauBiome(temperature, humidity, param);
} else {
return humidity <= 1 ? Biomes.SNOWY_SLOPES : Biomes.GROVE;
}
}
private ResourceKey<Biome> pickShatteredBiome(int temperature, int humidity, Parameter param) {
ResourceKey<Biome> resourceKey = this.SHATTERED_BIOMES[temperature][humidity];
return resourceKey == null ? this.pickMiddleBiome(temperature, humidity, param) : resourceKey;
}
private void addSurfaceBiome(
Consumer<Pair<ParameterPoint, ResourceKey<Biome>>> consumer,
Parameter temperature,
Parameter humidity,
Parameter continentalness,
Parameter erosion,
Parameter depth,
float weirdness,
ResourceKey<Biome> key
) {
consumer.accept(Pair.of(Climate.parameters(temperature, humidity, continentalness, erosion, Parameter.point(0.0F), depth, weirdness), key));
consumer.accept(Pair.of(Climate.parameters(temperature, humidity, continentalness, erosion, Parameter.point(1.0F), depth, weirdness), key));
}
private void addUndergroundBiome(
Consumer<Pair<ParameterPoint, ResourceKey<Biome>>> consumer,
Parameter temperature,
Parameter humidity,
Parameter continentalness,
Parameter erosion,
Parameter depth,
float weirdness,
ResourceKey<Biome> key
) {
consumer.accept(Pair.of(Climate.parameters(temperature, humidity, continentalness, erosion, Parameter.span(0.2F, 0.9F), depth, weirdness), key));
}
private void addBottomBiome(
Consumer<Pair<ParameterPoint, ResourceKey<Biome>>> consumer,
Parameter temerature,
Parameter humidity,
Parameter continentalness,
Parameter erosion,
Parameter depth,
float weirdness,
ResourceKey<Biome> key
) {
consumer.accept(Pair.of(Climate.parameters(temerature, humidity, continentalness, erosion, Parameter.point(1.1F), depth, weirdness), key));
}
public static boolean isDeepDarkRegion(DensityFunction erosionFunction, DensityFunction depthFunction, DensityFunction.FunctionContext functionContext) {
return erosionFunction.compute(functionContext) < -0.225F && depthFunction.compute(functionContext) > 0.9F;
}
public static String getDebugStringForPeaksAndValleys(double peaksAndValleysData) {
if (peaksAndValleysData < NoiseRouterData.peaksAndValleys(0.05F)) {
return "Valley";
} else if (peaksAndValleysData < NoiseRouterData.peaksAndValleys(0.26666668F)) {
return "Low";
} else if (peaksAndValleysData < NoiseRouterData.peaksAndValleys(0.4F)) {
return "Mid";
} else {
return peaksAndValleysData < NoiseRouterData.peaksAndValleys(0.56666666F) ? "High" : "Peak";
}
}
public String getDebugStringForContinentalness(double continentalness) {
double d = Climate.quantizeCoord((float)continentalness);
if (d < this.mushroomFieldsContinentalness.max()) {
return "Mushroom fields";
} else if (d < this.deepOceanContinentalness.max()) {
return "Deep ocean";
} else if (d < this.oceanContinentalness.max()) {
return "Ocean";
} else if (d < this.coastContinentalness.max()) {
return "Coast";
} else if (d < this.nearInlandContinentalness.max()) {
return "Near inland";
} else {
return d < this.midInlandContinentalness.max() ? "Mid inland" : "Far inland";
}
}
public String getDebugStringForErosion(double erosion) {
return getDebugStringForNoiseValue(erosion, this.erosions);
}
public String getDebugStringForTemperature(double temperature) {
return getDebugStringForNoiseValue(temperature, this.temperatures);
}
public String getDebugStringForHumidity(double humidity) {
return getDebugStringForNoiseValue(humidity, this.humidities);
}
private static String getDebugStringForNoiseValue(double depth, Parameter[] values) {
double d = Climate.quantizeCoord((float)depth);
for (int i = 0; i < values.length; i++) {
if (d < values[i].max()) {
return i + "";
}
}
return "?";
}
@VisibleForDebug
public Parameter[] getTemperatureThresholds() {
return this.temperatures;
}
@VisibleForDebug
public Parameter[] getHumidityThresholds() {
return this.humidities;
}
@VisibleForDebug
public Parameter[] getErosionThresholds() {
return this.erosions;
}
@VisibleForDebug
public Parameter[] getContinentalnessThresholds() {
return new Parameter[]{
this.mushroomFieldsContinentalness,
this.deepOceanContinentalness,
this.oceanContinentalness,
this.coastContinentalness,
this.nearInlandContinentalness,
this.midInlandContinentalness,
this.farInlandContinentalness
};
}
@VisibleForDebug
public Parameter[] getPeaksAndValleysThresholds() {
return new Parameter[]{
Parameter.span(-2.0F, NoiseRouterData.peaksAndValleys(0.05F)),
Parameter.span(NoiseRouterData.peaksAndValleys(0.05F), NoiseRouterData.peaksAndValleys(0.26666668F)),
Parameter.span(NoiseRouterData.peaksAndValleys(0.26666668F), NoiseRouterData.peaksAndValleys(0.4F)),
Parameter.span(NoiseRouterData.peaksAndValleys(0.4F), NoiseRouterData.peaksAndValleys(0.56666666F)),
Parameter.span(NoiseRouterData.peaksAndValleys(0.56666666F), 2.0F)
};
}
@VisibleForDebug
public Parameter[] getWeirdnessThresholds() {
return new Parameter[]{Parameter.span(-2.0F, 0.0F), Parameter.span(0.0F, 2.0F)};
}
}