From 67d3d5f5873eb221d113a3e1f77f3694c1ade861 Mon Sep 17 00:00:00 2001 From: Evil Factory <36804725+evilfactory@users.noreply.github.com> Date: Wed, 28 Jan 2026 23:41:23 -0300 Subject: [PATCH] Reimplementation of DoString with lua/cl_lua commands and fix Lua scripts not being loaded properly --- .../ClientSource/DebugConsole.cs | 15 ++++-------- .../ServerSource/DebugConsole.cs | 11 ++------- .../LuaCsForBarotrauma/Lua/LuaSetup.lua | 10 ++------ .../LuaCs/Lua/LuaClasses/LuaUserData.cs | 2 +- .../Services/LuaScriptManagementService.cs | 23 +++++++++++++++---- .../ILuaScriptManagementService.cs | 1 + 6 files changed, 28 insertions(+), 34 deletions(-) diff --git a/Barotrauma/BarotraumaClient/ClientSource/DebugConsole.cs b/Barotrauma/BarotraumaClient/ClientSource/DebugConsole.cs index fbd680b86..38e2bb6f7 100644 --- a/Barotrauma/BarotraumaClient/ClientSource/DebugConsole.cs +++ b/Barotrauma/BarotraumaClient/ClientSource/DebugConsole.cs @@ -4225,27 +4225,20 @@ namespace Barotrauma commands.Add(new Command("cl_lua", $"cl_lua: Runs a string on the client.", (string[] args) => { - throw new NotImplementedException(); - /*if (GameMain.Client != null && !GameMain.Client.HasPermission(ClientPermissions.ConsoleCommands)) + if (GameMain.Client != null && !GameMain.Client.HasPermission(ClientPermissions.ConsoleCommands)) { ThrowError("Command not permitted."); return; } - if (GameMain.LuaCs.Lua == null) + if (GameMain.LuaCs.CurrentRunState != RunState.Running) { ThrowError("LuaCs not initialized, use the console command cl_reloadluacs to force initialization."); return; } - try - { - GameMain.LuaCs.Lua.DoString(string.Join(" ", args)); - } - catch(Exception ex) - { - LuaCsLogger.HandleException(ex, LuaCsMessageOrigin.LuaMod); - }*/ + var result = GameMain.LuaCs.LuaScriptManagementService.DoString(string.Join(" ", args)); + GameMain.LuaCs.Logger.LogResults(result.ToResult()); })); commands.Add(new Command("cl_reloadlua|cl_reloadcs|cl_reloadluacs", "Re-initializes the LuaCs environment.", (string[] args) => diff --git a/Barotrauma/BarotraumaServer/ServerSource/DebugConsole.cs b/Barotrauma/BarotraumaServer/ServerSource/DebugConsole.cs index 555d790d3..507bacc83 100644 --- a/Barotrauma/BarotraumaServer/ServerSource/DebugConsole.cs +++ b/Barotrauma/BarotraumaServer/ServerSource/DebugConsole.cs @@ -1291,15 +1291,8 @@ namespace Barotrauma commands.Add(new Command("lua", "lua: Runs a string.", (string[] args) => { - try - { - throw new NotImplementedException(); - //GameMain.LuaCs.Lua.DoString(string.Join(" ", args)); - } - catch (Exception ex) - { - LuaCsLogger.HandleException(ex, LuaCsMessageOrigin.LuaMod); - } + var result = GameMain.LuaCs.LuaScriptManagementService.DoString(string.Join(" ", args)); + GameMain.LuaCs.Logger.LogResults(result.ToResult()); })); commands.Add(new Command("reloadlua|reloadcs|reloadluacs", "Re-initializes the LuaCs environment.", (string[] args) => diff --git a/Barotrauma/BarotraumaShared/LocalMods/LuaCsForBarotrauma/Lua/LuaSetup.lua b/Barotrauma/BarotraumaShared/LocalMods/LuaCsForBarotrauma/Lua/LuaSetup.lua index f324b3f7b..4b038464e 100644 --- a/Barotrauma/BarotraumaShared/LocalMods/LuaCsForBarotrauma/Lua/LuaSetup.lua +++ b/Barotrauma/BarotraumaShared/LocalMods/LuaCsForBarotrauma/Lua/LuaSetup.lua @@ -1,6 +1,6 @@ LuaSetup = {} -local path, resourcesToExecute = ... +local path = ... package.path = {path .. "/Lua/?.lua"} @@ -42,10 +42,4 @@ require("DefaultLib/Utils/SteamApi") require("PostSetup") -LuaSetup = nil - -for resource in resourcesToExecute do - for path in resource.FilePaths do - dofile(path) - end -end \ No newline at end of file +LuaSetup = nil \ No newline at end of file diff --git a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Lua/LuaClasses/LuaUserData.cs b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Lua/LuaClasses/LuaUserData.cs index 0918ff9a6..1cd7fccc2 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Lua/LuaClasses/LuaUserData.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Lua/LuaClasses/LuaUserData.cs @@ -11,7 +11,7 @@ namespace Barotrauma internal class LuaUserData { [Obsolete("Use IPluginManagementService::GetTypesByName()")] - public static Type GetType(string typeName) => GameMain.LuaCs.PluginManagementService.GetType(typeName); //LuaCsSetup.GetType(typeName); + public static Type GetType(string typeName) => GameMain.LuaCs.PluginManagementService.GetType(typeName, includeInterfaces: true); //LuaCsSetup.GetType(typeName); public static IUserDataDescriptor RegisterType(string typeName) { diff --git a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Services/LuaScriptManagementService.cs b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Services/LuaScriptManagementService.cs index 33c0eb915..958ab5365 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Services/LuaScriptManagementService.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Services/LuaScriptManagementService.cs @@ -99,6 +99,22 @@ class LuaScriptManagementService : ILuaScriptManagementService, ILuaDataService return new FluentResults.Result().WithReasons(cacheRes.Value.SelectMany(cr => cr.Item2.Reasons)); } + public FluentResults.Result DoString(string code) + { + IService.CheckDisposed(this); + if (_script == null || !IsRunning) { throw new Exception("Disposed"); } + + try + { + var result = _script.DoString(code); + return FluentResults.Result.Ok(result); + } + catch (Exception ex) + { + return FluentResults.Result.Fail(new ExceptionalError(ex)); + } + } + private DynValue DoFile(string file, Table? globalContext = null, string? codeStringFriendly = null) { if (_script == null) @@ -205,16 +221,13 @@ class LuaScriptManagementService : ILuaScriptManagementService, ILuaDataService var result = FluentResults.Result.Ok(); - List initializationScripts = executionOrder.Where(x => x.OwnerPackage.Name == "LuaCsForBarotrauma").ToList(); - List otherScripts = executionOrder.Except(initializationScripts).ToList(); - - foreach (ILuaScriptResourceInfo resource in initializationScripts) + foreach (ILuaScriptResourceInfo resource in executionOrder.Where(l => l.IsAutorun)) { foreach (ContentPath filePath in resource.FilePaths) { try { - _script?.Call(_script.LoadFile(filePath.FullPath), Path.GetDirectoryName(resource.OwnerPackage.Path), otherScripts.ToList()); + _script?.Call(_script.LoadFile(filePath.FullPath), Path.GetDirectoryName(resource.OwnerPackage.Path)); } catch(Exception e) { diff --git a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Services/_Interfaces/ILuaScriptManagementService.cs b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Services/_Interfaces/ILuaScriptManagementService.cs index 4ca8ea401..f53cee1ed 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Services/_Interfaces/ILuaScriptManagementService.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/Services/_Interfaces/ILuaScriptManagementService.cs @@ -17,6 +17,7 @@ public interface ILuaScriptManagementService : IReusableService #region Script_Ops object? GetGlobalTableValue(string tableName); + FluentResults.Result DoString(string code); /// /// Parses and loads script sources (code) into a memory cache without executing it.