2020#include " CPedSA.h"
2121#include " CWorldSA.h"
2222#include " gamesa_renderware.h"
23+ #include " CAnimManagerSA.h"
2324
2425extern CCoreInterface* g_pCore;
2526extern CGameSA* pGame;
@@ -36,6 +37,7 @@ std::map<CTimeInfoSAInterface*, CTimeInfoSAInterface*> CModelInfo
3637std::unordered_map<DWORD, unsigned short > CModelInfoSA::ms_OriginalObjectPropertiesGroups;
3738std::unordered_map<DWORD, std::pair<float , float >> CModelInfoSA::ms_VehicleModelDefaultWheelSizes;
3839std::map<unsigned short , int > CModelInfoSA::ms_DefaultTxdIDMap;
40+ std::unordered_set<std::uint32_t > CModelInfoSA::ms_modelsModifiedAnim;
3941
4042union tIdeFlags
4143{
@@ -1517,6 +1519,28 @@ void CModelInfoSA::ResetAllVehiclesWheelSizes()
15171519 ms_VehicleModelDefaultWheelSizes.clear ();
15181520}
15191521
1522+ void CModelInfoSA::StaticResetModelAnimations ()
1523+ {
1524+ for (auto & it : ms_modelsModifiedAnim)
1525+ {
1526+ CModelInfo* modelInfo = pGame->GetModelInfo (it);
1527+ if (modelInfo)
1528+ {
1529+ modelInfo->DisableObjectAnimation (false );
1530+ modelInfo->SetObjectAnimation (nullptr , 0 );
1531+ }
1532+
1533+ CBaseModelInfoSAInterface* modelInfoInterface = modelInfo->GetInterface ();
1534+ if (modelInfoInterface)
1535+ {
1536+ modelInfoInterface->bHasAnimBlend = static_cast <CClumpModelInfoSAInterface*>(modelInfoInterface)->m_nAnimFileIndex != -1 ;
1537+ modelInfoInterface->bAnimSomething = modelInfoInterface->bHasAnimBlend ;
1538+ }
1539+ }
1540+
1541+ ms_modelsModifiedAnim.clear ();
1542+ }
1543+
15201544bool CModelInfoSA::SetCustomModel (RpClump* pClump)
15211545{
15221546 if (!pClump)
@@ -1938,6 +1962,8 @@ static void __declspec(naked) HOOK_NodeNameStreamRead()
19381962void CModelInfoSA::StaticSetHooks ()
19391963{
19401964 EZHookInstall (NodeNameStreamRead);
1965+
1966+ HookInstallVTBLCall ((void *)0x85BD5C , (std::uintptr_t )CClumpModelInfoSAInterface::CreateInstance);
19411967}
19421968
19431969// Recursive RwFrame children searching function
@@ -2183,3 +2209,52 @@ bool CVehicleModelInfoSAInterface::IsComponentDamageable(int componentIndex) con
21832209{
21842210 return pVisualInfo->m_maskComponentDamagable & (1 << componentIndex);
21852211}
2212+
2213+ RpClump* __fastcall CClumpModelInfoSAInterface::CreateInstance (CClumpModelInfoSAInterface* clumpModelInfo)
2214+ {
2215+ if (!clumpModelInfo->pRwObject )
2216+ return nullptr ;
2217+
2218+ clumpModelInfo->AddRef ();
2219+
2220+ RpClump* clump = RpClumpClone (reinterpret_cast <RpClump*>(clumpModelInfo->pRwObject ));
2221+
2222+ if (IsClumpSkinned (clump) && !clumpModelInfo->bHasComplexHierarchy )
2223+ {
2224+ RpHAnimHierarchy* hier = GetAnimHierarchyFromClump (clump);
2225+ RpClumpForAllAtomics (clump, *(RpClumpForAllAtomicsCB_t*)0x4C4EF0 , hier);
2226+
2227+ RtAnimAnimation* animForHierarchy = RpAnimBlendCreateAnimationForHierarchy (hier);
2228+ RtAnimInterpolatorSetCurrentAnim (hier->currentAnim , animForHierarchy);
2229+ hier->flags = rpHANIMHIERARCHYUPDATEMODELLINGMATRICES | rpHANIMHIERARCHYUPDATELTMS;
2230+ }
2231+
2232+ if (clumpModelInfo->bHasAnimBlend )
2233+ {
2234+ CAnimBlendHierarchySAInterface* anim = nullptr ;
2235+ auto * modelInfo = pGame->GetModelInfo (static_cast <CBaseModelInfoSAInterface*>(clumpModelInfo));
2236+
2237+ if (clumpModelInfo->m_nAnimFileIndex != -1 )
2238+ {
2239+ if (!modelInfo || !modelInfo->IsObjectAnimationDisabled ())
2240+ {
2241+ if (auto block = pGame->GetAnimManager ()->GetAnimationBlock (clumpModelInfo->m_nAnimFileIndex ))
2242+ {
2243+ if (auto animation = pGame->GetAnimManager ()->GetAnimation (clumpModelInfo->ulHashKey , block))
2244+ anim = animation->GetInterface ();
2245+ }
2246+ }
2247+ }
2248+ else if (modelInfo)
2249+ anim = modelInfo->GetObjectAnimation ();
2250+
2251+ if (anim)
2252+ {
2253+ RpAnimBlendClumpInit (clump);
2254+ pGame->GetAnimManager ()->BlendAnimation (clump, anim, ANIMATION_IS_LOOPED, 1 .0f );
2255+ }
2256+ }
2257+
2258+ clumpModelInfo->RemoveRef ();
2259+ return clump;
2260+ }
0 commit comments