- XML GUI Asset service implemented (alpha, requires testing).

This commit is contained in:
Maplewheels
2026-02-15 06:01:59 -05:00
parent f70251fa3b
commit 6ac49a10f4
14 changed files with 879 additions and 9 deletions
@@ -15,7 +15,7 @@ namespace Barotrauma.LuaCs.Data;
#region ModConfigurationInfo
public record ModConfigInfo : IModConfigInfo
public partial record ModConfigInfo : IModConfigInfo
{
public ContentPackage Package { get; init; }
public ImmutableArray<IAssemblyResourceInfo> Assemblies { get; init; }
@@ -4,7 +4,7 @@ using System.Xml.Linq;
namespace Barotrauma.LuaCs.Data;
public interface IModConfigInfo : IAssembliesResourcesInfo,
public partial interface IModConfigInfo : IAssembliesResourcesInfo,
ILuaScriptsResourcesInfo, IConfigsResourcesInfo
{
// package info
@@ -209,6 +209,10 @@ namespace Barotrauma
servicesProvider.RegisterServiceType<IConfigServiceConfig, ConfigServiceConfig>(ServiceLifetime.Singleton);
servicesProvider.RegisterServiceType<IPackageManagementServiceConfig, PackageManagementServiceConfig>(ServiceLifetime.Singleton);
#if CLIENT
SetupServicesProviderClient(servicesProvider);
#endif
// gen IL
servicesProvider.CompileAndRun();
return servicesProvider;
@@ -10,7 +10,7 @@ using Microsoft.Toolkit.Diagnostics;
namespace Barotrauma.LuaCs;
public sealed class ModConfigFileParserService :
public sealed partial class ModConfigFileParserService :
IParserServiceAsync<ResourceParserInfo, IAssemblyResourceInfo>,
IParserServiceAsync<ResourceParserInfo, ILuaScriptResourceInfo>,
IParserServiceAsync<ResourceParserInfo, IConfigResourceInfo>
@@ -23,12 +23,18 @@ public sealed class ModConfigService : IModConfigService
private IParserServiceAsync<ResourceParserInfo, IAssemblyResourceInfo> _assemblyParserService;
private IParserServiceAsync<ResourceParserInfo, ILuaScriptResourceInfo> _luaScriptParserService;
private IParserServiceAsync<ResourceParserInfo, IConfigResourceInfo> _configParserService;
#if CLIENT
private IParserServiceAsync<ResourceParserInfo, IStylesResourceInfo> _stylesParserService;
#endif
private readonly AsyncReaderWriterLock _operationsLock = new();
public ModConfigService(IStorageService storageService,
IParserServiceAsync<ResourceParserInfo, IAssemblyResourceInfo> assemblyParserService,
IParserServiceAsync<ResourceParserInfo, ILuaScriptResourceInfo> luaScriptParserService,
IParserServiceAsync<ResourceParserInfo, IConfigResourceInfo> configParserService,
IParserServiceAsync<ResourceParserInfo, IConfigResourceInfo> configParserService,
#if CLIENT
IParserServiceAsync<ResourceParserInfo, IStylesResourceInfo> stylesParserService,
#endif
ILoggerService logger)
{
_storageService = storageService;
@@ -36,6 +42,9 @@ public sealed class ModConfigService : IModConfigService
_luaScriptParserService = luaScriptParserService;
_configParserService = configParserService;
_logger = logger;
#if CLIENT
_stylesParserService = stylesParserService;
#endif
}
#region Dispose
@@ -59,6 +68,11 @@ public sealed class ModConfigService : IModConfigService
_assemblyParserService = null;
_luaScriptParserService = null;
_configParserService = null;
#if CLIENT
_stylesParserService.Dispose();
_stylesParserService = null;
#endif
}
catch
{
@@ -130,14 +144,26 @@ public sealed class ModConfigService : IModConfigService
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));
#if CLIENT
var styleTask = Task.Factory.StartNew(async () => await GetStylesFromXml(owner, src));
#endif
await Task.WhenAll(asmTask, cfgTask, luaTask);
await Task.WhenAll(
asmTask,
cfgTask,
#if CLIENT
styleTask,
#endif
luaTask);
return FluentResults.Result.Ok<IModConfigInfo>(new ModConfigInfo()
{
Package = owner,
Assemblies = await await asmTask,
Configs = await await cfgTask,
#if CLIENT
Styles = await await styleTask,
#endif
LuaScripts = await await luaTask
});
@@ -151,7 +177,6 @@ public sealed class ModConfigService : IModConfigService
XElement cfgElement)
{
return await GetResourceFromXml<IConfigResourceInfo>(contentPackage, cfgElement, "Config", "FileGroup", _configParserService);
}
async Task<ImmutableArray<IAssemblyResourceInfo>> GetAssembliesFromXml(ContentPackage contentPackage,
@@ -159,6 +184,14 @@ public sealed class ModConfigService : IModConfigService
{
return await GetResourceFromXml<IAssemblyResourceInfo>(contentPackage, cfgElement, "Assembly", "FileGroup", _assemblyParserService);
}
#if CLIENT
async Task<ImmutableArray<IStylesResourceInfo>> GetStylesFromXml(ContentPackage contentPackage,
XElement cfgElement)
{
return await GetResourceFromXml<IStylesResourceInfo>(contentPackage, cfgElement, "Style", "FileGroup", _stylesParserService);
}
#endif
async Task<ImmutableArray<T>> GetResourceFromXml<T>(ContentPackage contentPackage, XElement cfgElement, string elemName, string fileGroupName, IParserServiceAsync<ResourceParserInfo, T> resourceService)
{
@@ -20,6 +20,9 @@ public sealed class PackageManagementService : IPackageManagementService
private IConfigService _configService;
private ILuaScriptManagementService _luaScriptManagementService;
private IPluginManagementService _pluginManagementService;
#if CLIENT
private IUIStylesService _uiStylesService;
#endif
private IPackageManagementServiceConfig _runConfig;
// state
private readonly ConcurrentDictionary<ContentPackage, IModConfigInfo> _loadedPackages = new();
@@ -40,7 +43,11 @@ public sealed class PackageManagementService : IPackageManagementService
IModConfigService modConfigService,
ILuaScriptManagementService luaScriptManagementService,
IPluginManagementService pluginManagementService,
IConfigService configService, IPackageManagementServiceConfig runConfig)
IConfigService configService,
#if CLIENT
IUIStylesService uiStylesService,
#endif
IPackageManagementServiceConfig runConfig)
{
_logger = logger;
_modConfigService = modConfigService;
@@ -48,6 +55,9 @@ public sealed class PackageManagementService : IPackageManagementService
_pluginManagementService = pluginManagementService;
_configService = configService;
_runConfig = runConfig;
#if CLIENT
_uiStylesService = uiStylesService;
#endif
}
public void Dispose()
@@ -61,11 +71,19 @@ public sealed class PackageManagementService : IPackageManagementService
_pluginManagementService.Dispose();
_modConfigService.Dispose();
_logger.Dispose();
#if CLIENT
_uiStylesService.Dispose();
#endif
_logger = null;
_luaScriptManagementService = null;
_pluginManagementService = null;
_modConfigService = null;
#if CLIENT
_uiStylesService = null;
#endif
_loadedPackages.Clear();
_runningPackages.Clear();
}
@@ -86,9 +104,13 @@ public sealed class PackageManagementService : IPackageManagementService
try
{
var operationResult = new FluentResults.Result();
operationResult.WithReasons(_configService.Reset().Reasons);
operationResult.WithReasons(_luaScriptManagementService.Reset().Reasons);
operationResult.WithReasons(_pluginManagementService.Reset().Reasons);
operationResult.WithReasons(_configService.Reset().Reasons);
#if CLIENT
operationResult.WithReasons(_uiStylesService.Reset().Reasons);
#endif
_runningPackages.Clear();
_loadedPackages.Clear();
return operationResult;
@@ -205,11 +227,19 @@ public sealed class PackageManagementService : IPackageManagementService
{
return FluentResults.Result.Ok();
}
#if CLIENT
if (!config.Styles.IsDefaultOrEmpty)
{
res.WithReasons(_uiStylesService.LoadAssets(config.Styles).Reasons);
}
#endif
var r = Task.WhenAll(tasks.ToArray()).ConfigureAwait(false).GetAwaiter().GetResult();
foreach (var task in r)
{
res.WithReasons(task.ConfigureAwait(false).GetAwaiter().GetResult().Reasons);
}
return res;
}
catch (Exception e)
@@ -363,12 +393,19 @@ public sealed class PackageManagementService : IPackageManagementService
IService.CheckDisposed(this);
if (!_loadedPackages.ContainsKey(package))
{
return FluentResults.Result.Fail($"{nameof(UnloadPackage)}: The package is not loaded.");
}
if (!_runningPackages.IsEmpty)
{
return FluentResults.Result.Fail($"{nameof(UnloadPackage)}: Packages are currently executing.");
}
var result = new FluentResults.Result();
result.WithReasons(_luaScriptManagementService.DisposePackageResources(package).Reasons);
result.WithReasons(_configService.DisposePackageData(package).Reasons);
#if CLIENT
result.WithReasons(_uiStylesService.UnloadPackage(package).Reasons);
#endif
_loadedPackages.TryRemove(package, out _);
return result;
}
@@ -384,7 +421,9 @@ public sealed class PackageManagementService : IPackageManagementService
var result = new FluentResults.Result();
foreach (var package in packages)
{
result.WithReasons(UnloadPackage(package).Reasons);
}
return result;
}