package net.minecraft.world.level.levelgen.placement; import com.mojang.serialization.Codec; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; import net.minecraft.core.BlockPos; import net.minecraft.util.RandomSource; import net.minecraft.world.level.biome.Biome; public class NoiseThresholdCountPlacement extends RepeatingPlacement { public static final MapCodec CODEC = RecordCodecBuilder.mapCodec( i -> i.group( Codec.DOUBLE.fieldOf("noise_level").forGetter(c -> c.noiseLevel), Codec.INT.fieldOf("below_noise").forGetter(c -> c.belowNoise), Codec.INT.fieldOf("above_noise").forGetter(c -> c.aboveNoise) ) .apply(i, NoiseThresholdCountPlacement::new) ); private final double noiseLevel; private final int belowNoise; private final int aboveNoise; private NoiseThresholdCountPlacement(final double noiseLevel, final int belowNoise, final int aboveNoise) { this.noiseLevel = noiseLevel; this.belowNoise = belowNoise; this.aboveNoise = aboveNoise; } public static NoiseThresholdCountPlacement of(final double noiseLevel, final int belowNoise, final int aboveNoise) { return new NoiseThresholdCountPlacement(noiseLevel, belowNoise, aboveNoise); } @Override protected int count(final RandomSource random, final BlockPos origin) { double flowerNoise = Biome.BIOME_INFO_NOISE.getValue(origin.getX() / 200.0, origin.getZ() / 200.0, false); return flowerNoise < this.noiseLevel ? this.belowNoise : this.aboveNoise; } @Override public PlacementModifierType type() { return PlacementModifierType.NOISE_THRESHOLD_COUNT; } }