Untitled
unknown
java
a year ago
1.9 kB
7
Indexable
for each tick {
if (strafing || forwarding) { /* movement key pressed */
if (strafing && forwarding) { /* 45° */
if (sneaking) {
input_vec = (±0.294, 0, ±0.294);
}
else {
input_vec = (±0.707, 0, ±0.707); /* speed capping via normalization, i.e. v/norm(v) */
}
}
else { /* standard forward or strafe */
if (sneaking) {
input_vec = (±0.294, 0, 0); /* or (0, 0, ±0.294); */
}
else {
input_vec = (±0.98, 0, 0); /* or (0, 0, ±0.98); */
}
}
/*
* X xor Z sneaking speed factor is 0.294b/s
* 45° " 0.416b/s
* => when sneaking, 45° is sqrt(2) faster than normal sneaking - pythagore without capping
*
* standard (X xor Z) speed factor is 0.98b/s
* 45° movement is 1b/s (speed is capped)
* => without sneaking, 45° is only, but nevertheless, 2% faster than normal movement
*/
/*
* slipperiness:
* 0.600 standard
* 0.980 ice / packed ice
* 0.989 blue ice
*/
if (onGround) {
input_vec *= 0.1 * (0.6/slipperiness)^3; /* more slippery -> inputs contribute less to movement */
}
else { /* in air */
input_vec *= 0.02;
}
/* sprinting is first applied here, so doesn't get capped */
if (sprinting) {
input_vec *= 1.3;
}
delta_pos += projectview(input_vec, rotationYaw); /* speed from previous tick is updated from current inputs */
}
/* delta_pos is like speed*tick_duration, so Δpos = v Δt */
pos += delta_pos;
/* speed update from the environment for the next tick: */
delta_pos[1] -= 0.08; /* constant gravity accel, 32b/s^2! */
delta_pos[1] *= 0.98; /* exponential Y speed damping from air drag */
if (onGround) {
delta_pos[0|2] *= 0.91 * slipperiness; /* exponential X/Z speed damping from ground friction => more slippery -> speed/inertia is kept more */
}
else {
delta_pos[0|2] *= 0.91 /* exponential X/Z speed damping from air drag, more than Y! */
}
}Editor is loading...
Leave a Comment