From 8c220a7de5bb684bd4b1dec37aa0d6952053f990 Mon Sep 17 00:00:00 2001 From: s1lentq Date: Tue, 27 Aug 2024 21:15:04 +0700 Subject: [PATCH] GetAttachment/GetBonePosition: Restore preserved animtime/frame after advancing studio entity --- reapi/src/reapi_utils.cpp | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/reapi/src/reapi_utils.cpp b/reapi/src/reapi_utils.cpp index ade7779a..3cc99ee7 100644 --- a/reapi/src/reapi_utils.cpp +++ b/reapi/src/reapi_utils.cpp @@ -168,6 +168,9 @@ void GetBonePosition(CBaseEntity *pEntity, int iBone, Vector *pVecOrigin, Vector if (iBone < 0 || iBone >= pstudiohdr->numbones) return; // invalid bone + float flFrame = pEdict->v.frame; + float flAnimTime = pEdict->v.animtime; + // force to update frame StudioFrameAdvanceEnt(pstudiohdr, pEdict); @@ -175,6 +178,10 @@ void GetBonePosition(CBaseEntity *pEntity, int iBone, Vector *pVecOrigin, Vector GET_BONE_POSITION(pEdict, iBone, vecOrigin, vecAngles); pEntity->pev->angles.x = -pEntity->pev->angles.x; + // restore the original state for the entity + pEdict->v.frame = flFrame; + pEdict->v.animtime = flAnimTime; + // ReGameDLL already have fixes angles for non-players entities if (!g_ReGameApi && !pEntity->IsPlayer()) { FixupAngles(pEdict, vecOrigin); @@ -204,11 +211,18 @@ void GetAttachment(CBaseEntity *pEntity, int iAttachment, Vector *pVecOrigin, Ve if (iAttachment < 0 || iAttachment >= pstudiohdr->numattachments) return; // invalid attachment + float flFrame = pEdict->v.frame; + float flAnimTime = pEdict->v.animtime; + // force to update frame StudioFrameAdvanceEnt(pstudiohdr, pEdict); GET_ATTACHMENT(pEdict, iAttachment, vecOrigin, vecAngles); + // restore the original state for the entity + pEdict->v.frame = flFrame; + pEdict->v.animtime = flAnimTime; + // ReGameDLL already have fixes angles for non-players entities if (!g_ReGameApi && !pEntity->IsPlayer()) { FixupAngles(pEdict, vecOrigin); @@ -281,7 +295,7 @@ bool GetSequenceInfo2(CBaseEntity *pEntity, int *piFlags, float *pflFrameRate, f *pflFrameRate = 256.0f; *pflGroundSpeed = 0.0f; } - else + else { *pflFrameRate = pseqdesc->fps * 256.0f / (pseqdesc->numframes - 1); *pflGroundSpeed = Q_sqrt(pseqdesc->linearmovement[0] * pseqdesc->linearmovement[0] + pseqdesc->linearmovement[1] * pseqdesc->linearmovement[1] + pseqdesc->linearmovement[2] * pseqdesc->linearmovement[2]);