@@ -2895,11 +2895,6 @@ void CClientPed::StreamedInPulse(bool bDoStandardPulses)
28952895 }
28962896 }
28972897
2898- // Are we need to update anim speed & progress?
2899- // We need to do it here because the anim starts on the next frame after calling RunNamedAnimation
2900- if (m_pAnimationBlock && m_AnimationCache.progressWaitForStreamIn && IsAnimationInProgress ())
2901- UpdateAnimationProgressAndSpeed ();
2902-
29032898 // Update our alpha
29042899 unsigned char ucAlpha = m_ucAlpha;
29052900 // Are we in a different interior to the camera? set our alpha to 0
@@ -3690,8 +3685,8 @@ void CClientPed::_CreateModel()
36903685 Kill (WEAPONTYPE_UNARMED, 0 , false , true );
36913686 }
36923687
3693- // Are we still playing a animation?
3694- if (m_pAnimationBlock && IsAnimationInProgress () )
3688+ // Are we still playing animation?
3689+ if ((m_AnimationCache. bLoop || m_AnimationCache. bFreezeLastFrame || m_AnimationCache. progressWaitForStreamIn ) && m_pAnimationBlock )
36953690 {
36963691 if (m_bisCurrentAnimationCustom)
36973692 {
@@ -3968,8 +3963,8 @@ void CClientPed::_ChangeModel()
39683963 }
39693964 m_bDontChangeRadio = false ;
39703965
3971- // Are we still playing a animation?
3972- if (m_pAnimationBlock && IsAnimationInProgress () )
3966+ // Are we still playing a looped animation?
3967+ if ((m_AnimationCache. bLoop || m_AnimationCache. bFreezeLastFrame || m_AnimationCache. progressWaitForStreamIn ) && m_pAnimationBlock )
39733968 {
39743969 if (m_bisCurrentAnimationCustom)
39753970 {
@@ -5736,23 +5731,7 @@ bool CClientPed::IsRunningAnimation()
57365731 }
57375732 return false ;
57385733 }
5739- return (m_AnimationCache.bLoop || m_AnimationCache.bFreezeLastFrame ) && m_pAnimationBlock;
5740- }
5741-
5742- bool CClientPed::IsAnimationInProgress ()
5743- {
5744- bool constAnim = m_AnimationCache.bLoop || m_AnimationCache.bFreezeLastFrame ;
5745-
5746- if (!m_pAnimationBlock)
5747- return constAnim;
5748-
5749- float elapsedTime = static_cast <float >(GetTimestamp () - m_AnimationCache.startTime ) / 1000 .0f ;
5750-
5751- auto animBlendHierarchy = g_pGame->GetAnimManager ()->GetAnimation (m_AnimationCache.strName .c_str (), m_pAnimationBlock);
5752- if (!animBlendHierarchy)
5753- return constAnim;
5754-
5755- return constAnim || elapsedTime < animBlendHierarchy->GetTotalTime ();
5734+ return (m_AnimationCache.bLoop && m_pAnimationBlock);
57565735}
57575736
57585737void CClientPed::RunNamedAnimation (std::unique_ptr<CAnimBlock>& pBlock, const char * szAnimName, int iTime, int iBlend, bool bLoop, bool bUpdatePosition,
@@ -5840,6 +5819,10 @@ void CClientPed::RunNamedAnimation(std::unique_ptr<CAnimBlock>& pBlock, const ch
58405819 m_AnimationCache.bUpdatePosition = bUpdatePosition;
58415820 m_AnimationCache.bInterruptable = bInterruptable;
58425821 m_AnimationCache.bFreezeLastFrame = bFreezeLastFrame;
5822+ m_AnimationCache.progress = 0 .0f ;
5823+ m_AnimationCache.speed = 1 .0f ;
5824+ m_AnimationCache.progressWaitForStreamIn = false ;
5825+ m_AnimationCache.elapsedTime = 0 .0f ;
58435826}
58445827
58455828void CClientPed::KillAnimation ()
@@ -5878,45 +5861,39 @@ void CClientPed::RunAnimationFromCache()
58785861 if (!m_pAnimationBlock)
58795862 return ;
58805863
5864+ bool needCalcProgress = m_AnimationCache.progressWaitForStreamIn ;
5865+ float elapsedTime = m_AnimationCache.elapsedTime ;
5866+
58815867 // Copy our name incase it gets deleted
58825868 std::string animName = m_AnimationCache.strName ;
58835869
58845870 // Run our animation
58855871 RunNamedAnimation (m_pAnimationBlock, animName.c_str (), m_AnimationCache.iTime , m_AnimationCache.iBlend , m_AnimationCache.bLoop , m_AnimationCache.bUpdatePosition , m_AnimationCache.bInterruptable , m_AnimationCache.bFreezeLastFrame );
58865872
5887- // Set anim progress & speed
5888- m_AnimationCache.progressWaitForStreamIn = true ;
5889- }
5890-
5891- void CClientPed::UpdateAnimationProgressAndSpeed ()
5892- {
5893- if (!m_AnimationCache.progressWaitForStreamIn )
5894- return ;
5895-
5896- // Get current anim
5897- auto animAssoc = g_pGame->GetAnimManager ()->RpAnimBlendClumpGetAssociation (GetClump (), m_AnimationCache.strName .c_str ());
5873+ auto animAssoc = g_pGame->GetAnimManager ()->RpAnimBlendClumpGetAssociation (GetClump (), animName.c_str ());
58985874 if (!animAssoc)
58995875 return ;
59005876
5901- float animLength = animAssoc->GetLength ();
5902- float progress = 0 .0f ;
5903- float elapsedTime = static_cast <float >(GetTimestamp () - m_AnimationCache.startTime ) / 1000 .0f ;
5904-
5905- if (m_AnimationCache.bFreezeLastFrame ) // time and loop is ignored if freezeLastFrame is true
5906- progress = (elapsedTime / animLength) * m_AnimationCache.speed ;
5907- else
5877+ // If the anim is synced from the server side, we need to calculate the progress
5878+ float progress = m_AnimationCache.progress ;
5879+ if (needCalcProgress)
59085880 {
5909- if (m_AnimationCache.bLoop )
5910- progress = std::fmod (elapsedTime * m_AnimationCache.speed , animLength) / animLength;
5881+ float animLength = animAssoc->GetLength ();
5882+
5883+ if (m_AnimationCache.bFreezeLastFrame ) // time and loop is ignored if freezeLastFrame is true
5884+ progress = (elapsedTime / animLength) * m_AnimationCache.speed ;
59115885 else
5912- // For non-looped animations, limit duration to animLength if time exceeds it
5913- progress = (elapsedTime / (m_AnimationCache.iTime <= animLength ? m_AnimationCache.iTime : animLength)) * m_AnimationCache.speed ;
5886+ {
5887+ if (m_AnimationCache.bLoop )
5888+ progress = std::fmod (elapsedTime * m_AnimationCache.speed , animLength) / animLength;
5889+ else
5890+ // For non-looped animations, limit duration to animLength if time exceeds it
5891+ progress = (elapsedTime / (m_AnimationCache.iTime <= animLength ? m_AnimationCache.iTime : animLength)) * m_AnimationCache.speed ;
5892+ }
59145893 }
59155894
59165895 animAssoc->SetCurrentProgress (std::clamp (progress, 0 .0f , 1 .0f ));
59175896 animAssoc->SetCurrentSpeed (m_AnimationCache.speed );
5918-
5919- m_AnimationCache.progressWaitForStreamIn = false ;
59205897}
59215898
59225899void CClientPed::PostWeaponFire ()
0 commit comments