Merge branch 'sneakyidles' into 'master'

Fix idle swim/sneak animation fallback again

Closes #6816

See merge request OpenMW/openmw!2031
This commit is contained in:
psi29a 2022-06-19 11:21:21 +00:00
commit aa5535c9dc

View file

@ -672,28 +672,30 @@ void CharacterController::refreshIdleAnims(CharacterState idle, bool force)
return;
mIdleState = idle;
size_t numLoops = ~0ul;
std::string idleGroup = idleStateToAnimGroup(mIdleState);
// Only play "idleswim" or "idlesneak" if they exist. Otherwise, fallback to
// "idle"+weapon or "idle".
if ((mIdleState == CharState_IdleSwim || mIdleState == CharState_IdleSneak) && !mAnimation->hasAnimation(idleGroup))
{
mIdleState = CharState_Idle;
idleGroup = idleStateToAnimGroup(mIdleState);
}
MWRender::Animation::AnimPriority priority = getIdlePriority(mIdleState);
if (idleGroup.empty())
{
resetCurrentIdleState();
return;
}
MWRender::Animation::AnimPriority priority = getIdlePriority(mIdleState);
size_t numLoops = std::numeric_limits<size_t>::max();
// Only play "idleswim" or "idlesneak" if they exist. Otherwise, fallback to
// "idle"+weapon or "idle".
bool fallback = mIdleState != CharState_Idle && !mAnimation->hasAnimation(idleGroup);
if (fallback)
{
priority = getIdlePriority(CharState_Idle);
idleGroup = idleStateToAnimGroup(CharState_Idle);
}
if (fallback || mIdleState == CharState_Idle || mIdleState == CharState_SpecialIdle)
{
std::string weapShortGroup = getWeaponShortGroup(mWeaponType);
if (mIdleState != CharState_IdleSwim && mIdleState != CharState_IdleSneak && mIdleState != CharState_None && !weapShortGroup.empty())
if (!weapShortGroup.empty())
{
std::string weapIdleGroup = idleGroup + weapShortGroup;
if (!mAnimation->hasAnimation(weapIdleGroup))
@ -705,6 +707,7 @@ void CharacterController::refreshIdleAnims(CharacterState idle, bool force)
auto& prng = MWBase::Environment::get().getWorld()->getPrng();
numLoops = 1 + Misc::Rng::rollDice(4, prng);
}
}
if (!mAnimation->hasAnimation(idleGroup))
{