From 9b8399c3536e9987760f42e7697a043e5c1798c6 Mon Sep 17 00:00:00 2001 From: Alexei Kotov Date: Mon, 7 Nov 2022 19:06:01 +0300 Subject: [PATCH] Handle landing in the frame the jump is over (bug #5849) --- CHANGELOG.md | 1 + apps/openmw/mwmechanics/character.cpp | 15 ++++++++------- apps/openmw/mwmechanics/character.hpp | 1 + 3 files changed, 10 insertions(+), 7 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 749d62ad6e..0469254e2c 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -7,6 +7,7 @@ Bug #5057: Weapon swing sound plays at same pitch whether it hits or misses Bug #5129: Stuttering animation on Centurion Archer Bug #5714: Touch spells cast using ExplodeSpell don't always explode + Bug #5849: Paralysis breaks landing Bug #5977: Fatigueless NPCs' corpse underwater changes animation on game load Bug #6427: Enemy health bar disappears before damaging effect ends Bug #6661: Saved games that have no preview screenshot cause issues or crashes diff --git a/apps/openmw/mwmechanics/character.cpp b/apps/openmw/mwmechanics/character.cpp index 14fb583238..bbf92815af 100644 --- a/apps/openmw/mwmechanics/character.cpp +++ b/apps/openmw/mwmechanics/character.cpp @@ -2073,13 +2073,14 @@ namespace MWMechanics } } - bool inJump = false; + bool wasInJump = mInJump; + mInJump = false; if (!inwater && !flying && solid) { // In the air (either getting up —ascending part of jump— or falling). if (!onground) { - inJump = true; + mInJump = true; jumpstate = JumpState_InAir; static const float fJumpMoveBase = gmst.find("fJumpMoveBase")->mValue.getFloat(); @@ -2097,7 +2098,7 @@ namespace MWMechanics float z = cls.getJump(mPtr); if (z > 0.f) { - inJump = true; + mInJump = true; if (vec.x() == 0 && vec.y() == 0) vec.z() = z; else @@ -2110,9 +2111,9 @@ namespace MWMechanics } } - if (!inJump) + if (!mInJump) { - if (mJumpState == JumpState_InAir && !flying && solid) + if (mJumpState == JumpState_InAir && !flying && solid && wasInJump) { float height = cls.getCreatureStats(mPtr).land(isPlayer); float healthLost = 0.f; @@ -2274,7 +2275,7 @@ namespace MWMechanics { if (inwater) idlestate = CharState_IdleSwim; - else if (sneak && !inJump) + else if (sneak && !mInJump) idlestate = CharState_IdleSneak; else idlestate = CharState_Idle; @@ -2288,7 +2289,7 @@ namespace MWMechanics updateIdleStormState(inwater); } - if (inJump) + if (mInJump) mMovementAnimationControlled = false; if (isTurning()) diff --git a/apps/openmw/mwmechanics/character.hpp b/apps/openmw/mwmechanics/character.hpp index b397d788ea..a375b8b8cf 100644 --- a/apps/openmw/mwmechanics/character.hpp +++ b/apps/openmw/mwmechanics/character.hpp @@ -160,6 +160,7 @@ namespace MWMechanics JumpingState mJumpState{ JumpState_None }; std::string mCurrentJump; + bool mInJump{ false }; int mWeaponType{ ESM::Weapon::None }; std::string mCurrentWeapon;