From 4434107cb161e9b7137215b6be80dc5998ce93ab Mon Sep 17 00:00:00 2001 From: wixoa Date: Sat, 30 Dec 2023 18:13:47 -0500 Subject: [PATCH] ACZ fixes and RT v198.1.0 (#1578) * ACZ fixes (#1573) * Fix packaging * Fix ACZ root path being wrong if using relative JSON path The JSON path is relative to the original working directory of the file. However the server switches working directory during initialization of DreamResourceManager, which invalidates the old path. This old path was still passed to ACZ, so using a relative JSON path would make ACZ unable to find rsc files. The path is now turned absolute before the working directory switch occurs. * Add Full Hybrid ACZ provider. This permits rsc resources to be combined with the Content.Client.zip Hybrid ACZ. Also update RT * Update OpenDreamPackaging/DreamPackaging.cs --------- Co-authored-by: wixoa (cherry picked from commit 173ca011fdc4e0725ae00303746466220579d7e4) * Update RT to v198.1.0 * Use file-scoped namespaces --------- Co-authored-by: Pieter-Jan Briers --- .../Rendering/ClientScreenOverlaySystem.cs | 38 ++++++++-------- OpenDreamPackaging/DreamPackaging.cs | 17 +++++--- OpenDreamRuntime/DreamAczProvider.cs | 43 +++++++++++++++++++ OpenDreamRuntime/DreamMagicAczProvider.cs | 26 ----------- OpenDreamRuntime/DreamManager.cs | 8 ++-- OpenDreamRuntime/EntryPoint.cs | 4 -- .../Rendering/ServerScreenOverlaySystem.cs | 41 ++++++------------ RobustToolbox | 2 +- 8 files changed, 92 insertions(+), 87 deletions(-) create mode 100644 OpenDreamRuntime/DreamAczProvider.cs delete mode 100644 OpenDreamRuntime/DreamMagicAczProvider.cs diff --git a/OpenDreamClient/Rendering/ClientScreenOverlaySystem.cs b/OpenDreamClient/Rendering/ClientScreenOverlaySystem.cs index 5a2bd05319..64dbfd85a5 100644 --- a/OpenDreamClient/Rendering/ClientScreenOverlaySystem.cs +++ b/OpenDreamClient/Rendering/ClientScreenOverlaySystem.cs @@ -1,28 +1,28 @@ using OpenDreamShared.Rendering; -namespace OpenDreamClient.Rendering { - sealed class ClientScreenOverlaySystem : SharedScreenOverlaySystem { - public HashSet ScreenObjects = new(); +namespace OpenDreamClient.Rendering; - [Dependency] private IEntityManager _entityManager = default!; +internal sealed class ClientScreenOverlaySystem : SharedScreenOverlaySystem { + public HashSet ScreenObjects = new(); - public override void Initialize() { - SubscribeNetworkEvent(OnAddScreenObject); - SubscribeNetworkEvent(OnRemoveScreenObject); - } + [Dependency] private readonly IEntityManager _entityManager = default!; - public override void Shutdown() { - ScreenObjects.Clear(); - } + public override void Initialize() { + SubscribeNetworkEvent(OnAddScreenObject); + SubscribeNetworkEvent(OnRemoveScreenObject); + } + + public override void Shutdown() { + ScreenObjects.Clear(); + } - private void OnAddScreenObject(AddScreenObjectEvent e) { - EntityUid ent = _entityManager.GetEntity(e.ScreenObject); - ScreenObjects.Add(ent); - } + private void OnAddScreenObject(AddScreenObjectEvent e) { + EntityUid ent = _entityManager.GetEntity(e.ScreenObject); + ScreenObjects.Add(ent); + } - private void OnRemoveScreenObject(RemoveScreenObjectEvent e) { - EntityUid ent = _entityManager.GetEntity(e.ScreenObject); - ScreenObjects.Remove(ent); - } + private void OnRemoveScreenObject(RemoveScreenObjectEvent e) { + EntityUid ent = _entityManager.GetEntity(e.ScreenObject); + ScreenObjects.Remove(ent); } } diff --git a/OpenDreamPackaging/DreamPackaging.cs b/OpenDreamPackaging/DreamPackaging.cs index 13004e1e97..e171bb0208 100644 --- a/OpenDreamPackaging/DreamPackaging.cs +++ b/OpenDreamPackaging/DreamPackaging.cs @@ -1,5 +1,6 @@ using Robust.Packaging; using Robust.Packaging.AssetProcessing; +using Robust.Packaging.AssetProcessing.Passes; namespace OpenDreamPackaging; @@ -19,13 +20,21 @@ public static async Task WriteResources( var inputPass = graph.Input; - await RobustClientPackaging.WriteClientResources( - contentDir, + await RobustSharedPackaging.WriteContentAssemblies( inputPass, - cancel); + contentDir, + "Content.Client", + new[] { "OpenDreamClient", "OpenDreamShared" }, + cancel: cancel); await RobustClientPackaging.WriteClientResources(contentDir, inputPass, cancel); + WriteRscResources(dreamRootDir, resources, inputPass); + + inputPass.InjectFinished(); + } + + public static void WriteRscResources(string dreamRootDir, string[] resources, AssetPassPipe inputPass) { for (var i = 0; i < resources.Length; i++) { var resource = resources[i].Replace('\\', Path.DirectorySeparatorChar); // The game client only knows a resource ID, so that's what we name the files. @@ -35,7 +44,5 @@ await RobustClientPackaging.WriteClientResources( inputPass.InjectFileFromDisk(path, diskPath); } - - inputPass.InjectFinished(); } } diff --git a/OpenDreamRuntime/DreamAczProvider.cs b/OpenDreamRuntime/DreamAczProvider.cs new file mode 100644 index 0000000000..c85182a556 --- /dev/null +++ b/OpenDreamRuntime/DreamAczProvider.cs @@ -0,0 +1,43 @@ +using System.Linq; +using System.Threading; +using System.Threading.Tasks; +using OpenDreamPackaging; +using Robust.Packaging; +using Robust.Packaging.AssetProcessing; +using Robust.Server.ServerStatus; + +namespace OpenDreamRuntime; + +public sealed class DreamAczProvider : IMagicAczProvider, IFullHybridAczProvider { + private readonly IDependencyCollection _dependencies; + private readonly string _rootPath; + private readonly string[] _resources; + + public DreamAczProvider(IDependencyCollection dependencies, string rootPath, string[] resources) { + _dependencies = dependencies; + _rootPath = rootPath; + _resources = resources; + } + + public async Task Package(AssetPass pass, IPackageLogger logger, CancellationToken cancel) { + var contentDir = DefaultMagicAczProvider.FindContentRootPath(_dependencies); + + await DreamPackaging.WriteResources(contentDir, _rootPath, _resources, pass, logger, cancel); + } + + public Task Package(AssetPass hybridPackageInput, AssetPass output, IPackageLogger logger, CancellationToken cancel) { + var clientAssetGraph = new RobustClientAssetGraph(); + var resourceInput = clientAssetGraph.Input; + output.AddDependency(clientAssetGraph.Output); + output.AddDependency(hybridPackageInput); + + AssetGraph.CalculateGraph( + clientAssetGraph.AllPasses.Concat(new[] { hybridPackageInput, output }).ToArray(), + logger); + + DreamPackaging.WriteRscResources(_rootPath, _resources, resourceInput); + resourceInput.InjectFinished(); + + return Task.CompletedTask; + } +} diff --git a/OpenDreamRuntime/DreamMagicAczProvider.cs b/OpenDreamRuntime/DreamMagicAczProvider.cs deleted file mode 100644 index 965f6aa8b6..0000000000 --- a/OpenDreamRuntime/DreamMagicAczProvider.cs +++ /dev/null @@ -1,26 +0,0 @@ -using System.Threading; -using System.Threading.Tasks; -using OpenDreamPackaging; -using Robust.Packaging; -using Robust.Packaging.AssetProcessing; -using Robust.Server.ServerStatus; - -namespace OpenDreamRuntime; - -public sealed class DreamMagicAczProvider : IMagicAczProvider { - private readonly IDependencyCollection _dependencies; - private readonly string _rootPath; - private readonly string[] _resources; - - public DreamMagicAczProvider(IDependencyCollection dependencies, string rootPath, string[] resources) { - _dependencies = dependencies; - _rootPath = rootPath; - _resources = resources; - } - - public async Task Package(AssetPass pass, IPackageLogger logger, CancellationToken cancel) { - var contentDir = DefaultMagicAczProvider.FindContentRootPath(_dependencies); - - await DreamPackaging.WriteResources(contentDir, _rootPath, _resources, pass, logger, cancel); - } -} diff --git a/OpenDreamRuntime/DreamManager.cs b/OpenDreamRuntime/DreamManager.cs index 5befb8d19f..7453ae3c70 100644 --- a/OpenDreamRuntime/DreamManager.cs +++ b/OpenDreamRuntime/DreamManager.cs @@ -116,7 +116,7 @@ public bool LoadJson(string? jsonPath) { } _compiledJson = json; - var rootPath = Path.GetDirectoryName(jsonPath)!; + var rootPath = Path.GetFullPath(Path.GetDirectoryName(jsonPath)!); var resources = _compiledJson.Resources ?? Array.Empty(); _dreamResourceManager.Initialize(rootPath, resources); if(!string.IsNullOrEmpty(_compiledJson.Interface) && !_dreamResourceManager.DoesFileExist(_compiledJson.Interface)) @@ -146,9 +146,9 @@ public bool LoadJson(string? jsonPath) { _dreamMapManager.LoadMaps(_compiledJson.Maps); - _statusHost.SetMagicAczProvider(new DreamMagicAczProvider( - _dependencyCollection, rootPath, resources - )); + var aczProvider = new DreamAczProvider(_dependencyCollection, rootPath, resources); + _statusHost.SetMagicAczProvider(aczProvider); + _statusHost.SetFullHybridAczProvider(aczProvider); return true; } diff --git a/OpenDreamRuntime/EntryPoint.cs b/OpenDreamRuntime/EntryPoint.cs index 6f962e645e..6a54f0db18 100644 --- a/OpenDreamRuntime/EntryPoint.cs +++ b/OpenDreamRuntime/EntryPoint.cs @@ -25,10 +25,6 @@ public sealed class EntryPoint : GameServer { private DreamCommandSystem? _commandSystem; public override void Init() { - IoCManager.Resolve().SetMagicAczProvider(new DefaultMagicAczProvider( - new DefaultMagicAczInfo("Content.Client", new[] {"OpenDreamClient", "OpenDreamShared"}), - IoCManager.Resolve())); - IComponentFactory componentFactory = IoCManager.Resolve(); componentFactory.DoAutoRegistrations(); diff --git a/OpenDreamRuntime/Rendering/ServerScreenOverlaySystem.cs b/OpenDreamRuntime/Rendering/ServerScreenOverlaySystem.cs index aefe7f0b2d..64dd1ed25c 100644 --- a/OpenDreamRuntime/Rendering/ServerScreenOverlaySystem.cs +++ b/OpenDreamRuntime/Rendering/ServerScreenOverlaySystem.cs @@ -1,39 +1,24 @@ using OpenDreamRuntime.Objects.Types; using OpenDreamShared.Rendering; using Robust.Server.GameStates; -using Robust.Shared.Player; -namespace OpenDreamRuntime.Rendering { - public sealed class ServerScreenOverlaySystem : SharedScreenOverlaySystem { - private readonly Dictionary> _sessionToScreenObjects = new(); - [Dependency] private readonly IEntityManager _entityManager = default!; +namespace OpenDreamRuntime.Rendering; - public override void Initialize() { - SubscribeLocalEvent(HandleExpandPvsEvent); - } +public sealed class ServerScreenOverlaySystem : SharedScreenOverlaySystem { + [Dependency] private readonly IEntityManager _entityManager = default!; + [Dependency] private readonly PvsOverrideSystem _pvsOverride = default!; - public void AddScreenObject(DreamConnection connection, DreamObjectMovable screenObject) { - if (!_sessionToScreenObjects.TryGetValue(connection.Session, out var objects)) { - objects = new HashSet(); - _sessionToScreenObjects.Add(connection.Session, objects); - } + public void AddScreenObject(DreamConnection connection, DreamObjectMovable screenObject) { + _pvsOverride.AddForceSend(screenObject.Entity, connection.Session); - objects.Add(screenObject.Entity); - NetEntity ent = _entityManager.GetNetEntity(screenObject.Entity); - RaiseNetworkEvent(new AddScreenObjectEvent(ent), connection.Session.ConnectedClient); - } + NetEntity ent = _entityManager.GetNetEntity(screenObject.Entity); + RaiseNetworkEvent(new AddScreenObjectEvent(ent), connection.Session.ConnectedClient); + } - public void RemoveScreenObject(DreamConnection connection, DreamObjectMovable screenObject) { - _sessionToScreenObjects[connection.Session].Remove(screenObject.Entity); - NetEntity ent = _entityManager.GetNetEntity(screenObject.Entity); - RaiseNetworkEvent(new RemoveScreenObjectEvent(ent), connection.Session.ConnectedClient); - } + public void RemoveScreenObject(DreamConnection connection, DreamObjectMovable screenObject) { + _pvsOverride.RemoveForceSend(screenObject.Entity, connection.Session); - private void HandleExpandPvsEvent(ref ExpandPvsEvent e) { - if (_sessionToScreenObjects.TryGetValue(e.Session, out var objects)) { - e.Entities ??= new(objects.Count); - e.Entities.AddRange(objects); - } - } + NetEntity ent = _entityManager.GetNetEntity(screenObject.Entity); + RaiseNetworkEvent(new RemoveScreenObjectEvent(ent), connection.Session.ConnectedClient); } } diff --git a/RobustToolbox b/RobustToolbox index eb092e90ef..73357f022b 160000 --- a/RobustToolbox +++ b/RobustToolbox @@ -1 +1 @@ -Subproject commit eb092e90efc7ac4ae562bc46f9b760745a29e289 +Subproject commit 73357f022ba3a0b60587b602f68e160df6d79648