diff --git a/apps/openmw/mwmechanics/actors.cpp b/apps/openmw/mwmechanics/actors.cpp index df0d6a5e85..c1f552ae49 100644 --- a/apps/openmw/mwmechanics/actors.cpp +++ b/apps/openmw/mwmechanics/actors.cpp @@ -246,7 +246,6 @@ namespace MWMechanics if(iter->second.getState() >= CharState_Death1) continue; - iter->second.setMovementVector(Ogre::Vector3::ZERO); iter->second.setState(CharState_Death1, false); ++mDeathCount[MWWorld::Class::get(iter->first).getId(iter->first)]; @@ -259,15 +258,6 @@ namespace MWMechanics if(!paused) { - for(PtrControllerMap::iterator iter(mActors.begin());iter != mActors.end();++iter) - { - if(iter->second.getState() >= CharState_Death1) - continue; - - Ogre::Vector3 movement = MWWorld::Class::get(iter->first).getMovementVector(iter->first); - iter->second.setMovementVector(movement); - } - std::vector > movement; for(PtrControllerMap::iterator iter(mActors.begin());iter != mActors.end();++iter) { diff --git a/apps/openmw/mwmechanics/character.cpp b/apps/openmw/mwmechanics/character.cpp index 4f8525eca2..f5a4dda51b 100644 --- a/apps/openmw/mwmechanics/character.cpp +++ b/apps/openmw/mwmechanics/character.cpp @@ -139,36 +139,35 @@ void CharacterController::markerEvent(float time, const std::string &evt) } -void CharacterController::setMovementVector(const Ogre::Vector3 &vec) +Ogre::Vector3 CharacterController::update(float duration) { + const MWWorld::Class &cls = MWWorld::Class::get(mPtr); + const Ogre::Vector3 &vec = cls.getMovementVector(mPtr); + // HACK: The length we get is too large. float speed = std::max(1.0f, vec.length() / 32.0f); - if(vec.length() >= 0.1f) + if(std::abs(vec.x/2.0f) > std::abs(vec.y)) { - if(std::abs(vec.x/2.0f) > std::abs(vec.y)) - { - if(vec.x > 0.0f) - setState(CharState_WalkRight, true); - else if(vec.x < 0.0f) - setState(CharState_WalkLeft, true); - } - else if(vec.y < 0.0f) - setState(CharState_WalkBack, true); - else - setState(CharState_WalkForward, true); + if(vec.x > 0.0f) + setState(CharState_WalkRight, true); + else if(vec.x < 0.0f) + setState(CharState_WalkLeft, true); } + else if(vec.y > 0.0f) + setState(CharState_WalkForward, true); + else if(vec.y < 0.0f) + setState(CharState_WalkBack, true); else - setState(CharState_Idle, true); + { + if(!(getState() >= CharState_Death1)) + setState(CharState_Idle, true); + } if(mAnimation) mAnimation->setSpeedMult(speed); mDirection = vec.normalisedCopy(); -} - -Ogre::Vector3 CharacterController::update(float duration) -{ Ogre::Vector3 movement = Ogre::Vector3::ZERO; if(mAnimation && !mSkipAnim) movement += mAnimation->runAnimation(duration); diff --git a/apps/openmw/mwmechanics/character.hpp b/apps/openmw/mwmechanics/character.hpp index c8e92f7a92..69d73263bd 100644 --- a/apps/openmw/mwmechanics/character.hpp +++ b/apps/openmw/mwmechanics/character.hpp @@ -66,8 +66,6 @@ public: void playGroup(const std::string &groupname, int mode, int count); void skipAnim(); - void setMovementVector(const Ogre::Vector3 &vec); - void setState(CharacterState state, bool loop); CharacterState getState() const { return mState; }