TargetBuffer class

Пакет: com.hypixel.hytale.server.core.util

Файл: com/hypixel/hytale/server/core/util/TargetUtil.java

Поля (13)

МодификаторыТипИмя
private final ComponentAccessor<ChunkStore> chunkStoreAccessor
private BlockChunk currentBlockChunk
private ChunkColumn currentChunkColumn
private Ref<ChunkStore> currentChunkRef
private int currentChunkX
private int currentChunkZ
int var3
int var4
long var5
private final World world
private int x
private int y
private int z

Методы (2)

МодификаторыВозвратСигнатура
if if(this.currentChunkRef == null || var3 != this.currentChunkX || var4 != this.currentChunkZ)
public void updateChunkpublic void updateChunk(int var1, int var2)

Исходный код

Показать/скрыть
class="kw">package com.hypixel.hytale.server.core.util;

class="kw">import com.hypixel.hytale.component.ComponentAccessor;
class="kw">import com.hypixel.hytale.component.Ref;
class="kw">import com.hypixel.hytale.component.spatial.SpatialResource;
class="kw">import com.hypixel.hytale.function.predicate.BiIntPredicate;
class="kw">import com.hypixel.hytale.math.block.BlockUtil;
class="kw">import com.hypixel.hytale.math.iterator.BlockIterator;
class="kw">import com.hypixel.hytale.math.shape.Box;
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.server.core.modules.collision.CollisionMath;
class="kw">import com.hypixel.hytale.server.core.modules.collision.WorldUtil;
class="kw">import com.hypixel.hytale.server.core.modules.entity.EntityModule;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.BoundingBox;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.HeadRotation;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.ModelComponent;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.TransformComponent;
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.section.BlockSection;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.ChunkStore;
class="kw">import com.hypixel.hytale.server.core.universe.world.storage.EntityStore;
class="kw">import it.unimi.dsi.fastutil.longs.LongOpenHashSet;
class="kw">import java.util.Collection;
class="kw">import java.util.List;
class="kw">import java.util.function.IntPredicate;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">import org.joml.Vector2d;
class="kw">import org.joml.Vector3d;
class="kw">import org.joml.Vector3i;

class="kw">public class="kw">final class TargetUtil {
   class="kw">private class="kw">static class="kw">final float ENTITY_TARGET_RADIUS = 8.0F;

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

   @Nullable
   class="kw">public class="kw">static Vector3i getTargetBlock(
      @Nonnull World var0, @Nonnull BiIntPredicate var1, double var2, double var4, double var6, double var8, double var10, double var12, double var14
   ) {
      TargetUtil.TargetBuffer var16 = new TargetUtil.TargetBuffer(var0);
      var16.updateChunk((int)var2, (int)var6);
      boolean var17 = BlockIterator.iterate(
         var2, var4, var6, var8, var10, var12, var14, (var1x, var2x, var3, var4x, var6x, var8x, var10x, var12x, var14x, var16x) -> {
            if (var2x >= 0 && var2x < 320) {
               var16x.updateChunk(var1x, var3);
               if (var16x.currentBlockChunk != null && var16x.currentChunkColumn != null) {
                  var16x.x = var1x;
                  var16x.y = var2x;
                  var16x.z = var3;
                  BlockSection var17 = var16x.currentBlockChunk.getSectionAtBlockY(var2x);
                  int var18 = var17.get(var1x, var2x, var3);
                  int var19 = WorldUtil.getFluidIdAtPosition(var16x.chunkStoreAccessor, var16x.currentChunkColumn, var1x, var2x, var3);
                  class="kw">return !var1.test(var18, var19);
               } else {
                  class="kw">return false;
               }
            } else {
               class="kw">return false;
            }
         }, var16
      );
      class="kw">return var17 ? null : new Vector3i(var16.x, var16.y, var16.z);
   }

   @Nullable
   class="kw">public class="kw">static Vector3i getTargetBlockOrigin(
      @Nonnull World var0, @Nonnull BiIntPredicate var1, double var2, double var4, double var6, double var8, double var10, double var12, double var14
   ) {
      TargetUtil.TargetBuffer var16 = new TargetUtil.TargetBuffer(var0);
      var16.updateChunk((int)var2, (int)var6);
      boolean var17 = BlockIterator.iterate(
         var2, var4, var6, var8, var10, var12, var14, (var1x, var2x, var3, var4x, var6x, var8x, var10x, var12x, var14x, var16x) -> {
            if (var2x >= 0 && var2x < 320) {
               var16x.updateChunk(var1x, var3);
               if (var16x.currentBlockChunk != null && var16x.currentChunkColumn != null) {
                  BlockSection var17 = var16x.currentBlockChunk.getSectionAtBlockY(var2x);
                  int var18 = var17.get(var1x, var2x, var3);
                  int var19 = WorldUtil.getFluidIdAtPosition(var16x.chunkStoreAccessor, var16x.currentChunkColumn, var1x, var2x, var3);
                  if (var1.test(var18, var19)) {
                     class="kw">return true;
                  }

                  int var20 = var17.getFiller(var1x, var2x, var3);
                  var16x.x = var1x - FillerBlockUtil.unpackX(var20);
                  var16x.y = var2x - FillerBlockUtil.unpackY(var20);
                  var16x.z = var3 - FillerBlockUtil.unpackZ(var20);
                  class="kw">return false;
               } else {
                  class="kw">return false;
               }
            } else {
               class="kw">return false;
            }
         }, var16
      );
      class="kw">return var17 ? null : new Vector3i(var16.x, var16.y, var16.z);
   }

   @Nullable
   class="kw">public class="kw">static Vector3d getTargetLocation(
      @Nonnull World var0, @Nonnull IntPredicate var1, double var2, double var4, double var6, double var8, double var10, double var12, double var14
   ) {
      TargetUtil.TargetBufferLocation var16 = new TargetUtil.TargetBufferLocation(var0);
      var16.updateChunk((int)var2, (int)var6);
      boolean var17 = BlockIterator.iterate(
         var2, var4, var6, var8, var10, var12, var14, (var1x, var2x, var3, var4x, var6x, var8x, var10x, var12x, var14x, var16x) -> {
            if (var2x >= 0 && var2x < 320) {
               var16x.updateChunk(var1x, var3);
               if (var16x.currentBlockChunk == null) {
                  class="kw">return false;
               }

               var16x.x = var1x + var4x;
               var16x.y = var2x + var6x;
               var16x.z = var3 + var8x;
               BlockSection var17 = var16x.currentBlockChunk.getSectionAtBlockY(var2x);
               int var18 = var17.get(var1x, var2x, var3);
               class="kw">return !var1.test(var18);
            } else {
               class="kw">return false;
            }
         }, var16
      );
      class="kw">return var17 ? null : new Vector3d(var16.x, var16.y, var16.z);
   }

   @Nullable
   class="kw">public class="kw">static Vector3i getTargetBlockAvoidLocations(
      @Nonnull World var0,
      @Nonnull IntPredicate var1,
      double var2,
      double var4,
      double var6,
      double var8,
      double var10,
      double var12,
      double var14,
      @Nonnull Collection<LongOpenHashSet> var16
   ) {
      TargetUtil.TargetBuffer var17 = new TargetUtil.TargetBuffer(var0);
      var17.updateChunk((int)var2, (int)var6);
      boolean var18 = BlockIterator.iterate(
         var2, var4, var6, var8, var10, var12, var14, (var2x, var3, var4x, var5, var7, var9, var11, var13, var15, var17x) -> {
            if (var3 >= 0 && var3 < 320) {
               var17x.updateChunk(var2x, var4x);
               if (var17x.currentBlockChunk == null) {
                  class="kw">return false;
               }

               var17x.x = var2x;
               var17x.y = var3;
               var17x.z = var4x;
               BlockSection var18 = var17x.currentBlockChunk.getSectionAtBlockY(var3);
               int var19 = var18.get(var2x, var3, var4x);
               if (var19 != 0) {
                  long var20 = BlockUtil.pack(var2x, var3, var4x);

                  for (LongOpenHashSet var23 : var16) {
                     if (var23.contains(var20)) {
                        class="kw">return true;
                     }
                  }
               }

               class="kw">return !var1.test(var19);
            } else {
               class="kw">return false;
            }
         }, var17
      );
      class="kw">return var18 ? null : new Vector3i(var17.x, var17.y, var17.z);
   }

   @Nullable
   class="kw">public class="kw">static Vector3i getTargetBlockAvoidLocations(
      @Nonnull World var0,
      @Nonnull IntPredicate var1,
      double var2,
      double var4,
      double var6,
      double var8,
      double var10,
      double var12,
      double var14,
      @Nonnull Collection<LongOpenHashSet> var16,
      @Nonnull Vector3d var17
   ) {
      TargetUtil.TargetBuffer var18 = new TargetUtil.TargetBuffer(var0);
      var18.updateChunk((int)var2, (int)var6);
      boolean var19 = BlockIterator.iterate(
         var2, var4, var6, var8, var10, var12, var14, (var3, var4x, var5, var6x, var8x, var10x, var12x, var14x, var16x, var18x) -> {
            if (var4x >= 0 && var4x < 320) {
               var18x.updateChunk(var3, var5);
               if (var18x.currentBlockChunk == null) {
                  class="kw">return false;
               }

               var18x.x = var3;
               var18x.y = var4x;
               var18x.z = var5;
               var17.x = var3 + var6x;
               var17.y = var4x + var8x;
               var17.z = var5 + var10x;
               BlockSection var19 = var18x.currentBlockChunk.getSectionAtBlockY(var4x);
               int var20 = var19.get(var3, var4x, var5);
               if (var20 != 0) {
                  long var21 = BlockUtil.pack(var3, var4x, var5);

                  for (LongOpenHashSet var24 : var16) {
                     if (var24.contains(var21)) {
                        class="kw">return true;
                     }
                  }
               }

               class="kw">return !var1.test(var20);
            } else {
               class="kw">return false;
            }
         }, var18
      );
      class="kw">return var19 ? null : new Vector3i(var18.x, var18.y, var18.z);
   }

   @Nullable
   class="kw">public class="kw">static Vector3i getTargetBlock(@Nonnull Ref<EntityStore> var0, double var1, @Nonnull ComponentAccessor<EntityStore> var3) {
      class="kw">return getTargetBlock(var0, var0x -> var0x != 0, var1, var3);
   }

   @Nullable
   class="kw">public class="kw">static Vector3i getTargetBlock(@Nonnull Ref<EntityStore> var0, @Nonnull IntPredicate var1, double var2, @Nonnull ComponentAccessor<EntityStore> var4) {
      World var5 = var4.getExternalData().getWorld();
      Transform var6 = getLook(var0, var4);
      Vector3d var7 = var6.getPosition();
      Vector3d var8 = var6.getDirection();
      class="kw">return getTargetBlock(var5, (var1x, var2x) -> var1.test(var1x), var7.x, var7.y, var7.z, var8.x, var8.y, var8.z, var2);
   }

   @Nullable
   class="kw">public class="kw">static Vector3i getTargetBlockOrigin(@Nonnull Ref<EntityStore> var0, double var1, @Nonnull ComponentAccessor<EntityStore> var3) {
      class="kw">return getTargetBlockOrigin(var0, var0x -> var0x != 0, var1, var3);
   }

   @Nullable
   class="kw">public class="kw">static Vector3i getTargetBlockOrigin(
      @Nonnull Ref<EntityStore> var0, @Nonnull IntPredicate var1, double var2, @Nonnull ComponentAccessor<EntityStore> var4
   ) {
      World var5 = var4.getExternalData().getWorld();
      Transform var6 = getLook(var0, var4);
      Vector3d var7 = var6.getPosition();
      Vector3d var8 = var6.getDirection();
      class="kw">return getTargetBlockOrigin(var5, (var1x, var2x) -> var1.test(var1x), var7.x, var7.y, var7.z, var8.x, var8.y, var8.z, var2);
   }

   @Nullable
   class="kw">public class="kw">static Vector3d getTargetLocation(@Nonnull Ref<EntityStore> var0, double var1, @Nonnull ComponentAccessor<EntityStore> var3) {
      class="kw">return getTargetLocation(var0, var0x -> var0x != 0, var1, var3);
   }

   @Nullable
   class="kw">public class="kw">static Vector3d getTargetLocation(
      @Nonnull Ref<EntityStore> var0, @Nonnull IntPredicate var1, double var2, @Nonnull ComponentAccessor<EntityStore> var4
   ) {
      Transform var5 = getLook(var0, var4);
      class="kw">return getTargetLocation(var5, var1, var2, var4);
   }

   @Nullable
   class="kw">public class="kw">static Vector3d getTargetLocation(@Nonnull Transform var0, @Nonnull IntPredicate var1, double var2, @Nonnull ComponentAccessor<EntityStore> var4) {
      World var5 = var4.getExternalData().getWorld();
      Vector3d var6 = var0.getPosition();
      Vector3d var7 = var0.getDirection();
      class="kw">return getTargetLocation(var5, var1, var6.x, var6.y, var6.z, var7.x, var7.y, var7.z, var2);
   }

   @Nonnull
   class="kw">public class="kw">static List<Ref<EntityStore>> getAllEntitiesInSphere(@Nonnull Vector3d var0, double var1, @Nonnull ComponentAccessor<EntityStore> var3) {
      List var4 = SpatialResource.getThreadLocalReferenceList();
      SpatialResource var5 = var3.getResource(EntityModule.get().getEntitySpatialResourceType());
      var5.getSpatialStructure().collect(var0, (float)var1, var4);
      SpatialResource var6 = var3.getResource(EntityModule.get().getPlayerSpatialResourceType());
      var6.getSpatialStructure().collect(var0, (float)var1, var4);
      class="kw">return var4;
   }

   @Nonnull
   class="kw">public class="kw">static List<Ref<EntityStore>> getAllEntitiesInCylinder(@Nonnull Vector3d var0, double var1, double var3, @Nonnull ComponentAccessor<EntityStore> var5) {
      List var6 = SpatialResource.getThreadLocalReferenceList();
      SpatialResource var7 = var5.getResource(EntityModule.get().getEntitySpatialResourceType());
      var7.getSpatialStructure().collectCylinder(var0, var1, var3, var6);
      SpatialResource var8 = var5.getResource(EntityModule.get().getPlayerSpatialResourceType());
      var8.getSpatialStructure().collectCylinder(var0, var1, var3, var6);
      class="kw">return var6;
   }

   @Nonnull
   class="kw">public class="kw">static List<Ref<EntityStore>> getAllEntitiesInBox(@Nonnull Vector3d var0, @Nonnull Vector3d var1, @Nonnull ComponentAccessor<EntityStore> var2) {
      List var3 = SpatialResource.getThreadLocalReferenceList();
      SpatialResource var4 = var2.getResource(EntityModule.get().getEntitySpatialResourceType());
      var4.getSpatialStructure().collectBox(var0, var1, var3);
      SpatialResource var5 = var2.getResource(EntityModule.get().getPlayerSpatialResourceType());
      var5.getSpatialStructure().collectBox(var0, var1, var3);
      class="kw">return var3;
   }

   @Nullable
   class="kw">public class="kw">static Ref<EntityStore> getTargetEntity(@Nonnull Ref<EntityStore> var0, @Nonnull ComponentAccessor<EntityStore> var1) {
      class="kw">return getTargetEntity(var0, 8.0F, var1);
   }

   @Nullable
   class="kw">public class="kw">static Ref<EntityStore> getTargetEntity(@Nonnull Ref<EntityStore> var0, float var1, @Nonnull ComponentAccessor<EntityStore> var2) {
      class="kw">return getTargetEntity(var0, var1, false, var2);
   }

   @Nullable
   class="kw">public class="kw">static Ref<EntityStore> getTargetEntity(@Nonnull Ref<EntityStore> var0, float var1, boolean var2, @Nonnull ComponentAccessor<EntityStore> var3) {
      TransformComponent var4 = var3.getComponent(var0, TransformComponent.getComponentType());
      assert var4 != null;
      Vector3d var5 = var4.getPosition();
      Transform var6 = getLook(var0, var3);
      Vector3d var7 = var6.getPosition();
      Vector3d var8 = var6.getDirection();
      List var9 = getAllEntitiesInSphere(var7, var1, var3);
      if (var2) {
         SpatialResource var10 = var3.getResource(EntityModule.get().getItemSpatialResourceType());
         var10.getSpatialStructure().collect(var7, var1, var9);
      }

      var9.removeIf(var4x -> var4x != null && var4x.isValid() && !var4x.equals(var0) ? !isHitByRay((Ref<EntityStore>)var4x, var7, var8, var3) : true);
      if (var9.isEmpty()) {
         class="kw">return null;
      }

      Ref var18 = null;
      double var11 = Double.MAX_VALUE;

      for (Ref var14 : var9) {
         if (var14 != null && var14.isValid()) {
            TransformComponent var15 = var3.getComponent(var14, TransformComponent.getComponentType());
            assert var15 != null;
            double var16 = var5.distanceSquared(var15.getPosition());
            if (var16 < var11) {
               var11 = var16;
               var18 = var14;
            }
         }
      }

      class="kw">return var18;
   }

   @Nonnull
   class="kw">public class="kw">static Transform getLook(@Nonnull Ref<EntityStore> var0, @Nonnull ComponentAccessor<EntityStore> var1) {
      TransformComponent var2 = var1.getComponent(var0, TransformComponent.getComponentType());
      assert var2 != null;
      float var3 = ModelComponent.getEyeHeight(var0, var1);
      HeadRotation var4 = var1.getComponent(var0, HeadRotation.getComponentType());
      assert var4 != null;
      Vector3d var5 = var2.getPosition();
      Rotation3f var6 = var4.getRotation();
      class="kw">return new Transform(var5.x(), var5.y() + var3, var5.z(), var6.pitch(), var6.yaw(), var6.roll());
   }

   class="kw">private class="kw">static boolean isHitByRay(
      @Nonnull Ref<EntityStore> var0, @Nonnull Vector3d var1, @Nonnull Vector3d var2, @Nonnull ComponentAccessor<EntityStore> var3
   ) {
      BoundingBox var4 = var3.getComponent(var0, BoundingBox.getComponentType());
      TransformComponent var5 = var3.getComponent(var0, TransformComponent.getComponentType());
      assert var5 != null;
      if (var4 == null) {
         class="kw">return false;
      }

      Box var6 = var4.getBoundingBox();
      Vector3d var7 = var5.getPosition();
      Vector2d var8 = new Vector2d();
      class="kw">return CollisionMath.intersectRayAABB(var1, var2, var7.x(), var7.y(), var7.z(), var6, var8);
   }

   class="kw">private class="kw">static class TargetBuffer {
      @Nonnull
      class="kw">private class="kw">final World world;
      @Nonnull
      class="kw">private class="kw">final ComponentAccessor<ChunkStore> chunkStoreAccessor;
      class="kw">private int x;
      class="kw">private int y;
      class="kw">private int z;
      class="kw">private int currentChunkX;
      class="kw">private int currentChunkZ;
      @Nullable
      class="kw">private Ref<ChunkStore> currentChunkRef;
      @Nullable
      class="kw">private ChunkColumn currentChunkColumn;
      @Nullable
      class="kw">private BlockChunk currentBlockChunk;

      class="kw">public TargetBuffer(@Nonnull World var1) {
         this.world = var1;
         this.chunkStoreAccessor = var1.getChunkStore().getStore();
      }

      class="kw">public void updateChunk(int var1, int var2) {
         int var3 = ChunkUtil.chunkCoordinate(var1);
         int var4 = ChunkUtil.chunkCoordinate(var2);
         if (this.currentChunkRef == null || var3 != this.currentChunkX || var4 != this.currentChunkZ) {
            this.currentChunkX = var3;
            this.currentChunkZ = var4;
            long var5 = ChunkUtil.indexChunk(var3, var4);
            this.currentChunkRef = this.world.getChunkStore().getChunkReference(var5);
            if (this.currentChunkRef != null && this.currentChunkRef.isValid()) {
               this.currentChunkColumn = this.chunkStoreAccessor.getComponent(this.currentChunkRef, ChunkColumn.getComponentType());
               this.currentBlockChunk = this.chunkStoreAccessor.getComponent(this.currentChunkRef, BlockChunk.getComponentType());
            } else {
               this.currentChunkColumn = null;
               this.currentBlockChunk = null;
            }
         }
      }
   }

   class="kw">private class="kw">static class TargetBufferLocation {
      @Nonnull
      class="kw">public class="kw">final World world;
      @Nonnull
      class="kw">public class="kw">final ComponentAccessor<ChunkStore> chunkStoreAccessor;
      class="kw">private double x;
      class="kw">private double y;
      class="kw">private double z;
      class="kw">private int currentChunkX;
      class="kw">private int currentChunkZ;
      @Nullable
      class="kw">public Ref<ChunkStore> currentChunkRef;
      @Nullable
      class="kw">public BlockChunk currentBlockChunk;

      class="kw">public TargetBufferLocation(@Nonnull World var1) {
         this.world = var1;
         this.chunkStoreAccessor = var1.getChunkStore().getStore();
      }

      class="kw">public void updateChunk(int var1, int var2) {
         int var3 = ChunkUtil.chunkCoordinate(var1);
         int var4 = ChunkUtil.chunkCoordinate(var2);
         if (this.currentChunkRef == null || var3 != this.currentChunkX || var4 != this.currentChunkZ) {
            this.currentChunkX = var3;
            this.currentChunkZ = var4;
            long var5 = ChunkUtil.indexChunk(var3, var4);
            this.currentChunkRef = this.world.getChunkStore().getChunkReference(var5);
            if (this.currentChunkRef != null && this.currentChunkRef.isValid()) {
               this.currentBlockChunk = this.chunkStoreAccessor.getComponent(this.currentChunkRef, BlockChunk.getComponentType());
            } else {
               this.currentBlockChunk = null;
            }
         }
      }
   }
}