package net.minecraft.world.level.levelgen.feature.stateproviders; import com.mojang.datafixers.Products.P4; import com.mojang.serialization.MapCodec; import com.mojang.serialization.codecs.RecordCodecBuilder; import com.mojang.serialization.codecs.RecordCodecBuilder.Instance; import com.mojang.serialization.codecs.RecordCodecBuilder.Mu; import java.util.List; import net.minecraft.core.BlockPos; import net.minecraft.util.ExtraCodecs; import net.minecraft.util.Mth; import net.minecraft.util.RandomSource; import net.minecraft.world.level.block.state.BlockState; import net.minecraft.world.level.levelgen.synth.NormalNoise.NoiseParameters; public class NoiseProvider extends NoiseBasedStateProvider { public static final MapCodec CODEC = RecordCodecBuilder.mapCodec(instance -> noiseProviderCodec(instance).apply(instance, NoiseProvider::new)); protected final List states; protected static

P4, Long, NoiseParameters, Float, List> noiseProviderCodec(Instance

instance) { return noiseCodec(instance).and(ExtraCodecs.nonEmptyList(BlockState.CODEC.listOf()).fieldOf("states").forGetter(noiseProvider -> noiseProvider.states)); } public NoiseProvider(long seed, NoiseParameters parameters, float scale, List states) { super(seed, parameters, scale); this.states = states; } @Override protected BlockStateProviderType type() { return BlockStateProviderType.NOISE_PROVIDER; } @Override public BlockState getState(RandomSource random, BlockPos pos) { return this.getRandomState(this.states, pos, this.scale); } protected BlockState getRandomState(List possibleStates, BlockPos pos, double delta) { double d = this.getNoiseValue(pos, delta); return this.getRandomState(possibleStates, d); } protected BlockState getRandomState(List possibleStates, double delta) { double d = Mth.clamp((1.0 + delta) / 2.0, 0.0, 0.9999); return (BlockState)possibleStates.get((int)(d * possibleStates.size())); } }