package net.minecraft.world.level.biome; import com.google.common.collect.Sets; import com.mojang.datafixers.util.Pair; import com.mojang.serialization.MapCodec; import java.util.Set; import java.util.function.Predicate; import java.util.stream.Stream; import net.minecraft.core.BlockPos; import net.minecraft.core.Holder; import net.minecraft.util.RandomSource; import net.minecraft.world.level.LevelReader; import net.minecraft.world.level.biome.BiomeManager.NoiseBiomeSource; import net.minecraft.world.level.biome.Climate.Sampler; import org.jetbrains.annotations.Nullable; public class FixedBiomeSource extends BiomeSource implements NoiseBiomeSource { public static final MapCodec CODEC = Biome.CODEC .fieldOf("biome") .xmap(FixedBiomeSource::new, fixedBiomeSource -> fixedBiomeSource.biome) .stable(); private final Holder biome; public FixedBiomeSource(Holder biome) { this.biome = biome; } @Override protected Stream> collectPossibleBiomes() { return Stream.of(this.biome); } @Override protected MapCodec codec() { return CODEC; } @Override public Holder getNoiseBiome(int i, int j, int k, Sampler sampler) { return this.biome; } @Override public Holder getNoiseBiome(int i, int j, int k) { return this.biome; } @Nullable @Override public Pair> findBiomeHorizontal( int x, int y, int z, int radius, int increment, Predicate> biomePredicate, RandomSource random, boolean findClosest, Sampler sampler ) { if (biomePredicate.test(this.biome)) { return findClosest ? Pair.of(new BlockPos(x, y, z), this.biome) : Pair.of(new BlockPos(x - radius + random.nextInt(radius * 2 + 1), y, z - radius + random.nextInt(radius * 2 + 1)), this.biome); } else { return null; } } @Nullable @Override public Pair> findClosestBiome3d( BlockPos pos, int radius, int horizontalStep, int verticalStep, Predicate> biomePredicate, Sampler sampler, LevelReader level ) { return biomePredicate.test(this.biome) ? Pair.of(pos, this.biome) : null; } @Override public Set> getBiomesWithin(int x, int y, int z, int radius, Sampler sampler) { return Sets.>newHashSet(Set.of(this.biome)); } }