@@ -4027,57 +4027,42 @@ CAnimBlendAssociationSAInterface * CClientGame::AddAnimationAndSyncHandler ( RpC
4027
4027
}
4028
4028
4029
4029
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 )
4039
4031
{
4040
- auto CAnimBlendStaticAssociation_Init = (hCAnimBlendStaticAssociation_Init)0x4CEC20 ;
4041
4032
bool isCustomAnimationToPlay = false ;
4042
-
4043
4033
CAnimManager * pAnimationManager = g_pGame->GetAnimManager ();
4044
4034
auto pOriginalAnimStaticAssoc = pAnimationManager->GetAnimStaticAssociation ( pAnimAssocGroup->groupID , animID );
4045
-
4035
+ auto pOriginalAnimHierarchyInterface = pOriginalAnimStaticAssoc->GetAnimHierachyInterface ( );
4036
+ auto pOutAnimStaticAssoc = pAnimationManager->GetAnimStaticAssociation ( pOutAnimStaticAssocInterface );
4046
4037
CClientPed * pClientPed = GetClientPedByClump ( *pClump );
4047
4038
if ( pClientPed != nullptr )
4048
4039
{
4049
- auto pReplacedAnimation = pClientPed->GetReplacedAnimation ( pOriginalAnimStaticAssoc-> pAnimHeirarchy );
4040
+ auto pReplacedAnimation = pClientPed->GetReplacedAnimation ( pOriginalAnimHierarchyInterface );
4050
4041
if ( pReplacedAnimation != nullptr )
4051
4042
{
4052
4043
std::shared_ptr < CIFPAnimations > pIFPAnimations = pReplacedAnimation->pIFP ->GetIFPAnimationsPointer ();
4053
4044
InsertAnimationAssociationToMap ( pAnimAssoc, pIFPAnimations );
4054
4045
4055
4046
// Play our custom animation instead of default
4056
- CAnimBlendStaticAssociation_Init ( pOutAnimStaticAssoc, pClump, pReplacedAnimation->pAnimationHierarchy );
4047
+ pOutAnimStaticAssoc-> Initialize ( pClump, pReplacedAnimation->pAnimationHierarchy );
4057
4048
isCustomAnimationToPlay = true ;
4058
4049
}
4059
4050
}
4060
4051
4061
4052
if ( !isCustomAnimationToPlay )
4062
4053
{
4063
4054
// Play default internal animation
4064
- CAnimBlendStaticAssociation_Init ( pOutAnimStaticAssoc, pClump, pOriginalAnimStaticAssoc-> pAnimHeirarchy );
4055
+ pOutAnimStaticAssoc-> Initialize ( pClump, pOriginalAnimHierarchyInterface );
4065
4056
}
4066
4057
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 );
4073
4059
return isCustomAnimationToPlay;
4074
4060
}
4075
4061
4076
4062
4077
4063
bool CClientGame::BlendAnimationHierarchyHandler ( CAnimBlendAssociationSAInterface * pAnimAssoc, CAnimBlendHierarchySAInterface ** pOutAnimHierarchy, int * pFlags, RpClump * pClump )
4078
4064
{
4079
4065
bool isCustomAnimationToPlay = false ;
4080
-
4081
4066
CAnimManager * pAnimationManager = g_pGame->GetAnimManager ();
4082
4067
CClientPed * pClientPed = GetClientPedByClump ( *pClump );
4083
4068
if ( pClientPed != nullptr )
@@ -6845,12 +6830,25 @@ void CClientGame::RestreamModel ( unsigned short usModel )
6845
6830
6846
6831
}
6847
6832
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
+
6848
6845
void CClientGame::InsertIFPPointerToMap ( const unsigned int u32BlockNameHash, const std::shared_ptr < CClientIFP > & pIFP )
6849
6846
{
6850
6847
std::lock_guard < std::mutex > mutexGuardedLock ( m_MutexOfIfpPointersMap );
6851
6848
m_mapOfIfpPointers [ u32BlockNameHash ] = pIFP;
6852
6849
}
6853
6850
6851
+
6854
6852
std::shared_ptr < CClientIFP > CClientGame::GetIFPPointerFromMap ( const unsigned int u32BlockNameHash )
6855
6853
{
6856
6854
std::lock_guard < std::mutex > mutexGuardedLock ( m_MutexOfIfpPointersMap );
@@ -6862,6 +6860,7 @@ std::shared_ptr < CClientIFP > CClientGame::GetIFPPointerFromMap ( const unsigne
6862
6860
return nullptr ;
6863
6861
}
6864
6862
6863
+
6865
6864
void CClientGame::RemoveIFPPointerFromMap ( const unsigned int u32BlockNameHash )
6866
6865
{
6867
6866
std::lock_guard < std::mutex > mutexGuardedLock ( m_MutexOfIfpPointersMap );
@@ -6875,12 +6874,14 @@ void CClientGame::InsertPedPointerToSet ( CClientPed * pPed )
6875
6874
m_setOfPedPointers.insert ( pPed );
6876
6875
}
6877
6876
6877
+
6878
6878
void CClientGame::RemovePedPointerFromSet ( CClientPed * pPed )
6879
6879
{
6880
6880
std::lock_guard < std::mutex > mutexGuardedLock ( m_MutexOfPedPointersSet );
6881
6881
m_setOfPedPointers.erase ( pPed );
6882
6882
}
6883
6883
6884
+
6884
6885
CClientPed * CClientGame::GetClientPedByClump ( const RpClump & Clump )
6885
6886
{
6886
6887
std::lock_guard < std::mutex > mutexGuardedLock ( m_MutexOfPedPointersSet );
@@ -6902,6 +6903,7 @@ CClientPed * CClientGame::GetClientPedByClump ( const RpClump & Clump )
6902
6903
return nullptr ;
6903
6904
}
6904
6905
6906
+
6905
6907
void CClientGame::OnClientIFPUnload ( const std::shared_ptr < CClientIFP > & IFP )
6906
6908
{
6907
6909
std::lock_guard < std::mutex > mutexGuardedLock ( m_MutexOfPedPointersSet );
@@ -6931,12 +6933,14 @@ void CClientGame::OnClientIFPUnload ( const std::shared_ptr < CClientIFP > & IFP
6931
6933
}
6932
6934
}
6933
6935
6936
+
6934
6937
void CClientGame::InsertAnimationAssociationToMap ( CAnimBlendAssociationSAInterface * pAnimAssociation, const std::shared_ptr < CIFPAnimations > & pIFPAnimations )
6935
6938
{
6936
6939
std::lock_guard < std::mutex > mutexGuardedLock ( m_MutexOfAnimationAssociationsMap );
6937
6940
m_mapOfCustomAnimationAssociations [ pAnimAssociation ] = pIFPAnimations;
6938
6941
}
6939
6942
6943
+
6940
6944
void CClientGame::RemoveAnimationAssociationFromMap ( CAnimBlendAssociationSAInterface * pAnimAssociation )
6941
6945
{
6942
6946
std::lock_guard < std::mutex > mutexGuardedLock ( m_MutexOfAnimationAssociationsMap );
0 commit comments