CaveDungeonSearchUtil class
Пакет: com.hypixel.hytale.builtin.locate
Файл: com/hypixel/hytale/builtin/locate/CaveDungeonSearchUtil.java
Поля (49)
| Модификаторы | Тип | Имя |
|---|---|---|
final |
HytaleLogger |
LOGGER |
|
|
break |
|
|
break |
|
|
return |
|
ArrayList |
var1 |
|
LinkedHashSet |
var1 |
|
CaveNodeType |
var11 |
|
LongOpenHashSet |
var11 |
|
CaveDungeonSearchUtil.DungeonResult[] |
var12 |
|
long[] |
var13 |
|
int[] |
var14 |
|
boolean[] |
var15 |
|
SpiralIterator |
var16 |
|
int |
var17 |
|
long |
var18 |
|
int |
var18 |
|
int |
var19 |
|
String |
var2 |
|
String |
var20 |
|
int |
var20 |
|
long |
var20 |
|
String |
var21 |
|
int |
var21 |
|
String |
var22 |
|
int |
var22 |
|
long |
var22 |
|
long |
var23 |
|
ZoneBiomeResult |
var24 |
|
long |
var24 |
|
Zone |
var25 |
|
LinkedHashMap |
var26 |
|
long |
var26 |
|
Cave |
var28 |
|
|
var28 |
|
CaveType |
var29 |
|
boolean |
var29 |
|
|
var29 |
|
Vector3d[] |
var3 |
|
int |
var30 |
|
int |
var31 |
|
Vector3i |
var32 |
|
Vector3d[] |
var4 |
|
String |
var5 |
|
Vector3d |
var5 |
|
CaveGenerator |
var6 |
|
int |
var6 |
|
int |
var7 |
|
int |
var8 |
|
long |
var9 |
Методы (13)
| Модификаторы | Возврат | Сигнатура |
|---|---|---|
public |
record |
DungeonResultrecord DungeonResult(@Nonnull String displayName, int x, int y, int z) |
public |
record |
DungeonTargetrecord DungeonTarget(@Nonnull Zone zone, @Nonnull CaveType caveType, @Nullable String nodeKeyPrefix, @Nonnull String displayName) |
public |
record |
SearchOutcomerecord SearchOutcome(@Nullable CaveDungeonSearchUtil.DungeonResult nearest, boolean materializationCapped) |
|
|
for for(CaveDungeonSearchUtil.DungeonTarget var28 : var5) |
|
|
if if(var6 != null) |
|
|
if if(var17++ >= 10000000) |
|
|
if if(var12[0] != null) |
|
|
if if(var23 * var23 > var13[0]) |
|
|
if if(var26 <= var9 && var26 < var13[0]) |
|
|
if if(!var29) |
|
|
if if(var14[0] >= 64) |
|
|
if if(var28 != null) |
|
|
if if(var32 != null) |
Исходный код
Показать/скрыть
class="kw">package com.hypixel.hytale.builtin.locate;
class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import com.hypixel.hytale.math.iterator.SpiralIterator;
class="kw">import com.hypixel.hytale.math.util.ChunkUtil;
class="kw">import com.hypixel.hytale.math.util.MathUtil;
class="kw">import com.hypixel.hytale.server.worldgen.cave.Cave;
class="kw">import com.hypixel.hytale.server.worldgen.cave.CaveGenerator;
class="kw">import com.hypixel.hytale.server.worldgen.cave.CaveNodeType;
class="kw">import com.hypixel.hytale.server.worldgen.cave.CaveType;
class="kw">import com.hypixel.hytale.server.worldgen.chunk.ChunkGenerator;
class="kw">import com.hypixel.hytale.server.worldgen.chunk.ZoneBiomeResult;
class="kw">import com.hypixel.hytale.server.worldgen.chunk.populator.CavePopulator;
class="kw">import com.hypixel.hytale.server.worldgen.zone.Zone;
class="kw">import it.unimi.dsi.fastutil.longs.LongOpenHashSet;
class="kw">import java.util.ArrayList;
class="kw">import java.util.Collection;
class="kw">import java.util.LinkedHashMap;
class="kw">import java.util.LinkedHashSet;
class="kw">import java.util.List;
class="kw">import java.util.Map.Entry;
class="kw">import java.util.concurrent.CompletionException;
class="kw">import java.util.logging.Level;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">import org.joml.Vector3d;
class="kw">import org.joml.Vector3i;
class="kw">public class="kw">final class CaveDungeonSearchUtil {
class="kw">private class="kw">static class="kw">final HytaleLogger LOGGER = HytaleLogger.forEnclosingClass();
class="kw">private class="kw">static class="kw">final int MAX_ITERATIONS = 10000000;
class="kw">private class="kw">static class="kw">final int MAX_CAVE_MATERIALIZATIONS = 64;
class="kw">private class="kw">static class="kw">final String ENTRY_NODE_SUFFIX = ".Entry";
class="kw">private CaveDungeonSearchUtil() {
}
@Nonnull
class="kw">public class="kw">static List<CaveDungeonSearchUtil.DungeonTarget> collectTargets(@Nonnull ChunkGenerator var0) {
ArrayList var1 = new ArrayList<>();
for (Zone var5 : var0.getZonePatternProvider().getZones()) {
CaveGenerator var6 = var5.caveGenerator();
if (var6 != null) {
for (CaveType var10 : var6.getCaveTypes()) {
var1.add(new CaveDungeonSearchUtil.DungeonTarget(var5, var10, null, var10.getName()));
CaveNodeType var11 = var10.getEntryNode();
if (var11 != null && var11.getChildren() != null) {
for (CaveNodeType.CaveNodeChildEntry var15 : var11.getChildren()) {
for (CaveNodeType var19 : var15.getTypes().internalKeys()) {
String var20 = var19.getName();
if (var20.endsWith(".Entry")) {
String var21 = var20.substring(0, var20.length() - ".Entry".length());
String var22 = var21.substring(var21.lastIndexOf(46) + 1);
if (!var22.isEmpty()) {
var1.add(new CaveDungeonSearchUtil.DungeonTarget(var5, var10, var21 + ".", var22));
}
}
}
}
}
}
}
}
class="kw">return var1;
}
@Nonnull
class="kw">public class="kw">static Collection<String> collectDungeonNames(@Nonnull ChunkGenerator var0) {
LinkedHashSet var1 = new LinkedHashSet<>();
for (CaveDungeonSearchUtil.DungeonTarget var3 : collectTargets(var0)) {
var1.add(var3.displayName());
}
class="kw">return var1;
}
@Nonnull
class="kw">public class="kw">static CaveDungeonSearchUtil.SearchOutcome findNearest(
@Nonnull ChunkGenerator var0, int var1, int var2, int var3, int var4, @Nonnull List<CaveDungeonSearchUtil.DungeonTarget> var5
) {
int var6 = Math.floorDiv(var2, 32);
int var7 = Math.floorDiv(var3, 32);
int var8 = var4 / 32;
long var9 = (long)var4 * var4;
LongOpenHashSet var11 = new LongOpenHashSet();
CaveDungeonSearchUtil.DungeonResult[] var12 = new CaveDungeonSearchUtil.DungeonResult[]{null};
long[] var13 = new long[]{Long.MAX_VALUE};
int[] var14 = new int[]{0};
boolean[] var15 = new boolean[]{false};
SpiralIterator var16 = new SpiralIterator(var6, var7, var8);
int var17 = 0;
while (var16.hasNext() && !var15[0]) {
if (var17++ >= 10000000) {
LOGGER.at(Level.WARNING).log("Dungeon search hit iteration cap (%d)", 10000000);
break;
}
long var18 = var16.next();
int var20 = ChunkUtil.xOfChunkIndex(var18);
int var21 = ChunkUtil.zOfChunkIndex(var18);
if (var12[0] != null) {
int var22 = Math.max(Math.abs(var20 - var6), Math.abs(var21 - var7));
long var23 = Math.max(0L, (var22 - 1) * 32L);
if (var23 * var23 > var13[0]) {
break;
}
}
int var30 = var20 * 32;
int var31 = var21 * 32;
ZoneBiomeResult var24 = var0.getZoneBiomeResultAt(var1, var30, var31);
Zone var25 = var24.getZoneResult().getZone();
LinkedHashMap var26 = new LinkedHashMap<>();
for (CaveDungeonSearchUtil.DungeonTarget var28 : var5) {
if (var28.zone() == var25) {
var26.computeIfAbsent(var28.caveType(), var0x -> new ArrayList<>(2)).add(var28);
}
}
for (Entry var33 : var26.entrySet()) {
CaveType var29 = var33.getKey();
var29.getEntryPointGenerator().collect(var1, var30, var31, var30 + 32, var31 + 32, (var14x, var16x) -> {
int var18 = MathUtil.floor(var14x);
int var19 = MathUtil.floor(var16x);
long var20 = (long)var18 << 32 | var19 & 4294967295L;
if (var11.add(var20)) {
long var22 = (long)var18 - var2;
long var24 = (long)var19 - var3;
long var26 = var22 * var22 + var24 * var24;
if (var26 <= var9 && var26 < var13[0]) {
if (var0.getZoneBiomeResultAt(var1, var18, var19).getZoneResult().getZone() == var25) {
if (var29.isEntryThreshold(var1, var18, var19)) {
if (CavePopulator.isMatchingHeightThreshold(var1, var18, var19, var0, var29)) {
Cave var28 = null;
boolean var29 = false;
for (CaveDungeonSearchUtil.DungeonTarget var31 : var33.getValue()) {
if (var31.nodeKeyPrefix() == null) {
var12[0] = new CaveDungeonSearchUtil.DungeonResult(var31.displayName(), var18, var0.getHeight(var1, var18, var19), var19);
var13[0] = var26;
} else {
if (!var29) {
if (var14[0] >= 64) {
var15[0] = true;
class="kw">return;
}
var14[0]++;
var28 = materializeCave(var0, var29, var1, var18, var19);
var29 = true;
}
if (var28 != null) {
Vector3i var32 = findNodeWithPrefix(var28, var31.nodeKeyPrefix());
if (var32 != null) {
var12[0] = new CaveDungeonSearchUtil.DungeonResult(var31.displayName(), var32.x, var32.y, var32.z);
var13[0] = var26;
}
}
}
}
}
}
}
}
}
});
}
}
class="kw">return new CaveDungeonSearchUtil.SearchOutcome(var12[0], var15[0] && var12[0] == null);
}
@Nullable
class="kw">private class="kw">static Cave materializeCave(@Nonnull ChunkGenerator var0, @Nonnull CaveType var1, int var2, int var3, int var4) {
try {
class="kw">return var0.getCaveAsync(var1, var2, var3, var4).join();
} catch (CompletionException var6) {
((HytaleLogger.Api)LOGGER.at(Level.WARNING).withCause(var6)).log("Failed to materialize cave '%s' at %d, %d", var1.getName(), var3, var4);
class="kw">return null;
}
}
@Nullable
class="kw">private class="kw">static Vector3i findNodeWithPrefix(@Nonnull Cave var0, @Nonnull String var1) {
String var2 = var1 + "Entry";
Vector3d[] var3 = new Vector3d[]{null};
Vector3d[] var4 = new Vector3d[]{null};
var0.forEachNode(var4x -> {
String var5 = var4x.getCaveNodeType().getName();
if (var5.equals(var2)) {
var3[0] = var4x.getShape().getStart();
} else if (var4[0] == null && var5.startsWith(var1)) {
var4[0] = var4x.getShape().getStart();
}
});
Vector3d var5 = var3[0] != null ? var3[0] : var4[0];
class="kw">return var5 == null ? null : new Vector3i(MathUtil.floor(var5.x()), MathUtil.floor(var5.y()), MathUtil.floor(var5.z()));
}
class="kw">public record DungeonResult(@Nonnull String displayName, int x, int y, int z) {
class="kw">public DungeonResult {
}
}
class="kw">public record DungeonTarget(@Nonnull Zone zone, @Nonnull CaveType caveType, @Nullable String nodeKeyPrefix, @Nonnull String displayName) {
class="kw">public DungeonTarget {
}
}
class="kw">public record SearchOutcome(@Nullable CaveDungeonSearchUtil.DungeonResult nearest, boolean materializationCapped) {
class="kw">public SearchOutcome {
}
}
}