From 413cc3ed4cbfbcc8f4502cfb72faec16ca610e69 Mon Sep 17 00:00:00 2001 From: MapleWheels Date: Thu, 2 Apr 2026 23:29:21 -0400 Subject: [PATCH] - Added setting to disable lua scripts caching in the storage service for scenarios that use extern editors. --- .../Config/SettingsShared.xml | 1 + .../LuaCsForBarotrauma/Texts/English.xml | 12 ++++++---- .../SharedSource/LuaCs/LuaCsSetup.cs | 11 ++++++++- .../LuaCs/_Services/LuaCsInfoProvider.cs | 1 + .../_Services/LuaScriptManagementService.cs | 23 +++++++++++++++++-- .../_Interfaces/ILuaCsInfoProvider.cs | 5 ++++ .../ILuaScriptManagementService.cs | 6 +++++ .../LuaCs/_Services/_Lua/ILuaScriptLoader.cs | 5 ++++ .../LuaCs/_Services/_Lua/LuaScriptLoader.cs | 14 +++++++++++ 9 files changed, 70 insertions(+), 8 deletions(-) diff --git a/Barotrauma/BarotraumaShared/LocalMods/LuaCsForBarotrauma/Config/SettingsShared.xml b/Barotrauma/BarotraumaShared/LocalMods/LuaCsForBarotrauma/Config/SettingsShared.xml index 6546e5370..35fa892f7 100644 --- a/Barotrauma/BarotraumaShared/LocalMods/LuaCsForBarotrauma/Config/SettingsShared.xml +++ b/Barotrauma/BarotraumaShared/LocalMods/LuaCsForBarotrauma/Config/SettingsShared.xml @@ -3,5 +3,6 @@ + diff --git a/Barotrauma/BarotraumaShared/LocalMods/LuaCsForBarotrauma/Texts/English.xml b/Barotrauma/BarotraumaShared/LocalMods/LuaCsForBarotrauma/Texts/English.xml index 84d297395..2462c80ea 100644 --- a/Barotrauma/BarotraumaShared/LocalMods/LuaCsForBarotrauma/Texts/English.xml +++ b/Barotrauma/BarotraumaShared/LocalMods/LuaCsForBarotrauma/Texts/English.xml @@ -3,14 +3,16 @@ Mod Controls Settings Mod Gameplay Settings - Suppress GUI Popup on Error - General + Are C# Mods Allowed Should unsandboxed scripts and dlls be allowed to run. General + + Use Pre-Caching + Should mod files be preloaded to speed up loading. Should only be turned off if you have mods that have issues with this. + General + Hide Local OS Account Name In Logs + If true, will replace your OS account name with 'USERNAME' in log files' paths. General - Limit Network Message Size - Limits the maximum network message size to avoid buffer size issues. - Networking diff --git a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsSetup.cs b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsSetup.cs index 21cf10aa5..d9bb9f415 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsSetup.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsSetup.cs @@ -106,6 +106,12 @@ namespace Barotrauma } private ISettingBase _hideUserNamesInLogs; + public bool UseCaching + { + get => _useCaching?.Value ?? true; + } + private ISettingBase _useCaching; + public static ContentPackage GetLuaCsPackage() { return ContentPackageManager.EnabledPackages.Regular.FirstOrDefault(cp => cp.NameMatches(PackageId), null) @@ -125,6 +131,10 @@ namespace Barotrauma ConfigService.TryGetConfig>(luaCsPackage, "HideUserNamesInLogs", out var val4) ? val4 : null; + _useCaching = + ConfigService.TryGetConfig>(luaCsPackage, "UseCaching", out var val5) + ? val5 + : null; } private IServicesProvider SetupServicesProvider() @@ -329,7 +339,6 @@ namespace Barotrauma Logger.LogResults(PackageManagementService.LoadPackagesInfo(GetEnabledPackagesList())); Logger.LogResults(ConfigService.LoadSavedConfigsValues()); LoadLuaCsConfig(); - } CurrentRunState = RunState.LoadedNoExec; diff --git a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/_Services/LuaCsInfoProvider.cs b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/_Services/LuaCsInfoProvider.cs index 5225e710b..e6d3df87a 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/_Services/LuaCsInfoProvider.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/_Services/LuaCsInfoProvider.cs @@ -14,6 +14,7 @@ public sealed class LuaCsInfoProvider : ILuaCsInfoProvider public bool IsDisposed => false; public bool IsCsEnabled => LuaCsSetup.Instance.IsCsEnabled; public bool HideUserNamesInLogs => LuaCsSetup.Instance.HideUserNamesInLogs; + public bool UseCaching => LuaCsSetup.Instance.UseCaching; public RunState CurrentRunState => LuaCsSetup.Instance.CurrentRunState; public ContentPackage LuaCsForBarotraumaPackage { diff --git a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/_Services/LuaScriptManagementService.cs b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/_Services/LuaScriptManagementService.cs index af8d61df0..140ed2d87 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/_Services/LuaScriptManagementService.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/_Services/LuaScriptManagementService.cs @@ -52,6 +52,7 @@ class LuaScriptManagementService : ILuaScriptManagementService, ILuaDataService, private readonly IPluginManagementService _pluginManagementService; private readonly INetworkingService _networkingService; private readonly IConsoleCommandsService _commandsService; + private readonly ILuaCsInfoProvider _luaCsInfoProvider; //private readonly ILuaCsUtility _luaCsUtility; public LuaScriptManagementService( @@ -67,8 +68,8 @@ class LuaScriptManagementService : ILuaScriptManagementService, ILuaDataService, IEventService eventService, //ILuaCsUtility luaCsUtility, ILuaCsTimer luaCsTimer, - IConsoleCommandsService commandsService - ) + IConsoleCommandsService commandsService, + ILuaCsInfoProvider luaCsInfoProvider) { _luaScriptLoader = loader; _userDataService = userDataService; @@ -82,6 +83,7 @@ class LuaScriptManagementService : ILuaScriptManagementService, ILuaDataService, _luaGame = luaGame; _eventService = eventService; _commandsService = commandsService; + _luaCsInfoProvider = luaCsInfoProvider; _luaCsTimer = luaCsTimer; RegisterLuaEvents(); @@ -164,11 +166,23 @@ class LuaScriptManagementService : ILuaScriptManagementService, ILuaDataService, public bool IsDisposed { get; private set; } + public void SetCachingPolicy(bool useCaching) + { + _luaScriptLoader?.SetCachingPolicy(useCaching); + } + public async Task LoadScriptResourcesAsync(ImmutableArray resourcesInfo) { + if (!_luaCsInfoProvider.UseCaching) + { + return FluentResults.Result.Ok(); + } + // Do any exception checks you can before acquiring a lock to avoid needlessly holding up resources. if (resourcesInfo.IsDefaultOrEmpty) + { ThrowHelper.ThrowArgumentNullException($"{nameof(LoadScriptResourcesAsync)}: The parameter is empty!"); + } // Acquire a lock: // Reader = Allow parallel operations (try to avoid nesting acquiring the lock when possible) @@ -186,7 +200,9 @@ class LuaScriptManagementService : ILuaScriptManagementService, ILuaDataService, // Aggregate and return results to the caller to deal with. Optionally, log here if you want. // Automatically converted to a Task when 'async' is in the method declaration. if (cacheRes.IsFailed) + { return cacheRes.ToResult(); + } return new FluentResults.Result().WithReasons(cacheRes.Value.SelectMany(cr => cr.Item2.Reasons)); } @@ -325,6 +341,8 @@ class LuaScriptManagementService : ILuaScriptManagementService, ILuaDataService, { _loggerService.LogMessage($"[Lua] {msg}"); }; + SetCachingPolicy(_luaCsInfoProvider.UseCaching); + _script.Options.ScriptLoader = _luaScriptLoader; _script.Options.CheckThreadAccess = false; @@ -486,6 +504,7 @@ class LuaScriptManagementService : ILuaScriptManagementService, ILuaDataService, } _resourcesInfo.Clear(); + _luaScriptLoader.ClearCaches(); return FluentResults.Result.Ok(); } diff --git a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/_Services/_Interfaces/ILuaCsInfoProvider.cs b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/_Services/_Interfaces/ILuaCsInfoProvider.cs index bf5e38c08..57a8a0251 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/_Services/_Interfaces/ILuaCsInfoProvider.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/_Services/_Interfaces/ILuaCsInfoProvider.cs @@ -15,6 +15,11 @@ public interface ILuaCsInfoProvider : IService /// public bool HideUserNamesInLogs { get; } + /// + /// Whether file system caching is enabled. + /// + public bool UseCaching { get; } + /// /// The current state of the Execution State Machine. /// diff --git a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/_Services/_Interfaces/ILuaScriptManagementService.cs b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/_Services/_Interfaces/ILuaScriptManagementService.cs index 0c8a938a2..b5ee2cfc5 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/_Services/_Interfaces/ILuaScriptManagementService.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/_Services/_Interfaces/ILuaScriptManagementService.cs @@ -21,6 +21,12 @@ public interface ILuaScriptManagementService : IReusableService FluentResults.Result DoString(string code); DynValue? CallFunctionSafe(object luaFunction, params object[] args); + /// + /// Whether to enable/disable the file system caching for lua. + /// + /// + void SetCachingPolicy(bool useCaching); + /// /// Parses and loads script sources (code) into a memory cache without executing it. /// diff --git a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/_Services/_Lua/ILuaScriptLoader.cs b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/_Services/_Lua/ILuaScriptLoader.cs index 9cb26c3d6..cca1d482d 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/_Services/_Lua/ILuaScriptLoader.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/_Services/_Lua/ILuaScriptLoader.cs @@ -9,5 +9,10 @@ namespace Barotrauma.LuaCs; public interface ILuaScriptLoader : IService, IScriptLoader, ISafeStorageValidation { void ClearCaches(); + /// + /// Whether caching is enabled/disabled. + /// + /// + void SetCachingPolicy(bool useCaching); Task)>>> CacheResourcesAsync(ImmutableArray resourceInfos); } diff --git a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/_Services/_Lua/LuaScriptLoader.cs b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/_Services/_Lua/LuaScriptLoader.cs index e8a3ffc75..d1b751d23 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/_Services/_Lua/LuaScriptLoader.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/_Services/_Lua/LuaScriptLoader.cs @@ -56,6 +56,20 @@ namespace Barotrauma.LuaCs _storageService?.PurgeCache(); } + public void SetCachingPolicy(bool useCaching) + { + if (_storageService is null) + { + return; + } + + if (!useCaching) + { + _storageService.PurgeCache(); + } + _storageService.UseCaching = useCaching; + } + public async Task)>>> CacheResourcesAsync(ImmutableArray resourceInfos) { IService.CheckDisposed(this);