diff --git a/Barotrauma/BarotraumaShared/LocalMods/LuaCsForBarotrauma/Lua/LuaSetup.lua b/Barotrauma/BarotraumaShared/LocalMods/LuaCsForBarotrauma/Lua/LuaSetup.lua index f83071229..08e139173 100644 --- a/Barotrauma/BarotraumaShared/LocalMods/LuaCsForBarotrauma/Lua/LuaSetup.lua +++ b/Barotrauma/BarotraumaShared/LocalMods/LuaCsForBarotrauma/Lua/LuaSetup.lua @@ -35,44 +35,4 @@ if not CSActive then end end -if SERVER then - Networking.Receive("_luastart", function (message, client) - local num = message.ReadUInt16() - - local packages = {} - - for i = 1, num, 1 do - table.insert(packages, { - Name = message.ReadString(), - Version = message.ReadString(), - Id = message.ReadUInt64(), - Hash = message.ReadString() - }) - end - - Hook.Call("client.packages", client, packages) - end) -elseif Game.IsMultiplayer then - local message = Networking.Start("_luastart") - - local packageCount = 0 - for package in ContentPackageManager.EnabledPackages.All do packageCount = packageCount + 1 end - - message.WriteUInt16(packageCount) - - for package in ContentPackageManager.EnabledPackages.All do - local id = package.UgcId - local hash = package.Hash and package.Hash.StringRepresentation or "" - - if id == nil then id = 0 end - - message.WriteString(package.Name) - message.WriteString(package.ModVersion) - message.WriteUInt64(UInt64(id)) - message.WriteString(hash) - end - - Networking.Send(message) -end - LuaSetup = nil \ No newline at end of file diff --git a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/_Services/LuaScriptManagementService.cs b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/_Services/LuaScriptManagementService.cs index 45ace162c..99032700d 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/_Services/LuaScriptManagementService.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/_Services/LuaScriptManagementService.cs @@ -1,27 +1,19 @@ #nullable enable -using Barotrauma.LuaCs; using Barotrauma.LuaCs.Compatibility; using Barotrauma.LuaCs.Data; using Barotrauma.LuaCs.Events; using Barotrauma.Networking; using FluentResults; using Microsoft.CodeAnalysis; -using Microsoft.CodeAnalysis.CSharp.Syntax; using Microsoft.Toolkit.Diagnostics; -using MonoMod.RuntimeDetour; using MoonSharp.Interpreter; using MoonSharp.Interpreter.Interop; -using MoonSharp.Interpreter.Loaders; -using RestSharp.Validation; using System; -using System.Collections; -using System.Collections.Concurrent; using System.Collections.Generic; using System.Collections.Immutable; using System.Diagnostics; using System.Diagnostics.CodeAnalysis; -using System.IO; using System.Linq; using System.Reflection; using System.Threading.Tasks; @@ -522,6 +514,61 @@ class LuaScriptManagementService : ILuaScriptManagementService, ILuaDataService, Table package = (Table)_script.Globals["package"]; package.Set("path", DynValue.FromObject(_script, packages)); +#if CLIENT + if (GameMain.NetworkMember is { IsClient: true }) + { + var startMessage = _networkingService.Start("_luastart"); + + var packagesToReport = ContentPackageManager.EnabledPackages.All + .Where(p => _packageManagementService.Value.PackageContainsAnyRunnableResource(p)) + .Where(p => !p.NameMatches(LuaCsSetup.PackageName)) + .ToList(); + + startMessage.WriteUInt16((UInt16)packagesToReport.Count()); + + foreach (var enabledPackage in packagesToReport) + { + var id = enabledPackage.UgcId; + string hash = enabledPackage.Hash.StringRepresentation ?? ""; + + startMessage.WriteString(enabledPackage.Name); + startMessage.WriteString(enabledPackage.ModVersion); + if (id.TryUnwrap(out ContentPackageId? packageId) && packageId is SteamWorkshopId steamId) + { + startMessage.WriteUInt64(steamId.Value); + } + else + { + startMessage.WriteUInt64(0); + } + startMessage.WriteString(hash); + } + + _networkingService.Send(startMessage); + } +#elif SERVER + _networkingService.Receive("_luastart", (message, client) => + { + var num = message.ReadUInt16(); + List packages = new List
(); + + for (int i = 0; i < num; i++) + { + Table table = new Table(_script); + + table.Set("Name", DynValue.NewString(message.ReadString())); + table.Set("Version", DynValue.NewString(message.ReadString())); + table.Set("Id", DynValue.NewString(message.ReadUInt64().ToString())); + table.Set("Hash", DynValue.NewString(message.ReadString())); + + packages.Add(table); + } + + _eventService.Call("client.packages", client, packages); + }); +#endif + + foreach (ILuaScriptResourceInfo resource in executionOrder.Where(l => l.IsAutorun)) { foreach (ContentPath filePath in resource.FilePaths) diff --git a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/_Services/PackageManagementService.cs b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/_Services/PackageManagementService.cs index 6dfe834db..14b0d141f 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/_Services/PackageManagementService.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/_Services/PackageManagementService.cs @@ -525,4 +525,34 @@ public sealed class PackageManagementService : IPackageManagementService .Where(cfg => !cfg.Assemblies.IsDefaultOrEmpty || cfg.LuaScripts.Any(scr => scr.RunUnrestricted)) .Select(cfg => cfg.Package)]; } + + public bool PackageContainsAnyRunnableResource(ContentPackage package) + { + using var lck = _operationsLock.AcquireReaderLock().ConfigureAwait(false).GetAwaiter().GetResult(); + IService.CheckDisposed(this); + + var result = GetModConfigForPackage(package); + + if (result.IsSuccess) + { + return result.Value.Assemblies.Any() || result.Value.LuaScripts.Any(); + } + else + { + return false; + } + } + + public Result GetModConfigForPackage(ContentPackage package) + { + using var lck = _operationsLock.AcquireReaderLock().ConfigureAwait(false).GetAwaiter().GetResult(); + IService.CheckDisposed(this); + + if (!_loadedPackages.TryGetValue(package, out var modConfig)) + { + return FluentResults.Result.Fail($"Failed to find mod config for package {package.Name}"); + } + + return new FluentResults.Result().WithValue(modConfig); + } } diff --git a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/_Services/_Interfaces/IPackageManagementService.cs b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/_Services/_Interfaces/IPackageManagementService.cs index f3aa64159..568e66078 100644 --- a/Barotrauma/BarotraumaShared/SharedSource/LuaCs/_Services/_Interfaces/IPackageManagementService.cs +++ b/Barotrauma/BarotraumaShared/SharedSource/LuaCs/_Services/_Interfaces/IPackageManagementService.cs @@ -26,4 +26,6 @@ public interface IPackageManagementService : IReusableService public bool IsPackageRunning(ContentPackage package); public bool IsAnyPackageLoaded(); public bool IsAnyPackageRunning(); + public bool PackageContainsAnyRunnableResource(ContentPackage package); + public Result GetModConfigForPackage(ContentPackage package); }