Skip to content

Commit a5ddb6e

Browse files
committed
Improved code design for CAnimBlendStaticAssociation
1 parent 7be4f2b commit a5ddb6e

File tree

8 files changed

+78
-30
lines changed

8 files changed

+78
-30
lines changed

Client/game_sa/CAnimBlendStaticAssociationSA.cpp

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,15 @@
1212

1313
#include "StdInc.h"
1414

15-
CAnimBlendHierarchy * CAnimBlendStaticAssociationSA::GetAnimHierachy ( void )
15+
void CAnimBlendStaticAssociationSA::Initialize ( RpClump * pClump, CAnimBlendHierarchySAInterface * pAnimBlendHierarchyInterface )
1616
{
17-
return NULL;
17+
DWORD dwThis = ( DWORD ) m_pInterface;
18+
DWORD dwFunc = FUNC_CAnimBlendStaticAssociation_Initialize;
19+
_asm
20+
{
21+
push pAnimBlendHierarchyInterface
22+
push pClump
23+
mov ecx, dwThis
24+
call dwFunc
25+
}
1826
}

Client/game_sa/CAnimBlendStaticAssociationSA.h

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,8 @@
1818
#include <game/CAnimBlendStaticAssociation.h>
1919
#include "Common.h"
2020

21+
#define FUNC_CAnimBlendStaticAssociation_Initialize 0x4CEC20
22+
2123
class CAnimBlendAssocGroupSA;
2224
class CAnimBlendHierarchySAInterface;
2325
class CAnimBlendHierarchy;
@@ -39,8 +41,17 @@ class CAnimBlendStaticAssociationSA : public CAnimBlendStaticAssociation
3941
{
4042
public:
4143
CAnimBlendStaticAssociationSA ( CAnimBlendStaticAssociationSAInterface * pInterface ) { m_pInterface = pInterface; }
42-
43-
CAnimBlendHierarchy * GetAnimHierachy ( void );
44+
void Initialize ( RpClump * pClump, CAnimBlendHierarchySAInterface * pAnimBlendHierarchyInterface );
45+
void SetNumBlendNodes ( unsigned short nNumBlendNodes ) { m_pInterface->nNumBlendNodes = nNumBlendNodes; };
46+
void SetAnimID ( short sAnimID ) { m_pInterface->sAnimID = sAnimID; }
47+
void SetAnimGroup ( short sAnimGroup ) { m_pInterface->sAnimGroup = sAnimGroup; }
48+
void SetFlags ( short sFlags ) { m_pInterface->sFlags = sFlags; }
49+
50+
unsigned short GetNumBlendNodes ( void ) { return m_pInterface->nNumBlendNodes; };
51+
short GetAnimID ( void ) { return m_pInterface->sAnimID; }
52+
short GetAnimGroup ( void ) { return m_pInterface->sAnimGroup; }
53+
short GetFlags ( void ) { return m_pInterface->sFlags; }
54+
CAnimBlendHierarchySAInterface * GetAnimHierachyInterface ( void ) { return m_pInterface->pAnimHeirarchy; }
4455

4556
protected:
4657
CAnimBlendStaticAssociationSAInterface * m_pInterface;

Client/game_sa/CAnimManagerSA.cpp

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -256,7 +256,7 @@ CAnimBlendAssociation * CAnimManagerSA::CreateAnimAssociation ( AssocGroupId ani
256256
}
257257

258258

259-
CAnimBlendStaticAssociationSAInterface * CAnimManagerSA::GetAnimStaticAssociation ( AssocGroupId animGroup, AnimationId animID )
259+
CAnimManagerSA::StaticAssocIntface_type CAnimManagerSA::GetAnimStaticAssociation ( AssocGroupId animGroup, AnimationId animID )
260260
{
261261
CAnimBlendStaticAssociationSAInterface * pInterface = nullptr;
262262
DWORD dwFunc = FUNC_CAnimManager_GetAnimAssociation;
@@ -268,7 +268,7 @@ CAnimBlendStaticAssociationSAInterface * CAnimManagerSA::GetAnimStaticAssociatio
268268
mov pInterface, eax
269269
add esp, 0x8
270270
}
271-
return pInterface;
271+
return std::make_unique < CAnimBlendStaticAssociationSA > ( pInterface );
272272
}
273273

274274

@@ -798,6 +798,11 @@ CAnimBlendHierarchy * CAnimManagerSA::GetAnimBlendHierarchy ( CAnimBlendHierarch
798798
return NULL;
799799
}
800800

801+
CAnimManagerSA::StaticAssocIntface_type CAnimManagerSA::GetAnimStaticAssociation ( CAnimBlendStaticAssociationSAInterface * pInterface )
802+
{
803+
return std::make_unique < CAnimBlendStaticAssociationSA > ( pInterface );
804+
}
805+
801806
std::unique_ptr < CAnimBlendHierarchy > CAnimManagerSA::GetCustomAnimBlendHierarchy ( CAnimBlendHierarchySAInterface * pInterface )
802807
{
803808
return std::make_unique < CAnimBlendHierarchySA > ( pInterface );

Client/game_sa/CAnimManagerSA.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -81,7 +81,7 @@ class CAnimManagerSAInterface
8181

8282
class CAnimManagerSA : public CAnimManager
8383
{
84-
typedef CAnimBlendStaticAssociationSAInterface * StaticAssocIntface_type;
84+
typedef std::unique_ptr < CAnimBlendStaticAssociation > StaticAssocIntface_type;
8585

8686
public:
8787
CAnimManagerSA ( void );
@@ -154,6 +154,8 @@ class CAnimManagerSA : public CAnimManager
154154
CAnimBlock * GetAnimBlock ( CAnimBlockSAInterface * pInterface );
155155
CAnimBlendHierarchy * GetAnimBlendHierarchy ( CAnimBlendHierarchySAInterface * pInterface );
156156

157+
StaticAssocIntface_type GetAnimStaticAssociation ( CAnimBlendStaticAssociationSAInterface * pInterface );
158+
157159
// MTA members, but use this strictly for custom animations only
158160
std::unique_ptr < CAnimBlendHierarchy > GetCustomAnimBlendHierarchy ( CAnimBlendHierarchySAInterface * pInterface );
159161
std::unique_ptr < CAnimBlendSequence > GetCustomAnimBlendSequence ( CAnimBlendSequenceSAInterface * pInterface );

Client/mods/deathmatch/logic/CClientGame.cpp

Lines changed: 26 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -4027,57 +4027,42 @@ CAnimBlendAssociationSAInterface * CClientGame::AddAnimationAndSyncHandler ( RpC
40274027
}
40284028

40294029

4030-
typedef void (__thiscall* hCAnimBlendStaticAssociation_Init)
4031-
(
4032-
CAnimBlendStaticAssociationSAInterface * pThis,
4033-
RpClump * Clump,
4034-
CAnimBlendHierarchySAInterface * pAnimBlendHierarchy
4035-
);
4036-
4037-
4038-
bool CClientGame::AssocGroupCopyAnimationHandler ( CAnimBlendStaticAssociationSAInterface * pOutAnimStaticAssoc, CAnimBlendAssociationSAInterface * pAnimAssoc, RpClump * pClump, CAnimBlendAssocGroupSAInterface * pAnimAssocGroup, AnimationId animID )
4030+
bool CClientGame::AssocGroupCopyAnimationHandler ( CAnimBlendStaticAssociationSAInterface * pOutAnimStaticAssocInterface, CAnimBlendAssociationSAInterface * pAnimAssoc, RpClump * pClump, CAnimBlendAssocGroupSAInterface * pAnimAssocGroup, AnimationId animID )
40394031
{
4040-
auto CAnimBlendStaticAssociation_Init = (hCAnimBlendStaticAssociation_Init)0x4CEC20;
40414032
bool isCustomAnimationToPlay = false;
4042-
40434033
CAnimManager * pAnimationManager = g_pGame->GetAnimManager();
40444034
auto pOriginalAnimStaticAssoc = pAnimationManager->GetAnimStaticAssociation ( pAnimAssocGroup->groupID, animID );
4045-
4035+
auto pOriginalAnimHierarchyInterface = pOriginalAnimStaticAssoc->GetAnimHierachyInterface ( );
4036+
auto pOutAnimStaticAssoc = pAnimationManager->GetAnimStaticAssociation ( pOutAnimStaticAssocInterface );
40464037
CClientPed * pClientPed = GetClientPedByClump ( *pClump );
40474038
if ( pClientPed != nullptr )
40484039
{
4049-
auto pReplacedAnimation = pClientPed->GetReplacedAnimation ( pOriginalAnimStaticAssoc->pAnimHeirarchy );
4040+
auto pReplacedAnimation = pClientPed->GetReplacedAnimation ( pOriginalAnimHierarchyInterface );
40504041
if ( pReplacedAnimation != nullptr )
40514042
{
40524043
std::shared_ptr < CIFPAnimations > pIFPAnimations = pReplacedAnimation->pIFP->GetIFPAnimationsPointer ();
40534044
InsertAnimationAssociationToMap ( pAnimAssoc, pIFPAnimations );
40544045

40554046
// Play our custom animation instead of default
4056-
CAnimBlendStaticAssociation_Init ( pOutAnimStaticAssoc, pClump, pReplacedAnimation->pAnimationHierarchy );
4047+
pOutAnimStaticAssoc->Initialize ( pClump, pReplacedAnimation->pAnimationHierarchy );
40574048
isCustomAnimationToPlay = true;
40584049
}
40594050
}
40604051

40614052
if ( !isCustomAnimationToPlay )
40624053
{
40634054
// Play default internal animation
4064-
CAnimBlendStaticAssociation_Init ( pOutAnimStaticAssoc, pClump, pOriginalAnimStaticAssoc->pAnimHeirarchy );
4055+
pOutAnimStaticAssoc->Initialize ( pClump, pOriginalAnimHierarchyInterface );
40654056
}
40664057

4067-
pOutAnimStaticAssoc->sAnimGroup = static_cast < short > ( pAnimAssocGroup->groupID );
4068-
pOutAnimStaticAssoc->sAnimID = static_cast < short > ( animID );
4069-
4070-
// Total bones in clump. GTA SA is using 32 bones for peds/players
4071-
pOutAnimStaticAssoc->nNumBlendNodes = pOriginalAnimStaticAssoc->nNumBlendNodes;
4072-
pOutAnimStaticAssoc->sFlags = pOriginalAnimStaticAssoc->sFlags;
4058+
CopyStaticAssociationProperties ( pOutAnimStaticAssoc, pOriginalAnimStaticAssoc );
40734059
return isCustomAnimationToPlay;
40744060
}
40754061

40764062

40774063
bool CClientGame::BlendAnimationHierarchyHandler ( CAnimBlendAssociationSAInterface * pAnimAssoc, CAnimBlendHierarchySAInterface ** pOutAnimHierarchy, int * pFlags, RpClump * pClump )
40784064
{
40794065
bool isCustomAnimationToPlay = false;
4080-
40814066
CAnimManager * pAnimationManager = g_pGame->GetAnimManager();
40824067
CClientPed * pClientPed = GetClientPedByClump ( *pClump );
40834068
if ( pClientPed != nullptr )
@@ -6845,12 +6830,25 @@ void CClientGame::RestreamModel ( unsigned short usModel )
68456830

68466831
}
68476832

6833+
6834+
void CClientGame::CopyStaticAssociationProperties ( std::unique_ptr < CAnimBlendStaticAssociation > & pOutAnimStaticAssoc, std::unique_ptr < CAnimBlendStaticAssociation > & pOriginalAnimStaticAssoc )
6835+
{
6836+
pOutAnimStaticAssoc->SetAnimGroup ( pOriginalAnimStaticAssoc->GetAnimGroup ( ) );
6837+
pOutAnimStaticAssoc->SetAnimID ( pOriginalAnimStaticAssoc->GetAnimID ( ) );
6838+
6839+
// Total bones in clump. GTA SA is using 32 bones for peds/players
6840+
pOutAnimStaticAssoc->SetNumBlendNodes ( pOriginalAnimStaticAssoc->GetNumBlendNodes ( ) );
6841+
pOutAnimStaticAssoc->SetFlags ( pOriginalAnimStaticAssoc->GetFlags ( ) );
6842+
}
6843+
6844+
68486845
void CClientGame::InsertIFPPointerToMap ( const unsigned int u32BlockNameHash, const std::shared_ptr < CClientIFP > & pIFP )
68496846
{
68506847
std::lock_guard < std::mutex > mutexGuardedLock ( m_MutexOfIfpPointersMap );
68516848
m_mapOfIfpPointers [ u32BlockNameHash ] = pIFP;
68526849
}
68536850

6851+
68546852
std::shared_ptr < CClientIFP > CClientGame::GetIFPPointerFromMap ( const unsigned int u32BlockNameHash )
68556853
{
68566854
std::lock_guard < std::mutex > mutexGuardedLock ( m_MutexOfIfpPointersMap );
@@ -6862,6 +6860,7 @@ std::shared_ptr < CClientIFP > CClientGame::GetIFPPointerFromMap ( const unsigne
68626860
return nullptr;
68636861
}
68646862

6863+
68656864
void CClientGame::RemoveIFPPointerFromMap ( const unsigned int u32BlockNameHash )
68666865
{
68676866
std::lock_guard < std::mutex > mutexGuardedLock ( m_MutexOfIfpPointersMap );
@@ -6875,12 +6874,14 @@ void CClientGame::InsertPedPointerToSet ( CClientPed * pPed )
68756874
m_setOfPedPointers.insert ( pPed );
68766875
}
68776876

6877+
68786878
void CClientGame::RemovePedPointerFromSet ( CClientPed * pPed )
68796879
{
68806880
std::lock_guard < std::mutex > mutexGuardedLock ( m_MutexOfPedPointersSet );
68816881
m_setOfPedPointers.erase ( pPed );
68826882
}
68836883

6884+
68846885
CClientPed * CClientGame::GetClientPedByClump ( const RpClump & Clump )
68856886
{
68866887
std::lock_guard < std::mutex > mutexGuardedLock ( m_MutexOfPedPointersSet );
@@ -6902,6 +6903,7 @@ CClientPed * CClientGame::GetClientPedByClump ( const RpClump & Clump )
69026903
return nullptr;
69036904
}
69046905

6906+
69056907
void CClientGame::OnClientIFPUnload ( const std::shared_ptr < CClientIFP > & IFP )
69066908
{
69076909
std::lock_guard < std::mutex > mutexGuardedLock ( m_MutexOfPedPointersSet );
@@ -6931,12 +6933,14 @@ void CClientGame::OnClientIFPUnload ( const std::shared_ptr < CClientIFP > & IFP
69316933
}
69326934
}
69336935

6936+
69346937
void CClientGame::InsertAnimationAssociationToMap ( CAnimBlendAssociationSAInterface * pAnimAssociation, const std::shared_ptr < CIFPAnimations > & pIFPAnimations )
69356938
{
69366939
std::lock_guard < std::mutex > mutexGuardedLock ( m_MutexOfAnimationAssociationsMap );
69376940
m_mapOfCustomAnimationAssociations [ pAnimAssociation ] = pIFPAnimations;
69386941
}
69396942

6943+
69406944
void CClientGame::RemoveAnimationAssociationFromMap ( CAnimBlendAssociationSAInterface * pAnimAssociation )
69416945
{
69426946
std::lock_guard < std::mutex > mutexGuardedLock ( m_MutexOfAnimationAssociationsMap );

Client/mods/deathmatch/logic/CClientGame.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -593,6 +593,7 @@ class CClientGame
593593
void SetFileCacheRoot ( void );
594594
const char* GetFileCacheRoot ( void ) { return m_strFileCacheRoot; }
595595

596+
void CopyStaticAssociationProperties ( std::unique_ptr < CAnimBlendStaticAssociation > & pOutAnimStaticAssoc, std::unique_ptr < CAnimBlendStaticAssociation > & pOriginalAnimStaticAssoc );
596597
void InsertIFPPointerToMap ( const unsigned int u32BlockNameHash, const std::shared_ptr < CClientIFP > & pIFP );
597598
void RemoveIFPPointerFromMap ( const unsigned int u32BlockNameHash );
598599
std::shared_ptr < CClientIFP > GetIFPPointerFromMap ( const unsigned int u32BlockNameHash );

Client/sdk/game/CAnimBlendStaticAssociation.h

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,23 @@
1212
#ifndef __CAnimBlendStaticAssociation_H
1313
#define __CAnimBlendStaticAssociation_H
1414

15+
struct RpClump;
16+
class CAnimBlendHierarchySAInterface;
17+
1518
class CAnimBlendStaticAssociation
1619
{
1720
public:
21+
virtual void Initialize ( RpClump * pClump, CAnimBlendHierarchySAInterface * pAnimBlendHierarchyInterface ) = 0;
22+
virtual void SetNumBlendNodes ( unsigned short nNumBlendNodes ) = 0;
23+
virtual void SetAnimID ( short sAnimID ) = 0;
24+
virtual void SetAnimGroup ( short sAnimGroup ) = 0;
25+
virtual void SetFlags ( short sFlags ) = 0;
26+
27+
virtual unsigned short GetNumBlendNodes ( void ) = 0;
28+
virtual short GetAnimID ( void ) = 0;
29+
virtual short GetAnimGroup ( void ) = 0;
30+
virtual short GetFlags ( void ) = 0;
31+
virtual CAnimBlendHierarchySAInterface * GetAnimHierachyInterface ( void ) = 0;
1832
};
1933

2034
#endif

Client/sdk/game/CAnimManager.h

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@ class CAnimBlendHierarchy;
2828
class CAnimBlendSequence;
2929
class CAnimBlock;
3030
class CAnimBlendAssociation;
31+
class CAnimBlendStaticAssociation;
3132
class CAnimBlendStaticAssociationSAInterface;
3233
class CClientPed;
3334
struct RpClump;
@@ -46,7 +47,7 @@ class CAnimManager
4647

4748
friend class CAnimBlendAssociation;
4849
public:
49-
typedef CAnimBlendStaticAssociationSAInterface * StaticAssocIntface_type;
50+
typedef std::unique_ptr < CAnimBlendStaticAssociation > StaticAssocIntface_type;
5051

5152
virtual void Initialize ( void ) = 0;
5253
virtual void Shutdown ( void ) = 0;
@@ -116,6 +117,8 @@ class CAnimManager
116117
virtual CAnimBlock * GetAnimBlock ( CAnimBlockSAInterface * pInterface ) = 0;
117118
virtual CAnimBlendHierarchy * GetAnimBlendHierarchy ( CAnimBlendHierarchySAInterface * pInterface ) = 0;
118119

120+
virtual StaticAssocIntface_type GetAnimStaticAssociation ( CAnimBlendStaticAssociationSAInterface * pInterface ) = 0;
121+
119122
// MTA members, but use this strictly for custom animations only
120123
virtual std::unique_ptr < CAnimBlendHierarchy > GetCustomAnimBlendHierarchy ( CAnimBlendHierarchySAInterface * pInterface ) = 0;
121124
virtual std::unique_ptr < CAnimBlendSequence > GetCustomAnimBlendSequence ( CAnimBlendSequenceSAInterface * pInterface ) = 0;

0 commit comments

Comments
 (0)