2525#include " ..\game_sa\CBuildingSA.h"
2626#include " ..\game_sa\CPedSA.h"
2727#include " ..\game_sa\common.h"
28+ #include < ../game_sa/CAnimBlendHierarchySA.h> // ---------------- REMOVE THIS LATER
29+ #include < ../game_sa/CAnimBlendStaticAssociationSA.h>
30+ #include < ../game_sa/CAnimBlendAssociationSA.h>
31+ #include < ../game_sa/CAnimBlendAssocGroupSA.h>
32+
2833extern CCoreInterface* g_pCore;
2934extern CMultiplayerSA* pMultiplayer;
3035
@@ -155,15 +160,15 @@ DWORD RETURN_CPlantMgr_Render_fail = 0x5DBDAA;
155160#define HOOKPOS_CEventHandler_ComputeKnockOffBikeResponse 0x4BA06F
156161DWORD RETURN_CEventHandler_ComputeKnockOffBikeResponse = 0x4BA076 ;
157162
163+ #define HOOKPOS_CAnimBlendAssocGroup_CopyAnimation 0x4CE130 // mov ecx, [ecx+4]
164+ DWORD RETURN_CAnimBlendAssocGroup_CopyAnimation = 0x4CE158 ; // test esi, esi
165+
158166#define HOOKPOS_CAnimManager_AddAnimation 0x4d3aa0
159- DWORD RETURN_CAnimManager_AddAnimation = 0x4D3AAA ;
160- DWORD RETURN_CAnimManager_AddAnimationEND = 0x4D3B16 ;
161- DWORD RETURN_CAnimManager_AddAnimation_SkipCopyAnimation = 0x4D3ABC ;
167+ DWORD RETURN_CAnimManager_AddAnimation = 0x4D3AB1 ;
168+
169+ #define HOOKPOS_CAnimManager_AddAnimationAndSync 0x4D3B30
170+ DWORD RETURN_CAnimManager_AddAnimationAndSync = 0x4D3B41 ;
162171
163- #define HOOKPOS_CAnimManager_AddAnimationAndSync 0x4D3B30
164- DWORD RETURN_CAnimManager_AddAnimationAndSync = 0x4D3B3A ;
165- DWORD RETURN_CAnimManager_AddAnimationAndSyncEND = 0x4D3B9E ;
166- DWORD RETURN_CAnimManager_AddAnimationAndSync_SkipCopyAnimation = 0x4D3B4C ;
167172
168173#define HOOKPOS_CAnimManager_BlendAnimation_Hierarchy 0x4D4410 // 0x4D4425
169174DWORD RETURN_CAnimManager_BlendAnimation_Hierarchy = 0x4D4417 ; // 0x4D442D;
@@ -433,6 +438,7 @@ void HOOK_CPlantMgr_Render ();
433438void HOOK_CEventHandler_ComputeKnockOffBikeResponse ();
434439void HOOK_CAnimManager_AddAnimation ();
435440void HOOK_CAnimManager_AddAnimationAndSync ();
441+ void HOOK_CAnimBlendAssocGroup_CopyAnimation ();
436442void HOOK_CAnimManager_BlendAnimation_Hierarchy ();
437443void HOOK_CPed_GetWeaponSkill ();
438444void HOOK_CPed_AddGogglesModel ();
@@ -641,6 +647,7 @@ void CMultiplayerSA::InitHooks()
641647 HookInstall (HOOKPOS_CEventHandler_ComputeKnockOffBikeResponse, (DWORD)HOOK_CEventHandler_ComputeKnockOffBikeResponse, 7 );
642648 HookInstall (HOOKPOS_CAnimManager_AddAnimation, (DWORD)HOOK_CAnimManager_AddAnimation, 10 );
643649 HookInstall (HOOKPOS_CAnimManager_AddAnimationAndSync, (DWORD)HOOK_CAnimManager_AddAnimationAndSync, 10 );
650+ HookInstall (HOOKPOS_CAnimBlendAssocGroup_CopyAnimation, (DWORD)HOOK_CAnimBlendAssocGroup_CopyAnimation, 6 );
644651 HookInstall (HOOKPOS_CAnimManager_BlendAnimation_Hierarchy, (DWORD)HOOK_CAnimManager_BlendAnimation_Hierarchy, 7 );
645652 HookInstall (HOOKPOS_CPed_GetWeaponSkill, (DWORD)HOOK_CPed_GetWeaponSkill, 8 );
646653 HookInstall (HOOKPOS_CPed_AddGogglesModel, (DWORD)HOOK_CPed_AddGogglesModel, 6 );
@@ -5340,6 +5347,60 @@ void _declspec(naked) HOOK_CEventHandler_ComputeKnockOffBikeResponse ()
53405347 }
53415348}
53425349
5350+ CAnimBlendStaticAssociationSAInterface * getAnimStaticAssociation ( DWORD * pAnimAssocGroup, DWORD AnimID )
5351+ {
5352+ auto pAnimStaticAssoc = (CAnimBlendStaticAssociationSAInterface *)( pAnimAssocGroup[1 ] + 20 * (AnimID - pAnimAssocGroup[3 ]) );
5353+ // auto pAnimStaticAssoc = (CAnimBlendStaticAssociationSAInterface *)malloc ( sizeof(CAnimBlendStaticAssociationSAInterface));
5354+
5355+ return pAnimStaticAssoc;
5356+ }
5357+
5358+ // CAnimBlendAssocGroupSAInterface * pAnimAssocGroup = nullptr;
5359+ CAnimBlendStaticAssociationSAInterface * pAnimStaticAssoc = nullptr ;
5360+ DWORD * pAnimAssocGroup = nullptr ;
5361+ DWORD AnimID = 0 ;
5362+ RpClump * pClump = nullptr ;
5363+ void _declspec (naked) HOOK_CAnimBlendAssocGroup_CopyAnimation ()
5364+ {
5365+ _asm
5366+ {
5367+ mov pClump, edi
5368+
5369+ mov eax, fs:0
5370+ push 0FFFFFFFFh
5371+ push 083BCABh
5372+ push eax
5373+ mov eax, [esp+10h]
5374+ mov fs:0 , esp
5375+ mov edx, [ecx+0Ch]
5376+
5377+ mov pAnimAssocGroup, ecx
5378+ mov AnimID, eax
5379+ pushad
5380+ }
5381+
5382+ pAnimStaticAssoc = getAnimStaticAssociation ( pAnimAssocGroup, AnimID );
5383+
5384+ _asm
5385+ {
5386+ popad
5387+ mov ecx, [ecx+4 ]
5388+ sub eax, edx
5389+ push esi
5390+ mov esi, pAnimStaticAssoc
5391+ jmp RETURN_CAnimBlendAssocGroup_CopyAnimation
5392+ }
5393+ }
5394+
5395+ int _cdecl OnCAnimBlendAssocGroupCopyAnimation ( CAnimBlendAssocGroupSAInterface* pGroup, int iAnimId );
5396+
5397+ CAnimBlendAssocGroupSAInterface * getAnimAssocGroupInterface ( AssocGroupId animGroup )
5398+ {
5399+ DWORD * pAnimAssocGroupsArray = reinterpret_cast < DWORD * > ( *(DWORD*)0xb4ea34 );
5400+ return reinterpret_cast < CAnimBlendAssocGroupSAInterface * > ( pAnimAssocGroupsArray + 5 * animGroup );
5401+ }
5402+
5403+ CAnimBlendAssocGroupSAInterface * pAnimAssocGroupInterface = nullptr ;
53435404
53445405RpClump * animationClump = NULL ;
53455406AssocGroupId animationGroup = 0 ;
@@ -5357,29 +5418,30 @@ void _declspec(naked) HOOK_CAnimManager_AddAnimation ()
53575418 mov animationID, eax
53585419 pushad
53595420 }
5360-
5421+
5422+ pAnimAssocGroupInterface = getAnimAssocGroupInterface ( animationGroup );
5423+ animationID = OnCAnimBlendAssocGroupCopyAnimation ( pAnimAssocGroupInterface, animationID );
5424+
53615425 if ( m_pAddAnimationHandler )
53625426 {
53635427 pAnimAssociation = m_pAddAnimationHandler ( animationClump, animationGroup, animationID );
5364-
5365- _asm
5366- {
5367- popad
5368- mov eax, pAnimAssociation
5369- jmp RETURN_CAnimManager_AddAnimationEND
5370- }
53715428 }
53725429
53735430 _asm
53745431 {
53755432 popad
53765433 mov eax,dword ptr [esp+0Ch]
53775434 mov edx,dword ptr ds:[0B4EA34h]
5435+ push esi
5436+ push edi
5437+ mov eax, animationID
5438+ push eax
5439+ mov eax, [esp+14h]
5440+ mov edi, animationClump
53785441 jmp RETURN_CAnimManager_AddAnimation
53795442 }
53805443}
53815444
5382-
53835445CAnimBlendAssociationSAInterface * pAnimAssociationToSyncWith = nullptr ;
53845446void _declspec (naked) HOOK_CAnimManager_AddAnimationAndSync ()
53855447{
@@ -5396,29 +5458,29 @@ void _declspec(naked) HOOK_CAnimManager_AddAnimationAndSync ()
53965458 pushad
53975459 }
53985460
5461+ pAnimAssocGroupInterface = getAnimAssocGroupInterface ( animationGroup );
5462+ animationID = OnCAnimBlendAssocGroupCopyAnimation ( pAnimAssocGroupInterface, animationID );
5463+
53995464 if ( m_pAddAnimationAndSyncHandler )
54005465 {
54015466 pAnimAssociation = m_pAddAnimationAndSyncHandler ( animationClump, pAnimAssociationToSyncWith, animationGroup, animationID );
5402-
5403- _asm
5404- {
5405- popad
5406- mov eax, pAnimAssociation
5407- jmp RETURN_CAnimManager_AddAnimationAndSyncEND
5408- }
54095467 }
54105468
54115469 _asm
54125470 {
54135471 popad
54145472 mov eax,dword ptr [esp+10h]
54155473 mov edx,dword ptr ds:[0B4EA34h]
5474+ push esi
5475+ push edi
5476+ mov eax, animationID
5477+ push eax
5478+ mov eax, [esp+18h]
5479+ mov edi, animationClump
54165480 jmp RETURN_CAnimManager_AddAnimationAndSync
54175481 }
54185482}
54195483
5420- #include < ../game_sa/CAnimBlendHierarchySA.h> // ---------------- REMOVE THIS LATER
5421-
54225484CAnimBlendHierarchySAInterface * pAnimHierarchy = nullptr ;
54235485int flags = 0 ;
54245486float animationBlendDelta = 0 .0f ;
@@ -5442,8 +5504,6 @@ void _declspec(naked) HOOK_CAnimManager_BlendAnimation_Hierarchy ()
54425504 pAnimHierarchy = m_pBlendAnimationHierarchyHandler ( animationClump, pAnimHierarchy, flags, animationBlendDelta );
54435505 }
54445506
5445- printf (" BlendAnimation_Hierarchy_Hook, pAnimHierarchy->usNumSequences: %d\n\n " , pAnimHierarchy->usNumSequences );
5446-
54475507 _asm
54485508 {
54495509 popad
0 commit comments