fix gateway destinations (#20172)

Co-authored-by: deltanedas <@deltanedas:kde.org>
This commit is contained in:
deltanedas
2023-09-16 06:56:35 +01:00
committed by GitHub
parent 1b9a86642f
commit 8aba52d796
4 changed files with 25 additions and 14 deletions

View File

@@ -20,7 +20,7 @@ public sealed class GatewayBoundUserInterface : BoundUserInterface
_window = new GatewayWindow(); _window = new GatewayWindow();
_window.OpenPortal += destination => _window.OpenPortal += destination =>
{ {
SendMessage(new GatewayOpenPortalMessage(EntMan.GetNetEntity(destination))); SendMessage(new GatewayOpenPortalMessage(destination));
}; };
_window.OnClose += Close; _window.OnClose += Close;
_window?.OpenCentered(); _window?.OpenCentered();
@@ -29,8 +29,11 @@ public sealed class GatewayBoundUserInterface : BoundUserInterface
protected override void Dispose(bool disposing) protected override void Dispose(bool disposing)
{ {
base.Dispose(disposing); base.Dispose(disposing);
_window?.Dispose(); if (disposing)
_window = null; {
_window?.Dispose();
_window = null;
}
} }
protected override void UpdateState(BoundUserInterfaceState state) protected override void UpdateState(BoundUserInterfaceState state)

View File

@@ -16,12 +16,11 @@ namespace Content.Client.Gateway.UI;
public sealed partial class GatewayWindow : FancyWindow, public sealed partial class GatewayWindow : FancyWindow,
IComputerWindow<EmergencyConsoleBoundUserInterfaceState> IComputerWindow<EmergencyConsoleBoundUserInterfaceState>
{ {
private readonly IEntityManager _entManager;
private readonly IGameTiming _timing; private readonly IGameTiming _timing;
public event Action<EntityUid>? OpenPortal; public event Action<NetEntity>? OpenPortal;
private List<(NetEntity, string, TimeSpan, bool)> _destinations = default!; private List<(NetEntity, string, TimeSpan, bool)> _destinations = default!;
private EntityUid? _current; private NetEntity? _current;
private TimeSpan _nextClose; private TimeSpan _nextClose;
private TimeSpan _lastOpen; private TimeSpan _lastOpen;
private List<Label> _readyLabels = default!; private List<Label> _readyLabels = default!;
@@ -31,14 +30,13 @@ public sealed partial class GatewayWindow : FancyWindow,
{ {
RobustXamlLoader.Load(this); RobustXamlLoader.Load(this);
var dependencies = IoCManager.Instance!; var dependencies = IoCManager.Instance!;
_entManager = dependencies.Resolve<IEntityManager>();
_timing = dependencies.Resolve<IGameTiming>(); _timing = dependencies.Resolve<IGameTiming>();
} }
public void UpdateState(GatewayBoundUserInterfaceState state) public void UpdateState(GatewayBoundUserInterfaceState state)
{ {
_destinations = state.Destinations; _destinations = state.Destinations;
_current = _entManager.GetEntity(state.Current); _current = state.Current;
_nextClose = state.NextClose; _nextClose = state.NextClose;
_lastOpen = state.LastOpen; _lastOpen = state.LastOpen;
@@ -67,7 +65,7 @@ public sealed partial class GatewayWindow : FancyWindow,
var now = _timing.CurTime; var now = _timing.CurTime;
foreach (var dest in _destinations) foreach (var dest in _destinations)
{ {
var uid = _entManager.GetEntity(dest.Item1); var ent = dest.Item1;
var name = dest.Item2; var name = dest.Item2;
var nextReady = dest.Item3; var nextReady = dest.Item3;
var busy = dest.Item4; var busy = dest.Item4;
@@ -94,17 +92,17 @@ public sealed partial class GatewayWindow : FancyWindow,
var openButton = new Button() var openButton = new Button()
{ {
Text = Loc.GetString("gateway-window-open-portal"), Text = Loc.GetString("gateway-window-open-portal"),
Pressed = uid == _current, Pressed = ent == _current,
ToggleMode = true, ToggleMode = true,
Disabled = _current != null || busy || now < nextReady Disabled = _current != null || busy || now < nextReady
}; };
openButton.OnPressed += args => openButton.OnPressed += args =>
{ {
OpenPortal?.Invoke(uid); OpenPortal?.Invoke(ent);
}; };
if (uid == _entManager.GetEntity(state.Current)) if (ent == _current)
{ {
openButton.AddStyleClass(StyleBase.ButtonCaution); openButton.AddStyleClass(StyleBase.ButtonCaution);
} }

View File

@@ -20,7 +20,7 @@ public sealed partial class GatewayComponent : Component
/// Every other gateway destination on the server. /// Every other gateway destination on the server.
/// </summary> /// </summary>
/// <remarks> /// <remarks>
/// Added on /// Added on startup and when a new destination portal is created.
/// </remarks> /// </remarks>
[ViewVariables] [ViewVariables]
public HashSet<EntityUid> Destinations = new(); public HashSet<EntityUid> Destinations = new();

View File

@@ -1,4 +1,5 @@
using Content.Server.Gateway.Components; using Content.Server.Gateway.Components;
using Content.Shared.Access.Systems;
using Content.Shared.Gateway; using Content.Shared.Gateway;
using Content.Shared.Teleportation.Components; using Content.Shared.Teleportation.Components;
using Content.Shared.Teleportation.Systems; using Content.Shared.Teleportation.Systems;
@@ -13,6 +14,7 @@ namespace Content.Server.Gateway.Systems;
public sealed class GatewaySystem : EntitySystem public sealed class GatewaySystem : EntitySystem
{ {
[Dependency] private readonly AccessReaderSystem _accessReader = default!;
[Dependency] private readonly IGameTiming _timing = default!; [Dependency] private readonly IGameTiming _timing = default!;
[Dependency] private readonly LinkedEntitySystem _linkedEntity = default!; [Dependency] private readonly LinkedEntitySystem _linkedEntity = default!;
[Dependency] private readonly SharedAppearanceSystem _appearance = default!; [Dependency] private readonly SharedAppearanceSystem _appearance = default!;
@@ -66,7 +68,7 @@ public sealed class GatewaySystem : EntitySystem
private void UpdateUserInterface(EntityUid uid, GatewayComponent comp) private void UpdateUserInterface(EntityUid uid, GatewayComponent comp)
{ {
var destinations = new List<(NetEntity, String, TimeSpan, bool)>(); var destinations = new List<(NetEntity, string, TimeSpan, bool)>();
foreach (var destUid in comp.Destinations) foreach (var destUid in comp.Destinations)
{ {
var dest = Comp<GatewayDestinationComponent>(destUid); var dest = Comp<GatewayDestinationComponent>(destUid);
@@ -88,6 +90,14 @@ public sealed class GatewaySystem : EntitySystem
private void OnOpenPortal(EntityUid uid, GatewayComponent comp, GatewayOpenPortalMessage args) private void OnOpenPortal(EntityUid uid, GatewayComponent comp, GatewayOpenPortalMessage args)
{ {
if (args.Session.AttachedEntity == null)
return;
// if the gateway has an access reader check it before allowing opening
var user = args.Session.AttachedEntity.Value;
if (!_accessReader.IsAllowed(user, uid))
return;
// can't link if portal is already open on either side, the destination is invalid or on cooldown // can't link if portal is already open on either side, the destination is invalid or on cooldown
var desto = GetEntity(args.Destination); var desto = GetEntity(args.Destination);