Skip to content

Commit 12ecaed

Browse files
Synchronize changes from 1.6 master branch [ci skip]
7ebe31a Revert "Fix anim progress & speed (#4245)" 3660881 Update crowdin-translators.json
2 parents bf9a196 + 7ebe31a commit 12ecaed

File tree

11 files changed

+52
-98
lines changed

11 files changed

+52
-98
lines changed

Client/mods/deathmatch/logic/CClientPed.cpp

Lines changed: 27 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -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

57585737
void 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

58455828
void 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

59225899
void CClientPed::PostWeaponFire()

Client/mods/deathmatch/logic/CClientPed.h

Lines changed: 11 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -129,17 +129,17 @@ struct SReplacedAnimation
129129

130130
struct SAnimationCache
131131
{
132-
std::string strName;
133-
int iTime{-1};
134-
bool bLoop{false};
135-
bool bUpdatePosition{false};
136-
bool bInterruptable{false};
137-
bool bFreezeLastFrame{true};
138-
int iBlend{250};
139-
float progress{0.0f};
140-
float speed{1.0f};
141-
bool progressWaitForStreamIn{false};
142-
std::int64_t startTime{0};
132+
std::string strName;
133+
int iTime{-1};
134+
bool bLoop{false};
135+
bool bUpdatePosition{false};
136+
bool bInterruptable{false};
137+
bool bFreezeLastFrame{true};
138+
int iBlend{250};
139+
float progress{0.0f};
140+
float speed{1.0f};
141+
bool progressWaitForStreamIn{false}; // for sync anim only
142+
float elapsedTime{0.0f}; // for sync anim only
143143
};
144144

145145
class CClientObject;
@@ -456,18 +456,13 @@ class CClientPed : public CClientStreamElement, public CAntiCheatModule
456456

457457
bool GetRunningAnimationName(SString& strBlockName, SString& strAnimName);
458458
bool IsRunningAnimation();
459-
460-
// It checks whether the animation is still playing based on time, not on task execution.
461-
bool IsAnimationInProgress();
462-
463459
void RunNamedAnimation(std::unique_ptr<CAnimBlock>& pBlock, const char* szAnimName, int iTime = -1, int iBlend = 250, bool bLoop = true,
464460
bool bUpdatePosition = true, bool bInterruptable = false, bool bFreezeLastFrame = true, bool bRunInSequence = false,
465461
bool bOffsetPed = false, bool bHoldLastFrame = false);
466462
void KillAnimation();
467463
std::unique_ptr<CAnimBlock> GetAnimationBlock();
468464
const SAnimationCache& GetAnimationCache() const noexcept { return m_AnimationCache; }
469465
void RunAnimationFromCache();
470-
void UpdateAnimationProgressAndSpeed();
471466

472467
bool IsUsingGun();
473468

Client/mods/deathmatch/logic/CPacketHandler.cpp

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4011,8 +4011,7 @@ void CPacketHandler::Packet_EntityAdd(NetBitStreamInterface& bitStream)
40114011
std::string blockName, animName;
40124012
int time, blendTime;
40134013
bool looped, updatePosition, interruptable, freezeLastFrame, taskRestore;
4014-
float speed;
4015-
double startTime;
4014+
float elapsedTime, speed;
40164015

40174016
// Read data
40184017
bitStream.ReadString(blockName);
@@ -4024,14 +4023,15 @@ void CPacketHandler::Packet_EntityAdd(NetBitStreamInterface& bitStream)
40244023
bitStream.ReadBit(freezeLastFrame);
40254024
bitStream.Read(blendTime);
40264025
bitStream.ReadBit(taskRestore);
4027-
bitStream.Read(startTime);
4026+
bitStream.Read(elapsedTime);
40284027
bitStream.Read(speed);
40294028

40304029
// Run anim
40314030
CStaticFunctionDefinitions::SetPedAnimation(*pPed, blockName, animName.c_str(), time, blendTime, looped, updatePosition, interruptable, freezeLastFrame);
4032-
pPed->m_AnimationCache.startTime = static_cast<std::int64_t>(startTime);
4033-
pPed->m_AnimationCache.speed = speed;
4034-
pPed->m_AnimationCache.progress = 0.0f;
4031+
pPed->m_AnimationCache.progressWaitForStreamIn = true;
4032+
pPed->m_AnimationCache.elapsedTime = elapsedTime;
4033+
4034+
CStaticFunctionDefinitions::SetPedAnimationSpeed(*pPed, animName, speed);
40354035

40364036
pPed->SetHasSyncedAnim(true);
40374037
}

Client/mods/deathmatch/logic/CStaticFunctionDefinitions.cpp

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2247,8 +2247,6 @@ bool CStaticFunctionDefinitions::SetPedAnimation(CClientEntity& Entity, const SS
22472247
}
22482248
}
22492249
}
2250-
2251-
Ped.m_AnimationCache.startTime = GetTimestamp();
22522250
}
22532251
else
22542252
{

Client/mods/deathmatch/logic/rpc/CPedRPCs.cpp

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -276,12 +276,6 @@ void CPedRPCs::SetPedAnimation(CClientEntity* pSource, NetBitStreamInterface& bi
276276
pPed->RunNamedAnimation(pBlock, animName.c_str(), iTime, iBlend, bLoop, bUpdatePosition, bInterruptable, bFreezeLastFrame);
277277
pPed->SetTaskToBeRestoredOnAnimEnd(bTaskToBeRestoredOnAnimEnd);
278278
pPed->SetTaskTypeToBeRestoredOnAnimEnd((eTaskType)TASK_SIMPLE_DUCK);
279-
280-
pPed->m_AnimationCache.startTime = GetTimestamp();
281-
pPed->m_AnimationCache.speed = 1.0f;
282-
pPed->m_AnimationCache.progress = 0.0f;
283-
284-
pPed->SetHasSyncedAnim(true);
285279
}
286280
}
287281
}
@@ -313,7 +307,6 @@ void CPedRPCs::SetPedAnimationProgress(CClientEntity* pSource, NetBitStreamInter
313307
if (pAnimAssociation)
314308
{
315309
pAnimAssociation->SetCurrentProgress(fProgress);
316-
pPed->m_AnimationCache.progress = fProgress;
317310
}
318311
}
319312
}
@@ -341,7 +334,6 @@ void CPedRPCs::SetPedAnimationSpeed(CClientEntity* pSource, NetBitStreamInterfac
341334
if (pAnimAssociation)
342335
{
343336
pAnimAssociation->SetCurrentSpeed(fSpeed);
344-
pPed->m_AnimationCache.speed = fSpeed;
345337
}
346338
}
347339
}

Server/mods/deathmatch/logic/CPed.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ struct SPlayerAnimData
115115
int blendTime{250};
116116
bool taskToBeRestoredOnAnimEnd{false};
117117

118-
std::int64_t startTime{0};
118+
std::int64_t startedTick{0};
119119

120120
float progress{0.0f};
121121
float speed{1.0f};

Server/mods/deathmatch/logic/CPedSync.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -82,7 +82,7 @@ void CPedSync::OverrideSyncer(CPed* pPed, CPlayer* pPlayer, bool bPersist)
8282

8383
void CPedSync::UpdateAllSyncer()
8484
{
85-
auto currentTimestamp = GetTimestamp();
85+
auto currentTick = GetTickCount64_();
8686

8787
// Update all the ped's sync states
8888
for (auto iter = m_pPedManager->IterBegin(); iter != m_pPedManager->IterEnd(); iter++)
@@ -91,7 +91,7 @@ void CPedSync::UpdateAllSyncer()
9191
const SPlayerAnimData& animData = (*iter)->GetAnimationData();
9292
if (animData.IsAnimating())
9393
{
94-
float deltaTime = static_cast<float>(currentTimestamp - animData.startTime);
94+
float deltaTime = currentTick - animData.startedTick;
9595
if (!animData.freezeLastFrame && animData.time > 0 && deltaTime >= animData.time)
9696
(*iter)->SetAnimationData({});
9797
}

Server/mods/deathmatch/logic/packets/CEntityAddPacket.cpp

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1005,8 +1005,9 @@ bool CEntityAddPacket::Write(NetBitStreamInterface& BitStream) const
10051005
BitStream.Write(animData.blendTime);
10061006
BitStream.WriteBit(animData.taskToBeRestoredOnAnimEnd);
10071007

1008-
// Write start time & speed
1009-
BitStream.Write(static_cast<double>(animData.startTime));
1008+
// Write elapsed time & speed
1009+
float elapsedTime = GetTickCount64_() - animData.startedTick;
1010+
BitStream.Write(elapsedTime);
10101011
BitStream.Write(animData.speed);
10111012
}
10121013
}

Shared/sdk/SharedUtil.Time.h

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,8 +41,6 @@ namespace SharedUtil
4141
//
4242
double GetSecondCount();
4343

44-
std::int64_t GetTimestamp();
45-
4644
//
4745
// Get the time as a sortable string.
4846
// Set bDate to include the date, bMs to include milliseconds

Shared/sdk/SharedUtil.Time.hpp

Lines changed: 0 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -86,15 +86,6 @@ double SharedUtil::GetSecondCount()
8686
return GetTickCount64_() * (1 / 1000.0);
8787
}
8888

89-
//
90-
// Returns a timestamp in ms
91-
//
92-
std::int64_t SharedUtil::GetTimestamp()
93-
{
94-
auto now = std::chrono::system_clock::now();
95-
return std::chrono::duration_cast<std::chrono::milliseconds>(now.time_since_epoch()).count();
96-
}
97-
9889
//
9990
// Get the time as a sortable string.
10091
// Set bDate to include the date, bMs to include milliseconds

0 commit comments

Comments
 (0)