From a7b52a5632b5487b44b3763f7849f70ef5ce45e2 Mon Sep 17 00:00:00 2001 From: CWX Date: Fri, 11 Apr 2025 13:55:18 +0100 Subject: [PATCH] Change to use ConcurrentDict as i got a modified whilst reading on cloner --- .../Generators/PMCLootGenerator.cs | 25 ++++++++++--------- .../Services/BotLootCacheService.cs | 6 ++--- 2 files changed, 16 insertions(+), 15 deletions(-) diff --git a/Libraries/SPTarkov.Server.Core/Generators/PMCLootGenerator.cs b/Libraries/SPTarkov.Server.Core/Generators/PMCLootGenerator.cs index 71871e0e..69c56b4c 100644 --- a/Libraries/SPTarkov.Server.Core/Generators/PMCLootGenerator.cs +++ b/Libraries/SPTarkov.Server.Core/Generators/PMCLootGenerator.cs @@ -1,3 +1,4 @@ +using System.Collections.Concurrent; using SPTarkov.Server.Core.Helpers; using SPTarkov.Server.Core.Models.Eft.Common.Tables; using SPTarkov.Server.Core.Models.Enums; @@ -22,9 +23,9 @@ public class PMCLootGenerator private readonly SeasonalEventService _seasonalEventService; private readonly WeightedRandomHelper _weightedRandomHelper; - private Dictionary? _backpackLootPool; - private Dictionary? _pocketLootPool; - private Dictionary? _vestLootPool; + private ConcurrentDictionary? _backpackLootPool; + private ConcurrentDictionary? _pocketLootPool; + private ConcurrentDictionary? _vestLootPool; public PMCLootGenerator( ISptLogger logger, @@ -54,12 +55,12 @@ public class PMCLootGenerator /// /// /// Dictionary of string and number - public Dictionary GeneratePMCPocketLootPool(string botRole) + public ConcurrentDictionary GeneratePMCPocketLootPool(string botRole) { // Hydrate loot dictionary if empty if (_pocketLootPool is null) { - _pocketLootPool = new Dictionary(); + _pocketLootPool = new ConcurrentDictionary(); var items = _databaseService.GetItems(); var pmcPriceOverrides = _databaseService.GetBots().Types[string.Equals(botRole, "pmcbear", StringComparison.OrdinalIgnoreCase) ? "bear" : "usec"].BotInventory.Items.Pockets; @@ -82,7 +83,7 @@ public class PMCLootGenerator { if (pmcPriceOverrides.TryGetValue(tpl, out var priceOverride)) { - _pocketLootPool.Add(tpl, priceOverride); + _pocketLootPool.TryAdd(tpl, priceOverride); } else { @@ -122,12 +123,12 @@ public class PMCLootGenerator /// /// /// Dictionary of string and number - public Dictionary GeneratePMCVestLootPool(string botRole) + public ConcurrentDictionary GeneratePMCVestLootPool(string botRole) { // Hydrate loot dictionary if empty if (_vestLootPool is null) { - _vestLootPool = new Dictionary(); + _vestLootPool = new ConcurrentDictionary(); var items = _databaseService.GetItems(); var pmcPriceOverrides = _databaseService.GetBots().Types[string.Equals(botRole, "pmcbear", StringComparison.OrdinalIgnoreCase) ? "bear" : "usec"].BotInventory.Items.TacticalVest; @@ -150,7 +151,7 @@ public class PMCLootGenerator { if (pmcPriceOverrides.TryGetValue(tpl, out var overridePrice)) { - _vestLootPool.Add(tpl, overridePrice); + _vestLootPool.TryAdd(tpl, overridePrice); } else { @@ -205,12 +206,12 @@ public class PMCLootGenerator /// /// /// Dictionary of string and number - public Dictionary GeneratePMCBackpackLootPool(string botRole) + public ConcurrentDictionary GeneratePMCBackpackLootPool(string botRole) { // Hydrate loot dictionary if empty if (_backpackLootPool is null) { - _backpackLootPool = new Dictionary(); + _backpackLootPool = new ConcurrentDictionary(); var items = _databaseService.GetItems(); var pmcPriceOverrides = _databaseService.GetBots().Types[string.Equals(botRole, "pmcbear", StringComparison.OrdinalIgnoreCase) ? "bear" : "usec"].BotInventory.Items.Backpack; @@ -232,7 +233,7 @@ public class PMCLootGenerator { if (pmcPriceOverrides.TryGetValue(tpl, out var priceOverride)) { - _backpackLootPool.Add(tpl, priceOverride); + _backpackLootPool.TryAdd(tpl, priceOverride); } else { diff --git a/Libraries/SPTarkov.Server.Core/Services/BotLootCacheService.cs b/Libraries/SPTarkov.Server.Core/Services/BotLootCacheService.cs index afa4a8ce..00868849 100644 --- a/Libraries/SPTarkov.Server.Core/Services/BotLootCacheService.cs +++ b/Libraries/SPTarkov.Server.Core/Services/BotLootCacheService.cs @@ -165,9 +165,9 @@ public class BotLootCacheService( if (isPmc) { // Replace lootPool from bot json with our own generated list for PMCs - lootPool.Backpack = _cloner.Clone(_pmcLootGenerator.GeneratePMCBackpackLootPool(botRole)); - lootPool.Pockets = _cloner.Clone(_pmcLootGenerator.GeneratePMCPocketLootPool(botRole)); - lootPool.TacticalVest = _cloner.Clone(_pmcLootGenerator.GeneratePMCVestLootPool(botRole)); + lootPool.Backpack = _cloner.Clone(_pmcLootGenerator.GeneratePMCBackpackLootPool(botRole)).ToDictionary(); + lootPool.Pockets = _cloner.Clone(_pmcLootGenerator.GeneratePMCPocketLootPool(botRole)).ToDictionary(); + lootPool.TacticalVest = _cloner.Clone(_pmcLootGenerator.GeneratePMCVestLootPool(botRole)).ToDictionary(); } // Backpack/Pockets etc