diff --git a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsSetup.cs b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsSetup.cs index 7b8525677..7e900d231 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsSetup.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsSetup.cs @@ -158,6 +158,7 @@ namespace Barotrauma servicesProvider.RegisterServiceType(ServiceLifetime.Singleton); servicesProvider.RegisterServiceType(ServiceLifetime.Transient); servicesProvider.RegisterServiceType(ServiceLifetime.Singleton); + servicesProvider.RegisterServiceResolver(factory => factory.GetInstance() as ILuaConfigService); // Extension/Sub Services servicesProvider.RegisterServiceType(ServiceLifetime.Transient); diff --git a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/_Services/LuaScriptManagementService.cs b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/_Services/LuaScriptManagementService.cs index f35c941b4..bcef4842c 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/_Services/LuaScriptManagementService.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/_Services/LuaScriptManagementService.cs @@ -52,7 +52,9 @@ class LuaScriptManagementService : ILuaScriptManagementService, ILuaDataService, private readonly IPluginManagementService _pluginManagementService; private readonly INetworkingService _networkingService; private readonly IConsoleCommandsService _commandsService; + private readonly ILuaConfigService _configService; private readonly ILuaCsInfoProvider _luaCsInfoProvider; + private readonly Lazy _packageManagementService; //private readonly ILuaCsUtility _luaCsUtility; public LuaScriptManagementService( @@ -69,7 +71,9 @@ class LuaScriptManagementService : ILuaScriptManagementService, ILuaDataService, //ILuaCsUtility luaCsUtility, ILuaCsTimer luaCsTimer, IConsoleCommandsService commandsService, - ILuaCsInfoProvider luaCsInfoProvider) + ILuaCsInfoProvider luaCsInfoProvider, + ILuaConfigService configService, + Lazy packageManagementService) { _luaScriptLoader = loader; _userDataService = userDataService; @@ -84,6 +88,8 @@ class LuaScriptManagementService : ILuaScriptManagementService, ILuaDataService, _eventService = eventService; _commandsService = commandsService; _luaCsInfoProvider = luaCsInfoProvider; + _configService = configService; + _packageManagementService = packageManagementService; _luaCsTimer = luaCsTimer; RegisterLuaEvents(); @@ -379,7 +385,10 @@ class LuaScriptManagementService : ILuaScriptManagementService, ILuaDataService, _script.Globals["Hook"] = _eventService; _script.Globals["Timer"] = _luaCsTimer; _script.Globals["File"] = UserData.CreateStatic(); + _script.Globals["ConfigService"] = _configService; _script.Globals["Networking"] = _networkingService; + _script.Globals["trygetpackage"] = (string name, out ContentPackage package) => + _packageManagementService.Value.TryGetLoadedPackageByName(name, out package); //_script.Globals["Steam"] = Steam; if (enableSandbox) diff --git a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/_Services/PackageManagementService.cs b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/_Services/PackageManagementService.cs index 596539c3c..589f5c650 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/_Services/PackageManagementService.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/_Services/PackageManagementService.cs @@ -29,6 +29,7 @@ public sealed class PackageManagementService : IPackageManagementService // state private readonly ConcurrentDictionary _loadedPackages = new(); private readonly ConcurrentDictionary _runningPackages = new(); + private readonly ConcurrentDictionary _packageNameCache = new(); // control /// /// Service Disposal Lock. @@ -141,6 +142,7 @@ public sealed class PackageManagementService : IPackageManagementService #endif _runningPackages.Clear(); _loadedPackages.Clear(); + _packageNameCache.Clear(); return operationResult; } catch (Exception e) @@ -149,6 +151,18 @@ public sealed class PackageManagementService : IPackageManagementService } } + public bool TryGetLoadedPackageByName(string name, out ContentPackage package) + { + package = null; + if (name.IsNullOrWhiteSpace()) + { + return false; + } + + using var _ = _operationsLock.AcquireReaderLock().ConfigureAwait(false).GetAwaiter().GetResult(); + return _packageNameCache.TryGetValue(name, out package); + } + public FluentResults.Result LoadPackageInfo(ContentPackage package) { Guard.IsNotNull(package, nameof(package)); @@ -232,6 +246,7 @@ public sealed class PackageManagementService : IPackageManagementService } _loadedPackages[package] = config; + _packageNameCache[package.Name] = package; try { var res = new FluentResults.Result(); @@ -435,6 +450,7 @@ public sealed class PackageManagementService : IPackageManagementService result.WithReasons(_uiStylesService.UnloadPackage(package).Reasons); #endif _loadedPackages.TryRemove(package, out _); + _packageNameCache.TryRemove(package.Name, out _); return result; } diff --git a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/_Services/_Interfaces/IConfigService.cs b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/_Services/_Interfaces/IConfigService.cs index 83f8a3d43..09d571962 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/_Services/_Interfaces/IConfigService.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/_Services/_Interfaces/IConfigService.cs @@ -17,11 +17,8 @@ public partial interface IConfigService : IReusableService, ILuaConfigService where T : class, ISettingBase; Task LoadConfigsAsync(ImmutableArray configResources); Task LoadConfigsProfilesAsync(ImmutableArray configProfileResources); - FluentResults.Result LoadSavedValueForConfig(ISettingBase setting); FluentResults.Result LoadSavedConfigsValues(); FluentResults.Result ApplyConfigProfile(ContentPackage package, string internalName); - FluentResults.Result SaveConfigValue(ISettingBase setting); FluentResults.Result DisposePackageData(ContentPackage package); FluentResults.Result DisposeAllPackageData(); - bool TryGetConfig(ContentPackage package, string internalName, out T instance) where T : ISettingBase; } diff --git a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/_Services/_Interfaces/IPackageManagementService.cs b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/_Services/_Interfaces/IPackageManagementService.cs index c59da4ecf..8d050b3e0 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/_Services/_Interfaces/IPackageManagementService.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/_Services/_Interfaces/IPackageManagementService.cs @@ -12,6 +12,7 @@ namespace Barotrauma.LuaCs; public interface IPackageManagementService : IReusableService { + public bool TryGetLoadedPackageByName(string name, out ContentPackage package); public FluentResults.Result LoadPackageInfo(ContentPackage package); public FluentResults.Result LoadPackagesInfo(ImmutableArray packages); public FluentResults.Result ExecuteLoadedPackages(ImmutableArray executionOrder, bool executeCsAssemblies); diff --git a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/_Services/_Lua/ILuaConfigService.cs b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/_Services/_Lua/ILuaConfigService.cs index ca60c8318..29b851fc2 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/_Services/_Lua/ILuaConfigService.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/_Services/_Lua/ILuaConfigService.cs @@ -6,5 +6,7 @@ namespace Barotrauma.LuaCs; public interface ILuaConfigService : ILuaService { - + FluentResults.Result LoadSavedValueForConfig(ISettingBase setting); + bool TryGetConfig(ContentPackage package, string internalName, out T instance) where T : ISettingBase; + FluentResults.Result SaveConfigValue(ISettingBase setting); } diff --git a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/_Services/_Lua/ILuaService.cs b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/_Services/_Lua/ILuaService.cs index 6db78b287..becb54333 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/_Services/_Lua/ILuaService.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/_Services/_Lua/ILuaService.cs @@ -1,6 +1,6 @@ namespace Barotrauma.LuaCs; -public interface ILuaService +public interface ILuaService : IService { }