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

81 lines
2.7 KiB
Java

package net.minecraft.world.level.biome;
import com.mojang.serialization.MapCodec;
import com.mojang.serialization.codecs.RecordCodecBuilder;
import java.util.stream.Stream;
import net.minecraft.core.Holder;
import net.minecraft.core.HolderGetter;
import net.minecraft.core.QuartPos;
import net.minecraft.core.SectionPos;
import net.minecraft.resources.RegistryOps;
import net.minecraft.world.level.biome.Climate.Sampler;
import net.minecraft.world.level.levelgen.DensityFunction;
public class TheEndBiomeSource extends BiomeSource {
public static final MapCodec<TheEndBiomeSource> CODEC = RecordCodecBuilder.mapCodec(
instance -> instance.group(
RegistryOps.retrieveElement(Biomes.THE_END),
RegistryOps.retrieveElement(Biomes.END_HIGHLANDS),
RegistryOps.retrieveElement(Biomes.END_MIDLANDS),
RegistryOps.retrieveElement(Biomes.SMALL_END_ISLANDS),
RegistryOps.retrieveElement(Biomes.END_BARRENS)
)
.apply(instance, instance.stable(TheEndBiomeSource::new))
);
private final Holder<Biome> end;
private final Holder<Biome> highlands;
private final Holder<Biome> midlands;
private final Holder<Biome> islands;
private final Holder<Biome> barrens;
public static TheEndBiomeSource create(HolderGetter<Biome> biomeGetter) {
return new TheEndBiomeSource(
biomeGetter.getOrThrow(Biomes.THE_END),
biomeGetter.getOrThrow(Biomes.END_HIGHLANDS),
biomeGetter.getOrThrow(Biomes.END_MIDLANDS),
biomeGetter.getOrThrow(Biomes.SMALL_END_ISLANDS),
biomeGetter.getOrThrow(Biomes.END_BARRENS)
);
}
private TheEndBiomeSource(Holder<Biome> end, Holder<Biome> highlands, Holder<Biome> midlands, Holder<Biome> islands, Holder<Biome> barrens) {
this.end = end;
this.highlands = highlands;
this.midlands = midlands;
this.islands = islands;
this.barrens = barrens;
}
@Override
protected Stream<Holder<Biome>> collectPossibleBiomes() {
return Stream.of(this.end, this.highlands, this.midlands, this.islands, this.barrens);
}
@Override
protected MapCodec<? extends BiomeSource> codec() {
return CODEC;
}
@Override
public Holder<Biome> getNoiseBiome(int i, int j, int k, Sampler sampler) {
int l = QuartPos.toBlock(i);
int m = QuartPos.toBlock(j);
int n = QuartPos.toBlock(k);
int o = SectionPos.blockToSectionCoord(l);
int p = SectionPos.blockToSectionCoord(n);
if ((long)o * o + (long)p * p <= 4096L) {
return this.end;
} else {
int q = (SectionPos.blockToSectionCoord(l) * 2 + 1) * 8;
int r = (SectionPos.blockToSectionCoord(n) * 2 + 1) * 8;
double d = sampler.erosion().compute(new DensityFunction.SinglePointContext(q, m, r));
if (d > 0.25) {
return this.highlands;
} else if (d >= -0.0625) {
return this.midlands;
} else {
return d < -0.21875 ? this.islands : this.barrens;
}
}
}
}