垂直运动公式

From Minecraft Parkour Wiki
Revision as of 14:20, 28 January 2022 by Pjx1314 (talk | contribs) (Created page with "在 1.9+,这个阈值变为 0.003。")
Other languages:


跳跃公式

可以简单地计算出玩家在一次跳跃过程中的垂直速度:



如果,则会被设为 0(该 tick 玩家的高度不会改变)。

在 1.9+,这个阈值变为 0.003。


注意

  • isn't assigned a value because it has no importance. By convention, the 0th tick corresponds to the player's initial velocity before jumping.
  • corresponds to the initial jump motion. It is increased by 0.1 per level of Jump Boost
  • Jump height is slightly higher in 1.9 due to the momentum threshold being reduced (old=1.249, new=1.252)
  • Terminal velocity is -3.92 m/t
  • When the player collides vertically with a block, vertical momentum is cancelled and only the acceleration is left.


Jump duration

The duration of a jump is the number of ticks between jumping and landing.
It also corresponds to the period of that jump's cycle when performed repeatedly.
This notion is linked to the notion of Tiers.
Description Duration
Flat Jump 12 t
3bc Jump 11 t
+0.5 Jump 10 t
+1 Jump 9 t
2.5bc Jump 6 t
2bc Jump 3 t
1.8125bc Jump 2 t


Source code

/* Code unrelated to vertical movement is cut out */
</div>

<div lang="en" dir="ltr" class="mw-content-ltr">
protected float getJumpUpwardsMotion(){
    return 0.42F;
}
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
protected void jump()
{
    this.motionY = this.getJumpUpwardsMotion();
    if (this.isPotionActive(Potion.jump))
    {
        this.motionY += (this.getActivePotionEffect(Potion.jump).getAmplifier() + 1) * 0.1F;
    }
    this.isAirBorne = true;
}
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
public void moveEntityWithHeading(float strafe, float forward)
{
    ... /* also moves the player horizontally */
</div>

    <div lang="en" dir="ltr" class="mw-content-ltr">
this.motionY -= 0.08;
    this.motionY *= 0.98;
}
</div>


<div lang="en" dir="ltr" class="mw-content-ltr">
public void onLivingUpdate()
{
    if (this.jumpTicks > 0)
        --this.jumpTicks;
</div>

    <div lang="en" dir="ltr" class="mw-content-ltr">
if (Math.abs(this.motionY) < 0.005D)
        this.motionY = 0.0D;
</div>


    <div lang="en" dir="ltr" class="mw-content-ltr">
if (this.isJumping)
    {
        ... /* different if in water or lava */
</div>

        <div lang="en" dir="ltr" class="mw-content-ltr">
if (this.onGround && this.jumpTicks == 0)
        {
            this.jump();
            this.jumpTicks = 10; //activate autojump cooldown (0.5s)
        }
    }
        
    else
    {
        this.jumpTicks = 0; //reset autojump cooldown
    }
</div>

    <div lang="en" dir="ltr" class="mw-content-ltr">
...
    
    this.moveEntityWithHeading(this.moveStrafing, this.moveForward);
}