Material enum

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

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

Поля (1)

МодификаторыТипИмя
SOLID, FLUID, AIR, UNKNOWN

Исходный код

Показать/скрыть
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() {
      }
   }
}