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 {
      }
   }
}