diff --git a/Libraries/SPTarkov.Server.Core/Generators/PMCLootGenerator.cs b/Libraries/SPTarkov.Server.Core/Generators/PMCLootGenerator.cs index 83d2eaf5..0546a577 100644 --- a/Libraries/SPTarkov.Server.Core/Generators/PMCLootGenerator.cs +++ b/Libraries/SPTarkov.Server.Core/Generators/PMCLootGenerator.cs @@ -1,4 +1,3 @@ -using System.Collections.Concurrent; using SPTarkov.DI.Annotations; using SPTarkov.Server.Core.Helpers; using SPTarkov.Server.Core.Models.Eft.Common.Tables; @@ -23,9 +22,13 @@ public class PMCLootGenerator private readonly SeasonalEventService _seasonalEventService; private readonly WeightedRandomHelper _weightedRandomHelper; - private ConcurrentDictionary? _backpackLootPool; - private ConcurrentDictionary? _pocketLootPool; - private ConcurrentDictionary? _vestLootPool; + private Dictionary? _backpackLootPool; + private Dictionary? _pocketLootPool; + private Dictionary? _vestLootPool; + + protected object BackpackLock = new(); + protected object PocketLock = new(); + protected object VestLock = new(); public PMCLootGenerator( ISptLogger logger, @@ -55,12 +58,17 @@ public class PMCLootGenerator /// /// /// Dictionary of string and number - public ConcurrentDictionary GeneratePMCPocketLootPool(string botRole) + public Dictionary GeneratePMCPocketLootPool(string botRole) { - // Hydrate loot dictionary if empty - if (_pocketLootPool is null) + lock (PocketLock) { - _pocketLootPool = new ConcurrentDictionary(); + // Hydrate loot dictionary if empty + if (_pocketLootPool is not null) + { + return _pocketLootPool; + } + + _pocketLootPool = new Dictionary(); var items = _databaseService.GetItems(); var pmcPriceOverrides = _databaseService.GetBots().Types[string.Equals(botRole, "pmcbear", StringComparison.OrdinalIgnoreCase) ? "bear" : "usec"].BotInventory.Items @@ -102,9 +110,10 @@ public class PMCLootGenerator } _weightedRandomHelper.ReduceWeightValues(_pocketLootPool); - } - return _pocketLootPool; + return _pocketLootPool; + + } } protected HashSet GetLootBlacklist() @@ -124,12 +133,17 @@ public class PMCLootGenerator /// /// /// Dictionary of string and number - public ConcurrentDictionary GeneratePMCVestLootPool(string botRole) + public Dictionary GeneratePMCVestLootPool(string botRole) { - // Hydrate loot dictionary if empty - if (_vestLootPool is null) + lock (VestLock) { - _vestLootPool = new ConcurrentDictionary(); + // Hydrate loot dictionary if empty + if (_vestLootPool is not null) + { + return _vestLootPool; + } + + _vestLootPool = new Dictionary(); var items = _databaseService.GetItems(); var pmcPriceOverrides = _databaseService.GetBots().Types[string.Equals(botRole, "pmcbear", StringComparison.OrdinalIgnoreCase) ? "bear" : "usec"].BotInventory.Items @@ -171,9 +185,9 @@ public class PMCLootGenerator } _weightedRandomHelper.ReduceWeightValues(_vestLootPool); - } - return _vestLootPool; + return _vestLootPool; + } } /// @@ -207,12 +221,17 @@ public class PMCLootGenerator /// /// /// Dictionary of string and number - public ConcurrentDictionary GeneratePMCBackpackLootPool(string botRole) + public Dictionary GeneratePMCBackpackLootPool(string botRole) { - // Hydrate loot dictionary if empty - if (_backpackLootPool is null) + lock (BackpackLock) { - _backpackLootPool = new ConcurrentDictionary(); + // Hydrate loot dictionary if empty + if (_backpackLootPool is not null) + { + return _backpackLootPool; + } + + _backpackLootPool = new Dictionary(); var items = _databaseService.GetItems(); var pmcPriceOverrides = _databaseService.GetBots().Types[string.Equals(botRole, "pmcbear", StringComparison.OrdinalIgnoreCase) ? "bear" : "usec"].BotInventory.Items @@ -253,8 +272,8 @@ public class PMCLootGenerator } _weightedRandomHelper.ReduceWeightValues(_backpackLootPool); - } - return _backpackLootPool; + return _backpackLootPool; + } } } diff --git a/Libraries/SPTarkov.Server.Core/Services/BotLootCacheService.cs b/Libraries/SPTarkov.Server.Core/Services/BotLootCacheService.cs index 23731f3e..1a9fb671 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)).ToDictionary(); - lootPool.Pockets = _cloner.Clone(_pmcLootGenerator.GeneratePMCPocketLootPool(botRole)).ToDictionary(); - lootPool.TacticalVest = _cloner.Clone(_pmcLootGenerator.GeneratePMCVestLootPool(botRole)).ToDictionary(); + lootPool.Backpack = _cloner.Clone(_pmcLootGenerator.GeneratePMCBackpackLootPool(botRole)); + lootPool.Pockets = _cloner.Clone(_pmcLootGenerator.GeneratePMCPocketLootPool(botRole)); + lootPool.TacticalVest = _cloner.Clone(_pmcLootGenerator.GeneratePMCVestLootPool(botRole)); } // Backpack/Pockets etc diff --git a/server-csharp.sln.DotSettings b/server-csharp.sln.DotSettings index de196226..c554e013 100644 --- a/server-csharp.sln.DotSettings +++ b/server-csharp.sln.DotSettings @@ -1,4 +1,5 @@  + PMC True True True