From d0f5cb87e799f6338f9a941c1e089429b68e337d Mon Sep 17 00:00:00 2001 From: Maplewheels Date: Sun, 25 Jan 2026 14:50:29 -0500 Subject: [PATCH] - Fixed resource data not returning into the correct context. --- .../Processing/ModConfigFileParserService.cs | 46 +++++++------ .../Services/Processing/ModConfigService.cs | 64 ++++++++----------- 2 files changed, 50 insertions(+), 60 deletions(-) diff --git a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Services/Processing/ModConfigFileParserService.cs b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Services/Processing/ModConfigFileParserService.cs index 1e4399e94..dd2059909 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Services/Processing/ModConfigFileParserService.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Services/Processing/ModConfigFileParserService.cs @@ -53,14 +53,14 @@ public sealed class ModConfigFileParserService : // --- Assemblies async Task> IParserServiceAsync.TryParseResourceAsync(ResourceParserInfo src) { - using var lck = await _operationsLock.AcquireWriterLock(); + using var lck = await _operationsLock.AcquireReaderLock(); IService.CheckDisposed(this); if (CheckThrowNullRefs(src, "Assembly") is { IsFailed: true } fail) return fail; var runtimeEnv = GetRuntimeEnvironment(src.Element); - var fileResults = await GetCheckedFiles(src.Element, src.Owner, ".dll"); + var fileResults = await UnsafeGetCheckedFiles(src.Element, src.Owner, ".dll"); if (fileResults.IsFailed) return FluentResults.Result.Fail(fileResults.Errors); @@ -91,15 +91,14 @@ public sealed class ModConfigFileParserService : async Task> IParserServiceAsync.TryParseResourceAsync(ResourceParserInfo src) { - - using var lck = await _operationsLock.AcquireWriterLock(); + using var lck = await _operationsLock.AcquireReaderLock(); IService.CheckDisposed(this); if (CheckThrowNullRefs(src, "Config") is { IsFailed: true } fail) return fail; var runtimeEnv = GetRuntimeEnvironment(src.Element); - var fileResults = await GetCheckedFiles(src.Element, src.Owner, ".xml"); + var fileResults = await UnsafeGetCheckedFiles(src.Element, src.Owner, ".xml"); if (fileResults.IsFailed) return FluentResults.Result.Fail(fileResults.Errors); @@ -126,14 +125,14 @@ public sealed class ModConfigFileParserService : // --- Lua Scripts async Task> IParserServiceAsync.TryParseResourceAsync(ResourceParserInfo src) { - using var lck = await _operationsLock.AcquireWriterLock(); + using var lck = await _operationsLock.AcquireReaderLock(); IService.CheckDisposed(this); if (CheckThrowNullRefs(src, "Lua") is { IsFailed: true } fail) return fail; var runtimeEnv = GetRuntimeEnvironment(src.Element); - var fileResults = await GetCheckedFiles(src.Element, src.Owner, ".lua"); + var fileResults = await UnsafeGetCheckedFiles(src.Element, src.Owner, ".lua"); if (fileResults.IsFailed) return FluentResults.Result.Fail(fileResults.Errors); @@ -174,34 +173,39 @@ public sealed class ModConfigFileParserService : } // --- Helpers - private async Task>> GetCheckedFiles(XElement srcElement, ContentPackage srcOwner, string fileExtension) + private async Task>> UnsafeGetCheckedFiles(XElement srcElement, ContentPackage srcOwner, string fileExtension) { - using var lck = await _operationsLock.AcquireWriterLock(); - IService.CheckDisposed(this); - var builder = ImmutableArray.CreateBuilder(); - var filePath = srcElement.GetAttributeString("File", string.Empty); - var folderPath = srcElement.GetAttributeString("Folder", string.Empty); + var filePath = srcElement.GetAttributeContentPath("File", srcOwner); + var folderPath = srcElement.GetAttributeContentPath("Folder", srcOwner); + var res = new FluentResults.Result>(); + if (!filePath.IsNullOrWhiteSpace()) { - var cp = ContentPath.FromRaw(srcOwner, filePath); - if (_storageService.FileExists(cp.FullPath) is { IsSuccess: true, Value: true }) + if (_storageService.FileExists(filePath.FullPath) is { IsSuccess: true, Value: true }) { - builder.Add(cp); + builder.Add(filePath); + } + else + { + res.WithError($"{srcOwner.Name}: The file '{filePath}' is missing!"); } } if (!folderPath.IsNullOrWhiteSpace()) { - var cp = ContentPath.FromRaw(srcOwner, folderPath); - if (_storageService.DirectoryExists(cp.FullPath) is { IsSuccess: true, Value: true }) + if (_storageService.DirectoryExists(folderPath.FullPath) is { IsSuccess: true, Value: true }) { - var files = _storageService.FindFilesInPackage(cp.ContentPackage, cp.Value, fileExtension, true); + var files = _storageService.FindFilesInPackage(srcOwner, folderPath.Value, fileExtension, true); + } + else + { + res.WithError($"{srcOwner.Name}: The folder '{filePath}' is missing!"); } } - - throw new NotImplementedException(); + + return res.WithValue(builder.ToImmutable()); } private (Platform Platform, Target Target) GetRuntimeEnvironment(XElement element) { diff --git a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Services/Processing/ModConfigService.cs b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Services/Processing/ModConfigService.cs index cd9571aa4..a58c47f13 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Services/Processing/ModConfigService.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Services/Processing/ModConfigService.cs @@ -95,16 +95,26 @@ public sealed class ModConfigService : IModConfigService ThrowHelper.ThrowArgumentNullException($"{nameof(CreateConfigsAsync)}: The supplied array is default or empty!"); using var lck = await _operationsLock.AcquireReaderLock(); IService.CheckDisposed(this); - - var builder = new ConcurrentQueue<(ContentPackage Source, Result Config)>(); - await src.ParallelForEachAsync(async package => + var builder = ImmutableArray.CreateBuilder>>>(src.Length); + foreach (var srcItem in src) { - var res = await CreateConfigAsync(package); - builder.Enqueue((package, res)); - }); + builder.Add(Task.Factory.StartNew(async Task> () => await CreateConfigAsync(srcItem))); + } + var taskResults = await Task.WhenAll(builder.ToImmutable()); + var returnResults = ImmutableArray.CreateBuilder<(ContentPackage Source, Result Config)>(); + foreach (var taskResult in taskResults) + { + if (taskResult.IsFaulted) + { + ThrowHelper.ThrowInvalidOperationException($"{nameof(CreateConfigsAsync)}: Task failed: {taskResult.Exception?.Message}"); + } - return builder.OrderBy(pkg => src.IndexOf(pkg.Source)).ToImmutableArray(); + var r = await taskResult; + returnResults.Add((r.Value.Package, r)); + } + + return returnResults.ToImmutable(); } //--- Helpers @@ -117,42 +127,18 @@ public sealed class ModConfigService : IModConfigService private async Task> CreateFromConfigXmlAsync(ContentPackage owner, XElement src) { - ImmutableArray assemblyResources = default; - ImmutableArray configResources = default; - ImmutableArray luaResources = default; - - var tasks = new[] - { - new Task(async () => assemblyResources = await GetAssembliesFromXml(owner, src)), - new Task(async () => configResources = await GetConfigsFromXml(owner, src)), - new Task(async () => luaResources = await GetLuaScriptsFromXml(owner, src)), - }; - - tasks.ForEach(t => t.Start()); - var res = await Task.WhenAll(tasks); - - bool isFaulted = false; - foreach (var task in res) - { - if (task.IsFaulted) - { - _logger.LogError($"{nameof(CreateFromConfigXmlAsync)}: {task.Exception?.ToString()}"); - isFaulted = true; - } - } - - if (isFaulted) - { - _logger.LogError($"{nameof(CreateFromConfigXmlAsync)}: Failed to process content package: {owner.Name}"); - return FluentResults.Result.Fail($"{nameof(CreateFromConfigXmlAsync)}: Failed to process content package: {owner.Name}"); - } + var asmTask = Task.Factory.StartNew(async () => await GetAssembliesFromXml(owner, src)); + var cfgTask = Task.Factory.StartNew(async () => await GetConfigsFromXml(owner, src)); + var luaTask = Task.Factory.StartNew(async () => await GetLuaScriptsFromXml(owner, src)); + + await Task.WhenAll(asmTask, cfgTask, luaTask); return FluentResults.Result.Ok(new ModConfigInfo() { Package = owner, - Assemblies = assemblyResources, - Configs = configResources, - LuaScripts = luaResources + Assemblies = await await asmTask, + Configs = await await cfgTask, + LuaScripts = await await luaTask }); async Task> GetLuaScriptsFromXml(ContentPackage contentPackage,