From 253de65d13f93dee18fd7cc3f027ca5bdb3c51d5 Mon Sep 17 00:00:00 2001 From: Alexei Kotov Date: Mon, 13 Jun 2022 17:14:12 +0300 Subject: [PATCH] Fix knockout animation interruption/looping --- apps/openmw/mwmechanics/character.cpp | 18 +++--------------- apps/openmw/mwmechanics/character.hpp | 2 -- 2 files changed, 3 insertions(+), 17 deletions(-) diff --git a/apps/openmw/mwmechanics/character.cpp b/apps/openmw/mwmechanics/character.cpp index 2e3777e5b0..1f1aa80856 100644 --- a/apps/openmw/mwmechanics/character.cpp +++ b/apps/openmw/mwmechanics/character.cpp @@ -329,7 +329,6 @@ void CharacterController::refreshHitRecoilAnims(CharacterState& idle) bool knockdown = stats.getKnockedDown(); bool block = stats.getBlock(); bool isSwimming = world->isSwimming(mPtr); - auto& prng = world->getPrng(); if (mHitState != CharState_None) { @@ -341,29 +340,21 @@ void CharacterController::refreshHitRecoilAnims(CharacterState& idle) stats.setHitRecovery(false); stats.setBlock(false); } - else if (isKnockedOut() && !knockout && mTimeUntilWake <= 0) - { - mAnimation->disable(mCurrentHit); - mAnimation->play(mCurrentHit, Priority_Knockdown, MWRender::Animation::BlendMask_All, true, 1, "loop stop", "stop", 0.0f, 0); - } + else if (isKnockedOut()) + mAnimation->setLoopingEnabled(mCurrentHit, knockout); return; } if (!knockout && !knockdown && !recovery && !block) return; - if (knockout) - mTimeUntilWake = Misc::Rng::rollClosedProbability(prng) * 2 + 1; // Wake up after 1 to 3 seconds - MWRender::Animation::AnimPriority priority(Priority_Knockdown); - bool autodisable = true; std::string startKey = "start"; std::string stopKey = "stop"; if (knockout) { mHitState = isSwimming ? CharState_SwimKnockOut : CharState_KnockOut; stats.setKnockedDown(true); - autodisable = false; } else if (knockdown) { @@ -420,7 +411,7 @@ void CharacterController::refreshHitRecoilAnims(CharacterState& idle) } } - mAnimation->play(mCurrentHit, priority, MWRender::Animation::BlendMask_All, autodisable, 1, startKey, stopKey, 0.0f, ~0ul); + mAnimation->play(mCurrentHit, priority, MWRender::Animation::BlendMask_All, true, 1, startKey, stopKey, 0.0f, ~0ul); idle = CharState_None; } @@ -1817,9 +1808,6 @@ void CharacterController::update(float duration) updateMagicEffects(); - if (isKnockedOut()) - mTimeUntilWake -= duration; - bool isPlayer = mPtr == MWMechanics::getPlayer(); bool isFirstPersonPlayer = isPlayer && MWBase::Environment::get().getWorld()->isFirstPerson(); bool godmode = isPlayer && MWBase::Environment::get().getWorld()->getGodModeState(); diff --git a/apps/openmw/mwmechanics/character.hpp b/apps/openmw/mwmechanics/character.hpp index bd9fa70711..a15647d5be 100644 --- a/apps/openmw/mwmechanics/character.hpp +++ b/apps/openmw/mwmechanics/character.hpp @@ -190,8 +190,6 @@ class CharacterController : public MWRender::Animation::TextKeyListener bool mCastingManualSpell{false}; - float mTimeUntilWake{0.f}; - bool mIsMovingBackward{false}; osg::Vec2f mSmoothedSpeed;