BodyMotionWanderBase class

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

Файл: com/hypixel/hytale/server/npc/corecomponents/movement/BodyMotionWanderBase.java

extends: BodyMotionBase

Поля (52)

МодификаторыТипИмя
final HytaleLogger LOGGER
SEARCHING, TURNING, WALKING, STOPPED
break
break
break
String var10
double var10
boolean var11
double var11
double var11
TransformComponent var12
double var12
Rotation3f var13
double var13
int var14
double var14
double var15
double var16
double var17
float var19
ThreadLocalRandom var19
float var20
double var21
boolean var3
int var3
var3
boolean var4
NPCEntity var4
double var4
var4
double var4
TransformComponent var4
EnumSet var5
float var5
int var5
boolean var6
double var6
double var6
var6
MotionController var6
TransformComponent var6
float var7
int var8
var8
var8
var8
NPCEntity var8
double var8
MotionController.VerticalRange var8
double var8
MotionController var9
double var9

Методы (47)

МодификаторыВозвратСигнатура
State State()
private int addPreOrderedDirectionint addPreOrderedDirection(int var1, int var2)
abstract applyEscapeConstraints applyEscapeConstraints(var2, this.probeMoveData)
protected void computeHeightRangevoid computeHeightRange(@Nonnull Ref<EntityStore> var1, @Nonnull MotionController var2, @Nonnull ComponentAccessor<EntityStore> var3)
private void computeTargetPositionvoid computeTargetPosition(@Nonnull Ref<EntityStore> var1, float var2, double var3, @Nonnull ComponentAccessor<EntityStore> var5)
abstract abstract double constrainMovedouble constrainMove(@Nonnull Ref<EntityStore> var1, @Nonnull ExecutionSupport var2, @Nonnull Vector3d var3, @Nonnull Vector3d var4, double var5, @Nonnull ComponentAccessor<EntityStore> var7)
protected boolean findBestDirectionboolean findBestDirection(@Nonnull Ref<EntityStore> var1, @Nonnull ComponentAccessor<EntityStore> var2)
for for(int var7 = this.minDirection; var7 <= this.maxDirection; var7++)
for for(int var9 = 0; var9 < this.minDirection; var9++)
for for(int var10 = this.maxDirection + 1; var10 <= 16; var10++)
for for(int var10 = 0; var10 < this.directionIndex; var10++)
for for(int var20 = 0; var20 < this.directionIndex; var20++)
if if(this.debugSteer)
if if(this.debugSteer)
if if(var19 == 0.0F)
if if(this.state == BodyMotionWanderBase.State.STOPPED)
if if(this.state == BodyMotionWanderBase.State.SEARCHING && this.directionIndex == 0)
if if(this.state == BodyMotionWanderBase.State.WALKING)
if if(this.debugSteer)
if if(this.state == BodyMotionWanderBase.State.SEARCHING)
if if(this.directionIndex == 32 || !this.relaxHeadingChange && this.directionIndex == this.insideConeCount)
if if(++var14 >= this.testsPerTick)
if if(this.debugSteer)
if if(this.state == BodyMotionWanderBase.State.TURNING)
if if(this.debugSteer)
if if(this.debugSteer)
if if(this.state == BodyMotionWanderBase.State.WALKING)
if if(this.debugSteer)
if if(var11 > 0.0)
if if(var6 > 0.0)
if if(var12 > var4)
if if(var14 <= 0.5)
if if(var3 == -1)
if if(var1 != null && var4 != null)
if if(this.insideConeCount < 31)
if if(var6 != 0.0)
if if(var8 < 1.0E-5)
if if(var8 < this.desiredWalkDistance)
if if(var10 < 1.0E-5)
if if(var10 < this.desiredWalkDistance)
if if(var10 < var8)
if if(var1 != 0 && var1 != 16)
protected boolean probeDirectionboolean probeDirection(@Nonnull Ref<EntityStore> var1, int var2, @Nonnull ExecutionSupport var3, @Nonnull ComponentAccessor<EntityStore> var4)
protected void restartSearchvoid restartSearch(@Nullable Ref<EntityStore> var1, @Nonnull NPCEntity var2, @Nonnull MotionController var3, @Nullable ComponentAccessor<EntityStore> var4)
abstract super super(var1)
protected float toAnglefloat toAngle(@Nonnull Ref<EntityStore> var1, int var2, @Nonnull ComponentAccessor<EntityStore> var3)
while while(true)

Исходный код

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

class="kw">import com.hypixel.hytale.common.util.ArrayUtil;
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.random.RandomExtra;
class="kw">import com.hypixel.hytale.math.util.MathUtil;
class="kw">import com.hypixel.hytale.math.vector.Rotation3f;
class="kw">import com.hypixel.hytale.server.core.entity.nameplate.Nameplate;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.TransformComponent;
class="kw">import com.hypixel.hytale.server.core.modules.physics.util.PhysicsMath;
class="kw">import com.hypixel.hytale.server.core.universe.world.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.corecomponents.BodyMotionBase;
class="kw">import com.hypixel.hytale.server.npc.corecomponents.movement.builders.BuilderBodyMotionWanderBase;
class="kw">import com.hypixel.hytale.server.npc.entities.NPCEntity;
class="kw">import com.hypixel.hytale.server.npc.instructions.ExecutionSupport;
class="kw">import com.hypixel.hytale.server.npc.movement.Steering;
class="kw">import com.hypixel.hytale.server.npc.movement.constraints.RelaxedConstraint;
class="kw">import com.hypixel.hytale.server.npc.movement.controllers.MotionController;
class="kw">import com.hypixel.hytale.server.npc.movement.controllers.ProbeMoveData;
class="kw">import com.hypixel.hytale.server.npc.movement.steeringforces.SteeringForcePursue;
class="kw">import com.hypixel.hytale.server.npc.role.RoleDebugFlags;
class="kw">import com.hypixel.hytale.server.npc.sensorinfo.InfoProvider;
class="kw">import com.hypixel.hytale.server.npc.util.NPCPhysicsMath;
class="kw">import java.util.Arrays;
class="kw">import java.util.EnumSet;
class="kw">import java.util.concurrent.ThreadLocalRandom;
class="kw">import java.util.logging.Level;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">import org.joml.Vector3d;

class="kw">public class="kw">abstract class BodyMotionWanderBase class="kw">extends BodyMotionBase {
   class="kw">public class="kw">static class="kw">final HytaleLogger LOGGER = NPCPlugin.get().getLogger();
   class="kw">public class="kw">static class="kw">final int DIRECTION_COUNT = 32;
   class="kw">public class="kw">static class="kw">final float SEGMENT_ANGLE = (float) (Math.PI / 16);
   class="kw">public class="kw">static class="kw">final double MIN_DISTANCE_SHRINK = 0.3;
   class="kw">public class="kw">static class="kw">final double MIN_DISTANCE_SHRINK_SCALE = -1.4;
   class="kw">protected class="kw">final double minWalkTime;
   class="kw">protected class="kw">final double maxWalkTime;
   class="kw">protected class="kw">final float minHeadingChange;
   class="kw">protected class="kw">final float maxHeadingChange;
   class="kw">protected class="kw">final byte minDirection;
   class="kw">protected class="kw">final byte maxDirection;
   class="kw">protected class="kw">final boolean relaxHeadingChange;
   class="kw">protected class="kw">final double relativeSpeed;
   class="kw">protected class="kw">final double minMoveDistance;
   class="kw">protected class="kw">final double stopDistance;
   class="kw">protected class="kw">final int testsPerTick;
   class="kw">protected class="kw">final double desiredAltitudeWeight;
   class="kw">protected class="kw">final byte[] preOrderedDirections = new byte[32];
   class="kw">protected class="kw">final int insideConeCount;
   class="kw">protected class="kw">final Vector3d targetPosition = new Vector3d();
   class="kw">protected class="kw">final Vector3d probeDirection = new Vector3d();
   class="kw">protected class="kw">final Vector3d probePosition = new Vector3d();
   class="kw">protected class="kw">final SteeringForcePursue seekTarget = new SteeringForcePursue();
   class="kw">protected class="kw">final ProbeMoveData probeMoveData = new ProbeMoveData();
   class="kw">protected boolean debugSteer;
   class="kw">protected BodyMotionWanderBase.State state;
   class="kw">protected float angleOffset;
   class="kw">protected double probeDY;
   class="kw">protected double maxDistanceAbove;
   class="kw">protected double maxDistanceBelow;
   class="kw">protected double walkTime;
   class="kw">protected float walkHeading;
   class="kw">protected double walkDistance;
   class="kw">protected int directionIndex;
   class="kw">protected double desiredWalkDistance;
   class="kw">protected boolean searchUsesEscapeConstraints;
   @Nonnull
   class="kw">protected class="kw">final EnumSet<RelaxedConstraint> cachedEffectiveConstraints;
   class="kw">protected class="kw">final double[] walkDistances = new double[32];
   class="kw">protected class="kw">final byte[] walkDirections = new byte[32];

   class="kw">public BodyMotionWanderBase(@Nonnull BuilderBodyMotionWanderBase var1, @Nonnull BuilderSupport var2) {
      super(var1);
      this.minWalkTime = var1.getMinWalkTime(var2);
      this.maxWalkTime = var1.getMaxWalkTime(var2);
      this.minHeadingChange = (float) (Math.PI / 180.0) * var1.getMinHeadingChange(var2);
      this.maxHeadingChange = (float) (Math.PI / 180.0) * var1.getMaxHeadingChange(var2);
      this.relaxHeadingChange = var1.isRelaxHeadingChange(var2);
      this.minDirection = (byte)MathUtil.fastFloor(this.minHeadingChange / (float) (Math.PI / 16));
      this.maxDirection = (byte)MathUtil.fastCeil(this.maxHeadingChange / (float) (Math.PI / 16));
      this.relativeSpeed = var1.getRelativeSpeed(var2);
      this.minMoveDistance = var1.getMinMoveDistance(var2);
      this.stopDistance = var1.getStopDistance(var2);
      this.testsPerTick = var1.getTestsPerTick(var2);
      this.desiredAltitudeWeight = var1.getDesiredAltitudeWeight(var2);
      boolean var3 = var1.isLegacyRelaxedMoveConstraints(var2);
      boolean var4 = !var1.isRelaxedConstraintsPresent();
      EnumSet var5 = var1.getRelaxedConstraints(var2);
      boolean var6 = var1.isAvoidingBlockDamage(var2);
      this.cachedEffectiveConstraints = computeEffectiveRelaxedConstraints(var4, var5, var3, var6);
      this.probeMoveData.setRelaxedConstraints(this.cachedEffectiveConstraints);
      int var8 = 0;

      for (int var7 = this.minDirection; var7 <= this.maxDirection; var7++) {
         var8 = this.addPreOrderedDirection(var7, var8);
      }

      this.insideConeCount = var8;

      for (int var9 = 0; var9 < this.minDirection; var9++) {
         var8 = this.addPreOrderedDirection(var9, var8);
      }

      for (int var10 = this.maxDirection + 1; var10 <= 16; var10++) {
         var8 = this.addPreOrderedDirection(var10, var8);
      }
   }

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

   @Override
   class="kw">public void activate(@Nonnull Ref<EntityStore> var1, @Nonnull ExecutionSupport var2, @Nonnull ComponentAccessor<EntityStore> var3) {
      this.debugSteer = var2.getDebugSupport().isDebugFlagSet(RoleDebugFlags.MotionControllerSteer);
      NPCEntity var4 = var3.getComponent(var1, NPCEntity.getComponentType());
      assert var4 != null;
      this.restartSearch(var1, var4, var2.getMotionContextSupport().getActiveMotionController(), var3);
   }

   @Override
   class="kw">public void deactivate(@Nonnull Ref<EntityStore> var1, @Nonnull ExecutionSupport var2, @Nonnull ComponentAccessor<EntityStore> var3) {
      if (this.debugSteer) {
         var3.removeComponent(var1, Nameplate.getComponentType());
      }
   }

   @Override
   class="kw">public void motionControllerChanged(
      @Nullable Ref<EntityStore> var1, @Nonnull NPCEntity var2, @Nonnull MotionController var3, @Nullable ComponentAccessor<EntityStore> var4
   ) {
      this.restartSearch(var1, var2, var3, var4);
   }

   @Override
   class="kw">public boolean computeSteering(
      @Nonnull Ref<EntityStore> var1,
      @Nonnull ExecutionSupport var2,
      @Nullable InfoProvider var3,
      double var4,
      @Nonnull Steering var6,
      @Nonnull ComponentAccessor<EntityStore> var7
   ) {
      NPCEntity var8 = var7.getComponent(var1, NPCEntity.getComponentType());
      assert var8 != null;
      MotionController var9 = var2.getMotionContextSupport().getActiveMotionController();
      if (this.debugSteer) {
         LOGGER.at(Level.INFO)
            .log(
               "Wander compute: state=%s canSteer=%s blocked=%s walkTime=%s",
               this.state.toString(),
               var9.canSteer(var1, var7),
               var9.isObstructed(),
               this.walkTime
            );
         String var10 = this.state.toString();
         var7.putComponent(var1, Nameplate.getComponentType(), new Nameplate(var10));
      }

      var6.clear();
      float var19 = var8.getCurrentHorizontalSpeedMultiplier(var1, var7);
      if (var19 == 0.0F) {
         this.state = BodyMotionWanderBase.State.STOPPED;
         class="kw">return true;
      }

      if (this.state == BodyMotionWanderBase.State.STOPPED) {
         this.restartSearch(var1, var8, var9, var7);
      }

      this.probeMoveData.setRelaxedConstraints(this.cachedEffectiveConstraints);
      boolean var11 = applyEscapeConstraints(var2, this.probeMoveData);
      if (this.state == BodyMotionWanderBase.State.SEARCHING && this.directionIndex == 0) {
         this.searchUsesEscapeConstraints = var11;
      } else if (this.searchUsesEscapeConstraints && !var11) {
         this.restartSearch(var1, var8, var9, var7);
      }

      if (var9.isInProgress()) {
         if (this.state == BodyMotionWanderBase.State.WALKING) {
            this.walkTime -= var4;
            var9.setRelaxedMoveConstraints(this.cachedEffectiveConstraints);
         }

         class="kw">return true;
      } else {
         if (!var9.canSteer(var1, var7)) {
            class="kw">return true;
         }

         TransformComponent var12 = var7.getComponent(var1, TransformComponent.getComponentType());
         assert var12 != null;
         Rotation3f var13 = var12.getRotation();
         if (var9.isObstructed() && this.state == BodyMotionWanderBase.State.WALKING) {
            this.restartSearch(var1, var8, var9, var7);
            if (this.debugSteer) {
               LOGGER.at(Level.INFO)
                  .log(
                     "Wander: Blocked state=%s directionIndex=%s walkTime=%s yaw=%s newYaw=%s",
                     this.state.toString(),
                     this.directionIndex,
                     this.walkTime,
                     (180.0F / (float)Math.PI) * var13.yaw(),
                     (180.0F / (float)Math.PI) * this.walkHeading
                  );
            }
         }

         if (this.state == BodyMotionWanderBase.State.SEARCHING) {
            int var14 = 0;

            while (true) {
               if (this.directionIndex == 32 || !this.relaxHeadingChange && this.directionIndex == this.insideConeCount) {
                  if (this.findBestDirection(var1, var7)) {
                     break;
                  }

                  this.restartSearch(var1, var8, var9, var7);
               } else {
                  if (this.probeDirection(var1, this.directionIndex, var2, var7)) {
                     break;
                  }

                  this.directionIndex++;
               }

               if (++var14 >= this.testsPerTick) {
                  class="kw">return true;
               }
            }

            double var15 = Math.min(Math.max(this.stopDistance, var9.getCurrentTurnRadius()), this.walkDistance);
            double var17 = Math.min(2.0 * var15, this.walkDistance);
            this.seekTarget.setDistances(var17, var15);
            this.seekTarget.setComponentSelector(var9.getComponentSelector());
            this.seekTarget.setTargetPosition(this.targetPosition);
            this.state = BodyMotionWanderBase.State.TURNING;
            if (this.debugSteer) {
               LOGGER.at(Level.INFO)
                  .log(
                     "Wander: Found move state=%s directionIndex=%s yaw=%s newYaw=%s",
                     this.state.toString(),
                     this.directionIndex,
                     (180.0F / (float)Math.PI) * var13.yaw(),
                     (180.0F / (float)Math.PI) * this.walkHeading
                  );
            }
         }

         if (this.state == BodyMotionWanderBase.State.TURNING) {
            float var20 = var13.yaw();
            double var21 = NPCPhysicsMath.turnAngle(this.walkHeading, var20);
            if (!(Math.abs(var21) < 0.05235988F)) {
               var6.setYaw(this.walkHeading);
               if (this.debugSteer) {
                  LOGGER.at(Level.INFO)
                     .log(
                        "Wander: Turn state=%s turnAngle=%s heading=%s walkHeading=%s",
                        this.state.toString(),
                        180.0F / (float)Math.PI * var21,
                        (180.0F / (float)Math.PI) * var20,
                        (180.0F / (float)Math.PI) * this.walkHeading
                     );
               }

               class="kw">return true;
            }

            if (this.debugSteer) {
               LOGGER.at(Level.INFO)
                  .log(
                     "Wander: Walk state=%s yaw=%s desiredYaw=%s walkTime=%s",
                     this.state.toString(),
                     (180.0F / (float)Math.PI) * var13.yaw(),
                     (180.0F / (float)Math.PI) * this.walkHeading,
                     this.walkTime
                  );
            }

            this.state = BodyMotionWanderBase.State.WALKING;
         }

         if (this.state == BodyMotionWanderBase.State.WALKING) {
            this.seekTarget.setSelfPosition(var12.getPosition());
            this.walkTime -= var4;
            if (!this.seekTarget.compute(var6) || this.walkTime <= 0.0) {
               this.restartSearch(var1, var8, var9, var7);
               if (this.debugSteer) {
                  LOGGER.at(Level.INFO)
                     .log(
                        "Wander: Walk done state=%s directionIndex=%s yaw=%s desiredYaw=%s",
                        this.state.toString(),
                        this.directionIndex,
                        (180.0F / (float)Math.PI) * var13.yaw(),
                        (180.0F / (float)Math.PI) * this.walkHeading
                     );
               }
            }

            var9.setRelaxedMoveConstraints(this.cachedEffectiveConstraints);
            this.probeMoveData.setRelaxedConstraints(this.cachedEffectiveConstraints);
            applyEscapeConstraints(var2, this.probeMoveData);
            var6.scaleTranslation(this.relativeSpeed);
         }

         class="kw">return true;
      }
   }

   class="kw">protected boolean findBestDirection(@Nonnull Ref<EntityStore> var1, @Nonnull ComponentAccessor<EntityStore> var2) {
      int var3 = -1;
      double var4 = 0.0;
      double var6 = 0.0;
      double var8 = 0.0;

      for (int var10 = 0; var10 < this.directionIndex; var10++) {
         double var11 = this.walkDistances[var10];
         if (var11 > 0.0) {
            var6++;
            var8 += var11;
         }
      }

      if (var6 > 0.0) {
         var8 /= var6;
         ThreadLocalRandom var19 = ThreadLocalRandom.current();

         for (int var20 = 0; var20 < this.directionIndex; var20++) {
            double var12 = this.walkDistances[var20];
            if (var12 > var4) {
               var4 = var12;
               var3 = var20;
               if (!(var12 < var8)) {
                  double var14 = var19.nextDouble();
                  if (var14 <= 0.5) {
                     double var16 = var14 * -1.4 + 1.0;
                     var4 *= var16;
                     break;
                  }
               }
            }
         }
      }

      if (var3 == -1) {
         class="kw">return false;
      }

      this.walkHeading = this.toAngle(var1, this.walkDirections[var3], var2);
      this.walkDistance = var4;
      this.computeTargetPosition(var1, this.walkHeading, this.walkDistance, var2);
      class="kw">return true;
   }

   class="kw">protected class="kw">abstract double constrainMove(
      @Nonnull Ref<EntityStore> var1,
      @Nonnull ExecutionSupport var2,
      @Nonnull Vector3d var3,
      @Nonnull Vector3d var4,
      double var5,
      @Nonnull ComponentAccessor<EntityStore> var7
   );

   class="kw">protected void restartSearch(
      @Nullable Ref<EntityStore> var1, @Nonnull NPCEntity var2, @Nonnull MotionController var3, @Nullable ComponentAccessor<EntityStore> var4
   ) {
      this.state = BodyMotionWanderBase.State.SEARCHING;
      this.searchUsesEscapeConstraints = false;
      float var5 = var2.getCurrentHorizontalSpeedMultiplier(var1, var4);
      this.walkTime = RandomExtra.randomRange(this.minWalkTime, this.maxWalkTime) / var5;
      this.desiredWalkDistance = this.relativeSpeed * var3.getMaximumSpeed() * this.walkTime;
      this.directionIndex = 0;
      this.angleOffset = this.relaxHeadingChange ? ThreadLocalRandom.current().nextFloat() * (float) (Math.PI / 16) : 0.0F;
      if (var1 != null && var4 != null) {
         this.computeHeightRange(var1, var3, var4);
      }

      this.probeDY = RandomExtra.randomRange(-this.maxDistanceBelow, this.maxDistanceAbove);
      System.arraycopy(this.preOrderedDirections, 0, this.walkDirections, 0, 32);
      ArrayUtil.shuffleArray(this.walkDirections, 0, this.insideConeCount, ThreadLocalRandom.current());
      if (this.insideConeCount < 31) {
         ArrayUtil.shuffleArray(this.walkDirections, this.insideConeCount, 32, ThreadLocalRandom.current());
      }

      Arrays.fill(this.walkDistances, 0.0);
   }

   class="kw">protected void computeHeightRange(@Nonnull Ref<EntityStore> var1, @Nonnull MotionController var2, @Nonnull ComponentAccessor<EntityStore> var3) {
      this.maxDistanceAbove = 0.0;
      this.maxDistanceBelow = 0.0;
      if (!var2.is2D()) {
         double var4 = var2.getWanderVerticalMovementRatio();
         double var6 = var4 * this.desiredWalkDistance;
         if (var6 != 0.0) {
            MotionController.VerticalRange var8 = var2.getDesiredVerticalRange(var1, var3);
            double var9 = this.desiredAltitudeWeight >= 0.0 ? this.desiredAltitudeWeight : var2.getDesiredAltitudeWeight();
            if (var9 > 0.0 && !var8.isWithinRange()) {
               var6 = this.desiredWalkDistance * (var4 + (1.0 - var4) * var9);
            }

            double var11 = var8.current;
            double var13 = -var6 * var9;
            this.maxDistanceAbove = MathUtil.clamp(var8.max - var11, var13, var6);
            this.maxDistanceBelow = MathUtil.clamp(var11 - var8.min, var13, var6);
         }
      }
   }

   class="kw">protected boolean probeDirection(@Nonnull Ref<EntityStore> var1, int var2, @Nonnull ExecutionSupport var3, @Nonnull ComponentAccessor<EntityStore> var4) {
      int var5 = this.walkDirections[var2];
      MotionController var6 = var3.getMotionContextSupport().getActiveMotionController();
      float var7 = this.toAngle(var1, var5, var4);
      this.computeTargetPosition(var1, var7, this.desiredWalkDistance, var4);
      double var8 = this.constrainMove(var1, var3, this.probePosition, this.targetPosition, this.desiredWalkDistance, var4);
      if (var8 < 1.0E-5) {
         class="kw">return false;
      }

      if (var8 < this.desiredWalkDistance) {
         this.probeDirection.mul(var8 / this.desiredWalkDistance);
      }

      if (var6.willReceiveBlockDamage()) {
         this.probeMoveData.getRelaxedConstraints().add(RelaxedConstraint.DAMAGE);
      }

      double var10 = var6.probeMove(var1, this.probePosition, this.probeDirection, this.probeMoveData, var4);
      if (var10 < 1.0E-5) {
         class="kw">return false;
      }

      this.walkDistances[var2] = var10;
      if (var10 < this.desiredWalkDistance) {
         class="kw">return false;
      }

      if (var10 < var8) {
         this.probeDirection.mul(var10 / var8);
      }

      this.walkDistance = var10;
      this.walkHeading = var7;
      this.targetPosition.set(this.probePosition).add(this.probeDirection);
      class="kw">return true;
   }

   class="kw">private void computeTargetPosition(@Nonnull Ref<EntityStore> var1, float var2, double var3, @Nonnull ComponentAccessor<EntityStore> var5) {
      TransformComponent var6 = var5.getComponent(var1, TransformComponent.getComponentType());
      assert var6 != null;
      this.probePosition.set(var6.getPosition());
      this.probeDirection.x = PhysicsMath.headingX(var2) * var3;
      this.probeDirection.y = this.probeDY * var3 / this.desiredWalkDistance;
      this.probeDirection.z = PhysicsMath.headingZ(var2) * var3;
      this.targetPosition.set(this.probePosition).add(this.probeDirection);
   }

   class="kw">protected float toAngle(@Nonnull Ref<EntityStore> var1, int var2, @Nonnull ComponentAccessor<EntityStore> var3) {
      TransformComponent var4 = var3.getComponent(var1, TransformComponent.getComponentType());
      assert var4 != null;
      class="kw">return PhysicsMath.normalizeAngle(var4.getRotation().yaw() + var2 * (float) (Math.PI / 16) + this.angleOffset);
   }

   class="kw">private int addPreOrderedDirection(int var1, int var2) {
      this.preOrderedDirections[var2++] = (byte)var1;
      if (var1 != 0 && var1 != 16) {
         this.preOrderedDirections[var2++] = (byte)(32 - var1);
      }

      class="kw">return var2;
   }

   class="kw">public enum State {
      SEARCHING,
      TURNING,
      WALKING,
      STOPPED;

      State() {
      }
   }
}