HeadMotionAim class

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

Файл: com/hypixel/hytale/server/npc/corecomponents/combat/HeadMotionAim.java

extends: HeadMotionBase

implements: DebugSupport.DebugFlagsChangeListener

Поля (41)

МодификаторыТипИмя
final double MIN_RANGED_AIMING_DISTANCE
Rotation3f var10
IPositionProvider var11
Ref var12
BallisticData var13
Box var14
var14
Velocity var15
BoundingBox var16
double var17
double var18
double var19
double var20
double var21
double var22
double var23
double var24
float var26
float var27
double var28
double var30
double var32
double var34
boolean var36
ThreadLocalRandom var37
double var38
double var39
double var40
double var41
float var42
var42
Vector3f var43
var43
float var44
var44
World var45
double var46
double var47
double var48
Transform var8
Vector3d var9

Методы (13)

МодификаторыВозвратСигнатура
if if(var3 != null)
if if(var12 != null)
if if(var16 != null)
if if(var13 != null)
if if(this.deflection)
if if(var21 > var19)
if if(var13 != null)
if if(!var36)
if if(var36 && var13 != null)
if if(var46 >= 1.0E-4)
if if(var48 >= 1.0E-4)
if if(this.debugAiming)
abstract super super(var1)

Исходный код

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

class="kw">import com.hypixel.hytale.component.ComponentAccessor;
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.Rotation3f;
class="kw">import com.hypixel.hytale.math.vector.Transform;
class="kw">import com.hypixel.hytale.server.core.entity.entities.ProjectileComponent;
class="kw">import com.hypixel.hytale.server.core.modules.debug.DebugUtils;
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.modules.physics.component.Velocity;
class="kw">import com.hypixel.hytale.server.core.modules.physics.util.PhysicsMath;
class="kw">import com.hypixel.hytale.server.core.modules.projectile.config.BallisticData;
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.core.util.TargetUtil;
class="kw">import com.hypixel.hytale.server.npc.asset.builder.BuilderSupport;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.HeadMotionBase;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.combat.builders.BuilderHeadMotionAim;
class="kw">import com.hypixel.hytale.server.npc.instructions.ExecutionSupport;
class="kw">import com.hypixel.hytale.server.npc.movement.Steering;
class="kw">import com.hypixel.hytale.server.npc.role.RoleDebugFlags;
class="kw">import com.hypixel.hytale.server.npc.role.support.DebugSupport;
class="kw">import com.hypixel.hytale.server.npc.sensorinfo.IPositionProvider;
class="kw">import com.hypixel.hytale.server.npc.sensorinfo.InfoProvider;
class="kw">import com.hypixel.hytale.server.npc.util.AimingData;
class="kw">import com.hypixel.hytale.server.npc.util.NPCPhysicsMath;
class="kw">import java.util.EnumSet;
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.Vector3f;

class="kw">public class HeadMotionAim class="kw">extends HeadMotionBase class="kw">implements DebugSupport.DebugFlagsChangeListener {
   class="kw">public class="kw">static class="kw">final double MIN_RANGED_AIMING_DISTANCE = 4.0;
   class="kw">protected class="kw">static class="kw">final ComponentType<EntityStore, TransformComponent> TRANSFORM_COMPONENT_TYPE = TransformComponent.getComponentType();
   class="kw">protected class="kw">static class="kw">final ComponentType<EntityStore, BoundingBox> BOUNDING_BOX_COMPONENT_TYPE = BoundingBox.getComponentType();
   class="kw">protected class="kw">final double spread;
   class="kw">protected class="kw">final boolean deflection;
   class="kw">protected class="kw">final double hitProbability;
   class="kw">protected class="kw">final double relativeTurnSpeed;
   class="kw">protected class="kw">final AimingData aimingData = new AimingData();
   class="kw">protected Ref<EntityStore> lastTargetReference;
   class="kw">protected boolean debugAiming;
   class="kw">protected class="kw">final Vector3d startPosition = new Vector3d();
   class="kw">protected class="kw">final Vector3d startOffset = new Vector3d();
   class="kw">protected class="kw">final Vector3d targetPosition = new Vector3d();
   class="kw">protected class="kw">final Vector3d targetOffset = new Vector3d();
   class="kw">protected class="kw">final Vector3d relativeVelocity = new Vector3d();
   class="kw">protected class="kw">final Vector3d spreadOffset = new Vector3d();

   class="kw">public HeadMotionAim(@Nonnull BuilderHeadMotionAim var1, @Nonnull BuilderSupport var2) {
      super(var1);
      this.spread = var1.getSpread(var2);
      this.hitProbability = var1.getHitProbability(var2);
      this.deflection = var1.isDeflection(var2);
      this.relativeTurnSpeed = var1.getRelativeTurnSpeed(var2);
   }

   @Override
   class="kw">public void preComputeSteering(@Nonnull Ref<EntityStore> var1, @Nonnull ExecutionSupport var2, @Nullable InfoProvider var3, @Nonnull Store<EntityStore> var4) {
      if (var3 != null) {
         var3.passExtraInfo(this.aimingData);
      }
   }

   @Override
   class="kw">public void activate(@Nonnull Ref<EntityStore> var1, @Nonnull ExecutionSupport var2, @Nonnull ComponentAccessor<EntityStore> var3) {
      this.aimingData.setHaveAttacked(true);
   }

   @Override
   class="kw">public boolean computeSteering(
      @Nonnull Ref<EntityStore> var1,
      @Nonnull ExecutionSupport var2,
      @Nullable InfoProvider var3,
      double var4,
      @Nonnull Steering var6,
      @Nonnull ComponentAccessor<EntityStore> var7
   ) {
      if (var3 != null && var3.hasPosition() && var3.getPositionProvider() != null) {
         Transform var8 = TargetUtil.getLook(var1, var7);
         Vector3d var9 = var8.getPosition();
         Rotation3f var10 = var8.getRotation();
         IPositionProvider var11 = var3.getPositionProvider();
         var11.providePosition(this.targetPosition);
         this.startPosition.set(var9);
         this.relativeVelocity.zero();
         Ref var12 = var11.getTarget();
         BallisticData var13 = this.aimingData.getBallisticData();
         Box var14 = Box.ZERO;
         if (var12 != null) {
            Velocity var15 = var7.getComponent(var12, Velocity.getComponentType());
            assert var15 != null;
            BoundingBox var16 = var7.getComponent(var12, BOUNDING_BOX_COMPONENT_TYPE);
            if (var16 != null) {
               var14 = var16.getBoundingBox();
            }

            if (var13 != null) {
               if (this.deflection) {
                  this.relativeVelocity.set(var15.getVelocity());
               }
            } else {
               double var17 = this.targetPosition.y();
               double var19 = this.startPosition.y();
               double var21 = var17 + var14.getMin().y;
               double var23 = var17 + var14.getMax().y;
               if (var21 > var19) {
                  this.targetPosition.y = var21;
               } else if (var23 < var19) {
                  this.targetPosition.y = var23;
               } else {
                  this.targetPosition.y = var19;
               }
            }
         }

         boolean var36 = this.startPosition.distanceSquared(this.targetPosition) <= 16.0;
         if (var13 != null) {
            this.aimingData.setDepthOffset(var13.getDepthShot(), var13.isPitchAdjustShot());
            if (!var36) {
               ProjectileComponent.computeStartOffset(
                  var13.isPitchAdjustShot(),
                  var13.getVerticalCenterShot(),
                  var13.getHorizontalCenterShot(),
                  var13.getDepthShot(),
                  var10.yaw(),
                  var10.pitch(),
                  this.startOffset
               );
            } else {
               this.startOffset.zero();
            }

            if (var12 != null && !var12.equals(this.lastTargetReference)) {
               this.lastTargetReference = var12;
               this.aimingData.setHaveAttacked(true);
            }

            if (this.aimingData.isHaveAttacked()) {
               ThreadLocalRandom var37 = ThreadLocalRandom.current();
               this.spreadOffset.zero();
               this.targetOffset.zero();
               if (this.spread > 0.0 && var37.nextDouble() > this.hitProbability) {
                  double var40 = 2.0 * this.spread * this.startPosition.distance(this.targetPosition) / 10.0;
                  this.spreadOffset.set(var37.nextDouble() - 0.5, var37.nextDouble() - 0.5, var37.nextDouble() - 0.5).mul(var40);
               } else {
                  double var39 = 0.1;
                  double var41 = 0.9;
                  this.targetOffset
                     .set(
                        NPCPhysicsMath.lerp(var14.getMin().x, var14.getMax().x, var37.nextDouble(0.1, 0.9)),
                        NPCPhysicsMath.lerp(var14.getMin().y, var14.getMax().y, var37.nextDouble(0.1, 0.9)),
                        NPCPhysicsMath.lerp(var14.getMin().z, var14.getMax().z, var37.nextDouble(0.1, 0.9))
                     );
               }

               this.aimingData.setHaveAttacked(false);
            }

            this.targetPosition.add(this.spreadOffset);
            this.targetPosition.add(this.targetOffset);
            this.startPosition.add(this.startOffset);
         } else {
            this.aimingData.setDepthOffset(0.0, false);
         }

         double var38 = this.targetPosition.x() - this.startPosition.x();
         double var18 = this.targetPosition.y() - this.startPosition.y();
         double var20 = this.targetPosition.z() - this.startPosition.z();
         if (var36 && var13 != null) {
            float var42 = var10.yaw();
            float var44 = var10.pitch();
            double var46 = var38 * var38 + var20 * var20;
            if (var46 >= 1.0E-4) {
               var42 = PhysicsMath.normalizeTurnAngle(PhysicsMath.headingFromDirection(var38, var20));
               double var47 = 1.0 / Math.sqrt(var46);
               double var28 = var13.getHorizontalCenterShot();
               if (var13.getDepthShot() != 0.0 && !var13.isPitchAdjustShot()) {
                  var28 += var13.getDepthShot();
               }

               double var30 = var28 * var38 * var47;
               double var32 = -var13.getVerticalCenterShot();
               double var34 = var28 * var20 * var47;
               this.startPosition.add(var30, var32, var34);
               var38 -= var30;
               var18 -= var32;
               var20 -= var34;
            }

            double var48 = var46 + var18 * var18;
            if (var48 >= 1.0E-4) {
               var44 = PhysicsMath.pitchFromDirection(var38, var18, var20);
            }

            this.aimingData.setOrientation(var42, var44);
            this.aimingData.setTarget(var12);
         } else if (this.aimingData.computeSolution(var38, var18, var20, this.relativeVelocity.x(), this.relativeVelocity.y(), this.relativeVelocity.z())) {
            this.aimingData.setTarget(var12);
         } else {
            double var22 = var38 * var38 + var20 * var20;
            double var24 = var22 + var18 * var18;
            float var26 = var22 >= 1.0E-4 ? PhysicsMath.normalizeTurnAngle(PhysicsMath.headingFromDirection(var38, var20)) : var10.yaw();
            float var27 = var24 >= 1.0E-4 ? PhysicsMath.pitchFromDirection(var38, var18, var20) : var10.pitch();
            this.aimingData.setOrientation(var26, var27);
            this.aimingData.setTarget(null);
         }

         if (this.debugAiming) {
            Vector3f var43 = DebugUtils.COLOR_WHITE;
            if (this.aimingData.haveOrientation()) {
               var43 = DebugUtils.COLOR_GREEN;
            }

            World var45 = var1.getStore().getExternalData().getWorld();
            DebugUtils.addSphere(var45, this.targetPosition, var43, 0.5, 0.1F);
            if (this.startPosition.distance(this.targetPosition) > 1.0E-4) {
               DebugUtils.addArrow(var45, this.startPosition, new Vector3d(this.targetPosition).sub(this.startPosition).normalize(), var43, 0.1F, 1);
            }
         }

         var6.clearTranslation();
         var6.setYaw(this.aimingData.getYaw());
         var6.setPitch(this.aimingData.getPitch());
         var6.setRelativeTurnSpeed(this.relativeTurnSpeed);
         class="kw">return true;
      } else {
         var6.clear();
         class="kw">return true;
      }
   }

   @Override
   class="kw">public void registerWithSupport(ExecutionSupport var1) {
      super.registerWithSupport(var1);
      var1.getDebugSupport().registerDebugFlagsListener(this);
   }

   @Override
   class="kw">public void onDebugFlagsChanged(EnumSet<RoleDebugFlags> var1) {
      this.debugAiming = var1.contains(RoleDebugFlags.VisAiming);
   }
}