From 6a21255a38f9cf78156c291065437f725c32e845 Mon Sep 17 00:00:00 2001 From: Maplewheels Date: Sun, 18 Jan 2026 19:36:03 -0500 Subject: [PATCH] - IT BUILDS!!2:BARO BOOGALOO --- .../ClientSource/LuaCs/LuaCsSetup.cs | 2 - .../SharedSource/LuaCs/IEvents.cs | 20 -- .../LuaCs/Lua/LuaClasses/LuaCsTimer.cs | 7 + .../LuaCs/Lua/LuaClasses/LuaGame.cs | 4 + .../LuaCs/Lua/LuaClasses/LuaUserData.cs | 5 +- .../SharedSource/LuaCs/LuaCsSetup.cs | 323 +++++++++--------- .../Services/Compatibility/ILuaCsShim.cs | 2 +- .../LuaCs/Services/ConfigService.cs | 21 ++ .../Services/LuaScriptManagementService.cs | 25 +- .../Services/PackageManagementService.cs | 39 ++- .../_Interfaces/IPackageManagementService.cs | 5 +- 11 files changed, 258 insertions(+), 195 deletions(-) diff --git a/Barotrauma/BarotraumaClient/ClientSource/LuaCs/LuaCsSetup.cs b/Barotrauma/BarotraumaClient/ClientSource/LuaCs/LuaCsSetup.cs index d34a3d308..a1c793843 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/LuaCs/LuaCsSetup.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/LuaCs/LuaCsSetup.cs @@ -21,8 +21,6 @@ namespace Barotrauma } } - private partial bool ShouldRunCs() => IsCsEnabled.Value; - public void CheckCsEnabled() { var csharpMods = PackageManagementService.GetLoadedAssemblyPackages(); diff --git a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/IEvents.cs b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/IEvents.cs index ffefc003c..b3125f8b4 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/IEvents.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/IEvents.cs @@ -61,11 +61,6 @@ internal interface IEventReloadAllPackages : IEvent void OnReloadAllPackages(); } -internal interface IEventConfigVarInstanced : IEvent -{ - void OnConfigCreated(IConfigBase config); -} - #endregion #region GameEvents @@ -215,11 +210,6 @@ public interface IEventPluginPreInitialize : IEvent public interface IEventAssemblyLoaded : IEvent { void OnAssemblyLoaded(Assembly assembly); - static IEventAssemblyLoaded IEvent.GetLuaRunner(IDictionary luaFunc) => new - { - IsLuaRunner = Return.Arguments(() => true), - OnAssemblyLoaded = ReturnVoid.Arguments((ass) => luaFunc[nameof(OnAssemblyLoaded)](ass)) - }.ActLike(); } /// @@ -228,11 +218,6 @@ public interface IEventAssemblyLoaded : IEvent public interface IEventAssemblyContextCreated : IEvent { void OnAssemblyCreated(IAssemblyLoaderService loaderService); - static IEventAssemblyContextCreated IEvent.GetLuaRunner(IDictionary luaFunc) => new - { - IsLuaRunner = Return.Arguments(() => true), - OnAssemblyContextCreated = ReturnVoid.Arguments((loader) => luaFunc[nameof(OnAssemblyCreated)](loader)) - }.ActLike(); } /// @@ -241,11 +226,6 @@ public interface IEventAssemblyContextCreated : IEvent { void OnAssemblyUnloading(WeakReference loaderService); - static IEventAssemblyContextUnloading IEvent.GetLuaRunner(IDictionary luaFunc) => new - { - IsLuaRunner = Return.Arguments(() => true), - OnAssemblyUnloading = ReturnVoid.Arguments>((loader) => luaFunc[nameof(OnAssemblyUnloading)](loader)) - }.ActLike(); } #endregion diff --git a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Lua/LuaClasses/LuaCsTimer.cs b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Lua/LuaClasses/LuaCsTimer.cs index 9e863d30e..e276ed3d2 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Lua/LuaClasses/LuaCsTimer.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Lua/LuaClasses/LuaCsTimer.cs @@ -120,5 +120,12 @@ namespace Barotrauma TimedAction timedAction = new TimedAction(action, 0); AddTimer(timedAction); } + + public void Dispose() + { + // ignored + } + + public bool IsDisposed => false; } } diff --git a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Lua/LuaClasses/LuaGame.cs b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Lua/LuaClasses/LuaGame.cs index a97beb235..6557b2fab 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Lua/LuaClasses/LuaGame.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Lua/LuaClasses/LuaGame.cs @@ -272,6 +272,10 @@ namespace Barotrauma.LuaCs.Services public LuaGame() { +#if DEBUG + return; // startup testing +#endif + throw new NotImplementedException(); /*LuaUserData.MakeFieldAccessible(UserData.RegisterType(typeof(GameSettings)), "currentConfig"); Settings = UserData.CreateStatic(typeof(GameSettings));*/ diff --git a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Lua/LuaClasses/LuaUserData.cs b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Lua/LuaClasses/LuaUserData.cs index 61d60b65e..cd0ecdda5 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Lua/LuaClasses/LuaUserData.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Lua/LuaClasses/LuaUserData.cs @@ -269,9 +269,10 @@ namespace Barotrauma descriptor.RemoveMember(methodName); descriptor.AddMember(methodName, new ObjectCallbackMemberDescriptor(methodName, (object arg1, ScriptExecutionContext arg2, CallbackArguments arg3) => { - if (GameMain.LuaCs != null) + /*if (GameMain.LuaCs != null) return GameMain.LuaCs.CallLuaFunction(function, arg3.GetArray()); - return null; + return null;*/ + throw new NotImplementedException(); })); } diff --git a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsSetup.cs b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsSetup.cs index 4a7059455..a6ec81487 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsSetup.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsSetup.cs @@ -27,59 +27,22 @@ namespace Barotrauma internal delegate void LuaCsErrorHandler(Exception ex, LuaCsMessageOrigin origin); internal delegate void LuaCsExceptionHandler(Exception ex, LuaCsMessageOrigin origin); - partial class LuaCsSetup : IDisposable, IEventScreenSelected, IEventAllPackageListChanged, IEventEnabledPackageListChanged, + partial class LuaCsSetup : IDisposable, IEventScreenSelected, IEventEnabledPackageListChanged, IEventReloadAllPackages { public LuaCsSetup() { // == startup - _servicesProvider = new ServicesProvider(); - RegisterServices(_servicesProvider); + _servicesProvider = SetupServicesProvider(); if (!ValidateLuaCsContent()) { Logger.LogError($"{nameof(LuaCsSetup)}: ModConfigXml missing. Unable to continue."); throw new ApplicationException($"{nameof(LuaCsSetup)}: Lua ModConfig.xml is missing. Unable to continue."); } - SubscribeToLuaCsEvents(); _runStateMachine = SetupStateMachine(); - //LoadLuaCsConfig(); - - return; - // == end - - StateMachine SetupStateMachine() - { - return new StateMachine(false, RunState.Unloaded, RunStateUnloaded_OnEnter, null) - .AddState(RunState.LoadedNoExec, RunStateLoadedNoExec_OnEnter, RunStateLoadedNoExec_OnExit) - .AddState(RunState.Running, RunStateRunning_OnEnter, RunStateRunning_OnExit); - - // ReSharper disable InconsistentNaming - void RunStateUnloaded_OnEnter(State currentState) - { - - } - - void RunStateLoadedNoExec_OnEnter(State currentState) - { - - } - - void RunStateLoadedNoExec_OnExit(State currentState) - { - - } - - void RunStateRunning_OnEnter(State currentState) - { - - } - - void RunStateRunning_OnExit(State currentState) - { - - } - // ReSharper restore InconsistentNaming - } + SubscribeToLuaCsEvents(); + SetRunState(RunState.LoadedNoExec); + LoadLuaCsConfig(); } bool ValidateLuaCsContent() @@ -88,44 +51,16 @@ namespace Barotrauma // TODO: we just wanna boot for now return true; #endif - // check if /Content/Lua/ModConfig.xml exists - // if not, try to copy it from the Local Mods folder - // if not, try to copy it from the Workshop Mods folder + // check if /Content/ModConfig.xml exists + // if not, try to copy missing files from the Local Mods folder + // if not, try to copy missing files from the Workshop Mods folder // if that fails, throw an error and exit. throw new NotImplementedException(); } - void RegisterServices(IServicesProvider servicesProvider) - { - servicesProvider.RegisterServiceType(ServiceLifetime.Singleton); - servicesProvider.RegisterServiceType(ServiceLifetime.Singleton); - servicesProvider.RegisterServiceType(ServiceLifetime.Transient); - servicesProvider.RegisterServiceType(ServiceLifetime.Singleton); - servicesProvider.RegisterServiceType(ServiceLifetime.Singleton); - servicesProvider.RegisterServiceType(ServiceLifetime.Singleton); - servicesProvider.RegisterServiceType(ServiceLifetime.Singleton); - servicesProvider.RegisterServiceType(ServiceLifetime.Transient); - servicesProvider.RegisterServiceType(ServiceLifetime.Singleton); - - // TODO: IConfigService - // TODO: INetworkingService - // TODO: [Resource Converter/Parser Services] - - servicesProvider.RegisterServiceType(ServiceLifetime.Transient); - - // service config data - servicesProvider.RegisterServiceType(ServiceLifetime.Singleton); - servicesProvider.RegisterServiceType(ServiceLifetime.Singleton); - servicesProvider.RegisterServiceType(ServiceLifetime.Singleton); - - // gen IL - servicesProvider.Compile(); - } - void SubscribeToLuaCsEvents() { EventService.Subscribe(this); // game state hook in - EventService.Subscribe(this); EventService.Subscribe(this); EventService.Subscribe(this); } @@ -141,14 +76,14 @@ namespace Barotrauma #endregion - #region Services_ConfigVars + #region Services_CVars /* * === Singleton Services */ private readonly IServicesProvider _servicesProvider; - + public PerformanceCounterService PerformanceCounter => _servicesProvider.GetService(); public ILoggerService Logger => _servicesProvider.GetService(); public IConfigService ConfigService => _servicesProvider.GetService(); @@ -158,14 +93,8 @@ namespace Barotrauma public INetworkingService NetworkingService => _servicesProvider.GetService(); public IEventService EventService => _servicesProvider.GetService(); public LuaGame Game => _servicesProvider.GetService(); - - #region LuaCsInternal - - - /* - * === Config Vars - */ + internal IStorageService StorageService => _servicesProvider.GetService(); /// /// Whether C# plugin code is enabled. @@ -207,13 +136,58 @@ namespace Barotrauma /// internal IConfigEntry LocalDataSavePath { get; private set; } + void LoadLuaCsConfig() + { + IsCsEnabled = ConfigService.TryGetConfig>(ContentPackageManager.VanillaCorePackage, "IsCsEnabled", out var val1) ? val1 + : throw new NullReferenceException($"{nameof(IsCsEnabled)} cannot be loaded."); + TreatForcedModsAsNormal = ConfigService.TryGetConfig>(ContentPackageManager.VanillaCorePackage, "TreatForcedModsAsNormal", out var val2) ? val2 + : throw new NullReferenceException($"{nameof(TreatForcedModsAsNormal)} cannot be loaded."); + DisableErrorGUIOverlay = ConfigService.TryGetConfig>(ContentPackageManager.VanillaCorePackage, "DisableErrorGUIOverlay", out var val3) ? val3 + : throw new NullReferenceException($"{nameof(DisableErrorGUIOverlay)} cannot be loaded."); + HideUserNamesInLogs = ConfigService.TryGetConfig>(ContentPackageManager.VanillaCorePackage, "HideUserNamesInLogs", out var val4) ? val4 + : throw new NullReferenceException($"{nameof(HideUserNamesInLogs)} cannot be loaded."); + LuaForBarotraumaSteamId = ConfigService.TryGetConfig>(ContentPackageManager.VanillaCorePackage, "LuaForBarotraumaSteamId", out var val5) ? val5 + : throw new NullReferenceException($"{nameof(LuaForBarotraumaSteamId)} cannot be loaded."); + RestrictMessageSize = ConfigService.TryGetConfig>(ContentPackageManager.VanillaCorePackage, "RestrictMessageSize", out var val7) ? val7 + : throw new NullReferenceException($"{nameof(RestrictMessageSize)} cannot be loaded."); + } + + private IServicesProvider SetupServicesProvider() + { + var servicesProvider = new ServicesProvider(); + + servicesProvider.RegisterServiceType(ServiceLifetime.Singleton); + servicesProvider.RegisterServiceType(ServiceLifetime.Singleton); + servicesProvider.RegisterServiceType(ServiceLifetime.Transient); + servicesProvider.RegisterServiceType(ServiceLifetime.Transient); + servicesProvider.RegisterServiceType(ServiceLifetime.Singleton); + servicesProvider.RegisterServiceType(ServiceLifetime.Singleton); + servicesProvider.RegisterServiceType(ServiceLifetime.Singleton); + servicesProvider.RegisterServiceType(ServiceLifetime.Singleton); + servicesProvider.RegisterServiceType(ServiceLifetime.Singleton); + servicesProvider.RegisterServiceType(ServiceLifetime.Transient); + servicesProvider.RegisterServiceType(ServiceLifetime.Singleton); + // TODO: INetworkingService + servicesProvider.RegisterServiceType(ServiceLifetime.Singleton); + servicesProvider.RegisterServiceType(ServiceLifetime.Transient); + servicesProvider.RegisterServiceType, ConfigFileParserService>(ServiceLifetime.Transient); + servicesProvider.RegisterServiceType, ConfigFileParserService>(ServiceLifetime.Transient); + servicesProvider.RegisterServiceType, ConfigFileParserService>(ServiceLifetime.Transient); + // service config data + servicesProvider.RegisterServiceType(ServiceLifetime.Singleton); + servicesProvider.RegisterServiceType(ServiceLifetime.Singleton); + servicesProvider.RegisterServiceType(ServiceLifetime.Singleton); + servicesProvider.RegisterServiceType(ServiceLifetime.Singleton); + // gen IL + servicesProvider.Compile(); + return servicesProvider; + } + #endregion - /** - * == Ops Vars - */ + #region StateMachine + private RunState _runState; - /// /// The current run state of all services managed by LuaCs. /// @@ -222,14 +196,116 @@ namespace Barotrauma get => _runState; private set => _runState = value; } - - + private readonly StateMachine _runStateMachine; - private readonly ConcurrentQueue _toLoad = new(); - private readonly ConcurrentQueue _toUnload = new(); + + public void OnEnabledPackageListChanged(CorePackage package, IEnumerable regularPackages) + { + ProcessEnabledPackageChanges(new []{ package }.Concat(regularPackages).ToImmutableArray()); + } + + public void OnReloadAllPackages() + { + if (CurrentRunState <= RunState.Unloaded) + { + return; + } + + var state = CurrentRunState; + SetRunState(RunState.Unloaded); + SetRunState(state); + } + + private void ProcessEnabledPackageChanges(ImmutableArray packages) + { + if (CurrentRunState < RunState.LoadedNoExec) + { + return; + } + + var state = CurrentRunState; + if (CurrentRunState > RunState.LoadedNoExec) + { + SetRunState(RunState.LoadedNoExec); + } + + PackageManagementService.SyncLoadedPackagesList(packages); + SetRunState(state); // restore + } + + private void SetRunState(RunState targetRunState) + { + if (CurrentRunState == targetRunState) + { + return; + } + _runStateMachine.GotoState(targetRunState); + } + + private StateMachine SetupStateMachine() + { + return new StateMachine(false, RunState.Unloaded, RunStateUnloaded_OnEnter, null) + .AddState(RunState.LoadedNoExec, RunStateLoadedNoExec_OnEnter, null) + .AddState(RunState.Running, RunStateRunning_OnEnter, RunStateRunning_OnExit); + + // ReSharper disable InconsistentNaming + void RunStateUnloaded_OnEnter(State currentState) + { + if (PackageManagementService.IsAnyPackageRunning()) + { + Logger.LogResults(PackageManagementService.StopRunningPackages()); + } + + if (PackageManagementService.IsAnyPackageRunning()) + { + DisposeLuaCsConfig(); + Logger.LogResults(PackageManagementService.UnloadAllPackages()); + } + + CurrentRunState = RunState.Unloaded; + } + + void RunStateLoadedNoExec_OnEnter(State currentState) + { + if (PackageManagementService.IsAnyPackageRunning()) + { + Logger.LogResults(PackageManagementService.StopRunningPackages()); + } + + if (!PackageManagementService.IsAnyPackageLoaded()) + { + Logger.LogResults(PackageManagementService.LoadPackagesInfo(ContentPackageManager.EnabledPackages.All.ToImmutableArray())); + LoadLuaCsConfig(); + } + + CurrentRunState = RunState.LoadedNoExec; + } + + void RunStateRunning_OnEnter(State currentState) + { + if (!PackageManagementService.IsAnyPackageLoaded()) + { + Logger.LogResults(PackageManagementService.LoadPackagesInfo(ContentPackageManager.EnabledPackages.All.ToImmutableArray())); + LoadLuaCsConfig(); + } + + if (!PackageManagementService.IsAnyPackageRunning()) + { + Logger.LogResults(PackageManagementService.ExecuteLoadedPackages(ContentPackageManager.EnabledPackages.All.ToImmutableArray())); + } + + CurrentRunState = RunState.Running; + } + + void RunStateRunning_OnExit(State currentState) + { + Logger.LogResults(PackageManagementService.StopRunningPackages()); + } + // ReSharper restore InconsistentNaming + } #endregion - + #region LegacyRedirects public ILuaCsHook Hook => this.EventService; @@ -276,72 +352,7 @@ namespace Barotrauma /// The new game screen. public partial void OnScreenSelected(Screen screen); - public void OnAllPackageListChanged(IEnumerable corePackages, IEnumerable regularPackages) - { - UpdateLoadedPackagesList(); - } - - public void OnEnabledPackageListChanged(CorePackage corePackage, IEnumerable regularPackages) - { - UpdateLoadedPackagesList(); - } - public void OnReloadAllPackages() - { - if (CurrentRunState <= RunState.Unloaded) - return; - var state = CurrentRunState; - SetRunState(RunState.Unloaded); - SetRunState(CurrentRunState); - } - - public void ForceRunState(RunState newState) - { - if (CurrentRunState == newState) - return; - SetRunState(newState); - } - - private void UpdateLoadedPackagesList() - { - throw new NotImplementedException($"Rewrite the loading state system."); - - var newPackSet = ContentPackageManager.AllPackages - .Union(ContentPackageManager.EnabledPackages.All) - .ToHashSet(); - var currPackSet = PackageManagementService.GetAllLoadedPackages().ToHashSet(); - var toAdd = newPackSet.Except(currPackSet); - var toRemove = currPackSet.Except(newPackSet); - foreach (var package in toAdd) - _toLoad.Enqueue(package); - foreach (var package in toRemove) - _toUnload.Enqueue(package); - - //ProcessPackagesListDifferences(); - } - - void SetRunState(RunState newRunState) - { - if (CurrentRunState == newRunState) - return; - - } - - void LoadLuaCsConfig() - { - IsCsEnabled = ConfigService.TryGetConfig>(ContentPackageManager.VanillaCorePackage, "IsCsEnabled", out var val1) ? val1 - : throw new NullReferenceException($"{nameof(IsCsEnabled)} cannot be loaded."); - TreatForcedModsAsNormal = ConfigService.TryGetConfig>(ContentPackageManager.VanillaCorePackage, "TreatForcedModsAsNormal", out var val2) ? val2 - : throw new NullReferenceException($"{nameof(TreatForcedModsAsNormal)} cannot be loaded."); - DisableErrorGUIOverlay = ConfigService.TryGetConfig>(ContentPackageManager.VanillaCorePackage, "DisableErrorGUIOverlay", out var val3) ? val3 - : throw new NullReferenceException($"{nameof(DisableErrorGUIOverlay)} cannot be loaded."); - HideUserNamesInLogs = ConfigService.TryGetConfig>(ContentPackageManager.VanillaCorePackage, "HideUserNamesInLogs", out var val4) ? val4 - : throw new NullReferenceException($"{nameof(HideUserNamesInLogs)} cannot be loaded."); - LuaForBarotraumaSteamId = ConfigService.TryGetConfig>(ContentPackageManager.VanillaCorePackage, "LuaForBarotraumaSteamId", out var val5) ? val5 - : throw new NullReferenceException($"{nameof(LuaForBarotraumaSteamId)} cannot be loaded."); - RestrictMessageSize = ConfigService.TryGetConfig>(ContentPackageManager.VanillaCorePackage, "RestrictMessageSize", out var val7) ? val7 - : throw new NullReferenceException($"{nameof(RestrictMessageSize)} cannot be loaded."); - } void DisposeLuaCsConfig() { diff --git a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Services/Compatibility/ILuaCsShim.cs b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Services/Compatibility/ILuaCsShim.cs index 661b26360..19a9cf663 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Services/Compatibility/ILuaCsShim.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Services/Compatibility/ILuaCsShim.cs @@ -1,6 +1,6 @@ namespace Barotrauma.LuaCs.Services.Compatibility; -public interface ILuaCsShim +public interface ILuaCsShim : IService { } diff --git a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Services/ConfigService.cs b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Services/ConfigService.cs index f3f8d5f65..8bcdb69fa 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Services/ConfigService.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Services/ConfigService.cs @@ -34,6 +34,8 @@ public partial class ConfigService : IConfigService throw new NotImplementedException(); } + #region LuaInterface + public bool TryGetConfigBool(string packageName, string configName, out bool value) { throw new NotImplementedException(); @@ -128,7 +130,10 @@ public partial class ConfigService : IConfigService { throw new NotImplementedException(); } + + #endregion + public void RegisterTypeInitializer(Func> initializer, bool replaceIfExists = false) where TData : IEquatable where TConfig : IConfigBase { throw new NotImplementedException(); @@ -136,11 +141,17 @@ public partial class ConfigService : IConfigService public async Task LoadConfigsAsync(ImmutableArray configResources) { +#if DEBUG + return FluentResults.Result.Ok(); // just for startup testing +#endif throw new NotImplementedException(); } public async Task LoadConfigsProfilesAsync(ImmutableArray configProfileResources) { +#if DEBUG + return FluentResults.Result.Ok(); // just for startup testing +#endif throw new NotImplementedException(); } @@ -156,11 +167,17 @@ public partial class ConfigService : IConfigService public FluentResults.Result DisposePackageData(ContentPackage package) { +#if DEBUG + return FluentResults.Result.Ok(); // just for startup testing +#endif throw new NotImplementedException(); } public FluentResults.Result DisposeAllPackageData() { +#if DEBUG + return FluentResults.Result.Ok(); // just for startup testing +#endif throw new NotImplementedException(); } @@ -181,6 +198,10 @@ public partial class ConfigService : IConfigService public bool TryGetConfig(ContentPackage package, string name, out T config) where T : IConfigBase { +#if DEBUG + config = default(T); + return true; // just for startup testing +#endif throw new NotImplementedException(); } diff --git a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Services/LuaScriptManagementService.cs b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Services/LuaScriptManagementService.cs index ac523f836..f69e2faff 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Services/LuaScriptManagementService.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Services/LuaScriptManagementService.cs @@ -43,19 +43,20 @@ class LuaScriptManagementService : ILuaScriptManagementService, ILuaDataService private readonly ILoggerService _loggerService; private readonly LuaGame _luaGame; private readonly ILuaCsHook _luaCsHook; - private readonly ILuaCsNetworking _luaCsNetworking; - private readonly ILuaCsUtility _luaCsUtility; - private readonly ILuaCsTimer _luaCsTimer; + //private readonly ILuaCsNetworking _luaCsNetworking; + //private readonly ILuaCsUtility _luaCsUtility; + //private readonly ILuaCsTimer _luaCsTimer; public LuaScriptManagementService( ILoggerService loggerService, ILuaScriptLoader loader, ILuaScriptServicesConfig luaScriptServicesConfig, LuaGame luaGame, - ILuaCsHook luaCsHook, - ILuaCsNetworking luaCsNetworking, - ILuaCsUtility luaCsUtility, - ILuaCsTimer luaCsTimer) + ILuaCsHook luaCsHook + //ILuaCsNetworking luaCsNetworking, + //ILuaCsUtility luaCsUtility, + //ILuaCsTimer luaCsTimer + ) { _luaScriptLoader = loader; _luaScriptServicesConfig = luaScriptServicesConfig; @@ -63,9 +64,9 @@ class LuaScriptManagementService : ILuaScriptManagementService, ILuaDataService _luaGame = luaGame; _luaCsHook = luaCsHook; - _luaCsNetworking = luaCsNetworking; - _luaCsUtility = luaCsUtility; - _luaCsTimer = luaCsTimer; + //_luaCsNetworking = luaCsNetworking; + //_luaCsUtility = luaCsUtility; + //_luaCsTimer = luaCsTimer; } public bool IsDisposed { get; private set; } @@ -124,9 +125,9 @@ class LuaScriptManagementService : ILuaScriptManagementService, ILuaDataService _script.Globals["Game"] = _luaGame; _script.Globals["Hook"] = _luaCsHook; - _script.Globals["Timer"] = _luaCsTimer; + //_script.Globals["Timer"] = _luaCsTimer; _script.Globals["File"] = UserData.CreateStatic(); - _script.Globals["Networking"] = _luaCsNetworking; + //_script.Globals["Networking"] = _luaCsNetworking; //_script.Globals["Steam"] = Steam; _script.Globals["ExecutionNumber"] = 0; diff --git a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Services/PackageManagementService.cs b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Services/PackageManagementService.cs index 0a518281a..3626f6e1c 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Services/PackageManagementService.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Services/PackageManagementService.cs @@ -223,7 +223,30 @@ public sealed class PackageManagementService : IPackageManagementService return result; } - + + public FluentResults.Result SyncLoadedPackagesList(ImmutableArray packages) + { + if (packages.IsDefaultOrEmpty) + ThrowHelper.ThrowArgumentNullException(nameof(packages)); + if (!_runningPackages.IsEmpty) + ThrowHelper.ThrowInvalidOperationException($"{nameof(SyncLoadedPackagesList)}: There are packages running!"); + + var toRemove = _loadedPackages.Keys.Except(packages).ToImmutableArray(); + var toAdd = packages.Except(_loadedPackages.Keys) + .OrderBy(pack => packages.IndexOf(pack)).ToImmutableArray(); + + var result = new FluentResults.Result(); + + result.WithReasons(UnloadPackages(toRemove).Reasons); + + if (result.IsFailed) + { + return result; + } + + return result.WithReasons(LoadPackagesInfo(toAdd).Reasons); + } + public FluentResults.Result StopRunningPackages() { using var lck = _operationsLock.AcquireReaderLock().ConfigureAwait(false).GetAwaiter().GetResult(); @@ -308,6 +331,20 @@ public sealed class PackageManagementService : IPackageManagementService return _runningPackages.ContainsKey(package); } + public bool IsAnyPackageLoaded() + { + using var lck = _operationsLock.AcquireReaderLock().ConfigureAwait(false).GetAwaiter().GetResult(); + IService.CheckDisposed(this); + return !_loadedPackages.IsEmpty; + } + + public bool IsAnyPackageRunning() + { + using var lck = _operationsLock.AcquireReaderLock().ConfigureAwait(false).GetAwaiter().GetResult(); + IService.CheckDisposed(this); + return !_runningPackages.IsEmpty; + } + public ImmutableArray GetLoadedAssemblyPackages() { using var lck = _operationsLock.AcquireReaderLock().ConfigureAwait(false).GetAwaiter().GetResult(); diff --git a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Services/_Interfaces/IPackageManagementService.cs b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Services/_Interfaces/IPackageManagementService.cs index 820613c41..2c6f2bc39 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Services/_Interfaces/IPackageManagementService.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Services/_Interfaces/IPackageManagementService.cs @@ -15,11 +15,14 @@ public interface IPackageManagementService : IReusableService public FluentResults.Result LoadPackageInfo(ContentPackage package); public FluentResults.Result LoadPackagesInfo(ImmutableArray packages); public FluentResults.Result ExecuteLoadedPackages(ImmutableArray executionOrder); + public FluentResults.Result SyncLoadedPackagesList(ImmutableArray packages); public FluentResults.Result StopRunningPackages(); public FluentResults.Result UnloadPackage(ContentPackage package); public FluentResults.Result UnloadPackages(ImmutableArray packages); public FluentResults.Result UnloadAllPackages(); public ImmutableArray GetAllLoadedPackages(); - public bool IsPackageRunning(ContentPackage package); public ImmutableArray GetLoadedAssemblyPackages(); + public bool IsPackageRunning(ContentPackage package); + public bool IsAnyPackageLoaded(); + public bool IsAnyPackageRunning(); }