0
0
mirror of https://github.com/sp-tarkov/loot-dump-processor.git synced 2025-02-13 02:50:45 -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.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<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
output.Add(
OutputFileType.StaticAmmo,
_ammoProcessor.CreateAmmoDistribution(dumpProcessData.ContainerCounts)
staticAmmo
);
if (LoggerFactory.GetInstance().CanBeLogged(LogLevel.Info))

View File

@ -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<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(
IReadOnlyDictionary<string, List<PreProcessedStaticLoot>> containerCounts)
{
var allMapsAmmoDistribution = new Dictionary<string, IReadOnlyDictionary<string, List<AmmoDistribution>>>();
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;
}
}

View File

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