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
2227CHandlingManager::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
8687bool 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
111114CHandlingEntry* 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
123136eHandlingProperty 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
0 commit comments