1
0
Fork 1
mirror of https://github.com/TES3MP/openmw-tes3mp.git synced 2025-01-31 01:45:34 +00:00

Don't play turning animations on the upperbody when in first person mode (Fixes #2287)

This commit is contained in:
scrawl 2015-07-15 15:46:31 +02:00
parent 3656851750
commit 17ada63fcb

View file

@ -355,55 +355,55 @@ void CharacterController::refreshCurrentAnims(CharacterState idle, CharacterStat
{ {
mMovementState = movement; mMovementState = movement;
std::string movement; std::string movementAnimName;
MWRender::Animation::BlendMask movemask = MWRender::Animation::BlendMask_All; MWRender::Animation::BlendMask movemask = MWRender::Animation::BlendMask_All;
const StateInfo *movestate = std::find_if(sMovementList, sMovementListEnd, FindCharState(mMovementState)); const StateInfo *movestate = std::find_if(sMovementList, sMovementListEnd, FindCharState(mMovementState));
if(movestate != sMovementListEnd) if(movestate != sMovementListEnd)
{ {
movement = movestate->groupname; movementAnimName = movestate->groupname;
if(weap != sWeaponTypeListEnd && movement.find("swim") == std::string::npos) if(weap != sWeaponTypeListEnd && movementAnimName.find("swim") == std::string::npos)
{ {
movement += weap->shortgroup; movementAnimName += weap->shortgroup;
if(!mAnimation->hasAnimation(movement)) if(!mAnimation->hasAnimation(movementAnimName))
{ {
movemask = MWRender::Animation::BlendMask_LowerBody; movemask = MWRender::Animation::BlendMask_LowerBody;
movement = movestate->groupname; movementAnimName = movestate->groupname;
} }
} }
if(!mAnimation->hasAnimation(movement)) if(!mAnimation->hasAnimation(movementAnimName))
{ {
std::string::size_type swimpos = movement.find("swim"); std::string::size_type swimpos = movementAnimName.find("swim");
if(swimpos == std::string::npos) if(swimpos == std::string::npos)
{ {
std::string::size_type runpos = movement.find("run"); std::string::size_type runpos = movementAnimName.find("run");
if (runpos != std::string::npos) if (runpos != std::string::npos)
{ {
movement.replace(runpos, runpos+3, "walk"); movementAnimName.replace(runpos, runpos+3, "walk");
if (!mAnimation->hasAnimation(movement)) if (!mAnimation->hasAnimation(movementAnimName))
movement.clear(); movementAnimName.clear();
} }
else else
movement.clear(); movementAnimName.clear();
} }
else else
{ {
movemask = MWRender::Animation::BlendMask_LowerBody; movemask = MWRender::Animation::BlendMask_LowerBody;
movement.erase(swimpos, 4); movementAnimName.erase(swimpos, 4);
if(!mAnimation->hasAnimation(movement)) if(!mAnimation->hasAnimation(movementAnimName))
movement.clear(); movementAnimName.clear();
} }
} }
} }
/* If we're playing the same animation, restart from the loop start instead of the /* If we're playing the same animation, restart from the loop start instead of the
* beginning. */ * beginning. */
int mode = ((movement == mCurrentMovement) ? 2 : 1); int mode = ((movementAnimName == mCurrentMovement) ? 2 : 1);
mMovementAnimationControlled = true; mMovementAnimationControlled = true;
mAnimation->disable(mCurrentMovement); mAnimation->disable(mCurrentMovement);
mCurrentMovement = movement; mCurrentMovement = movementAnimName;
if(!mCurrentMovement.empty()) if(!mCurrentMovement.empty())
{ {
float vel, speedmult = 1.0f; float vel, speedmult = 1.0f;
@ -449,7 +449,17 @@ void CharacterController::refreshCurrentAnims(CharacterState idle, CharacterStat
} }
} }
mAnimation->play(mCurrentMovement, Priority_Movement, movemask, false, MWRender::Animation::AnimPriority priorityMovement (Priority_Movement);
if ((movement == CharState_TurnLeft || movement == CharState_TurnRight)
&& mPtr == MWBase::Environment::get().getWorld()->getPlayerPtr()
&& MWBase::Environment::get().getWorld()->isFirstPerson())
{
priorityMovement.mPriority[MWRender::Animation::BoneGroup_Torso] = 0;
priorityMovement.mPriority[MWRender::Animation::BoneGroup_LeftArm] = 0;
priorityMovement.mPriority[MWRender::Animation::BoneGroup_RightArm] = 0;
}
mAnimation->play(mCurrentMovement, priorityMovement, movemask, false,
speedmult, ((mode!=2)?"start":"loop start"), "stop", 0.0f, ~0ul); speedmult, ((mode!=2)?"start":"loop start"), "stop", 0.0f, ~0ul);
} }
} }
@ -458,7 +468,7 @@ void CharacterController::refreshCurrentAnims(CharacterState idle, CharacterStat
// FIXME: if one of the below states is close to their last animation frame (i.e. will be disabled in the coming update), // FIXME: if one of the below states is close to their last animation frame (i.e. will be disabled in the coming update),
// the idle animation should be displayed // the idle animation should be displayed
if ((mUpperBodyState != UpperCharState_Nothing if ((mUpperBodyState != UpperCharState_Nothing
|| mMovementState != CharState_None || (mMovementState != CharState_None && mMovementState != CharState_TurnLeft && mMovementState != CharState_TurnRight)
|| mHitState != CharState_None) || mHitState != CharState_None)
&& !mPtr.getClass().isBipedal(mPtr)) && !mPtr.getClass().isBipedal(mPtr))
idle = CharState_None; idle = CharState_None;