Skip to content

Commit cb453c6

Browse files
committed
Added CAnimBlendAssociation Contructor and Destructor handler
This is for properly unloading IFP using SIFPAnimations struct.
1 parent aab7940 commit cb453c6

File tree

6 files changed

+128
-1
lines changed

6 files changed

+128
-1
lines changed

Client/mods/deathmatch/logic/CClientGame.cpp

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -270,6 +270,8 @@ CClientGame::CClientGame ( bool bLocalPlay )
270270
g_pMultiplayer->SetPostWorldProcessHandler ( CClientGame::StaticPostWorldProcessHandler );
271271
g_pMultiplayer->SetPreFxRenderHandler ( CClientGame::StaticPreFxRenderHandler );
272272
g_pMultiplayer->SetPreHudRenderHandler ( CClientGame::StaticPreHudRenderHandler );
273+
g_pMultiplayer->SetCAnimBlendAssocHierConstructorHandler ( CClientGame::StaticCAnimBlendAssocHierConstructorHandler );
274+
g_pMultiplayer->SetCAnimBlendAssocDestructorHandler ( CClientGame::StaticCAnimBlendAssocDestructorHandler );
273275
g_pMultiplayer->SetAddAnimationHandler ( CClientGame::StaticAddAnimationHandler );
274276
g_pMultiplayer->SetAddAnimationAndSyncHandler ( CClientGame::StaticAddAnimationAndSyncHandler );
275277
g_pMultiplayer->SetAssocGroupCopyAnimationHandler ( CClientGame::StaticAssocGroupCopyAnimationHandler );
@@ -430,6 +432,8 @@ CClientGame::~CClientGame ( void )
430432
g_pMultiplayer->SetPostWorldProcessHandler ( NULL );
431433
g_pMultiplayer->SetPreFxRenderHandler ( NULL );
432434
g_pMultiplayer->SetPreHudRenderHandler ( NULL );
435+
g_pMultiplayer->SetCAnimBlendAssocHierConstructorHandler ( NULL );
436+
g_pMultiplayer->SetCAnimBlendAssocDestructorHandler ( NULL );
433437
g_pMultiplayer->SetAddAnimationHandler ( NULL );
434438
g_pMultiplayer->SetAddAnimationAndSyncHandler ( NULL );
435439
g_pMultiplayer->SetAssocGroupCopyAnimationHandler ( NULL );
@@ -3697,6 +3701,16 @@ bool CClientGame::StaticChokingHandler ( unsigned char ucWeaponType )
36973701
return g_pClientGame->ChokingHandler ( ucWeaponType );
36983702
}
36993703

3704+
void CClientGame::StaticCAnimBlendAssocHierConstructorHandler ( CAnimBlendAssociationSAInterface * pThis, RpClump * pClump, CAnimBlendHierarchySAInterface * pAnimHierarchy )
3705+
{
3706+
g_pClientGame->CAnimBlendAssocHierConstructorHandler ( pThis, pClump, pAnimHierarchy );
3707+
}
3708+
3709+
void CClientGame::StaticCAnimBlendAssocDestructorHandler ( CAnimBlendAssociationSAInterface * pThis )
3710+
{
3711+
g_pClientGame->CAnimBlendAssocDestructorHandler ( pThis );
3712+
}
3713+
37003714
CAnimBlendAssociationSAInterface * CClientGame::StaticAddAnimationHandler ( RpClump * pClump, AssocGroupId animGroup, AnimationId animID )
37013715
{
37023716
return g_pClientGame->AddAnimationHandler ( pClump, animGroup, animID );
@@ -3999,6 +4013,16 @@ bool CClientGame::ChokingHandler ( unsigned char ucWeaponType )
39994013
}
40004014

40014015

4016+
void CClientGame::CAnimBlendAssocHierConstructorHandler ( CAnimBlendAssociationSAInterface * pThis, RpClump * pClump, CAnimBlendHierarchySAInterface * pAnimHierarchy )
4017+
{
4018+
printf("CClientGame::CAnimBlendAssocHierConstructorHandler called! sAnimID: %d\n", pThis->sAnimID);
4019+
}
4020+
4021+
4022+
void CClientGame::CAnimBlendAssocDestructorHandler ( CAnimBlendAssociationSAInterface * pThis )
4023+
{
4024+
//printf("CClientGame::CAnimBlendAssocDestructorHandler called! sAnimID: %d\n", pThis->sAnimID);
4025+
}
40024026

40034027

40044028
CAnimBlendAssociationSAInterface * CClientGame::AddAnimationHandler ( RpClump * pClump, AssocGroupId animGroup, AnimationId animID )
@@ -4007,19 +4031,22 @@ CAnimBlendAssociationSAInterface * CClientGame::AddAnimationHandler ( RpClump *
40074031
return nullptr;
40084032
}
40094033

4034+
40104035
CAnimBlendAssociationSAInterface * CClientGame::AddAnimationAndSyncHandler ( RpClump * pClump, CAnimBlendAssociationSAInterface * pAnimAssocToSyncWith, AssocGroupId animGroup, AnimationId animID )
40114036
{
40124037
//printf ( "AddAnimationAndSyncHandler called! pClump, GroupID, AnimID: %p, %d, %d\n", (void*)pClump, animGroup, animID );
40134038
return nullptr;
40144039
}
40154040

4041+
40164042
typedef void (__thiscall* hCAnimBlendStaticAssociation_Init)
40174043
(
40184044
CAnimBlendStaticAssociationSAInterface * pThis,
40194045
RpClump * Clump,
40204046
CAnimBlendHierarchySAInterface * pAnimBlendHierarchy
40214047
);
40224048

4049+
40234050
bool CClientGame::AssocGroupCopyAnimationHandler ( CAnimBlendStaticAssociationSAInterface * pOutAnimStaticAssoc, SIFPAnimations ** pOutIFPAnimations, RpClump * pClump, CAnimBlendAssocGroupSAInterface * pAnimAssocGroup, AnimationId animID )
40244051
{
40254052
printf ("AssocGroupCopyAnimationHandler called!\n");
@@ -4059,6 +4086,7 @@ bool CClientGame::AssocGroupCopyAnimationHandler ( CAnimBlendStaticAssociationSA
40594086
return isCustomAnimationToPlay;
40604087
}
40614088

4089+
40624090
CAnimBlendHierarchySAInterface * CClientGame::BlendAnimationHierarchyHandler ( RpClump * pClump, CAnimBlendHierarchySAInterface * pAnimHierarchy, int flags, float fBlendDelta )
40634091
{
40644092
printf("CClientGame::BlendAnimationHierarchyHandler called | pClump: %p\n", (void*)pClump);
@@ -4108,6 +4136,7 @@ CAnimBlendHierarchySAInterface * CClientGame::BlendAnimationHierarchyHandler ( R
41084136
return pAnimHierarchy;
41094137
}
41104138

4139+
41114140
bool CClientGame::ProcessCollisionHandler ( CEntitySAInterface* pThisInterface, CEntitySAInterface* pOtherInterface )
41124141
{
41134142
if ( pThisInterface == pOtherInterface )

Client/mods/deathmatch/logic/CClientGame.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -503,6 +503,8 @@ class CClientGame
503503
static void StaticPostWorldProcessHandler ( void );
504504
static void StaticPreFxRenderHandler ( void );
505505
static void StaticPreHudRenderHandler ( void );
506+
static void StaticCAnimBlendAssocHierConstructorHandler ( CAnimBlendAssociationSAInterface * pThis, RpClump * pClump, CAnimBlendHierarchySAInterface * pAnimHierarchy );
507+
static void StaticCAnimBlendAssocDestructorHandler ( CAnimBlendAssociationSAInterface * pThis );
506508
static CAnimBlendAssociationSAInterface * StaticAddAnimationHandler ( RpClump * pClump, AssocGroupId animGroup, AnimationId animID );
507509
static CAnimBlendAssociationSAInterface * StaticAddAnimationAndSyncHandler( RpClump * pClump, CAnimBlendAssociationSAInterface * pAnimAssocToSyncWith, AssocGroupId animGroup, AnimationId animID );
508510
static bool StaticAssocGroupCopyAnimationHandler ( CAnimBlendStaticAssociationSAInterface * pOutAnimStaticAssoc, SIFPAnimations ** pOutIFPAnimations, RpClump * pClump, CAnimBlendAssocGroupSAInterface * pAnimAssocGroup, AnimationId animID );
@@ -536,6 +538,8 @@ class CClientGame
536538
bool ChokingHandler ( unsigned char ucWeaponType );
537539
void PreWorldProcessHandler ( void );
538540
void PostWorldProcessHandler ( void );
541+
void CAnimBlendAssocHierConstructorHandler ( CAnimBlendAssociationSAInterface * pThis, RpClump * pClump, CAnimBlendHierarchySAInterface * pAnimHierarchy );
542+
void CAnimBlendAssocDestructorHandler ( CAnimBlendAssociationSAInterface * pThis );
539543
CAnimBlendAssociationSAInterface * AddAnimationHandler ( RpClump * pClump, AssocGroupId animGroup, AnimationId animID );
540544
CAnimBlendAssociationSAInterface * AddAnimationAndSyncHandler ( RpClump * pClump, CAnimBlendAssociationSAInterface * pAnimAssocToSyncWith, AssocGroupId animGroup, AnimationId animID );
541545
bool AssocGroupCopyAnimationHandler ( CAnimBlendStaticAssociationSAInterface * pOutAnimStaticAssoc, SIFPAnimations ** pOutIFPAnimations, RpClump * pClump, CAnimBlendAssocGroupSAInterface * pAnimAssocGroup, AnimationId animID );

Client/multiplayer_sa/CMultiplayerSA.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,6 +157,8 @@ DWORD RETURN_CPlantMgr_Render_fail = 0x5DBDAA;
157157
#define HOOKPOS_CEventHandler_ComputeKnockOffBikeResponse 0x4BA06F
158158
DWORD RETURN_CEventHandler_ComputeKnockOffBikeResponse = 0x4BA076;
159159

160+
#define HOOKPOS_CAnimBlendAssoc_Hierarchy_Constructor 0x4CEFC0
161+
#define HOOKPOS_CAnimBlendAssoc_destructor 0x4CECF0
160162
#define HOOKPOS_CAnimBlendAssocGroup_CopyAnimation 0x4CE14C
161163
#define HOOKPOS_CAnimManager_AddAnimation 0x4d3aa0
162164
#define HOOKPOS_CAnimManager_AddAnimationAndSync 0x4D3B30
@@ -423,6 +425,8 @@ void HOOK_RenderScene_Plants ();
423425
void HOOK_RenderScene_end ();
424426
void HOOK_CPlantMgr_Render ();
425427
void HOOK_CEventHandler_ComputeKnockOffBikeResponse ();
428+
void HOOK_CAnimBlendAssoc_Hierarchy_Constructor ();
429+
void HOOK_CAnimBlendAssoc_destructor ();
426430
void HOOK_CAnimManager_AddAnimation ();
427431
void HOOK_CAnimManager_AddAnimationAndSync ();
428432
void HOOK_CAnimBlendAssocGroup_CopyAnimation ();
@@ -632,6 +636,8 @@ void CMultiplayerSA::InitHooks()
632636
HookInstall(HOOKPOS_CGame_Process, (DWORD)HOOK_CGame_Process, 10 );
633637
HookInstall(HOOKPOS_Idle, (DWORD)HOOK_Idle, 10 );
634638
HookInstall(HOOKPOS_CEventHandler_ComputeKnockOffBikeResponse, (DWORD)HOOK_CEventHandler_ComputeKnockOffBikeResponse, 7 );
639+
HookInstall(HOOKPOS_CAnimBlendAssoc_Hierarchy_Constructor, (DWORD)HOOK_CAnimBlendAssoc_Hierarchy_Constructor, 5 );
640+
HookInstall(HOOKPOS_CAnimBlendAssoc_destructor, (DWORD)HOOK_CAnimBlendAssoc_destructor, 6 );
635641
HookInstall(HOOKPOS_CAnimManager_AddAnimation, (DWORD)HOOK_CAnimManager_AddAnimation, 10 );
636642
HookInstall(HOOKPOS_CAnimManager_AddAnimationAndSync, (DWORD)HOOK_CAnimManager_AddAnimationAndSync, 10 );
637643
HookInstall(HOOKPOS_CAnimBlendAssocGroup_CopyAnimation, (DWORD)HOOK_CAnimBlendAssocGroup_CopyAnimation, 5 );

Client/multiplayer_sa/CMultiplayerSA.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -116,6 +116,8 @@ class CMultiplayerSA : public CMultiplayer
116116
void SetIdleHandler ( IdleHandler * pHandler );
117117
void SetPreFxRenderHandler ( PreFxRenderHandler * pHandler );
118118
void SetPreHudRenderHandler ( PreHudRenderHandler * pHandler );
119+
void SetCAnimBlendAssocHierConstructorHandler ( CAnimBlendAssocHierConstructorHandler * pHandler );
120+
void SetCAnimBlendAssocDestructorHandler ( CAnimBlendAssocDestructorHandler * pHandler );
119121
void SetAddAnimationHandler ( AddAnimationHandler * pHandler );
120122
void SetAddAnimationAndSyncHandler ( AddAnimationAndSyncHandler * pHandler );
121123
void SetAssocGroupCopyAnimationHandler ( AssocGroupCopyAnimationHandler * pHandler );

Client/multiplayer_sa/CMultiplayerSA_CustomAnimations.cpp

Lines changed: 83 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,13 +8,17 @@
88
DWORD FUNC_NEW_OPERATOR = 0x082119A;
99
DWORD FUNC_CAnimBlendAssociation_Constructor = 0x04CF080;
1010

11+
DWORD RETURN_CAnimBlendAssoc_Hierarchy_Constructor = 0x4CEFC5;
12+
DWORD RETURN_CAnimBlendAssoc_destructor = 0x4CECF6;
1113
DWORD RETURN_CAnimBlendAssocGroup_CopyAnimation_NORMALFLOW =0x4CE151;
1214
DWORD RETURN_CAnimBlendAssocGroup_CopyAnimation = 0x4CE187;
1315
DWORD RETURN_CAnimBlendAssocGroup_CopyAnimation_ERROR = 0x4CE199;
1416
DWORD RETURN_CAnimManager_AddAnimation = 0x4D3AB1;
1517
DWORD RETURN_CAnimManager_AddAnimationAndSync = 0x4D3B41;
1618
DWORD RETURN_CAnimManager_BlendAnimation_Hierarchy = 0x4D4417;
1719

20+
CAnimBlendAssocHierConstructorHandler * m_pCAnimBlendAssocHierConstructorHandler = nullptr;
21+
CAnimBlendAssocDestructorHandler * m_pCAnimBlendAssocDestructorHandler = nullptr;
1822
AddAnimationHandler * m_pAddAnimationHandler = nullptr;
1923
AddAnimationAndSyncHandler * m_pAddAnimationAndSyncHandler = nullptr;
2024
AssocGroupCopyAnimationHandler * m_pAssocGroupCopyAnimationHandler = nullptr;
@@ -23,6 +27,16 @@ BlendAnimationHierarchyHandler * m_pBlendAnimationHierarchyHandler = nullptr;
2327
int _cdecl OnCAnimBlendAssocGroupCopyAnimation ( AssocGroupId animGroup, int iAnimId );
2428
auto CAnimBlendStaticAssociation_FreeSequenceArray = (hCAnimBlendStaticAssociation_FreeSequenceArray)0x4ce9a0;
2529

30+
void CMultiplayerSA::SetCAnimBlendAssocHierConstructorHandler ( CAnimBlendAssocHierConstructorHandler * pHandler )
31+
{
32+
m_pCAnimBlendAssocHierConstructorHandler = pHandler;
33+
}
34+
35+
void CMultiplayerSA::SetCAnimBlendAssocDestructorHandler ( CAnimBlendAssocDestructorHandler * pHandler )
36+
{
37+
m_pCAnimBlendAssocDestructorHandler = pHandler;
38+
}
39+
2640
void CMultiplayerSA::SetAddAnimationHandler ( AddAnimationHandler * pHandler )
2741
{
2842
m_pAddAnimationHandler = pHandler;
@@ -43,6 +57,74 @@ void CMultiplayerSA::SetBlendAnimationHierarchyHandler ( BlendAnimationHierarchy
4357
m_pBlendAnimationHierarchyHandler = pHandler;
4458
}
4559

60+
void _declspec(naked) HOOK_CAnimBlendAssoc_Hierarchy_Constructor ()
61+
{
62+
_asm
63+
{
64+
pushad
65+
}
66+
67+
if ( m_pCAnimBlendAssocHierConstructorHandler )
68+
{
69+
_asm
70+
{
71+
popad
72+
push ecx
73+
mov eax, dword ptr [esp+0Ch] // pAnimHierarchy
74+
push eax
75+
mov eax, dword ptr [esp+0Ch] // pClump
76+
push eax
77+
push ecx // this
78+
call m_pCAnimBlendAssocHierConstructorHandler
79+
add esp, 0Ch
80+
pop ecx
81+
pushad
82+
jmp NORMAL_FLOW_CAnimBlendAssoc_Hierarchy_Constructor
83+
}
84+
}
85+
86+
_asm
87+
{
88+
NORMAL_FLOW_CAnimBlendAssoc_Hierarchy_Constructor:
89+
popad
90+
xor eax, eax
91+
push esi
92+
mov esi, ecx
93+
jmp RETURN_CAnimBlendAssoc_Hierarchy_Constructor
94+
}
95+
}
96+
97+
void _declspec(naked) HOOK_CAnimBlendAssoc_destructor ()
98+
{
99+
_asm
100+
{
101+
pushad
102+
}
103+
104+
if ( m_pCAnimBlendAssocDestructorHandler )
105+
{
106+
_asm
107+
{
108+
popad
109+
push ecx // this
110+
call m_pCAnimBlendAssocDestructorHandler
111+
pop ecx
112+
pushad
113+
jmp NORMAL_FLOW_CAnimBlendAssoc_destructor
114+
}
115+
}
116+
117+
_asm
118+
{
119+
NORMAL_FLOW_CAnimBlendAssoc_destructor:
120+
popad
121+
push esi
122+
mov esi, ecx
123+
mov eax, [esi+10h]
124+
jmp RETURN_CAnimBlendAssoc_destructor
125+
}
126+
}
127+
46128
CAnimBlendStaticAssociationSAInterface * __cdecl AllocateStaticAssociationMemory ( void )
47129
{
48130
return new CAnimBlendStaticAssociationSAInterface;
@@ -54,7 +136,7 @@ void __cdecl DeleteStaticAssociation ( CAnimBlendStaticAssociationSAInterface *
54136
delete pAnimStaticAssoc;
55137
}
56138

57-
void _declspec(naked) HOOK_CAnimBlendAssocGroup_CopyAnimation ()
139+
void _declspec(naked) HOOK_CAnimBlendAssocGroup_CopyAnimation ()
58140
{
59141
_asm
60142
{

Client/sdk/multiplayer/CMultiplayer.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,6 +72,8 @@ typedef void ( PreFxRenderHandler ) ( void );
7272
typedef void ( PreHudRenderHandler ) ( void );
7373
typedef CAnimBlendAssociationSAInterface * ( AddAnimationHandler ) ( RpClump * pClump, AssocGroupId animGroup, AnimationId animID );
7474
typedef CAnimBlendAssociationSAInterface * ( AddAnimationAndSyncHandler ) ( RpClump * pClump, CAnimBlendAssociationSAInterface * pAnimAssocToSyncWith, AssocGroupId animGroup, AnimationId animID );
75+
typedef void ( CAnimBlendAssocHierConstructorHandler ) ( CAnimBlendAssociationSAInterface * pThis, RpClump * pClump, CAnimBlendHierarchySAInterface * pAnimHierarchy );
76+
typedef void ( CAnimBlendAssocDestructorHandler ) ( CAnimBlendAssociationSAInterface * pThis );
7577
typedef bool ( AssocGroupCopyAnimationHandler ) ( CAnimBlendStaticAssociationSAInterface * pOutAnimStaticAssoc, SIFPAnimations ** pOutIFPAnimations, RpClump * pClump, CAnimBlendAssocGroupSAInterface * pAnimAssocGroup, AnimationId animID );
7678
typedef CAnimBlendHierarchySAInterface * ( BlendAnimationHierarchyHandler ) ( RpClump * pClump, CAnimBlendHierarchySAInterface * pAnimHierarchy, int flags, float fBlendDelta );
7779
typedef bool ( ProcessCollisionHandler ) ( class CEntitySAInterface* pThisInterface, class CEntitySAInterface* pOtherInterface );
@@ -185,6 +187,8 @@ class CMultiplayer
185187
virtual void SetIdleHandler ( IdleHandler * pHandler ) = 0;
186188
virtual void SetPreFxRenderHandler ( PreFxRenderHandler * pHandler ) = 0;
187189
virtual void SetPreHudRenderHandler ( PreHudRenderHandler * pHandler ) = 0;
190+
virtual void SetCAnimBlendAssocHierConstructorHandler ( CAnimBlendAssocHierConstructorHandler * pHandler ) = 0;
191+
virtual void SetCAnimBlendAssocDestructorHandler ( CAnimBlendAssocDestructorHandler * pHandler ) = 0;
188192
virtual void SetAddAnimationHandler ( AddAnimationHandler * pHandler ) = 0;
189193
virtual void SetAddAnimationAndSyncHandler ( AddAnimationAndSyncHandler * pHandler ) = 0;
190194
virtual void SetAssocGroupCopyAnimationHandler ( AssocGroupCopyAnimationHandler * pHandler ) = 0;

0 commit comments

Comments
 (0)