package com.hypixel.hytale.builtin.hytalegenerator.positionproviders;
import com.hypixel.hytale.builtin.hytalegenerator.density.Density;
import com.hypixel.hytale.builtin.hytalegenerator.framework.math.SeedGenerator;
import com.hypixel.hytale.math.util.FastRandom;
import javax.annotation.Nonnull;
public class FieldFunctionOccurrencePositionProvider extends PositionProvider {
public static final double FP_RESOLUTION = 100.0;
@Nonnull
private final Density field;
@Nonnull
private final PositionProvider positionProvider;
@Nonnull
private final SeedGenerator seedGenerator;
public FieldFunctionOccurrencePositionProvider(@Nonnull Density field, @Nonnull PositionProvider positionProvider, int seed) {
this.field = field;
this.positionProvider = positionProvider;
this.seedGenerator = new SeedGenerator((long)seed);
}
public void positionsIn(@Nonnull PositionProvider.Context context) {
PositionProvider.Context childContext = new PositionProvider.Context(context);
childContext.consumer = (position) -> {
Density.Context densityContext = new Density.Context();
densityContext.position = position;
densityContext.positionsAnchor = context.anchor;
densityContext.workerId = context.workerId;
double discardChance = 1.0 - this.field.process(densityContext);
FastRandom random = new FastRandom(this.seedGenerator.seedAt(position.x, position.y, position.z, 100.0));
if (!(discardChance > random.nextDouble())) {
context.consumer.accept(position);
}
};
this.positionProvider.positionsIn(childContext);
}
}