@@ -1091,6 +1091,7 @@ void PlayerSAO::step(float dtime, bool send_recommended)
1091
1091
m_time_from_last_teleport += dtime;
1092
1092
m_time_from_last_punch += dtime;
1093
1093
m_nocheat_dig_time += dtime;
1094
+ m_max_speed_override_time = MYMAX (m_max_speed_override_time - dtime, 0 .0f );
1094
1095
1095
1096
// Each frame, parent position is copied if the object is attached,
1096
1097
// otherwise it's calculated normally.
@@ -1412,6 +1413,19 @@ std::string PlayerSAO::getPropertyPacket()
1412
1413
return gob_cmd_set_properties (m_prop);
1413
1414
}
1414
1415
1416
+ void PlayerSAO::setMaxSpeedOverride (const v3f &vel)
1417
+ {
1418
+ if (m_max_speed_override_time == 0 .0f )
1419
+ m_max_speed_override = vel;
1420
+ else
1421
+ m_max_speed_override += vel;
1422
+ if (m_player) {
1423
+ float accel = MYMIN (m_player->movement_acceleration_default ,
1424
+ m_player->movement_acceleration_air );
1425
+ m_max_speed_override_time = m_max_speed_override.getLength () / accel / BS;
1426
+ }
1427
+ }
1428
+
1415
1429
bool PlayerSAO::checkMovementCheat ()
1416
1430
{
1417
1431
if (isAttached () || m_is_singleplayer ||
@@ -1431,6 +1445,14 @@ bool PlayerSAO::checkMovementCheat()
1431
1445
too, and much more lightweight.
1432
1446
*/
1433
1447
1448
+ float override_max_H, override_max_V;
1449
+ if (m_max_speed_override_time > 0 .0f ) {
1450
+ override_max_H = MYMAX (fabs (m_max_speed_override.X ), fabs (m_max_speed_override.Z ));
1451
+ override_max_V = fabs (m_max_speed_override.Y );
1452
+ } else {
1453
+ override_max_H = override_max_V = 0 .0f ;
1454
+ }
1455
+
1434
1456
float player_max_walk = 0 ; // horizontal movement
1435
1457
float player_max_jump = 0 ; // vertical upwards movement
1436
1458
@@ -1439,10 +1461,13 @@ bool PlayerSAO::checkMovementCheat()
1439
1461
else
1440
1462
player_max_walk = m_player->movement_speed_walk ; // Normal speed
1441
1463
player_max_walk *= m_physics_override_speed;
1464
+ player_max_walk = MYMAX (player_max_walk, override_max_H);
1465
+
1442
1466
player_max_jump = m_player->movement_speed_jump * m_physics_override_jump;
1443
1467
// FIXME: Bouncy nodes cause practically unbound increase in Y speed,
1444
1468
// until this can be verified correctly, tolerate higher jumping speeds
1445
1469
player_max_jump *= 2.0 ;
1470
+ player_max_jump = MYMAX (player_max_jump, override_max_V);
1446
1471
1447
1472
// Don't divide by zero!
1448
1473
if (player_max_walk < 0 .0001f )
0 commit comments