SensorCanPlace class

Пакет: com.hypixel.hytale.server.npc.corecomponents.world

Файл: com/hypixel/hytale/server/npc/corecomponents/world/SensorCanPlace.java

extends: SensorBase

Поля (28)

МодификаторыТипИмя
final ComponentType<EntityStore, BoundingBox> BOUNDING_BOX_COMPONENT_TYPE
private final Vector3dc direction
private final Vector3dc offset
float var10
BoundingBox var11
Box var12
Box var13
boolean var14
boolean var15
boolean var16
boolean var17
double var18
double var20
double var22
double var24
double var26
double var28
double var30
Vector3d var33
int var34
int var35
int var36
boolean var37
BlockType var6
TransformComponent var7
World var8
float var9
var9

Методы (13)

МодификаторыВозвратСигнатура
Direction Direction(Vector3dc nullxx)
abstract FootPosition FootPosition(Vector3dUtil.DOWN)
Offset Offset(Vector3dc nullxx)
abstract Right Right(Vector3dUtil.RIGHT)
public Vector3d applypublic Vector3d apply(@Nonnull Vector3d var1, float var2)
public Vector3d applypublic Vector3d apply(@Nonnull Vector3d var1)
public String getpublic String get()
public String getpublic String get()
if if(var6 == null)
if if(var11 != null)
if if(var37 != this.cachedResult)
if if(!this.cachedResult)
abstract super super(var1)

Исходный код

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

class="kw">import com.hypixel.hytale.component.ComponentType;
class="kw">import com.hypixel.hytale.component.Ref;
class="kw">import com.hypixel.hytale.component.Store;
class="kw">import com.hypixel.hytale.math.shape.Box;
class="kw">import com.hypixel.hytale.math.vector.Vector3dUtil;
class="kw">import com.hypixel.hytale.server.core.asset.type.blockhitbox.BlockBoundingBoxes;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.BlockType;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.BoundingBox;
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.storage.EntityStore;
class="kw">import com.hypixel.hytale.server.npc.asset.builder.BuilderSupport;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.SensorBase;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.world.builders.BuilderSensorCanPlace;
class="kw">import com.hypixel.hytale.server.npc.instructions.ExecutionSupport;
class="kw">import com.hypixel.hytale.server.npc.sensorinfo.CachedPositionProvider;
class="kw">import com.hypixel.hytale.server.npc.sensorinfo.InfoProvider;
class="kw">import com.hypixel.hytale.server.npc.util.BlockPlacementHelper;
class="kw">import java.util.function.Supplier;
class="kw">import javax.annotation.Nonnull;
class="kw">import org.joml.Vector3d;
class="kw">import org.joml.Vector3dc;

class="kw">public class SensorCanPlace class="kw">extends SensorBase {
   class="kw">protected class="kw">static class="kw">final ComponentType<EntityStore, BoundingBox> BOUNDING_BOX_COMPONENT_TYPE = BoundingBox.getComponentType();
   class="kw">protected class="kw">final SensorCanPlace.Direction direction;
   class="kw">protected class="kw">final SensorCanPlace.Offset offset;
   class="kw">protected class="kw">final double retryDelay;
   class="kw">protected class="kw">final boolean allowEmptyMaterials;
   class="kw">protected class="kw">final Vector3d transform = new Vector3d();
   class="kw">protected class="kw">final CachedPositionProvider positionProvider = new CachedPositionProvider();
   class="kw">protected class="kw">final Vector3d cachedPosition = new Vector3d();
   class="kw">protected boolean cachedResult;
   class="kw">protected double delay;

   class="kw">public SensorCanPlace(@Nonnull BuilderSensorCanPlace var1, @Nonnull BuilderSupport var2) {
      super(var1);
      this.direction = var1.getDirection(var2);
      this.offset = var1.getOffset(var2);
      this.retryDelay = var1.getRetryDelay(var2);
      this.allowEmptyMaterials = var1.isAllowEmptyMaterials(var2);
   }

   @Override
   class="kw">public boolean matches(@Nonnull Ref<EntityStore> var1, @Nonnull ExecutionSupport var2, double var3, @Nonnull Store<EntityStore> var5) {
      if (super.matches(var1, var2, var3, var5) && var2.getWorldSupport().getBlockToPlace() != null) {
         BlockType var6 = BlockType.getAssetMap().getAsset(var2.getWorldSupport().getBlockToPlace());
         if (var6 == null) {
            this.positionProvider.clear();
            class="kw">return false;
         }

         TransformComponent var7 = var5.getComponent(var1, TransformComponent.getComponentType());
         assert var7 != null;
         World var8 = var5.getExternalData().getWorld();
         float var9 = var7.getRotation().yaw();
         float var10 = (float) (Math.PI / 4);
         var9 = Math.round(var9 / var10) * var10;
         this.direction.apply(this.transform, var9);
         BoundingBox var11 = var5.getComponent(var1, BOUNDING_BOX_COMPONENT_TYPE);
         if (var11 != null) {
            Box var12 = var11.getBoundingBox();
            Box var13 = BlockBoundingBoxes.getAssetMap().getAsset(var6.getHitboxTypeIndex()).get(0).getBoundingBox();
            boolean var14 = this.transform.x < 0.0;
            boolean var15 = this.transform.z < 0.0;
            boolean var16 = this.transform.x - 1.0E-5 > 0.0;
            boolean var17 = this.transform.z - 1.0E-5 > 0.0;
            double var18 = var14 ? var12.min.x : var12.max.x;
            double var20 = var15 ? var12.min.z : var12.max.z;
            double var22 = var14 ? var13.max.x : var13.min.x;
            double var24 = var15 ? var13.max.z : var13.min.z;
            double var26 = var14 ? -this.transform.x : this.transform.x;
            double var28 = var15 ? -this.transform.z : this.transform.z;
            double var30 = Math.sqrt(var18 * var18 * var26 + var20 * var20 * var28) + Math.sqrt(var22 * var22 * var26 + var24 * var24 * var28);
            this.transform.normalize(var30);
            this.transform.add(var16 ? 1.0 : 0.0, 0.0, var17 ? 1.0 : 0.0);
         }

         this.offset.apply(this.transform);
         Vector3d var33 = var7.getPosition();
         this.transform.add(var33.x(), var33.y(), var33.z()).floor();
         int var34 = (int)this.transform.x();
         int var35 = (int)this.transform.y();
         int var36 = (int)this.transform.z();
         if (!this.cachedPosition.equals(this.transform)) {
            this.delay = 0.0;
         }

         boolean var37 = BlockPlacementHelper.canPlaceUnitBlock(var8, var6, this.allowEmptyMaterials, var34, var35, var36);
         if (var37 != this.cachedResult) {
            this.delay = 0.0;
         }

         if (!((this.delay -= var3) > 0.0)) {
            this.cachedResult = var37 && BlockPlacementHelper.canPlaceBlock(var8, var6, 0, this.allowEmptyMaterials, var34, var35, var36);
            this.cachedPosition.set(this.transform);
            this.delay = this.retryDelay;
            if (!this.cachedResult) {
               this.positionProvider.clear();
               class="kw">return false;
            } else {
               this.positionProvider.setIsFromCache(false);
               this.positionProvider.setTarget(this.transform);
               class="kw">return true;
            }
         } else if (this.cachedResult) {
            this.positionProvider.setIsFromCache(true);
            this.positionProvider.setTarget(this.transform);
            class="kw">return true;
         } else {
            this.positionProvider.clear();
            class="kw">return false;
         }
      } else {
         this.positionProvider.clear();
         class="kw">return false;
      }
   }

   @Override
   class="kw">public void clearOnce() {
      super.clearOnce();
      this.delay = 0.0;
   }

   @Override
   class="kw">public InfoProvider getSensorInfo() {
      class="kw">return this.positionProvider;
   }

   class="kw">public enum Direction class="kw">implements Supplier<String> {
      Forward(Vector3dUtil.FORWARD),
      Backward(Vector3dUtil.BACKWARD),
      Left(Vector3dUtil.LEFT),
      Right(Vector3dUtil.RIGHT);

      class="kw">private class="kw">final Vector3dc direction;

      Direction(Vector3dc nullxx) {
         this.direction = nullxx;
      }

      @Nonnull
      class="kw">public Vector3d apply(@Nonnull Vector3d var1, float var2) {
         class="kw">return var1.set(this.direction).rotateY(var2);
      }

      @Nonnull
      class="kw">public String get() {
         class="kw">return this.name();
      }
   }

   class="kw">public enum Offset class="kw">implements Supplier<String> {
      HeadPosition(Vector3dUtil.UP),
      BodyPosition(Vector3dUtil.ZERO),
      FootPosition(Vector3dUtil.DOWN);

      class="kw">private class="kw">final Vector3dc offset;

      Offset(Vector3dc nullxx) {
         this.offset = nullxx;
      }

      @Nonnull
      class="kw">public Vector3d apply(@Nonnull Vector3d var1) {
         class="kw">return var1.add(this.offset);
      }

      @Nonnull
      class="kw">public String get() {
         class="kw">return this.name();
      }
   }
}