48 lines
2 KiB
Java
48 lines
2 KiB
Java
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<NoiseProvider> CODEC = RecordCodecBuilder.mapCodec(instance -> noiseProviderCodec(instance).apply(instance, NoiseProvider::new));
|
|
protected final List<BlockState> states;
|
|
|
|
protected static <P extends NoiseProvider> P4<Mu<P>, Long, NoiseParameters, Float, List<BlockState>> noiseProviderCodec(Instance<P> 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<BlockState> 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<BlockState> possibleStates, BlockPos pos, double delta) {
|
|
double d = this.getNoiseValue(pos, delta);
|
|
return this.getRandomState(possibleStates, d);
|
|
}
|
|
|
|
protected BlockState getRandomState(List<BlockState> possibleStates, double delta) {
|
|
double d = Mth.clamp((1.0 + delta) / 2.0, 0.0, 0.9999);
|
|
return (BlockState)possibleStates.get((int)(d * possibleStates.size()));
|
|
}
|
|
}
|