@@ -839,6 +839,10 @@ namespace Mod::Pop::WaveSpawn_Extensions
839
839
// delete the temporary copy of the KV subtree
840
840
kv->deleteThis ();
841
841
842
+ if (result && wavespawn->m_totalCount > 100000 && rtti_cast<CRandomChoiceSpawner *>(wavespawn->m_Spawner )) {
843
+ wavespawn->m_totalCount = 100000 ;
844
+ Warning (" Total count of wavespawn %s reduced to 100000 to reduce RandomChoice related memory leaks\n " , wavespawn->m_name .Get ());
845
+ }
842
846
if (result && hidden) {
843
847
last_wavespawn_hidden = true ;
844
848
}
@@ -1363,6 +1367,37 @@ namespace Mod::Pop::WaveSpawn_Extensions
1363
1367
return DETOUR_MEMBER_CALL(NextBotManager_ShouldUpdate)(bot);
1364
1368
}*/
1365
1369
1370
+ DETOUR_DECL_MEMBER (string_t , CRandomChoiceSpawner_GetClassIcon, int index)
1371
+ {
1372
+ auto spawner = reinterpret_cast <CRandomChoiceSpawner *>(this );
1373
+ if (spawner->m_SubSpawners .IsEmpty ()) return NULL_STRING;
1374
+ return DETOUR_MEMBER_CALL (CRandomChoiceSpawner_GetClassIcon)(index);
1375
+ }
1376
+ DETOUR_DECL_MEMBER (bool , CRandomChoiceSpawner_IsMiniBoss, int index)
1377
+ {
1378
+ auto spawner = reinterpret_cast <CRandomChoiceSpawner *>(this );
1379
+ if (spawner->m_SubSpawners .IsEmpty ()) return false ;
1380
+ return DETOUR_MEMBER_CALL (CRandomChoiceSpawner_IsMiniBoss)(index);
1381
+ }
1382
+ DETOUR_DECL_MEMBER (bool , CRandomChoiceSpawner_HasAttribute, CTFBot::AttributeType attr, int index)
1383
+ {
1384
+ auto spawner = reinterpret_cast <CRandomChoiceSpawner *>(this );
1385
+ if (spawner->m_SubSpawners .IsEmpty ()) return false ;
1386
+ return DETOUR_MEMBER_CALL (CRandomChoiceSpawner_HasAttribute)(attr, index);
1387
+ }
1388
+ DETOUR_DECL_MEMBER (int , CRandomChoiceSpawner_GetClass, int index)
1389
+ {
1390
+ auto spawner = reinterpret_cast <CRandomChoiceSpawner *>(this );
1391
+ if (spawner->m_SubSpawners .IsEmpty ()) return false ;
1392
+ return DETOUR_MEMBER_CALL (CRandomChoiceSpawner_GetClass)(index);
1393
+ }
1394
+ DETOUR_DECL_MEMBER (int , CRandomChoiceSpawner_GetHealth, int index)
1395
+ {
1396
+ auto spawner = reinterpret_cast <CRandomChoiceSpawner *>(this );
1397
+ if (spawner->m_SubSpawners .IsEmpty ()) return false ;
1398
+ return DETOUR_MEMBER_CALL (CRandomChoiceSpawner_GetHealth)(index);
1399
+ }
1400
+
1366
1401
class CMod : public IMod , public IModCallbackListener , IFrameUpdatePostEntityThinkListener
1367
1402
{
1368
1403
public:
@@ -1399,6 +1434,13 @@ namespace Mod::Pop::WaveSpawn_Extensions
1399
1434
MOD_ADD_DETOUR_MEMBER (CWave_AddClassType, " CWave::AddClassType" );
1400
1435
1401
1436
MOD_ADD_DETOUR_MEMBER (CRandomChoiceSpawner_Parse, " CRandomChoiceSpawner::Parse" );
1437
+
1438
+ // Fix CRandomChoiceSpawner crashes when the block is empty
1439
+ MOD_ADD_DETOUR_MEMBER (CRandomChoiceSpawner_GetClassIcon, " CRandomChoiceSpawner::GetClassIcon" );
1440
+ MOD_ADD_DETOUR_MEMBER (CRandomChoiceSpawner_IsMiniBoss, " CRandomChoiceSpawner::IsMiniBoss" );
1441
+ MOD_ADD_DETOUR_MEMBER (CRandomChoiceSpawner_HasAttribute, " CRandomChoiceSpawner::HasAttribute" );
1442
+ MOD_ADD_DETOUR_MEMBER (CRandomChoiceSpawner_GetClass, " CRandomChoiceSpawner::GetClass" );
1443
+ MOD_ADD_DETOUR_MEMBER (CRandomChoiceSpawner_GetHealth, " CRandomChoiceSpawner::GetHealth" );
1402
1444
1403
1445
}
1404
1446
0 commit comments