# Vertical Movement Formulas

Other languages:

## Jump Formula

The player's vertical speed is quite easy to calculate over the course of a jump:

• $V\displaystyle _{Y,1} = 0.42$ • $V\displaystyle _{Y,t} = \left (V_{Y,t-1} - \underset{gravity}{0.08} \right ) \times \underset{drag}{0.98}$ If ${\textstyle \left | V\displaystyle _{Y,t} \right | < 0.005 }$ , ${\textstyle V\displaystyle _{Y,t}}$ is set to 0 instead (the player's height doesn't change for that tick)

In 1.9+, it's compared to 0.003 instead.

Notes

• ${\textstyle V\displaystyle _{Y,0}}$ isn't assigned a value because it has no importance. By convention, the 0th tick corresponds to the player's initial velocity before jumping.
• ${\textstyle V\displaystyle _{Y,1}}$ 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

from EntityLivingBase

/* Code unrelated to vertical movement is cut out */

protected float getJumpUpwardsMotion(){
return 0.42F;
}

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;
}

public void moveEntityWithHeading(float strafe, float forward)
{
... /* also moves the player horizontally */

this.motionY -= 0.08;
this.motionY *= 0.98;
}

public void onLivingUpdate()
{
if (this.jumpTicks > 0)
--this.jumpTicks;

if (Math.abs(this.motionY) < 0.005D)
this.motionY = 0.0D;

if (this.isJumping)
{
... /* different if in water or lava */

if (this.onGround && this.jumpTicks == 0)
{
this.jump();
this.jumpTicks = 10; //activate autojump cooldown (0.5s)
}
}

else
{
this.jumpTicks = 0; //reset autojump cooldown
}

...