Skip to content

Commit 9b578f9

Browse files
committed
optimized CopyAnimation hook for saving tons of RAM
If we created a new static association for every player for every single animation then it means for 1000 players, the memory might exceed 400mb, that's a lot. Why not destroy the static association when we copy the animation from it? That's exactly what's happening in the hook now.
1 parent e17b895 commit 9b578f9

File tree

1 file changed

+35
-19
lines changed

1 file changed

+35
-19
lines changed

Client/multiplayer_sa/CMultiplayerSA.cpp

Lines changed: 35 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -160,8 +160,12 @@ DWORD RETURN_CPlantMgr_Render_fail = 0x5DBDAA;
160160
#define HOOKPOS_CEventHandler_ComputeKnockOffBikeResponse 0x4BA06F
161161
DWORD RETURN_CEventHandler_ComputeKnockOffBikeResponse = 0x4BA076;
162162

163-
#define HOOKPOS_CAnimBlendAssocGroup_CopyAnimation 0x4CE130 // mov ecx, [ecx+4]
164-
DWORD RETURN_CAnimBlendAssocGroup_CopyAnimation = 0x4CE158; // test esi, esi
163+
DWORD FUNC_NEW_OPERATOR = 0x082119A;
164+
DWORD FUNC_CAnimBlendAssociation_Constructor = 0x04CF080;
165+
166+
#define HOOKPOS_CAnimBlendAssocGroup_CopyAnimation 0x4CE14C
167+
DWORD RETURN_CAnimBlendAssocGroup_CopyAnimation = 0x4CE187;
168+
DWORD RETURN_CAnimBlendAssocGroup_CopyAnimation_ERROR = 0x4CE199;
165169

166170
#define HOOKPOS_CAnimManager_AddAnimation 0x4d3aa0
167171
DWORD RETURN_CAnimManager_AddAnimation = 0x4D3AB1;
@@ -647,7 +651,7 @@ void CMultiplayerSA::InitHooks()
647651
HookInstall(HOOKPOS_CEventHandler_ComputeKnockOffBikeResponse, (DWORD)HOOK_CEventHandler_ComputeKnockOffBikeResponse, 7 );
648652
HookInstall(HOOKPOS_CAnimManager_AddAnimation, (DWORD)HOOK_CAnimManager_AddAnimation, 10 );
649653
HookInstall(HOOKPOS_CAnimManager_AddAnimationAndSync, (DWORD)HOOK_CAnimManager_AddAnimationAndSync, 10 );
650-
HookInstall(HOOKPOS_CAnimBlendAssocGroup_CopyAnimation, (DWORD)HOOK_CAnimBlendAssocGroup_CopyAnimation, 6 );
654+
HookInstall(HOOKPOS_CAnimBlendAssocGroup_CopyAnimation, (DWORD)HOOK_CAnimBlendAssocGroup_CopyAnimation, 5 );
651655
HookInstall(HOOKPOS_CAnimManager_BlendAnimation_Hierarchy, (DWORD)HOOK_CAnimManager_BlendAnimation_Hierarchy, 7 );
652656
HookInstall(HOOKPOS_CPed_GetWeaponSkill, (DWORD)HOOK_CPed_GetWeaponSkill, 8 );
653657
HookInstall(HOOKPOS_CPed_AddGogglesModel, (DWORD)HOOK_CPed_AddGogglesModel, 6);
@@ -5347,48 +5351,60 @@ void _declspec(naked) HOOK_CEventHandler_ComputeKnockOffBikeResponse ()
53475351
}
53485352
}
53495353

5350-
CAnimBlendStaticAssociationSAInterface * getAnimStaticAssociation ( DWORD * pAnimAssocGroup, DWORD AnimID )
5354+
void CreateAnimStaticAssociation ( CAnimBlendStaticAssociationSAInterface * pAnimStaticAssoc, CAnimBlendAssocGroupSAInterface * pAnimAssocGroup, DWORD AnimID )
53515355
{
5352-
auto pAnimStaticAssoc = (CAnimBlendStaticAssociationSAInterface *)( pAnimAssocGroup[1] + 20 * (AnimID - pAnimAssocGroup[3]) );
5356+
DWORD * pdwAnimAssocGroup = reinterpret_cast < DWORD * > ( pAnimAssocGroup );
5357+
auto pOriginalAnimStaticAssoc = (CAnimBlendStaticAssociationSAInterface *)( pdwAnimAssocGroup[1] + 20 * (AnimID - pdwAnimAssocGroup[3]) );
53535358
//auto pAnimStaticAssoc = (CAnimBlendStaticAssociationSAInterface *)malloc ( sizeof(CAnimBlendStaticAssociationSAInterface));
53545359

5355-
return pAnimStaticAssoc;
5360+
*pAnimStaticAssoc = *pOriginalAnimStaticAssoc;
53565361
}
53575362

5358-
//CAnimBlendAssocGroupSAInterface * pAnimAssocGroup = nullptr;
5363+
CAnimBlendAssocGroupSAInterface * pAnimAssocGroup = nullptr;
5364+
CAnimBlendStaticAssociationSAInterface AnimStaticAssoc;
53595365
CAnimBlendStaticAssociationSAInterface * pAnimStaticAssoc = nullptr;
5360-
DWORD * pAnimAssocGroup = nullptr;
53615366
DWORD AnimID = 0;
53625367
RpClump * pClump = nullptr;
53635368
void _declspec(naked) HOOK_CAnimBlendAssocGroup_CopyAnimation ()
53645369
{
53655370
_asm
53665371
{
53675372
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-
53775373
mov pAnimAssocGroup, ecx
53785374
mov AnimID, eax
53795375
pushad
53805376
}
53815377

5382-
pAnimStaticAssoc = getAnimStaticAssociation ( pAnimAssocGroup, AnimID );
5383-
5378+
CreateAnimStaticAssociation ( &AnimStaticAssoc, pAnimAssocGroup, AnimID );
5379+
pAnimStaticAssoc = &AnimStaticAssoc;
5380+
53845381
_asm
53855382
{
53865383
popad
53875384
mov ecx, [ecx+4]
53885385
sub eax, edx
53895386
push esi
53905387
mov esi, pAnimStaticAssoc
5388+
test esi, esi
5389+
jz ERROR_CopyAnimation
5390+
mov eax, [esi+10h]
5391+
push eax
5392+
mov eax, 04D41C0h
5393+
call eax
5394+
push 3Ch
5395+
call FUNC_NEW_OPERATOR
5396+
add esp, 8
5397+
mov [esp+14h], eax
5398+
test eax, eax
5399+
mov [esp+0Ch], 0
5400+
jz ERROR_CopyAnimation
5401+
push esi
5402+
mov ecx, eax
5403+
call FUNC_CAnimBlendAssociation_Constructor
53915404
jmp RETURN_CAnimBlendAssocGroup_CopyAnimation
5405+
5406+
ERROR_CopyAnimation:
5407+
jmp RETURN_CAnimBlendAssocGroup_CopyAnimation_ERROR
53925408
}
53935409
}
53945410

0 commit comments

Comments
 (0)