AppliedVelocity class

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

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

Поля (3)

МодификаторыТипИмя
public boolean canClear
public final VelocityConfig config
public final Vector3d velocity

Исходный код

Показать/скрыть
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.logger.HytaleLogger;
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.util.MathUtil;
class="kw">import com.hypixel.hytale.math.vector.Rotation3f;
class="kw">import com.hypixel.hytale.math.vector.Vector3dUtil;
class="kw">import com.hypixel.hytale.protocol.GameMode;
class="kw">import com.hypixel.hytale.protocol.MovementSettings;
class="kw">import com.hypixel.hytale.protocol.MovementStates;
class="kw">import com.hypixel.hytale.protocol.Rangef;
class="kw">import com.hypixel.hytale.server.core.asset.modifiers.MovementEffects;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.RotationTuple;
class="kw">import com.hypixel.hytale.server.core.asset.type.model.config.Model;
class="kw">import com.hypixel.hytale.server.core.asset.type.model.config.camera.CameraSettings;
class="kw">import com.hypixel.hytale.server.core.entity.InteractionManager;
class="kw">import com.hypixel.hytale.server.core.entity.entities.player.movement.MovementManager;
class="kw">import com.hypixel.hytale.server.core.modules.collision.BlockCollisionData;
class="kw">import com.hypixel.hytale.server.core.modules.collision.CharacterCollisionData;
class="kw">import com.hypixel.hytale.server.core.modules.collision.CollisionConfig;
class="kw">import com.hypixel.hytale.server.core.modules.collision.CollisionDataArray;
class="kw">import com.hypixel.hytale.server.core.modules.collision.CollisionModule;
class="kw">import com.hypixel.hytale.server.core.modules.collision.CollisionModuleConfig;
class="kw">import com.hypixel.hytale.server.core.modules.collision.CollisionResult;
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.modules.entity.damage.Damage;
class="kw">import com.hypixel.hytale.server.core.modules.entity.damage.DamageCause;
class="kw">import com.hypixel.hytale.server.core.modules.entity.damage.DamageSystems;
class="kw">import com.hypixel.hytale.server.core.modules.entity.damage.DeathComponent;
class="kw">import com.hypixel.hytale.server.core.modules.interaction.InteractionModule;
class="kw">import com.hypixel.hytale.server.core.modules.physics.component.PhysicsValues;
class="kw">import com.hypixel.hytale.server.core.modules.physics.util.PhysicsMath;
class="kw">import com.hypixel.hytale.server.core.modules.splitvelocity.SplitVelocity;
class="kw">import com.hypixel.hytale.server.core.modules.splitvelocity.VelocityConfig;
class="kw">import com.hypixel.hytale.server.core.universe.world.World;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.WorldChunk;
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.NPCPlugin;
class="kw">import com.hypixel.hytale.server.npc.asset.builder.BuilderSupport;
class="kw">import com.hypixel.hytale.server.npc.entities.NPCEntity;
class="kw">import com.hypixel.hytale.server.npc.movement.MotionKind;
class="kw">import com.hypixel.hytale.server.npc.movement.NavState;
class="kw">import com.hypixel.hytale.server.npc.movement.Steering;
class="kw">import com.hypixel.hytale.server.npc.movement.constraints.RelaxedConstraint;
class="kw">import com.hypixel.hytale.server.npc.movement.controllers.builders.BuilderMotionControllerBase;
class="kw">import com.hypixel.hytale.server.npc.role.Role;
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.util.NPCPhysicsMath;
class="kw">import com.hypixel.hytale.server.npc.util.VisHelper;
class="kw">import it.unimi.dsi.fastutil.objects.ObjectArrayList;
class="kw">import java.util.EnumSet;
class="kw">import java.util.List;
class="kw">import java.util.Objects;
class="kw">import java.util.function.BiPredicate;
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">import org.joml.Vector3dc;

class="kw">public class="kw">abstract class MotionControllerBase class="kw">implements MotionController {
   class="kw">public class="kw">static class="kw">final double FORCE_SCALE = 5.0;
   class="kw">public class="kw">static class="kw">final double BISECT_DIST = 0.05;
   class="kw">public class="kw">static class="kw">final double FILTER_COEFFICIENT = 0.7;
   class="kw">public class="kw">static class="kw">final double DOT_PRODUCT_EPSILON = 0.1;
   class="kw">private class="kw">static class="kw">final double RAIL_GRAZING_EPSILON = 1.0E-6;
   class="kw">private class="kw">static class="kw">final double RAIL_GRAZING_RATIO = 0.05;
   class="kw">public class="kw">static class="kw">final double DEFAULT_BLOCK_DRAG = 0.82;
   class="kw">protected class="kw">static class="kw">final HytaleLogger LOGGER = NPCPlugin.get().getLogger();
   class="kw">public class="kw">static class="kw">final boolean DEBUG_APPLIED_FORCES = false;
   @Nonnull
   class="kw">protected class="kw">final NPCEntity entity;
   class="kw">protected class="kw">final String type;
   class="kw">protected class="kw">final double epsilonSpeed;
   class="kw">protected class="kw">final float epsilonAngle;
   class="kw">protected class="kw">final double externalVelocityDamping;
   class="kw">protected class="kw">final double maxHorizontalSpeed;
   class="kw">protected class="kw">final double fastMotionThreshold;
   class="kw">protected class="kw">final double fastMotionThresholdRange;
   class="kw">protected class="kw">final float maxHeadRotationSpeed;
   class="kw">protected Role role;
   class="kw">protected double inertia;
   class="kw">protected double knockbackScale;
   class="kw">protected double gravity;
   @Nullable
   class="kw">protected float[] headPitchAngleRange;
   class="kw">protected boolean debugModeSteer;
   class="kw">protected boolean debugModeMove;
   class="kw">protected boolean debugModeMoveSkipIdle;
   class="kw">protected boolean debugModeCollisions;
   class="kw">protected boolean debugModeBlockCollisions;
   class="kw">protected boolean debugModeProbeBlockCollisions;
   class="kw">protected boolean debugModeValidatePositions;
   class="kw">protected boolean debugModeOverlaps;
   class="kw">protected boolean debugModeNonOverlaps;
   class="kw">protected boolean debugModeValidateMath;
   class="kw">protected int debugEntityId = -1;
   class="kw">protected class="kw">final Vector3d position = new Vector3d();
   class="kw">protected class="kw">final Box collisionBoundingBox = new Box();
   class="kw">protected class="kw">final CollisionResult collisionResult = new CollisionResult();
   class="kw">protected class="kw">final Vector3d translation = new Vector3d();
   class="kw">protected class="kw">final Vector3d bisectValidPosition = new Vector3d();
   class="kw">protected class="kw">final Vector3d bisectInvalidPosition = new Vector3d();
   class="kw">protected class="kw">final Vector3d lastValidPosition = new Vector3d();
   class="kw">protected class="kw">final Vector3d externalVelocity = new Vector3d();
   class="kw">protected class="kw">final Vector3d appliedVelocity = new Vector3d();
   class="kw">protected boolean ignoreDamping;
   class="kw">protected class="kw">final List<MotionControllerBase.AppliedVelocity> appliedVelocities = new ObjectArrayList();
   class="kw">protected boolean isObstructed;
   class="kw">protected NavState navState;
   class="kw">protected double throttleDuration;
   class="kw">protected double targetDeltaSquared;
   class="kw">protected boolean recomputePath;
   class="kw">private boolean railStepAppliedThisTick;
   class="kw">protected class="kw">final Vector3dc worldNormal = Vector3dUtil.UP;
   class="kw">protected class="kw">final Vector3dc worldAntiNormal = Vector3dUtil.DOWN;
   class="kw">protected class="kw">final Vector3d componentSelector = new Vector3d(1.0, 0.0, 1.0);
   class="kw">protected class="kw">final Vector3d planarComponentSelector = new Vector3d(1.0, 0.0, 1.0);
   class="kw">protected boolean enableTriggers = true;
   class="kw">protected boolean enableBlockDamage = true;
   class="kw">protected boolean isReceivingBlockDamage;
   class="kw">protected boolean requiresPreciseMovement;
   class="kw">protected boolean havePreciseMovementTarget;
   @Nonnull
   class="kw">protected Vector3d preciseMovementTarget = new Vector3d();
   @Nonnull
   class="kw">protected EnumSet<RelaxedConstraint> relaxedConstraints = EnumSet.noneOf(RelaxedConstraint.class);
   class="kw">protected boolean isBlendingHeading;
   class="kw">protected double blendHeading;
   class="kw">protected boolean haveBlendHeadingPosition;
   @Nonnull
   class="kw">protected Vector3d blendHeadingPosition = new Vector3d();
   class="kw">protected double blendLevelAtTargetPosition = 0.5;
   class="kw">protected boolean fastMotionKind;
   class="kw">protected boolean idleMotionKind;
   class="kw">protected boolean horizontalIdleKind;
   class="kw">protected double moveSpeed;
   class="kw">protected double previousSpeed;
   class="kw">protected MotionKind motionKind;
   class="kw">protected MotionKind lastMovementStateUpdatedMotionKind;
   class="kw">protected MotionKind previousMotionKind;
   class="kw">protected double effectHorizontalSpeedMultiplier;
   class="kw">protected boolean cachedMovementBlocked;
   class="kw">private float yaw;
   class="kw">private float pitch;
   class="kw">private float roll;
   class="kw">private class="kw">final Vector3d beforeTriggerExternalVelocity = new Vector3d();
   class="kw">private class="kw">final Vector3d beforeTriggerPosition = new Vector3d();
   class="kw">private boolean processTriggersHasMoved;
   class="kw">protected MovementSettings movementSettings;

   class="kw">public MotionControllerBase(@Nonnull BuilderSupport var1, @Nonnull BuilderMotionControllerBase var2) {
      NPCEntity var3 = var1.getHolder().getComponent(NPCEntity.getComponentType());
      assert var3 != null : "NPC component null in motion controller construction!";
      this.entity = var3;
      this.type = var2.getType();
      this.epsilonSpeed = var2.getEpsilonSpeed();
      this.epsilonAngle = var2.getEpsilonAngle();
      this.externalVelocityDamping = var2.getExternalVelocityDamping();
      this.maxHorizontalSpeed = var2.getMaxHorizontalSpeed(var1);
      this.fastMotionThreshold = var2.getFastHorizontalThreshold(var1);
      this.fastMotionThresholdRange = var2.getFastHorizontalThresholdRange();
      this.maxHeadRotationSpeed = var2.getMaxHeadRotationSpeed(var1);
      this.setInertia(1.0);
      this.setKnockbackScale(1.0);
      this.setGravity(10.0);
   }

   @Override
   class="kw">public Role getRole() {
      class="kw">return this.role;
   }

   @Override
   class="kw">public void setRole(Role var1) {
      this.role = var1;
   }

   @Override
   class="kw">public void setDebugEntityId(int var1) {
      this.debugEntityId = var1;
   }

   @Override
   class="kw">public void setInertia(double var1) {
      this.inertia = Math.max(var1, 1.0E-4);
   }

   @Override
   class="kw">public void setKnockbackScale(double var1) {
      this.knockbackScale = Math.max(0.0, var1);
   }

   @Override
   class="kw">public void updateModelParameters(Ref<EntityStore> var1, Model var2, @Nonnull Box var3, ComponentAccessor<EntityStore> var4) {
      Objects.requireNonNull(var3, "updateModelParameters: MotionController needs a bounding box");
      this.collisionBoundingBox.assign(var3);
   }

   @Override
   class="kw">public void setHeadPitchAngleRange(float[] var1) {
      if (var1 == null) {
         this.headPitchAngleRange = null;
      } else {
         assert var1.length == 2;
         this.headPitchAngleRange = (float[])var1.clone();
      }
   }

   class="kw">protected void readEntityPosition(@Nonnull Ref<EntityStore> var1, @Nonnull ComponentAccessor<EntityStore> var2) {
      TransformComponent var3 = var2.getComponent(var1, TransformComponent.getComponentType());
      assert var3 != null;
      Rotation3f var4 = var3.getRotation();
      this.position.set(var3.getPosition());
      this.yaw = var4.y();
      this.pitch = var4.pitch();
      this.roll = var4.roll();
      this.adjustReadPosition(var1, var2);
      this.postReadPosition(var1, var2);
   }

   class="kw">public void postReadPosition(Ref<EntityStore> var1, ComponentAccessor<EntityStore> var2) {
   }

   class="kw">public void moveEntity(@Nonnull Ref<EntityStore> var1, double var2, @Nonnull ComponentAccessor<EntityStore> var4) {
      TransformComponent var5 = var4.getComponent(var1, TransformComponent.getComponentType());
      assert var5 != null;
      this.adjustWritePosition(var1, var2, var4);
      Rotation3f var6 = var5.getRotation();
      var6.setYaw(this.yaw);
      var6.setPitch(this.pitch);
      var6.setRoll(this.roll);
      this.entity.moveTo(var1, this.position.x, this.position.y, this.position.z, var4);
   }

   class="kw">public float getYaw() {
      class="kw">return this.yaw;
   }

   class="kw">public float getPitch() {
      class="kw">return this.pitch;
   }

   class="kw">public float getRoll() {
      class="kw">return this.roll;
   }

   class="kw">public boolean touchesWater(boolean var1, @Nonnull ComponentAccessor<EntityStore> var2) {
      World var3 = var2.getExternalData().getWorld();
      ChunkStore var4 = var3.getChunkStore();
      long var5 = ChunkUtil.indexChunkFromBlock(this.position.x(), this.position.z());
      Ref var7 = var4.getChunkReference(var5);
      if (var7 != null && var7.isValid()) {
         WorldChunk var8 = var4.getStore().getComponent(var7, WorldChunk.getComponentType());
         assert var8 != null;
         int var9 = MathUtil.floor(this.position.x());
         int var10 = MathUtil.floor(this.position.y() + this.collisionBoundingBox.min.y);
         int var11 = MathUtil.floor(this.position.z());
         int var12 = var8.getFluidId(var9, var10, var11);
         class="kw">return var12 != 0;
      } else {
         class="kw">return var1;
      }
   }

   @Override
   class="kw">public void updateMovementState(
      @Nonnull Ref<EntityStore> var1,
      @Nonnull MovementStates var2,
      @Nonnull Steering var3,
      @Nonnull Vector3d var4,
      @Nonnull ComponentAccessor<EntityStore> var5
   ) {
      boolean var6 = var2.running;
      var2.climbing = false;
      var2.swimJumping = false;
      var2.inFluid = this.touchesWater(var2.inFluid, var5);
      var2.onGround = this.role.isOnGround();
      double var7 = this.waypointDistance(Vector3dUtil.ZERO, var4);
      var7 = 0.7 * this.previousSpeed + 0.30000000000000004 * var7;
      this.previousSpeed = var7;
      this.fastMotionKind = this.isFastMotionKind(var7);
      this.idleMotionKind = var3.getTranslation().equals(Vector3dUtil.ZERO);
      this.horizontalIdleKind = this.isHorizontalIdle(var7);
      if (this.motionKind != this.lastMovementStateUpdatedMotionKind
         || var6 != this.fastMotionKind
         || var2.idle != this.idleMotionKind
         || var2.horizontalIdle != this.horizontalIdleKind) {
         class="kw">switch (this.motionKind) {
            case FLYING:
               this.updateFlyingStates(var2, this.idleMotionKind, this.fastMotionKind);
               break;
            case SWIMMING:
               this.updateSwimmingStates(var2, this.idleMotionKind, this.fastMotionKind, this.horizontalIdleKind);
               break;
            case SWIMMING_TURNING:
               this.updateSwimmingStates(var2, false, true, false);
               break;
            case ASCENDING:
               this.updateAscendingStates(var1, var2, this.fastMotionKind, this.horizontalIdleKind, var5);
               break;
            case MOVING:
               updateMovingStates(var1, var2, this.fastMotionKind, var5);
               break;
            case DESCENDING: {
               NPCEntity var11 = var5.getComponent(var1, NPCEntity.getComponentType());
               assert var11 != null;
               this.updateDescendingStates(var1, var2, this.fastMotionKind, var11.getHoverHeight() > 0.0, var5);
               break;
            }
            case DROPPING:
               this.updateDroppingStates(var2);
               break;
            case STANDING: {
               NPCEntity var9 = var5.getComponent(var1, NPCEntity.getComponentType());
               assert var9 != null;
               this.updateStandingStates(var2, this.motionKind, var9.getHoverHeight() > 0.0);
            }
         }
      }

      this.lastMovementStateUpdatedMotionKind = this.motionKind;
   }

   class="kw">protected class="kw">abstract boolean isFastMotionKind(double var1);

   class="kw">protected void updateFlyingStates(@Nonnull MovementStates var1, boolean var2, boolean var3) {
      var1.flying = true;
      var1.idle = var2;
      var1.horizontalIdle = false;
      var1.walking = !var3;
      var1.running = var3;
      var1.falling = false;
      var1.swimming = false;
      var1.jumping = false;
   }

   class="kw">protected void updateSwimmingStates(@Nonnull MovementStates var1, boolean var2, boolean var3, boolean var4) {
      var1.flying = false;
      var1.idle = var2;
      var1.horizontalIdle = var4;
      var1.walking = !var3;
      var1.running = var3;
      var1.falling = false;
      var1.swimming = true;
      var1.jumping = false;
   }

   class="kw">protected class="kw">static void updateMovingStates(
      @Nonnull Ref<EntityStore> var0, @Nonnull MovementStates var1, boolean var2, @Nonnull ComponentAccessor<EntityStore> var3
   ) {
      NPCEntity var4 = var3.getComponent(var0, NPCEntity.getComponentType());
      assert var4 != null;
      var1.flying = var4.getHoverHeight() > 0.0;
      var1.idle = false;
      var1.horizontalIdle = false;
      var1.falling = false;
      var1.walking = !var2;
      var1.running = var2;
      var1.swimming = false;
      var1.jumping = false;
   }

   class="kw">protected void updateAscendingStates(
      @Nonnull Ref<EntityStore> var1, @Nonnull MovementStates var2, boolean var3, boolean var4, @Nonnull ComponentAccessor<EntityStore> var5
   ) {
      updateMovingStates(var1, var2, var3, var5);
   }

   class="kw">protected void updateDescendingStates(
      @Nonnull Ref<EntityStore> var1, @Nonnull MovementStates var2, boolean var3, boolean var4, @Nonnull ComponentAccessor<EntityStore> var5
   ) {
      updateMovingStates(var1, var2, var3, var5);
   }

   class="kw">protected void updateDroppingStates(@Nonnull MovementStates var1) {
      var1.falling = true;
   }

   class="kw">protected void updateStandingStates(@Nonnull MovementStates var1, @Nonnull MotionKind var2, boolean var3) {
      var1.flying = var3;
      var1.idle = true;
      var1.horizontalIdle = true;
      var1.walking = false;
      var1.running = false;
      var1.falling = false;
      var1.swimming = false;
      var1.jumping = false;
   }

   @Override
   class="kw">public double steer(
      @Nonnull Ref<EntityStore> var1,
      @Nonnull Role var2,
      @Nonnull Steering var3,
      @Nonnull Steering var4,
      double var5,
      @Nonnull ComponentAccessor<EntityStore> var7
   ) {
      if (this.railStepAppliedThisTick) {
         class="kw">return var5;
      } else {
         this.readEntityPosition(var1, var7);
         if (this.debugModeSteer) {
            double var8 = this.position.x;
            double var10 = this.position.z;
            double var12 = this.steer0(var1, var2, var3, var4, var5, var7);
            double var14 = var5 - var12;
            var8 = this.position.x - var8;
            var10 = this.position.z - var10;
            double var16 = Math.sqrt(var8 * var8 + var10 * var10);
            double var18 = var14 > 0.0 ? var16 / var14 : 0.0;
            LOGGER.at(Level.INFO)
               .log(
                  "eid=%d ==  Steer %s  = t =%.4f dt=%.4f h =%.4f l =%.4f v =%.4f obstr=%s motion=%s",
                  this.debugEntityId,
                  this.getType(),
                  var5,
                  var14,
                  (180.0F / (float)Math.PI) * this.yaw,
                  var16,
                  var18,
                  this.isObstructed ? "yes" : "no",
                  var2.getSteeringMotionName()
               );
            class="kw">return var12;
         } else {
            class="kw">return this.steer0(var1, var2, var3, var4, var5, var7);
         }
      }
   }

   class="kw">public double steer0(
      @Nonnull Ref<EntityStore> var1,
      @Nonnull Role var2,
      @Nonnull Steering var3,
      @Nonnull Steering var4,
      double var5,
      @Nonnull ComponentAccessor<EntityStore> var7
   ) {
      World var8 = var7.getExternalData().getWorld();
      NPCEntity var9 = var7.getComponent(var1, NPCEntity.getComponentType());
      assert var9 != null;
      this.effectHorizontalSpeedMultiplier = var9.getCurrentHorizontalSpeedMultiplier(var1, var7);
      this.applyRuntimeRelaxedConstraints(!var2.couldBreatheCached(var1, var7));
      this.translation.zero();
      this.cachedMovementBlocked = this.isMovementBlocked(var1, var7);
      this.computeMove(var1, var2, var3, var5, this.translation, var7);
      if (this.shouldDebugMove(this.translation)) {
         LOGGER.at(Level.INFO)
            .log(
               "eid=%d ==  Move  %s  = t =%.4f pos=%s motion=%s obstr=%s",
               this.debugEntityId,
               this.type,
               var5,
               Vector3dUtil.formatShortString(this.position),
               var2.getSteeringMotionName(),
               this.isObstructed ? "yes" : "no"
            );
      }

      if (this.debugModeValidateMath) {
         if (!NPCPhysicsMath.isValid(this.translation)) {
            throw new IllegalArgumentException(String.valueOf(this.translation));
         }

         if (this.translation.lengthSquared() > 1000000.0) {
            throw new IllegalStateException(
               String.format(
                  "NPC with role %s has abnormal high speed! (Distance=%s, MotionController=%s)", var2.getRoleName(), this.translation.length(), this.type
               )
            );
         }
      } else if (this.translation.lengthSquared() > 1000000.0) {
         this.translation.zero();
      }

      this.applyRuntimeRelaxedConstraints(!var2.couldBreatheCached(var1, var7));
      this.executeMove(var1, var2, var5, this.translation, var7);
      if (DebugSupport.get(var1, var7).isDebugFlagSet(RoleDebugFlags.VisTranslation)) {
         VisHelper.renderDebugVectorTo(this.position, this.translation, VisHelper.DEBUG_COLOR_STEERING_PRE, var8);
      }

      this.postExecuteMove();
      this.clearRequirePreciseMovement();
      this.clearBlendHeading();
      boolean var10 = !var2.couldBreatheCached(var1, var7);
      this.relaxedConstraints.clear();
      this.applyRuntimeRelaxedConstraints(var10);
      float var11 = (float)(var5 * this.getCurrentMaxBodyRotationSpeed() * var3.getRelativeTurnSpeed());
      float var12 = (float)(var5 * this.maxHeadRotationSpeed * var4.getRelativeTurnSpeed() * this.effectHorizontalSpeedMultiplier);
      this.calculateYaw(var1, var3, var4, var12, var11, var7);
      this.calculatePitch(var1, var3, var4, var12, var7);
      this.calculateRoll(var3, var4);
      this.moveEntity(var1, var5, var7);
      HeadRotation var13 = var7.getComponent(var1, HeadRotation.getComponentType());
      assert var13 != null;
      Rotation3f var14 = var13.getRotation();
      var14.setYaw(var4.getYaw());
      var14.setPitch(var4.getPitch());
      var14.setRoll(var4.getRoll());
      if (!this.externalVelocity.equals(Vector3dUtil.ZERO) && !this.ignoreDamping) {
         double var15 = 1.0000000000000002E-10;
         if (this.externalVelocity.lengthSquared() >= var15) {
            this.dampExternalVelocity(this.externalVelocity, this.externalVelocityDamping, var5, var7);
         } else {
            this.externalVelocity.zero();
         }
      }

      double var29 = 60.0;
      int var17 = var8.getTps();
      double var18 = var29 / var17;
      boolean var20 = this.shouldDampenAppliedVelocitiesY();
      boolean var21 = this.shouldAlwaysUseGroundResistance() || this.onGround();

      for (int var22 = 0; var22 < this.appliedVelocities.size(); var22++) {
         MotionControllerBase.AppliedVelocity var23 = this.appliedVelocities.get(var22);
         float var24;
         float var25;
         if (var21) {
            var24 = var23.config.getGroundResistance();
            var25 = var23.config.getGroundResistanceMax();
         } else {
            var24 = var23.config.getAirResistance();
            var25 = var23.config.getAirResistanceMax();
         }

         float var26 = var24;
         if (var25 >= 0.0F) {
            var26 = class="kw">switch (var23.config.getStyle()) {
               case Linear -> {
                  float var31 = (float)var23.velocity.length();
                  if (var31 < var23.config.getThreshold()) {
                     float var33 = var31 / var23.config.getThreshold();
                     yield var24 * var33 + var25 * (1.0F - var33);
                  } else {
                     yield var24;
                  }
               }
               case Exp -> {
                  float var27 = (float)var23.velocity.lengthSquared();
                  if (var27 < var23.config.getThreshold() * var23.config.getThreshold()) {
                     float var28 = var27 / (var23.config.getThreshold() * var23.config.getThreshold());
                     yield var24 * var28 + var25 * (1.0F - var28);
                  } else {
                     yield var24;
                  }
               }
            };
         }

         double var32 = Math.pow(var26, var18);
         var23.velocity.x *= var32;
         var23.velocity.z *= var32;
         if (var20) {
            var23.velocity.y *= var32;
         }
      }

      for (int var30 = this.appliedVelocities.size() - 1; var30 >= 0; var30--) {
         if (this.appliedVelocities.get(var30).velocity.lengthSquared() < 0.001) {
            this.appliedVelocities.remove(var30);
         }
      }

      class="kw">return var5;
   }

   class="kw">protected boolean shouldDampenAppliedVelocitiesY() {
      class="kw">return false;
   }

   class="kw">protected boolean shouldAlwaysUseGroundResistance() {
      class="kw">return false;
   }

   class="kw">protected void calculateYaw(
      @Nonnull Ref<EntityStore> var1, @Nonnull Steering var2, @Nonnull Steering var3, float var4, float var5, @Nonnull ComponentAccessor<EntityStore> var6
   ) {
      if (var2.hasYawOrDirection()) {
         this.yaw = var2.getYawOrDirection();
      } else if (NPCPhysicsMath.dotProduct(this.translation.x, 0.0, this.translation.z) > 0.1) {
         this.yaw = PhysicsMath.headingFromDirection(this.translation.x, this.translation.z);
      }

      boolean var7 = var3.hasYaw();
      if (!var7) {
         var3.setYaw(this.yaw);
      }

      HeadRotation var8 = var6.getComponent(var1, HeadRotation.getComponentType());
      assert var8 != null;
      ModelComponent var9 = var6.getComponent(var1, ModelComponent.getComponentType());
      assert var9 != null;
      Rotation3f var10 = var8.getRotation();
      float var11 = var10.yaw();
      float var12 = var3.getYaw();
      float var13 = MathUtil.clamp(NPCPhysicsMath.turnAngle(var11, var12), -var4, var4);
      var3.setYaw(PhysicsMath.normalizeTurnAngle(var11 + var13));
      if (var7) {
         float var14 = MathUtil.wrapAngle(var3.getYaw() - this.yaw);
         CameraSettings var17 = var9.getModel().getCamera();
         float var15;
         float var16;
         if (var17 != null && var17.getYaw() != null && var17.getYaw().getAngleRange() != null) {
            Rangef var18 = var17.getYaw().getAngleRange();
            var15 = var18.min * (float) (Math.PI / 180.0);
            var16 = var18.max * (float) (Math.PI / 180.0);
         } else {
            var15 = (float) (-Math.PI / 4);
            var16 = (float) (Math.PI / 4);
         }

         if (var14 > var16) {
            float var19 = this.yaw;
            if (!var2.hasYaw()) {
               this.yaw = this.blendBodyYaw(var1, var14, var5, var6);
            }

            var3.setYaw(MathUtil.wrapAngle(var19 + var16));
         } else if (var14 < var15) {
            float var20 = this.yaw;
            if (!var2.hasYaw()) {
               this.yaw = this.blendBodyYaw(var1, var14, var5, var6);
            }

            var3.setYaw(MathUtil.wrapAngle(var20 + var15));
         }
      }
   }

   class="kw">protected float blendBodyYaw(@Nonnull Ref<EntityStore> var1, float var2, float var3, @Nonnull ComponentAccessor<EntityStore> var4) {
      TransformComponent var5 = var4.getComponent(var1, TransformComponent.getComponentType());
      assert var5 != null;
      Rotation3f var6 = var5.getRotation();
      float var7 = var6.yaw();
      float var8 = MathUtil.wrapAngle(this.yaw + var2);
      float var9 = MathUtil.clamp(NPCPhysicsMath.turnAngle(var7, var8), -var3, var3);
      class="kw">return MathUtil.wrapAngle(this.yaw + var9);
   }

   class="kw">protected void calculatePitch(
      @Nonnull Ref<EntityStore> var1, @Nonnull Steering var2, @Nonnull Steering var3, float var4, @Nonnull ComponentAccessor<EntityStore> var5
   ) {
      if (var2.hasPitchOrDirection()) {
         this.pitch = var2.getPitchOrDirection();
      } else if (NPCPhysicsMath.dotProduct(this.translation.x, this.translation.y, this.translation.z) > 0.1) {
         this.pitch = PhysicsMath.pitchFromDirection(this.translation.x, this.translation.y, this.translation.z);
      }

      boolean var6 = var3.hasPitch();
      if (!var6) {
         var3.setPitch(this.pitch);
      }

      HeadRotation var7 = var5.getComponent(var1, HeadRotation.getComponentType());
      assert var7 != null;
      Rotation3f var8 = var7.getRotation();
      float var9 = var8.pitch();
      float var10 = var3.getPitch();
      float var11 = MathUtil.clamp(NPCPhysicsMath.turnAngle(var9, var10), -var4, var4);
      var3.setPitch(PhysicsMath.normalizeTurnAngle(var9 + var11));
      if (var6) {
         ModelComponent var12 = var5.getComponent(var1, ModelComponent.getComponentType());
         assert var12 != null;
         float var13 = this.pitch;
         float var14 = MathUtil.wrapAngle(var3.getPitch() - var13);
         CameraSettings var17 = var12.getModel().getCamera();
         float var15;
         float var16;
         if (this.headPitchAngleRange != null) {
            var15 = this.headPitchAngleRange[0];
            var16 = this.headPitchAngleRange[1];
         } else if (var17 != null && var17.getPitch() != null && var17.getPitch().getAngleRange() != null) {
            Rangef var18 = var17.getPitch().getAngleRange();
            var15 = var18.min * (float) (Math.PI / 180.0);
            var16 = var18.max * (float) (Math.PI / 180.0);
         } else {
            var15 = (float) (-Math.PI / 4);
            var16 = (float) (Math.PI / 4);
         }

         if (var14 > var16) {
            var3.setPitch(MathUtil.wrapAngle(var13 + var16));
         } else if (var14 < var15) {
            var3.setPitch(MathUtil.wrapAngle(var13 + var15));
         }
      }
   }

   class="kw">protected void calculateRoll(@Nonnull Steering var1, @Nonnull Steering var2) {
      if (var1.hasRoll()) {
         this.roll = var1.getRoll();
      }

      if (!var2.hasRoll()) {
         var2.setRoll(this.roll);
      }
   }

   class="kw">protected void dampExternalVelocity(@Nonnull Vector3d var1, double var2, double var4, ComponentAccessor<EntityStore> var6) {
      World var7 = var6.getExternalData().getWorld();
      double var8 = 0.0;
      if (this.motionKind != MotionKind.FLYING) {
         if (!this.onGround() && this.motionKind != MotionKind.SWIMMING && this.motionKind != MotionKind.SWIMMING_TURNING) {
            double var10 = Math.sqrt(var1.x * var1.x + var1.z * var1.z);
            var8 = convertToNewRange(
               var10,
               this.movementSettings.airDragMinSpeed,
               this.movementSettings.airDragMaxSpeed,
               this.movementSettings.airDragMin,
               this.movementSettings.airDragMax
            );
         } else {
            var8 = 0.82;
         }
      }

      double var17 = 60.0;
      int var12 = var7.getTps();
      double var13 = 60.0 / var12;
      var8 = Math.pow(var8, var13);
      var1.x *= var8;
      var1.z *= var8;
      float var15 = 0.1F;
      if (Math.abs(var1.x) <= var15) {
         var1.x = 0.0;
      }

      if (Math.abs(var1.y) <= var15) {
         var1.y = 0.0;
      }

      if (Math.abs(var1.z) <= var15) {
         var1.z = 0.0;
      }
   }

   class="kw">private class="kw">static double convertToNewRange(double var0, double var2, double var4, double var6, double var8) {
      if (var6 != var8 && var2 != var4) {
         double var10 = (var0 - var2) * (var8 - var6) / (var4 - var2) + var6;
         class="kw">return MathUtil.clamp(var10, Math.min(var6, var8), Math.max(var6, var8));
      } else {
         class="kw">return var6;
      }
   }

   @Override
   class="kw">public double probeMove(
      @Nonnull Ref<EntityStore> var1,
      @Nonnull Vector3dc var2,
      @Nonnull Vector3dc var3,
      @Nonnull ProbeMoveData var4,
      @Nonnull ComponentAccessor<EntityStore> var5
   ) {
      var4.setPosition(var2).setDirection(var3);
      class="kw">return this.probeMove(var1, var4, var5);
   }

   @Override
   class="kw">public void applyRailStep(
      @Nonnull Ref<EntityStore> var1,
      @Nonnull Role var2,
      @Nonnull Vector3dc var3,
      @Nonnull RailStepConfig var4,
      @Nonnull RailStepResult var5,
      @Nonnull ComponentAccessor<EntityStore> var6
   ) {
      this.readEntityPosition(var1, var6);
      var5.reset();
      this.translation.set(var3);
      if (this.translation.lengthSquared() == 0.0) {
         var5.appliedFraction = 0.0;
      } else {
         this.setMotionKind(MotionKind.MOVING);
         this.railStepAppliedThisTick = true;
         Predicate var7 = this.collisionResult.setBlockCollisionFilter(var4.ignoredBlockFilter);
         boolean var8 = this.collisionResult.isCheckingForCharacterCollisions();
         boolean var9 = this.collisionResult.isRecordingPassThrough();
         List var10 = this.collisionResult.getCollisionEntities();
         if (var4.candidateEntities != null) {
            this.collisionResult.setCollisionEntities(var4.candidateEntities);
            this.collisionResult.enableCharacterCollsions();
         } else {
            this.collisionResult.disableCharacterCollisions();
         }

         this.collisionResult.setRecordPassThrough(var4.ignoredBlockFilter != null);

         try {
            CollisionModule.findCollisions(this.collisionBoundingBox, this.position, this.translation, false, this.collisionResult, var6);
            boolean var11 = this.collisionResult.isSliding;
            double var12 = this.collisionResult.slideEnd;
            Vector3dc var14 = this.getWorldNormal();
            double var15 = 1.0;
            int var17 = this.collisionResult.getBlockCollisionCount();
            double var18 = Math.max(1.0E-6, 0.05 * this.translation.length());

            for (int var20 = 0; var20 < var17; var20++) {
               BlockCollisionData var21 = this.collisionResult.getBlockCollision(var20);
               boolean var22 = var11 && var21.collisionStart <= var12 && var21.collisionNormal.equals(var14);
               if (!var22) {
                  double var23 = this.translation.dot(var21.collisionNormal);
                  if (!(var23 >= -var18)) {
                     double var25 = Math.max(0.0, var21.collisionStart);
                     if (var25 < 0.999999) {
                        var15 = var25;
                        this.isObstructed = true;
                        var5.obstructed = true;
                     }
                     break;
                  }
               }
            }

            if (var4.stopOnEntityHit && this.collisionResult.getCharacterCollisionCount() > 0) {
               CharacterCollisionData var30 = this.collisionResult.getFirstCharacterCollision();
               if (var30 != null) {
                  double var32 = var30.collisionStart;
                  if (var32 < var15) {
                     var15 = Math.max(0.0, var32);
                     var5.hitEntity = true;
                  }
               }
            }

            int var31 = this.collisionResult.getPassThroughCount();

            for (int var33 = 0; var33 < var31; var33++) {
               BlockCollisionData var35 = this.collisionResult.getPassThrough(var33);
               if (var35.collisionStart > var15) {
                  break;
               }

               var5.nextPassThrough().assign(var35.x, var35.y, var35.z, var35.blockId, var35.collisionPoint, var35.collisionNormal, var35.collisionStart);
            }

            int var34 = this.collisionResult.getCharacterCollisionCount();

            for (int var36 = 0; var36 < var34; var36++) {
               CharacterCollisionData var37 = this.collisionResult.getCharacterCollision(var36);
               if (var37.collisionStart > var15) {
                  break;
               }

               var5.nextEntityHit().assign(var37.entityReference, var37.isPlayer, var37.sourcePosition, var37.targetPosition, var37.collisionStart);
            }

            var5.appliedFraction = var15;
            this.position.fma(var15, this.translation);
            if (var4.ignoredBlockFilter != null && !var4.ignoredBlocksFireTriggers) {
               pruneFilteredTriggerBlocks(this.collisionResult);
            }

            this.processTriggers(var1, this.collisionResult, var15, var6);
            this.moveEntity(var1, 0.0, var6);
         } class="kw">finally {
            this.collisionResult.setBlockCollisionFilter(var7);
            if (var8) {
               this.collisionResult.enableCharacterCollsions();
            } else {
               this.collisionResult.disableCharacterCollisions();
            }

            this.collisionResult.setRecordPassThrough(var9);
            this.collisionResult.setCollisionEntities(var10);
         }
      }
   }

   class="kw">protected void postExecuteMove() {
   }

   class="kw">protected void adjustReadPosition(Ref<EntityStore> var1, ComponentAccessor<EntityStore> var2) {
   }

   class="kw">protected void adjustWritePosition(Ref<EntityStore> var1, double var2, @Nonnull ComponentAccessor<EntityStore> var4) {
   }

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

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

   @Override
   class="kw">public NavState getNavState() {
      class="kw">return this.navState;
   }

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

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

   @Override
   class="kw">public void setNavState(NavState var1, double var2, double var4) {
      this.navState = var1;
      this.throttleDuration = var2;
      this.targetDeltaSquared = var4;
   }

   @Override
   class="kw">public boolean isForceRecomputePath() {
      class="kw">return this.recomputePath;
   }

   @Override
   class="kw">public void setForceRecomputePath(boolean var1) {
      this.recomputePath = var1;
   }

   @Override
   class="kw">public void beforeInstructionSensorsAndActions(double var1) {
      this.recomputePath = false;
      this.railStepAppliedThisTick = false;
   }

   @Override
   class="kw">public void beforeInstructionMotion(double var1) {
      this.resetNavState();
   }

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

   @Override
   class="kw">public boolean isForcePushed() {
      class="kw">return !this.externalVelocity.equals(Vector3dUtil.ZERO) || !this.appliedVelocities.isEmpty();
   }

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

   @Nullable
   @Override
   class="kw">public String canSteerFailReason(@Nonnull Ref<EntityStore> var1, @Nonnull ComponentAccessor<EntityStore> var2) {
      if (!this.isAlive(var1, var2)) {
         class="kw">return "DEAD";
      } else {
         class="kw">return this.isForcePushed() ? "EXT_FORCE" : null;
      }
   }

   class="kw">public boolean isMovementBlocked(@Nonnull Ref<EntityStore> var1, @Nonnull ComponentAccessor<EntityStore> var2) {
      InteractionManager var3 = var2.getComponent(var1, InteractionModule.get().getInteractionManagerComponent());
      if (var3 != null) {
         Boolean var4 = var3.forEachInteraction((var0, var1x, var2x) -> {
            if (var2x) {
               class="kw">return Boolean.TRUE;
            }

            MovementEffects var3 = var1x.getEffects().getMovementEffects();
            class="kw">return var3 != null ? var3.isDisableAll() : Boolean.FALSE;
         }, Boolean.FALSE);
         class="kw">return var4;
      } else {
         class="kw">return false;
      }
   }

   class="kw">protected class="kw">abstract double computeMove(
      @Nonnull Ref<EntityStore> var1, @Nonnull Role var2, Steering var3, double var4, Vector3d var6, @Nonnull ComponentAccessor<EntityStore> var7
   );

   class="kw">protected class="kw">abstract double executeMove(
      @Nonnull Ref<EntityStore> var1, @Nonnull Role var2, double var3, Vector3d var5, @Nonnull ComponentAccessor<EntityStore> var6
   );

   class="kw">public <T> double bisect(@Nonnull Vector3d var1, @Nonnull Vector3d var2, @Nonnull T var3, @Nonnull BiPredicate<T, Vector3d> var4, @Nonnull Vector3d var5) {
      class="kw">return this.bisect(var1, var2, var3, var4, 0.05, var5);
   }

   class="kw">public <T> double bisect(
      @Nonnull Vector3d var1, @Nonnull Vector3d var2, @Nonnull T var3, @Nonnull BiPredicate<T, Vector3d> var4, double var5, @Nonnull Vector3d var7
   ) {
      double var8 = 0.0;
      double var10 = 1.0;
      this.bisectValidPosition.set(var1);
      this.bisectInvalidPosition.set(var2);
      var5 *= var5;
      double var14 = 0.1;
      double var16 = 0.9;

      while (this.bisectValidPosition.distanceSquared(this.bisectInvalidPosition) > var5) {
         double var12 = var14 * var8 + var16 * var10;
         var7.x = var14 * this.bisectValidPosition.x + var16 * this.bisectInvalidPosition.x;
         var7.y = var14 * this.bisectValidPosition.y + var16 * this.bisectInvalidPosition.y;
         var7.z = var14 * this.bisectValidPosition.z + var16 * this.bisectInvalidPosition.z;
         if (var4.test(var3, var7)) {
            var8 = var12;
            this.bisectValidPosition.set(var7);
            if (this.shouldDebugMove(this.translation)) {
               LOGGER.at(Level.INFO)
                  .log("eid=%d   Bisect valid: d=[%f %f] w=[%f %f] pos=%s", this.debugEntityId, var8, var10, var14, var16, Vector3dUtil.formatShortString(var7));
            }
         } else {
            var10 = var12;
            this.bisectInvalidPosition.set(var7);
            var14 = 0.5;
            var16 = 0.5;
            if (this.shouldDebugMove(this.translation)) {
               LOGGER.at(Level.INFO)
                  .log(
                     "eid=%d   Bisect invalid: d=[%f %f] w=[%f %f] pos=%s", this.debugEntityId, var8, var10, var14, var16, Vector3dUtil.formatShortString(var7)
                  );
            }
         }
      }

      var7.set(this.bisectValidPosition);
      class="kw">return var8;
   }

   @Nonnull
   @Override
   class="kw">public Vector3d getExternalVelocity() {
      class="kw">return this.externalVelocity;
   }

   @Override
   class="kw">public double getCombinedExternalVelocityLength() {
      double var1 = this.externalVelocity.x;
      double var3 = this.externalVelocity.y;
      double var5 = this.externalVelocity.z;

      for (int var7 = 0; var7 < this.appliedVelocities.size(); var7++) {
         Vector3d var8 = this.appliedVelocities.get(var7).velocity;
         var1 += var8.x;
         var3 += var8.y;
         var5 += var8.z;
      }

      class="kw">return Math.sqrt(var1 * var1 + var3 * var3 + var5 * var5);
   }

   @Override
   class="kw">public void clearExternalForces() {
      this.externalVelocity.zero();
      this.appliedVelocity.zero();
      this.appliedVelocities.clear();
      this.ignoreDamping = false;
   }

   @Override
   class="kw">public void addVelocity(@Nonnull Vector3d var1, VelocityConfig var2) {
      double var3 = this.knockbackScale;
      if (!SplitVelocity.SHOULD_MODIFY_VELOCITY && var2 != null) {
         this.appliedVelocities.add(new MotionControllerBase.AppliedVelocity(new Vector3d(var1.x * var3, var1.y * var3, var1.z * var3), var2));
      } else {
         double var5 = 0.18000000000000005 * this.movementSettings.velocityResistance;
         this.externalVelocity.add(var1.x * var3 * var5, var1.y * var3, var1.z * var3 * var5);
         this.appliedVelocity.set(this.externalVelocity);
         this.ignoreDamping = false;
      }
   }

   @Override
   class="kw">public void setVelocity(@Nonnull Vector3dc var1, @Nullable VelocityConfig var2, boolean var3) {
      if (!SplitVelocity.SHOULD_MODIFY_VELOCITY && var2 != null) {
         this.appliedVelocities.clear();
         this.appliedVelocities.add(new MotionControllerBase.AppliedVelocity(new Vector3d(var1), var2));
      } else {
         this.externalVelocity.set(var1);
         this.ignoreDamping = var3;
      }
   }

   class="kw">public void clearExternalVelocity() {
      this.externalVelocity.zero();
   }

   class="kw">protected void dumpCollisionResults() {
      String var1 = "";
      if (this.collisionResult.isSliding) {
         var1 = String.format("SLIDE: start/end=%f/%f", this.collisionResult.slideStart, this.collisionResult.slideEnd);
      }

      LOGGER.at(Level.INFO)
         .log(
            "eid=%d CollRes: pos=%s yaw=%f count=%d %s",
            this.debugEntityId,
            Vector3dUtil.formatShortString(this.position),
            (180.0F / (float)Math.PI) * this.yaw,
            this.collisionResult.getBlockCollisionCount(),
            var1
         );
      if (this.collisionResult.getBlockCollisionCount() > 0) {
         for (int var2 = 0; var2 < this.collisionResult.getBlockCollisionCount(); var2++) {
            BlockCollisionData var3 = this.collisionResult.getBlockCollision(var2);
            String var4 = var3.blockMaterial != null ? var3.blockMaterial.name() : "none";
            String var5 = var3.blockType != null ? var3.blockType.getId() : "none";
            String var6 = var3.blockType != null ? var3.blockType.getHitboxType() : "none";
            String var7;
            if (var3.blockType != null) {
               RotationTuple var8 = RotationTuple.get(var3.rotation);
               var7 = var8.yaw() + " " + var8.pitch();
            } else {
               var7 = "none";
            }

            LOGGER.at(Level.INFO)
               .log(
                  "eid=%d    COLL: blk=%s/%s/%s start=%f norm=%s pos=%s mat=%s block=%s hitbox=%s rot=%s",
                  this.debugEntityId,
                  var3.x,
                  var3.y,
                  var3.z,
                  var3.collisionStart,
                  Vector3dUtil.formatShortString(var3.collisionNormal),
                  Vector3dUtil.formatShortString(var3.collisionPoint),
                  var4,
                  var5,
                  var6,
                  new Object[]{var7}
               );
         }
      }
   }

   class="kw">public void setEnableTriggers(boolean var1) {
      this.enableTriggers = var1;
   }

   class="kw">public void setEnableBlockDamage(boolean var1) {
      this.enableBlockDamage = var1;
   }

   @Override
   class="kw">public boolean willReceiveBlockDamage() {
      class="kw">return this.isReceivingBlockDamage;
   }

   @Override
   class="kw">public boolean isAvoidingBlockDamage() {
      class="kw">return !this.relaxedConstraints.contains(RelaxedConstraint.DAMAGE);
   }

   class="kw">protected void applyRuntimeRelaxedConstraints(boolean var1) {
      if (this.isReceivingBlockDamage) {
         this.relaxedConstraints.add(RelaxedConstraint.DAMAGE);
      }

      if (var1) {
         this.relaxedConstraints.add(RelaxedConstraint.BREATHE);
         this.relaxedConstraints.add(RelaxedConstraint.WADE);
      }
   }

   class="kw">public void processTriggers(@Nonnull Ref<EntityStore> var1, @Nonnull CollisionResult var2, double var3, @Nonnull ComponentAccessor<EntityStore> var5) {
      this.processTriggersHasMoved = false;
      this.isReceivingBlockDamage = false;
      if (this.enableTriggers || this.enableBlockDamage) {
         var2.pruneTriggerBlocks(var3);
         int var6 = var2.getTriggerBlocks().size();
         if (var6 != 0) {
            if (this.enableTriggers) {
               this.beforeTriggerExternalVelocity.set(this.getExternalVelocity());
               this.beforeTriggerPosition.set(this.position);
            }

            this.moveEntity(var1, 0.0, var5);
            InteractionManager var7 = var5.getComponent(var1, InteractionModule.get().getInteractionManagerComponent());
            assert var7 != null;
            int var8 = var2.defaultTriggerBlocksProcessing(var7, this.entity, var1, this.enableTriggers, var5);
            if (this.enableBlockDamage && var8 > 0) {
               Damage var9 = new Damage(Damage.NULL_SOURCE, DamageCause.ENVIRONMENT, var8);
               DamageSystems.executeDamage(var1, var5, var9);
               this.isReceivingBlockDamage = true;
            }

            this.readEntityPosition(var1, var5);
            if (this.enableTriggers) {
               this.processTriggersHasMoved = !this.beforeTriggerExternalVelocity.equals(this.getExternalVelocity())
                  || !this.beforeTriggerPosition.equals(this.position);
            }
         }
      }
   }

   class="kw">private class="kw">static void pruneFilteredTriggerBlocks(@Nonnull CollisionResult var0) {
      CollisionDataArray var1 = var0.getTriggerBlocks();

      for (int var2 = var1.size() - 1; var2 >= 0; var2--) {
         if (var1.get(var2).filteredByCollisionFilter) {
            var1.remove(var2);
         }
      }
   }

   class="kw">public boolean isProcessTriggersHasMoved() {
      class="kw">return this.processTriggersHasMoved;
   }

   class="kw">protected boolean isAlive(@Nonnull Ref<EntityStore> var1, @Nonnull ComponentAccessor<EntityStore> var2) {
      class="kw">return !var2.getArchetype(var1).contains(DeathComponent.getComponentType());
   }

   @Override
   class="kw">public void onDebugFlagsChanged(EnumSet<RoleDebugFlags> var1) {
      MotionController.super.onDebugFlagsChanged(var1);
      this.debugModeSteer = var1.contains(RoleDebugFlags.MotionControllerSteer);
      this.debugModeMove = var1.contains(RoleDebugFlags.MotionControllerMove);
      this.debugModeMoveSkipIdle = var1.contains(RoleDebugFlags.MotionControllerMoveSkipIdle);
      this.debugModeCollisions = var1.contains(RoleDebugFlags.Collisions);
      this.debugModeBlockCollisions = var1.contains(RoleDebugFlags.BlockCollisions);
      this.debugModeProbeBlockCollisions = var1.contains(RoleDebugFlags.ProbeBlockCollisions);
      this.debugModeValidatePositions = var1.contains(RoleDebugFlags.ValidatePositions);
      this.debugModeOverlaps = var1.contains(RoleDebugFlags.Overlaps);
      this.debugModeNonOverlaps = var1.contains(RoleDebugFlags.NonOverlaps);
      this.debugModeValidateMath = var1.contains(RoleDebugFlags.ValidateMath);
   }

   class="kw">protected boolean shouldDebugMove(@Nonnull Vector3d var1) {
      class="kw">return this.debugModeMove && (!this.debugModeMoveSkipIdle || !CollisionModule.isBelowMovementThreshold(var1));
   }

   @Override
   class="kw">public void activate() {
      this.resetObstructedFlags();
      this.resetNavState();
   }

   class="kw">public void resetNavState() {
      this.navState = NavState.AT_GOAL;
      this.throttleDuration = 0.0;
      this.targetDeltaSquared = 0.0;
   }

   class="kw">public void resetObstructedFlags() {
      this.isObstructed = false;
   }

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

   class="kw">public double getEpsilonSpeed() {
      class="kw">return this.epsilonSpeed;
   }

   class="kw">public float getEpsilonAngle() {
      class="kw">return this.epsilonAngle;
   }

   @Nonnull
   @Override
   class="kw">public Vector3d getComponentSelector() {
      class="kw">return this.componentSelector;
   }

   @Nonnull
   @Override
   class="kw">public Vector3d getPlanarComponentSelector() {
      class="kw">return this.planarComponentSelector;
   }

   @Override
   class="kw">public void setComponentSelector(@Nonnull Vector3d var1) {
      this.componentSelector.set(var1);
   }

   @Override
   class="kw">public Vector3dc getWorldNormal() {
      class="kw">return this.worldNormal;
   }

   @Override
   class="kw">public Vector3dc getWorldAntiNormal() {
      class="kw">return this.worldAntiNormal;
   }

   @Override
   class="kw">public double waypointDistance(@Nonnull Vector3dc var1, @Nonnull Vector3dc var2) {
      class="kw">return Math.sqrt(this.waypointDistanceSquared(var1, var2));
   }

   @Override
   class="kw">public double waypointDistanceSquared(@Nonnull Vector3dc var1, @Nonnull Vector3dc var2) {
      double var3 = (var1.x() - var2.x()) * this.getComponentSelector().x;
      double var5 = (var1.y() - var2.y()) * this.getComponentSelector().y;
      double var7 = (var1.z() - var2.z()) * this.getComponentSelector().z;
      class="kw">return var3 * var3 + var5 * var5 + var7 * var7;
   }

   @Override
   class="kw">public double waypointDistance(@Nonnull Ref<EntityStore> var1, @Nonnull Vector3d var2, @Nonnull ComponentAccessor<EntityStore> var3) {
      class="kw">return Math.sqrt(this.waypointDistanceSquared(var1, var2, var3));
   }

   @Override
   class="kw">public double waypointDistanceSquared(@Nonnull Ref<EntityStore> var1, @Nonnull Vector3d var2, @Nonnull ComponentAccessor<EntityStore> var3) {
      TransformComponent var4 = var3.getComponent(var1, TransformComponent.getComponentType());
      assert var4 != null;
      Vector3d var5 = var4.getPosition();
      double var6 = (var2.x - var5.x()) * this.getComponentSelector().x;
      double var8 = (var2.y - var5.y()) * this.getComponentSelector().y;
      double var10 = (var2.z - var5.z()) * this.getComponentSelector().z;
      class="kw">return var6 * var6 + var8 * var8 + var10 * var10;
   }

   @Override
   class="kw">public boolean isValidPosition(@Nonnull Vector3dc var1, @Nonnull ComponentAccessor<EntityStore> var2) {
      class="kw">return this.isValidPosition(var1, this.collisionResult, var2);
   }

   class="kw">public boolean isValidPosition(@Nonnull Vector3dc var1, @Nonnull CollisionResult var2, @Nonnull ComponentAccessor<EntityStore> var3) {
      World var4 = var3.getExternalData().getWorld();
      var2.setDebugEntityId(this.debugEntityId);
      CollisionModule var5 = CollisionModule.get();
      CollisionModuleConfig var6 = var5.getConfig();
      boolean var7 = var6.isDumpInvalidBlocks();
      boolean var8 = var6.isDumpNonOverlappingBlocks();
      var6.setDumpInvalidBlocks(this.debugModeOverlaps);
      var6.setDumpNonOverlappingBlocks(this.debugModeNonOverlaps);
      boolean var9 = var5.validatePosition(
            var4,
            this.collisionBoundingBox,
            var1,
            this.getInvalidOverlapMaterials(),
            null,
            (var0, var1x, var2x, var3x) -> var3x.blockId != Integer.MIN_VALUE,
            var2
         )
         != -1;
      var6.setDumpInvalidBlocks(var7);
      var6.setDumpNonOverlappingBlocks(var8);
      class="kw">return var9;
   }

   class="kw">public int getInvalidOverlapMaterials() {
      class="kw">return 4;
   }

   class="kw">protected void saveMotionKind() {
      this.previousMotionKind = this.getMotionKind();
   }

   class="kw">protected boolean switchedToMotionKind(MotionKind var1) {
      class="kw">return this.getMotionKind() == var1 && this.previousMotionKind != var1;
   }

   class="kw">public MotionKind getMotionKind() {
      class="kw">return this.motionKind;
   }

   class="kw">public void setMotionKind(MotionKind var1) {
      this.motionKind = var1;
   }

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

   class="kw">public void setGravity(double var1) {
      this.gravity = var1;
   }

   @Override
   class="kw">public boolean translateToAccessiblePosition(Vector3d var1, Box var2, double var3, double var5, ComponentAccessor<EntityStore> var7) {
      class="kw">return true;
   }

   @Nonnull
   @Override
   class="kw">public Box getCollisionBoundingBox() {
      class="kw">return this.collisionBoundingBox;
   }

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

   @Override
   class="kw">public void requirePreciseMovement(@Nullable Vector3d var1) {
      this.requiresPreciseMovement = true;
      this.havePreciseMovementTarget = var1 != null;
      if (this.havePreciseMovementTarget) {
         this.preciseMovementTarget.set(var1);
      }
   }

   class="kw">public void clearRequirePreciseMovement() {
      this.requiresPreciseMovement = false;
      this.havePreciseMovementTarget = false;
   }

   class="kw">public boolean isRequiresPreciseMovement() {
      class="kw">return this.requiresPreciseMovement;
   }

   @Override
   class="kw">public void enableHeadingBlending(double var1, @Nullable Vector3d var3, double var4) {
      this.isBlendingHeading = true;
      this.blendHeading = var1;
      this.haveBlendHeadingPosition = var3 != null;
      if (this.haveBlendHeadingPosition) {
         this.blendHeadingPosition.set(var3);
      }

      this.blendLevelAtTargetPosition = var4;
   }

   @Override
   class="kw">public void enableHeadingBlending() {
      this.enableHeadingBlending(Double.NaN, null, 0.0);
   }

   class="kw">public void clearBlendHeading() {
      this.isBlendingHeading = false;
      this.haveBlendHeadingPosition = false;
   }

   @Override
   class="kw">public void setRelaxedMoveConstraints(@Nonnull EnumSet<RelaxedConstraint> var1) {
      this.relaxedConstraints.clear();
      this.relaxedConstraints.addAll(var1);
   }

   @Nonnull
   @Override
   class="kw">public EnumSet<RelaxedConstraint> getRelaxedConstraints() {
      class="kw">return this.relaxedConstraints;
   }

   @Override
   class="kw">public void updatePhysicsValues(PhysicsValues var1) {
      this.movementSettings = MovementManager.MASTER_DEFAULT.apply(var1, GameMode.Adventure);
   }

   class="kw">protected class="kw">static class AppliedVelocity {
      class="kw">public class="kw">final Vector3d velocity;
      class="kw">public class="kw">final VelocityConfig config;
      class="kw">public boolean canClear;

      class="kw">public AppliedVelocity(Vector3d var1, VelocityConfig var2) {
         this.velocity = var1;
         this.config = var2;
      }
   }
}