MotionControllerWalk class
Пакет: com.hypixel.hytale.server.npc.movement.controllers
Файл: com/hypixel/hytale/server/npc/movement/controllers/MotionControllerWalk.java
extends: MotionControllerBase
Поля (426)
| Модификаторы | Тип | Имя |
|---|---|---|
final |
String |
TYPE |
|
|
break |
|
|
break |
|
|
break |
|
|
break |
|
|
break |
|
|
break |
|
|
break |
|
|
break |
|
|
break |
|
|
break |
|
|
break |
|
private final String |
description |
|
private final String |
description |
|
MotionKind |
var1 |
|
|
var1 |
|
double |
var10 |
|
int |
var10 |
|
Ref |
var10 |
|
double |
var10 |
|
double |
var10 |
|
boolean |
var10 |
|
double |
var10 |
|
BlockCollisionData |
var10 |
|
|
var10 |
|
boolean |
var10 |
|
int |
var10 |
|
double |
var11 |
|
TransformComponent |
var11 |
|
int |
var11 |
|
Store |
var11 |
|
boolean |
var11 |
|
boolean |
var11 |
|
double |
var11 |
|
double |
var11 |
|
double |
var11 |
|
World |
var11 |
|
double |
var11 |
|
boolean |
var11 |
|
BlockMaterial |
var11 |
|
Ref |
var11 |
|
long |
var12 |
|
double |
var12 |
|
WorldChunk |
var12 |
|
double |
var12 |
|
BlockCollisionData |
var12 |
|
BlockCollisionData |
var12 |
|
|
var12 |
|
double |
var12 |
|
float |
var12 |
|
ChunkStore |
var12 |
|
int |
var12 |
|
double |
var13 |
|
Ref |
var13 |
|
BlockChunk |
var13 |
|
double |
var13 |
|
|
var13 |
|
|
var13 |
|
double |
var13 |
|
double |
var13 |
|
double |
var13 |
|
boolean |
var13 |
|
double |
var14 |
|
|
var14 |
|
long |
var14 |
|
double |
var14 |
|
|
var14 |
|
|
var14 |
|
BlockTypeAssetMap |
var14 |
|
boolean |
var14 |
|
double |
var14 |
|
Predicate |
var14 |
|
Vector3dc |
var14 |
|
double |
var15 |
|
FluidSection |
var15 |
|
int |
var15 |
|
float |
var15 |
|
|
var15 |
|
|
var15 |
|
|
var15 |
|
|
var15 |
|
|
var15 |
|
|
var15 |
|
|
var15 |
|
|
var15 |
|
|
var15 |
|
double |
var15 |
|
|
var15 |
|
|
var15 |
|
|
var15 |
|
|
var15 |
|
Predicate |
var15 |
|
double |
var15 |
|
long |
var16 |
|
double |
var16 |
|
|
var16 |
|
|
var16 |
|
int |
var16 |
|
|
var16 |
|
|
var16 |
|
boolean |
var16 |
|
double |
var16 |
|
|
var16 |
|
|
var16 |
|
Vector3d |
var16 |
|
int |
var17 |
|
float |
var17 |
|
|
var17 |
|
|
var17 |
|
|
var17 |
|
double |
var17 |
|
boolean |
var17 |
|
Vector3d |
var17 |
|
boolean |
var17 |
|
long |
var18 |
|
int |
var18 |
|
int |
var18 |
|
|
var18 |
|
boolean |
var18 |
|
|
var18 |
|
int |
var18 |
|
boolean |
var18 |
|
Vector3d |
var18 |
|
BlockCollisionData |
var18 |
|
|
var18 |
|
BlockType |
var19 |
|
|
var19 |
|
|
var19 |
|
float |
var19 |
|
|
var19 |
|
double |
var19 |
|
|
var19 |
|
|
var19 |
|
double |
var19 |
|
|
var19 |
|
|
var19 |
|
|
var19 |
|
|
var19 |
|
|
var19 |
|
Vector3d |
var19 |
|
Vector3dc |
var19 |
|
|
var2 |
|
|
var2 |
|
|
var2 |
|
|
var2 |
|
|
var2 |
|
|
var2 |
|
double |
var2 |
|
|
var2 |
|
int |
var20 |
|
int |
var20 |
|
|
var20 |
|
float |
var20 |
|
double |
var20 |
|
BlockCollisionData |
var20 |
|
|
var20 |
|
double |
var20 |
|
|
var20 |
|
int |
var21 |
|
int |
var21 |
|
boolean |
var21 |
|
float |
var21 |
|
double |
var21 |
|
boolean |
var21 |
|
|
var21 |
|
|
var21 |
|
int |
var22 |
|
int |
var22 |
|
double |
var22 |
|
double |
var22 |
|
CollisionModule |
var22 |
|
double |
var22 |
|
|
var22 |
|
int |
var23 |
|
int |
var23 |
|
double |
var23 |
|
boolean |
var23 |
|
boolean |
var24 |
|
|
var24 |
|
double |
var24 |
|
|
var24 |
|
|
var24 |
|
double |
var24 |
|
|
var24 |
|
boolean |
var24 |
|
BlockType |
var24 |
|
int |
var25 |
|
|
var25 |
|
BlockBoundingBoxes |
var25 |
|
double |
var25 |
|
double |
var25 |
|
ChunkStore |
var26 |
|
BlockBoundingBoxes |
var26 |
|
Store |
var27 |
|
BlockBoundingBoxes.RotatedVariantBoxes |
var27 |
|
double |
var27 |
|
|
var27 |
|
|
var27 |
|
|
var27 |
|
|
var27 |
|
ChunkStore |
var27 |
|
double |
var27 |
|
boolean |
var28 |
|
|
var28 |
|
|
var28 |
|
|
var28 |
|
double |
var28 |
|
float |
var29 |
|
double |
var29 |
|
TransformComponent |
var3 |
|
NPCEntity |
var3 |
|
boolean |
var3 |
|
String |
var3 |
|
Rotation3f |
var3 |
|
World |
var3 |
|
|
var3 |
|
|
var3 |
|
|
var3 |
|
|
var3 |
|
|
var3 |
|
double |
var3 |
|
boolean |
var3 |
|
float |
var3 |
|
double |
var3 |
|
Ref |
var30 |
|
double |
var30 |
|
ChunkStore |
var30 |
|
BlockChunk |
var31 |
|
int |
var31 |
|
Velocity |
var31 |
|
ChunkStore |
var31 |
|
int |
var32 |
|
double |
var32 |
|
|
var32 |
|
double |
var32 |
|
int |
var33 |
|
double |
var33 |
|
double |
var33 |
|
int |
var34 |
|
BlockSection |
var34 |
|
double |
var34 |
|
double |
var34 |
|
int |
var35 |
|
int |
var35 |
|
BlockSection |
var36 |
|
int |
var36 |
|
double |
var36 |
|
int |
var37 |
|
MotionControllerBase.AppliedVelocity |
var37 |
|
ChunkStore |
var37 |
|
int |
var38 |
|
float |
var38 |
|
double |
var38 |
|
int |
var39 |
|
BlockType |
var39 |
|
Vector3d |
var39 |
|
int |
var39 |
|
double |
var4 |
|
|
var4 |
|
|
var4 |
|
return var1 > |
var4 |
|
boolean |
var4 |
|
World |
var4 |
|
|
var4 |
|
|
var4 |
|
boolean |
var4 |
|
Vector3d |
var4 |
|
double |
var4 |
|
|
var4 |
|
|
var4 |
|
|
var4 |
|
double |
var4 |
|
boolean |
var4 |
|
boolean |
var4 |
|
BlockBoundingBoxes |
var40 |
|
double |
var40 |
|
double |
var40 |
|
int |
var41 |
|
BlockBoundingBoxes.RotatedVariantBoxes |
var41 |
|
double |
var41 |
|
int |
var42 |
|
BlockBoundingBoxes.RotatedVariantBoxes |
var42 |
|
double |
var42 |
|
int |
var43 |
|
double |
var43 |
|
double |
var43 |
|
|
var43 |
|
|
var43 |
|
|
var43 |
|
|
var43 |
|
BlockType |
var44 |
|
double |
var44 |
|
double |
var44 |
|
int |
var45 |
|
double |
var45 |
|
int |
var46 |
|
float |
var46 |
|
int |
var47 |
|
float |
var47 |
|
BlockMaterial |
var48 |
|
BlockBoundingBoxes |
var49 |
|
Velocity |
var49 |
|
NPCEntity |
var5 |
|
float |
var5 |
|
double |
var5 |
|
|
var5 |
|
Box |
var5 |
|
boolean |
var5 |
|
boolean |
var5 |
|
boolean |
var5 |
|
double |
var5 |
|
ChunkStore |
var5 |
|
double |
var5 |
|
double |
var5 |
|
BlockCollisionData |
var5 |
|
BlockCollisionData |
var5 |
|
boolean |
var5 |
|
BlockCollisionData |
var5 |
|
|
var5 |
|
|
var5 |
|
BlockBoundingBoxes.RotatedVariantBoxes |
var50 |
|
double |
var50 |
|
|
var50 |
|
int |
var51 |
|
|
var51 |
|
double |
var51 |
|
|
var51 |
|
Vector3d |
var53 |
|
double |
var54 |
|
double |
var55 |
|
int |
var56 |
|
double |
var56 |
|
int |
var57 |
|
double |
var57 |
|
|
var57 |
|
|
var57 |
|
Fluid |
var58 |
|
|
var58 |
|
|
var58 |
|
double |
var58 |
|
Store |
var59 |
|
double |
var59 |
|
double |
var6 |
|
|
var6 |
|
|
var6 |
|
|
var6 |
|
NPCEntity |
var6 |
|
int |
var6 |
|
World |
var6 |
|
int |
var6 |
|
boolean |
var6 |
|
BlockCollisionData |
var6 |
|
Vector3d |
var6 |
|
double |
var6 |
|
int |
var60 |
|
double |
var60 |
|
PositionDataComponent |
var61 |
|
double |
var61 |
|
FluidFX |
var62 |
|
double |
var62 |
|
|
var62 |
|
|
var62 |
|
Store |
var63 |
|
double |
var63 |
|
BlockSection |
var64 |
|
BoxBlockIntersectionEvaluator |
var66 |
|
Vector3dc |
var67 |
|
int |
var68 |
|
|
var68 |
|
|
var68 |
|
|
var68 |
|
int |
var7 |
|
long |
var7 |
|
double |
var7 |
|
boolean |
var7 |
|
boolean |
var7 |
|
double |
var7 |
|
|
var7 |
|
|
var7 |
|
|
var7 |
|
|
var7 |
|
BlockType |
var7 |
|
double |
var7 |
|
|
var7 |
|
|
var7 |
|
double |
var7 |
|
double |
var7 |
|
World |
var7 |
|
int |
var70 |
|
int |
var72 |
|
int |
var73 |
|
int |
var74 |
|
int |
var75 |
|
int |
var76 |
|
float |
var8 |
|
|
var8 |
|
|
var8 |
|
|
var8 |
|
|
var8 |
|
|
var8 |
|
|
var8 |
|
double |
var8 |
|
int |
var8 |
|
NPCEntity |
var8 |
|
double |
var8 |
|
boolean |
var8 |
|
double |
var8 |
|
ChunkStore |
var8 |
|
double |
var9 |
|
|
var9 |
|
int |
var9 |
|
int |
var9 |
|
ChunkStore |
var9 |
|
Vector3d |
var9 |
|
double |
var9 |
|
double |
var9 |
|
EnumSet |
var9 |
|
double |
var9 |
|
|
var9 |
|
double |
var9 |
|
float |
var9 |
|
double |
var9 |
|
boolean |
var9 |
|
long |
var9 |
|
BlockChunk |
var9 |
|
long |
var9 |
Методы (253)
| Модификаторы | Возврат | Сигнатура |
|---|---|---|
|
|
AscentAnimationType AscentAnimationType(String nullxx) |
|
|
DescentAnimationType DescentAnimationType(String nullxx) |
abstract |
|
Idle Idle("Play idle animation") |
abstract |
throw new |
IllegalArgumentExceptionthrow new IllegalArgumentException("Translation invalid") |
abstract |
throw new |
IllegalStateExceptionthrow new IllegalStateException("Invalid position") |
private |
void |
applyActiveProbeBlockCollisionFiltervoid applyActiveProbeBlockCollisionFilter(@Nonnull CollisionResult var1) |
private |
double |
bisectdouble bisect(@Nonnull Vector3d var1, @Nonnull Vector3d var2, @Nonnull Vector3d var3, @Nonnull ComponentAccessor<EntityStore> var4) |
private |
float |
computeBlendHeadingfloat computeBlendHeading(float var1, float var2, double var3, double var5, double var7) |
private |
float |
computeBlendHeadingfloat computeBlendHeading(float var1, float var2, double var3, double var5, float var7, double var8) |
private |
float |
computeBlendTurnAnglefloat computeBlendTurnAngle(float var1, float var2) |
private |
double |
computeClimbHeightdouble computeClimbHeight(@Nonnull Vector3d var1,
@Nonnull Vector3d var2,
double var3,
double var5,
@Nullable Vector3d var7,
@Nonnull Vector2d var8,
@Nonnull EnumSet<RelaxedConstraint> var9,
@Nonnull ComponentAccessor<EntityStore> var10) |
private |
double |
computeClimbMovedouble computeClimbMove(@Nonnull Vector3d var1, double var2, double var4, @Nonnull Vector3d var6) |
private |
double |
computeClimbSpeeddouble computeClimbSpeed(double var1) |
private |
void |
computeDescendDirectionvoid computeDescendDirection(@Nonnull Vector3d var1) |
protected |
float |
computeHeadingfloat computeHeading(float var1, double var2, float var4, double var5, boolean var7, boolean var8) |
private |
double |
computeNewFallSpeeddouble computeNewFallSpeed(double var1, double var3) |
private |
boolean |
couldBreatheAtWalkPositionboolean couldBreatheAtWalkPosition(@Nonnull Ref<ChunkStore> var1, @Nonnull ComponentAccessor<ChunkStore> var2, double var3, double var5, double var7) |
private |
double |
dropDistancedouble dropDistance(@Nonnull Vector3d var1, double var2, @Nonnull ComponentAccessor<EntityStore> var4) |
private |
double |
effectiveMaxDropHeightdouble effectiveMaxDropHeight(@Nonnull EnumSet<RelaxedConstraint> var1) |
private |
double |
executePhysicsMovedouble executePhysicsMove(@Nonnull Ref<EntityStore> var1, double var2, @Nonnull Vector3d var4, @Nonnull ComponentAccessor<EntityStore> var5) |
private |
boolean |
findMoveCollisionsboolean findMoveCollisions(int var1, boolean var2, @Nonnull Vector3d var3, @Nonnull ComponentAccessor<EntityStore> var4) |
private |
double |
finishPhysicsCollisiondouble finishPhysicsCollision(@Nonnull Ref<EntityStore> var1, double var2, double var4, @Nonnull ComponentAccessor<EntityStore> var6) |
|
|
for for(int var28 = var20; var28 <= var21; var28++) |
|
|
for for(int var29 = var22; var29 <= var23; var29++) |
|
|
for for(int var37 = var32; var37 <= var33; var37++) |
|
|
for for(int var38 = var34; var38 <= var35; var38++) |
|
|
for for(int var69 = var20; var69 <= var21; var69++) |
|
|
for for(int var71 = var22; var71 <= var23; var71++) |
|
|
for for(int var77 = var73; var77 <= var74; var77++) |
|
|
for for(int var40 = var75; var40 <= var76; var40++) |
|
|
for for(int var19 = var8; var19 <= var9; var19++) |
|
|
for for(int var20 = var10; var20 <= var11; var20++) |
|
|
for for(int var11 = 0; var11 < var18; var11++) |
abstract |
|
for for(var22 = MathUtil.ceil(var3) |
abstract |
|
for for(int var28 = 0; var28 < this.appliedVelocities.size() |
|
public String |
getpublic String get() |
|
public String |
getpublic String get() |
|
|
if if(this.maxHover > 0.0 && this.hoverCycle > 0.0F && var2 > 0.0) |
|
|
if if(var15 < var14) |
|
|
if if(var9 > this.climbUpDistance) |
|
|
if if(var6 >= this.minHover) |
|
|
if if(var6 <= this.minHover) |
|
|
if if(!this.jumping) |
|
|
if if(this.predictedFallHeight >= this.minDescentAnimationHeight - 1.0E-5) |
|
|
if if(var3) |
|
|
if if(var3 != null) |
|
|
if if(var5 - var7 < 1.0E-5) |
|
|
if if(var7 >= 0 && var7 <= 319) |
|
|
if if(var31 == null) |
|
|
if if(var24 || var39 != this.footingBlocks[var25]) |
|
|
if if(var24 && this.footingBlocksValid) |
|
|
if if(var43 != 0) |
|
|
if if(var42 != 0) |
|
|
if if(var48 == BlockMaterial.Solid) |
|
|
if if(this.inWater) |
|
|
if if(var60 != 0) |
|
|
if if(var5 < var3) |
|
|
if if(var3 < 0.0) |
|
|
if if(var5 > 320.0) |
|
|
if if(var2 == null) |
|
|
if if(var9 - var8 > 2 || var11 - var10 > 2) |
|
|
if if(var18 < 0) |
|
|
if if(var18 > 0 && var1.y > var16) |
|
|
if if(var16 > var14) |
|
|
if if(var21 < 0) |
|
|
if if(var21 > 0 && var1.y > var16) |
|
|
if if(var16 > var14) |
|
|
if if(var16 < 0.0) |
|
|
if if(var12 == null) |
|
|
if if(var13 == null) |
|
|
if if(var16 < 320) |
|
|
if if(var18 != 0) |
|
|
if if(var18 == 0) |
|
|
if if(var16 == var22) |
|
|
if if(var20 != 0) |
|
|
if if(var24 > var3) |
|
|
if if(var16 < var1) |
|
|
if if(var16 < var1) |
|
|
if if(var38 != 0) |
|
|
if if(var37 != 0) |
|
|
if if(var43 < var1) |
|
|
if if(var44 < var1) |
|
|
if if(this.onGround) |
|
|
if if(var37.velocity.y + this.externalVelocity.y <= 0.0 || var37.velocity.y < 0.0) |
|
|
if if(this.onGround && var37.canClear) |
|
|
if if(this.moveSpeed > 0.0) |
|
|
if if(this.moveSpeed > this.minHorizontalSpeed) |
|
|
if if(this.maxHover > 0.0) |
|
|
if if(this.onGround && this.ignoreDamping) |
|
|
if if(var30 > 0.0) |
|
|
if if(this.cachedMovementBlocked) |
|
|
if if(var33 < this.maxClimbForwardDistance) |
|
|
if if(this.jumping) |
|
|
if if(this.climbUpDistance > 0.0) |
|
|
if if(var45 > this.jumpBlockHeight) |
|
|
if if(this.climbUpDistance > 0.0) |
|
|
if if(var24 > this.maxClimbForwardDistance) |
|
|
if if(var57 < 0.0) |
|
|
if if(this.isBlendingHeading) |
|
|
if if(this.climbUpDistance > 0.0) |
|
|
if if(var34 < var56) |
|
|
if if(this.isBlendingHeading) |
|
|
if if(var41 < var32 * var4) |
|
|
if if(this.moveSpeed > var12) |
|
|
if if(this.moveSpeed <= 0.3 * this.maxHorizontalSpeed) |
|
|
if if(this.predictedFallHeight > 0.0) |
|
|
if if(this.isBlendingHeading) |
|
|
if if(var16) |
|
|
if if(var19 < -var20 || var19 > var20) |
|
|
if if(this.fallSpeed > 0.0) |
|
|
if if(this.isBlendingHeading) |
|
|
if if(this.blendRestTurnAngle > 0.0F) |
|
|
if if(this.debugModeSteer) |
|
|
if if(this.maxHover > 0.0 && this.floatsDown) |
|
|
if if(this.fallSpeed != 0.0 && this.climbSpeedMult != 0.0) |
|
|
if if(this.moveSpeed > var12) |
|
|
if if(this.fallSpeed > var10) |
|
|
if if(var18) |
|
|
if if(var50 > var60) |
|
|
if if(var25 > var61) |
|
|
if if(var3 < var7 && var9 > 0.0) |
|
|
if if(this.debugModeBlockCollisions) |
|
|
if if(this.debugModeBlockCollisions) |
|
|
if if(this.debugModeCollisions) |
|
|
if if(var6 == null) |
|
|
if if(this.collisionResult.isSliding) |
|
|
if if(this.onGround) |
|
|
if if(var7) |
|
|
if if(this.debugModeMove) |
|
|
if if(var14 == 0.0) |
|
|
if if(this.debugModeMove) |
|
|
if if(!this.onGround) |
|
|
if if(this.debugModeMove) |
|
|
if if(this.debugModeMove) |
|
|
if if(this.debugModeMove) |
|
|
if if(this.ignoreDamping) |
|
|
if if(this.debugModeMove) |
|
|
if if(this.inWater) |
|
|
if if(this.collisionResult.isSliding) |
|
|
if if(this.onGround) |
|
|
if if(var12 == null) |
|
|
if if(var18 && this.onGround) |
|
|
if if(var34 == 0.0) |
|
|
if if(this.onGround) |
|
|
if if(var32 == 0.0) |
|
|
if if(this.debugModeMove) |
|
|
if if(this.onGround) |
|
|
if if(var7 && var12.willDamage) |
|
|
if if(var29 >= this.maxDropHeight) |
|
|
if if(!this.onGround) |
|
|
if if(this.debugModeMove) |
|
|
if if(this.debugModeMove) |
|
|
if if(var7 && var12.willDamage) |
|
|
if if(this.debugModeMove) |
|
|
if if(this.debugModeMove) |
|
|
if if(this.debugModeMove) |
|
|
if if(this.debugModeMove) |
|
|
if if(this.debugModeMove) |
|
|
if if(var7 == 0.0) |
|
|
if if(var5) |
|
|
if if(!var21) |
|
|
if if(var5) |
|
|
if if(var5) |
|
|
if if(this.debugModeProbeBlockCollisions || var2.debugCollision) |
|
|
if if(this.debugModeProbeBlockCollisions || var2.debugCollision) |
|
|
if if(this.debugModeMove) |
|
|
if if(this.debugModeCollisions) |
|
|
if if(this.collisionResult.isSliding) |
|
|
if if(var20 != null && var20.collisionStart <= var25) |
|
|
if if(var10 && var20.willDamage) |
|
|
if if(var5) |
|
|
if if(var5) |
|
|
if if(var5) |
|
|
if if(var28 <= 0.0) |
|
|
if if(var5) |
|
|
if if(var5) |
|
|
if if(var25 >= 1.0) |
|
|
if if(!var11) |
|
|
if if(var5) |
|
|
if if(var5) |
|
|
if if(var5) |
|
|
if if(var5) |
|
|
if if(var5) |
|
|
if if(var5) |
|
|
if if(this.isObstructed && !this.onGround) |
|
|
if if(var9 >= -var11 && var9 <= var11) |
|
|
if if(var7) |
|
|
if if(var7) |
|
|
if if(this.debugModeMove) |
|
|
if if(this.fallStartHeight - this.position.y > this.maxClimbHeight || this.predictedFallHeight > this.maxClimbHeight + 1.0E-5) |
|
|
if if(this.debugModeMove) |
|
|
if if(this.debugModeMove) |
|
|
if if(var4 && var2.willDamage) |
|
|
if if(var13 > var11) |
|
|
if if(var4 <= 0.05) |
|
|
if if(this.debugModeMove) |
|
|
if if(this.debugModeValidateMath) |
|
|
if if(!var3) |
|
|
if if(this.debugModeValidateMath) |
|
|
if if(this.haveBlendHeadingPosition && var5 > 0.0) |
|
|
if if(var13 * var10 * var8 > var7) |
|
|
if if(var4 >= var2) |
|
|
if if(var7 <= 1.0E-5) |
|
|
if if(var6 > 1.0E-6) |
|
|
if if(var1 != 0.0 && this.climbSpeedMult != 0.0) |
|
|
if if(this.climbUpDistance > this.maxClimbHeight + 1.0E-5) |
|
|
if if(var3 == 0.0) |
|
|
if if(var18.collisionStart > var20) |
|
|
if if(var18.collisionEnd > var20) |
|
|
if if(var20 > 1.00001) |
|
|
if if(var20 == 0.0) |
|
|
if if(var7 != null) |
|
|
if if(var10 == null) |
|
|
if if(var9) |
|
|
if if(var10.willDamage) |
|
|
if if(this.debugModeMove) |
|
|
if if(this.debugModeMove) |
|
|
if if(this.debugModeMove) |
|
|
if if(var4) |
|
|
if if(this.debugModeMove) |
|
|
if if(var5 == null) |
|
|
if if(var10) |
|
|
if if(this.breathingDepth == this.constraintDepth) |
|
|
if if(this.activeProbeBreathableBlockOverride == null) |
|
|
if if(var9 == null) |
|
|
if if(var2.y != 0.0) |
|
|
if if(this.activeProbeBlockCollisionFilter != null) |
protected |
boolean |
initiateDescendboolean initiateDescend(@Nonnull Vector3d var1, boolean var2, String var3, @Nonnull ComponentAccessor<EntityStore> var4) |
private |
boolean |
isClimbableboolean isClimbable(@Nonnull BlockType var1, @Nonnull Fluid var2, @Nonnull EnumSet<RelaxedConstraint> var3) |
private |
boolean |
isDropBlockedboolean isDropBlocked(@Nonnull Vector3d var1, double var2, boolean var4, @Nonnull EnumSet<RelaxedConstraint> var5, @Nonnull ComponentAccessor<EntityStore> var6) |
private |
boolean |
isOnSolidGroundboolean isOnSolidGround() |
private |
boolean |
isProbeBreathableBlockOverrideboolean isProbeBreathableBlockOverride(@Nonnull Ref<ChunkStore> var1, @Nonnull ComponentAccessor<ChunkStore> var2, double var3, double var5, double var7) |
private |
boolean |
isValidWalkPositionboolean isValidWalkPosition(@Nonnull Ref<ChunkStore> var1,
@Nonnull ComponentAccessor<ChunkStore> var2,
double var3,
double var5,
double var7,
@Nonnull EnumSet<RelaxedConstraint> var9) |
private |
boolean |
isValidWalkPositionboolean isValidWalkPosition(@Nonnull ChunkStore var1, double var2, double var4, double var6, @Nonnull EnumSet<RelaxedConstraint> var8) |
private |
void |
lockOrientationvoid lockOrientation(@Nonnull Steering var1, @Nonnull Vector3d var2, float var3) |
private |
double |
maxMoveFactordouble maxMoveFactor(@Nonnull Vector3d var1, @Nonnull Vector3d var2, @Nonnull EnumSet<RelaxedConstraint> var3, @Nonnull ComponentAccessor<EntityStore> var4) |
private |
double |
shortenMovementdouble shortenMovement(@Nonnull Vector3d var1, @Nonnull Vector3d var2, @Nonnull Vector3d var3) |
private |
double |
shortenMovementdouble shortenMovement(double var1) |
private |
double |
shortenSlidedouble shortenSlide(@Nonnull Vector3d var1, double var2) |
abstract |
|
super super(var2, var1) |
|
|
switch switch(this.ascentAnimationType) |
|
|
switch switch(this.descentAnimationType) |
static |
int |
translateToAccessiblePositionint translateToAccessiblePosition(@Nonnull Vector3d var0, double var1, double var3, @Nonnull ComponentAccessor<EntityStore> var5) |
private |
boolean |
tryClimbboolean tryClimb(@Nonnull Vector3d var1, @Nonnull EnumSet<RelaxedConstraint> var2, @Nonnull ComponentAccessor<EntityStore> var3) |
protected |
double |
updateMovementVectordouble updateMovementVector(@Nonnull Vector3d var1, @Nonnull Vector3d var2, @Nonnull Vector3d var3, @Nonnull Vector3d var4) |
private |
boolean |
validateGroundPositionboolean validateGroundPosition(double var1, @Nonnull EnumSet<RelaxedConstraint> var3, @Nonnull ComponentAccessor<EntityStore> var4) |
private |
void |
validateSpeedsvoid validateSpeeds(@Nonnull Ref<EntityStore> var1, @Nonnull String var2, @Nonnull ComponentAccessor<EntityStore> var3) |
private |
void |
validateTranslationvoid validateTranslation(@Nonnull Vector3d var1, String var2) |
|
|
while while(var31 >= 0) |
|
|
while while(var16 >= var35) |
|
|
while while(var7 > 0.0) |
|
|
while while(var2 != null) |
|
|
while while(var18 != null) |
Исходный код
Показать/скрыть
class="kw">package com.hypixel.hytale.server.npc.movement.controllers;
class="kw">import com.hypixel.hytale.assetstore.map.BlockTypeAssetMap;
class="kw">import com.hypixel.hytale.component.ComponentAccessor;
class="kw">import com.hypixel.hytale.component.Ref;
class="kw">import com.hypixel.hytale.component.Store;
class="kw">import com.hypixel.hytale.math.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.util.TrigMathUtil;
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.BlockMaterial;
class="kw">import com.hypixel.hytale.protocol.MovementStates;
class="kw">import com.hypixel.hytale.server.core.asset.type.blockhitbox.BlockBoundingBoxes;
class="kw">import com.hypixel.hytale.server.core.asset.type.blocktype.config.BlockType;
class="kw">import com.hypixel.hytale.server.core.asset.type.fluid.Fluid;
class="kw">import com.hypixel.hytale.server.core.asset.type.fluidfx.config.FluidFX;
class="kw">import com.hypixel.hytale.server.core.asset.type.model.config.Model;
class="kw">import com.hypixel.hytale.server.core.modules.blockset.BlockSetModule;
class="kw">import com.hypixel.hytale.server.core.modules.collision.BlockCollisionData;
class="kw">import com.hypixel.hytale.server.core.modules.collision.BoxBlockIntersectionEvaluator;
class="kw">import com.hypixel.hytale.server.core.modules.collision.CollisionConfig;
class="kw">import com.hypixel.hytale.server.core.modules.collision.CollisionMath;
class="kw">import com.hypixel.hytale.server.core.modules.collision.CollisionModule;
class="kw">import com.hypixel.hytale.server.core.modules.collision.CollisionResult;
class="kw">import com.hypixel.hytale.server.core.modules.collision.WorldUtil;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.PositionDataComponent;
class="kw">import com.hypixel.hytale.server.core.modules.entity.component.TransformComponent;
class="kw">import com.hypixel.hytale.server.core.modules.physics.component.Velocity;
class="kw">import com.hypixel.hytale.server.core.modules.physics.util.PhysicsMath;
class="kw">import com.hypixel.hytale.server.core.modules.splitvelocity.VelocityConfig;
class="kw">import com.hypixel.hytale.server.core.universe.world.World;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.BlockChunk;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.WorldChunk;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.section.BlockSection;
class="kw">import com.hypixel.hytale.server.core.universe.world.chunk.section.FluidSection;
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.core.util.FillerBlockUtil;
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.MovementMode;
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.BuilderMotionControllerWalk;
class="kw">import com.hypixel.hytale.server.npc.role.Role;
class="kw">import com.hypixel.hytale.server.npc.util.NPCPhysicsMath;
class="kw">import java.util.EnumSet;
class="kw">import java.util.Set;
class="kw">import java.util.function.IntPredicate;
class="kw">import java.util.function.Predicate;
class="kw">import java.util.function.Supplier;
class="kw">import java.util.logging.Level;
class="kw">import javax.annotation.Nonnull;
class="kw">import javax.annotation.Nullable;
class="kw">import org.joml.Vector2d;
class="kw">import org.joml.Vector3d;
class="kw">import org.joml.Vector3dc;
class="kw">public class MotionControllerWalk class="kw">extends MotionControllerBase {
class="kw">public class="kw">static class="kw">final String TYPE = "Walk";
class="kw">public class="kw">static class="kw">final Set<MovementMode> SUPPORTED_MOVEMENT_MODES = Set.of(MovementMode.WALK, MovementMode.WADE, MovementMode.UNDERWATER_WALK);
class="kw">public class="kw">static class="kw">final double CLIMB_FORWARD_DISTANCE = 0.1;
class="kw">public class="kw">static class="kw">final double CLIMB_FORWARD_DISTANCE_SQUARED = 0.010000000000000002;
class="kw">public class="kw">static class="kw">final double JUMP_FORWARD_DISTANCE = 0.5;
class="kw">public class="kw">static class="kw">final double ONE_PLUS_THRESHOLD = 1.00001;
class="kw">public class="kw">static class="kw">final double MIN_SAFETY_DISTANCE = 0.05;
class="kw">public class="kw">static class="kw">final double EDGE_MARGIN_BBOX_FACTOR = 0.1;
class="kw">public class="kw">static class="kw">final double MIN_SEPARATION_STEERING = 1.0E-5;
class="kw">protected class="kw">static class="kw">final EnumSet<MotionKind> STATE_CAN_HOVER = EnumSet.of(MotionKind.MOVING, MotionKind.STANDING);
class="kw">protected class="kw">static class="kw">final EnumSet<MotionKind> VALID_MOTIONS = EnumSet.of(
MotionKind.ASCENDING, MotionKind.DESCENDING, MotionKind.DROPPING, MotionKind.STANDING, MotionKind.MOVING
);
class="kw">protected class="kw">static class="kw">final int COLLISION_MATERIALS = 4;
class="kw">protected class="kw">static class="kw">final int WALKING_MATERIALS = 5;
class="kw">protected class="kw">static class="kw">final int WALKING_MATERIALS_RELAXED = 13;
class="kw">protected class="kw">final double minHorizontalSpeed;
class="kw">protected class="kw">final double maxVerticalSpeed;
class="kw">protected class="kw">final double maxVerticalSpeedFluid;
class="kw">protected class="kw">final double acceleration;
class="kw">protected class="kw">final double maxRotationSpeed;
class="kw">protected class="kw">final float maxMoveTurnAngle;
class="kw">protected class="kw">final float blendRestTurnAngle;
class="kw">protected class="kw">final double blendRestRelativeSpeed;
class="kw">protected class="kw">final double maxClimbHeight;
class="kw">protected class="kw">final double jumpHeight;
class="kw">protected class="kw">final double minJumpHeight;
class="kw">protected class="kw">final double minJumpDistance;
class="kw">protected class="kw">final double jumpForce;
class="kw">protected class="kw">final double jumpDescentSteepness;
class="kw">protected class="kw">final double jumpBlending;
class="kw">protected class="kw">final double jumpDescentBlending;
class="kw">protected class="kw">final double climbSpeedMult;
class="kw">protected class="kw">final double climbSpeedPow;
class="kw">protected class="kw">final double climbSpeedConst;
class="kw">protected class="kw">final double maxDropHeight;
class="kw">protected class="kw">final double maxDropHeightRelaxed;
class="kw">protected class="kw">final double minDescentAnimationHeight;
class="kw">protected class="kw">final double descendFlatness;
class="kw">protected class="kw">final double descendSpeedCompensation;
class="kw">protected class="kw">final double descentSteepness;
class="kw">protected class="kw">final double descentBlending;
class="kw">protected class="kw">final MotionControllerWalk.DescentAnimationType descentAnimationType;
class="kw">protected class="kw">final MotionControllerWalk.AscentAnimationType ascentAnimationType;
class="kw">protected class="kw">final double maxWalkSpeedAfterHitMultiplier;
class="kw">protected class="kw">final int fenceBlockSet;
class="kw">protected class="kw">final double minHover;
class="kw">protected class="kw">final double maxHover;
class="kw">protected class="kw">final double hoverFreq;
class="kw">protected class="kw">final float hoverCycle;
class="kw">protected class="kw">final double minHoverClimb;
class="kw">protected class="kw">final double minHoverDrop;
class="kw">protected class="kw">final boolean floatsDown;
class="kw">protected boolean onGround;
class="kw">protected boolean inWater;
class="kw">protected double horizontalSpeedMultiplier;
class="kw">protected double fallStartHeight;
class="kw">protected double fallSpeed;
class="kw">protected double currentRelativeSpeed;
class="kw">protected boolean isFullyRotated = true;
@Nullable
class="kw">protected BlockType belowBlockType;
class="kw">protected int belowBlockTypeId = 0;
class="kw">protected int[] footingBlocks;
class="kw">protected short[] footingFillers;
class="kw">protected byte[] footingRotations;
class="kw">protected class="kw">final Vector3d footingPosition = new Vector3d();
class="kw">protected boolean footingBlocksValid;
class="kw">protected double breathingDepth;
class="kw">protected double constraintDepth;
class="kw">protected double climbUpDistance;
class="kw">protected double currentJumpHeight;
class="kw">protected double jumpDropHeight;
class="kw">protected double jumpBlockHeight;
class="kw">protected double predictedFallHeight;
class="kw">protected class="kw">final Vector3d jumpDropDirection = new Vector3d();
class="kw">protected class="kw">final Vector3d climbUpDirection = new Vector3d();
class="kw">protected double currentClimbForwardDistance;
class="kw">protected double maxClimbForwardDistance;
class="kw">protected double totalDropDistance;
class="kw">protected class="kw">final Vector3d climbForwardDirection = new Vector3d();
class="kw">protected double climbSpeed;
class="kw">protected boolean jumping;
class="kw">protected class="kw">final MotionController.VerticalRange verticalRange = new MotionController.VerticalRange();
class="kw">protected class="kw">final Vector3d tmpClimbPosition = new Vector3d();
class="kw">protected class="kw">final Vector3d tmpClimbMovement = new Vector3d();
class="kw">protected class="kw">final Vector3d tmpMovePosition = new Vector3d();
class="kw">protected class="kw">final CollisionResult tmpResults = new CollisionResult();
class="kw">protected class="kw">final Vector2d tmpClimbHeightResults = new Vector2d();
@Nullable
class="kw">private Predicate<CollisionConfig> activeProbeBlockCollisionFilter;
@Nullable
class="kw">private IntPredicate activeProbeBreathableBlockOverride;
class="kw">private class="kw">final EnumSet<RelaxedConstraint> effectiveMoveConstraints = EnumSet.noneOf(RelaxedConstraint.class);
class="kw">public MotionControllerWalk(@Nonnull BuilderMotionControllerWalk var1, @Nonnull BuilderSupport var2) {
super(var2, var1);
this.setGravity(var1.getGravity());
this.minHorizontalSpeed = var1.getMinHorizontalSpeed();
this.maxVerticalSpeed = var1.getMaxVerticalSpeed();
this.maxVerticalSpeedFluid = var1.getMaxVerticalSpeedFluid();
this.acceleration = var1.getAcceleration(var2);
this.maxRotationSpeed = var1.getMaxRotationSpeed(var2);
this.maxMoveTurnAngle = var1.getMaxMoveTurnAngle(var2);
this.blendRestTurnAngle = var1.getBlendRestTurnAngle(var2);
this.blendRestRelativeSpeed = var1.getBlendRestRelativeSpeed(var2);
this.maxClimbHeight = var1.getMaxClimbHeight(var2);
this.jumpHeight = var1.getJumpHeight(var2);
this.minJumpHeight = var1.getMinJumpHeight(var2);
this.minJumpDistance = var1.getMinJumpDistance(var2);
this.jumpForce = var1.getJumpForce(var2);
this.jumpDescentSteepness = var1.getJumpDescentSteepness(var2);
this.jumpBlending = var1.getJumpBlending(var2);
this.jumpDescentBlending = var1.getJumpDescentBlending(var2);
this.ascentAnimationType = var1.getAscentAnimationType(var2);
this.climbSpeedMult = var1.getClimbSpeedMult(var2);
this.climbSpeedPow = var1.getClimbSpeedPow(var2);
this.climbSpeedConst = var1.getClimbSpeedConst(var2);
this.minDescentAnimationHeight = var1.getMinDescentAnimationHeight(var2);
this.descendFlatness = var1.getDescendForwardAmount(var2);
this.descendSpeedCompensation = var1.getDescendSpeedCompensation(var2);
this.maxDropHeight = var1.getMaxDropHeight(var2);
this.maxDropHeightRelaxed = this.maxDropHeight + var1.getMaxDropHeightRelaxedAdjustment(var2);
this.fenceBlockSet = var1.getFenceBlockSet();
this.minHover = var1.getMinHover();
this.maxHover = var1.getMaxHover();
this.minHoverClimb = var1.getMinHoverClimb();
this.minHoverDrop = var1.getMinHoverDrop();
this.floatsDown = var1.isFloatsDown();
this.hoverFreq = var1.getHoverFreq();
this.hoverCycle = this.hoverFreq > 0.0 ? 1.0F / (float)this.hoverFreq : 0.0F;
this.maxWalkSpeedAfterHitMultiplier = var1.getMaxWalkSpeedAfterHitMultiplier();
this.descentAnimationType = var1.getDescentAnimationType(var2);
this.descentSteepness = var1.getDescentSteepness(var2);
this.descentBlending = var1.getDescentBlending(var2);
}
@Nonnull
@Override
class="kw">public String getType() {
class="kw">return "Walk";
}
@Nonnull
@Override
class="kw">public Set<MovementMode> getSupportedMovementModes() {
class="kw">return SUPPORTED_MOVEMENT_MODES;
}
@Nonnull
@Override
class="kw">public Set<MovementMode> getDefaultSpawnMovementModes() {
assert this.role != null;
if (this.role.isBreathesInAir()) {
class="kw">return Set.of(MovementMode.WALK);
}
assert this.role.isBreathesInWater();
class="kw">return Set.of(MovementMode.UNDERWATER_WALK);
}
@Override
class="kw">public void spawned() {
this.position.y = this.position.y + this.minHover;
}
@Override
class="kw">public double getWanderVerticalMovementRatio() {
class="kw">return 0.0;
}
@Nonnull
@Override
class="kw">public MotionController.VerticalRange getDesiredVerticalRange(@Nonnull Ref<EntityStore> var1, @Nonnull ComponentAccessor<EntityStore> var2) {
TransformComponent var3 = var2.getComponent(var1, TransformComponent.getComponentType());
assert var3 != null;
this.verticalRange.set(var3.getPosition().y(), 0.0, 320.0);
class="kw">return this.verticalRange;
}
@Override
class="kw">protected void adjustReadPosition(Ref<EntityStore> var1, ComponentAccessor<EntityStore> var2) {
NPCEntity var3 = var2.getComponent(var1, NPCEntity.getComponentType());
assert var3 != null;
this.position.y = this.position.y - var3.getHoverHeight();
}
@Override
class="kw">protected void adjustWritePosition(Ref<EntityStore> var1, double var2, @Nonnull ComponentAccessor<EntityStore> var4) {
NPCEntity var5 = var4.getComponent(var1, NPCEntity.getComponentType());
assert var5 != null;
if (this.maxHover > 0.0 && this.hoverCycle > 0.0F && var2 > 0.0) {
double var6 = var5.getHoverHeight();
float var8 = var5.getHoverPhase();
if (this.switchedToMotionKind(MotionKind.DROPPING) || this.switchedToMotionKind(MotionKind.DESCENDING)) {
double var14 = this.maxHover - var6;
double var15 = this.dropDistance(this.position, var14, var4);
if (var15 < var14) {
var14 = var15;
} else {
var8 = this.hoverCycle / 2.0F;
}
var6 += var14;
this.position.y -= var14;
} else if (this.switchedToMotionKind(MotionKind.ASCENDING)) {
double var9 = var6 - this.minHoverClimb;
if (var9 > this.climbUpDistance) {
var9 = this.climbUpDistance;
} else {
var8 = 0.0F;
}
var6 -= var9;
this.position.y += var9;
this.climbUpDistance -= var9;
} else if (var6 < this.minHover) {
var6 += var2 * this.computeClimbSpeed(this.moveSpeed);
if (var6 >= this.minHover) {
var6 = this.minHover;
var8 = 0.0F;
}
} else if (STATE_CAN_HOVER.contains(this.getMotionKind())) {
var8 = (var8 + (float)var2) % this.hoverCycle;
double var13 = (float) (Math.PI * 2) / this.hoverCycle;
double var11 = TrigMathUtil.cos(var13 * var8 - (float) (Math.PI / 2)) * var13;
var6 += var2 * var11 * (this.maxHover - this.minHover) / 2.0;
if (var6 <= this.minHover) {
var6 = this.minHover;
var8 = 0.0F;
} else if (var6 >= this.maxHover) {
var6 = this.maxHover;
var8 = this.hoverCycle / 2.0F;
}
}
var5.setHoverPhase(var8);
var5.setHoverHeight(var6);
}
this.position.y = this.position.y + var5.getHoverHeight();
}
@Override
class="kw">protected void updateAscendingStates(
@Nonnull Ref<EntityStore> var1, @Nonnull MovementStates var2, boolean var3, boolean var4, @Nonnull ComponentAccessor<EntityStore> var5
) {
if (!this.jumping) {
class="kw">switch (this.ascentAnimationType) {
case Walk:
var2.jumping = false;
var2.idle = false;
var2.flying = false;
break;
case Jump:
var2.jumping = true;
var2.idle = false;
var2.flying = false;
break;
case Climb:
var2.jumping = false;
var2.idle = false;
var2.flying = false;
var2.climbing = true;
break;
case Fly:
var2.jumping = false;
var2.idle = false;
var2.flying = true;
break;
case Idle:
var2.jumping = false;
var2.idle = true;
var2.flying = false;
}
} else {
NPCEntity var6 = var5.getComponent(var1, NPCEntity.getComponentType());
assert var6 != null;
var2.jumping = this.jumping;
var2.idle = false;
var2.flying = var6.getHoverHeight() > 0.0;
}
var2.horizontalIdle = var4;
var2.falling = false;
var2.running = var3;
var2.walking = !var3;
var2.sprinting = false;
var2.swimming = false;
}
@Override
class="kw">protected void updateDescendingStates(
@Nonnull Ref<EntityStore> var1, @Nonnull MovementStates var2, boolean var3, boolean var4, @Nonnull ComponentAccessor<EntityStore> var5
) {
if (this.predictedFallHeight >= this.minDescentAnimationHeight - 1.0E-5) {
class="kw">switch (this.descentAnimationType) {
case Walk:
var2.falling = false;
var2.idle = false;
var2.running = var3;
var2.walking = !var3;
var2.flying = var4;
break;
case Fall:
var2.falling = true;
var2.idle = false;
var2.running = false;
var2.walking = false;
var2.flying = false;
break;
case Idle:
var2.falling = false;
var2.idle = true;
var2.running = false;
var2.walking = false;
var2.flying = var4;
}
} else {
var2.falling = false;
var2.idle = false;
var2.running = var3;
var2.walking = !var3;
var2.flying = var4;
}
var2.horizontalIdle = false;
var2.swimming = false;
var2.jumping = false;
var2.sprinting = false;
}
@Override
class="kw">public boolean isFastMotionKind(double var1) {
boolean var3 = this.fastMotionKind;
if (this.jumping && this.getMotionKind() == MotionKind.ASCENDING) {
class="kw">return var3;
}
double var4;
if (var3) {
var4 = this.fastMotionThreshold - this.fastMotionThresholdRange;
} else {
var4 = this.fastMotionThreshold + this.fastMotionThresholdRange;
}
var4 *= this.maxHorizontalSpeed;
class="kw">return var1 > var4;
}
@Override
class="kw">public boolean isInProgress() {
MotionKind var1 = this.getMotionKind();
class="kw">return var1 == MotionKind.ASCENDING || var1 == MotionKind.DESCENDING || var1 == MotionKind.DROPPING;
}
class="kw">private boolean isOnSolidGround() {
class="kw">return this.onGround && this.belowBlockType != null && this.belowBlockType.getMaterial() == BlockMaterial.Solid;
}
@Override
class="kw">public boolean canSteer(@Nonnull Ref<EntityStore> var1, @Nonnull ComponentAccessor<EntityStore> var2) {
class="kw">return super.canSteer(var1, var2) && this.isOnSolidGround();
}
@Nullable
@Override
class="kw">public String canSteerFailReason(@Nonnull Ref<EntityStore> var1, @Nonnull ComponentAccessor<EntityStore> var2) {
String var3 = super.canSteerFailReason(var1, var2);
if (var3 != null) {
class="kw">return var3;
} else if (!this.onGround) {
class="kw">return "OFF_GROUND";
} else if (this.belowBlockType == null) {
class="kw">return "NO_BLOCK_BELOW";
} else {
class="kw">return this.belowBlockType.getMaterial() != BlockMaterial.Solid ? "NO_SOLID_BLOCK_BELOW" : null;
}
}
@Override
class="kw">public void updateModelParameters(Ref<EntityStore> var1, Model var2, @Nonnull Box var3, ComponentAccessor<EntityStore> var4) {
super.updateModelParameters(var1, var2, var3, var4);
float var5 = var2 != null ? var2.getEyeHeight(var1, var4) : 0.0F;
this.collisionBoundingBox.max.y = this.collisionBoundingBox.max.y + this.maxHover;
this.breathingDepth = 1.0E-5 + var5;
if (this.role.isBreathesInAir() && this.role.isBreathesInWater()) {
this.constraintDepth = this.breathingDepth;
} else if (this.role.isBreathesInAir()) {
this.constraintDepth = Math.min(0.25, this.breathingDepth / 2.0);
} else {
this.constraintDepth = 1.0E-5;
}
int var6 = (int)(MathUtil.fastCeil(this.collisionBoundingBox.width() + 1.0) * MathUtil.fastCeil(this.collisionBoundingBox.depth() + 1.0));
this.footingBlocks = new int[var6];
this.footingFillers = new short[var6];
this.footingRotations = new byte[var6];
this.footingBlocksValid = false;
}
@Override
class="kw">public void constrainRotations(Role var1, @Nonnull TransformComponent var2) {
Rotation3f var3 = var2.getRotation();
var3.setPitch(0.0F);
var3.setRoll(0.0F);
}
@Override
class="kw">public void setVelocity(@Nonnull Vector3dc var1, VelocityConfig var2, boolean var3) {
super.setVelocity(var1, var2, var3);
this.onGround = false;
}
@Override
class="kw">public boolean inAir() {
class="kw">return !this.onGround && !this.inWater;
}
@Override
class="kw">public boolean onGround() {
class="kw">return this.onGround;
}
@Override
class="kw">public boolean standingOnBlockOfType(int var1) {
class="kw">return BlockSetModule.getInstance().blockInSet(var1, this.belowBlockType);
}
@Override
class="kw">public boolean inWater() {
class="kw">return this.inWater;
}
@Override
class="kw">public boolean touchesWater(boolean var1, @Nonnull ComponentAccessor<EntityStore> var2) {
class="kw">return this.inWater;
}
@Override
class="kw">public double getCurrentSpeed() {
class="kw">return this.moveSpeed;
}
@Override
class="kw">public double getCurrentTurnRadius() {
class="kw">return 0.0;
}
@Override
class="kw">public float getMaxClimbAngle() {
class="kw">return 0.0F;
}
@Override
class="kw">public float getMaxSinkAngle() {
class="kw">return 0.0F;
}
@Override
class="kw">public double getMaxClimbHeight() {
class="kw">return this.maxClimbHeight;
}
@Override
class="kw">public double getMaxDropHeight() {
class="kw">return this.maxDropHeight;
}
@Override
class="kw">public double getMaximumSpeed() {
class="kw">return this.maxHorizontalSpeed * this.horizontalSpeedMultiplier * this.effectHorizontalSpeedMultiplier;
}
@Override
class="kw">public boolean is2D() {
class="kw">return true;
}
@Override
class="kw">public boolean canRestAtPlace() {
class="kw">return true;
}
@Override
class="kw">public double getDesiredAltitudeWeight() {
class="kw">return 0.0;
}
@Override
class="kw">public double getHeightOverGround() {
class="kw">return 0.0;
}
@Override
class="kw">public boolean estimateVelocity(@Nonnull Steering var1, @Nonnull Vector3d var2) {
if (var1.hasTranslation()) {
var2.set(var1.getTranslation()).mul(this.getCurrentSpeed());
class="kw">return true;
} else {
var2.zero();
class="kw">return false;
}
}
@Override
class="kw">public void setMotionKind(MotionKind var1) {
if (!VALID_MOTIONS.contains(var1)) {
var1 = MotionKind.STANDING;
}
super.setMotionKind(var1);
}
@Override
class="kw">public void postReadPosition(@Nonnull Ref<EntityStore> var1, @Nonnull ComponentAccessor<EntityStore> var2) {
if (!this.footingPosition.equals(this.position)) {
this.footingBlocksValid = false;
this.footingPosition.set(this.position);
}
World var3 = var2.getExternalData().getWorld();
boolean var4 = this.onGround;
double var5 = this.position.y + this.collisionBoundingBox.min.y;
int var7 = MathUtil.floor(var5);
if (var5 - var7 < 1.0E-5) {
var7--;
}
if (var7 >= 0 && var7 <= 319) {
double var8 = this.position.x > 0.0 ? this.position.x + MathUtil.EPSILON_DOUBLE : this.position.x - MathUtil.EPSILON_DOUBLE;
double var10 = this.position.z > 0.0 ? this.position.z + MathUtil.EPSILON_DOUBLE : this.position.z - MathUtil.EPSILON_DOUBLE;
long var12 = MathUtil.fastFloor(var8 + this.collisionBoundingBox.min.x);
long var14 = MathUtil.fastFloor(var8 + this.collisionBoundingBox.max.x);
long var16 = MathUtil.fastFloor(var10 + this.collisionBoundingBox.min.z);
long var18 = MathUtil.fastFloor(var10 + this.collisionBoundingBox.max.z);
int var20 = ChunkUtil.chunkCoordinate(var12);
int var21 = ChunkUtil.chunkCoordinate(var14);
int var22 = ChunkUtil.chunkCoordinate(var16);
int var23 = ChunkUtil.chunkCoordinate(var18);
boolean var24 = !this.footingBlocksValid;
int var25 = 0;
this.footingBlocksValid = true;
ChunkStore var26 = var3.getChunkStore();
Store var27 = var26.getStore();
label279:
for (int var28 = var20; var28 <= var21; var28++) {
for (int var29 = var22; var29 <= var23; var29++) {
Ref var30 = var26.getChunkReference(ChunkUtil.indexChunk(var28, var29));
BlockChunk var31 = var30 != null && var30.isValid() ? var27.getComponent(var30, BlockChunk.getComponentType()) : null;
if (var31 == null) {
this.footingBlocksValid = false;
this.belowBlockType = null;
this.belowBlockTypeId = 0;
this.onGround = false;
break label279;
}
int var32 = var28 == var20 ? ChunkUtil.localCoordinate(var12) : 0;
int var33 = var28 == var21 ? ChunkUtil.localCoordinate(var14) : 31;
int var34 = var29 == var22 ? ChunkUtil.localCoordinate(var16) : 0;
int var35 = var29 == var23 ? ChunkUtil.localCoordinate(var18) : 31;
BlockSection var36 = var31.getSectionAtBlockY(var7);
for (int var37 = var32; var37 <= var33; var37++) {
for (int var38 = var34; var38 <= var35; var38++) {
int var39 = var36.get(var37, var7, var38);
if (var24 || var39 != this.footingBlocks[var25]) {
this.footingBlocks[var25] = var39;
this.footingFillers[var25] = (short)var36.getFiller(var37, var7, var38);
this.footingRotations[var25] = (byte)var36.getRotationIndex(var37, var7, var38);
var24 = true;
}
var25++;
}
}
}
}
if (var24 && this.footingBlocksValid) {
this.belowBlockType = null;
this.onGround = false;
this.belowBlockTypeId = 0;
BoxBlockIntersectionEvaluator var66 = this.collisionResult.getBoxBlockIntersection();
var66.setBox(this.collisionBoundingBox, this.footingPosition);
Vector3dc var67 = var66.getWorldUp();
int var68;
if (var67.y() != 0.0) {
var68 = 40;
} else if (var67.x() != 0.0) {
var68 = 48;
} else {
var68 = 24;
}
var25 = 0;
label241:
for (int var69 = var20; var69 <= var21; var69++) {
int var70 = ChunkUtil.minBlock(var69);
for (int var71 = var22; var71 <= var23; var71++) {
int var72 = ChunkUtil.minBlock(var71);
int var73 = var69 == var20 ? ChunkUtil.localCoordinate(var12) : 0;
int var74 = var69 == var21 ? ChunkUtil.localCoordinate(var14) : 31;
int var75 = var71 == var22 ? ChunkUtil.localCoordinate(var16) : 0;
int var76 = var71 == var23 ? ChunkUtil.localCoordinate(var18) : 31;
for (int var77 = var73; var77 <= var74; var77++) {
for (int var40 = var75; var40 <= var76; var40++) {
int var41 = this.footingRotations[var25];
int var42 = this.footingFillers[var25];
int var43 = this.footingBlocks[var25++];
if (var43 != 0) {
BlockType var44 = BlockType.getAssetMap().getAsset(var43);
int var45 = var70 + var77;
int var46 = var72 + var40;
int var47 = var7;
if (var42 != 0) {
var45 -= FillerBlockUtil.unpackX(var42);
var47 -= FillerBlockUtil.unpackY(var42);
var46 -= FillerBlockUtil.unpackZ(var42);
}
BlockMaterial var48 = var44.getMaterial();
if (var48 == BlockMaterial.Solid) {
BlockBoundingBoxes var49 = BlockBoundingBoxes.getAssetMap().getAsset(var44.getHitboxTypeIndex());
BlockBoundingBoxes.RotatedVariantBoxes var50 = var49.get(var41);
int var51 = var66.intersectBoxComputeOnGround(var50.getBoundingBox(), var45, var47, var46);
if (!CollisionMath.isDisjoint(var51)) {
if (var50.hasDetailBoxes()) {
for (Box var55 : var50.getDetailBoxes()) {
var51 = var66.intersectBoxComputeOnGround(var55, var45, var47, var46);
if (var66.isOnGround() && (var51 & var68) == var68) {
this.belowBlockType = var44;
this.belowBlockTypeId = var43;
this.onGround = true;
break label241;
}
}
} else if (var66.isOnGround() && (var51 & var68) == var68) {
this.belowBlockType = var44;
this.belowBlockTypeId = var43;
this.onGround = true;
break label241;
}
}
}
}
}
}
}
}
}
} else {
this.footingBlocksValid = false;
this.belowBlockType = null;
this.belowBlockTypeId = 0;
this.onGround = false;
}
if (this.shouldDebugMove(this.translation) && var4 != this.onGround) {
LOGGER.at(Level.INFO).log("eid=%d PostReadPosition: OnGround was changed from %s to %s", this.debugEntityId, var4, this.onGround);
}
int var56 = MathUtil.floor(this.position.x);
int var9 = MathUtil.floor(this.position.y + this.collisionBoundingBox.min.y);
int var57 = MathUtil.floor(this.position.z);
TransformComponent var11 = var2.getComponent(var1, TransformComponent.getComponentType());
assert var11 != null;
Ref var13 = var11.getSectionRef();
Fluid var58;
if (var13 != null && var13.isValid()) {
Store var59 = var3.getChunkStore().getStore();
FluidSection var15 = var59.getComponent(var13, FluidSection.getComponentType());
assert var15 != null;
var58 = Fluid.getAssetMap().getAsset(var15.getFluidId(var56, var9, var57));
} else {
var58 = null;
}
this.inWater = var58 != null && !var58.equals(Fluid.EMPTY);
this.horizontalSpeedMultiplier = 1.0;
if (this.inWater) {
int var60 = var58.getFluidFXIndex();
if (var60 != 0) {
FluidFX var62 = FluidFX.getAssetMap().getAsset(var60);
this.horizontalSpeedMultiplier = var62 != null && var62.getMovementSettings() != null ? var62.getMovementSettings().horizontalSpeedMultiplier : 1.0;
}
}
if (var13 != null && var13.isValid()) {
PositionDataComponent var61 = var2.getComponent(var1, PositionDataComponent.getComponentType());
assert var61 != null;
Store var63 = var3.getChunkStore().getStore();
BlockSection var64 = var63.getComponent(var13, BlockSection.getComponentType());
assert var64 != null;
var61.setInsideBlockTypeId(var64.get(var56, var9, var57));
var61.setStandingOnBlockTypeId(this.belowBlockTypeId);
}
}
@Override
class="kw">public boolean translateToAccessiblePosition(@Nonnull Vector3d var1, @Nullable Box var2, double var3, double var5, ComponentAccessor<EntityStore> var7) {
if (var5 < var3) {
class="kw">return false;
}
if (var3 < 0.0) {
var3 = 0.0;
}
if (var5 > 320.0) {
var5 = 320.0;
}
if (var2 == null) {
class="kw">return translateToAccessiblePosition(var1, var3, var5, var7) > 0;
}
int var8 = MathUtil.floor(var2.min.x + var1.x);
int var9 = MathUtil.floor(var2.max.x + var1.x);
int var10 = MathUtil.floor(var2.min.z + var1.z);
int var11 = MathUtil.floor(var2.max.z + var1.z);
double var12 = var1.y;
double var14 = var1.y + var2.min.y;
double var16 = -1.0;
if (var9 - var8 > 2 || var11 - var10 > 2) {
var1.y = var14;
int var18 = translateToAccessiblePosition(var1, var3, var5, var7);
if (var18 < 0) {
var1.y = var12;
class="kw">return false;
}
if (var18 > 0 && var1.y > var16) {
var16 = var1.y;
var3 = var16;
if (var16 > var14) {
var14 = var16;
}
}
}
for (int var19 = var8; var19 <= var9; var19++) {
for (int var20 = var10; var20 <= var11; var20++) {
var1.y = var14;
int var21 = translateToAccessiblePosition(var1, var3, var5, var7);
if (var21 < 0) {
var1.y = var12;
class="kw">return false;
}
if (var21 > 0 && var1.y > var16) {
var16 = var1.y;
var3 = var16;
if (var16 > var14) {
var14 = var16;
}
}
}
}
if (var16 < 0.0) {
var1.y = var12;
class="kw">return false;
} else {
var1.y = var16 - var2.min.y;
class="kw">return true;
}
}
class="kw">public class="kw">static int translateToAccessiblePosition(@Nonnull Vector3d var0, double var1, double var3, @Nonnull ComponentAccessor<EntityStore> var5) {
if (var0.y() < 0.0) {
class="kw">return -1;
}
World var6 = var5.getExternalData().getWorld();
long var7 = ChunkUtil.indexChunkFromBlock(var0.x(), var0.z());
ChunkStore var9 = var6.getChunkStore();
Ref var10 = var9.getChunkReference(var7);
if (var10 != null && var10.isValid()) {
Store var11 = var9.getStore();
WorldChunk var12 = var11.getComponent(var10, WorldChunk.getComponentType());
if (var12 == null) {
class="kw">return -1;
}
BlockChunk var13 = var11.getComponent(var10, BlockChunk.getComponentType());
if (var13 == null) {
class="kw">return -1;
}
BlockTypeAssetMap var14 = BlockType.getAssetMap();
int var15 = MathUtil.floor(var0.x());
int var16 = MathUtil.floor(var0.y());
int var17 = MathUtil.floor(var0.z());
if (var16 < 320) {
int var18 = var13.getBlock(var15, var16, var17);
if (var18 != 0) {
BlockType var19 = var14.getAsset(var18);
int var20 = var12.getFiller(var15, var16, var17);
boolean var21 = var20 != 0;
if (var21 || var19.getMaterial() == BlockMaterial.Solid) {
int var22;
for (var22 = MathUtil.ceil(var3); var16 < var22; var16++) {
var18 = var13.getBlock(var15, var16, var17);
if (var18 == 0) {
break;
}
var19 = var14.getAsset(var18);
var20 = var12.getFiller(var15, var16, var17);
if (var19.getMaterial() != BlockMaterial.Solid) {
break;
}
}
if (var16 == var22) {
class="kw">return 0;
}
var19 = var12.getBlockType(var15, --var16, var17);
int var23 = var12.getRotationIndex(var15, var16, var17);
BlockBoundingBoxes var26 = BlockBoundingBoxes.getAssetMap().getAsset(var19.getHitboxTypeIndex());
BlockBoundingBoxes.RotatedVariantBoxes var27 = var26.get(var23);
double var24;
if (var20 != 0) {
var24 = var16 - FillerBlockUtil.unpackY(var20) + var27.getBoundingBox().max.y;
} else {
var24 = var16 + var27.getBoundingBox().max.y;
}
if (var24 > var3) {
class="kw">return 0;
}
var0.y = var24;
class="kw">return 1;
}
}
} else {
var16 = 319;
}
int var31 = ChunkUtil.indexSection(var16);
while (var31 >= 0) {
BlockSection var34 = var13.getSectionAtIndex(var31);
if (var34.isSolidAir()) {
var16 = 32 * var31 - 1;
if (var16 < var1) {
class="kw">return 0;
}
var31--;
} else {
int var35 = 32 * var31--;
while (var16 >= var35) {
if (var16 < var1) {
class="kw">return 0;
}
int var36 = var34.getRotationIndex(var15, var16, var17);
int var37 = var34.getFiller(var15, var16, var17);
int var38 = var34.get(var15, var16--, var17);
if (var38 != 0) {
BlockType var39 = var14.getAsset(var38);
if (var37 != 0) {
if (var39.getMaterial() == BlockMaterial.Solid) {
BlockBoundingBoxes var25 = BlockBoundingBoxes.getAssetMap().getAsset(var39.getHitboxTypeIndex());
BlockBoundingBoxes.RotatedVariantBoxes var41 = var25.get(var36);
double var43 = var16 + 1 - FillerBlockUtil.unpackY(var37) + var41.getBoundingBox().max.y;
if (var43 < var1) {
class="kw">return 0;
}
var0.y = var43;
class="kw">return 1;
}
} else if (var39.getMaterial() == BlockMaterial.Solid) {
BlockBoundingBoxes var40 = BlockBoundingBoxes.getAssetMap().getAsset(var39.getHitboxTypeIndex());
BlockBoundingBoxes.RotatedVariantBoxes var42 = var40.get(var36);
double var44 = var16 + 1 + var42.getBoundingBox().max.y;
if (var44 < var1) {
class="kw">return 0;
}
var0.y = var44;
class="kw">return 1;
}
}
}
}
}
class="kw">return 0;
} else {
class="kw">return -1;
}
}
@Override
class="kw">protected double computeMove(
@Nonnull Ref<EntityStore> var1,
@Nonnull Role var2,
@Nonnull Steering var3,
double var4,
@Nonnull Vector3d var6,
@Nonnull ComponentAccessor<EntityStore> var7
) {
NPCEntity var8 = var7.getComponent(var1, NPCEntity.getComponentType());
assert var8 != null;
this.saveMotionKind();
this.isFullyRotated = true;
Vector3d var9 = var3.getTranslation();
var9.y = 0.0;
this.currentRelativeSpeed = var9.length();
if (!var3.hasPitch()) {
var3.setPitch(0.0F);
}
double var10 = this.inWater() ? this.maxVerticalSpeedFluid : this.maxVerticalSpeed;
double var12 = this.getMaximumSpeed();
boolean var14 = !this.isAlive(var1, var7);
if (var14 && !this.isForcePushed()) {
this.climbUpDistance = 0.0;
this.currentClimbForwardDistance = 0.0;
this.maxClimbForwardDistance = 0.0;
var3.setYaw(this.getYaw());
if (this.onGround) {
var6.zero();
var3.setPitch(0.0F);
} else {
var3.setPitch(this.getPitch());
Velocity var31 = var7.getComponent(var1, Velocity.getComponentType());
Vector3d var39 = var31.getVelocity();
var6.set(var39);
}
var6.y = this.computeNewFallSpeed(var4, var6.y);
var6.mul(var4);
this.validateTranslation(var6, "Death");
class="kw">return var4;
} else if (this.isForcePushed()) {
this.climbUpDistance = 0.0;
this.currentClimbForwardDistance = 0.0;
this.maxClimbForwardDistance = 0.0;
var6.set(this.externalVelocity);
for (int var28 = 0; var28 < this.appliedVelocities.size(); var28++) {
MotionControllerBase.AppliedVelocity var37 = this.appliedVelocities.get(var28);
if (var37.velocity.y + this.externalVelocity.y <= 0.0 || var37.velocity.y < 0.0) {
var37.canClear = true;
}
if (this.onGround && var37.canClear) {
var37.velocity.y = 0.0;
}
var6.add(var37.velocity);
}
var6.mul(var4);
if (!this.onGround || !(this.externalVelocity.y < 0.0)) {
this.externalVelocity.y = this.computeNewFallSpeed(var4, this.externalVelocity.y);
} else if (var6.y < 0.0) {
var6.y = 0.0;
this.externalVelocity.y = 0.0;
}
if (!this.appliedVelocity.equals(Vector3dUtil.ZERO)) {
if (this.moveSpeed > 0.0) {
float var29 = PhysicsMath.headingX(this.getYaw());
float var38 = PhysicsMath.headingZ(this.getYaw());
double var40 = this.appliedVelocity.x * this.appliedVelocity.x + this.appliedVelocity.z * this.appliedVelocity.z;
double var51 = var40 > 0.0 ? (var29 * this.appliedVelocity.x + var38 * this.appliedVelocity.z) / Math.sqrt(var40) : 0.0;
var51 = Math.min((var51 + 1.0) / 2.0, this.maxWalkSpeedAfterHitMultiplier);
this.moveSpeed *= var51;
if (this.moveSpeed > this.minHorizontalSpeed) {
var6.add(this.moveSpeed * var4 * var29, 0.0, this.moveSpeed * var4 * var38);
this.currentRelativeSpeed = this.moveSpeed;
} else {
this.moveSpeed = 0.0;
}
}
if (this.maxHover > 0.0) {
var8.setHoverHeight(var6.y <= 0.0 ? this.minHoverDrop : this.maxHover);
}
this.appliedVelocity.zero();
}
if (this.onGround && this.ignoreDamping) {
double var30 = this.externalVelocity.length() - var4 * this.inertia * this.acceleration * 5.0;
if (var30 > 0.0) {
this.externalVelocity.normalize(var30);
} else {
this.externalVelocity.zero();
}
}
var3.setYaw(this.getYaw());
this.validateTranslation(var6, "ExtForce");
class="kw">return var4;
} else {
if (this.cachedMovementBlocked) {
class="kw">return var4;
}
float var15 = this.getYaw();
if (this.getMotionKind() == MotionKind.ASCENDING) {
if (this.isRequiresPreciseMovement() && this.havePreciseMovementTarget) {
double var33 = this.waypointDistance(this.preciseMovementTarget, this.position) + this.currentClimbForwardDistance;
if (var33 < this.maxClimbForwardDistance) {
this.maxClimbForwardDistance = var33;
}
}
double var34 = var4 * this.climbSpeed;
if (this.jumping) {
if (this.climbUpDistance > 0.0) {
var34 *= Math.max(Math.pow(this.climbUpDistance * this.climbUpDistance * this.jumpForce, this.jumpBlending), 1.0);
this.climbUpDistance = this.computeClimbMove(this.climbUpDirection, this.climbUpDistance, var34, var6);
} else if (this.jumpDropHeight > 0.0) {
double var44 = this.currentJumpHeight - this.jumpDropHeight;
var34 *= Math.max(Math.pow(var44 * var44 * this.jumpDescentSteepness, this.jumpDescentBlending), 1.0);
this.jumpDropHeight = this.computeClimbMove(this.jumpDropDirection, this.jumpDropHeight, var34, var6);
} else {
this.setMotionKind(MotionKind.DROPPING);
}
double var45 = this.currentJumpHeight - this.climbUpDistance - var6.y;
double var57 = 0.0;
if (var45 > this.jumpBlockHeight) {
double var62;
if (this.climbUpDistance > 0.0) {
var62 = (var45 - this.jumpBlockHeight) / var45 / 2.0;
} else {
var62 = 0.5 + (1.0 - this.jumpDropHeight / (this.currentJumpHeight - this.jumpBlockHeight)) / 2.0;
}
double var24 = this.maxClimbForwardDistance * var62;
if (var24 > this.maxClimbForwardDistance) {
var24 = this.maxClimbForwardDistance;
}
var57 = var24 - this.currentClimbForwardDistance;
if (var57 < 0.0) {
var57 = 0.0;
}
this.currentClimbForwardDistance = var24;
var6.add(this.climbForwardDirection.x * var57, 0.0, this.climbForwardDirection.z * var57);
}
if (this.isBlendingHeading) {
var15 = this.computeBlendHeading(
var15,
NPCPhysicsMath.headingFromDirection(this.climbForwardDirection.x, this.climbForwardDirection.z, var15),
var4,
var57 / var4,
var3.getRelativeTurnSpeed()
);
}
this.lockOrientation(var3, var6, var15);
this.fallSpeed = 0.0;
this.onGround = false;
this.validateTranslation(var6, "AscendingJump");
class="kw">return var4;
} else {
double var43;
if (this.climbUpDistance > 0.0) {
double var55 = this.climbUpDistance;
this.climbUpDistance = this.computeClimbMove(this.climbUpDirection, var55, var34, var6);
var43 = var55 - this.climbUpDistance;
} else if (this.currentClimbForwardDistance < this.maxClimbForwardDistance) {
double var56 = this.maxClimbForwardDistance - this.currentClimbForwardDistance;
if (var34 < var56) {
double var22 = var56 - var34;
var43 = var22 <= 1.0E-5 ? var56 : var34;
} else {
var43 = var56;
}
this.currentClimbForwardDistance += var43;
var6.set(this.climbForwardDirection).mul(var43);
this.onGround = false;
} else {
this.setMotionKind(MotionKind.DROPPING);
var43 = 0.0;
}
if (this.isBlendingHeading) {
var15 = this.computeBlendHeading(
var15,
NPCPhysicsMath.headingFromDirection(this.climbForwardDirection.x, this.climbForwardDirection.z, var15),
var4,
var43 / var4,
var3.getRelativeTurnSpeed()
);
}
this.lockOrientation(var3, var6, var15);
this.fallSpeed = 0.0;
this.onGround = false;
this.validateSpeeds(var1, "Ascending", var7);
this.validateTranslation(var6, "Ascending");
class="kw">return var4;
}
} else if (this.getMotionKind() == MotionKind.DESCENDING) {
double var32 = this.currentRelativeSpeed * var12;
if (this.isRequiresPreciseMovement() && this.havePreciseMovementTarget) {
double var41 = this.waypointDistance(this.position, this.preciseMovementTarget);
if (var41 < var32 * var4) {
var32 = var41 / var4;
}
}
this.fallSpeed = MathUtil.maxValue(0.0, NPCPhysicsMath.accelerateDragCapped(this.fallSpeed, 5.0 * this.gravity, var4, var10));
this.moveSpeed = MathUtil.clamp(var32, 0.0, this.moveSpeed + var4 * this.acceleration);
if (this.moveSpeed > var12) {
this.moveSpeed = var12;
}
if (this.moveSpeed <= 0.3 * this.maxHorizontalSpeed) {
this.setMotionKind(MotionKind.DROPPING);
}
double var42 = this.climbForwardDirection.y;
if (this.predictedFallHeight > 0.0) {
this.totalDropDistance = this.totalDropDistance + Math.abs(this.climbForwardDirection.y * this.moveSpeed * var4);
double var54 = Math.min(this.totalDropDistance / this.predictedFallHeight, 1.0);
var42 *= Math.pow(this.descentSteepness, this.descentBlending) * Math.pow(var54, this.descentBlending);
}
var6.set(this.climbForwardDirection.x, var42, this.climbForwardDirection.z);
var6.mul(this.moveSpeed * var4);
var6.y = Math.min(var6.y, -this.fallSpeed * var4);
Vector3dUtil.clipToZero(var6, this.getEpsilonSpeed());
if (this.isBlendingHeading) {
var15 = this.computeBlendHeading(
var15,
NPCPhysicsMath.headingFromDirection(this.climbForwardDirection.x, this.climbForwardDirection.z, var15),
var4,
this.moveSpeed,
var3.getRelativeTurnSpeed()
);
}
this.lockOrientation(var3, var6, var15);
this.validateSpeeds(var1, "Descending", var7);
this.validateTranslation(var6, "Descending");
class="kw">return var4;
} else {
this.validateSpeeds(var1, "Enter Walk/Drop", var7);
boolean var16 = this.canSteer(var1, var7);
boolean var18 = false;
float var17;
if (var16) {
var17 = NPCPhysicsMath.headingFromDirection(var9.x, var9.z, var15);
if (this.isRequiresPreciseMovement() && !this.isBlendingHeading) {
float var19 = NPCPhysicsMath.turnAngle(var15, var17);
float var20 = this.getEpsilonAngle();
if (var19 < -var20 || var19 > var20) {
float var21 = (float)MathUtil.clamp(var4 * this.getCurrentMaxBodyRotationSpeed() * var3.getRelativeTurnSpeed(), 0.0, (float) (Math.PI / 2));
var19 = MathUtil.clamp(var19, -var21, var21);
var15 = PhysicsMath.normalizeTurnAngle(var15 + var19);
var6.set(0.0, 0.0, 0.0);
var3.setYaw(var15);
this.isFullyRotated = false;
class="kw">return var4;
}
var15 = var17;
}
this.moveSpeed = MathUtil.clamp(this.currentRelativeSpeed * var12, 0.0, this.moveSpeed + var4 * this.acceleration);
if (this.fallSpeed > 0.0) {
this.fallSpeed = 0.0;
}
if (this.moveSpeed < this.getEpsilonSpeed()) {
this.moveSpeed = 0.0;
} else if (this.moveSpeed < this.minHorizontalSpeed) {
this.moveSpeed = this.minHorizontalSpeed;
}
if (this.isBlendingHeading) {
if (this.blendRestTurnAngle > 0.0F) {
float var46 = this.computeBlendTurnAngle(var15, var17);
if (Math.abs(var46) > this.blendRestTurnAngle) {
var18 = true;
}
var15 = this.computeBlendHeading(var15, var17, var4, this.moveSpeed, var46, var3.getRelativeTurnSpeed());
} else {
var15 = this.computeBlendHeading(var15, var17, var4, this.moveSpeed, var3.getRelativeTurnSpeed());
}
var3.setYaw(var15);
this.isFullyRotated = true;
} else if (var3.hasYawOrDirection()) {
float var47 = var3.getYawOrDirection();
var15 = this.computeHeading(var47, var3.getRelativeTurnSpeed(), var15, var4, false, false);
var3.setYaw(var15);
} else if (this.moveSpeed != 0.0) {
var15 = this.computeHeading(var17, var3.getRelativeTurnSpeed(), var15, var4, true, true);
var17 = var15;
var3.setYaw(var15);
}
if (this.debugModeSteer) {
LOGGER.at(Level.INFO)
.log(
"eid=%d === Compute = t =%.4f v =%.4f h =%.4f mh=%.4f",
this.debugEntityId,
var4,
this.moveSpeed,
(180.0F / (float)Math.PI) * var15,
(180.0F / (float)Math.PI) * var17
);
}
} else {
Velocity var49 = var7.getComponent(var1, Velocity.getComponentType());
Vector3d var53 = var49.getVelocity();
var17 = NPCPhysicsMath.headingFromDirection(var53.x, var53.z, var15);
if (!var3.hasYawOrDirection()) {
var3.setYaw(var15);
}
if (this.maxHover > 0.0 && this.floatsDown) {
this.fallSpeed = this.climbSpeedConst;
if (this.fallSpeed != 0.0 && this.climbSpeedMult != 0.0) {
double var59 = this.fallSpeed;
double var23 = this.climbSpeedMult * Math.pow(var59, this.climbSpeedPow);
this.fallSpeed += var23;
}
} else {
double var58 = this.fallSpeed;
this.fallSpeed = -NPCPhysicsMath.gravityDrag(-var58, 5.0 * this.gravity, var4, var10);
}
}
if (this.moveSpeed > var12) {
this.moveSpeed = var12;
}
if (this.fallSpeed > var10) {
this.fallSpeed = var10;
} else if (this.fallSpeed < -var10) {
this.fallSpeed = -var10;
}
double var50 = this.moveSpeed;
if (var18) {
double var60 = this.blendRestRelativeSpeed * this.getMaximumSpeed();
if (var50 > var60) {
var50 = var60;
}
}
var6.x = var50 * var4 * PhysicsMath.headingX(var17);
var6.z = var50 * var4 * PhysicsMath.headingZ(var17);
var6.y = -this.fallSpeed * var4;
double var61 = var3.getMaxDistance();
if (this.canSteer(var1, var7) && var61 < Double.MAX_VALUE && var61 > 0.0) {
double var63 = NPCPhysicsMath.dotProduct(var6.x, var6.y, var6.z, this.getComponentSelector());
double var25 = Math.sqrt(var63);
if (var25 > var61) {
var6.mul(var61 / var25);
}
}
this.validateSpeeds(var1, var16 ? "Moving" : "Falling", var7);
this.validateTranslation(var6, var16 ? "Moving" : "Falling");
class="kw">return var4;
}
}
}
class="kw">private double computeNewFallSpeed(double var1, double var3) {
Box var5 = this.collisionBoundingBox;
int var6 = this.movementSettings.invertedGravity ? 1 : -1;
double var7 = var6
* PhysicsMath.getTerminalVelocity(
this.movementSettings.mass, 0.001225, Math.abs((var5.max.x - var5.min.x) * (var5.max.z - var5.min.z)), this.movementSettings.dragCoefficient
);
double var9 = PhysicsMath.getAcceleration(var3, var7) * var1;
if (var3 < var7 && var9 > 0.0) {
var3 = Math.min(var3 + var9, var7);
} else if (var3 > var7 && var9 < 0.0) {
var3 = Math.max(var3 + var9, var7);
}
class="kw">return var3;
}
class="kw">private boolean findMoveCollisions(int var1, boolean var2, @Nonnull Vector3d var3, @Nonnull ComponentAccessor<EntityStore> var4) {
this.collisionResult.setCollisionByMaterial(4, var1);
this.resetObstructedFlags();
if (this.debugModeBlockCollisions) {
this.collisionResult.setLogger(LOGGER, this.debugEntityId);
}
boolean var5 = this.collisionResult.setDamageBlocking(var2);
boolean var6 = !CollisionModule.findCollisions(this.collisionBoundingBox, this.position, var3, false, this.collisionResult, var4);
this.collisionResult.setDamageBlocking(var5);
if (this.debugModeBlockCollisions) {
this.collisionResult.setLogger(null);
}
if (this.debugModeCollisions) {
this.dumpCollisionResults();
}
class="kw">return var6;
}
class="kw">private double finishPhysicsCollision(@Nonnull Ref<EntityStore> var1, double var2, double var4, @Nonnull ComponentAccessor<EntityStore> var6) {
this.processTriggers(var1, this.collisionResult, var4, var6);
var2 *= var4;
if (this.debugModeValidatePositions && !this.isValidPosition(this.position, this.collisionResult, var6)) {
LOGGER.at(Level.WARNING)
.log("eid=%d Move: Physics moved to invalid position pos=%s/%s/%s", this.debugEntityId, this.position.x, this.position.y, this.position.z);
}
class="kw">return var2;
}
class="kw">private double executePhysicsMove(@Nonnull Ref<EntityStore> var1, double var2, @Nonnull Vector3d var4, @Nonnull ComponentAccessor<EntityStore> var5) {
this.findMoveCollisions(13, false, var4, var5);
BlockCollisionData var6 = this.collisionResult.getFirstBlockCollision();
this.lastValidPosition.set(this.position);
boolean var7 = this.onGround;
if (var6 == null) {
double var16;
double var19;
if (this.collisionResult.isSliding) {
var16 = this.collisionResult.slideStart;
var19 = this.collisionResult.slideEnd;
} else {
var16 = Double.MAX_VALUE;
var19 = Double.MAX_VALUE;
}
this.position.add(var4);
this.onGround = var16 <= 1.0 && var19 >= 1.0;
double var20 = 1.0;
if (this.onGround) {
this.setMotionKind(MotionKind.STANDING);
} else {
this.setMotionKind(MotionKind.DROPPING);
if (var7) {
this.fallStartHeight = this.position.y;
this.fallSpeed = 0.0;
}
}
if (!this.isValidPosition(this.position, this.collisionResult, var5)) {
double var14 = this.bisect(this.lastValidPosition, this.position, this.position, var5);
var20 *= var14;
if (this.debugModeMove) {
LOGGER.at(Level.INFO)
.log(
"eid=%d Move: Physics no-collision bisect scale=%s newpos=%s state=%s",
this.debugEntityId,
var14,
Vector3dUtil.formatShortString(this.position),
this.getMotionKind()
);
}
if (var14 == 0.0) {
this.isObstructed = true;
}
} else if (this.shouldDebugMove(var4)) {
LOGGER.at(Level.INFO)
.log(
"eid=%d Move: Physics no-collision onGround=%s newpos=%s state=%s",
this.debugEntityId,
this.onGround,
Vector3dUtil.formatShortString(this.position),
this.getMotionKind()
);
}
this.processTriggers(var1, this.collisionResult, var20, var5);
if (this.debugModeValidatePositions && !this.isValidPosition(this.position, this.collisionResult, var5)) {
LOGGER.at(Level.WARNING)
.log("eid=%d Move: Physics moved to invalid position pos=%s/%s/%s", this.debugEntityId, this.position.x, this.position.y, this.position.z);
}
class="kw">return var2;
} else {
double var8 = var6.collisionStart;
this.position.set(var6.collisionPoint);
this.tmpMovePosition.set(this.lastValidPosition).add(var4).sub(var6.collisionPoint);
if (!this.tmpMovePosition.equals(Vector3dUtil.ZERO)) {
double var10 = this.tmpMovePosition.dot(var6.collisionNormal);
this.tmpMovePosition.fma(-var10, var6.collisionNormal);
this.position.add(this.tmpMovePosition);
}
if (!this.isValidPosition(this.position, this.collisionResult, var5)) {
double var17 = this.bisect(this.lastValidPosition, this.position, this.position, var5);
var8 *= var17;
if (this.debugModeMove) {
LOGGER.at(Level.INFO).log("eid=%d Move: Physics collision bisect=%s triggerScale=%s", this.debugEntityId, var17, var8);
}
}
if (!this.isForcePushed()) {
if (var6.collisionNormal.equals(this.getWorldNormal())) {
this.setMotionKind(MotionKind.STANDING);
if (!this.onGround) {
this.onGround = true;
this.postReadPosition(var1, var5);
}
this.fallSpeed = 0.0;
if (this.debugModeMove) {
LOGGER.at(Level.INFO)
.log(
"eid=%d Move: Physics ground collision onGround=%s newpos=%s state=%s",
this.debugEntityId,
this.onGround,
Vector3dUtil.formatShortString(this.position),
this.getMotionKind()
);
}
class="kw">return this.finishPhysicsCollision(var1, var2, var8, var5);
} else if (var6.collisionNormal.equals(this.getWorldAntiNormal())) {
this.fallSpeed = 0.0;
this.setMotionKind(MotionKind.DROPPING);
if (this.debugModeMove) {
LOGGER.at(Level.INFO)
.log(
"eid=%d Move: Physics ceiling collision newpos=%s state=%s",
this.debugEntityId,
Vector3dUtil.formatShortString(this.position),
this.getMotionKind()
);
}
class="kw">return this.finishPhysicsCollision(var1, var2, var8, var5);
} else {
this.isObstructed = true;
this.setMotionKind(MotionKind.STANDING);
if (this.debugModeMove) {
LOGGER.at(Level.INFO)
.log(
"eid=%d Move: Physics wall collision newpos=%s state=%s",
this.debugEntityId,
Vector3dUtil.formatShortString(this.position),
this.getMotionKind()
);
}
class="kw">return this.finishPhysicsCollision(var1, var2, var8, var5);
}
} else {
if (this.ignoreDamping) {
this.ignoreDamping = false;
this.clearExternalVelocity();
}
int var18 = this.collisionResult.getBlockCollisionCount();
for (int var11 = 0; var11 < var18; var11++) {
BlockCollisionData var12 = this.collisionResult.getBlockCollision(var11);
if (var12.collisionNormal.equals(this.getWorldNormal())) {
this.onGround = true;
this.fallSpeed = 0.0;
break;
}
}
this.setMotionKind(MotionKind.DROPPING);
if (var6.collisionNormal.equals(this.getWorldAntiNormal())) {
this.fallSpeed = 0.0;
}
if (this.debugModeMove) {
LOGGER.at(Level.INFO)
.log(
"eid=%d Move: Physics force-push collision normal=%s onGround=%s newpos=%s state=%s",
this.debugEntityId,
var6.collisionNormal,
this.onGround,
Vector3dUtil.formatShortString(this.position),
this.getMotionKind()
);
}
class="kw">return this.finishPhysicsCollision(var1, var2, var8, var5);
}
}
}
@Override
class="kw">protected double executeMove(
@Nonnull Ref<EntityStore> var1, @Nonnull Role var2, double var3, @Nonnull Vector3d var5, @Nonnull ComponentAccessor<EntityStore> var6
) {
if (this.shouldDebugMove(var5)) {
LOGGER.at(Level.INFO)
.log(
"eid=%d Move: Execute pos=%s vel=%s onGround=%s blocked=%s solidGround=%s avdDmg=%s relax=%s",
this.debugEntityId,
Vector3dUtil.formatShortString(this.position),
Vector3dUtil.formatShortString(var5),
this.onGround,
this.isObstructed,
this.isOnSolidGround(),
this.isAvoidingBlockDamage(),
!this.getRelaxedConstraints().isEmpty()
);
}
if (this.isAlive(var1, var6) && !this.isForcePushed()) {
this.effectiveMoveConstraints.clear();
this.effectiveMoveConstraints.addAll(this.relaxedConstraints);
if (!this.isOnSolidGround()) {
this.effectiveMoveConstraints.add(RelaxedConstraint.DAMAGE);
this.effectiveMoveConstraints.add(RelaxedConstraint.WADE);
}
if (this.inWater) {
this.effectiveMoveConstraints.add(RelaxedConstraint.WADE);
}
if (!var2.couldBreatheCached(var1, var6)) {
this.effectiveMoveConstraints.add(RelaxedConstraint.BREATHE);
}
boolean var7 = !this.effectiveMoveConstraints.contains(RelaxedConstraint.DAMAGE);
boolean var8 = this.effectiveMoveConstraints.contains(RelaxedConstraint.WADE);
double var9 = this.effectiveMaxDropHeight(this.effectiveMoveConstraints);
boolean var11 = this.findMoveCollisions(var8 ? 13 : 5, var7, var5, var6);
BlockCollisionData var12 = this.collisionResult.getFirstBlockCollision();
double var13;
double var15;
if (this.collisionResult.isSliding) {
var13 = this.collisionResult.slideStart;
var15 = this.collisionResult.slideEnd;
if (this.onGround) {
var12 = this.discardIgnorableSlideCollisions(this.collisionResult, var12, this.effectiveMoveConstraints);
}
} else {
var13 = Double.MAX_VALUE;
var15 = Double.MAX_VALUE;
}
boolean var17 = this.isRequiresPreciseMovement() && !this.isFullyRotated;
this.lastValidPosition.set(this.position);
boolean var18 = this.onGround;
if (var12 == null) {
double var27;
if (var18 && !(var15 >= 1.0)) {
if (this.isOnSolidGround() && var17) {
this.isObstructed = false;
var15 = this.shortenSlide(var5, var15);
} else {
this.onGround = false;
this.tmpMovePosition.set(this.position).fma(var15, var5);
if (this.isDropBlocked(this.tmpMovePosition, var9, false, this.effectiveMoveConstraints, var6)) {
ChunkStore var31 = var6.getExternalData().getWorld().getChunkStore();
if (this.isValidWalkPosition(
var31, this.lastValidPosition.x, this.lastValidPosition.y, this.lastValidPosition.z, this.effectiveMoveConstraints
)) {
var15 = this.shortenSlide(var5, var15);
this.isObstructed = true;
this.onGround = true;
}
}
}
this.position.fma(var15, var5);
var27 = var15;
var3 *= var15;
if (this.onGround && this.validateGroundPosition(var9, this.effectiveMoveConstraints, var6)) {
var27 = 0.0;
}
} else {
this.position.add(var5);
this.onGround = var13 <= 1.0 && var15 >= 1.0;
var27 = 1.0;
if (var18 && this.onGround) {
ChunkStore var30 = var6.getExternalData().getWorld().getChunkStore();
if (!this.isValidWalkPosition(var30, this.position.x, this.position.y, this.position.z, this.effectiveMoveConstraints)
&& this.isValidWalkPosition(
var30, this.lastValidPosition.x, this.lastValidPosition.y, this.lastValidPosition.z, this.effectiveMoveConstraints
)) {
double var34 = this.bisect(
this.lastValidPosition,
this.position,
this,
(var2x, var3x) -> var2x.isValidWalkPosition(var30, var3x.x, var3x.y, var3x.z, this.effectiveMoveConstraints),
this.position
);
var27 *= var34;
if (var34 == 0.0) {
this.isObstructed = true;
}
}
}
}
if (this.getMotionKind() != MotionKind.ASCENDING) {
if (this.onGround) {
this.setMotionKind(
!this.isObstructed && NPCPhysicsMath.projectedLengthSquared(var5, this.getComponentSelector()) > 0.0
? MotionKind.MOVING
: MotionKind.STANDING
);
} else if (this.initiateDescend(var5, var18, "No collision", var6)) {
this.position.set(this.lastValidPosition);
this.moveSpeed = 0.0;
var27 = 0.0;
}
}
if (!this.isValidPosition(this.position, this.collisionResult, var6)) {
if (this.getMotionKind() == MotionKind.DESCENDING) {
this.setMotionKind(MotionKind.DROPPING);
}
double var32 = this.bisect(this.lastValidPosition, this.position, this.position, var6);
var27 *= var32;
if (this.shouldDebugMove(var5)) {
LOGGER.at(Level.INFO)
.log(
"eid=%d Move: No collision, bisect onGround was/is=%s/%s slide=%s/%s scale=%s newpos=%s state=%s blocked=%s",
this.debugEntityId,
var18,
this.onGround,
var13,
var15,
var32,
Vector3dUtil.formatShortString(this.position),
this.getMotionKind(),
this.isObstructed
);
}
if (var32 == 0.0) {
this.isObstructed = true;
}
} else if (this.shouldDebugMove(var5)) {
LOGGER.at(Level.INFO)
.log(
"eid=%d Move: No collision onGround was/is=%s/%s slide=%s/%s newpos=%s state=%s",
this.debugEntityId,
var18,
this.onGround,
var13,
var15,
Vector3dUtil.formatShortString(this.position),
this.getMotionKind()
);
}
this.processTriggers(var1, this.collisionResult, var27, var6);
if (this.debugModeValidatePositions && !this.isValidPosition(this.position, this.collisionResult, var6)) {
LOGGER.at(Level.WARNING)
.log(
"eid=%d Move: Walked on invalid position pos=%s/%s/%s overlaps=%s",
this.debugEntityId,
this.position.x,
this.position.y,
this.position.z,
this.collisionResult.getBlockCollisionCount()
);
}
class="kw">return var3;
} else {
if (this.debugModeValidatePositions && !this.isValidPosition(this.position, this.collisionResult, var6)) {
throw new IllegalStateException("Invalid position");
}
double var19 = var12.collisionStart;
this.position.set(var12.collisionPoint);
if (!this.isValidPosition(this.position, this.collisionResult, var6)) {
double var21 = this.bisect(this.lastValidPosition, this.position, this.position, var6);
var19 *= var21;
if (this.debugModeMove) {
LOGGER.at(Level.INFO).log("eid=%d Move: Collision bisect=%s triggerScale=%s", this.debugEntityId, var21, var19);
}
}
if (var12.collisionNormal.equals(this.getWorldNormal())) {
if (this.onGround && !this.isDropBlocked(this.position, var9, false, this.effectiveMoveConstraints, var6)) {
this.initiateDescend(var5, true, "Collision", var6);
this.onGround = false;
} else {
if (this.onGround) {
this.isObstructed = true;
if (var7 && var12.willDamage) {
var19 = this.shortenMovement(var19);
}
} else if (this.getMotionKind() == MotionKind.DROPPING) {
double var29 = this.fallStartHeight - this.position.y;
if (var29 >= this.maxDropHeight) {
this.moveSpeed = 0.0;
} else if (var29 > this.maxClimbHeight) {
this.moveSpeed = this.moveSpeed * ((var29 - this.maxClimbHeight) / (this.maxDropHeight - this.maxClimbHeight));
this.validateSpeeds(var1, "Collision on Ground", var6);
}
}
this.setMotionKind(MotionKind.STANDING);
if (this.shouldDebugMove(var5)) {
LOGGER.at(Level.INFO)
.log(
"eid=%d Move: Collision Up onGround is/was=%s/%s blocked=%s newpos=%s state=%s",
this.debugEntityId,
this.onGround,
var18,
this.isObstructed,
Vector3dUtil.formatShortString(this.position),
this.getMotionKind()
);
}
if (!this.onGround) {
this.onGround = true;
this.postReadPosition(var1, var6);
}
}
if (this.onGround && this.validateGroundPosition(var9, this.effectiveMoveConstraints, var6)) {
var19 = 0.0;
}
this.processTriggers(var1, this.collisionResult, var19, var6);
var3 *= var19;
if (this.debugModeValidatePositions && !this.isValidPosition(this.position, this.collisionResult, var6)) {
LOGGER.at(Level.WARNING)
.log(
"eid=%d Move: Walked on invalid position pos=%s/%s/%s overlaps=%s",
this.debugEntityId,
this.position.x,
this.position.y,
this.position.z,
this.collisionResult.getBlockCollisionCount()
);
}
class="kw">return var3;
} else if (var12.collisionNormal.equals(this.getWorldAntiNormal())) {
this.fallSpeed = 0.0;
this.setMotionKind(MotionKind.DROPPING);
if (this.debugModeMove) {
LOGGER.at(Level.INFO)
.log(
"eid=%d Move: No ext force, collision down, clear vert speed newpos=%s state=%s",
this.debugEntityId,
Vector3dUtil.formatShortString(this.position),
this.getMotionKind()
);
}
if (this.onGround && this.validateGroundPosition(var9, this.effectiveMoveConstraints, var6)) {
var19 = 0.0;
}
this.processTriggers(var1, this.collisionResult, var19, var6);
var3 *= var19;
if (this.debugModeValidatePositions && !this.isValidPosition(this.position, this.collisionResult, var6)) {
LOGGER.at(Level.WARNING)
.log(
"eid=%d Move: Walked on invalid position pos=%s/%s/%s overlaps=%s",
this.debugEntityId,
this.position.x,
this.position.y,
this.position.z,
this.collisionResult.getBlockCollisionCount()
);
}
class="kw">return var3;
} else {
boolean var28;
if (!var11
&& !var17
&& this.isOnSolidGround()
&& var12.blockType != null
&& this.isClimbable(var12.blockType, var12.fluid, this.effectiveMoveConstraints)) {
var28 = this.tryClimb(var5, this.effectiveMoveConstraints, var6);
if (this.debugModeMove) {
LOGGER.at(Level.INFO)
.log(
"eid=%d Move: No ext force, collision horz, try climb h=%s succ=%s newpos(succ|fail)=%s|%s state=%s",
this.debugEntityId,
this.climbUpDistance,
var28,
Vector3dUtil.formatShortString(this.tmpMovePosition),
Vector3dUtil.formatShortString(this.position),
this.getMotionKind()
);
}
} else {
var28 = false;
if (var7 && var12.willDamage) {
var19 = this.shortenMovement(var19);
}
if (this.debugModeMove) {
LOGGER.at(Level.INFO)
.log(
"eid=%d Move: No ext force, collision horz, don't try climb onGround %s, block %s newpos=%s state=%s",
this.debugEntityId,
this.onGround,
var12.blockType != null,
Vector3dUtil.formatShortString(this.position),
this.getMotionKind()
);
}
}
this.isObstructed = this.isFullyRotated && !var28 && !var11;
if (this.onGround && this.validateGroundPosition(var9, this.effectiveMoveConstraints, var6)) {
var28 = false;
var19 = 0.0;
}
this.processTriggers(var1, this.collisionResult, var19, var6);
var3 *= var19;
if (var28 && !this.isProcessTriggersHasMoved()) {
this.setMotionKind(MotionKind.ASCENDING);
this.climbUpDirection.set(this.getWorldNormal());
this.climbForwardDirection.set(var5).normalize();
this.climbSpeed = this.computeClimbSpeed(this.moveSpeed);
this.onGround = false;
if (this.debugModeMove) {
LOGGER.at(Level.INFO)
.log(
"eid=%d Move: No ext force, collision horz, start climbing h=%s forw=%s state=%s",
this.debugEntityId,
this.climbUpDistance,
this.maxClimbForwardDistance,
this.getMotionKind()
);
}
if (this.debugModeValidatePositions && !this.isValidPosition(this.position, this.collisionResult, var6)) {
throw new IllegalStateException("Invalid position");
}
} else if (var2.getLastAvoidanceSteering().lengthSquared() < 1.0E-5 && var2.getLastSeparationSteering().lengthSquared() < 1.0E-5) {
this.tmpMovePosition.set(this.lastValidPosition).add(var5).sub(var12.collisionPoint);
if (!this.tmpMovePosition.equals(Vector3dUtil.ZERO)) {
double var22 = this.tmpMovePosition.dot(var12.collisionNormal);
this.tmpMovePosition.fma(-var22, var12.collisionNormal);
this.position.add(this.tmpMovePosition);
}
if (this.debugModeMove) {
LOGGER.at(Level.INFO)
.log(
"eid=%d Move: No ext force, collision horz, sliding at wall h=%s state=%s",
this.debugEntityId,
Vector3dUtil.formatShortString(this.tmpMovePosition),
this.getMotionKind()
);
}
if (!this.isValidPosition(this.position, this.collisionResult, var6)) {
double var33 = this.bisect(this.lastValidPosition, this.position, this.position, var6);
if (this.debugModeMove) {
LOGGER.at(Level.INFO).log("eid=%d Move: Collision slide bisect=%s dt=%s", this.debugEntityId, var33, var3);
}
}
if (this.lastValidPosition.distanceSquared(this.position) > this.getEpsilonSpeed()) {
this.setMotionKind(MotionKind.MOVING);
} else {
this.setMotionKind(MotionKind.STANDING);
}
} else {
if (this.debugModeMove) {
LOGGER.at(Level.INFO)
.log(
"eid=%d Move: No ext force, collision horz, no sliding at wall, avoidance/separation, h=%s state=%s",
this.debugEntityId,
Vector3dUtil.formatShortString(this.tmpMovePosition),
this.getMotionKind()
);
}
this.setMotionKind(MotionKind.STANDING);
}
if (this.debugModeValidatePositions && !this.isValidPosition(this.position, this.collisionResult, var6)) {
LOGGER.at(Level.WARNING)
.log(
"eid=%d Move: Walked on invalid position pos=%s/%s/%s overlaps=%s",
this.debugEntityId,
this.position.x,
this.position.y,
this.position.z,
this.collisionResult.getBlockCollisionCount()
);
}
class="kw">return var3;
}
}
} else {
class="kw">return this.executePhysicsMove(var1, var3, var5, var6);
}
}
@Override
class="kw">public double probeMove(@Nonnull Ref<EntityStore> var1, @Nonnull ProbeMoveData var2, @Nonnull ComponentAccessor<EntityStore> var3) {
World var4 = var3.getExternalData().getWorld();
boolean var5 = var2.startProbing();
Vector3d var6 = var2.probeDirection;
double var7 = NPCPhysicsMath.projectedLengthSquared(var6, this.getComponentSelector());
if (var7 == 0.0) {
class="kw">return 0.0;
}
EnumSet var9 = var2.getRelaxedConstraints();
boolean var10 = !var9.contains(RelaxedConstraint.DAMAGE);
boolean var11 = var9.contains(RelaxedConstraint.WADE);
double var12 = this.effectiveMaxDropHeight(var9);
this.collisionResult.setCollisionByMaterial(4, var11 ? 13 : 5);
Predicate var14 = this.collisionResult.setBlockCollisionFilter(var2.getBlockCollisionFilter());
Predicate var15 = this.tmpResults.setBlockCollisionFilter(var2.getBlockCollisionFilter());
this.activeProbeBlockCollisionFilter = var2.getBlockCollisionFilter();
this.activeProbeBreathableBlockOverride = var2.getBreathableBlockOverride();
try {
Vector3d var16 = var2.probePosition;
Vector3d var17 = var2.initialPosition;
Vector3d var18 = var2.targetPosition;
Vector3d var19 = var2.directionComponentSelector;
CollisionModule var22 = CollisionModule.get();
boolean var21;
if (var17.equals(this.position)) {
var21 = this.onGround;
} else {
this.applyActiveProbeBlockCollisionFilter(this.collisionResult);
var21 = var22.validatePosition(var4, this.collisionBoundingBox, var16, this.collisionResult) == 1;
}
var19.set(this.getComponentSelector());
var6.mul(var19);
if (var5) {
var2.addStartSegment(var17, true);
}
if (!var21) {
if (this.isDropBlocked(var16, var12, true, var9, var3)) {
if (var5) {
var2.addBlockedDropSegment(var16, this.waypointDistance(var17, var16));
class="kw">return var2.getLastDistance();
}
var2.edgeBlocked = true;
class="kw">return this.waypointDistance(var17, var16);
}
if (var5) {
var2.addDropSegment(var16, this.waypointDistance(var17, var16));
}
}
while (var7 > 0.0) {
if (this.debugModeProbeBlockCollisions || var2.debugCollision) {
this.collisionResult.setLogger(LOGGER, this.debugEntityId);
}
boolean var23 = this.collisionResult.setDamageBlocking(var10);
this.applyActiveProbeBlockCollisionFilter(this.collisionResult);
boolean var24 = !CollisionModule.findCollisions(this.collisionBoundingBox, var16, var6, this.collisionResult, var3);
this.collisionResult.setDamageBlocking(var23);
if (this.debugModeProbeBlockCollisions || var2.debugCollision) {
this.collisionResult.setLogger(null);
}
if (this.debugModeMove) {
LOGGER.at(Level.INFO)
.log(
"eid=%d Probe Step: pos=%s mov=%s left=%s",
this.debugEntityId,
Vector3dUtil.formatShortString(var16),
Vector3dUtil.formatShortString(var6),
Math.sqrt(var7)
);
}
if (this.debugModeCollisions) {
this.dumpCollisionResults();
}
BlockCollisionData var20 = this.collisionResult.getFirstBlockCollision();
double var25 = this.collisionResult.isSliding ? this.collisionResult.slideEnd : Double.MAX_VALUE;
if (this.collisionResult.isSliding) {
var20 = this.discardIgnorableSlideCollisions(this.collisionResult, var20, var9);
}
if (var20 != null && var20.collisionStart <= var25) {
if (var10 && var20.willDamage) {
this.shortenMovement(var16, var20.collisionPoint, var16);
var7 = 0.0;
} else {
var16.set(var20.collisionPoint);
var7 = this.updateMovementVector(var16, var6, var18, var19);
}
if (var20.collisionNormal.equals(this.getWorldNormal())) {
double var40 = this.waypointDistance(var17, var16);
if (var5) {
var2.addBlockedGroundSegment(var16, var40, var20.collisionNormal, var20.blockId);
}
class="kw">return var40;
}
if (var5) {
var2.addHitWallSegment(var16, true, this.waypointDistance(var17, var16), var20.collisionNormal, var20.blockId);
}
int var39 = var20.blockId;
if (var20.blockType == null || var7 < 0.010000000000000002 || !this.isClimbable(var20.blockType, var20.fluid, var9)) {
if (var5) {
var2.changeSegmentToBlockedWall();
}
class="kw">return this.waypointDistance(var17, var16);
}
double var28 = var24 ? 0.0 : this.computeClimbHeight(var16, var6, this.maxClimbHeight, 0.1, null, this.tmpClimbHeightResults, var9, var3);
if (var28 <= 0.0) {
if (var5) {
var2.changeSegmentToBlockedWall();
}
class="kw">return this.waypointDistance(var17, var16);
}
var16.fma(var28, this.getWorldNormal());
if (var5) {
var2.addClimbSegment(var16, this.waypointDistance(var17, var16), var39);
}
var7 = this.updateMovementVector(var16, var6, var18, var19);
} else {
if (var25 >= 1.0) {
var16.add(var6);
if (!var11) {
ChunkStore var37 = var3.getExternalData().getWorld().getChunkStore();
if (!this.isValidWalkPosition(var37, var16.x, var16.y, var16.z, var9) && this.isValidWalkPosition(var37, var17.x, var17.y, var17.z, var9)) {
var16.sub(var6);
if (var5) {
var2.addBlockedGroundSegment(var16, this.waypointDistance(var17, var16), this.getWorldNormal(), -1);
}
class="kw">return this.waypointDistance(var17, var16);
}
}
var6.set(Vector3dUtil.ZERO);
double var38 = this.waypointDistance(var17, var16);
if (var5) {
var2.addMoveSegment(var16, true, var38);
}
class="kw">return var38;
}
var16.fma(var25, var6);
if (var5) {
var2.addHitEdgeSegment(var16, this.waypointDistance(var17, var16));
}
if (this.isDropBlocked(var16, var12, true, var9, var3)) {
ChunkStore var27 = var3.getExternalData().getWorld().getChunkStore();
if (var11 || this.isValidWalkPosition(var27, var17.x, var17.y, var17.z, var9)) {
var6.set(var18).sub(var16).mul(var19);
if (var5) {
var2.changeSegmentToBlockedEdge();
class="kw">return var2.getLastDistance();
}
var2.edgeBlocked = true;
class="kw">return this.waypointDistance(var17, var16);
}
}
if (var5) {
var2.addDropSegment(var16, this.waypointDistance(var17, var16));
}
var7 = this.updateMovementVector(var16, var6, var18, var19);
}
}
double var36 = this.waypointDistance(var17, var16);
if (var5) {
var2.addEndSegment(var16, true, var36);
}
class="kw">return var36;
} class="kw">finally {
this.collisionResult.setBlockCollisionFilter(var14);
this.tmpResults.setBlockCollisionFilter(var15);
this.activeProbeBlockCollisionFilter = null;
this.activeProbeBreathableBlockOverride = null;
}
}
@Override
class="kw">protected void postExecuteMove() {
if (this.isObstructed && !this.onGround) {
this.moveSpeed = 0.0;
}
}
@Override
class="kw">public double getCurrentMaxBodyRotationSpeed() {
class="kw">return this.maxRotationSpeed * this.effectHorizontalSpeedMultiplier;
}
class="kw">protected float computeHeading(float var1, double var2, float var4, double var5, boolean var7, boolean var8) {
double var9 = NPCPhysicsMath.turnAngle(var4, var1);
double var11 = this.getEpsilonAngle();
if (var9 >= -var11 && var9 <= var11) {
var4 = var1;
if (var7) {
this.isFullyRotated = true;
}
} else {
double var13 = var5 * this.getCurrentMaxBodyRotationSpeed() * var2;
var9 = MathUtil.clamp(var9, -var13, var13);
var4 = PhysicsMath.normalizeTurnAngle((float)(var4 + var9));
if (var7) {
this.isFullyRotated = false;
}
}
if (var8 && Math.abs(var9) > this.maxMoveTurnAngle) {
this.moveSpeed = 0.0;
}
class="kw">return var4;
}
class="kw">protected boolean initiateDescend(@Nonnull Vector3d var1, boolean var2, String var3, @Nonnull ComponentAccessor<EntityStore> var4) {
if (var2 && this.getMotionKind() != MotionKind.DESCENDING && this.getMotionKind() != MotionKind.DROPPING) {
this.fallStartHeight = this.position.y;
this.fallSpeed = 0.0;
this.predictedFallHeight = this.dropDistance(this.position, this.maxDropHeight, var4);
this.totalDropDistance = 0.0;
this.computeDescendDirection(var1);
if (this.debugModeMove) {
LOGGER.at(Level.INFO).log("eid=%d Move: %s, descend init %s %s", this.debugEntityId, var3, this.moveSpeed, this.climbForwardDirection.toString());
}
}
if (this.getMotionKind() != MotionKind.DROPPING) {
if (this.fallStartHeight - this.position.y > this.maxClimbHeight || this.predictedFallHeight > this.maxClimbHeight + 1.0E-5) {
if (this.debugModeMove) {
LOGGER.at(Level.INFO)
.log(
"eid=%d Move: %s, dropping %s %s %s %s",
this.debugEntityId,
var3,
this.moveSpeed,
this.fallStartHeight - this.position.y,
this.predictedFallHeight,
this.climbForwardDirection.toString()
);
}
boolean var5 = this.getMotionKind() == MotionKind.DESCENDING;
this.setMotionKind(MotionKind.DROPPING);
class="kw">return var5;
}
if (this.getMotionKind() != MotionKind.DESCENDING) {
if (this.debugModeMove) {
LOGGER.at(Level.INFO).log("eid=%d Move: %s, descending %s %s", this.debugEntityId, var3, this.moveSpeed, this.climbForwardDirection.toString());
}
this.setMotionKind(MotionKind.DESCENDING);
}
}
class="kw">return false;
}
class="kw">protected double updateMovementVector(@Nonnull Vector3d var1, @Nonnull Vector3d var2, @Nonnull Vector3d var3, @Nonnull Vector3d var4) {
var2.set(var3).sub(var1).mul(var4);
class="kw">return this.waypointDistanceSquared(var1, var3);
}
@Nullable
class="kw">private BlockCollisionData discardIgnorableSlideCollisions(
@Nonnull CollisionResult var1, @Nullable BlockCollisionData var2, @Nonnull EnumSet<RelaxedConstraint> var3
) {
boolean var4 = !var3.contains(RelaxedConstraint.DAMAGE);
double var5 = var1.slideEnd;
while (var2 != null) {
if (var4 && var2.willDamage) {
class="kw">return var2;
}
BlockType var7 = var2.blockType;
if (var7 == null || !var2.collisionNormal.equals(this.getWorldNormal()) || var2.collisionStart > var5) {
class="kw">return var2;
}
var2 = var1.forgetFirstBlockCollision();
}
class="kw">return null;
}
class="kw">private double bisect(@Nonnull Vector3d var1, @Nonnull Vector3d var2, @Nonnull Vector3d var3, @Nonnull ComponentAccessor<EntityStore> var4) {
this.applyActiveProbeBlockCollisionFilter(this.collisionResult);
if (!this.isValidPosition(var1, this.collisionResult, var4)) {
var3.set(var2);
class="kw">return 1.0;
} else {
class="kw">return this.bisect(var1, var2, this, (var1x, var2x) -> {
var1x.applyActiveProbeBlockCollisionFilter(var1x.collisionResult);
class="kw">return var1x.isValidPosition(var2x, var1x.collisionResult, var4);
}, var3);
}
}
class="kw">private boolean validateGroundPosition(double var1, @Nonnull EnumSet<RelaxedConstraint> var3, @Nonnull ComponentAccessor<EntityStore> var4) {
if (this.isDropBlocked(this.position, var1, false, var3, var4)) {
this.position.set(this.lastValidPosition);
this.isObstructed = true;
class="kw">return true;
} else {
ChunkStore var5 = var4.getExternalData().getWorld().getChunkStore();
if (!this.isValidWalkPosition(var5, this.position.x, this.position.y, this.position.z, var3)
&& this.isValidWalkPosition(var5, this.lastValidPosition.x, this.lastValidPosition.y, this.lastValidPosition.z, var3)) {
this.position.set(this.lastValidPosition);
this.isObstructed = true;
class="kw">return true;
} else {
class="kw">return false;
}
}
}
class="kw">private double shortenSlide(@Nonnull Vector3d var1, double var2) {
Vector3d var4 = this.getComponentSelector();
double var5 = (this.collisionBoundingBox.max.x - this.collisionBoundingBox.min.x) * 0.1 * var4.x;
double var7 = (this.collisionBoundingBox.max.y - this.collisionBoundingBox.min.y) * 0.1 * var4.y;
double var9 = (this.collisionBoundingBox.max.z - this.collisionBoundingBox.min.z) * 0.1 * var4.z;
double var11 = Math.max(Math.max(var5, Math.max(var7, var9)), 0.05);
double var13 = var1.length() * var2;
if (var13 > var11) {
var2 = var2 * (var13 - var11) / var13;
} else {
var2 = 0.0;
}
class="kw">return var2;
}
class="kw">private double shortenMovement(@Nonnull Vector3d var1, @Nonnull Vector3d var2, @Nonnull Vector3d var3) {
double var4 = var2.distance(var1);
if (var4 <= 0.05) {
class="kw">return 0.0;
}
var4 = (var4 - 0.05) / var4;
NPCPhysicsMath.lerp(var1, var2, var4, var3);
class="kw">return var4;
}
class="kw">private double shortenMovement(double var1) {
double var3 = this.shortenMovement(this.lastValidPosition, this.position, this.position);
var1 *= var3;
if (this.debugModeMove) {
LOGGER.at(Level.INFO).log("eid=%d Move: Collision reduction=%s triggerScale=%s", this.debugEntityId, var3, var1);
}
class="kw">return var1;
}
class="kw">private void validateTranslation(@Nonnull Vector3d var1, String var2) {
if (this.debugModeValidateMath) {
boolean var3 = NPCPhysicsMath.isValid(var1) && var1.lengthSquared() < 1000000.0;
if (!var3) {
throw new IllegalStateException(
String.format(
"Walk - Translation invalid path=%s %s, moveSpeed=%s, fallSpeed=%s, pos=%s",
var2,
var1,
this.moveSpeed,
this.fallSpeed,
Vector3dUtil.formatShortString(this.position)
)
);
}
} else if (!NPCPhysicsMath.isValid(var1) || var1.lengthSquared() > 1000000.0) {
var1.zero();
}
}
class="kw">private void validateSpeeds(@Nonnull Ref<EntityStore> var1, @Nonnull String var2, @Nonnull ComponentAccessor<EntityStore> var3) {
if (this.debugModeValidateMath) {
if (!Double.isFinite(this.moveSpeed) || !(Math.abs(this.moveSpeed) < 200.0) || !Double.isFinite(this.fallSpeed) || !(Math.abs(this.fallSpeed) < 200.0)
)
{
throw new IllegalStateException(
String.format(
"Walk - Invalid speed path=%s, moveSpeed=%s, fallSpeed=%s, onGround=%s canSteer=%s, pos=%s, motionKind=%s",
var2,
this.moveSpeed,
this.fallSpeed,
this.onGround,
this.canSteer(var1, var3),
Vector3dUtil.formatShortString(this.position),
this.getMotionKind()
)
);
}
} else {
this.moveSpeed = MathUtil.clamp(this.moveSpeed, -200.0, 200.0);
this.fallSpeed = MathUtil.clamp(this.fallSpeed, -200.0, 200.0);
}
}
class="kw">private void lockOrientation(@Nonnull Steering var1, @Nonnull Vector3d var2, float var3) {
var1.setYaw(var3);
var1.setPitch(this.getPitch());
var1.setRoll(this.getRoll());
if (this.debugModeValidateMath && !NPCPhysicsMath.isValid(var2)) {
throw new IllegalArgumentException("Translation invalid");
}
}
class="kw">private float computeBlendHeading(float var1, float var2, double var3, double var5, double var7) {
float var9 = this.computeBlendTurnAngle(var1, var2);
class="kw">return this.computeBlendHeading(var1, var2, var3, var5, var9, var7);
}
class="kw">private float computeBlendHeading(float var1, float var2, double var3, double var5, float var7, double var8) {
double var10 = this.getCurrentMaxBodyRotationSpeed();
float var12 = (float)MathUtil.clamp(var3 * var10 * var8, 0.0, (float) (Math.PI / 2));
if (this.haveBlendHeadingPosition && var5 > 0.0) {
var7 *= (float)this.blendLevelAtTargetPosition;
double var13 = this.waypointDistance(this.position, this.blendHeadingPosition) / var5;
if (var13 * var10 * var8 > var7) {
var7 = NPCPhysicsMath.turnAngle(var1, var2);
}
}
var7 = MathUtil.clamp(var7, -var12, var12);
class="kw">return PhysicsMath.normalizeTurnAngle(var1 + var7);
}
class="kw">private float computeBlendTurnAngle(float var1, float var2) {
float var3 = Double.isNaN(this.blendHeading) ? var2 : (float)this.blendHeading;
class="kw">return NPCPhysicsMath.turnAngle(var1, var3);
}
class="kw">private double computeClimbMove(@Nonnull Vector3d var1, double var2, double var4, @Nonnull Vector3d var6) {
if (var4 >= var2) {
var4 = var2;
var2 = 0.0;
} else {
double var7 = var2 - var4;
if (var7 <= 1.0E-5) {
var4 = var2;
var2 = 0.0;
} else {
var2 = var7;
}
}
var6.set(var1).mul(var4);
class="kw">return var2;
}
class="kw">private void computeDescendDirection(@Nonnull Vector3d var1) {
this.climbForwardDirection.set(this.getWorldAntiNormal());
if (!(this.descendFlatness <= 0.0)) {
double var2 = NPCPhysicsMath.dotProduct(var1.x, 0.0, var1.z);
if (!(var2 <= 1.0E-12)) {
var2 = Math.sqrt(var2);
double var4 = this.descendFlatness / var2;
this.climbForwardDirection.x = var4 * var1.x;
this.climbForwardDirection.z = var4 * var1.z;
this.climbForwardDirection.normalize();
double var6 = Math.sqrt(NPCPhysicsMath.dotProduct(this.climbForwardDirection.x, 0.0, this.climbForwardDirection.z));
if (var6 > 1.0E-6) {
double var8 = 1.0 + (1.0 / var6 - 1.0) * this.descendSpeedCompensation;
this.climbForwardDirection.mul(var8);
}
}
}
}
class="kw">private double computeClimbSpeed(double var1) {
double var3 = this.climbSpeedConst;
if (var1 != 0.0 && this.climbSpeedMult != 0.0) {
var3 += this.climbSpeedMult * Math.pow(var1, this.climbSpeedPow);
}
class="kw">return var3;
}
class="kw">private boolean tryClimb(@Nonnull Vector3d var1, @Nonnull EnumSet<RelaxedConstraint> var2, @Nonnull ComponentAccessor<EntityStore> var3) {
boolean var4 = this.jumpHeight > 0.0;
this.currentClimbForwardDistance = 0.0;
this.maxClimbForwardDistance = 0.1;
this.climbUpDistance = this.computeClimbHeight(
this.position, var1, this.maxClimbHeight + this.jumpHeight, this.maxClimbForwardDistance, null, this.tmpClimbHeightResults, var2, var3
);
double var5 = this.climbUpDistance + this.jumpHeight;
double var7 = this.tmpClimbHeightResults.y;
if (this.climbUpDistance > this.maxClimbHeight + 1.0E-5) {
this.climbUpDistance = 0.0;
} else if (var4 && this.climbUpDistance >= this.minJumpHeight && var7 >= var5) {
this.currentJumpHeight = var5;
this.jumpDropHeight = this.currentJumpHeight - this.climbUpDistance;
this.jumpBlockHeight = this.climbUpDistance;
this.jumpDropDirection.set(this.getWorldAntiNormal());
double var9 = this.climbUpDistance;
this.climbUpDistance = this.currentJumpHeight;
this.tmpClimbMovement.set(var1).normalize(0.4);
this.tmpMovePosition.set(this.position).add(0.0, var9, 0.0);
double var11 = this.maxMoveFactor(this.tmpMovePosition, this.tmpClimbMovement, var2, var3);
this.maxClimbForwardDistance += var11 * 0.4;
this.tmpMovePosition.fma(var11, this.tmpClimbMovement);
this.jumping = this.maxClimbForwardDistance >= this.minJumpDistance;
} else {
this.jumping = false;
}
class="kw">return this.climbUpDistance > 0.0;
}
class="kw">private double computeClimbHeight(
@Nonnull Vector3d var1,
@Nonnull Vector3d var2,
double var3,
double var5,
@Nullable Vector3d var7,
@Nonnull Vector2d var8,
@Nonnull EnumSet<RelaxedConstraint> var9,
@Nonnull ComponentAccessor<EntityStore> var10
) {
World var11 = var10.getExternalData().getWorld();
ChunkStore var12 = var11.getChunkStore();
boolean var13 = var9.contains(RelaxedConstraint.WADE);
this.tmpResults.setCollisionByMaterial(4, var13 ? 13 : 5);
var8.zero();
Vector3dc var14 = this.getWorldNormal();
this.tmpClimbMovement.set(var14).mul(var3);
double var15 = this.maxMoveFactor(var1, this.tmpClimbMovement, var9, var10);
var3 *= var15;
if (var3 == 0.0) {
class="kw">return 0.0;
}
this.tmpClimbMovement.set(var2).normalize(var5);
this.tmpClimbPosition.set(var1).add(this.tmpClimbMovement);
this.tmpClimbMovement.set(var14).mul(var3);
boolean var17 = this.tmpResults.isComputeOverlaps();
this.tmpResults.setComputeOverlaps(true);
this.applyActiveProbeBlockCollisionFilter(this.tmpResults);
CollisionModule.findCollisions(this.collisionBoundingBox, this.tmpClimbPosition, this.tmpClimbMovement, false, this.tmpResults, var10);
this.tmpResults.setComputeOverlaps(var17);
BlockCollisionData var18 = this.tmpResults.getFirstBlockCollision();
Vector3dc var19 = this.getWorldAntiNormal();
double var20 = 0.0;
double var22 = 1.0;
while (var18 != null) {
BlockType var24 = var18.blockType;
if (var24 == null || !this.isClimbable(var24, var18.fluid, var9)) {
break;
}
if (var18.collisionNormal.equals(var19)) {
if (var18.collisionStart > var20) {
var22 = var18.collisionStart;
break;
}
if (var18.collisionEnd > var20) {
var20 = var18.collisionEnd;
if (var20 > 1.00001) {
class="kw">return 0.0;
}
}
}
var18 = this.tmpResults.forgetFirstBlockCollision();
}
if (var20 == 0.0) {
class="kw">return 0.0;
}
this.tmpClimbPosition.fma(var20, this.tmpClimbMovement);
if (!this.isValidWalkPosition(var12, this.tmpClimbPosition.x, this.tmpClimbPosition.y, this.tmpClimbPosition.z, var9)) {
class="kw">return 0.0;
}
double var27 = var3 * var20;
var8.set(var27, var3 * var22);
if (var7 != null) {
var7.set(this.tmpClimbPosition);
}
class="kw">return var27;
}
class="kw">private double effectiveMaxDropHeight(@Nonnull EnumSet<RelaxedConstraint> var1) {
class="kw">return var1.contains(RelaxedConstraint.DROP) ? this.maxDropHeightRelaxed : this.maxDropHeight;
}
class="kw">private boolean isDropBlocked(
@Nonnull Vector3d var1, double var2, boolean var4, @Nonnull EnumSet<RelaxedConstraint> var5, @Nonnull ComponentAccessor<EntityStore> var6
) {
World var7 = var6.getExternalData().getWorld();
ChunkStore var8 = var7.getChunkStore();
boolean var9 = !var5.contains(RelaxedConstraint.DAMAGE);
this.applyActiveProbeBlockCollisionFilter(this.tmpResults);
if (this.debugModeValidatePositions && !this.isValidPosition(var1, this.tmpResults, var6)) {
throw new IllegalStateException("Invalid position");
}
BlockCollisionData var10 = this.findDropBlockCollision(var1, var2, var6);
if (var10 == null) {
class="kw">return true;
}
this.tmpClimbPosition.set(var10.collisionPoint);
if (var9) {
double var11 = var10.collisionStart;
do {
if (var10.willDamage) {
if (this.debugModeMove) {
LOGGER.at(Level.FINE)
.log("eid=%d Drop DMG %.2f/%.2f/%.2f", this.debugEntityId, this.tmpClimbPosition.x, this.tmpClimbPosition.y, this.tmpClimbPosition.z);
}
class="kw">return true;
}
var10 = this.tmpResults.forgetFirstBlockCollision();
} while (var10 != null && var10.collisionStart <= var11);
}
if (!this.isValidWalkPosition(var8, this.tmpClimbPosition.x, this.tmpClimbPosition.y, this.tmpClimbPosition.z, var5)) {
if (this.debugModeMove) {
LOGGER.at(Level.FINE)
.log("eid=%d Drop INV %.2f/%.2f/%.2f", this.debugEntityId, this.tmpClimbPosition.x, this.tmpClimbPosition.y, this.tmpClimbPosition.z);
}
class="kw">return true;
} else {
if (this.debugModeMove) {
LOGGER.at(Level.FINE)
.log("eid=%d Drop END %.2f/%.2f/%.2f", this.debugEntityId, this.tmpClimbPosition.x, this.tmpClimbPosition.y, this.tmpClimbPosition.z);
}
if (var4) {
var1.set(this.tmpClimbPosition);
}
class="kw">return false;
}
}
class="kw">private double dropDistance(@Nonnull Vector3d var1, double var2, @Nonnull ComponentAccessor<EntityStore> var4) {
BlockCollisionData var5 = this.findDropBlockCollision(var1, var2, var4);
class="kw">return var5 != null ? var5.collisionStart * var2 : var2;
}
@Nullable
class="kw">private BlockCollisionData findDropBlockCollision(@Nonnull Vector3d var1, double var2, @Nonnull ComponentAccessor<EntityStore> var4) {
this.tmpResults.setCollisionByMaterial(4);
this.tmpClimbMovement.set(this.getWorldAntiNormal()).mul(var2);
this.applyActiveProbeBlockCollisionFilter(this.tmpResults);
CollisionModule.findCollisions(this.collisionBoundingBox, var1, this.tmpClimbMovement, this.tmpResults, var4);
BlockCollisionData var5 = this.tmpResults.getFirstBlockCollision();
if (this.debugModeMove) {
LOGGER.at(Level.FINE)
.log(
"eid=%d Test Drop BOX %.2f/%.2f/%.2f %.2f/%.2f/%.2f",
this.debugEntityId,
this.collisionBoundingBox.min.x,
this.collisionBoundingBox.min.y,
this.collisionBoundingBox.min.z,
this.collisionBoundingBox.max.x,
this.collisionBoundingBox.max.y,
this.collisionBoundingBox.max.z
);
if (var5 == null) {
LOGGER.at(Level.FINE)
.log(
"eid=%d Test Drop NONE %.2f/%.2f/%.2f %.2f/%.2f/%.2f",
this.debugEntityId,
var1.x,
var1.y,
var1.z,
this.tmpClimbMovement.x,
this.tmpClimbMovement.y,
this.tmpClimbMovement.z
);
} else {
LOGGER.at(Level.FINE)
.log(
"eid=%d Test Drop COLL %.2f/%.2f/%.2f %.2f/%.2f/%.2f dist=%s",
this.debugEntityId,
var1.x,
var1.y,
var1.z,
this.tmpClimbMovement.x,
this.tmpClimbMovement.y,
this.tmpClimbMovement.z,
var5.collisionStart * var2
);
}
}
class="kw">return var5;
}
class="kw">private boolean isClimbable(@Nonnull BlockType var1, @Nonnull Fluid var2, @Nonnull EnumSet<RelaxedConstraint> var3) {
boolean var4 = var3.contains(RelaxedConstraint.DAMAGE);
boolean var5 = var3.contains(RelaxedConstraint.FENCE);
class="kw">return (var4 || var1.getDamageToEntities() <= 0 && var2.getDamageToEntities() <= 0)
&& (var5 || this.fenceBlockSet == Integer.MIN_VALUE || !BlockSetModule.getInstance().blockInSet(this.fenceBlockSet, var1));
}
class="kw">private boolean isValidWalkPosition(
@Nonnull Ref<ChunkStore> var1,
@Nonnull ComponentAccessor<ChunkStore> var2,
double var3,
double var5,
double var7,
@Nonnull EnumSet<RelaxedConstraint> var9
) {
boolean var10 = !var9.contains(RelaxedConstraint.BREATHE);
boolean var11 = var9.contains(RelaxedConstraint.WADE);
if (var10) {
if (!this.couldBreatheAtWalkPosition(var1, var2, var3, var5 + this.breathingDepth, var7)) {
class="kw">return false;
}
if (this.breathingDepth == this.constraintDepth) {
class="kw">return true;
}
}
class="kw">return !var11 ? this.couldBreatheAtWalkPosition(var1, var2, var3, var5 + this.constraintDepth, var7) : true;
}
class="kw">private boolean couldBreatheAtWalkPosition(@Nonnull Ref<ChunkStore> var1, @Nonnull ComponentAccessor<ChunkStore> var2, double var3, double var5, double var7) {
long var9 = WorldUtil.getPackedMaterialAndFluidAtPosition(var1, var2, var3, var5, var7);
BlockMaterial var11 = this.isProbeBreathableBlockOverride(var1, var2, var3, var5, var7)
? BlockMaterial.Empty
: BlockMaterial.VALUES[MathUtil.unpackLeft(var9)];
int var12 = MathUtil.unpackRight(var9);
class="kw">return this.role.couldBreathe(var11, var12);
}
class="kw">private boolean isProbeBreathableBlockOverride(
@Nonnull Ref<ChunkStore> var1, @Nonnull ComponentAccessor<ChunkStore> var2, double var3, double var5, double var7
) {
if (this.activeProbeBreathableBlockOverride == null) {
class="kw">return false;
}
BlockChunk var9 = var2.getComponent(var1, BlockChunk.getComponentType());
if (var9 == null) {
class="kw">return false;
}
int var10 = var9.getBlock(MathUtil.floor(var3), MathUtil.floor(var5), MathUtil.floor(var7));
class="kw">return this.activeProbeBreathableBlockOverride.test(var10);
}
class="kw">private boolean isValidWalkPosition(@Nonnull ChunkStore var1, double var2, double var4, double var6, @Nonnull EnumSet<RelaxedConstraint> var8) {
long var9 = ChunkUtil.indexChunkFromBlock(var2, var6);
Ref var11 = var1.getChunkReference(var9);
class="kw">return var11 != null && var11.isValid() ? this.isValidWalkPosition(var11, var1.getStore(), var2, var4, var6, var8) : false;
}
class="kw">private double maxMoveFactor(
@Nonnull Vector3d var1, @Nonnull Vector3d var2, @Nonnull EnumSet<RelaxedConstraint> var3, @Nonnull ComponentAccessor<EntityStore> var4
) {
this.applyActiveProbeBlockCollisionFilter(this.tmpResults);
CollisionModule.findCollisions(this.collisionBoundingBox, var1, var2, this.tmpResults, var4);
BlockCollisionData var5;
if (var2.y != 0.0) {
var5 = this.tmpResults.getFirstBlockCollision();
} else {
var5 = this.discardIgnorableSlideCollisions(this.tmpResults, this.tmpResults.getFirstBlockCollision(), var3);
}
class="kw">return var5 == null ? 1.0 : MathUtil.clamp(var5.collisionStart, 0.0, 1.0);
}
class="kw">private void applyActiveProbeBlockCollisionFilter(@Nonnull CollisionResult var1) {
if (this.activeProbeBlockCollisionFilter != null) {
var1.setBlockCollisionFilter(this.activeProbeBlockCollisionFilter);
}
}
class="kw">public enum AscentAnimationType class="kw">implements Supplier<String> {
Walk("Play walk animation"),
Jump("Play jump animation"),
Climb("Play climb animation"),
Fly("Play fly animation"),
Idle("Play idle animation");
class="kw">private class="kw">final String description;
AscentAnimationType(String nullxx) {
this.description = nullxx;
}
class="kw">public String get() {
class="kw">return this.description;
}
}
class="kw">public enum DescentAnimationType class="kw">implements Supplier<String> {
Walk("Play walk animation"),
Fall("Play fall animation"),
Idle("Play idle animation");
class="kw">private class="kw">final String description;
DescentAnimationType(String nullxx) {
this.description = nullxx;
}
class="kw">public String get() {
class="kw">return this.description;
}
}
}