@@ -1091,6 +1091,7 @@ void PlayerSAO::step(float dtime, bool send_recommended)
10911091 m_time_from_last_teleport += dtime;
10921092 m_time_from_last_punch += dtime;
10931093 m_nocheat_dig_time += dtime;
1094+ m_max_speed_override_time = MYMAX (m_max_speed_override_time - dtime, 0 .0f );
10941095
10951096 // Each frame, parent position is copied if the object is attached,
10961097 // otherwise it's calculated normally.
@@ -1412,6 +1413,19 @@ std::string PlayerSAO::getPropertyPacket()
14121413 return gob_cmd_set_properties (m_prop);
14131414}
14141415
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+
14151429bool PlayerSAO::checkMovementCheat ()
14161430{
14171431 if (isAttached () || m_is_singleplayer ||
@@ -1431,6 +1445,14 @@ bool PlayerSAO::checkMovementCheat()
14311445 too, and much more lightweight.
14321446 */
14331447
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+
14341456 float player_max_walk = 0 ; // horizontal movement
14351457 float player_max_jump = 0 ; // vertical upwards movement
14361458
@@ -1439,10 +1461,13 @@ bool PlayerSAO::checkMovementCheat()
14391461 else
14401462 player_max_walk = m_player->movement_speed_walk ; // Normal speed
14411463 player_max_walk *= m_physics_override_speed;
1464+ player_max_walk = MYMAX (player_max_walk, override_max_H);
1465+
14421466 player_max_jump = m_player->movement_speed_jump * m_physics_override_jump;
14431467 // FIXME: Bouncy nodes cause practically unbound increase in Y speed,
14441468 // until this can be verified correctly, tolerate higher jumping speeds
14451469 player_max_jump *= 2.0 ;
1470+ player_max_jump = MYMAX (player_max_jump, override_max_V);
14461471
14471472 // Don't divide by zero!
14481473 if (player_max_walk < 0 .0001f )
0 commit comments