From 659f470565efff7a8789d1cc8b1cd18ad7d15ad0 Mon Sep 17 00:00:00 2001 From: Elias Fleckenstein Date: Sun, 12 Dec 2021 16:08:12 +0100 Subject: Add correct gravity calculation --- src/client/clientenvironment.cpp | 7 ++++++- src/client/content_cao.cpp | 3 +++ src/client/localplayer.h | 1 + 3 files changed, 10 insertions(+), 1 deletion(-) (limited to 'src/client') diff --git a/src/client/clientenvironment.cpp b/src/client/clientenvironment.cpp index 448af36c6..6c7ea6578 100644 --- a/src/client/clientenvironment.cpp +++ b/src/client/clientenvironment.cpp @@ -197,6 +197,8 @@ void ClientEnvironment::step(float dtime) if (!free_move) { // Gravity v3f speed = lplayer->getSpeed(); + v3f old_speed = speed; + if (!is_climbing && !lplayer->in_liquid) speed.Y -= lplayer->movement_gravity * lplayer->physics_override_gravity * dtime_part * 2.0f; @@ -233,7 +235,10 @@ void ClientEnvironment::step(float dtime) speed += d; } - lplayer->setSpeed(speed); + lplayer->setSpeed(lplayer->physics_override_new_gravity + ? (speed + old_speed) / 2.0f + : speed + ); } /* diff --git a/src/client/content_cao.cpp b/src/client/content_cao.cpp index a80a3ce4e..46007a622 100644 --- a/src/client/content_cao.cpp +++ b/src/client/content_cao.cpp @@ -1771,6 +1771,8 @@ void GenericCAO::processMessage(const std::string &data) bool sneak = !readU8(is); bool sneak_glitch = !readU8(is); bool new_move = !readU8(is); + // this one is off by default + bool new_gravity = readU8(is); if(m_is_local_player) @@ -1782,6 +1784,7 @@ void GenericCAO::processMessage(const std::string &data) player->physics_override_sneak = sneak; player->physics_override_sneak_glitch = sneak_glitch; player->physics_override_new_move = new_move; + player->physics_override_new_gravity = new_gravity; } } else if (cmd == AO_CMD_SET_ANIMATION) { // TODO: change frames send as v2s32 value diff --git a/src/client/localplayer.h b/src/client/localplayer.h index 13b35ae4e..04b78298b 100644 --- a/src/client/localplayer.h +++ b/src/client/localplayer.h @@ -68,6 +68,7 @@ public: bool physics_override_sneak_glitch = false; // Temporary option for old move code bool physics_override_new_move = true; + bool physics_override_new_gravity = false; void move(f32 dtime, Environment *env, f32 pos_max_d); void move(f32 dtime, Environment *env, f32 pos_max_d, -- cgit v1.2.3