Vertical Movement Formulas

Jump Formula

 * $$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 $ \left | V\displaystyle _{Y,t} \right | < 0.005 $,  $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


 * $ 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.
 * $ V\displaystyle _{Y,1}$ corresponds to the initial jump motion. It is increased by 0.1 per level of Jump Boost
 * 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.

Vertical Position

 * To get the position on a given tick, you simply need to sum $V\displaystyle _{Y}$


 * $Y(n) = \sum_{t=1}^{n} V_{Y,t}$

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.


 * {| class="wikitable"

!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
 * }
 * 2bc Jump
 * 3 t
 * 1.8125bc Jump
 * 2 t
 * }
 * 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 }

...   this.moveEntityWithHeading(this.moveStrafing, this.moveForward); }