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:
parent
3309ec453b
commit
7eb932f603
@ -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))
|
||||||
|
@ -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;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -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);
|
||||||
}
|
}
|
Loading…
x
Reference in New Issue
Block a user