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.levelgen.DensityFunction.SinglePointContext; public class TheEndBiomeSource extends BiomeSource { public static final MapCodec 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 end; private final Holder highlands; private final Holder midlands; private final Holder islands; private final Holder barrens; public static TheEndBiomeSource create(HolderGetter 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 end, Holder highlands, Holder midlands, Holder islands, Holder barrens) { this.end = end; this.highlands = highlands; this.midlands = midlands; this.islands = islands; this.barrens = barrens; } @Override protected Stream> collectPossibleBiomes() { return Stream.of(this.end, this.highlands, this.midlands, this.islands, this.barrens); } @Override protected MapCodec codec() { return CODEC; } @Override public Holder getNoiseBiome(int i, int j, int k, Climate.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 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; } } } }