Skip to content

Commit e5113de

Browse files
author
G_Moris
committed
Update 5
1 parent b066bc3 commit e5113de

File tree

8 files changed

+69
-79
lines changed

8 files changed

+69
-79
lines changed

Client/game_sa/CHandlingEntrySA.cpp

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,7 +21,7 @@ CHandlingEntrySA::CHandlingEntrySA()
2121
// Create a new interface and zero it
2222
if (m_HandlingSA = std::make_unique<tHandlingDataSA>())
2323
{
24-
memset(m_HandlingSA.get(), 0, sizeof(tHandlingDataSA));
24+
MemSet(m_HandlingSA.get(), 0, sizeof(tHandlingDataSA));
2525
}
2626
}
2727

@@ -31,7 +31,7 @@ CHandlingEntrySA::CHandlingEntrySA(const tHandlingDataSA* const pOriginal)
3131
m_HandlingSA = nullptr;
3232
if (pOriginal)
3333
{
34-
memcpy(&m_Handling, pOriginal, sizeof(tHandlingDataSA));
34+
MemCpy(&m_Handling, pOriginal, sizeof(tHandlingDataSA));
3535
}
3636
}
3737

@@ -61,7 +61,7 @@ void CHandlingEntrySA::Recalculate() noexcept
6161
try
6262
{
6363
// Copy our stored field to GTA's
64-
memcpy(m_HandlingSA.get(), &m_Handling, sizeof(m_Handling));
64+
MemCpy(m_HandlingSA.get(), &m_Handling, sizeof(m_Handling));
6565
((void(_stdcall*)(tHandlingDataSA*))FUNC_HandlingDataMgr_ConvertDataToGameUnits)(m_HandlingSA.get());
6666
}
6767
catch (...)

Client/game_sa/CHandlingManagerSA.cpp

Lines changed: 23 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -27,17 +27,17 @@ extern CGameSA* pGame;
2727
#define DUMP_HANDLING_DATA 0
2828

2929
// Original handling data unaffected by handling.cfg changes
30-
tHandlingDataSA m_OriginalHandlingData[HT_MAX];
31-
std::unique_ptr<CHandlingEntrySA> m_OriginalEntries[HT_MAX];
30+
std::unordered_map<std::size_t, tHandlingDataSA> m_OriginalHandlingData;
31+
std::unordered_map<std::size_t, std::unique_ptr<CHandlingEntrySA>> m_OriginalEntries;
3232

33-
tFlyingHandlingDataSA m_OriginalFlyingHandlingData[24];
34-
std::unique_ptr<CFlyingHandlingEntrySA> m_OriginalFlyingEntries[24];
33+
std::unordered_map<std::size_t, tFlyingHandlingDataSA> m_OriginalFlyingHandlingData;
34+
std::unordered_map<std::size_t, std::unique_ptr<CFlyingHandlingEntrySA>> m_OriginalFlyingEntries;
3535

36-
tBoatHandlingDataSA m_OriginalBoatHandlingData[12];
37-
std::unique_ptr<CBoatHandlingEntrySA> m_OriginalBoatEntries[12];
36+
std::unordered_map<std::size_t, tBoatHandlingDataSA> m_OriginalBoatHandlingData;
37+
std::unordered_map<std::size_t, std::unique_ptr<CBoatHandlingEntrySA>> m_OriginalBoatEntries;
3838

39-
tBikeHandlingDataSA m_OriginalBikeHandlingData[14];
40-
std::unique_ptr<CBikeHandlingEntrySA> m_OriginalBikeEntries[14];
39+
std::unordered_map<std::size_t, tBikeHandlingDataSA> m_OriginalBikeHandlingData;
40+
std::unordered_map<std::size_t, std::unique_ptr<CBikeHandlingEntrySA>> m_OriginalBikeEntries;
4141

4242
std::map<std::string, eHandlingProperty> m_HandlingNames;
4343

@@ -124,7 +124,7 @@ static bool IsVehicleModel(std::uint32_t model) noexcept
124124
{
125125
try
126126
{
127-
const CModelInfo* pModelInfo = pGame->GetModelInfo(model);
127+
const auto* pModelInfo = pGame->GetModelInfo(model);
128128
return pModelInfo && pModelInfo->IsVehicle();
129129
}
130130
catch (...)
@@ -721,9 +721,6 @@ eHandlingTypes CHandlingManagerSA::GetHandlingID(std::uint32_t model) const noex
721721

722722
void CHandlingManagerSA::InitializeDefaultHandlings() noexcept
723723
{
724-
// Reset
725-
MemSetFast(m_OriginalHandlingData, 0, sizeof(m_OriginalHandlingData));
726-
727724
// NB: Don't waste your time changing this manually. Use the dumping code
728725
// commented out at the bottom :)
729726
m_OriginalHandlingData[0].iVehicleID = 0;
@@ -9150,7 +9147,7 @@ void CHandlingManagerSA::CheckSuspensionChanges(const CHandlingEntry* const pEnt
91509147
return;
91519148

91529149
// Grab us a multiplayer_sa pointer
9153-
CMultiplayer* const pMultiplayer = g_pCore->GetMultiplayer();
9150+
const CMultiplayer* const pMultiplayer = g_pCore->GetMultiplayer();
91549151
if (!pMultiplayer)
91559152
return;
91569153

@@ -9159,27 +9156,31 @@ void CHandlingManagerSA::CheckSuspensionChanges(const CHandlingEntry* const pEnt
91599156
if (eHandling >= HT_MAX)
91609157
return;
91619158

9162-
const auto& OriginalEntries = m_OriginalEntries[eHandling];
9163-
if (!OriginalEntries)
9159+
const auto it = m_OriginalEntries.find(eHandling);
9160+
if (it == m_OriginalEntries.end())
9161+
return;
9162+
9163+
const auto& entries = it->second;
9164+
if (!entries)
91649165
return;
91659166

91669167
// Default bChanged to false
91679168
bool bChanged = false;
91689169

91699170
// Set bChanged to true if we find ANY change.
9170-
if (pEntry->GetSuspensionAntiDiveMultiplier() != OriginalEntries->GetSuspensionAntiDiveMultiplier())
9171+
if (pEntry->GetSuspensionAntiDiveMultiplier() != entries->GetSuspensionAntiDiveMultiplier())
91719172
bChanged = true;
9172-
else if (pEntry->GetSuspensionDamping() != OriginalEntries->GetSuspensionDamping())
9173+
else if (pEntry->GetSuspensionDamping() != entries->GetSuspensionDamping())
91739174
bChanged = true;
9174-
else if (pEntry->GetSuspensionForceLevel() != OriginalEntries->GetSuspensionForceLevel())
9175+
else if (pEntry->GetSuspensionForceLevel() != entries->GetSuspensionForceLevel())
91759176
bChanged = true;
9176-
else if (pEntry->GetSuspensionFrontRearBias() != OriginalEntries->GetSuspensionFrontRearBias())
9177+
else if (pEntry->GetSuspensionFrontRearBias() != entries->GetSuspensionFrontRearBias())
91779178
bChanged = true;
9178-
else if (pEntry->GetSuspensionHighSpeedDamping() != OriginalEntries->GetSuspensionHighSpeedDamping())
9179+
else if (pEntry->GetSuspensionHighSpeedDamping() != entries->GetSuspensionHighSpeedDamping())
91799180
bChanged = true;
9180-
else if (pEntry->GetSuspensionLowerLimit() != OriginalEntries->GetSuspensionLowerLimit())
9181+
else if (pEntry->GetSuspensionLowerLimit() != entries->GetSuspensionLowerLimit())
91819182
bChanged = true;
9182-
else if (pEntry->GetSuspensionUpperLimit() != OriginalEntries->GetSuspensionUpperLimit())
9183+
else if (pEntry->GetSuspensionUpperLimit() != entries->GetSuspensionUpperLimit())
91839184
bChanged = true;
91849185

91859186
if (!bChanged)

Client/game_sa/CModelInfoSA.cpp

Lines changed: 4 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -273,18 +273,11 @@ bool CModelInfoSA::IsTrailer()
273273
BYTE CModelInfoSA::GetVehicleType() const noexcept
274274
{
275275
// This function will return a vehicle type for vehicles or 0xFF on failure
276-
try
277-
{
278-
if (!IsVehicle())
279-
return 0xFF;
276+
if (!IsVehicle())
277+
return -1;
280278

281-
auto GetVehicleModelType = reinterpret_cast<BYTE(__cdecl*)(DWORD)>(FUNC_IsVehicleModelType);
282-
return GetVehicleModelType(m_dwModelID);
283-
}
284-
catch (...)
285-
{
286-
return 0xFF;
287-
}
279+
auto GetVehicleModelType = reinterpret_cast<BYTE(__cdecl*)(DWORD)>(FUNC_IsVehicleModelType);
280+
return GetVehicleModelType(m_dwModelID);
288281
}
289282

290283
bool CModelInfoSA::IsVehicle() const

Client/multiplayer_sa/CMultiplayerSA.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -6182,7 +6182,7 @@ void _declspec(naked) HOOK_ProcessVehicleCollision()
61826182
}
61836183
}
61846184

6185-
void CMultiplayerSA::UpdateVehicleSuspension() noexcept
6185+
void CMultiplayerSA::UpdateVehicleSuspension() const noexcept
61866186
{
61876187
HookInstallCall(CALL_CAutomobile_ProcessEntityCollision, reinterpret_cast<DWORD>(HOOK_ProcessVehicleCollision));
61886188
HookInstallCall(CALL_CMonsterTruck_ProcessEntityCollision, reinterpret_cast<DWORD>(HOOK_ProcessVehicleCollision));

Client/multiplayer_sa/CMultiplayerSA.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -311,7 +311,7 @@ class CMultiplayerSA : public CMultiplayer
311311

312312
CLimits* GetLimits() { return &m_limits; }
313313

314-
void UpdateVehicleSuspension() noexcept;
314+
void UpdateVehicleSuspension() const noexcept;
315315

316316
virtual void FlushClothesCache();
317317
virtual void SetFastClothesLoading(EFastClothesLoading fastClothesLoading);

Client/sdk/multiplayer/CMultiplayer.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -429,7 +429,7 @@ class CMultiplayer
429429

430430
virtual CLimits* GetLimits() = 0;
431431

432-
virtual void UpdateVehicleSuspension() noexcept = 0;
432+
virtual void UpdateVehicleSuspension() const noexcept = 0;
433433

434434
virtual void FlushClothesCache() = 0;
435435
virtual void SetFastClothesLoading(EFastClothesLoading fastClothesLoading) = 0;

Server/mods/deathmatch/logic/CHandlingManager.cpp

Lines changed: 35 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -14,10 +14,15 @@
1414
#include "CCommon.h"
1515
#include "CVehicleManager.h"
1616

17-
SFixedArray<tHandlingData, HT_MAX> CHandlingManager::m_OriginalHandlingData;
17+
// Original handling data
18+
static std::unordered_map<std::size_t, tHandlingData> m_OriginalHandlingData;
19+
static std::unordered_map<std::size_t, std::unique_ptr<CHandlingEntry>> m_OriginalEntries;
1820

19-
SFixedArray<std::unique_ptr<CHandlingEntry>, HT_MAX> CHandlingManager::m_OriginalEntries;
20-
SFixedArray<std::unique_ptr<CHandlingEntry>, HT_MAX> CHandlingManager::m_ModelEntries;
21+
// Model handling data
22+
static std::unordered_map<std::size_t, std::unique_ptr<CHandlingEntry>> m_ModelEntries;
23+
static std::unordered_map<std::size_t, bool> m_bModelHandlingChanged;
24+
25+
static std::map<std::string, eHandlingProperty> m_HandlingNames;
2126

2227
CHandlingManager::CHandlingManager()
2328
{
@@ -29,10 +34,6 @@ CHandlingManager::CHandlingManager()
2934
{
3035
// For every original handling data
3136
m_OriginalEntries[i] = std::make_unique<CHandlingEntry>(&m_OriginalHandlingData[i]);
32-
33-
// For every model
34-
m_ModelEntries[i] = std::make_unique<CHandlingEntry>(&m_OriginalHandlingData[i]);
35-
m_bModelHandlingChanged[i] = false;
3637
}
3738

3839
// http://www.gtamodding.com/index.php?title=Handling.cfg#GTA_San_Andreas
@@ -85,14 +86,11 @@ std::unique_ptr<CHandlingEntry> CHandlingManager::CreateHandlingData() const noe
8586

8687
bool CHandlingManager::ApplyHandlingData(std::uint32_t model, CHandlingEntry* pEntry) const noexcept
8788
{
88-
// Within range?
89-
if (!CVehicleManager::IsValidModel(model))
89+
CHandlingEntry* pHandling = GetModelHandlingData(model);
90+
if (!pHandling)
9091
return false;
9192

92-
// Get our Handling ID
93-
eHandlingTypes eHandling = GetHandlingID(model);
94-
// Apply the data and return success
95-
m_ModelEntries[eHandling]->ApplyHandlingData(pEntry);
93+
pHandling->ApplyHandlingData(pEntry);
9694
return true;
9795
}
9896

@@ -103,9 +101,14 @@ const CHandlingEntry* CHandlingManager::GetOriginalHandlingData(std::uint32_t mo
103101
return nullptr;
104102

105103
// Get our Handling ID
106-
eHandlingTypes eHandling = GetHandlingID(model);
104+
const eHandlingTypes eHandling = GetHandlingID(model);
105+
106+
const auto it = m_OriginalEntries.find(model);
107+
if (it == m_OriginalEntries.end())
108+
return nullptr;
109+
107110
// Return it
108-
return m_OriginalEntries[eHandling].get();
111+
return it->second.get();
109112
}
110113

111114
CHandlingEntry* CHandlingManager::GetModelHandlingData(std::uint32_t model) const noexcept
@@ -114,10 +117,20 @@ CHandlingEntry* CHandlingManager::GetModelHandlingData(std::uint32_t model) cons
114117
if (!CVehicleManager::IsValidModel(model))
115118
return nullptr;
116119

117-
// Get our Handling ID
118-
eHandlingTypes eHandling = GetHandlingID(model);
119-
// Return it
120-
return m_ModelEntries[eHandling].get();
120+
auto entries = m_ModelEntries.find(model);
121+
if (entries == m_ModelEntries.end())
122+
{
123+
// Get our Handling ID
124+
const eHandlingTypes eHandling = GetHandlingID(model);
125+
126+
m_ModelEntries[model] = std::make_unique<CHandlingEntry>(&m_OriginalHandlingData[eHandling]);
127+
if (!m_ModelEntries[model])
128+
return nullptr;
129+
130+
entries = m_ModelEntries.find(model);
131+
}
132+
133+
return entries->second.get();
121134
}
122135

123136
eHandlingProperty CHandlingManager::GetPropertyEnumFromName(const std::string& name) const noexcept
@@ -132,22 +145,18 @@ bool CHandlingManager::HasModelHandlingChanged(std::uint32_t model) const noexce
132145
if (!CVehicleManager::IsValidModel(model))
133146
return false;
134147

135-
// Get our Handling ID
136-
eHandlingTypes eHandling = GetHandlingID(model);
137148
// Return if we have changed
138-
return m_bModelHandlingChanged[eHandling];
149+
return m_bModelHandlingChanged[model];
139150
}
140151

141-
void CHandlingManager::SetModelHandlingHasChanged(std::uint32_t model, bool bChanged) noexcept
152+
void CHandlingManager::SetModelHandlingHasChanged(std::uint32_t model, bool bChanged) const noexcept
142153
{
143154
// Within range?
144155
if (!CVehicleManager::IsValidModel(model))
145156
return;
146157

147-
// Get our Handling ID
148-
eHandlingTypes eHandling = GetHandlingID(model);
149158
// Return if we have changed.
150-
m_bModelHandlingChanged[eHandling] = bChanged;
159+
m_bModelHandlingChanged[model] = bChanged;
151160
}
152161

153162
// Return the handling manager id

Server/mods/deathmatch/logic/CHandlingManager.h

Lines changed: 1 addition & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -34,21 +34,8 @@ class CHandlingManager
3434
// Helper functions
3535
eHandlingProperty GetPropertyEnumFromName(const std::string& name) const noexcept;
3636
bool HasModelHandlingChanged(std::uint32_t model) const noexcept;
37-
void SetModelHandlingHasChanged(std::uint32_t model, bool bChanged) noexcept;
38-
39-
std::map<std::string, eHandlingProperty> m_HandlingNames;
37+
void SetModelHandlingHasChanged(std::uint32_t model, bool bChanged) const noexcept;
4038

4139
private:
4240
void InitializeDefaultHandlings() noexcept;
43-
44-
// Original handling data unaffected by handling.cfg changes
45-
static SFixedArray<tHandlingData, HT_MAX> m_OriginalHandlingData;
46-
47-
// Array with the original handling entries
48-
static SFixedArray<std::unique_ptr<CHandlingEntry>, HT_MAX> m_OriginalEntries;
49-
50-
// Array with the model handling entries
51-
static SFixedArray<std::unique_ptr<CHandlingEntry>, HT_MAX> m_ModelEntries;
52-
53-
SFixedArray<bool, HT_MAX> m_bModelHandlingChanged;
5441
};

0 commit comments

Comments
 (0)