diff --git a/source/LootDumpProcessor/Process/Processor/DumpProcessor/MultithreadSteppedDumpProcessor.cs b/source/LootDumpProcessor/Process/Processor/DumpProcessor/MultithreadSteppedDumpProcessor.cs index 3c51d58..18b9e36 100644 --- a/source/LootDumpProcessor/Process/Processor/DumpProcessor/MultithreadSteppedDumpProcessor.cs +++ b/source/LootDumpProcessor/Process/Processor/DumpProcessor/MultithreadSteppedDumpProcessor.cs @@ -2,6 +2,7 @@ using System.Collections.Concurrent; using LootDumpProcessor.Logger; using LootDumpProcessor.Model; using LootDumpProcessor.Model.Input; +using LootDumpProcessor.Model.Output; using LootDumpProcessor.Model.Output.StaticContainer; using LootDumpProcessor.Model.Processing; using LootDumpProcessor.Process.Processor.v2.AmmoProcessor; @@ -190,10 +191,18 @@ public class MultithreadSteppedDumpProcessor( output.Add(OutputFileType.StaticContainer, staticContainers); if (LoggerFactory.GetInstance().CanBeLogged(LogLevel.Info)) LoggerFactory.GetInstance().Log("Processing ammo distribution", LogLevel.Info); + + var staticAmmo = new ConcurrentDictionary>>(); + Parallel.ForEach(dumpProcessData.ContainerCounts.Keys, (mapId) => + { + var preProcessedStaticLoots = dumpProcessData.ContainerCounts[mapId]; + var ammoDistribution = _ammoProcessor.CreateAmmoDistribution(mapId, preProcessedStaticLoots); + staticAmmo[mapId] = ammoDistribution; + }); // Ammo distribution output.Add( OutputFileType.StaticAmmo, - _ammoProcessor.CreateAmmoDistribution(dumpProcessData.ContainerCounts) + staticAmmo ); if (LoggerFactory.GetInstance().CanBeLogged(LogLevel.Info)) diff --git a/source/LootDumpProcessor/Process/Processor/v2/AmmoProcessor/AmmoProcessor.cs b/source/LootDumpProcessor/Process/Processor/v2/AmmoProcessor/AmmoProcessor.cs index 640f43b..7965218 100644 --- a/source/LootDumpProcessor/Process/Processor/v2/AmmoProcessor/AmmoProcessor.cs +++ b/source/LootDumpProcessor/Process/Processor/v2/AmmoProcessor/AmmoProcessor.cs @@ -2,55 +2,46 @@ using LootDumpProcessor.Model.Processing; using Microsoft.Extensions.Logging; -namespace LootDumpProcessor.Process.Processor.v2.AmmoProcessor +namespace LootDumpProcessor.Process.Processor.v2.AmmoProcessor; + +public class AmmoProcessor(ILogger logger) : IAmmoProcessor { - public class AmmoProcessor(ILogger logger) : IAmmoProcessor + private readonly ILogger _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + + public IReadOnlyDictionary> CreateAmmoDistribution( + string mapId, + List containers) { - private readonly ILogger _logger = logger ?? throw new ArgumentNullException(nameof(logger)); + var ammoTemplates = containers + .SelectMany(container => container.Items) + .Where(item => LootDumpProcessorContext.GetTarkovItems().IsBaseClass(item.Tpl, BaseClasses.Ammo)) + .Select(item => item.Tpl) + .ToList(); - public IReadOnlyDictionary>> CreateAmmoDistribution( - IReadOnlyDictionary> containerCounts) - { - var allMapsAmmoDistribution = new Dictionary>>(); - - foreach (var mapEntry in containerCounts) + var caliberTemplateCounts = ammoTemplates + .GroupBy(tpl => tpl) + .Select(group => new CaliberTemplateCount { - var mapId = mapEntry.Key; - var containers = mapEntry.Value; + Caliber = LootDumpProcessorContext.GetTarkovItems().AmmoCaliber(group.Key), + Template = group.Key, + Count = group.Count() + }) + .OrderBy(ctc => ctc.Caliber) + .ToList(); - var ammoTemplates = containers - .SelectMany(container => container.Items) - .Where(item => LootDumpProcessorContext.GetTarkovItems().IsBaseClass(item.Tpl, BaseClasses.Ammo)) - .Select(item => item.Tpl) - .ToList(); + var ammoDistribution = caliberTemplateCounts + .GroupBy(ctc => ctc.Caliber) + .ToDictionary( + group => group.Key, + group => group.Select(ctc => new AmmoDistribution + { + Tpl = ctc.Template, + RelativeProbability = ctc.Count + }).ToList() + ); - var caliberTemplateCounts = ammoTemplates - .GroupBy(tpl => tpl) - .Select(group => new CaliberTemplateCount - { - Caliber = LootDumpProcessorContext.GetTarkovItems().AmmoCaliber(group.Key), - Template = group.Key, - Count = group.Count() - }) - .OrderBy(ctc => ctc.Caliber) - .ToList(); + _logger.LogInformation("Created ammo distribution for Map {MapId}.", mapId); - var ammoDistribution = caliberTemplateCounts - .GroupBy(ctc => ctc.Caliber) - .ToDictionary( - group => group.Key, - group => group.Select(ctc => new AmmoDistribution - { - Tpl = ctc.Template, - RelativeProbability = ctc.Count - }).ToList() - ); - - allMapsAmmoDistribution[mapId] = ammoDistribution; - _logger.LogInformation("Created ammo distribution for Map {MapId}.", mapId); - } - - return allMapsAmmoDistribution; - } + return ammoDistribution; } } \ No newline at end of file diff --git a/source/LootDumpProcessor/Process/Processor/v2/AmmoProcessor/IAmmoProcessor.cs b/source/LootDumpProcessor/Process/Processor/v2/AmmoProcessor/IAmmoProcessor.cs index 9b634ae..d7e703d 100644 --- a/source/LootDumpProcessor/Process/Processor/v2/AmmoProcessor/IAmmoProcessor.cs +++ b/source/LootDumpProcessor/Process/Processor/v2/AmmoProcessor/IAmmoProcessor.cs @@ -5,6 +5,7 @@ namespace LootDumpProcessor.Process.Processor.v2.AmmoProcessor; public interface IAmmoProcessor { - IReadOnlyDictionary>> CreateAmmoDistribution( - IReadOnlyDictionary> containerCounts); + IReadOnlyDictionary> CreateAmmoDistribution( + string mapId, + List containers); } \ No newline at end of file