@@ -1191,6 +1191,7 @@ namespace Mod::Pop::PopMgr_Extensions
1191
1191
// DevMsg(" %.3f <= %.3f, returning true\n", rnd, rate);
1192
1192
return true ;
1193
1193
}
1194
+ return false ;
1194
1195
}
1195
1196
1196
1197
bool bot_killed_check = false ;
@@ -6270,47 +6271,66 @@ namespace Mod::Pop::PopMgr_Extensions
6270
6271
" LuaScript" ,
6271
6272
" LuaScriptFile"
6272
6273
};
6273
- DETOUR_DECL_MEMBER (void , KeyValues_MergeBaseKeys, CUtlVector<KeyValues *> &keys)
6274
+ KeyValues *lastMergedKeyValues = nullptr ;
6275
+ RefCount rc_KeyValues_LoadFromBuffer;
6276
+ RefCount rc_KeyValues_RecursiveMergeKeyValues;
6277
+ DETOUR_DECL_MEMBER (void , KeyValues_RecursiveMergeKeyValues, KeyValues *included)
6274
6278
{
6275
- if (reading_popfile) {
6279
+ SCOPED_INCREMENT (rc_KeyValues_RecursiveMergeKeyValues);
6280
+ if (reading_popfile && rc_KeyValues_RecursiveMergeKeyValues <= 1 && rc_KeyValues_LoadFromBuffer) {
6276
6281
auto kv = reinterpret_cast <KeyValues *>(this );
6277
6282
KeyValues *appendKvFirst = nullptr ;
6278
6283
KeyValues *appendKvLast = nullptr ;
6279
- for (int i = 0 ; i < keys.Count (); i++) {
6280
- std::vector<KeyValues *> del_kv;
6281
- FOR_EACH_SUBKEY (keys[i], subkey) {
6282
- auto name = subkey->GetName ();
6283
- for (size_t j = 0 ; j < ARRAYSIZE (include_instead_of_merging_key_names); j++) {
6284
- if (FStrEq (name, include_instead_of_merging_key_names[j])) {
6285
- auto kvCopy = subkey->MakeCopy ();
6286
- if (appendKvFirst == nullptr ) {
6287
- appendKvFirst = kvCopy;
6288
- }
6289
- if (appendKvLast != nullptr ) {
6290
- appendKvLast->SetNextKey (kvCopy);
6291
- }
6292
- appendKvLast = kvCopy;
6293
- del_kv.push_back (subkey);
6284
+
6285
+ std::vector<KeyValues *> del_kv;
6286
+ FOR_EACH_SUBKEY (included, subkey) {
6287
+ auto name = subkey->GetName ();
6288
+ for (size_t j = 0 ; j < ARRAYSIZE (include_instead_of_merging_key_names); j++) {
6289
+ if (FStrEq (name, include_instead_of_merging_key_names[j])) {
6290
+ auto kvCopy = subkey->MakeCopy ();
6291
+ if (appendKvFirst == nullptr ) {
6292
+ appendKvFirst = kvCopy;
6294
6293
}
6294
+ if (appendKvLast != nullptr ) {
6295
+ appendKvLast->SetNextKey (kvCopy);
6296
+ }
6297
+ appendKvLast = kvCopy;
6298
+ del_kv.push_back (subkey);
6295
6299
}
6296
6300
}
6297
- for (auto subkey : del_kv) {
6298
- // DevMsg("Deleting key \"%s\"\n", subkey->GetName());
6299
- keys[i]->RemoveSubKey (subkey);
6300
- subkey->deleteThis ();
6301
- }
6302
6301
}
6302
+ for (auto subkey : del_kv) {
6303
+ // DevMsg("Deleting key \"%s\"\n", subkey->GetName());
6304
+ included->RemoveSubKey (subkey);
6305
+ subkey->deleteThis ();
6306
+ }
6307
+
6303
6308
if (appendKvFirst != nullptr ) {
6304
- if (kv-> GetFirstSubKey () != nullptr ) {
6305
- appendKvLast->SetNextKey (kv-> GetFirstSubKey () ->GetNextKey ());
6306
- kv-> GetFirstSubKey () ->SetNextKey (appendKvFirst);
6309
+ if (lastMergedKeyValues != nullptr ) {
6310
+ appendKvLast->SetNextKey (lastMergedKeyValues ->GetNextKey ());
6311
+ lastMergedKeyValues ->SetNextKey (appendKvFirst);
6307
6312
}
6308
6313
else {
6309
- kv->AddSubKey (appendKvFirst);
6314
+ if (kv->GetFirstSubKey () != nullptr ) {
6315
+ appendKvLast->SetNextKey (kv->GetFirstSubKey ()->GetNextKey ());
6316
+ kv->GetFirstSubKey ()->SetNextKey (appendKvFirst);
6317
+ }
6318
+ else {
6319
+ kv->AddSubKey (appendKvFirst);
6320
+ }
6321
+ lastMergedKeyValues = appendKvLast;
6310
6322
}
6323
+
6311
6324
}
6312
6325
}
6313
- DETOUR_MEMBER_CALL (KeyValues_MergeBaseKeys)(keys);
6326
+ DETOUR_MEMBER_CALL (KeyValues_RecursiveMergeKeyValues)(included);
6327
+ }
6328
+
6329
+ DETOUR_DECL_MEMBER (bool , KeyValues_LoadFromBuffer, char const *resourceName, CUtlBuffer &buf, IBaseFileSystem* pFileSystem, const char *pPathID)
6330
+ {
6331
+ SCOPED_INCREMENT (rc_KeyValues_LoadFromBuffer);
6332
+ lastMergedKeyValues = nullptr ;
6333
+ return DETOUR_MEMBER_CALL (KeyValues_LoadFromBuffer)(resourceName, buf, pFileSystem, pPathID);
6314
6334
}
6315
6335
6316
6336
RefCount rc_CPopulationManager_IsValidPopfile;
@@ -7028,7 +7048,8 @@ namespace Mod::Pop::PopMgr_Extensions
7028
7048
MOD_ADD_DETOUR_MEMBER (CPopulationManager_SetCheckpoint, " CPopulationManager::SetCheckpoint" );
7029
7049
MOD_ADD_DETOUR_MEMBER (CTFPlayer_GetEntityForLoadoutSlot, " CTFPlayer::GetEntityForLoadoutSlot" );
7030
7050
MOD_ADD_DETOUR_MEMBER (CTFPlayerSharedUtils_GetEconItemViewByLoadoutSlot, " CTFPlayerSharedUtils::GetEconItemViewByLoadoutSlot" );
7031
- MOD_ADD_DETOUR_MEMBER (KeyValues_MergeBaseKeys, " KeyValues::MergeBaseKeys" );
7051
+ MOD_ADD_DETOUR_MEMBER (KeyValues_RecursiveMergeKeyValues, " KeyValues::RecursiveMergeKeyValues" );
7052
+ MOD_ADD_DETOUR_MEMBER (KeyValues_LoadFromBuffer, " KeyValues::LoadFromBuffer" );
7032
7053
7033
7054
7034
7055
// MOD_ADD_DETOUR_MEMBER(CTFWeaponBase_UpdateHands, "CTFWeaponBase::UpdateHands");
0 commit comments