PortalSpawnFinder class

Пакет: com.hypixel.hytale.builtin.portals.ui

Файл: com/hypixel/hytale/builtin/portals/ui/PortalSpawnFinder.java

Поля (44)

МодификаторыТипИмя
final int MAX_ATTEMPTS_PER_WORLD
SOLID, FLUID, AIR, UNKNOWN
break
Vector3d var1
ChunkColumn var10
int var10
BlockChunk var11
int var11
int var12
PortalSpawnFinder.Material var13
BlockSection var13
PortalSpawnFinder.Material var14
int var14
boolean var15
BlockType var15
HLongSet var2
long var2
Vector3d var3
var3
List var3
Vector3d var3
int var3
Rotation3f var4
WorldChunk var4
int var4
WorldChunk var4
Vector3d var5
boolean var5
ThreadLocalRandom var5
int var5
long var6
int var6
World var6
int var6
Vector3d var7
int var7
ChunkStore var7
CompletableFuture var8
int var8
Ref var8
long var9
Vector3d var9
Store var9
int var9

Методы (17)

МодификаторыВозвратСигнатура
Material Material()
abstract return new Vector3dreturn new Vector3d(var1, var2 - var12, var3)
abstract return findWithGroundBelowreturn findWithGroundBelow(var4, var5, 319, var6, 319, true)
for for(int var6 = 0; var6 < 8; var6++)
for for(int var12 = 0; var12 < var4; var12++)
if if(var3 == null)
if if(var3 != null)
if if(var3 == null)
if if(var4 != null)
if if(var7 != null)
if if(var10 == null)
if if(var11 == null)
if if(!var15)
if if(var14 == PortalSpawnFinder.Material.SOLID)
if if(var12 != 0)
if if(var15 == null)
if if(var4 == null)

Исходный код

Показать/скрыть
class="kw">package com.hypixel.hytale.builtin.portals.ui;

class="kw">import com.hypixel.hytale.builtin.portals.utils.posqueries.predicates.FitsAPortal;
class="kw">import com.hypixel.hytale.common.fastutil.HLongOpenHashSet;
class="kw">import com.hypixel.hytale.common.fastutil.HLongSet;
class="kw">import com.hypixel.hytale.component.ComponentAccessor;
class="kw">import com.hypixel.hytale.component.Ref;
class="kw">import com.hypixel.hytale.component.Store;
class="kw">import com.hypixel.hytale.logger.HytaleLogger;
class="kw">import com.hypixel.hytale.math.util.ChunkUtil;
class="kw">import com.hypixel.hytale.math.vector.Rotation3f;
class="kw">import com.hypixel.hytale.math.vector.Transform;
class="kw">import com.hypixel.hytale.math.vector.Vector3dUtil;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.BlockType;
class="kw">import com.hypixel.hytale.server.core.modules.collision.WorldUtil;
class="kw">import com.hypixel.hytale.server.core.universe.world.World;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.BlockChunk;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.ChunkColumn;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.WorldChunk;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.section.BlockSection;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.ChunkStore;
class="kw">import java.util.ArrayList;
class="kw">import java.util.List;
class="kw">import java.util.concurrent.CompletableFuture;
class="kw">import java.util.concurrent.ThreadLocalRandom;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">import org.joml.Vector3d;
class="kw">import org.joml.Vector3dc;

class="kw">public class="kw">final class PortalSpawnFinder {
   class="kw">private class="kw">static class="kw">final int MAX_ATTEMPTS_PER_WORLD = 10;
   class="kw">private class="kw">static class="kw">final int QUALITY_ATTEMPTS = 2;
   class="kw">private class="kw">static class="kw">final int CHECKS_PER_CHUNK = 8;
   class="kw">private class="kw">static class="kw">final Vector3dc FALLBACK_POSITION = Vector3dUtil.ZERO;
   class="kw">private class="kw">static class="kw">final int FALLBACK_MARGIN = 2;

   class="kw">public PortalSpawnFinder() {
   }

   @Nonnull
   class="kw">public class="kw">static CompletableFuture<Transform> computeSpawnTransform(@Nonnull World var0, @Nonnull List<Vector3d> var1) {
      class="kw">return loadCandidateChunks(var0, var1)
         .thenApplyAsync(
            var2 -> {
               Vector3d var3 = guesstimateFromHints(var0, var1);
               if (var3 == null) {
                  var3 = findFallbackPositionOnGround(var0);
                  if (var3 != null) {
                     ((HytaleLogger.Api)HytaleLogger.getLogger().atWarning())
                        .log("Had to use fallback spawn for portal spawn (%d attempts) in %s", 10, var0.getName());
                  }
               }

               if (var3 == null) {
                  ((HytaleLogger.Api)HytaleLogger.getLogger().atWarning())
                     .log("Both dart and fallback spawn finder failed for portal spawn in %s", var0.getName());
                  class="kw">return null;
               } else {
                  Rotation3f var4 = Rotation3f.lookAt(var3).mul(-1.0F);
                  var4.setPitch(0.0F);
                  var4.setRoll(0.0F);
                  class="kw">return new Transform(new Vector3d(var3).add(0.0, 0.5, 0.0), var4);
               }
            },
            var0
         );
   }

   @Nonnull
   class="kw">private class="kw">static CompletableFuture<Void> loadCandidateChunks(@Nonnull World var0, @Nonnull List<Vector3d> var1) {
      HLongSet var2 = new HLongOpenHashSet();
      List var3 = new ArrayList<>();

      for (int var4 = 0; var4 < Math.min(var1.size(), 10); var4++) {
         Vector3d var5 = var1.get(var4);
         long var6 = ChunkUtil.indexChunkFromBlock(var5.x, var5.z);
         if (var2.add(var6)) {
            CompletableFuture var8 = var0.getChunkStore()
               .getChunkReferenceAsync(var6, 36)
               .thenApplyAsync(
                  var1x -> var1x == null ? null : var0.getChunkStore().getStore().getComponent((Ref<ChunkStore>)var1x, WorldChunk.getComponentType()), var0
               );
            var3.add(var8);
         }
      }

      long var9 = ChunkUtil.indexChunkFromBlock(FALLBACK_POSITION.x(), FALLBACK_POSITION.z());
      if (var2.add(var9)) {
         var3.add(var0.getChunkAsync(var9));
      }

      class="kw">return CompletableFuture.allOf(var3.toArray(new CompletableFuture[0]));
   }

   @Nullable
   class="kw">private class="kw">static Vector3d guesstimateFromHints(World var0, List<Vector3d> var1) {
      for (int var2 = 0; var2 < Math.min(var1.size(), 10); var2++) {
         Vector3d var3 = var1.get(var2);
         WorldChunk var4 = var0.getChunk(ChunkUtil.indexChunkFromBlock(var3.x, var3.z));
         if (var4 != null) {
            boolean var5 = var2 < 2;
            int var6 = var5 ? (int)var3.y : 319;
            Vector3d var7 = findGroundWithinChunk(var4, var6, var5);
            if (var7 != null) {
               ((HytaleLogger.Api)HytaleLogger.getLogger().atInfo()).log("Found portal spawn %s on attempt #%d quality=%s", var7, var2 + 1, var5);
               class="kw">return var7;
            }
         }
      }

      class="kw">return null;
   }

   @Nullable
   class="kw">private class="kw">static Vector3d findGroundWithinChunk(@Nonnull WorldChunk var0, int var1, boolean var2) {
      int var3 = ChunkUtil.minBlock(var0.getX());
      int var4 = ChunkUtil.minBlock(var0.getZ());
      ThreadLocalRandom var5 = ThreadLocalRandom.current();

      for (int var6 = 0; var6 < 8; var6++) {
         int var7 = var3 + var5.nextInt(2, 14);
         int var8 = var4 + var5.nextInt(2, 14);
         Vector3d var9 = findWithGroundBelow(var0, var7, var1, var8, var1, false);
         if (var9 != null && (!var2 || FitsAPortal.check(var0.getWorld(), var9))) {
            class="kw">return var9;
         }
      }

      class="kw">return null;
   }

   @Nullable
   class="kw">private class="kw">static Vector3d findWithGroundBelow(@Nonnull WorldChunk var0, int var1, int var2, int var3, int var4, boolean var5) {
      World var6 = var0.getWorld();
      ChunkStore var7 = var6.getChunkStore();
      Ref var8 = var0.getReference();
      if (var8 != null && var8.isValid()) {
         Store var9 = var7.getStore();
         ChunkColumn var10 = var9.getComponent(var8, ChunkColumn.getComponentType());
         if (var10 == null) {
            class="kw">return null;
         }

         BlockChunk var11 = var9.getComponent(var8, BlockChunk.getComponentType());
         if (var11 == null) {
            class="kw">return null;
         }

         for (int var12 = 0; var12 < var4; var12++) {
            PortalSpawnFinder.Material var13 = getMaterial(var9, var10, var11, var1, var2 - var12, var3);
            PortalSpawnFinder.Material var14 = getMaterial(var9, var10, var11, var1, var2 - var12 - 1, var3);
            boolean var15 = var13 == PortalSpawnFinder.Material.AIR || var5 && var13 == PortalSpawnFinder.Material.FLUID;
            if (!var15) {
               break;
            }

            if (var14 == PortalSpawnFinder.Material.SOLID) {
               class="kw">return new Vector3d(var1, var2 - var12, var3);
            }
         }

         class="kw">return null;
      } else {
         class="kw">return null;
      }
   }

   @Nonnull
   class="kw">private class="kw">static PortalSpawnFinder.Material getMaterial(
      @Nonnull ComponentAccessor<ChunkStore> var0, @Nonnull ChunkColumn var1, @Nonnull BlockChunk var2, double var3, double var5, double var7
   ) {
      int var9 = (int)var3;
      int var10 = (int)var5;
      int var11 = (int)var7;
      int var12 = WorldUtil.getFluidIdAtPosition(var0, var1, var9, var10, var11);
      if (var12 != 0) {
         class="kw">return PortalSpawnFinder.Material.FLUID;
      }

      BlockSection var13 = var2.getSectionAtBlockY(var10);
      int var14 = var13.get(var9, var10, var11);
      BlockType var15 = BlockType.getAssetMap().getAsset(var14);
      if (var15 == null) {
         class="kw">return PortalSpawnFinder.Material.UNKNOWN;
      }

      class="kw">return class="kw">switch (var15.getMaterial()) {
         case Solid -> PortalSpawnFinder.Material.SOLID;
         case Empty -> PortalSpawnFinder.Material.AIR;
      };
   }

   @Nullable
   class="kw">private class="kw">static Vector3d findFallbackPositionOnGround(@Nonnull World var0) {
      Vector3d var1 = new Vector3d(FALLBACK_POSITION);
      long var2 = ChunkUtil.indexChunkFromBlock(var1.x, var1.z);
      WorldChunk var4 = var0.getChunk(var2);
      if (var4 == null) {
         class="kw">return null;
      }

      int var5 = ChunkUtil.minBlock(var4.getX()) + 2;
      int var6 = ChunkUtil.minBlock(var4.getZ()) + 2;
      class="kw">return findWithGroundBelow(var4, var5, 319, var6, 319, true);
   }

   class="kw">private enum Material {
      SOLID,
      FLUID,
      AIR,
      UNKNOWN;

      Material() {
      }
   }
}