Vertical Movement Formulas: Difference between revisions

From Minecraft Parkour Wiki
Content added Content deleted
mNo edit summary
(final)
Line 1: Line 1:
===Jump Formula===
==Jump Formula==


*<math>V\displaystyle _{Y,1} = 0.42</math>
*<math>V\displaystyle _{Y,1} = 0.42</math>
* <math>V\displaystyle _{Y,t} = \left (V_{Y,t-1} - \underset{gravity}{0.08} \right ) \times \underset{drag}{0.98}</math>
*<math>V\displaystyle _{Y,t} = \left (V_{Y,t-1} - \underset{gravity}{0.08} \right ) \times \underset{drag}{0.98}</math>




Line 15: Line 15:
*<math display="inline"> V\displaystyle _{Y,0}</math> isn't assigned a value because it has no importance. By convention, the 0<sup>th</sup> tick corresponds to the player's initial velocity before jumping.
*<math display="inline"> V\displaystyle _{Y,0}</math> isn't assigned a value because it has no importance. By convention, the 0<sup>th</sup> tick corresponds to the player's initial velocity before jumping.
*<math display="inline"> V\displaystyle _{Y,1}</math> corresponds to the initial jump motion. It is increased by 0.1 per level of [[Status Effects|Jump Boost]]
*<math display="inline"> V\displaystyle _{Y,1}</math> corresponds to the initial jump motion. It is increased by 0.1 per level of [[Status Effects|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
*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.
*When the player collides vertically with a block, vertical momentum is cancelled and only the acceleration is left.




==Jump duration ==

===Vertical Position===

: To get the position on a given tick, you simply need to sum <math display="inline">V\displaystyle _{Y}</math>

:<math display="inline">Y(n) = \sum_{t=1}^{n} V_{Y,t}</math>


===Jump duration===


:The '''duration''' of a jump is the number of ticks between jumping and landing.
:The '''duration''' of a jump is the number of ticks between jumping and landing.
Line 62: Line 55:




==Source code==

=== Source code ===
'''from [[SourceCode:EntityLivingBase|EntityLivingBase]]'''
'''from [[SourceCode:EntityLivingBase|EntityLivingBase]]'''


: <syntaxhighlight lang="java">
:<syntaxhighlight lang="java">
/* Code unrelated to vertical movement is cut out */
/* Code unrelated to vertical movement is cut out */



Revision as of 14:59, 30 August 2020

Jump Formula


If , 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

  • 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

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