@@ -37,10 +37,12 @@ std::unordered_map<DWORD, unsigned short> CModelInfo
37
37
std::unordered_map<DWORD, std::pair<float , float >> CModelInfoSA::ms_VehicleModelDefaultWheelSizes;
38
38
std::map<unsigned short , int > CModelInfoSA::ms_DefaultTxdIDMap;
39
39
40
- std::unordered_map<DWORD, std::unordered_map<C2DEffectSAInterface*, C2DEffectSAInterface*>> CModelInfoSA::ms_DefaultEffectsMap;
41
- static std::unordered_map<CBaseModelInfoSAInterface*, std::uint32_t > m_numCustom2dfxEffects;
42
- static std::vector<C2DEffectSAInterface*> d2fxEffects;
43
- static std::vector<C2DEffectSAInterface*> removedDefaultEffects;
40
+ static std::unordered_map<DWORD, std::unordered_map<C2DEffectSAInterface*, C2DEffectSAInterface*>> ms_DefaultEffectsMap;
41
+ static std::unordered_map<CBaseModelInfoSAInterface*, std::uint32_t > numCustom2dfxEffects;
42
+ static std::vector<C2DEffectSAInterface*> d2fxEffects;
43
+ static std::vector<C2DEffectSAInterface*> removedDefault2dfxEffects;
44
+ static std::unordered_map<DWORD, std::uint8_t > defaultNumOf2DFXEffects;
45
+ static std::unordered_map<DWORD, std::vector<C2DEffectSAInterface*>> tempCopy2dfxEffects;
44
46
45
47
int C2DEffectSA::effect2dPluginOffset = *(int *)0xC3A1E0 ; // g2dEffectPluginOffset
46
48
@@ -116,7 +118,7 @@ CBaseModelInfoSAInterface* CModelInfoSA::GetInterface()
116
118
void CModelInfoSA::SetModelID (DWORD dwModelID)
117
119
{
118
120
m_dwModelID = dwModelID;
119
- MapSet (m_numCustom2dfxEffects , ppModelInfo[dwModelID], 0 );
121
+ MapSet (numCustom2dfxEffects , ppModelInfo[dwModelID], 0 );
120
122
}
121
123
122
124
bool CModelInfoSA::IsBoat ()
@@ -1197,10 +1199,10 @@ void CModelInfoSA::StaticReset2DFXEffects()
1197
1199
memcpy (innerIter->first , innerIter->second , sizeof (C2DEffectSAInterface));
1198
1200
1199
1201
// Increase the counter if this effect was removed
1200
- auto & removedEffect = std::find (removedDefaultEffects .begin (), removedDefaultEffects .end (), innerIter->first );
1201
- if (removedEffect != removedDefaultEffects .end ())
1202
+ auto & removedEffect = std::find (removedDefault2dfxEffects .begin (), removedDefault2dfxEffects .end (), innerIter->first );
1203
+ if (removedEffect != removedDefault2dfxEffects .end ())
1202
1204
{
1203
- removedDefaultEffects .erase (removedEffect);
1205
+ removedDefault2dfxEffects .erase (removedEffect);
1204
1206
modelInfoInterface->ucNumOf2DEffects ++;
1205
1207
}
1206
1208
@@ -1211,15 +1213,15 @@ void CModelInfoSA::StaticReset2DFXEffects()
1211
1213
}
1212
1214
1213
1215
// Decrement the counter by the number of custom effects
1214
- auto customEffectsCount = MapGet (m_numCustom2dfxEffects , modelInfoInterface);
1216
+ auto customEffectsCount = MapGet (numCustom2dfxEffects , modelInfoInterface);
1215
1217
if (customEffectsCount && customEffectsCount > 0 )
1216
1218
modelInfoInterface->ucNumOf2DEffects -= customEffectsCount;
1217
1219
1218
- MapSet (m_numCustom2dfxEffects , modelInfoInterface, 0 );
1220
+ MapSet (numCustom2dfxEffects , modelInfoInterface, 0 );
1219
1221
}
1220
1222
1221
1223
// Clear maps
1222
- removedDefaultEffects .clear ();
1224
+ removedDefault2dfxEffects .clear ();
1223
1225
ms_DefaultEffectsMap.clear ();
1224
1226
d2fxEffects.clear ();
1225
1227
}
@@ -2118,6 +2120,9 @@ void CModelInfoSA::StoreDefault2DFXEffect(C2DEffectSAInterface* effect)
2118
2120
if (MapContains (ms_DefaultEffectsMap, m_dwModelID) && MapContains (MapGet (ms_DefaultEffectsMap, m_dwModelID), effect))
2119
2121
return ;
2120
2122
2123
+ if (!MapContains (defaultNumOf2DFXEffects, m_dwModelID))
2124
+ MapSet (defaultNumOf2DFXEffects, m_dwModelID, ppModelInfo[m_dwModelID]->ucNumOf2DEffects );
2125
+
2121
2126
// Copy an existing default effect
2122
2127
C2DEffectSAInterface* copy = new C2DEffectSAInterface ();
2123
2128
memcpy (copy, effect, sizeof (C2DEffectSAInterface));
@@ -2158,10 +2163,10 @@ bool CModelInfoSA::Reset2DFXEffects(bool removeCustomEffects)
2158
2163
memcpy (it->first , it->second , sizeof (C2DEffectSAInterface));
2159
2164
2160
2165
// Increase the counter if this effect was removed
2161
- auto & removedEffect = std::find (removedDefaultEffects .begin (), removedDefaultEffects .end (), it->first );
2162
- if (removedEffect != removedDefaultEffects .end ())
2166
+ auto & removedEffect = std::find (removedDefault2dfxEffects .begin (), removedDefault2dfxEffects .end (), it->first );
2167
+ if (removedEffect != removedDefault2dfxEffects .end ())
2163
2168
{
2164
- removedDefaultEffects .erase (removedEffect);
2169
+ removedDefault2dfxEffects .erase (removedEffect);
2165
2170
m_pInterface->ucNumOf2DEffects ++;
2166
2171
}
2167
2172
@@ -2205,7 +2210,7 @@ C2DEffectSAInterface* CModelInfoSA::Add2DFXEffect(const CVector& position, const
2205
2210
2206
2211
// Update counters
2207
2212
m_pInterface->ucNumOf2DEffects = m_pInterface->ucNumOf2DEffects ? m_pInterface->ucNumOf2DEffects + 1 : 1 ;
2208
- MapGet (m_numCustom2dfxEffects , m_pInterface)++;
2213
+ MapGet (numCustom2dfxEffects , m_pInterface)++;
2209
2214
2210
2215
// Save our effect
2211
2216
d2fxEffects.push_back (effectInterface);
@@ -2233,7 +2238,7 @@ bool CModelInfoSA::Remove2DFX(C2DEffectSAInterface* effect, bool includeDefault)
2233
2238
m_pInterface->ucNumOf2DEffects --;
2234
2239
if (isCustomEffect)
2235
2240
{
2236
- MapGet (m_numCustom2dfxEffects , m_pInterface)--;
2241
+ MapGet (numCustom2dfxEffects , m_pInterface)--;
2237
2242
d2fxEffects.erase (it);
2238
2243
}
2239
2244
@@ -2307,7 +2312,7 @@ bool CModelInfoSA::Remove2DFX(C2DEffectSAInterface* effect, bool includeDefault)
2307
2312
effect = nullptr ;
2308
2313
}
2309
2314
else
2310
- removedDefaultEffects .push_back (effect);
2315
+ removedDefault2dfxEffects .push_back (effect);
2311
2316
}
2312
2317
2313
2318
bool CModelInfoSA::Remove2DFXEffectAtIndex (std::uint32_t index, bool includeDefault)
@@ -2410,7 +2415,7 @@ static C2DEffectSAInterface* Get2dEffect(CBaseModelInfoSAInterface* modelInfo, R
2410
2415
2411
2416
static auto * storedEffects = reinterpret_cast <C2DEffectInfoStoreSAInterface*>(ARRAY_2DFXInfoStore);
2412
2417
2413
- std::uint32_t numCustomEffects = m_numCustom2dfxEffects [modelInfo];
2418
+ std::uint32_t numCustomEffects = numCustom2dfxEffects [modelInfo];
2414
2419
std::uint32_t numStoredEffects = modelInfo->ucNumOf2DEffects - numPluginEffects - numCustomEffects;
2415
2420
2416
2421
if (index < numStoredEffects)
@@ -2447,6 +2452,64 @@ static void _declspec(naked) HOOK_Get2dEffect()
2447
2452
}
2448
2453
}
2449
2454
2455
+ void CModelInfoSA::CopyModified2DFXEffects ()
2456
+ {
2457
+ CBaseModelInfoSAInterface* modelInfo = ppModelInfo[m_dwModelID];
2458
+ if (!modelInfo || modelInfo->ucNumOf2DEffects == 0 )
2459
+ return ;
2460
+
2461
+ // Has modified effects?
2462
+ if (!MapContains (ms_DefaultEffectsMap, m_dwModelID))
2463
+ return ;
2464
+
2465
+ auto tempVec = std::vector<C2DEffectSAInterface*>();
2466
+ std::uint32_t numEffects = MapGet (defaultNumOf2DFXEffects, m_dwModelID);
2467
+ for (std::uint32_t i = 0 ; i < numEffects; i++)
2468
+ {
2469
+ auto effect = ((C2DEffectSAInterface * (__thiscall*)(CBaseModelInfoSAInterface*, std::uint32_t index))FUNC_CBaseModelInfo_Get2dEffect)(modelInfo, i);
2470
+ if (!effect)
2471
+ continue ;
2472
+
2473
+ // Copy effect
2474
+ auto copy = new C2DEffectSAInterface ();
2475
+ memcpy (copy, effect, sizeof (C2DEffectSAInterface));
2476
+ tempVec.push_back (copy);
2477
+ }
2478
+
2479
+ MapSet (tempCopy2dfxEffects, m_dwModelID, tempVec);
2480
+ }
2481
+
2482
+ void CModelInfoSA::RestoreModified2DFXEffects ()
2483
+ {
2484
+ if (!MapContains (tempCopy2dfxEffects, m_dwModelID))
2485
+ return ;
2486
+
2487
+ CBaseModelInfoSAInterface* modelInfo = ppModelInfo[m_dwModelID];
2488
+ if (!modelInfo)
2489
+ return ;
2490
+
2491
+ std::uint32_t numEffects = MapGet (defaultNumOf2DFXEffects, m_dwModelID);
2492
+ auto & tempVec = MapGet (tempCopy2dfxEffects, m_dwModelID);
2493
+ if (tempVec.size () > 0 )
2494
+ {
2495
+ for (std::uint32_t i = 0 ; i < numEffects; i++)
2496
+ {
2497
+ auto effect = ((C2DEffectSAInterface * (__thiscall*)(CBaseModelInfoSAInterface*, std::uint32_t index))FUNC_CBaseModelInfo_Get2dEffect)(modelInfo, i);
2498
+ if (!effect)
2499
+ continue ;
2500
+
2501
+ if (tempVec[i])
2502
+ {
2503
+ memcpy (effect, tempVec[i], sizeof (C2DEffectSAInterface));
2504
+ delete tempVec[i];
2505
+ }
2506
+ }
2507
+ }
2508
+
2509
+ tempVec.clear ();
2510
+ tempCopy2dfxEffects.erase (m_dwModelID);
2511
+ }
2512
+
2450
2513
// ////////////////////////////////////////////////////////////////////////////////////////
2451
2514
//
2452
2515
// Setup hooks
0 commit comments