PrefabPatternSearchUtil class

Пакет: com.hypixel.hytale.builtin.locate

Файл: com/hypixel/hytale/builtin/locate/PrefabPatternSearchUtil.java

Поля (47)

МодификаторыТипИмя
final HytaleLogger LOGGER
break
String var10
long[] var11
UniquePrefabContainer.UniquePrefabEntry[] var12
ArrayList var13
long var13
LongOpenHashSet var14
FastRandom var15
long var15
Comparator var16
SpiralIterator var17
int var18
long var19
String var2
int var21
int var21
int var22
int var22
ZoneBiomeResult var23
long var23
Biome var24
PrefabContainer var25
ZoneBiomeResult var25
int var26
WorldGenPrefabSupplier var26
long var27
long var29
long var31
long var31
PrefabPatternGenerator var33
int var33
int var34
Vector3i var34
long var35
long var37
long var4
long var5
long var6
int var6
var6
var6
var6
int var7
int var8
int var8
int var9

Методы (11)

МодификаторыВозвратСигнатура
static boolean entryMatchesPrefabKeyboolean entryMatchesPrefabKey(@Nonnull PrefabContainer.PrefabContainerEntry var0, @Nonnull String var1)
static int estimateHeightint estimateHeight(@Nonnull ChunkGenerator var0, int var1, int var2, int var3, @Nonnull PrefabPatternGenerator var4, @Nonnull Biome var5)
for for(UniquePrefabContainer.UniquePrefabEntry var12 : var3)
if if(var18++ >= 10000000)
if if(var25 != null)
if if(var26 != null)
if if(var31 <= var11[0])
if if(var4 <= 0L)
if if(var13 * var13 + var15 * var15 <= var6)
static boolean isWithinUniquePrefabExclusionRangeboolean isWithinUniquePrefabExclusionRange(int var0, int var1, @Nonnull PrefabPatternGenerator var2, @Nonnull UniquePrefabContainer.UniquePrefabEntry[] var3)
static boolean matchesPrefabKeyboolean matchesPrefabKey(@Nonnull WorldGenPrefabSupplier var0, @Nonnull String var1)

Исходный код

Показать/скрыть
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.FastRandom;
class="kw">import com.hypixel.hytale.math.util.HashUtil;
class="kw">import com.hypixel.hytale.math.util.MathUtil;
class="kw">import com.hypixel.hytale.server.worldgen.biome.Biome;
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.container.PrefabContainer;
class="kw">import com.hypixel.hytale.server.worldgen.container.UniquePrefabContainer;
class="kw">import com.hypixel.hytale.server.worldgen.loader.WorldGenPrefabSupplier;
class="kw">import com.hypixel.hytale.server.worldgen.prefab.PrefabPatternGenerator;
class="kw">import it.unimi.dsi.fastutil.longs.LongOpenHashSet;
class="kw">import java.util.ArrayList;
class="kw">import java.util.Arrays;
class="kw">import java.util.Collection;
class="kw">import java.util.Comparator;
class="kw">import java.util.LinkedHashSet;
class="kw">import java.util.List;
class="kw">import java.util.Locale;
class="kw">import java.util.Map;
class="kw">import java.util.Objects;
class="kw">import java.util.Map.Entry;
class="kw">import java.util.logging.Level;
class="kw">import java.util.stream.Collectors;
class="kw">import javax.annotation.Nonnull;
class="kw">import org.joml.Vector3i;

class="kw">public class="kw">final class PrefabPatternSearchUtil {
   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 PrefabPatternSearchUtil() {
   }

   @Nonnull
   class="kw">public class="kw">static Collection<String> collectAllPrefabKeys(@Nonnull ChunkGenerator var0) {
      class="kw">return Arrays.stream(var0.getZonePatternProvider().getZones())
         .flatMap(var0x -> Arrays.stream(var0x.biomePatternGenerator().getBiomes()))
         .map(Biome::getPrefabContainer)
         .filter(Objects::nonNull)
         .flatMap(var0x -> Arrays.stream(var0x.getEntries()))
         .flatMap(var0x -> Arrays.stream(var0x.getPrefabs().internalKeys()))
         .map(var0x -> stripWildcard(var0x.getPrefabKey()))
         .collect(Collectors.toCollection(LinkedHashSet::new));
   }

   @Nonnull
   class="kw">public class="kw">static List<Entry<String, Vector3i>> search(@Nonnull ChunkGenerator var0, int var1, int var2, int var3, int var4, @Nonnull String var5, int var6) {
      int var7 = Math.floorDiv(var2, 32);
      int var8 = Math.floorDiv(var3, 32);
      int var9 = var4 / 32;
      String var10 = var5.toLowerCase(Locale.ROOT);
      long[] var11 = new long[]{(long)var4 * var4};
      UniquePrefabContainer.UniquePrefabEntry[] var12 = var0.getUniquePrefabs(var1);
      ArrayList var13 = new ArrayList<>();
      LongOpenHashSet var14 = new LongOpenHashSet();
      FastRandom var15 = new FastRandom(0L);
      Comparator var16 = Comparator.comparingLong(var2x -> {
         long var3 = (long)var2x.getValue().x - var2;
         long var5 = (long)var2x.getValue().z - var3;
         class="kw">return var3 * var3 + var5 * var5;
      });
      SpiralIterator var17 = new SpiralIterator(var7, var8, var9);
      int var18 = 0;

      while (var17.hasNext()) {
         if (var18++ >= 10000000) {
            LOGGER.at(Level.WARNING).log("Prefab search for '%s' hit iteration cap (%d) with %d results found so far", var5, 10000000, var13.size());
            break;
         }

         long var19 = var17.next();
         int var21 = ChunkUtil.xOfChunkIndex(var19) * 32;
         int var22 = ChunkUtil.zOfChunkIndex(var19) * 32;
         ZoneBiomeResult var23 = var0.getZoneBiomeResultAt(var1, var21, var22);
         Biome var24 = var23.getBiome();
         PrefabContainer var25 = var24.getPrefabContainer();
         if (var25 != null) {
            int var26 = 0;

            for (PrefabContainer.PrefabContainerEntry var30 : var25.getEntries()) {
               var26++;
               if (entryMatchesPrefabKey(var30, var10)) {
                  long var31 = HashUtil.hash(var1, var24.getId(), var26);
                  PrefabPatternGenerator var33 = var30.getPrefabPatternGenerator();
                  int var34 = var33.getMaxSize();
                  var33.getGridGenerator().collect(var1, var21 - var34, var22 - var34, var21 + 32 + var34, var22 + 32 + var34, (var17x, var19x) -> {
                     int var21 = (int)MathUtil.fastFloor(var17x);
                     int var22 = (int)MathUtil.fastFloor(var19x);
                     long var23 = (long)var21 << 32 | var22 & 4294967295L;
                     if (var14.add(var23)) {
                        if (var33.getMapCondition().eval(var1, var21, var22)) {
                           ZoneBiomeResult var25 = var0.getZoneBiomeResultAt(var1, var21, var22);
                           if (var25.getBiome() == var24) {
                              if (var12 == null || !isWithinUniquePrefabExclusionRange(var21, var22, var33, var12)) {
                                 var15.setSeed(HashUtil.hash(var31, var21, var22) * 1609272495L);
                                 WorldGenPrefabSupplier var26 = var30.getPrefabs().get(var15);
                                 if (var26 != null) {
                                    if (matchesPrefabKey(var26, var10)) {
                                       long var27 = (long)var21 - var2;
                                       long var29 = (long)var22 - var3;
                                       long var31 = var27 * var27 + var29 * var29;
                                       if (var31 <= var11[0]) {
                                          int var33 = estimateHeight(var0, var1, var21, var22, var33, var24);
                                          var13.add(Map.entry(stripWildcard(var26.getPrefabKey()), new Vector3i(var21, var33, var22)));
                                          if (var13.size() >= var6 * 2) {
                                             var13.sort(var16);
                                             var13.subList(var6, var13.size()).clear();
                                             Vector3i var34 = var13.get(var13.size() - 1).getValue();
                                             long var35 = (long)var34.x - var2;
                                             long var37 = (long)var34.z - var3;
                                             var11[0] = var35 * var35 + var37 * var37;
                                          }
                                       }
                                    }
                                 }
                              }
                           }
                        }
                     }
                  });
               }
            }
         }
      }

      var13.sort(var16);
      if (var13.size() > var6) {
         var13.subList(var6, var13.size()).clear();
      }

      class="kw">return var13;
   }

   class="kw">private class="kw">static boolean entryMatchesPrefabKey(@Nonnull PrefabContainer.PrefabContainerEntry var0, @Nonnull String var1) {
      for (WorldGenPrefabSupplier var5 : var0.getPrefabs().internalKeys()) {
         if (matchesPrefabKey(var5, var1)) {
            class="kw">return true;
         }
      }

      class="kw">return false;
   }

   class="kw">private class="kw">static boolean matchesPrefabKey(@Nonnull WorldGenPrefabSupplier var0, @Nonnull String var1) {
      String var2 = stripWildcard(var0.getPrefabKey()).toLowerCase(Locale.ROOT);
      class="kw">return var2.equals(var1) || var2.startsWith(var1 + ".");
   }

   class="kw">private class="kw">static boolean isWithinUniquePrefabExclusionRange(
      int var0, int var1, @Nonnull PrefabPatternGenerator var2, @Nonnull UniquePrefabContainer.UniquePrefabEntry[] var3
   ) {
      long var4 = var2.getExclusionRadius();
      if (var4 <= 0L) {
         class="kw">return false;
      }

      long var6 = var4 * var4;
      int var8 = var2.getCategory().priority();

      for (UniquePrefabContainer.UniquePrefabEntry var12 : var3) {
         if (var8 < var12.getCategory().priority()) {
            long var13 = (long)var0 - var12.getPosition().x();
            long var15 = (long)var1 - var12.getPosition().z();
            if (var13 * var13 + var15 * var15 <= var6) {
               class="kw">return true;
            }
         }
      }

      class="kw">return false;
   }

   class="kw">private class="kw">static int estimateHeight(@Nonnull ChunkGenerator var0, int var1, int var2, int var3, @Nonnull PrefabPatternGenerator var4, @Nonnull Biome var5) {
      int var6;
      if (var4.isOnWater()) {
         var6 = var5.getWaterContainer().getMaxHeight(var1, var2, var3);
      } else if (var4.isDeepSearch()) {
         var6 = var0.generateHeightBetween(var1, var2, var3, var4.getHeightThresholdInterpreter());
      } else {
         var6 = var0.getHeight(var1, var2, var3);
      }

      class="kw">return var6 + var4.getDisplacement(var1, var2, var3);
   }

   @Nonnull
   class="kw">static String stripWildcard(@Nonnull String var0) {
      class="kw">return var0.endsWith(".*") ? var0.substring(0, var0.length() - 2) : var0;
   }
}