Skip to content

Commit e17b895

Browse files
committed
Added ability to replace GTA internal animations.
Modified AddAnimation, AddAnimationAndSync, and CopyAnimation for replacing GTA internal animations with custom animations. We'll need to create our own static association when engineReplaceAnimation is called and use that static association for a specific ped/player to play our custom animation instead.
1 parent 2600653 commit e17b895

File tree

1 file changed

+87
-27
lines changed

1 file changed

+87
-27
lines changed

Client/multiplayer_sa/CMultiplayerSA.cpp

Lines changed: 87 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,11 @@
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+
2833
extern CCoreInterface* g_pCore;
2934
extern CMultiplayerSA* pMultiplayer;
3035

@@ -155,15 +160,15 @@ DWORD RETURN_CPlantMgr_Render_fail = 0x5DBDAA;
155160
#define HOOKPOS_CEventHandler_ComputeKnockOffBikeResponse 0x4BA06F
156161
DWORD 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
169174
DWORD RETURN_CAnimManager_BlendAnimation_Hierarchy = 0x4D4417; //0x4D442D;
@@ -433,6 +438,7 @@ void HOOK_CPlantMgr_Render ();
433438
void HOOK_CEventHandler_ComputeKnockOffBikeResponse ();
434439
void HOOK_CAnimManager_AddAnimation ();
435440
void HOOK_CAnimManager_AddAnimationAndSync ();
441+
void HOOK_CAnimBlendAssocGroup_CopyAnimation ();
436442
void HOOK_CAnimManager_BlendAnimation_Hierarchy ();
437443
void HOOK_CPed_GetWeaponSkill ();
438444
void 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

53445405
RpClump * animationClump = NULL;
53455406
AssocGroupId 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-
53835445
CAnimBlendAssociationSAInterface * pAnimAssociationToSyncWith = nullptr;
53845446
void _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-
54225484
CAnimBlendHierarchySAInterface * pAnimHierarchy = nullptr;
54235485
int flags = 0;
54245486
float 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

Comments
 (0)