package com.hypixel.hytale.server.worldgen.climate;
import com.hypixel.hytale.math.util.FastRandom;
import com.hypixel.hytale.math.util.MathUtil;
import com.hypixel.hytale.procedurallib.random.CoordinateRandomizer;
import com.hypixel.hytale.procedurallib.random.ICoordinateRandomizer;
import com.hypixel.hytale.server.worldgen.chunk.ChunkGenerator;
import com.hypixel.hytale.server.worldgen.chunk.MaskProvider;
import com.hypixel.hytale.server.worldgen.zone.Zone;
import com.hypixel.hytale.server.worldgen.zoom.ExactZoom;
import com.hypixel.hytale.server.worldgen.zoom.FuzzyZoom;
import com.hypixel.hytale.server.worldgen.zoom.PixelProvider;
import java.awt.image.BufferedImage;
import java.util.List;
import java.util.Map;
import javax.annotation.Nonnull;
public class ClimateMaskProvider extends MaskProvider {
private static final FuzzyZoom EMPTY_ZOOM;
@Nonnull
private final ICoordinateRandomizer randomizer;
@Nonnull
private final ClimateNoise noise;
@Nonnull
private final ClimateGraph graph;
@Nonnull
private final UniqueClimateGenerator uniqueGenerator;
public ClimateMaskProvider(@Nonnull ICoordinateRandomizer randomizer, @Nonnull ClimateNoise noise, @Nonnull ClimateGraph graph, @Nonnull UniqueClimateGenerator uniqueGenerator) {
super(EMPTY_ZOOM);
this.randomizer = randomizer;
this.noise = noise;
this.graph = graph;
this.uniqueGenerator = uniqueGenerator;
}
private ClimateMaskProvider(@Nonnull ClimateMaskProvider other, @Nonnull UniqueClimateGenerator uniqueGenerator) {
super(EMPTY_ZOOM);
this.randomizer = other.randomizer;
this.noise = other.noise;
this.graph = other.graph;
this.uniqueGenerator = uniqueGenerator;
}
@Nonnull
public ClimateGraph getGraph() {
return this.graph;
}
public boolean inBounds(double x, double y) {
return true;
}
public double getX(int seed, double x, double y) {
return this.randomizer.randomDoubleX(seed, x, y);
}
public double getY(int seed, double x, double y) {
return this.randomizer.randomDoubleY(seed, x, y);
}
public int get(int seed, double x, double y) {
int unique = this.uniqueGenerator.generate(MathUtil.floor(x), MathUtil.floor(y));
if (unique != -1) {
return unique;
} else {
ClimateNoise.Buffer buffer = ChunkGenerator.getResource().climateBuffer;
int id = this.noise.generate(seed, x, y, buffer, this.graph);
return ClimateType.color(id, this.graph);
}
}
public double distance(double x, double y) {
ClimateNoise.Buffer buffer = ChunkGenerator.getResource().climateBuffer;
return buffer.fade;
}
public MaskProvider generateUniqueZones(int seed, @Nonnull Zone.UniqueCandidate[] candidates, @Nonnull FastRandom random, @Nonnull List<Zone.Unique> collector) {
return candidates.length == 0 ? this : new ClimateMaskProvider(this, this.uniqueGenerator.apply(seed, candidates, this.noise, this.graph, collector));
}
public Zone.UniqueCandidate[] generateUniqueZoneCandidates(Zone.UniqueEntry[] entries, int maxPositions) {
return Zone.UniqueCandidate.EMPTY_ARRAY;
}
public Zone.UniqueCandidate[] getUniqueZoneCandidates(Map<String, Zone> zoneLookup) {
return this.uniqueGenerator.getCandidates(zoneLookup);
}
static {
EMPTY_ZOOM = new FuzzyZoom(CoordinateRandomizer.EMPTY_RANDOMIZER, new ExactZoom(new PixelProvider(new BufferedImage(1, 1, 1)), 1.0, 1.0, 0, 0));
}
}