Skip to content

Commit

Permalink
ACZ fixes and RT v198.1.0 (#1578)
Browse files Browse the repository at this point in the history
* 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 <[email protected]>
(cherry picked from commit 173ca01)

* Update RT to v198.1.0

* Use file-scoped namespaces

---------

Co-authored-by: Pieter-Jan Briers <[email protected]>
  • Loading branch information
wixoaGit and PJB3005 authored Dec 30, 2023
1 parent 5194bcd commit 4434107
Show file tree
Hide file tree
Showing 8 changed files with 92 additions and 87 deletions.
38 changes: 19 additions & 19 deletions OpenDreamClient/Rendering/ClientScreenOverlaySystem.cs
Original file line number Diff line number Diff line change
@@ -1,28 +1,28 @@
using OpenDreamShared.Rendering;

namespace OpenDreamClient.Rendering {
sealed class ClientScreenOverlaySystem : SharedScreenOverlaySystem {
public HashSet<EntityUid> ScreenObjects = new();
namespace OpenDreamClient.Rendering;

[Dependency] private IEntityManager _entityManager = default!;
internal sealed class ClientScreenOverlaySystem : SharedScreenOverlaySystem {
public HashSet<EntityUid> ScreenObjects = new();

public override void Initialize() {
SubscribeNetworkEvent<AddScreenObjectEvent>(OnAddScreenObject);
SubscribeNetworkEvent<RemoveScreenObjectEvent>(OnRemoveScreenObject);
}
[Dependency] private readonly IEntityManager _entityManager = default!;

public override void Shutdown() {
ScreenObjects.Clear();
}
public override void Initialize() {
SubscribeNetworkEvent<AddScreenObjectEvent>(OnAddScreenObject);
SubscribeNetworkEvent<RemoveScreenObjectEvent>(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);
}
}
17 changes: 12 additions & 5 deletions OpenDreamPackaging/DreamPackaging.cs
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
using Robust.Packaging;
using Robust.Packaging.AssetProcessing;
using Robust.Packaging.AssetProcessing.Passes;

namespace OpenDreamPackaging;

Expand All @@ -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.
Expand All @@ -35,7 +44,5 @@ await RobustClientPackaging.WriteClientResources(

inputPass.InjectFileFromDisk(path, diskPath);
}

inputPass.InjectFinished();
}
}
43 changes: 43 additions & 0 deletions OpenDreamRuntime/DreamAczProvider.cs
Original file line number Diff line number Diff line change
@@ -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;
}
}
26 changes: 0 additions & 26 deletions OpenDreamRuntime/DreamMagicAczProvider.cs

This file was deleted.

8 changes: 4 additions & 4 deletions OpenDreamRuntime/DreamManager.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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<string>();
_dreamResourceManager.Initialize(rootPath, resources);
if(!string.IsNullOrEmpty(_compiledJson.Interface) && !_dreamResourceManager.DoesFileExist(_compiledJson.Interface))
Expand Down Expand Up @@ -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;
}
Expand Down
4 changes: 0 additions & 4 deletions OpenDreamRuntime/EntryPoint.cs
Original file line number Diff line number Diff line change
Expand Up @@ -25,10 +25,6 @@ public sealed class EntryPoint : GameServer {
private DreamCommandSystem? _commandSystem;

public override void Init() {
IoCManager.Resolve<IStatusHost>().SetMagicAczProvider(new DefaultMagicAczProvider(
new DefaultMagicAczInfo("Content.Client", new[] {"OpenDreamClient", "OpenDreamShared"}),
IoCManager.Resolve<IDependencyCollection>()));

IComponentFactory componentFactory = IoCManager.Resolve<IComponentFactory>();
componentFactory.DoAutoRegistrations();

Expand Down
41 changes: 13 additions & 28 deletions OpenDreamRuntime/Rendering/ServerScreenOverlaySystem.cs
Original file line number Diff line number Diff line change
@@ -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<ICommonSession, HashSet<EntityUid>> _sessionToScreenObjects = new();
[Dependency] private readonly IEntityManager _entityManager = default!;
namespace OpenDreamRuntime.Rendering;

public override void Initialize() {
SubscribeLocalEvent<ExpandPvsEvent>(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<EntityUid>();
_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);
}
}
2 changes: 1 addition & 1 deletion RobustToolbox
Submodule RobustToolbox updated 122 files

0 comments on commit 4434107

Please sign in to comment.