Jumping

From Minecraft Parkour Wiki

Jumping is an essential mechanic that is quite self-explanatory.


Activation

To start a jump, the player must have been on ground the previous tick. This is why the player is able to run off a block for 1 tick (e.g. with a headhitter timing) and still be able to jump.

When the Jump key is held, the player jumps at most once every 10 ticks (0.5s)

  • Holding jump is not optimal when going up by more than 0.75b per jump. (consequence: towering is faster when jumping manually)
  • Releasing jump resets the cooldown, making the player able to jump again on the next tick.

When a jump is initiated, the player's vertical speed is set to 0.42. On every following tick, it is decreased by 0.08 (gravity), then multiplied by 0.98 (drag).

  • When the player hits a ceiling, their vertical speed is set to 0 and they immediately start falling.
  • When the player hits the ground, their vertical speed is set to 0 and the onGround flag is set as true.

Jumping in water or lava makes the player move upward.


Jump Height

Prior to 1.9, the maximum jump height is 1.249b. It is increased in 1.9+ by ~0.003b, making the player able to jump 1.252b high.

On flat ground, a jump lasts 12 ticks (0.6s).


Speed

When combined with Sprinting, jumping adds 0.2 units of acceleration towards the player's facing.

In air, the player accelerates less quickly (only 20% of the base acceleration value), but conserves more speed (91% every tick, instead of 54.6%).

Therefore, sprint-jumping is a very efficient way to build and conserve speed.


Code

The following snippets of code deal with how jump is activated.

/* From EntityLivingBase.java, stripped of irrelevant code */
public void onLivingUpdate()
{
    if (this.jumpTicks > 0)
        --this.jumpTicks;

    if (this.isJumping)
    {
        if (this.isInWater())
            this.handleJumpWater(); //motionY += 0.04

        else if (this.isInLava())
            this.handleJumpLava();  //motionY += 0.04

        else if (this.onGround && this.jumpTicks == 0)
        {
                this.jump();
                this.jumpTicks = 10;
        }
    }

    //releasing the jump key resets the 10 tick cooldown.
    else
        this.jumpTicks = 0;
}


/* From EntityLivingBase.java */
protected void jump()
{
    this.motionY = 0.42; //Initial speed

    //apply jump boost
    if (this.isPotionActive(Potion.jump))
        this.motionY += (this.getActivePotionEffect(Potion.jump).getAmplifier() + 1) * 0.1F;

    //apply sprintjump boost
    if (this.isSprinting())
    {
        float f = this.rotationYaw * 0.017453292F; //multiply by pi/180 to convert to radians
        this.motionX -= MathHelper.sin(f) * 0.2F;
        this.motionZ += MathHelper.cos(f) * 0.2F;
    }
}