25
25
#include " ..\game_sa\CBuildingSA.h"
26
26
#include " ..\game_sa\CPedSA.h"
27
27
#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
+
28
33
extern CCoreInterface* g_pCore;
29
34
extern CMultiplayerSA* pMultiplayer;
30
35
@@ -155,15 +160,15 @@ DWORD RETURN_CPlantMgr_Render_fail = 0x5DBDAA;
155
160
#define HOOKPOS_CEventHandler_ComputeKnockOffBikeResponse 0x4BA06F
156
161
DWORD RETURN_CEventHandler_ComputeKnockOffBikeResponse = 0x4BA076 ;
157
162
163
+ #define HOOKPOS_CAnimBlendAssocGroup_CopyAnimation 0x4CE130 // mov ecx, [ecx+4]
164
+ DWORD RETURN_CAnimBlendAssocGroup_CopyAnimation = 0x4CE158 ; // test esi, esi
165
+
158
166
#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 ;
162
171
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 ;
167
172
168
173
#define HOOKPOS_CAnimManager_BlendAnimation_Hierarchy 0x4D4410 // 0x4D4425
169
174
DWORD RETURN_CAnimManager_BlendAnimation_Hierarchy = 0x4D4417 ; // 0x4D442D;
@@ -433,6 +438,7 @@ void HOOK_CPlantMgr_Render ();
433
438
void HOOK_CEventHandler_ComputeKnockOffBikeResponse ();
434
439
void HOOK_CAnimManager_AddAnimation ();
435
440
void HOOK_CAnimManager_AddAnimationAndSync ();
441
+ void HOOK_CAnimBlendAssocGroup_CopyAnimation ();
436
442
void HOOK_CAnimManager_BlendAnimation_Hierarchy ();
437
443
void HOOK_CPed_GetWeaponSkill ();
438
444
void HOOK_CPed_AddGogglesModel ();
@@ -641,6 +647,7 @@ void CMultiplayerSA::InitHooks()
641
647
HookInstall (HOOKPOS_CEventHandler_ComputeKnockOffBikeResponse, (DWORD)HOOK_CEventHandler_ComputeKnockOffBikeResponse, 7 );
642
648
HookInstall (HOOKPOS_CAnimManager_AddAnimation, (DWORD)HOOK_CAnimManager_AddAnimation, 10 );
643
649
HookInstall (HOOKPOS_CAnimManager_AddAnimationAndSync, (DWORD)HOOK_CAnimManager_AddAnimationAndSync, 10 );
650
+ HookInstall (HOOKPOS_CAnimBlendAssocGroup_CopyAnimation, (DWORD)HOOK_CAnimBlendAssocGroup_CopyAnimation, 6 );
644
651
HookInstall (HOOKPOS_CAnimManager_BlendAnimation_Hierarchy, (DWORD)HOOK_CAnimManager_BlendAnimation_Hierarchy, 7 );
645
652
HookInstall (HOOKPOS_CPed_GetWeaponSkill, (DWORD)HOOK_CPed_GetWeaponSkill, 8 );
646
653
HookInstall (HOOKPOS_CPed_AddGogglesModel, (DWORD)HOOK_CPed_AddGogglesModel, 6 );
@@ -5340,6 +5347,60 @@ void _declspec(naked) HOOK_CEventHandler_ComputeKnockOffBikeResponse ()
5340
5347
}
5341
5348
}
5342
5349
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 ;
5343
5404
5344
5405
RpClump * animationClump = NULL ;
5345
5406
AssocGroupId animationGroup = 0 ;
@@ -5357,29 +5418,30 @@ void _declspec(naked) HOOK_CAnimManager_AddAnimation ()
5357
5418
mov animationID, eax
5358
5419
pushad
5359
5420
}
5360
-
5421
+
5422
+ pAnimAssocGroupInterface = getAnimAssocGroupInterface ( animationGroup );
5423
+ animationID = OnCAnimBlendAssocGroupCopyAnimation ( pAnimAssocGroupInterface, animationID );
5424
+
5361
5425
if ( m_pAddAnimationHandler )
5362
5426
{
5363
5427
pAnimAssociation = m_pAddAnimationHandler ( animationClump, animationGroup, animationID );
5364
-
5365
- _asm
5366
- {
5367
- popad
5368
- mov eax, pAnimAssociation
5369
- jmp RETURN_CAnimManager_AddAnimationEND
5370
- }
5371
5428
}
5372
5429
5373
5430
_asm
5374
5431
{
5375
5432
popad
5376
5433
mov eax,dword ptr [esp+0Ch]
5377
5434
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
5378
5441
jmp RETURN_CAnimManager_AddAnimation
5379
5442
}
5380
5443
}
5381
5444
5382
-
5383
5445
CAnimBlendAssociationSAInterface * pAnimAssociationToSyncWith = nullptr ;
5384
5446
void _declspec (naked) HOOK_CAnimManager_AddAnimationAndSync ()
5385
5447
{
@@ -5396,29 +5458,29 @@ void _declspec(naked) HOOK_CAnimManager_AddAnimationAndSync ()
5396
5458
pushad
5397
5459
}
5398
5460
5461
+ pAnimAssocGroupInterface = getAnimAssocGroupInterface ( animationGroup );
5462
+ animationID = OnCAnimBlendAssocGroupCopyAnimation ( pAnimAssocGroupInterface, animationID );
5463
+
5399
5464
if ( m_pAddAnimationAndSyncHandler )
5400
5465
{
5401
5466
pAnimAssociation = m_pAddAnimationAndSyncHandler ( animationClump, pAnimAssociationToSyncWith, animationGroup, animationID );
5402
-
5403
- _asm
5404
- {
5405
- popad
5406
- mov eax, pAnimAssociation
5407
- jmp RETURN_CAnimManager_AddAnimationAndSyncEND
5408
- }
5409
5467
}
5410
5468
5411
5469
_asm
5412
5470
{
5413
5471
popad
5414
5472
mov eax,dword ptr [esp+10h]
5415
5473
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
5416
5480
jmp RETURN_CAnimManager_AddAnimationAndSync
5417
5481
}
5418
5482
}
5419
5483
5420
- #include < ../game_sa/CAnimBlendHierarchySA.h> // ---------------- REMOVE THIS LATER
5421
-
5422
5484
CAnimBlendHierarchySAInterface * pAnimHierarchy = nullptr ;
5423
5485
int flags = 0 ;
5424
5486
float animationBlendDelta = 0 .0f ;
@@ -5442,8 +5504,6 @@ void _declspec(naked) HOOK_CAnimManager_BlendAnimation_Hierarchy ()
5442
5504
pAnimHierarchy = m_pBlendAnimationHierarchyHandler ( animationClump, pAnimHierarchy, flags, animationBlendDelta );
5443
5505
}
5444
5506
5445
- printf (" BlendAnimation_Hierarchy_Hook, pAnimHierarchy->usNumSequences: %d\n\n " , pAnimHierarchy->usNumSequences );
5446
-
5447
5507
_asm
5448
5508
{
5449
5509
popad
0 commit comments