71 lines
2.9 KiB
Java
71 lines
2.9 KiB
Java
package net.minecraft.world.level.levelgen.feature.stateproviders;
|
|
|
|
import com.google.common.collect.Lists;
|
|
import com.mojang.serialization.Codec;
|
|
import com.mojang.serialization.MapCodec;
|
|
import com.mojang.serialization.codecs.RecordCodecBuilder;
|
|
import java.util.List;
|
|
import net.minecraft.core.BlockPos;
|
|
import net.minecraft.util.ExtraCodecs;
|
|
import net.minecraft.util.InclusiveRange;
|
|
import net.minecraft.util.Mth;
|
|
import net.minecraft.util.RandomSource;
|
|
import net.minecraft.world.level.block.state.BlockState;
|
|
import net.minecraft.world.level.levelgen.LegacyRandomSource;
|
|
import net.minecraft.world.level.levelgen.WorldgenRandom;
|
|
import net.minecraft.world.level.levelgen.synth.NormalNoise;
|
|
import net.minecraft.world.level.levelgen.synth.NormalNoise.NoiseParameters;
|
|
|
|
public class DualNoiseProvider extends NoiseProvider {
|
|
public static final MapCodec<DualNoiseProvider> CODEC = RecordCodecBuilder.mapCodec(
|
|
instance -> instance.group(
|
|
InclusiveRange.codec(Codec.INT, 1, 64).fieldOf("variety").forGetter(dualNoiseProvider -> dualNoiseProvider.variety),
|
|
NoiseParameters.DIRECT_CODEC.fieldOf("slow_noise").forGetter(dualNoiseProvider -> dualNoiseProvider.slowNoiseParameters),
|
|
ExtraCodecs.POSITIVE_FLOAT.fieldOf("slow_scale").forGetter(dualNoiseProvider -> dualNoiseProvider.slowScale)
|
|
)
|
|
.<long, NoiseParameters, float, List<BlockState>>and(noiseProviderCodec(instance))
|
|
.apply(instance, DualNoiseProvider::new)
|
|
);
|
|
private final InclusiveRange<Integer> variety;
|
|
private final NoiseParameters slowNoiseParameters;
|
|
private final float slowScale;
|
|
private final NormalNoise slowNoise;
|
|
|
|
public DualNoiseProvider(
|
|
InclusiveRange<Integer> variety,
|
|
NoiseParameters slowNoiseParameters,
|
|
float slowScale,
|
|
long seed,
|
|
NoiseParameters parameters,
|
|
float scale,
|
|
List<BlockState> states
|
|
) {
|
|
super(seed, parameters, scale, states);
|
|
this.variety = variety;
|
|
this.slowNoiseParameters = slowNoiseParameters;
|
|
this.slowScale = slowScale;
|
|
this.slowNoise = NormalNoise.create(new WorldgenRandom(new LegacyRandomSource(seed)), slowNoiseParameters);
|
|
}
|
|
|
|
@Override
|
|
protected BlockStateProviderType<?> type() {
|
|
return BlockStateProviderType.DUAL_NOISE_PROVIDER;
|
|
}
|
|
|
|
@Override
|
|
public BlockState getState(RandomSource random, BlockPos pos) {
|
|
double d = this.getSlowNoiseValue(pos);
|
|
int i = (int)Mth.clampedMap(d, -1.0, 1.0, (double)((Integer)this.variety.minInclusive()).intValue(), (double)((Integer)this.variety.maxInclusive() + 1));
|
|
List<BlockState> list = Lists.<BlockState>newArrayListWithCapacity(i);
|
|
|
|
for (int j = 0; j < i; j++) {
|
|
list.add(this.getRandomState(this.states, this.getSlowNoiseValue(pos.offset(j * 54545, 0, j * 34234))));
|
|
}
|
|
|
|
return this.getRandomState(list, pos, this.scale);
|
|
}
|
|
|
|
protected double getSlowNoiseValue(BlockPos pos) {
|
|
return this.slowNoise.getValue(pos.getX() * this.slowScale, pos.getY() * this.slowScale, pos.getZ() * this.slowScale);
|
|
}
|
|
}
|