diff --git a/doc/breakages.md b/doc/breakages.md index f625a0f4d..9f59b9705 100644 --- a/doc/breakages.md +++ b/doc/breakages.md @@ -3,6 +3,7 @@ This document contains a list of breaking changes to be made in the next major version. * Remove attachment space multiplier (*10) +* Remove player gravity multiplier (*2) * `get_sky()` returns a table (without arg) * `game.conf` name/id mess * remove `depends.txt` / `description.txt` (would simplify ContentDB and Minetest code a little) diff --git a/src/client/clientenvironment.cpp b/src/client/clientenvironment.cpp index d7b3c4950..f5e8b3601 100644 --- a/src/client/clientenvironment.cpp +++ b/src/client/clientenvironment.cpp @@ -195,21 +195,24 @@ void ClientEnvironment::step(float dtime) lplayer->applyControl(dtime_part, this); // Apply physics + lplayer->gravity = 0; if (!free_move) { // Gravity - v3f speed = lplayer->getSpeed(); if (!is_climbing && !lplayer->in_liquid) - speed.Y -= lplayer->movement_gravity * - lplayer->physics_override.gravity * dtime_part * 2.0f; + // HACK the factor 2 for gravity is arbitrary and should be removed eventually + lplayer->gravity = 2 * lplayer->movement_gravity * lplayer->physics_override.gravity; // Liquid floating / sinking if (!is_climbing && lplayer->in_liquid && !lplayer->swimming_vertical && !lplayer->swimming_pitch) - speed.Y -= lplayer->movement_liquid_sink * dtime_part * 2.0f; + // HACK the factor 2 for gravity is arbitrary and should be removed eventually + lplayer->gravity = 2 * lplayer->movement_liquid_sink; // Movement resistance if (lplayer->move_resistance > 0) { + v3f speed = lplayer->getSpeed(); + // How much the node's move_resistance blocks movement, ranges // between 0 and 1. Should match the scale at which liquid_viscosity // increase affects other liquid attributes. @@ -232,15 +235,16 @@ void ClientEnvironment::step(float dtime) (1 - resistance_factor); v3f d = d_wanted.normalize() * (dl * dtime_part * 100.0f); speed += d; - } - lplayer->setSpeed(speed); + lplayer->setSpeed(speed); + } } /* Move the lplayer. This also does collision detection. */ + lplayer->move(dtime_part, this, position_max_increment, &player_collisions); } diff --git a/src/client/localplayer.cpp b/src/client/localplayer.cpp index 14be3321b..f9caf9e8b 100644 --- a/src/client/localplayer.cpp +++ b/src/client/localplayer.cpp @@ -292,7 +292,7 @@ void LocalPlayer::move(f32 dtime, Environment *env, f32 pos_max_d, float player_stepheight = (m_cao == nullptr) ? 0.0f : (touching_ground ? m_cao->getStepHeight() : (0.2f * BS)); - v3f accel_f; + v3f accel_f(0, -gravity, 0); const v3f initial_position = position; const v3f initial_speed = m_speed; @@ -778,6 +778,9 @@ void LocalPlayer::old_move(f32 dtime, Environment *env, f32 pos_max_d, m_speed += m_added_velocity; m_added_velocity = v3f(0.0f); + // Apply gravity (note: this is broken, but kept since this is *old* move code) + m_speed.Y -= gravity * dtime; + /* Collision detection */ @@ -1117,8 +1120,10 @@ void LocalPlayer::handleAutojump(f32 dtime, Environment *env, } } - float jump_height = 1.1f; // TODO: better than a magic number - v3f jump_pos = initial_position + v3f(0.0f, jump_height * BS, 0.0f); + float jumpspeed = movement_speed_jump * physics_override.jump; + float peak_dtime = jumpspeed / gravity; // at the peak of the jump v = gt <=> t = v / g + float jump_height = (jumpspeed - 0.5f * gravity * peak_dtime) * peak_dtime; // s = vt - 1/2 gt^2 + v3f jump_pos = initial_position + v3f(0.0f, jump_height, 0.0f); v3f jump_speed = initial_speed; // try at peak of jump, zero step height diff --git a/src/client/localplayer.h b/src/client/localplayer.h index a2fe1766d..b9b5e14c1 100644 --- a/src/client/localplayer.h +++ b/src/client/localplayer.h @@ -62,6 +62,8 @@ public: bool swimming_vertical = false; bool swimming_pitch = false; + f32 gravity = 0; // total downwards acceleration + void move(f32 dtime, Environment *env, f32 pos_max_d); void move(f32 dtime, Environment *env, f32 pos_max_d, std::vector *collision_info); diff --git a/src/client/particles.cpp b/src/client/particles.cpp index 85baee7cd..99723d8d6 100644 --- a/src/client/particles.cpp +++ b/src/client/particles.cpp @@ -217,9 +217,10 @@ void Particle::step(float dtime) } m_pos = p_pos / BS; } else { - // apply acceleration + // apply velocity and acceleration to position + m_pos += (m_velocity + m_acceleration * 0.5f * dtime) * dtime; + // apply acceleration to velocity m_velocity += m_acceleration * dtime; - m_pos += m_velocity * dtime; } if (m_animation.type != TAT_NONE) { diff --git a/src/collision.cpp b/src/collision.cpp index be135a225..1ef094d29 100644 --- a/src/collision.cpp +++ b/src/collision.cpp @@ -249,10 +249,12 @@ collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef, } else { time_notification_done = false; } + + v3f newpos_f = *pos_f + (*speed_f + accel_f * 0.5f * dtime) * dtime; *speed_f += accel_f * dtime; - // If there is no speed, there are no collisions - if (speed_f->getLength() == 0) + // If the object is static, there are no collisions + if (newpos_f == *pos_f) return result; // Limit speed for avoiding hangs @@ -270,7 +272,6 @@ collisionMoveResult collisionMoveSimple(Environment *env, IGameDef *gamedef, //TimeTaker tt2("collisionMoveSimple collect boxes"); ScopeProfiler sp2(g_profiler, "collisionMoveSimple(): collect boxes", SPT_AVG); - v3f newpos_f = *pos_f + *speed_f * dtime; v3f minpos_f( MYMIN(pos_f->X, newpos_f.X), MYMIN(pos_f->Y, newpos_f.Y) + 0.01f * BS, // bias rounding, player often at +/-n.5 diff --git a/src/server/luaentity_sao.cpp b/src/server/luaentity_sao.cpp index ab4a9e3f2..b25f19b85 100644 --- a/src/server/luaentity_sao.cpp +++ b/src/server/luaentity_sao.cpp @@ -175,8 +175,7 @@ void LuaEntitySAO::step(float dtime, bool send_recommended) m_velocity = p_velocity; m_acceleration = p_acceleration; } else { - m_base_position += dtime * m_velocity + 0.5 * dtime - * dtime * m_acceleration; + m_base_position += (m_velocity + m_acceleration * 0.5f * dtime) * dtime; m_velocity += dtime * m_acceleration; }