hytale-server/com/hypixel/hytale/procedurallib/json/PointEvaluatorJsonLoader.java

103 lines
4.3 KiB
Java

package com.hypixel.hytale.procedurallib.json;
import com.google.gson.JsonElement;
import com.hypixel.hytale.procedurallib.condition.DoubleThresholdCondition;
import com.hypixel.hytale.procedurallib.condition.IDoubleCondition;
import com.hypixel.hytale.procedurallib.condition.IDoubleThreshold;
import com.hypixel.hytale.procedurallib.logic.cell.DistanceCalculationMode;
import com.hypixel.hytale.procedurallib.logic.cell.MeasurementMode;
import com.hypixel.hytale.procedurallib.logic.cell.PointDistanceFunction;
import com.hypixel.hytale.procedurallib.logic.cell.evaluator.BorderPointEvaluator;
import com.hypixel.hytale.procedurallib.logic.cell.evaluator.JitterPointEvaluator;
import com.hypixel.hytale.procedurallib.logic.cell.evaluator.PointEvaluator;
import com.hypixel.hytale.procedurallib.logic.cell.evaluator.SkipCellPointEvaluator;
import com.hypixel.hytale.procedurallib.logic.cell.jitter.CellJitter;
import com.hypixel.hytale.procedurallib.logic.cell.jitter.DefaultCellJitter;
import com.hypixel.hytale.procedurallib.supplier.IDoubleRange;
import java.nio.file.Path;
import javax.annotation.Nonnull;
import javax.annotation.Nullable;
public class PointEvaluatorJsonLoader<T extends SeedResource> extends AbstractCellJitterJsonLoader<T, PointEvaluator> {
@Nonnull
protected final MeasurementMode measurementMode;
protected final PointDistanceFunction pointDistanceFunction;
public PointEvaluatorJsonLoader(@Nonnull SeedString<T> seed, Path dataFolder, JsonElement json) {
this(seed, dataFolder, json, null);
}
public PointEvaluatorJsonLoader(@Nonnull SeedString<T> seed, Path dataFolder, JsonElement json, @Nullable PointDistanceFunction pointDistanceFunction) {
this(seed, dataFolder, json, MeasurementMode.CENTRE_DISTANCE, pointDistanceFunction);
}
public PointEvaluatorJsonLoader(
@Nonnull SeedString<T> seed,
Path dataFolder,
JsonElement json,
@Nonnull MeasurementMode measurementMode,
@Nullable PointDistanceFunction pointDistanceFunction
) {
super(seed.append(".PointEvaluator"), dataFolder, json);
this.measurementMode = measurementMode;
this.pointDistanceFunction = pointDistanceFunction;
}
public PointEvaluator load() {
return switch (this.measurementMode) {
case CENTRE_DISTANCE -> this.loadCentrePointEvaluator();
case BORDER_DISTANCE -> this.loadBorderPointEvaluator();
};
}
public PointEvaluator loadCentrePointEvaluator() {
return PointEvaluator.of(
this.loadPointDistanceFunction(), this.loadDensity(), this.loadDistanceRange(), this.loadSkipCount(), this.loadSkipMode(), this.loadJitter()
);
}
@Nonnull
public PointEvaluator loadBorderPointEvaluator() {
BorderPointEvaluator pointEvaluator = BorderPointEvaluator.INSTANCE;
CellJitter jitter = this.loadJitter();
return (PointEvaluator)(jitter == DefaultCellJitter.DEFAULT_ONE ? pointEvaluator : new JitterPointEvaluator(pointEvaluator, jitter));
}
public PointDistanceFunction loadPointDistanceFunction() {
if (this.pointDistanceFunction != null) {
return this.pointDistanceFunction;
} else {
DistanceCalculationMode distanceCalculationMode = CellNoiseJsonLoader.Constants.DEFAULT_DISTANCE_MODE;
if (this.has("DistanceMode")) {
distanceCalculationMode = DistanceCalculationMode.valueOf(this.get("DistanceMode").getAsString());
}
return distanceCalculationMode.getFunction();
}
}
@Nullable
public IDoubleRange loadDistanceRange() {
return !this.has("DistanceRange") ? null : new DoubleRangeJsonLoader<>(this.seed, this.dataFolder, this.get("DistanceRange")).load();
}
@Nullable
public IDoubleCondition loadDensity() {
if (!this.has("Density")) {
return null;
} else {
IDoubleThreshold threshold = new DoubleThresholdJsonLoader<>(this.seed, this.dataFolder, this.get("Density")).load();
return new DoubleThresholdCondition(threshold);
}
}
public int loadSkipCount() {
return this.mustGetNumber("Skip", 0).intValue();
}
public SkipCellPointEvaluator.Mode loadSkipMode() {
String name = this.mustGetString("SkipMode", SkipCellPointEvaluator.DEFAULT_MODE.name());
return SkipCellPointEvaluator.Mode.valueOf(name);
}
}