mirror of
https://github.com/TES3MP/openmw-tes3mp.git
synced 2025-02-01 21:45:38 +00:00
Correct run speed for creatures (by Hrnchamd - Fixes #1136)
This commit is contained in:
parent
7f1d0fc2a2
commit
3d9bdad8ba
2 changed files with 51 additions and 3 deletions
|
@ -537,8 +537,8 @@ namespace MWClass
|
|||
|
||||
bool running = ptr.getClass().getCreatureStats(ptr).getStance(MWMechanics::CreatureStats::Stance_Run);
|
||||
|
||||
float runSpeed = walkSpeed*6;
|
||||
runSpeed = std::min(gmst.fMaxWalkSpeedCreature->getFloat(), runSpeed); // flame atronach runs way too fast without this
|
||||
// The Run speed difference for creatures comes from the animation speed difference (see runStateToWalkState in character.cpp)
|
||||
float runSpeed = walkSpeed;
|
||||
|
||||
float moveSpeed;
|
||||
if(normalizedEncumbrance >= 1.0f)
|
||||
|
|
|
@ -55,6 +55,43 @@ std::string getBestAttack (const ESM::Weapon* weapon)
|
|||
return "thrust";
|
||||
}
|
||||
|
||||
// Converts a movement Run state to its equivalent Walk state.
|
||||
MWMechanics::CharacterState runStateToWalkState (MWMechanics::CharacterState state)
|
||||
{
|
||||
using namespace MWMechanics;
|
||||
CharacterState ret = state;
|
||||
switch (state)
|
||||
{
|
||||
case CharState_RunForward:
|
||||
ret = CharState_WalkForward;
|
||||
break;
|
||||
case CharState_RunBack:
|
||||
ret = CharState_WalkBack;
|
||||
break;
|
||||
case CharState_RunLeft:
|
||||
ret = CharState_WalkLeft;
|
||||
break;
|
||||
case CharState_RunRight:
|
||||
ret = CharState_WalkRight;
|
||||
break;
|
||||
case CharState_SwimRunForward:
|
||||
ret = CharState_SwimWalkForward;
|
||||
break;
|
||||
case CharState_SwimRunBack:
|
||||
ret = CharState_SwimWalkBack;
|
||||
break;
|
||||
case CharState_SwimRunLeft:
|
||||
ret = CharState_SwimWalkLeft;
|
||||
break;
|
||||
case CharState_SwimRunRight:
|
||||
ret = CharState_SwimWalkRight;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
namespace MWMechanics
|
||||
|
@ -323,7 +360,18 @@ void CharacterController::refreshCurrentAnims(CharacterState idle, CharacterStat
|
|||
|
||||
bool isrunning = mPtr.getClass().getCreatureStats(mPtr).getStance(MWMechanics::CreatureStats::Stance_Run);
|
||||
|
||||
if(mMovementSpeed > 0.0f && (vel=mAnimation->getVelocity(mCurrentMovement)) > 1.0f)
|
||||
// For non-flying creatures, MW uses the Walk animation to calculate the animation velocity
|
||||
// even if we are running. This must be replicated, otherwise the observed speed would differ drastically.
|
||||
std::string anim = mCurrentMovement;
|
||||
if (mPtr.getClass().getTypeName() == typeid(ESM::Creature).name()
|
||||
&& !(mPtr.get<ESM::Creature>()->mBase->mFlags & ESM::Creature::Flies))
|
||||
{
|
||||
CharacterState walkState = runStateToWalkState(mMovementState);
|
||||
const StateInfo *stateinfo = std::find_if(sMovementList, sMovementListEnd, FindCharState(walkState));
|
||||
anim = stateinfo->groupname;
|
||||
}
|
||||
|
||||
if(mMovementSpeed > 0.0f && (vel=mAnimation->getVelocity(anim)) > 1.0f)
|
||||
{
|
||||
mMovementAnimVelocity = vel;
|
||||
speedmult = mMovementSpeed / vel;
|
||||
|
|
Loading…
Reference in a new issue