mirror of
https://github.com/sp-tarkov/loot-dump-processor.git
synced 2025-02-12 22:30:44 -05:00
Refactored ammo processor to process maps in parallel
This commit is contained in:
parent
3309ec453b
commit
7eb932f603
@ -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))
|
||||
|
@ -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;
|
||||
}
|
||||
}
|
@ -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);
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user