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);