@@ -37,7 +37,7 @@ 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;
40
+ std::unordered_map<DWORD, std::unordered_map<C2DEffectSAInterface*, C2DEffectSAInterface*>> CModelInfoSA::ms_DefaultEffectsMap;
41
41
static std::unordered_map<CBaseModelInfoSAInterface*, std::uint32_t > m_numCustom2dfxEffects;
42
42
static std::vector<C2DEffectSAInterface*> d2fxEffects;
43
43
static std::vector<C2DEffectSAInterface*> removedDefaultEffects;
@@ -1185,7 +1185,47 @@ void CModelInfoSA::ResetAlphaTransparency()
1185
1185
1186
1186
void CModelInfoSA::StaticReset2DFXEffects ()
1187
1187
{
1188
+ for (auto & iter = ms_DefaultEffectsMap.begin (); iter != ms_DefaultEffectsMap.end (); iter++)
1189
+ {
1190
+ CBaseModelInfoSAInterface* modelInfoInterface = ppModelInfo[iter->first ];
1191
+ if (!modelInfoInterface)
1192
+ continue ;
1193
+
1194
+ for (auto innerIter = iter->second .begin (); innerIter != iter->second .end ();)
1195
+ {
1196
+ // Copy default effect
1197
+ memcpy (innerIter->first , innerIter->second , sizeof (C2DEffectSAInterface));
1198
+
1199
+ // 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
+ {
1203
+ removedDefaultEffects.erase (removedEffect);
1204
+ modelInfoInterface->ucNumOf2DEffects ++;
1205
+ }
1188
1206
1207
+ // Delete copy of the default effect
1208
+ delete innerIter->second ;
1209
+ innerIter = iter->second .erase (innerIter);
1210
+ }
1211
+
1212
+ // Decrement the counter by the number of custom effects
1213
+ auto customEffectsCount = MapGet (m_numCustom2dfxEffects, modelInfoInterface);
1214
+ if (customEffectsCount && customEffectsCount > 0 )
1215
+ modelInfoInterface->ucNumOf2DEffects -= customEffectsCount;
1216
+
1217
+ MapSet (m_numCustom2dfxEffects, modelInfoInterface, 0 );
1218
+ }
1219
+
1220
+ // Remove all custom effects
1221
+ for (auto & customEffect : d2fxEffects)
1222
+ if (customEffect)
1223
+ delete customEffect;
1224
+
1225
+ // Clear maps
1226
+ removedDefaultEffects.clear ();
1227
+ ms_DefaultEffectsMap.clear ();
1228
+ d2fxEffects.clear ();
1189
1229
}
1190
1230
1191
1231
short CModelInfoSA::GetAvailableVehicleMod (unsigned short usUpgrade)
@@ -2187,7 +2227,7 @@ C2DEffectSAInterface* CModelInfoSA::Add2DFXEffect(const CVector& position, const
2187
2227
return effectInterface;
2188
2228
}
2189
2229
2190
- void CModelInfoSA::Remove2DFX (C2DEffectSAInterface* effect, bool isCustom)
2230
+ void CModelInfoSA::Remove2DFX (C2DEffectSAInterface* effect, bool isCustom, bool decrementCounters )
2191
2231
{
2192
2232
if (!effect)
2193
2233
return ;
@@ -2255,6 +2295,16 @@ void CModelInfoSA::Remove2DFX(C2DEffectSAInterface* effect, bool isCustom)
2255
2295
}
2256
2296
}
2257
2297
2298
+ if (decrementCounters)
2299
+ {
2300
+ m_pInterface->ucNumOf2DEffects --;
2301
+ MapGet (m_numCustom2dfxEffects, m_pInterface)--;
2302
+
2303
+ auto & it = std::find (d2fxEffects.begin (), d2fxEffects.end (), effect);
2304
+ if (it != d2fxEffects.end ())
2305
+ d2fxEffects.erase (it);
2306
+ }
2307
+
2258
2308
// If it's custom effect then delete it. If it's default effect then store it as removed
2259
2309
if (isCustom)
2260
2310
{
@@ -2281,7 +2331,8 @@ bool CModelInfoSA::Remove2DFXEffectAtIndex(std::uint32_t index, bool includeDefa
2281
2331
if (!includeDefault && !isCustomEffect)
2282
2332
return false ;
2283
2333
2284
- StoreDefault2DFXEffect (effect);
2334
+ if (!isCustomEffect)
2335
+ StoreDefault2DFXEffect (effect);
2285
2336
2286
2337
m_pInterface->ucNumOf2DEffects --;
2287
2338
if (isCustomEffect)
@@ -2313,7 +2364,8 @@ bool CModelInfoSA::RemoveAll2DFXEffects(bool includeDefault)
2313
2364
if (!includeDefault && !isCustomEffect)
2314
2365
continue ;
2315
2366
2316
- StoreDefault2DFXEffect (effect);
2367
+ if (!isCustomEffect)
2368
+ StoreDefault2DFXEffect (effect);
2317
2369
2318
2370
m_pInterface->ucNumOf2DEffects --;
2319
2371
if (isCustomEffect)
0 commit comments