MotionControllerBase class

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

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

implements: MotionController

Поля (192)

МодификаторыТипИмя
final double FORCE_SCALE
break
break
break
break
break
break
break
break
break
break
public boolean canClear
public final VelocityConfig config
double var1
String var1
var1
CollisionDataArray var1
int var10
double var10
var10
boolean var10
Rotation3f var10
float var10
double var10
double var10
List var10
double var10
var10
double var10
int var11
NPCEntity var11
float var11
float var11
float var11
boolean var11
int var12
double var12
float var12
float var12
ModelComponent var12
int var12
double var12
double var12
HeadRotation var13
float var13
float var13
double var13
double var14
Rotation3f var14
float var14
float var14
Vector3dc var14
double var14
var14
double var15
float var15
var15
var15
float var15
var15
var15
var15
float var15
double var15
var15
var15
double var16
float var16
var16
var16
float var16
var16
var16
var16
double var16
var16
int var17
CameraSettings var17
CameraSettings var17
double var17
int var17
double var18
double var18
Rangef var18
Rangef var18
double var18
float var19
boolean var20
float var20
boolean var21
BlockCollisionData var21
boolean var22
MotionControllerBase.AppliedVelocity var23
double var23
float var24
var24
var24
yield var24
yield var24
float var25
var25
var25
double var25
float var26
var26
float var27
float var28
double var29
NPCEntity var3
TransformComponent var3
World var3
InteractionManager var3
MovementEffects var3
double var3
double var3
BlockCollisionData var3
double var3
CharacterCollisionData var30
int var31
double var32
double var32
float var33
int var34
BlockCollisionData var35
CharacterCollisionData var37
Rotation3f var4
ChunkStore var4
NPCEntity var4
Boolean var4
String var4
TransformComponent var4
World var4
TransformComponent var5
long var5
TransformComponent var5
double var5
double var5
String var5
double var5
Vector3d var5
CollisionModule var5
Rotation3f var6
boolean var6
Rotation3f var6
boolean var6
String var6
int var6
double var6
CollisionModuleConfig var6
Ref var7
double var7
var7
boolean var7
float var7
HeadRotation var7
World var7
Predicate var7
String var7
var7
var7
InteractionManager var7
double var7
boolean var7
WorldChunk var8
double var8
var8
World var8
HeadRotation var8
float var8
Rotation3f var8
double var8
var8
var8
var8
boolean var8
double var8
var8
Vector3d var8
RotationTuple var8
int var8
double var8
boolean var8
int var9
NPCEntity var9
NPCEntity var9
ModelComponent var9
float var9
float var9
boolean var9
Damage var9
boolean var9
public final Vector3d velocity

Методы (109)

МодификаторыВозвратСигнатура
public AppliedVelocitypublic AppliedVelocity(Vector3d var1, VelocityConfig var2)
protected void adjustReadPositionvoid adjustReadPosition(Ref<EntityStore> var1, ComponentAccessor<EntityStore> var2)
protected void adjustWritePositionvoid adjustWritePosition(Ref<EntityStore> var1, double var2, @Nonnull ComponentAccessor<EntityStore> var4)
protected void applyRuntimeRelaxedConstraintsvoid applyRuntimeRelaxedConstraints(boolean var1)
public <T> double bisect<T> double bisect(@Nonnull Vector3d var1, @Nonnull Vector3d var2, @Nonnull T var3, @Nonnull BiPredicate<T, Vector3d> var4, @Nonnull Vector3d var5)
public <T> double bisect<T> double bisect(@Nonnull Vector3d var1, @Nonnull Vector3d var2, @Nonnull T var3, @Nonnull BiPredicate<T, Vector3d> var4, double var5, @Nonnull Vector3d var7)
protected float blendBodyYawfloat blendBodyYaw(@Nonnull Ref<EntityStore> var1, float var2, float var3, @Nonnull ComponentAccessor<EntityStore> var4)
protected void calculatePitchvoid calculatePitch(@Nonnull Ref<EntityStore> var1, @Nonnull Steering var2, @Nonnull Steering var3, float var4, @Nonnull ComponentAccessor<EntityStore> var5)
protected void calculateRollvoid calculateRoll(@Nonnull Steering var1, @Nonnull Steering var2)
protected void calculateYawvoid calculateYaw(@Nonnull Ref<EntityStore> var1, @Nonnull Steering var2, @Nonnull Steering var3, float var4, float var5, @Nonnull ComponentAccessor<EntityStore> var6)
public void clearBlendHeadingvoid clearBlendHeading()
public void clearExternalVelocityvoid clearExternalVelocity()
public void clearRequirePreciseMovementvoid clearRequirePreciseMovement()
abstract abstract double computeMovedouble computeMove(@Nonnull Ref<EntityStore> var1, @Nonnull Role var2, Steering var3, double var4, Vector3d var6, @Nonnull ComponentAccessor<EntityStore> var7)
static double convertToNewRangedouble convertToNewRange(double var0, double var2, double var4, double var6, double var8)
protected void dampExternalVelocityvoid dampExternalVelocity(@Nonnull Vector3d var1, double var2, double var4, ComponentAccessor<EntityStore> var6)
protected void dumpCollisionResultsvoid dumpCollisionResults()
abstract abstract double executeMovedouble executeMove(@Nonnull Ref<EntityStore> var1, @Nonnull Role var2, double var3, Vector3d var5, @Nonnull ComponentAccessor<EntityStore> var6)
for for(int var20 = 0; var20 < var17; var20++)
for for(int var33 = 0; var33 < var31; var33++)
for for(int var36 = 0; var36 < var34; var36++)
abstract for for(int var22 = 0; var22 < this.appliedVelocities.size()
abstract for for(int var7 = 0; var7 < this.appliedVelocities.size()
abstract for for(int var2 = 0; var2 < this.collisionResult.getBlockCollisionCount()
public float getEpsilonAnglefloat getEpsilonAngle()
public double getEpsilonSpeeddouble getEpsilonSpeed()
public int getInvalidOverlapMaterialsint getInvalidOverlapMaterials()
public MotionKind getMotionKindMotionKind getMotionKind()
public float getPitchfloat getPitch()
public float getRollfloat getRoll()
public float getYawfloat getYaw()
if if(var1 == null)
if if(this.motionKind != this.lastMovementStateUpdatedMotionKind || var6 != this.fastMotionKind || var2.idle != this.idleMotionKind || var2.horizontalIdle != this.horizontalIdleKind)
if if(this.railStepAppliedThisTick)
if if(this.debugModeSteer)
if if(this.debugModeValidateMath)
if if(var21)
if if(var25 >= 0.0F)
if if(var20)
if if(!var7)
if if(var7)
if if(var14 > var16)
if if(!var6)
if if(var6)
if if(this.headPitchAngleRange != null)
if if(var14 > var16)
if if(this.motionKind != MotionKind.FLYING)
if if(var6 != var8 && var2 != var4)
if if(var4.candidateEntities != null)
if if(!var22)
if if(var25 < 0.999999)
if if(var30 != null)
if if(var32 < var15)
if if(var35.collisionStart > var15)
if if(var37.collisionStart > var15)
if if(var4.ignoredBlockFilter != null && !var4.ignoredBlocksFireTriggers)
if if(var8)
if if(var3 != null)
if if(var2x)
if if(!SplitVelocity.SHOULD_MODIFY_VELOCITY && var2 != null)
if if(!SplitVelocity.SHOULD_MODIFY_VELOCITY && var2 != null)
if if(this.collisionResult.isSliding)
if if(var3.blockType != null)
if if(this.isReceivingBlockDamage)
if if(var1)
if if(this.enableTriggers || this.enableBlockDamage)
if if(var6 != 0)
if if(this.enableTriggers)
if if(this.enableBlockDamage && var8 > 0)
if if(this.enableTriggers)
if if(this.havePreciseMovementTarget)
if if(this.haveBlendHeadingPosition)
protected boolean isAliveboolean isAlive(@Nonnull Ref<EntityStore> var1, @Nonnull ComponentAccessor<EntityStore> var2)
abstract abstract boolean isFastMotionKindboolean isFastMotionKind(double var1)
public boolean isHorizontalIdleboolean isHorizontalIdle(double var1)
public boolean isMovementBlockedboolean isMovementBlocked(@Nonnull Ref<EntityStore> var1, @Nonnull ComponentAccessor<EntityStore> var2)
public boolean isProcessTriggersHasMovedboolean isProcessTriggersHasMoved()
public boolean isRequiresPreciseMovementboolean isRequiresPreciseMovement()
public boolean isValidPositionboolean isValidPosition(@Nonnull Vector3dc var1, @Nonnull CollisionResult var2, @Nonnull ComponentAccessor<EntityStore> var3)
public void moveEntityvoid moveEntity(@Nonnull Ref<EntityStore> var1, double var2, @Nonnull ComponentAccessor<EntityStore> var4)
protected void postExecuteMovevoid postExecuteMove()
public void postReadPositionvoid postReadPosition(Ref<EntityStore> var1, ComponentAccessor<EntityStore> var2)
public void processTriggersvoid processTriggers(@Nonnull Ref<EntityStore> var1, @Nonnull CollisionResult var2, double var3, @Nonnull ComponentAccessor<EntityStore> var5)
static void pruneFilteredTriggerBlocksvoid pruneFilteredTriggerBlocks(@Nonnull CollisionResult var0)
abstract pruneFilteredTriggerBlocks pruneFilteredTriggerBlocks(this.collisionResult)
protected void readEntityPositionvoid readEntityPosition(@Nonnull Ref<EntityStore> var1, @Nonnull ComponentAccessor<EntityStore> var2)
public void resetNavStatevoid resetNavState()
public void resetObstructedFlagsvoid resetObstructedFlags()
protected void saveMotionKindvoid saveMotionKind()
public void setEnableBlockDamagevoid setEnableBlockDamage(boolean var1)
public void setEnableTriggersvoid setEnableTriggers(boolean var1)
public void setGravityvoid setGravity(double var1)
public void setMotionKindvoid setMotionKind(MotionKind var1)
protected boolean shouldAlwaysUseGroundResistanceboolean shouldAlwaysUseGroundResistance()
protected boolean shouldDampenAppliedVelocitiesYboolean shouldDampenAppliedVelocitiesY()
protected boolean shouldDebugMoveboolean shouldDebugMove(@Nonnull Vector3d var1)
public double steer0double steer0(@Nonnull Ref<EntityStore> var1, @Nonnull Role var2, @Nonnull Steering var3, @Nonnull Steering var4, double var5, @Nonnull ComponentAccessor<EntityStore> var7)
switch switch(this.motionKind)
protected boolean switchedToMotionKindboolean switchedToMotionKind(MotionKind var1)
public boolean touchesWaterboolean touchesWater(boolean var1, @Nonnull ComponentAccessor<EntityStore> var2)
protected void updateAscendingStatesvoid updateAscendingStates(@Nonnull Ref<EntityStore> var1, @Nonnull MovementStates var2, boolean var3, boolean var4, @Nonnull ComponentAccessor<EntityStore> var5)
protected void updateDescendingStatesvoid updateDescendingStates(@Nonnull Ref<EntityStore> var1, @Nonnull MovementStates var2, boolean var3, boolean var4, @Nonnull ComponentAccessor<EntityStore> var5)
protected void updateDroppingStatesvoid updateDroppingStates(@Nonnull MovementStates var1)
protected void updateFlyingStatesvoid updateFlyingStates(@Nonnull MovementStates var1, boolean var2, boolean var3)
static void updateMovingStatesvoid updateMovingStates(@Nonnull Ref<EntityStore> var0, @Nonnull MovementStates var1, boolean var2, @Nonnull ComponentAccessor<EntityStore> var3)
abstract updateMovingStates updateMovingStates(var1, var2, this.fastMotionKind, var5)
abstract updateMovingStates updateMovingStates(var1, var2, var3, var5)
protected void updateStandingStatesvoid updateStandingStates(@Nonnull MovementStates var1, @Nonnull MotionKind var2, boolean var3)
protected void updateSwimmingStatesvoid updateSwimmingStates(@Nonnull MovementStates var1, boolean var2, boolean var3, boolean 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.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;
      }
   }
}