diff --git a/game-fork/src-overlay/net/rustnotmc/client/RsxPlayerTuning.java b/game-fork/src-overlay/net/rustnotmc/client/RsxPlayerTuning.java index 2430d10..3068e32 100644 --- a/game-fork/src-overlay/net/rustnotmc/client/RsxPlayerTuning.java +++ b/game-fork/src-overlay/net/rustnotmc/client/RsxPlayerTuning.java @@ -42,6 +42,12 @@ public final class RsxPlayerTuning { /** The speed the vanilla jumps with. */ private static final float VANILLA_JUMP_MOTION = 0.42F; + /** How fast the motion falls on every tick. */ + private static final float GRAVITY = 0.08F; + + /** How much of the motion the air takes on every tick. */ + private static final float AIR_DRAG = 0.98F; + private RsxPlayerTuning() { } @@ -78,15 +84,43 @@ public final class RsxPlayerTuning { /** * The upward speed a jump of that height needs. * - * The vanilla jumps with 0.42 and that carries it 1.25 blocks. The height - * grows with the square of the speed, so the speed for a height is the - * vanilla one times the square root of the ratio. + * The height of a jump is not the square of the speed, because the + * motion loses a little to the air on every tick. So the speed is found + * the honest way: the height is computed for a guess and the guess is + * corrected until it is the height that was asked for. */ public static float jumpMotion(float height) { if (height <= 0.0F) { return VANILLA_JUMP_MOTION; } - return VANILLA_JUMP_MOTION * (float) Math.sqrt(height / VANILLA_JUMP_HEIGHT); + float low = 0.0F; + float high = 1.0F; + for (int i = 0; i < 60; i++) { + float middle = (low + high) * 0.5F; + if (heightOf(middle) < height) { + low = middle; + } else { + high = middle; + } + } + return (low + high) * 0.5F; + } + + /** + * How high a jump with that speed carries the player. + * + * The motion of the vanilla on every tick: the speed falls by the + * gravity and then by the air. The player is as high as the sum of the + * upward steps. + */ + private static float heightOf(float motion) { + float height = 0.0F; + float speed = motion; + while (speed > 0.0F) { + height += speed; + speed = (speed - GRAVITY) * AIR_DRAG; + } + return height; } private static float setting(String name, float fallback, float floor) {