0
0
mirror of https://github.com/sp-tarkov/loot-dump-processor.git synced 2025-02-13 05:30:44 -05:00

Refactored ammo processor to process maps in parallel

This commit is contained in:
bluextx 2025-01-11 07:18:44 +03:00
parent 3309ec453b
commit 7eb932f603
3 changed files with 47 additions and 46 deletions

View File

@ -2,6 +2,7 @@ using System.Collections.Concurrent;
using LootDumpProcessor.Logger; using LootDumpProcessor.Logger;
using LootDumpProcessor.Model; using LootDumpProcessor.Model;
using LootDumpProcessor.Model.Input; using LootDumpProcessor.Model.Input;
using LootDumpProcessor.Model.Output;
using LootDumpProcessor.Model.Output.StaticContainer; using LootDumpProcessor.Model.Output.StaticContainer;
using LootDumpProcessor.Model.Processing; using LootDumpProcessor.Model.Processing;
using LootDumpProcessor.Process.Processor.v2.AmmoProcessor; using LootDumpProcessor.Process.Processor.v2.AmmoProcessor;
@ -190,10 +191,18 @@ public class MultithreadSteppedDumpProcessor(
output.Add(OutputFileType.StaticContainer, staticContainers); output.Add(OutputFileType.StaticContainer, staticContainers);
if (LoggerFactory.GetInstance().CanBeLogged(LogLevel.Info)) if (LoggerFactory.GetInstance().CanBeLogged(LogLevel.Info))
LoggerFactory.GetInstance().Log("Processing ammo distribution", LogLevel.Info); LoggerFactory.GetInstance().Log("Processing ammo distribution", LogLevel.Info);
var staticAmmo = new ConcurrentDictionary<string, IReadOnlyDictionary<string, List<AmmoDistribution>>>();
Parallel.ForEach(dumpProcessData.ContainerCounts.Keys, (mapId) =>
{
var preProcessedStaticLoots = dumpProcessData.ContainerCounts[mapId];
var ammoDistribution = _ammoProcessor.CreateAmmoDistribution(mapId, preProcessedStaticLoots);
staticAmmo[mapId] = ammoDistribution;
});
// Ammo distribution // Ammo distribution
output.Add( output.Add(
OutputFileType.StaticAmmo, OutputFileType.StaticAmmo,
_ammoProcessor.CreateAmmoDistribution(dumpProcessData.ContainerCounts) staticAmmo
); );
if (LoggerFactory.GetInstance().CanBeLogged(LogLevel.Info)) if (LoggerFactory.GetInstance().CanBeLogged(LogLevel.Info))

View File

@ -2,55 +2,46 @@
using LootDumpProcessor.Model.Processing; using LootDumpProcessor.Model.Processing;
using Microsoft.Extensions.Logging; using Microsoft.Extensions.Logging;
namespace LootDumpProcessor.Process.Processor.v2.AmmoProcessor namespace LootDumpProcessor.Process.Processor.v2.AmmoProcessor;
public class AmmoProcessor(ILogger<AmmoProcessor> logger) : IAmmoProcessor
{ {
public class AmmoProcessor(ILogger<AmmoProcessor> logger) : IAmmoProcessor private readonly ILogger<AmmoProcessor> _logger = logger ?? throw new ArgumentNullException(nameof(logger));
public IReadOnlyDictionary<string, List<AmmoDistribution>> CreateAmmoDistribution(
string mapId,
List<PreProcessedStaticLoot> containers)
{ {
private readonly ILogger<AmmoProcessor> _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<string, IReadOnlyDictionary<string, List<AmmoDistribution>>> CreateAmmoDistribution( var caliberTemplateCounts = ammoTemplates
IReadOnlyDictionary<string, List<PreProcessedStaticLoot>> containerCounts) .GroupBy(tpl => tpl)
{ .Select(group => new CaliberTemplateCount
var allMapsAmmoDistribution = new Dictionary<string, IReadOnlyDictionary<string, List<AmmoDistribution>>>();
foreach (var mapEntry in containerCounts)
{ {
var mapId = mapEntry.Key; Caliber = LootDumpProcessorContext.GetTarkovItems().AmmoCaliber(group.Key),
var containers = mapEntry.Value; Template = group.Key,
Count = group.Count()
})
.OrderBy(ctc => ctc.Caliber)
.ToList();
var ammoTemplates = containers var ammoDistribution = caliberTemplateCounts
.SelectMany(container => container.Items) .GroupBy(ctc => ctc.Caliber)
.Where(item => LootDumpProcessorContext.GetTarkovItems().IsBaseClass(item.Tpl, BaseClasses.Ammo)) .ToDictionary(
.Select(item => item.Tpl) group => group.Key,
.ToList(); group => group.Select(ctc => new AmmoDistribution
{
Tpl = ctc.Template,
RelativeProbability = ctc.Count
}).ToList()
);
var caliberTemplateCounts = ammoTemplates _logger.LogInformation("Created ammo distribution for Map {MapId}.", mapId);
.GroupBy(tpl => tpl)
.Select(group => new CaliberTemplateCount
{
Caliber = LootDumpProcessorContext.GetTarkovItems().AmmoCaliber(group.Key),
Template = group.Key,
Count = group.Count()
})
.OrderBy(ctc => ctc.Caliber)
.ToList();
var ammoDistribution = caliberTemplateCounts return ammoDistribution;
.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;
}
} }
} }

View File

@ -5,6 +5,7 @@ namespace LootDumpProcessor.Process.Processor.v2.AmmoProcessor;
public interface IAmmoProcessor public interface IAmmoProcessor
{ {
IReadOnlyDictionary<string, IReadOnlyDictionary<string, List<AmmoDistribution>>> CreateAmmoDistribution( IReadOnlyDictionary<string, List<AmmoDistribution>> CreateAmmoDistribution(
IReadOnlyDictionary<string, List<PreProcessedStaticLoot>> containerCounts); string mapId,
List<PreProcessedStaticLoot> containers);
} }