Range class
Пакет: com.hypixel.hytale.server.worldgen.climate
Файл: com/hypixel/hytale/server/worldgen/climate/ClimateSearch.java
Поля (5)
| Модификаторы | Тип | Имя |
|---|---|---|
|
public static final ClimateSearch.Range |
DEFAULT |
|
public final double |
radius |
|
public final double |
value |
|
double |
var3 |
|
public final double |
weight |
Методы (2)
| Модификаторы | Возврат | Сигнатура |
|---|---|---|
|
public double |
scorepublic double score(double var1) |
|
public boolean |
testpublic boolean test(double var1) |
Исходный код
Показать/скрыть
class="kw">package com.hypixel.hytale.server.worldgen.climate;
class="kw">import com.hypixel.hytale.math.util.FastRandom;
class="kw">import com.hypixel.hytale.math.util.HashUtil;
class="kw">import java.util.concurrent.CompletableFuture;
class="kw">import javax.annotation.Nonnull;
class="kw">import org.joml.Vector2i;
class="kw">public class ClimateSearch {
class="kw">public class="kw">static class="kw">final int STEP_SIZE = 100;
class="kw">public class="kw">static class="kw">final int DEFAULT_RADIUS = 5000;
class="kw">public class="kw">static class="kw">final int MAX_RADIUS = 10000;
class="kw">public class="kw">static class="kw">final double PI2 = Math.PI * 2;
class="kw">public class="kw">static class="kw">final long SEED_OFFSET = 1659788403585L;
class="kw">public class="kw">static class="kw">final double TARGET_SCORE = 0.75;
class="kw">public ClimateSearch() {
}
class="kw">public class="kw">static CompletableFuture<ClimateSearch.Result> search(
int var0, int var1, int var2, int var3, int var4, @Nonnull ClimateSearch.Rule var5, @Nonnull ClimateNoise var6, @Nonnull ClimateGraph var7
) {
class="kw">return CompletableFuture.supplyAsync(() -> {
double var8 = 0.0;
Vector2i var10 = new Vector2i(var1, var2);
int var11 = Math.min(var4, 10000);
FastRandom var12 = new FastRandom(HashUtil.hash(var0, 1659788403585L));
long var13 = System.currentTimeMillis();
for (int var15 = var3; var15 <= var11; var15 += 100) {
int var16 = (int)Math.floor((Math.PI * 2) * var15 / 100.0);
double var17 = (Math.PI * 2) / var16;
double var19 = (Math.PI * 2) * var12.nextDouble();
for (int var21 = 0; var21 < var16; var21++) {
double var22 = var21 * var17 + var19;
int var24 = var1 + (int)(Math.cos(var22) * var15);
int var25 = var2 + (int)(Math.sin(var22) * var15);
double var26 = collect(var0, var24, var25, var6, var7, var5);
if (var26 > var8) {
var10.set(var24, var25);
var8 = var26;
}
}
if (var8 >= 0.75) {
break;
}
}
long var28 = System.currentTimeMillis() - var13;
class="kw">return new ClimateSearch.Result(var10, var8, var28);
});
}
class="kw">private class="kw">static double collect(int var0, int var1, int var2, ClimateNoise var3, ClimateGraph var4, ClimateSearch.Rule var5) {
double var6 = var3.continent.get(var0, var1, var2);
if (!var5.continent.test(var6)) {
class="kw">return 0.0;
}
double var8 = var3.temperature.get(var0, var1, var2);
if (!var5.temperature.test(var8)) {
class="kw">return 0.0;
}
double var10 = var3.intensity.get(var0, var1, var2);
if (!var5.intensity.test(var10)) {
class="kw">return 0.0;
}
double var12 = var4.getFadeRaw(var8, var10);
class="kw">return !var5.fade.test(var12) ? 0.0 : var5.score(var6, var8, var10, var12);
}
class="kw">public class="kw">static class Range {
class="kw">public class="kw">static class="kw">final ClimateSearch.Range DEFAULT = new ClimateSearch.Range(0.0, 1.0, 0.0);
class="kw">public class="kw">final double value;
class="kw">public class="kw">final double radius;
class="kw">public class="kw">final double weight;
class="kw">public Range(double var1, double var3, double var5) {
this.value = var1;
this.radius = var3;
this.weight = var5;
}
class="kw">public double score(double var1) {
double var3 = Math.min(this.radius, Math.abs(var1 - this.value));
class="kw">return 1.0 - var3 / this.radius;
}
class="kw">public boolean test(double var1) {
class="kw">return Math.abs(var1 - this.value) <= this.radius;
}
}
class="kw">public record Result(Vector2i position, double score, long time_ms) {
class="kw">public Result {
}
class="kw">public String pretty() {
double var1 = this.score * 100.0;
class="kw">return String.format("Position: {%d, %d}, Score: %.2f%%, Time: %dms", this.position.x, this.position.y, var1, this.time_ms);
}
}
class="kw">public class="kw">static class Rule {
class="kw">public class="kw">final ClimateSearch.Range continent;
class="kw">public class="kw">final ClimateSearch.Range temperature;
class="kw">public class="kw">final ClimateSearch.Range intensity;
class="kw">public class="kw">final ClimateSearch.Range fade;
class="kw">public class="kw">final class="kw">transient double sumWeight;
class="kw">public Rule(ClimateSearch.Range var1, ClimateSearch.Range var2, ClimateSearch.Range var3, ClimateSearch.Range var4) {
this.continent = var1;
this.temperature = var2;
this.intensity = var3;
this.fade = var4;
this.sumWeight = var1.weight + var2.weight + var3.weight + var4.weight;
}
class="kw">public double score(double var1, double var3, double var5, double var7) {
double var9 = 0.0;
var9 += this.continent.score(var1) * this.continent.weight;
var9 += this.temperature.score(var3) * this.temperature.weight;
var9 += this.intensity.score(var5) * this.intensity.weight;
var9 += this.fade.score(var7) * this.fade.weight;
class="kw">return var9 / this.sumWeight;
}
}
}