1
0
Fork 0
mirror of https://github.com/luanti-org/luanti.git synced 2025-10-05 19:31:04 +00:00

Add physics overrides for walk speed and Fast Mode (#14475)

Co-authored-by: Wuzzy <Wuzzy@disroot.org>
This commit is contained in:
grorp 2024-04-30 13:50:01 +02:00 committed by GitHub
parent c044a3c1ca
commit 2bdd0a6bdb
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
8 changed files with 94 additions and 33 deletions

View file

@ -1804,6 +1804,7 @@ void GenericCAO::processMessage(const std::string &data)
bool sneak_glitch = !readU8(is);
bool new_move = !readU8(is);
// new overrides since 5.8.0
float override_speed_climb = readF32(is);
float override_speed_crouch = readF32(is);
float override_liquid_fluidity = readF32(is);
@ -1811,7 +1812,6 @@ void GenericCAO::processMessage(const std::string &data)
float override_liquid_sink = readF32(is);
float override_acceleration_default = readF32(is);
float override_acceleration_air = readF32(is);
// fallback for new overrides (since 5.8.0)
if (is.eof()) {
override_speed_climb = 1.0f;
override_speed_crouch = 1.0f;
@ -1822,6 +1822,16 @@ void GenericCAO::processMessage(const std::string &data)
override_acceleration_air = 1.0f;
}
// new overrides since 5.9.0
float override_speed_fast = readF32(is);
float override_acceleration_fast = readF32(is);
float override_speed_walk = readF32(is);
if (is.eof()) {
override_speed_fast = 1.0f;
override_acceleration_fast = 1.0f;
override_speed_walk = 1.0f;
}
if (m_is_local_player) {
auto &phys = m_env->getLocalPlayer()->physics_override;
phys.speed = override_speed;
@ -1837,6 +1847,9 @@ void GenericCAO::processMessage(const std::string &data)
phys.liquid_sink = override_liquid_sink;
phys.acceleration_default = override_acceleration_default;
phys.acceleration_air = override_acceleration_air;
phys.speed_fast = override_speed_fast;
phys.acceleration_fast = override_acceleration_fast;
phys.speed_walk = override_speed_walk;
}
} else if (cmd == AO_CMD_SET_ANIMATION) {
// TODO: change frames send as v2s32 value

View file

@ -586,6 +586,9 @@ void LocalPlayer::applyControl(float dtime, Environment *env)
// Whether superspeed mode is used or not
bool superspeed = false;
const f32 speed_walk = movement_speed_walk * physics_override.speed_walk;
const f32 speed_fast = movement_speed_fast * physics_override.speed_fast;
if (always_fly_fast && free_move && fast_move)
superspeed = true;
@ -600,11 +603,11 @@ void LocalPlayer::applyControl(float dtime, Environment *env)
if (free_move) {
// In free movement mode, aux1 descends
if (fast_move)
speedV.Y = -movement_speed_fast;
speedV.Y = -speed_fast;
else
speedV.Y = -movement_speed_walk;
speedV.Y = -speed_walk;
} else if ((in_liquid || in_liquid_stable) && !m_disable_descend) {
speedV.Y = -movement_speed_walk;
speedV.Y = -speed_walk;
swimming_vertical = true;
} else if (is_climbing && !m_disable_descend) {
speedV.Y = -movement_speed_climb * physics_override.speed_climb;
@ -632,18 +635,18 @@ void LocalPlayer::applyControl(float dtime, Environment *env)
if (free_move) {
// In free movement mode, sneak descends
if (fast_move && (control.aux1 || always_fly_fast))
speedV.Y = -movement_speed_fast;
speedV.Y = -speed_fast;
else
speedV.Y = -movement_speed_walk;
speedV.Y = -speed_walk;
} else if ((in_liquid || in_liquid_stable) && !m_disable_descend) {
if (fast_climb)
speedV.Y = -movement_speed_fast;
speedV.Y = -speed_fast;
else
speedV.Y = -movement_speed_walk;
speedV.Y = -speed_walk;
swimming_vertical = true;
} else if (is_climbing && !m_disable_descend) {
if (fast_climb)
speedV.Y = -movement_speed_fast;
speedV.Y = -speed_fast;
else
speedV.Y = -movement_speed_climb * physics_override.speed_climb;
}
@ -666,14 +669,14 @@ void LocalPlayer::applyControl(float dtime, Environment *env)
// Don't fly up if sneak key is pressed
if (player_settings.aux1_descends || always_fly_fast) {
if (fast_move)
speedV.Y = movement_speed_fast;
speedV.Y = speed_fast;
else
speedV.Y = movement_speed_walk;
speedV.Y = speed_walk;
} else {
if (fast_move && control.aux1)
speedV.Y = movement_speed_fast;
speedV.Y = speed_fast;
else
speedV.Y = movement_speed_walk;
speedV.Y = speed_walk;
}
}
} else if (m_can_jump) {
@ -690,13 +693,13 @@ void LocalPlayer::applyControl(float dtime, Environment *env)
}
} else if (in_liquid && !m_disable_jump && !control.sneak) {
if (fast_climb)
speedV.Y = movement_speed_fast;
speedV.Y = speed_fast;
else
speedV.Y = movement_speed_walk;
speedV.Y = speed_walk;
swimming_vertical = true;
} else if (is_climbing && !m_disable_jump && !control.sneak) {
if (fast_climb)
speedV.Y = movement_speed_fast;
speedV.Y = speed_fast;
else
speedV.Y = movement_speed_climb * physics_override.speed_climb;
}
@ -705,11 +708,11 @@ void LocalPlayer::applyControl(float dtime, Environment *env)
// The speed of the player (Y is ignored)
if (superspeed || (is_climbing && fast_climb) ||
((in_liquid || in_liquid_stable) && fast_climb))
speedH = speedH.normalize() * movement_speed_fast;
speedH = speedH.normalize() * speed_fast;
else if (control.sneak && !free_move && !in_liquid && !in_liquid_stable)
speedH = speedH.normalize() * movement_speed_crouch * physics_override.speed_crouch;
else
speedH = speedH.normalize() * movement_speed_walk;
speedH = speedH.normalize() * speed_walk;
speedH *= control.movement_speed; /* Apply analog input */
@ -720,13 +723,13 @@ void LocalPlayer::applyControl(float dtime, Environment *env)
(!free_move && m_can_jump && control.jump)) {
// Jumping and falling
if (superspeed || (fast_move && control.aux1))
incH = movement_acceleration_fast * BS * dtime;
incH = movement_acceleration_fast * physics_override.acceleration_fast * BS * dtime;
else
incH = movement_acceleration_air * physics_override.acceleration_air * BS * dtime;
incV = 0.0f; // No vertical acceleration in air
} else if (superspeed || (is_climbing && fast_climb) ||
((in_liquid || in_liquid_stable) && fast_climb)) {
incH = incV = movement_acceleration_fast * BS * dtime;
incH = incV = movement_acceleration_fast * physics_override.acceleration_fast * BS * dtime;
} else {
incH = incV = movement_acceleration_default * physics_override.acceleration_default * BS * dtime;
}