Skip to content

Commit 2538362

Browse files
authored
Merge branch 'master' into add-vehicle-sirens
2 parents 1e36fc8 + 733683d commit 2538362

26 files changed

+324
-158
lines changed

Client/game_sa/CAnimBlendAssociationSA.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,11 @@ std::unique_ptr<CAnimBlendHierarchy> CAnimBlendAssociationSA::GetAnimHierarchy()
113113
return pGame->GetAnimManager()->GetAnimBlendHierarchy(m_pInterface->pAnimHierarchy);
114114
}
115115

116+
const std::unique_ptr<CAnimBlendHierarchy> CAnimBlendAssociationSA::GetAnimHierarchy() const noexcept
117+
{
118+
return pGame->GetAnimManager()->GetAnimBlendHierarchy(m_pInterface->pAnimHierarchy);
119+
}
120+
116121
void CAnimBlendAssociationSA::SetCurrentProgress(float fProgress)
117122
{
118123
float fTime = m_pInterface->pAnimHierarchy->fTotalTime * fProgress;

Client/game_sa/CAnimBlendAssociationSA.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
#include <CVector.h>
1717
#include <game/RenderWare.h>
1818
#include <game/CAnimBlendAssociation.h>
19+
#include <game/CAnimBlendHierarchy.h>
1920
#include "CAnimBlendNodeSA.h"
2021

2122
class CAnimBlendAssocGroupSA;
@@ -159,12 +160,15 @@ class CAnimBlendAssociationSA : public CAnimBlendAssociation
159160
eAnimGroup GetAnimGroup() { return static_cast<eAnimGroup>(m_pInterface->sAnimGroup); }
160161
eAnimID GetAnimID() { return static_cast<eAnimID>(m_pInterface->sAnimID); }
161162
std::unique_ptr<CAnimBlendHierarchy> GetAnimHierarchy();
163+
const std::unique_ptr<CAnimBlendHierarchy> GetAnimHierarchy() const noexcept;
162164

163165
float GetBlendAmount() { return m_pInterface->fBlendAmount; }
164166
void SetBlendAmount(float fAmount) { m_pInterface->fBlendAmount = fAmount; }
165167
void SetCurrentProgress(float fProgress);
166-
float GetCurrentSpeed() { return m_pInterface->fSpeed; }
168+
float GetCurrentProgress() const noexcept { return m_pInterface->fCurrentTime; }
169+
float GetCurrentSpeed() const noexcept { return m_pInterface->fSpeed; }
167170
void SetCurrentSpeed(float fSpeed) { m_pInterface->fSpeed = fSpeed; }
171+
float GetLength() const noexcept { return GetAnimHierarchy()->GetTotalTime(); }
168172
void SetAnimID(short sAnimID) { m_pInterface->sAnimID = sAnimID; }
169173
void SetAnimGroup(short sAnimGroup) { m_pInterface->sAnimGroup = sAnimGroup; }
170174
void SetFlags(short sFlags) { m_pInterface->m_nFlags = sFlags; }

Client/game_sa/CAnimBlendHierarchySA.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,7 @@ class CAnimBlendHierarchySA : public CAnimBlendHierarchy
5353
void RemoveFromUncompressedCache();
5454
void RemoveQuaternionFlips();
5555
void CalculateTotalTime();
56+
float GetTotalTime() const noexcept { return m_pInterface->fTotalTime; }
5657
CAnimBlendSequenceSAInterface* GetSequence(DWORD dwIndex);
5758
CAnimBlendSequenceSAInterface* GetSequences() { return m_pInterface->pSequences; }
5859
unsigned short GetNumSequences() { return m_pInterface->usNumSequences; }

Client/game_sa/CModelInfoSA.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -743,7 +743,7 @@ CBoundingBox* CModelInfoSA::GetBoundingBox()
743743
bool CModelInfoSA::IsValid()
744744
{
745745
if (m_dwModelID >= MODELINFO_DFF_MAX && m_dwModelID < MODELINFO_TXD_MAX)
746-
return !pGame->GetPools()->IsFreeTextureDictonarySlot(m_dwModelID - MODELINFO_DFF_MAX);
746+
return !pGame->GetPools()->GetTxdPool().IsFreeTextureDictonarySlot(m_dwModelID - MODELINFO_DFF_MAX);
747747

748748
if (m_dwModelID >= pGame->GetBaseIDforTXD() && m_dwModelID < pGame->GetCountOfAllFileIDs())
749749
return true;

Client/game_sa/CPoolsSA.cpp

Lines changed: 0 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,6 @@
2424
#include "CTrailerSA.h"
2525
#include "CTrainSA.h"
2626
#include "CWorldSA.h"
27-
#include "CKeyGenSA.h"
28-
#include "CFileLoaderSA.h"
29-
#include "CPtrNodeSingleListSA.h"
3027

3128
extern CGameSA* pGame;
3229

@@ -35,7 +32,6 @@ CPoolsSA::CPoolsSA()
3532
m_ppPedPoolInterface = (CPoolSAInterface<CPedSAInterface>**)0xB74490;
3633
m_ppObjectPoolInterface = (CPoolSAInterface<CObjectSAInterface>**)0xB7449C;
3734
m_ppVehiclePoolInterface = (CPoolSAInterface<CVehicleSAInterface>**)0xB74494;
38-
m_ppTxdPoolInterface = (CPoolSAInterface<CTextureDictonarySAInterface>**)0xC8800C;
3935

4036
m_bGetVehicleEnabled = true;
4137
}
@@ -1107,40 +1103,3 @@ void CPoolsSA::InvalidateLocalPlayerClientEntity()
11071103
{
11081104
m_pedPool.arrayOfClientEntities[0] = {m_pedPool.arrayOfClientEntities[0].pEntity, nullptr};
11091105
}
1110-
1111-
unsigned int CPoolsSA::AllocateTextureDictonarySlot(uint uiSlotId, std::string& strTxdName)
1112-
{
1113-
CTextureDictonarySAInterface* pTxd = (*m_ppTxdPoolInterface)->AllocateAt(uiSlotId);
1114-
if (!pTxd)
1115-
return -1;
1116-
1117-
strTxdName.resize(24);
1118-
1119-
pTxd->usUsagesCount = 0;
1120-
pTxd->hash = pGame->GetKeyGen()->GetUppercaseKey(strTxdName.c_str());
1121-
pTxd->rwTexDictonary = nullptr;
1122-
pTxd->usParentIndex = -1;
1123-
1124-
return (*m_ppTxdPoolInterface)->GetObjectIndex(pTxd);
1125-
}
1126-
1127-
void CPoolsSA::RemoveTextureDictonarySlot(uint uiTxdId)
1128-
{
1129-
if (!(*m_ppTxdPoolInterface)->IsContains(uiTxdId))
1130-
return;
1131-
1132-
typedef uint(__cdecl * Function_TxdReleaseSlot)(uint uiTxdId);
1133-
((Function_TxdReleaseSlot)(0x731E90))(uiTxdId);
1134-
1135-
(*m_ppTxdPoolInterface)->Release(uiTxdId);
1136-
}
1137-
1138-
bool CPoolsSA::IsFreeTextureDictonarySlot(uint uiTxdId)
1139-
{
1140-
return (*m_ppTxdPoolInterface)->IsEmpty(uiTxdId);
1141-
}
1142-
1143-
ushort CPoolsSA::GetFreeTextureDictonarySlot()
1144-
{
1145-
return (*m_ppTxdPoolInterface)->GetFreeSlot();
1146-
}

Client/game_sa/CPoolsSA.h

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@
1515
#include "CVehicleSA.h"
1616
#include "CObjectSA.h"
1717
#include "CBuildingSA.h"
18-
#include "CTextureDictonarySA.h"
1918
#include "CBuildingsPoolSA.h"
2019
#include "CDummyPoolSA.h"
20+
#include "CTxdPoolSA.h"
2121

2222
#define INVALID_POOL_ARRAY_ID 0xFFFFFFFF
2323

@@ -91,14 +91,9 @@ class CPoolsSA : public CPools
9191
void ResetPedPoolCount() { m_pedPool.ulCount = 0; }
9292
void InvalidateLocalPlayerClientEntity();
9393

94-
uint AllocateTextureDictonarySlot(uint uiSlotID, std::string& strTxdName);
95-
void RemoveTextureDictonarySlot(uint uiTxdId);
96-
bool IsFreeTextureDictonarySlot(uint uiTxdId);
97-
98-
ushort GetFreeTextureDictonarySlot();
99-
10094
CBuildingsPool& GetBuildingsPool() noexcept override { return m_BuildingsPool; };
10195
CDummyPool& GetDummyPool() noexcept { return m_DummyPool; };
96+
CTxdPool& GetTxdPool() noexcept { return m_TxdPool; };
10297

10398
private:
10499
// Pools
@@ -109,10 +104,10 @@ class CPoolsSA : public CPools
109104
CPoolSAInterface<CPedSAInterface>** m_ppPedPoolInterface;
110105
CPoolSAInterface<CObjectSAInterface>** m_ppObjectPoolInterface;
111106
CPoolSAInterface<CVehicleSAInterface>** m_ppVehiclePoolInterface;
112-
CPoolSAInterface<CTextureDictonarySAInterface>** m_ppTxdPoolInterface;
113107

114108
CBuildingsPoolSA m_BuildingsPool;
115109
CDummyPoolSA m_DummyPool;
110+
CTxdPoolSA m_TxdPool;
116111

117112
bool m_bGetVehicleEnabled;
118113
};

Client/game_sa/CTxdPoolSA.cpp

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
/*****************************************************************************
2+
*
3+
* PROJECT: Multi Theft Auto
4+
* LICENSE: See LICENSE in the top level directory
5+
*
6+
* Multi Theft Auto is available from https://www.multitheftauto.com/
7+
*
8+
*****************************************************************************/
9+
10+
#include "StdInc.h"
11+
#include "CTxdPoolSA.h"
12+
#include "CGameSA.h"
13+
#include "CKeyGenSA.h"
14+
15+
extern CGameSA* pGame;
16+
17+
CTxdPoolSA::CTxdPoolSA()
18+
{
19+
m_ppTxdPoolInterface = (CPoolSAInterface<CTextureDictonarySAInterface>**)0xC8800C;
20+
}
21+
22+
std::uint32_t CTxdPoolSA::AllocateTextureDictonarySlot(std::uint32_t uiSlotId, std::string& strTxdName)
23+
{
24+
CTextureDictonarySAInterface* pTxd = (*m_ppTxdPoolInterface)->AllocateAt(uiSlotId);
25+
if (!pTxd)
26+
return -1;
27+
28+
strTxdName.resize(24);
29+
30+
pTxd->usUsagesCount = 0;
31+
pTxd->hash = pGame->GetKeyGen()->GetUppercaseKey(strTxdName.c_str());
32+
pTxd->rwTexDictonary = nullptr;
33+
pTxd->usParentIndex = -1;
34+
35+
return (*m_ppTxdPoolInterface)->GetObjectIndex(pTxd);
36+
}
37+
38+
void CTxdPoolSA::RemoveTextureDictonarySlot(std::uint32_t uiTxdId)
39+
{
40+
if (!(*m_ppTxdPoolInterface)->IsContains(uiTxdId))
41+
return;
42+
43+
typedef std::uint32_t(__cdecl * Function_TxdReleaseSlot)(std::uint32_t uiTxdId);
44+
((Function_TxdReleaseSlot)(0x731E90))(uiTxdId);
45+
46+
(*m_ppTxdPoolInterface)->Release(uiTxdId);
47+
}
48+
49+
bool CTxdPoolSA::IsFreeTextureDictonarySlot(std::uint32_t uiTxdId)
50+
{
51+
return (*m_ppTxdPoolInterface)->IsEmpty(uiTxdId);
52+
}
53+
54+
std::uint16_t CTxdPoolSA::GetFreeTextureDictonarySlot()
55+
{
56+
return (*m_ppTxdPoolInterface)->GetFreeSlot();
57+
}

Client/game_sa/CTxdPoolSA.h

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
/*****************************************************************************
2+
*
3+
* PROJECT: Multi Theft Auto
4+
* LICENSE: See LICENSE in the top level directory
5+
*
6+
* Multi Theft Auto is available from https://www.multitheftauto.com/
7+
*
8+
*****************************************************************************/
9+
10+
#pragma once
11+
12+
#include <game/CTxdPool.h>
13+
#include "CPoolSAInterface.h"
14+
#include "CBuildingSA.h"
15+
#include "CTextureDictonarySA.h"
16+
17+
class CTxdPoolSA final : public CTxdPool
18+
{
19+
public:
20+
CTxdPoolSA();
21+
~CTxdPoolSA() = default;
22+
23+
std::uint32_t AllocateTextureDictonarySlot(std::uint32_t uiSlotID, std::string& strTxdName);
24+
void RemoveTextureDictonarySlot(std::uint32_t uiTxdId);
25+
bool IsFreeTextureDictonarySlot(std::uint32_t uiTxdId);
26+
27+
std::uint16_t GetFreeTextureDictonarySlot();
28+
29+
private:
30+
CPoolSAInterface<CTextureDictonarySAInterface>** m_ppTxdPoolInterface;
31+
};

Client/game_sa/TaskBasicSA.cpp

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,27 @@
1313
#include "TaskBasicSA.h"
1414
#include "CPedSA.h"
1515

16+
17+
CTaskSimpleRunNamedAnimSAInterface* CTaskSimpleRunNamedAnimSA::GetAnimationInterface() noexcept
18+
{
19+
return reinterpret_cast<CTaskSimpleRunNamedAnimSAInterface*>(this->GetInterface());
20+
}
21+
22+
const CTaskSimpleRunNamedAnimSAInterface* CTaskSimpleRunNamedAnimSA::GetAnimationInterface() const noexcept
23+
{
24+
return reinterpret_cast<const CTaskSimpleRunNamedAnimSAInterface*>(this->GetInterface());
25+
}
26+
27+
const char* CTaskSimpleRunNamedAnimSA::GetAnimName() const noexcept
28+
{
29+
return GetAnimationInterface()->m_animName;
30+
}
31+
32+
const char* CTaskSimpleRunNamedAnimSA::GetGroupName() const noexcept
33+
{
34+
return GetAnimationInterface()->m_animGroupName;
35+
}
36+
1637
CTaskComplexUseMobilePhoneSA::CTaskComplexUseMobilePhoneSA(const int iDuration)
1738
{
1839
CreateTaskInterface(sizeof(CTaskComplexUseMobilePhoneSAInterface));

Client/game_sa/TaskBasicSA.h

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -113,6 +113,12 @@ class CTaskSimpleRunNamedAnimSA : public virtual CTaskSimpleAnimSA, public virtu
113113
CTaskSimpleRunNamedAnimSA(const char* pAnimName, const char* pAnimGroupName, const int flags, const float fBlendDelta, const int iTime = -1,
114114
const bool bDontInterrupt = false, const bool bRunInSequence = false, const bool bOffsetPed = false,
115115
const bool bHoldLastFrame = false);
116+
117+
CTaskSimpleRunNamedAnimSAInterface* GetAnimationInterface() noexcept;
118+
const CTaskSimpleRunNamedAnimSAInterface* GetAnimationInterface() const noexcept;
119+
120+
const char* GetAnimName() const noexcept override;
121+
const char* GetGroupName() const noexcept override;
116122
};
117123

118124
class CTaskComplexDieSAInterface : public CTaskComplexSAInterface

0 commit comments

Comments
 (0)