Прыжок считается точно: высота подбирается обратным счетом
Формула v = 0.42 * sqrt(h / 1.25) давала 1.48 вместо 1.5, потому что движение каждый тик теряет часть на сопротивление воздуха. Теперь высота находится обратным счетом по физике ваниллы (гравитация 0.08, сопротивление 0.98). Высота -> импульс: 1.25 -> 0.41961, 1.35 -> 0.43713, 1.5 -> 0.46341, 1.6 -> 0.48093, 2.0 -> 0.54485. Задаётся: run-game.ps1 -ExtraArgs "-Drsx.jumpHeight=1.5"
This commit is contained in:
@@ -42,6 +42,12 @@ public final class RsxPlayerTuning {
|
|||||||
/** The speed the vanilla jumps with. */
|
/** The speed the vanilla jumps with. */
|
||||||
private static final float VANILLA_JUMP_MOTION = 0.42F;
|
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() {
|
private RsxPlayerTuning() {
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -78,15 +84,43 @@ public final class RsxPlayerTuning {
|
|||||||
/**
|
/**
|
||||||
* The upward speed a jump of that height needs.
|
* The upward speed a jump of that height needs.
|
||||||
*
|
*
|
||||||
* The vanilla jumps with 0.42 and that carries it 1.25 blocks. The height
|
* The height of a jump is not the square of the speed, because the
|
||||||
* grows with the square of the speed, so the speed for a height is the
|
* motion loses a little to the air on every tick. So the speed is found
|
||||||
* vanilla one times the square root of the ratio.
|
* 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) {
|
public static float jumpMotion(float height) {
|
||||||
if (height <= 0.0F) {
|
if (height <= 0.0F) {
|
||||||
return VANILLA_JUMP_MOTION;
|
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) {
|
private static float setting(String name, float fallback, float floor) {
|
||||||
|
|||||||
Reference in New Issue
Block a user