MotionControllerFly class

Пакет: com.hypixel.hytale.server.npc.movement.controllers

Файл: com/hypixel/hytale/server/npc/movement/controllers/MotionControllerFly.java

extends: MotionControllerBase

Поля (86)

МодификаторыТипИмя
final String TYPE
boolean var10
ChunkStore var10
String var10
long var11
BlockCollisionData var11
MotionControllerBase.AppliedVelocity var12
double var12
var12
var12
float var13
Ref var13
float var14
Store var14
double var14
double var15
ChunkColumn var15
BlockChunk var16
double var16
double var17
double var17
var17
var17
float var19
var19
var19
double var19
var19
var19
float var20
var20
var20
var20
double var21
int var21
double var22
float var23
var23
float var24
var24
double var24
float var25
float var26
double var26
var26
float var27
double var28
double var28
var28
TransformComponent var3
double var3
double var30
double var32
double var34
double var36
double var38
Predicate var4
Vector3d var4
float var40
var40
float var41
float var42
float var43
double var44
float var46
float var47
float var48
float var49
int var5
TransformComponent var5
double var5
double var50
var50
double var53
double var54
var54
int var6
double var7
boolean var7
double var7
double var7
double var8
boolean var8
World var9
boolean var9
double var9

Методы (45)

МодификаторыВозвратСигнатура
abstract throw new IllegalStateExceptionthrow new IllegalStateException("Invalid position")
static void appendProbeInvalidStartSegmentvoid appendProbeInvalidStartSegment(@Nonnull ProbeMoveData var0, @Nonnull Vector3d var1)
abstract appendProbeInvalidStartSegment appendProbeInvalidStartSegment(var5, var2)
protected double computeMaxSpeedFromPitchdouble computeMaxSpeedFromPitch(double var1)
protected double doMovedouble doMove(@Nonnull Ref<EntityStore> var1, @Nonnull Vector3d var2, @Nonnull Vector3d var3, @Nonnull PositionProbeAir var4, @Nullable ProbeMoveData var5, @Nonnull ComponentAccessor<EntityStore> var6)
abstract for for(int var11 = 0; var11 < this.appliedVelocities.size()
public double getDampingDecelerationdouble getDampingDeceleration()
public double getExternalVelocityStopThresholdSquareddouble getExternalVelocityStopThresholdSquared()
if if(var21 >= 1.0E-12)
if if(var38 != 0.0)
if if(var50 == 0.0)
if if(var10)
if if(var53 * var53 < var54)
if if(var12.velocity.y + this.externalVelocity.y <= 0.0 || var12.velocity.y < 0.0)
if if(var10 && var12.canClear)
if if(!var10)
if if(var2.x * var2.x + var2.z * var2.z > 1.0E-6)
if if(var5 == this.lastVerticalPositionX && var6 == this.lastVerticalPositionZ)
if if(var15 != null && var16 != null)
if if(this.desiredAltitudeOverride != null)
if if(var26 > var28)
if if(var7)
if if(var8)
if if(var7)
if if(var8)
if if(!var7)
if if(this.debugModeBlockCollisions)
if if(var7)
if if(this.debugModeBlockCollisions)
if if(this.debugModeCollisions)
if if(var11 == null)
if if(var7)
if if(!var7)
if if(this.debugModeMove)
if if(var7)
if if(var7)
if if(var7)
if if(this.debugModeMove)
if if(!var7)
if if(var11 == null)
if if(var7 < 1.0)
public void setDesiredAltitudeOverridevoid setDesiredAltitudeOverride(double[] var1)
private void setDirectionFromTranslationvoid setDirectionFromTranslation(@Nonnull Steering var1, @Nonnull Vector3d var2)
abstract super super(var1, var2)
public void takeOffvoid takeOff(@Nonnull Ref<EntityStore> var1, double var2, @Nonnull ComponentAccessor<EntityStore> var4)

Исходный код

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

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.math.util.ChunkUtil;
class="kw">import com.hypixel.hytale.math.util.MathUtil;
class="kw">import com.hypixel.hytale.math.util.TrigMathUtil;
class="kw">import com.hypixel.hytale.math.vector.Vector3dUtil;
class="kw">import com.hypixel.hytale.server.core.modules.collision.BlockCollisionData;
class="kw">import com.hypixel.hytale.server.core.modules.collision.CollisionConfig;
class="kw">import com.hypixel.hytale.server.core.modules.collision.CollisionModule;
class="kw">import com.hypixel.hytale.server.core.modules.collision.WorldUtil;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.TransformComponent;
class="kw">import com.hypixel.hytale.server.core.modules.physics.util.PhysicsMath;
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.storage.ChunkStore;
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.movement.MotionKind;
class="kw">import com.hypixel.hytale.server.npc.movement.MovementMode;
class="kw">import com.hypixel.hytale.server.npc.movement.Steering;
class="kw">import com.hypixel.hytale.server.npc.movement.controllers.builders.BuilderMotionControllerFly;
class="kw">import com.hypixel.hytale.server.npc.role.Role;
class="kw">import com.hypixel.hytale.server.npc.util.NPCPhysicsMath;
class="kw">import com.hypixel.hytale.server.npc.util.PositionProbeAir;
class="kw">import java.util.Set;
class="kw">import java.util.function.Predicate;
class="kw">import java.util.logging.Level;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">import org.joml.Vector3d;

class="kw">public class MotionControllerFly class="kw">extends MotionControllerBase {
   class="kw">public class="kw">static class="kw">final String TYPE = "Fly";
   class="kw">public class="kw">static class="kw">final Set<MovementMode> SUPPORTED_MOVEMENT_MODES = Set.of(MovementMode.FLY);
   class="kw">public class="kw">static class="kw">final Set<MovementMode> DEFAULT_SPAWN_MOVEMENT_MODES = Set.of(MovementMode.FLY);
   class="kw">public class="kw">static class="kw">final double DAMPING_FACTOR = 20.0;
   class="kw">public class="kw">static class="kw">final int COLLISION_MATERIALS_PASSIVE = 4;
   class="kw">public class="kw">static class="kw">final int COLLISION_MATERIALS_ACTIVE = 6;
   class="kw">protected class="kw">final double minAirSpeed;
   class="kw">protected class="kw">final double maxClimbSpeed;
   class="kw">protected class="kw">final double maxSinkSpeed;
   class="kw">protected class="kw">final double maxFallSpeed;
   class="kw">protected class="kw">final double maxSinkSpeedFluid;
   class="kw">protected class="kw">final float maxClimbAngle;
   class="kw">protected class="kw">final float maxSinkAngle;
   class="kw">protected class="kw">final double acceleration;
   class="kw">protected class="kw">final double deceleration;
   class="kw">protected class="kw">final double sinkRatio = 0.5;
   class="kw">protected class="kw">final double desiredAltitudeWeight;
   class="kw">protected class="kw">final float maxTurnSpeed;
   class="kw">protected class="kw">final float maxRollAngle;
   class="kw">protected class="kw">final float maxRollSpeed;
   class="kw">protected class="kw">final float rollDamping;
   class="kw">protected class="kw">final double fastFlyThreshold;
   class="kw">protected class="kw">final double minHeightOverGround;
   class="kw">protected class="kw">final double maxHeightOverGround;
   class="kw">protected class="kw">final boolean autoLevel;
   class="kw">protected class="kw">final double sinMaxClimbAngle;
   class="kw">protected class="kw">final double sinMaxSinkAngle;
   class="kw">protected class="kw">final MotionController.VerticalRange verticalRange = new MotionController.VerticalRange();
   class="kw">protected class="kw">final PositionProbeAir moveProbe = new PositionProbeAir();
   class="kw">protected class="kw">final PositionProbeAir probeMoveProbe = new PositionProbeAir();
   class="kw">protected int lastVerticalPositionX = Integer.MIN_VALUE;
   class="kw">protected int lastVerticalPositionZ = Integer.MIN_VALUE;
   class="kw">protected class="kw">final Vector3d lastVelocity = new Vector3d();
   class="kw">protected double lastSpeed;
   class="kw">protected float lastRoll;
   class="kw">protected double currentRelativeSpeed;
   class="kw">protected double externalVelocityStopThresholdSquared;
   @Nullable
   class="kw">protected double[] desiredAltitudeOverride;

   class="kw">public MotionControllerFly(@Nonnull BuilderSupport var1, @Nonnull BuilderMotionControllerFly var2) {
      super(var1, var2);
      this.setGravity(var2.getGravity());
      this.componentSelector.set(1.0, 1.0, 1.0);
      this.minAirSpeed = var2.getMinAirSpeed();
      this.maxClimbSpeed = var2.getMaxClimbSpeed();
      this.maxSinkSpeed = var2.getMaxSinkSpeed();
      this.maxFallSpeed = var2.getMaxFallSpeed();
      this.maxSinkSpeedFluid = var2.getMaxSinkSpeedFluid();
      this.maxClimbAngle = var2.getMaxClimbAngle();
      this.sinMaxClimbAngle = TrigMathUtil.sin(this.maxClimbAngle);
      this.maxSinkAngle = var2.getMaxSinkAngle();
      this.sinMaxSinkAngle = -TrigMathUtil.sin(this.maxSinkAngle);
      this.acceleration = var2.getAcceleration();
      this.deceleration = var2.getDeceleration();
      this.maxTurnSpeed = var2.getMaxTurnSpeed();
      this.maxRollAngle = var2.getMaxRollAngle();
      this.minHeightOverGround = var2.getMinHeightOverGround(var1);
      this.maxHeightOverGround = var2.getMaxHeightOverGround(var1);
      this.maxRollSpeed = var2.getMaxRollSpeed();
      this.rollDamping = var2.getRollDamping();
      this.fastFlyThreshold = var2.getFastFlyThreshold();
      this.autoLevel = var2.isAutoLevel();
      this.desiredAltitudeWeight = var2.getDesiredAltitudeWeight();
      this.externalVelocityStopThresholdSquared = MathUtil.minValue(this.maxHorizontalSpeed, this.maxSinkSpeed, this.maxClimbSpeed);
      this.externalVelocityStopThresholdSquared = this.externalVelocityStopThresholdSquared * this.externalVelocityStopThresholdSquared;
   }

   @Nonnull
   @Override
   class="kw">public String getType() {
      class="kw">return "Fly";
   }

   @Nonnull
   @Override
   class="kw">public Set<MovementMode> getSupportedMovementModes() {
      class="kw">return SUPPORTED_MOVEMENT_MODES;
   }

   @Nonnull
   @Override
   class="kw">public Set<MovementMode> getDefaultSpawnMovementModes() {
      class="kw">return DEFAULT_SPAWN_MOVEMENT_MODES;
   }

   @Override
   class="kw">protected double computeMove(
      @Nonnull Ref<EntityStore> var1,
      @Nonnull Role var2,
      @Nonnull Steering var3,
      double var4,
      @Nonnull Vector3d var6,
      @Nonnull ComponentAccessor<EntityStore> var7
   ) {
      this.saveMotionKind();
      this.setMotionKind(this.inWater() ? MotionKind.MOVING : MotionKind.FLYING);
      this.moveProbe.probePosition(var1, this.collisionBoundingBox, this.position, this.collisionResult, var7);
      this.currentRelativeSpeed = var3.getSpeed();
      if (!this.isAlive(var1, var7)) {
         this.externalVelocity.zero();
         this.appliedVelocities.clear();
      }

      double var8 = this.moveProbe.isInWater() ? this.maxSinkSpeedFluid : this.maxFallSpeed;
      boolean var10 = this.onGround();
      if (this.externalVelocity.equals(Vector3dUtil.ZERO) && this.appliedVelocities.isEmpty()) {
         if (NPCPhysicsMath.near(this.lastVelocity, Vector3dUtil.ZERO)) {
            PhysicsMath.vectorFromAngles(this.getYaw(), this.getPitch(), this.lastVelocity);
            this.lastSpeed = 0.0;
         }

         if (this.canSteer(var1, var7)) {
            var6.set(var3.getTranslation());
            double var50 = var3.hasTranslation() ? var6.length() : 0.0;
            float var13 = PhysicsMath.normalizeAngle(this.getYaw());
            float var14 = PhysicsMath.normalizeTurnAngle(this.getPitch());
            double var15 = var6.x;
            double var17 = var6.z;
            double var21 = var15 * var15 + var17 * var17;
            float var19;
            float var20;
            if (var21 >= 1.0E-12) {
               var19 = PhysicsMath.headingFromDirection(var15, var17);
               var20 = TrigMathUtil.atan2(var6.y, Math.sqrt(var21));
            } else {
               var19 = var3.hasYawOrDirection() ? var3.getYawOrDirection() : var13;
               var20 = var3.hasPitchOrDirection() ? var3.getPitchOrDirection() : (this.autoLevel ? 0.0F : var14);
            }

            var3.clearYaw();
            var3.clearPitch();
            var20 = MathUtil.clamp(var20, -this.maxSinkAngle, this.maxClimbAngle);
            float var23 = NPCPhysicsMath.turnAngle(var13, var19);
            float var24 = NPCPhysicsMath.turnAngle(var14, var20);
            float var25 = (float)(this.getCurrentMaxBodyRotationSpeed() * var4);
            var23 = NPCPhysicsMath.clampRotation(var23, var25);
            var24 = NPCPhysicsMath.clampRotation(var24, var25);
            float var26 = PhysicsMath.normalizeAngle(var13 + var23);
            float var27 = PhysicsMath.normalizeTurnAngle(var14 + var24);
            double var28 = this.computeMaxSpeedFromPitch(var14);
            var50 *= var28;
            double var30 = Math.max(this.minAirSpeed, this.lastSpeed - this.deceleration * var4);
            double var32 = this.lastSpeed + this.acceleration * var4;
            var50 = var32 < var30 ? var30 : MathUtil.clamp(var50, var30, var32);
            PhysicsMath.vectorFromAngles(var26, var27, var6);
            var6.normalize();
            double var34 = this.lastVelocity.z;
            double var36 = -this.lastVelocity.x;
            double var38 = Math.sqrt(var34 * var34 + var36 * var36);
            float var40 = 0.0F;
            if (var38 != 0.0) {
               var40 = (float)(NPCPhysicsMath.dotProduct(var34, 0.0, var36, var6.x, var6.y, var6.z) / var38);
            }

            float var41 = (float)(this.maxTurnSpeed * var4);
            float var42 = TrigMathUtil.sin(var41);
            float var43 = var40 / var42;
            double var44 = var50 / var28;
            float var46 = this.maxRollAngle * MathUtil.clamp(var43, -1.0F, 1.0F) * MathUtil.clamp((float)var44, 0.0F, 1.0F);
            float var47 = MathUtil.clamp(this.rollDamping * this.lastRoll + (1.0F - this.rollDamping) * var46, -this.maxRollAngle, this.maxRollAngle);
            float var48 = (float)(this.maxRollSpeed * var4);
            float var49 = MathUtil.clamp(var47, this.lastRoll - var48, this.lastRoll + var48);
            this.lastRoll = var49;
            var3.setYaw(var26);
            var3.setPitch(var27);
            var3.setRoll(var49);
            if (var50 == 0.0) {
               var6.zero();
            } else {
               var6.mul(var50 * this.effectHorizontalSpeedMultiplier);
            }

            this.lastVelocity.set(var6);
            this.lastSpeed = var50;
            var6.mul(var4);
            if (this.debugModeValidateMath && !NPCPhysicsMath.isValid(var6)) {
               throw new IllegalArgumentException(String.valueOf(var6));
            }
         } else {
            var3.setYaw(this.getYaw());
            var3.setPitch(this.getPitch());
            var3.setRoll(this.getRoll());
            if (var10) {
               this.setMotionKind(MotionKind.STANDING);
               this.lastVelocity.zero();
               this.lastSpeed = 0.0;
               class="kw">return var4;
            }

            this.setMotionKind(MotionKind.DROPPING);
            var6.y = NPCPhysicsMath.gravityDrag(this.lastVelocity.y, this.gravity, var4, var8);
            double var53 = var8 - var6.y;
            if (!(var53 <= 0.0) && !this.isObstructed()) {
               double var54 = var6.x * var6.x + var6.z * var6.z;
               if (var53 * var53 < var54) {
                  var54 = Math.sqrt(var54 / var53);
                  var6.x = this.lastVelocity.x * var54;
                  var6.z = this.lastVelocity.z * var54;
               } else {
                  var6.x = this.lastVelocity.x;
                  var6.z = this.lastVelocity.z;
               }
            } else {
               var6.x = 0.0;
               var6.z = 0.0;
            }

            this.lastVelocity.set(var6);
            this.lastSpeed = this.lastVelocity.length();
            var6.mul(var4);
            if (this.debugModeValidateMath && !NPCPhysicsMath.isValid(var6)) {
               throw new IllegalArgumentException(String.valueOf(var6));
            }
         }

         if (this.lastSpeed > 1.0E-6 && this.isAlive(var1, var7)) {
            this.setDirectionFromTranslation(var3, var6);
         }

         class="kw">return var4;
      } else {
         var3.setYaw(this.getYaw());
         var3.setPitch(this.getPitch());
         var3.setRoll(this.getRoll());
         if (!this.isObstructed()) {
            var6.set(this.externalVelocity);

            for (int var11 = 0; var11 < this.appliedVelocities.size(); var11++) {
               MotionControllerBase.AppliedVelocity var12 = this.appliedVelocities.get(var11);
               if (var12.velocity.y + this.externalVelocity.y <= 0.0 || var12.velocity.y < 0.0) {
                  var12.canClear = true;
               }

               if (var10 && var12.canClear) {
                  var12.velocity.y = 0.0;
               }

               var6.add(var12.velocity);
            }
         } else {
            var6.zero();
            this.appliedVelocities.clear();
            this.externalVelocity.zero();
         }

         if (!var10) {
            var6.y = NPCPhysicsMath.accelerateDrag(var6.y, -this.gravity, var4, var8);
         }

         this.lastVelocity.set(var6);
         this.lastSpeed = this.lastVelocity.length();
         var6.mul(var4);
         if (this.debugModeValidateMath && !NPCPhysicsMath.isValid(var6)) {
            throw new IllegalArgumentException(String.valueOf(var6));
         } else {
            class="kw">return var4;
         }
      }
   }

   class="kw">private void setDirectionFromTranslation(@Nonnull Steering var1, @Nonnull Vector3d var2) {
      if (!var1.hasYaw()) {
         if (var2.x * var2.x + var2.z * var2.z > 1.0E-6) {
            var1.setYaw(PhysicsMath.headingFromDirection(var2.x, var2.z));
         } else {
            var1.setYaw(this.getYaw());
         }
      }

      if (!var1.hasPitch()) {
         var1.setPitch(PhysicsMath.pitchFromDirection(var2.x, var2.y, var2.z));
      }
   }

   @Override
   class="kw">public double probeMove(@Nonnull Ref<EntityStore> var1, @Nonnull ProbeMoveData var2, @Nonnull ComponentAccessor<EntityStore> var3) {
      Predicate var4 = this.collisionResult.setBlockCollisionFilter(var2.getBlockCollisionFilter());

      try {
         class="kw">return var2.probeDirection.length() * this.doMove(var1, var2.probePosition, var2.probeDirection, this.probeMoveProbe, var2, var3);
      } class="kw">finally {
         this.collisionResult.setBlockCollisionFilter(var4);
      }
   }

   @Override
   class="kw">public boolean isFastMotionKind(double var1) {
      class="kw">return this.lastVelocity.y < -1.0E-6 || this.currentRelativeSpeed > this.fastFlyThreshold && this.lastVelocity.y <= 1.0E-6;
   }

   @Override
   class="kw">public MotionController.VerticalRange getDesiredVerticalRange(@Nonnull Ref<EntityStore> var1, @Nonnull ComponentAccessor<EntityStore> var2) {
      TransformComponent var3 = var2.getComponent(var1, TransformComponent.getComponentType());
      assert var3 != null;
      Vector3d var4 = var3.getPosition();
      int var5 = MathUtil.floor(var4.x());
      int var6 = MathUtil.floor(var4.z());
      if (var5 == this.lastVerticalPositionX && var6 == this.lastVerticalPositionZ) {
         class="kw">return this.verticalRange;
      }

      this.lastVerticalPositionX = var5;
      this.lastVerticalPositionZ = var6;
      double var7 = var4.y();
      World var9 = var2.getExternalData().getWorld();
      ChunkStore var10 = var9.getChunkStore();
      long var11 = ChunkUtil.indexChunkFromBlock(var5, var6);
      Ref var13 = var10.getChunkReference(var11);
      if (var13 != null && var13.isValid()) {
         Store var14 = var10.getStore();
         ChunkColumn var15 = var14.getComponent(var13, ChunkColumn.getComponentType());
         BlockChunk var16 = var14.getComponent(var13, BlockChunk.getComponentType());
         if (var15 != null && var16 != null) {
            double var17;
            double var19;
            if (this.desiredAltitudeOverride != null) {
               var17 = this.desiredAltitudeOverride[0];
               var19 = this.desiredAltitudeOverride[1];
            } else {
               var17 = this.minHeightOverGround;
               var19 = this.maxHeightOverGround;
            }

            int var21 = MathUtil.floor(var7);
            double var22 = WorldUtil.findFarthestEmptySpaceBelow(var14, var15, var16, var5, var21, var6, var21) + this.collisionBoundingBox.min.y;
            double var24 = WorldUtil.findFarthestEmptySpaceAbove(var14, var15, var16, var5, var21, var6, var21) - this.collisionBoundingBox.max.y + 1.0;
            double var26 = var22 + var17;
            double var28 = Math.min(var22 + var19, var24);
            if (var26 > var28) {
               var26 = var7;
               var28 = var7;
            }

            this.verticalRange.set(var7, var26, var28);
            class="kw">return this.verticalRange;
         } else {
            this.verticalRange.set(var7, var7, var7);
            class="kw">return this.verticalRange;
         }
      } else {
         this.verticalRange.set(var7, var7, var7);
         class="kw">return this.verticalRange;
      }
   }

   @Override
   class="kw">public double getWanderVerticalMovementRatio() {
      class="kw">return 0.5;
   }

   class="kw">protected double doMove(
      @Nonnull Ref<EntityStore> var1,
      @Nonnull Vector3d var2,
      @Nonnull Vector3d var3,
      @Nonnull PositionProbeAir var4,
      @Nullable ProbeMoveData var5,
      @Nonnull ComponentAccessor<EntityStore> var6
   ) {
      boolean var7 = var5 != null;
      boolean var8 = var7 && var5.startProbing();
      boolean var9 = var7 || this.canSteer(var1, var6);
      String var10 = var7 ? "Probe" : "Move";
      if (this.shouldDebugMove(var3)) {
         LOGGER.at(Level.INFO)
            .log(
               "eid=%d %s - Fly: Execute pos=%s vel=%s onGround=%s blocked=%s ",
               this.debugEntityId,
               var10,
               Vector3dUtil.formatShortString(var2),
               Vector3dUtil.formatShortString(var3),
               this.onGround(),
               this.isObstructed
            );
      }

      if (var7) {
         this.collisionResult.setBlockCollisionFilter(var5.getBlockCollisionFilter());
      }

      if (this.debugModeValidatePositions && !this.isValidPosition(var2, this.collisionResult, var6)) {
         throw new IllegalStateException("Invalid position");
      }

      if (var8) {
         var5.addStartSegment(var2, false);
      }

      if (var7) {
         this.collisionResult.setBlockCollisionFilter(var5.getBlockCollisionFilter());
      }

      if (var7 && !var4.probePosition(var1, this.collisionBoundingBox, var2, this.collisionResult, var6)) {
         if (var8) {
            appendProbeInvalidStartSegment(var5, var2);
         }

         class="kw">return 0.0;
      } else {
         if (!var7) {
            this.isObstructed = false;
            if (this.debugModeBlockCollisions) {
               this.collisionResult.setLogger(LOGGER, this.debugEntityId);
            }
         }

         this.collisionResult.setCollisionByMaterial(var9 ? 6 : 4);
         if (var7) {
            this.collisionResult.setBlockCollisionFilter(var5.getBlockCollisionFilter());
         }

         CollisionModule.findCollisions(this.collisionBoundingBox, var2, var3, this.collisionResult, var6);
         if (this.debugModeBlockCollisions) {
            this.collisionResult.setLogger(null);
         }

         if (this.debugModeCollisions) {
            this.dumpCollisionResults();
         }

         BlockCollisionData var11 = this.collisionResult.getFirstBlockCollision();
         this.lastValidPosition.set(var2);
         double var12;
         if (var11 == null) {
            var2.add(var3);
            var12 = 1.0;
            if (this.shouldDebugMove(var3)) {
               LOGGER.at(Level.INFO)
                  .log(
                     "eid=%d %s - Fly: No collision pos=%s vel=%s onGround=%s blocked=%s ",
                     this.debugEntityId,
                     var10,
                     Vector3dUtil.formatShortString(var2),
                     Vector3dUtil.formatShortString(var3),
                     this.onGround(),
                     this.isObstructed
                  );
            }

            if (var7) {
               this.collisionResult.setBlockCollisionFilter(var5.getBlockCollisionFilter());
            }

            if (this.debugModeValidatePositions && !this.isValidPosition(var2, this.collisionResult, var6)) {
               throw new IllegalStateException("Invalid position");
            }
         } else {
            var2.set(var11.collisionPoint);
            var12 = var11.collisionStart;
            if (!var7) {
               this.isObstructed = true;
            }

            if (this.debugModeMove) {
               LOGGER.at(Level.INFO)
                  .log(
                     "eid=%d %s - Fly: Collision pos=%s collStart=%s vel=%s onGround=%s blocked=%s ",
                     this.debugEntityId,
                     var10,
                     Vector3dUtil.formatShortString(var2),
                     var12,
                     Vector3dUtil.formatShortString(var3),
                     this.onGround(),
                     this.isObstructed
                  );
            }

            if (var7) {
               this.collisionResult.setBlockCollisionFilter(var5.getBlockCollisionFilter());
            }

            if (this.debugModeValidatePositions && !this.isValidPosition(var2, this.collisionResult, var6)) {
               throw new IllegalStateException("Invalid position");
            }
         }

         if (var7) {
            this.collisionResult.setBlockCollisionFilter(var5.getBlockCollisionFilter());
         }

         if (!var4.probePosition(var1, this.collisionBoundingBox, var2, this.collisionResult, var6)) {
            double var14 = this.bisect(this.lastValidPosition, var2, this, (var4x, var5x) -> {
               if (var7) {
                  var4x.collisionResult.setBlockCollisionFilter(var5.getBlockCollisionFilter());
               }

               class="kw">return var4x.moveProbe.probePosition(var1, var4x.collisionBoundingBox, var5x, var4x.collisionResult, var6);
            }, var2);
            var12 *= var14;
            if (this.debugModeMove) {
               LOGGER.at(Level.INFO)
                  .log(
                     "eid=%d %s - Fly: Bisect step pos=%s distanceFactor=%s adjust=%s",
                     this.debugEntityId,
                     var10,
                     Vector3dUtil.formatShortString(var2),
                     var12,
                     var14
                  );
            }
         }

         if (!var7) {
            this.processTriggers(var1, this.collisionResult, var12, var6);
         } else if (var8) {
            double var16 = this.waypointDistance(var5.initialPosition, var2);
            if (var11 == null) {
               var5.addMoveSegment(var2, false, var16);
            } else if (this.getWorldNormal().equals(var11.collisionNormal)) {
               var5.addHitGroundSegment(var2, var16, var11.collisionNormal, var11.blockId);
            } else {
               var5.addHitWallSegment(var2, false, var16, var11.collisionNormal, var11.blockId);
            }

            var5.addEndSegment(var2, false, var16);
         }

         class="kw">return var12;
      }
   }

   class="kw">static void appendProbeInvalidStartSegment(@Nonnull ProbeMoveData var0, @Nonnull Vector3d var1) {
      var0.addEndSegment(var1, false, 0.0);
   }

   @Override
   class="kw">protected double executeMove(
      @Nonnull Ref<EntityStore> var1, @Nonnull Role var2, double var3, @Nonnull Vector3d var5, @Nonnull ComponentAccessor<EntityStore> var6
   ) {
      double var7 = this.doMove(var1, this.position, var5, this.moveProbe, null, var6);
      if (var7 < 1.0) {
         var3 *= var7;
         this.lastSpeed *= var7;
         this.lastVelocity.mul(var7);
      }

      class="kw">return var3;
   }

   @Override
   class="kw">public void constrainRotations(Role var1, TransformComponent var2) {
   }

   @Override
   class="kw">public double getCurrentMaxBodyRotationSpeed() {
      class="kw">return this.maxTurnSpeed * this.effectHorizontalSpeedMultiplier;
   }

   @Override
   class="kw">protected void dampExternalVelocity(@Nonnull Vector3d var1, double var2, double var4, ComponentAccessor<EntityStore> var6) {
      if (var1.lengthSquared() < this.externalVelocityStopThresholdSquared) {
         var1.zero();
      } else {
         NPCPhysicsMath.deccelerateToStop(var1, this.getDampingDeceleration(), var4);
      }
   }

   @Override
   class="kw">protected boolean shouldDampenAppliedVelocitiesY() {
      class="kw">return true;
   }

   @Override
   class="kw">protected boolean shouldAlwaysUseGroundResistance() {
      class="kw">return true;
   }

   @Override
   class="kw">public void spawned() {
   }

   @Override
   class="kw">public boolean canSteer(@Nonnull Ref<EntityStore> var1, @Nonnull ComponentAccessor<EntityStore> var2) {
      class="kw">return super.canSteer(var1, var2) && this.moveProbe.isInAir() && this.effectHorizontalSpeedMultiplier != 0.0;
   }

   @Override
   class="kw">public boolean inAir() {
      class="kw">return !this.onGround();
   }

   @Override
   class="kw">public boolean onGround() {
      class="kw">return this.moveProbe.isOnGround();
   }

   @Override
   class="kw">public boolean inWater() {
      class="kw">return this.moveProbe.isInWater();
   }

   @Override
   class="kw">public double getCurrentSpeed() {
      class="kw">return 0.0;
   }

   @Override
   class="kw">public double getCurrentTurnRadius() {
      class="kw">return this.lastSpeed / this.maxTurnSpeed;
   }

   @Override
   class="kw">public float getMaxClimbAngle() {
      class="kw">return this.maxClimbAngle;
   }

   @Override
   class="kw">public float getMaxSinkAngle() {
      class="kw">return this.maxSinkAngle;
   }

   @Override
   class="kw">public double getMaximumSpeed() {
      class="kw">return MathUtil.maxValue(this.maxClimbSpeed, this.maxHorizontalSpeed, this.maxSinkSpeed) * this.effectHorizontalSpeedMultiplier;
   }

   @Override
   class="kw">public boolean is2D() {
      class="kw">return false;
   }

   @Override
   class="kw">public boolean canRestAtPlace() {
      class="kw">return false;
   }

   @Override
   class="kw">public double getDesiredAltitudeWeight() {
      class="kw">return this.desiredAltitudeWeight;
   }

   @Override
   class="kw">public double getHeightOverGround() {
      class="kw">return this.probeMoveProbe.getHeightOverGround();
   }

   @Override
   class="kw">public boolean isHorizontalIdle(double var1) {
      class="kw">return false;
   }

   @Override
   class="kw">public boolean estimateVelocity(Steering var1, @Nonnull Vector3d var2) {
      var2.zero();
      class="kw">return false;
   }

   @Override
   class="kw">public void clearOverrides() {
      this.desiredAltitudeOverride = null;
   }

   class="kw">public void setDesiredAltitudeOverride(double[] var1) {
      this.desiredAltitudeOverride = var1;
   }

   class="kw">public void takeOff(@Nonnull Ref<EntityStore> var1, double var2, @Nonnull ComponentAccessor<EntityStore> var4) {
      TransformComponent var5 = var4.getComponent(var1, TransformComponent.getComponentType());
      assert var5 != null;
      PhysicsMath.vectorFromAngles(var5.getRotation().yaw(), (float) (Math.PI / 4), this.lastVelocity);
      this.lastSpeed = var2;
   }

   class="kw">public double getExternalVelocityStopThresholdSquared() {
      class="kw">return this.externalVelocityStopThresholdSquared;
   }

   class="kw">public double getDampingDeceleration() {
      class="kw">return this.externalVelocityDamping * 20.0;
   }

   class="kw">protected double computeMaxSpeedFromPitch(double var1) {
      double var3 = TrigMathUtil.sin(var1);
      double var5 = Math.sqrt(1.0 - var3 * var3);
      double var7 = var5 * this.maxHorizontalSpeed;
      double var9 = var3 * (var3 > 0.0 ? this.maxClimbSpeed : this.maxSinkSpeed);
      class="kw">return Math.sqrt(var7 * var7 + var9 * var9);
   }
}