diff --git a/Barotrauma/BarotraumaClient/ClientSource/DebugConsole.cs b/Barotrauma/BarotraumaClient/ClientSource/DebugConsole.cs
index 0b244c837..d3196f5ab 100644
--- a/Barotrauma/BarotraumaClient/ClientSource/DebugConsole.cs
+++ b/Barotrauma/BarotraumaClient/ClientSource/DebugConsole.cs
@@ -3278,7 +3278,7 @@ namespace Barotrauma
const string CMD_CL_CS = "cl_cs";
commands.Add(new Command(CMD_CL_CS, $"{CMD_CL_CS}: runs a string on the client", (string[] args) =>
{
- if (LuaCsSetup.GetPackage("CsForBarotrauma", false, true) == null) { return; }
+ if (LuaCsSetup.GetPackage(LuaCsSetup.CsForBarotraumaId, false, true) == null) { return; }
if (GameMain.Client != null && !GameMain.Client.HasPermission(ClientPermissions.ConsoleCommands))
{
diff --git a/Barotrauma/BarotraumaClient/ClientSource/LuaCs/LuaCsInstaller.cs b/Barotrauma/BarotraumaClient/ClientSource/LuaCs/LuaCsInstaller.cs
index 9d27c91a1..44b8ffc59 100644
--- a/Barotrauma/BarotraumaClient/ClientSource/LuaCs/LuaCsInstaller.cs
+++ b/Barotrauma/BarotraumaClient/ClientSource/LuaCs/LuaCsInstaller.cs
@@ -59,7 +59,7 @@ namespace Barotrauma
{
if (!File.Exists(LuaCsSetup.VersionFile)) { return; }
- ContentPackage luaPackage = LuaCsSetup.GetPackage("Lua For Barotrauma");
+ ContentPackage luaPackage = LuaCsSetup.GetPackage(LuaCsSetup.LuaForBarotraumaId);
string luaCsPath = Path.GetDirectoryName(luaPackage.Path);
if (luaPackage == null) { return; }
@@ -69,7 +69,7 @@ namespace Barotrauma
if (clientVersion == workshopVersion) { return; }
- string additional = LuaCsSetup.GetPackage("CsForBarotrauma", false, true) == null ? "" : "Cs";
+ string additional = LuaCsSetup.GetPackage(LuaCsSetup.CsForBarotraumaId, false, true) == null ? "" : "Cs";
var msg = new GUIMessageBox($"Lua{additional} Update", $"Your Lua{additional} client version is different from the version found in the Lua{additional}ForBarotrauma workshop files. Do you want to update?\n\n Client Version: {clientVersion}\n Workshop Version: {workshopVersion}",
new LocalizedString[2] { TextManager.Get("Yes"), TextManager.Get("Cancel") });
diff --git a/Barotrauma/BarotraumaClient/ClientSource/Screens/MainMenuScreen.cs b/Barotrauma/BarotraumaClient/ClientSource/Screens/MainMenuScreen.cs
index c2d8b96d1..b3fb9c5ec 100644
--- a/Barotrauma/BarotraumaClient/ClientSource/Screens/MainMenuScreen.cs
+++ b/Barotrauma/BarotraumaClient/ClientSource/Screens/MainMenuScreen.cs
@@ -400,7 +400,7 @@ namespace Barotrauma
}
};
#endif
- string additional = LuaCsSetup.GetPackage("CsForBarotrauma", false, true) == null ? "" : "Cs";
+ string additional = LuaCsSetup.GetPackage(LuaCsSetup.CsForBarotraumaId, false, true) == null ? "" : "Cs";
new GUIButton(new RectTransform(new Point(300, 30), Frame.RectTransform, Anchor.TopLeft) { AbsoluteOffset = new Point(20, 50) },
$"Remove Client-Side Lua{additional}", style: "MainMenuGUIButton", color: GUIStyle.Red)
diff --git a/Barotrauma/BarotraumaServer/ServerSource/DebugConsole.cs b/Barotrauma/BarotraumaServer/ServerSource/DebugConsole.cs
index 319f9ffd3..60e5531dc 100644
--- a/Barotrauma/BarotraumaServer/ServerSource/DebugConsole.cs
+++ b/Barotrauma/BarotraumaServer/ServerSource/DebugConsole.cs
@@ -1264,7 +1264,7 @@ namespace Barotrauma
}));
commands.Add(new Command("cs", "cs: Runs a string", (string[] args) =>
{
- if (LuaCsSetup.GetPackage("CsForBarotrauma", false, true) == null) { return; }
+ if (LuaCsSetup.GetPackage(LuaCsSetup.CsForBarotraumaId, false, true) == null) { return; }
GameMain.LuaCs.CsScript.Run(string.Join(" ", args));
GameMain.LuaCs.RecreateCsScript();
diff --git a/Barotrauma/BarotraumaServer/ServerSource/LuaCs/LuaCsInstaller.cs b/Barotrauma/BarotraumaServer/ServerSource/LuaCs/LuaCsInstaller.cs
index 6bc770e15..a0c51daff 100644
--- a/Barotrauma/BarotraumaServer/ServerSource/LuaCs/LuaCsInstaller.cs
+++ b/Barotrauma/BarotraumaServer/ServerSource/LuaCs/LuaCsInstaller.cs
@@ -9,7 +9,7 @@ namespace Barotrauma
{
public static void Install()
{
- ContentPackage luaPackage = LuaCsSetup.GetPackage("Lua For Barotrauma");
+ ContentPackage luaPackage = LuaCsSetup.GetPackage(LuaCsSetup.LuaForBarotraumaId);
if (luaPackage == null)
{
diff --git a/Barotrauma/BarotraumaShared/Lua/LuaSetup.lua b/Barotrauma/BarotraumaShared/Lua/LuaSetup.lua
index 46dcbe2e3..b19c0e3ad 100644
--- a/Barotrauma/BarotraumaShared/Lua/LuaSetup.lua
+++ b/Barotrauma/BarotraumaShared/Lua/LuaSetup.lua
@@ -38,6 +38,20 @@ require("DefaultHook")
Descriptors = LuaSetup.LuaUserData.Descriptors
LuaUserData = LuaSetup.LuaUserData
+if CSActive then
+ LuaUserData.RegisterType = function (typeName)
+ local descriptor = Descriptors[typeName]
+
+ print(typeName)
+
+ if descriptor == nil then
+ error("Type '" .. typeName .. "' can't be registered", 2)
+ else
+ return descriptor
+ end
+ end
+end
+
LuaSetup = nil
require("ModLoader")
\ No newline at end of file
diff --git a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsHook.cs b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsHook.cs
index d28988a60..2944a2d93 100644
--- a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsHook.cs
+++ b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsHook.cs
@@ -516,7 +516,7 @@ namespace Barotrauma
{
"Barotrauma.Lua",
"Barotrauma.Cs",
- "ContentPackageManager",
+ "Barotrauma.ContentPackageManager",
};
private static void ValidatePatchTarget(MethodBase method)
diff --git a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsSetup.cs b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsSetup.cs
index 29ff74305..e2beb9b4a 100644
--- a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsSetup.cs
+++ b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/LuaCsSetup.cs
@@ -1,4 +1,4 @@
-using System;
+using System;
using System.Collections.Generic;
using System.Text;
using System.IO;
@@ -18,12 +18,12 @@ using LuaCsCompatPatchFunc = Barotrauma.LuaCsPatch;
[assembly: InternalsVisibleTo(Barotrauma.CsScriptBase.CsOneTimeScriptAssembly, AllInternalsVisible = true)]
namespace Barotrauma
{
- class LuaCsSetupConfig
+ class LuaCsSetupConfig
{
- public bool FirstTimeCsWarning = true;
+ public bool FirstTimeCsWarning = true;
- public LuaCsSetupConfig() { }
- }
+ public LuaCsSetupConfig() { }
+ }
internal delegate void LuaCsMessageLogger(string prefix, object o);
@@ -37,120 +37,123 @@ namespace Barotrauma
CSharpMod,
}
- partial class LuaCsSetup
- {
- public const string LuaSetupFile = "Lua/LuaSetup.lua";
- public const string VersionFile = "luacsversion.txt";
+ partial class LuaCsSetup
+ {
+ public const string LuaSetupFile = "Lua/LuaSetup.lua";
+ public const string VersionFile = "luacsversion.txt";
+ public static ContentPackageId LuaForBarotraumaId = new SteamWorkshopId(2559634234);
+ public static ContentPackageId CsForBarotraumaId = new SteamWorkshopId(2795927223);
- private const string configFileName = "LuaCsSetupConfig.xml";
+
+ private const string configFileName = "LuaCsSetupConfig.xml";
#if SERVER
- public const bool IsServer = true;
- public const bool IsClient = false;
+ public const bool IsServer = true;
+ public const bool IsClient = false;
#else
- public const bool IsServer = false;
- public const bool IsClient = true;
+ public const bool IsServer = false;
+ public const bool IsClient = true;
#endif
- private static int executionNumber = 0;
+ private static int executionNumber = 0;
- private Script lua;
- public Script Lua
+ private Script lua;
+ public Script Lua
{
get { return lua; }
}
- public CsScriptRunner CsScript { get; private set; }
+ public CsScriptRunner CsScript { get; private set; }
- ///
- /// due to there's a race on the process and the unloaded AssemblyLoadContexts,
- /// should recreate runner after the script runs
- ///
- public void RecreateCsScript()
+ ///
+ /// due to there's a race on the process and the unloaded AssemblyLoadContexts,
+ /// should recreate runner after the script runs
+ ///
+ public void RecreateCsScript()
{
- CsScript = new CsScriptRunner(CsScript.setup);
- lua.Globals["CsScript"] = CsScript;
- }
+ CsScript = new CsScriptRunner(CsScript.setup);
+ lua.Globals["CsScript"] = CsScript;
+ }
- public LuaScriptLoader LuaScriptLoader { get; private set; }
+ public LuaScriptLoader LuaScriptLoader { get; private set; }
- public LuaGame Game { get; private set; }
- public LuaCsHook Hook { get; private set; }
- public LuaCsTimer Timer { get; private set; }
- public LuaCsNetworking Networking { get; private set; }
- public LuaCsSteam Steam { get; private set; }
- public LuaCsPerformanceCounter PerformanceCounter { get; private set; }
+ public LuaGame Game { get; private set; }
+ public LuaCsHook Hook { get; private set; }
+ public LuaCsTimer Timer { get; private set; }
+ public LuaCsNetworking Networking { get; private set; }
+ public LuaCsSteam Steam { get; private set; }
+ public LuaCsPerformanceCounter PerformanceCounter { get; private set; }
- public LuaCsModStore ModStore { get; private set; }
- private LuaRequire require { get; set; }
+ public LuaCsModStore ModStore { get; private set; }
+ private LuaRequire require { get; set; }
- public CsScriptLoader CsScriptLoader { get; private set; }
- public LuaCsSetupConfig Config { get; private set; }
+ public CsScriptLoader CsScriptLoader { get; private set; }
+ public LuaCsSetupConfig Config { get; private set; }
- public LuaCsSetup()
- {
+ public LuaCsSetup()
+ {
MessageLogger = DefaultMessageLogger;
- ExceptionHandler = DefaultExceptionHandler;
+ ExceptionHandler = DefaultExceptionHandler;
Hook = new LuaCsHook(this);
- ModStore = new LuaCsModStore();
+ ModStore = new LuaCsModStore();
- Game = new LuaGame();
- Networking = new LuaCsNetworking();
- }
+ Game = new LuaGame();
+ Networking = new LuaCsNetworking();
+ }
- public void UpdateConfig()
+ public void UpdateConfig()
{
- FileStream file;
- if (!File.Exists(configFileName)) file = File.Create(configFileName);
- else file = File.Open(configFileName, FileMode.Truncate, FileAccess.Write);
- LuaCsConfig.Save(file, Config);
- file.Close();
- }
+ FileStream file;
+ if (!File.Exists(configFileName)) file = File.Create(configFileName);
+ else file = File.Open(configFileName, FileMode.Truncate, FileAccess.Write);
+ LuaCsConfig.Save(file, Config);
+ file.Close();
+ }
- public static ContentPackage GetPackage(Identifier name, bool fallbackToAll = true, bool useBackup = false)
- {
- foreach (ContentPackage package in ContentPackageManager.EnabledPackages.All)
- {
- if (package.NameMatches(name))
- {
- return package;
- }
- }
-
- if (fallbackToAll)
- {
- foreach (ContentPackage package in ContentPackageManager.LocalPackages)
- {
- if (package.NameMatches(name))
- {
- return package;
- }
- }
-
- foreach (ContentPackage package in ContentPackageManager.AllPackages)
- {
- if (package.NameMatches(name))
- {
- return package;
- }
- }
- }
-
- if (useBackup && ContentPackageManager.EnabledPackages.BackupPackages.Regular != null)
+ public static ContentPackage GetPackage(ContentPackageId id, bool fallbackToAll = true, bool useBackup = false)
+ {
+ foreach (ContentPackage package in ContentPackageManager.EnabledPackages.All)
{
- foreach (ContentPackage package in ContentPackageManager.EnabledPackages.BackupPackages.Regular.Value)
- {
- if (package.NameMatches(name))
- {
- return package;
- }
- }
- }
+ if (package.UgcId.ValueEquals(id))
+ {
+ return package;
+ }
+ }
- return null;
- }
+ if (fallbackToAll)
+ {
+ foreach (ContentPackage package in ContentPackageManager.LocalPackages)
+ {
+ if (package.UgcId.ValueEquals(id))
+ {
+ return package;
+ }
+ }
+
+ foreach (ContentPackage package in ContentPackageManager.AllPackages)
+ {
+ if (package.UgcId.ValueEquals(id))
+ {
+ return package;
+ }
+ }
+ }
+
+ if (useBackup && ContentPackageManager.EnabledPackages.BackupPackages.Regular != null)
+ {
+ foreach (ContentPackage package in ContentPackageManager.EnabledPackages.BackupPackages.Regular.Value)
+ {
+ if (package.UgcId.ValueEquals(id))
+ {
+ return package;
+ }
+ }
+ }
+
+ return null;
+ }
private void DefaultExceptionHandler(Exception ex, LuaCsMessageOrigin origin)
{
@@ -288,271 +291,271 @@ namespace Barotrauma
// TODO: deprecate this (in an effort to get rid of as much global state as possible)
public static void PrintCsMessage(object message) => GameMain.LuaCs.PrintMessage(message);
- private DynValue DoFile(string file, Table globalContext = null, string codeStringFriendly = null)
- {
- if (!LuaCsFile.CanReadFromPath(file))
- {
- throw new ScriptRuntimeException($"dofile: File access to {file} not allowed.");
- }
-
- if (!LuaCsFile.Exists(file))
- {
- throw new ScriptRuntimeException($"dofile: File {file} not found.");
- }
-
- return lua.DoFile(file, globalContext, codeStringFriendly);
- }
-
- private DynValue LoadFile(string file, Table globalContext = null, string codeStringFriendly = null)
- {
- if (!LuaCsFile.CanReadFromPath(file))
+ private DynValue DoFile(string file, Table globalContext = null, string codeStringFriendly = null)
+ {
+ if (!LuaCsFile.CanReadFromPath(file))
{
- throw new ScriptRuntimeException($"loadfile: File access to {file} not allowed.");
- }
+ throw new ScriptRuntimeException($"dofile: File access to {file} not allowed.");
+ }
- if (!LuaCsFile.Exists(file))
- {
- throw new ScriptRuntimeException($"loadfile: File {file} not found.");
- }
+ if (!LuaCsFile.Exists(file))
+ {
+ throw new ScriptRuntimeException($"dofile: File {file} not found.");
+ }
- return lua.LoadFile(file, globalContext, codeStringFriendly);
- }
+ return lua.DoFile(file, globalContext, codeStringFriendly);
+ }
- public DynValue CallLuaFunction(object function, params object[] args)
- {
+ private DynValue LoadFile(string file, Table globalContext = null, string codeStringFriendly = null)
+ {
+ if (!LuaCsFile.CanReadFromPath(file))
+ {
+ throw new ScriptRuntimeException($"loadfile: File access to {file} not allowed.");
+ }
+
+ if (!LuaCsFile.Exists(file))
+ {
+ throw new ScriptRuntimeException($"loadfile: File {file} not found.");
+ }
+
+ return lua.LoadFile(file, globalContext, codeStringFriendly);
+ }
+
+ public DynValue CallLuaFunction(object function, params object[] args)
+ {
// XXX: `lua` might be null if `LuaCsSetup.Stop()` is called while
// a patched function is still running.
if (lua == null) return null;
- lock (lua)
- {
- try
- {
- return lua.Call(function, args);
- }
- catch (Exception e)
- {
- HandleException(e, LuaCsMessageOrigin.LuaMod);
- }
- return null;
- }
- }
+ lock (lua)
+ {
+ try
+ {
+ return lua.Call(function, args);
+ }
+ catch (Exception e)
+ {
+ HandleException(e, LuaCsMessageOrigin.LuaMod);
+ }
+ return null;
+ }
+ }
- private void SetModulePaths(string[] str)
- {
- LuaScriptLoader.ModulePaths = str;
- }
+ private void SetModulePaths(string[] str)
+ {
+ LuaScriptLoader.ModulePaths = str;
+ }
- public void Update()
- {
- Hook?.Update();
- Timer?.Update();
- Steam?.Update();
- }
+ public void Update()
+ {
+ Hook?.Update();
+ Timer?.Update();
+ Steam?.Update();
+ }
- public void Stop()
- {
- foreach (var type in AppDomain.CurrentDomain.GetAssemblies().Where(a => a.GetName().Name == CsScriptBase.CsScriptAssembly).SelectMany(assembly => assembly.GetTypes()))
- {
- UserData.UnregisterType(type, true);
- }
+ public void Stop()
+ {
+ foreach (var type in AppDomain.CurrentDomain.GetAssemblies().Where(a => a.GetName().Name == CsScriptBase.CsScriptAssembly).SelectMany(assembly => assembly.GetTypes()))
+ {
+ UserData.UnregisterType(type, true);
+ }
- foreach (var mod in ACsMod.LoadedMods.ToArray())
- {
- mod.Dispose();
- }
-
- ACsMod.LoadedMods.Clear();
+ foreach (var mod in ACsMod.LoadedMods.ToArray())
+ {
+ mod.Dispose();
+ }
+
+ ACsMod.LoadedMods.Clear();
- if (Thread.CurrentThread == GameMain.MainThread)
- {
- Hook?.Call("stop");
- }
+ if (Thread.CurrentThread == GameMain.MainThread)
+ {
+ Hook?.Call("stop");
+ }
- Game?.Stop();
+ Game?.Stop();
- Hook.Clear();
- ModStore.Clear();
- Game = new LuaGame();
- Networking = new LuaCsNetworking();
- Timer = new LuaCsTimer();
- Steam = new LuaCsSteam();
- PerformanceCounter = new LuaCsPerformanceCounter();
- LuaScriptLoader = null;
- lua = null;
- CsScript = null;
- Config = null;
+ Hook.Clear();
+ ModStore.Clear();
+ Game = new LuaGame();
+ Networking = new LuaCsNetworking();
+ Timer = new LuaCsTimer();
+ Steam = new LuaCsSteam();
+ PerformanceCounter = new LuaCsPerformanceCounter();
+ LuaScriptLoader = null;
+ lua = null;
+ CsScript = null;
+ Config = null;
if (CsScriptLoader != null)
- {
- CsScriptLoader.Clear();
- CsScriptLoader.Unload();
- CsScriptLoader = null;
- }
- }
+ {
+ CsScriptLoader.Clear();
+ CsScriptLoader.Unload();
+ CsScriptLoader = null;
+ }
+ }
- public void Initialize()
- {
- Stop();
+ public void Initialize()
+ {
+ Stop();
- PrintMessage("Lua! Version " + AssemblyInfo.GitRevision);
+ PrintMessage("Lua! Version " + AssemblyInfo.GitRevision);
- if (File.Exists(configFileName))
- {
- using (var file = File.Open(configFileName, FileMode.Open, FileAccess.Read))
- Config = LuaCsConfig.Load(file);
- }
- else
- {
- Config = new LuaCsSetupConfig();
- }
+ if (File.Exists(configFileName))
+ {
+ using (var file = File.Open(configFileName, FileMode.Open, FileAccess.Read))
+ Config = LuaCsConfig.Load(file);
+ }
+ else
+ {
+ Config = new LuaCsSetupConfig();
+ }
- bool csActive = GetPackage("CsForBarotrauma", false, true) != null;
+ bool csActive = GetPackage(CsForBarotraumaId, false, true) != null;
- LuaScriptLoader = new LuaScriptLoader();
- LuaScriptLoader.ModulePaths = new string[] { };
+ LuaScriptLoader = new LuaScriptLoader();
+ LuaScriptLoader.ModulePaths = new string[] { };
RegisterLuaConverters();
- lua = new Script(CoreModules.Preset_SoftSandbox | CoreModules.Debug);
- lua.Options.DebugPrint = PrintMessage;
- lua.Options.ScriptLoader = LuaScriptLoader;
- lua.Options.CheckThreadAccess = false;
- CsScript = new CsScriptRunner(this);
+ lua = new Script(CoreModules.Preset_SoftSandbox | CoreModules.Debug);
+ lua.Options.DebugPrint = PrintMessage;
+ lua.Options.ScriptLoader = LuaScriptLoader;
+ lua.Options.CheckThreadAccess = false;
+ CsScript = new CsScriptRunner(this);
- require = new LuaRequire(lua);
+ require = new LuaRequire(lua);
- Game = new LuaGame();
- Networking = new LuaCsNetworking();
- Timer = new LuaCsTimer();
- Steam = new LuaCsSteam();
- PerformanceCounter = new LuaCsPerformanceCounter();
- Hook.Initialize();
- ModStore.Initialize();
+ Game = new LuaGame();
+ Networking = new LuaCsNetworking();
+ Timer = new LuaCsTimer();
+ Steam = new LuaCsSteam();
+ PerformanceCounter = new LuaCsPerformanceCounter();
+ Hook.Initialize();
+ ModStore.Initialize();
- UserData.RegisterType();
- UserData.RegisterType();
- UserData.RegisterType();
- UserData.RegisterType();
- UserData.RegisterType();
- UserData.RegisterType();
- UserData.RegisterType();
- UserData.RegisterType();
- UserData.RegisterType();
- UserData.RegisterType();
- UserData.RegisterType();
- UserData.RegisterType();
- UserData.RegisterType();
- UserData.RegisterType();
- UserData.RegisterType();
+ UserData.RegisterType();
+ UserData.RegisterType();
+ UserData.RegisterType();
+ UserData.RegisterType();
+ UserData.RegisterType();
+ UserData.RegisterType();
+ UserData.RegisterType();
+ UserData.RegisterType();
+ UserData.RegisterType();
+ UserData.RegisterType();
+ UserData.RegisterType();
+ UserData.RegisterType();
+ UserData.RegisterType();
+ UserData.RegisterType();
+ UserData.RegisterType();
- lua.Globals["printerror"] = (Action