diff --git a/source/LootDumpProcessor/Model/Template.cs b/source/LootDumpProcessor/Model/Template.cs index 60aeec3..799b23b 100644 --- a/source/LootDumpProcessor/Model/Template.cs +++ b/source/LootDumpProcessor/Model/Template.cs @@ -5,38 +5,25 @@ using LootDumpProcessor.Utils; namespace LootDumpProcessor.Model; -public class Template : IKeyable, ICloneable +public class Template( + string internalId, string? id, bool isContainer, bool? useGravity, bool? randomRotation, + Vector3? position, Vector3? rotation, bool? isGroupPosition, List? groupPositions, + bool? isAlwaysSpawn, string? root, List items +) + : IKeyable, ICloneable { - [JsonIgnore] public string InternalId { get; } - [JsonPropertyName("Id")] public string Id { get; set; } - [JsonPropertyName("IsContainer")] public bool IsContainer { get; set; } - public bool UseGravity { get; set; } - public bool RandomRotation { get; set; } - [JsonPropertyName("Position")] public Vector3 Position { get; set; } - [JsonPropertyName("Rotation")] public Vector3 Rotation { get; set; } - [JsonPropertyName("IsGroupPosition")] public bool IsGroupPosition { get; set; } - [JsonPropertyName("GroupPositions")] public List GroupPositions { get; set; } - [JsonPropertyName("IsAlwaysSpawn")] public bool IsAlwaysSpawn { get; set; } - [JsonPropertyName("Root")] public string Root { get; set; } - [JsonPropertyName("Items")] public List Items { get; set; } - - public Template(string internalId, string id, bool isContainer, bool useGravity, bool randomRotation, - Vector3 position, Vector3 rotation, bool isGroupPosition, List groupPositions, - bool isAlwaysSpawn, string root, List items) - { - this.InternalId = internalId; - Id = id; - IsContainer = isContainer; - UseGravity = useGravity; - RandomRotation = randomRotation; - Position = position; - Rotation = rotation; - IsGroupPosition = isGroupPosition; - GroupPositions = groupPositions; - IsAlwaysSpawn = isAlwaysSpawn; - Root = root; - Items = items; - } + [JsonIgnore] public string InternalId { get; } = internalId; + [JsonPropertyName("Id")] public string? Id { get; set; } = id; + [JsonPropertyName("IsContainer")] public bool IsContainer { get; set; } = isContainer; + public bool? UseGravity { get; set; } = useGravity; + public bool? RandomRotation { get; set; } = randomRotation; + [JsonPropertyName("Position")] public Vector3? Position { get; set; } = position; + [JsonPropertyName("Rotation")] public Vector3? Rotation { get; set; } = rotation; + [JsonPropertyName("IsGroupPosition")] public bool? IsGroupPosition { get; set; } = isGroupPosition; + [JsonPropertyName("GroupPositions")] public List? GroupPositions { get; set; } = groupPositions; + [JsonPropertyName("IsAlwaysSpawn")] public bool? IsAlwaysSpawn { get; set; } = isAlwaysSpawn; + [JsonPropertyName("Root")] public string? Root { get; set; } = root; + [JsonPropertyName("Items")] public List Items { get; set; } = items; private bool Equals(Template other) => Id == other.Id; diff --git a/source/LootDumpProcessor/Process/Processor/DumpProcessor/IDumpProcessor.cs b/source/LootDumpProcessor/Process/Processor/DumpProcessor/IDumpProcessor.cs index 8dedf59..7d95b00 100644 --- a/source/LootDumpProcessor/Process/Processor/DumpProcessor/IDumpProcessor.cs +++ b/source/LootDumpProcessor/Process/Processor/DumpProcessor/IDumpProcessor.cs @@ -4,5 +4,5 @@ namespace LootDumpProcessor.Process.Processor.DumpProcessor; public interface IDumpProcessor { - Dictionary ProcessDumps(List dumps); + Task> ProcessDumps(List dumps); } \ No newline at end of file diff --git a/source/LootDumpProcessor/Process/Processor/DumpProcessor/MultithreadSteppedDumpProcessor.cs b/source/LootDumpProcessor/Process/Processor/DumpProcessor/MultithreadSteppedDumpProcessor.cs index 3044a4f..1e5aaea 100644 --- a/source/LootDumpProcessor/Process/Processor/DumpProcessor/MultithreadSteppedDumpProcessor.cs +++ b/source/LootDumpProcessor/Process/Processor/DumpProcessor/MultithreadSteppedDumpProcessor.cs @@ -47,7 +47,7 @@ public class MultithreadSteppedDumpProcessor( private static readonly IDataStorage _dataStorage = DataStorageFactory.GetInstance(); - public Dictionary ProcessDumps(List dumps) + public async Task> ProcessDumps(List dumps) { _logger.LogInformation("Starting final dump processing"); var output = new Dictionary(); @@ -65,8 +65,8 @@ public class MultithreadSteppedDumpProcessor( { MaxDegreeOfParallelism = Environment.ProcessorCount }; - Parallel.ForEachAsync(dumps, parallelOptions, - async (partialData, cancellationToken) => + await Parallel.ForEachAsync(dumps, parallelOptions, + async (partialData, _) => await Process(partialData, staticContainers, mapStaticContainersAggregated, mapDumpCounter)); _logger.LogInformation("All static data processing threads finished"); @@ -202,7 +202,7 @@ public class MultithreadSteppedDumpProcessor( fileDate.Value > LootDumpProcessorContext.GetConfig().DumpProcessorConfig .SpawnContainerChanceIncludeAfterDate; - private static void IncrementMapCounterDictionaryValue(IDictionary mapDumpCounter, string mapName) + private static void IncrementMapCounterDictionaryValue(ConcurrentDictionary mapDumpCounter, string mapName) { if (!mapDumpCounter.TryAdd(mapName, 1)) mapDumpCounter[mapName] += 1; } @@ -305,13 +305,12 @@ public class MultithreadSteppedDumpProcessor( ); foreach (var (uniqueKey, containerTemplate) in loadedDictionary) { - var count = dumpData.LooseLoot.Counts[uniqueKey]; + var isValueFound = dumpData.LooseLoot.Counts.TryGetValue(uniqueKey, out var count); + if (!isValueFound) _logger.LogError("Value for {UniqueKey} not found", uniqueKey); lock (lockObjectDictionaryCounts) { - if (dictionaryCounts.ContainsKey(uniqueKey)) + if (!dictionaryCounts.TryAdd(uniqueKey, count)) dictionaryCounts[uniqueKey] += count; - else - dictionaryCounts[uniqueKey] = count; } lock (lockObjectDictionaryItemProperties) @@ -319,8 +318,8 @@ public class MultithreadSteppedDumpProcessor( if (!dictionaryItemProperties.TryGetValue(uniqueKey, out var values)) { values = new FlatKeyableList