diff --git a/Content.Server/MachineLinking/Events/LinkAttemptEvent.cs b/Content.Server/MachineLinking/Events/LinkAttemptEvent.cs deleted file mode 100644 index ea011fbbb6..0000000000 --- a/Content.Server/MachineLinking/Events/LinkAttemptEvent.cs +++ /dev/null @@ -1,21 +0,0 @@ -using Content.Server.MachineLinking.Components; -using Robust.Shared.GameObjects; - -namespace Content.Server.MachineLinking.Events -{ - public sealed class LinkAttemptEvent : CancellableEntityEventArgs - { - public readonly SignalTransmitterComponent TransmitterComponent; - public readonly string TransmitterPort; - public readonly SignalReceiverComponent ReceiverComponent; - public readonly string ReceiverPort; - - public LinkAttemptEvent(SignalTransmitterComponent transmitterComponent, string transmitterPort, SignalReceiverComponent receiverComponent, string receiverPort) - { - TransmitterComponent = transmitterComponent; - this.TransmitterPort = transmitterPort; - ReceiverComponent = receiverComponent; - this.ReceiverPort = receiverPort; - } - } -} diff --git a/Content.Server/MachineLinking/System/SignalLinkerSystem.cs b/Content.Server/MachineLinking/System/SignalLinkerSystem.cs index 1ab2fd68c3..478dd42f2d 100644 --- a/Content.Server/MachineLinking/System/SignalLinkerSystem.cs +++ b/Content.Server/MachineLinking/System/SignalLinkerSystem.cs @@ -10,6 +10,7 @@ using Robust.Server.GameObjects; using Robust.Shared.Utility; using Robust.Shared.Player; using Content.Shared.Verbs; +using Content.Shared.MachineLinking.Events; namespace Content.Server.MachineLinking.System { @@ -73,7 +74,7 @@ namespace Content.Server.MachineLinking.System { verb.Act = () => { - var msg = TryLinkDefaults(uid, linker.SavedTransmitter.Value, component) + var msg = TryLinkDefaults(uid, linker.SavedTransmitter.Value, args.User, component) ? Loc.GetString("signal-linking-verb-success", ("machine", linker.SavedTransmitter.Value)) : Loc.GetString("signal-linking-verb-fail", ("machine", linker.SavedTransmitter.Value)); _popupSystem.PopupEntity(msg, uid, Filter.Entities(args.User)); @@ -104,7 +105,7 @@ namespace Content.Server.MachineLinking.System { verb.Act = () => { - var msg = TryLinkDefaults(linker.SavedReceiver.Value, uid, null, component) + var msg = TryLinkDefaults(linker.SavedReceiver.Value, uid, args.User, null, component) ? Loc.GetString("signal-linking-verb-success", ("machine", linker.SavedReceiver.Value)) : Loc.GetString("signal-linking-verb-fail", ("machine", linker.SavedReceiver.Value)); _popupSystem.PopupEntity(msg, uid, Filter.Entities(args.User)); @@ -261,7 +262,7 @@ namespace Content.Server.MachineLinking.System } - private bool TryLink(SignalTransmitterComponent transmitter, SignalReceiverComponent receiver, SignalPortSelected args, EntityUid? popupUid = null, bool checkRange = true) + private bool TryLink(SignalTransmitterComponent transmitter, SignalReceiverComponent receiver, SignalPortSelected args, EntityUid user, bool quiet = false, bool checkRange = true) { if (!transmitter.Outputs.TryGetValue(args.TransmitterPort, out var receivers) || !receiver.Inputs.TryGetValue(args.ReceiverPort, out var transmitters)) @@ -269,38 +270,38 @@ namespace Content.Server.MachineLinking.System if (checkRange && !IsInRange(transmitter, receiver)) { - if (popupUid.HasValue) + if (!quiet) _popupSystem.PopupCursor(Loc.GetString("signal-linker-component-out-of-range"), - Filter.Entities(popupUid.Value)); + Filter.Entities(user)); return false; } // allow other systems to refuse the connection - var linkAttempt = new LinkAttemptEvent(transmitter, args.TransmitterPort, receiver, args.ReceiverPort); + var linkAttempt = new LinkAttemptEvent(user, transmitter.Owner, args.TransmitterPort, receiver.Owner, args.ReceiverPort); RaiseLocalEvent(transmitter.Owner, linkAttempt); if (linkAttempt.Cancelled) { - if (popupUid.HasValue) + if (!quiet) _popupSystem.PopupCursor(Loc.GetString("signal-linker-component-connection-refused", ("machine", transmitter.Owner)), - Filter.Entities(popupUid.Value)); + Filter.Entities(user)); return false; } RaiseLocalEvent(receiver.Owner, linkAttempt); if (linkAttempt.Cancelled) { - if (popupUid.HasValue) + if (!quiet) _popupSystem.PopupCursor(Loc.GetString("signal-linker-component-connection-refused", ("machine", receiver.Owner)), - Filter.Entities(popupUid.Value)); + Filter.Entities(user)); return false; } receivers.Add(new(receiver.Owner, args.ReceiverPort)); transmitters.Add(new(transmitter.Owner, args.TransmitterPort)); - if (popupUid.HasValue) + if (!quiet) _popupSystem.PopupCursor(Loc.GetString("signal-linker-component-linked-port", ("machine1", transmitter.Owner), ("port1", args.TransmitterPort), ("machine2", receiver.Owner), ("port2", args.ReceiverPort)), - Filter.Entities(popupUid.Value)); + Filter.Entities(user)); return true; } @@ -313,8 +314,7 @@ namespace Content.Server.MachineLinking.System !receiver.Inputs.TryGetValue(args.ReceiverPort, out var transmitters)) return; - if (args.Session.AttachedEntity is not EntityUid attached || attached == default || - !TryComp(attached, out ActorComponent? actor)) + if (args.Session.AttachedEntity is not EntityUid { Valid: true} attached) return; if (receivers.Contains(new(receiver.Owner, args.ReceiverPort)) || @@ -366,7 +366,10 @@ namespace Content.Server.MachineLinking.System !TryComp(linker.SavedReceiver, out SignalReceiverComponent? receiver)) return; - TryLinkDefaults(linker.SavedReceiver!.Value, linker.SavedTransmitter!.Value, receiver, transmitter); + if (args.Session.AttachedEntity is not EntityUid { Valid: true } user) + return; + + TryLinkDefaults(linker.SavedReceiver!.Value, linker.SavedTransmitter!.Value, user, receiver, transmitter); TryUpdateUI(linker, transmitter, receiver); } @@ -374,7 +377,8 @@ namespace Content.Server.MachineLinking.System /// Attempt to link all default ports connections. Returns true if all links succeeded. Otherwise returns /// false. /// - public bool TryLinkDefaults(EntityUid receiverUid, EntityUid transmitterUid, SignalReceiverComponent? receiver = null, SignalTransmitterComponent? transmitter = null) + public bool TryLinkDefaults(EntityUid receiverUid, EntityUid transmitterUid, EntityUid user, + SignalReceiverComponent? receiver = null, SignalTransmitterComponent? transmitter = null) { if (!Resolve(receiverUid, ref receiver, false) || !Resolve(transmitterUid, ref transmitter, false)) return false; @@ -396,7 +400,7 @@ namespace Content.Server.MachineLinking.System RaiseLocalEvent(receiver.Owner, new PortDisconnectedEvent(port)); foreach (var (t, r) in mapping) - allLinksSucceeded &= TryLink(transmitter, receiver, new(t, r), checkRange: false); + allLinksSucceeded &= !TryLink(transmitter, receiver, new(t, r), user, quiet: true, checkRange: false); } return allLinksSucceeded; diff --git a/Content.Shared/Access/Systems/AccessReaderSystem.cs b/Content.Shared/Access/Systems/AccessReaderSystem.cs index 3f8f193e79..8cc2ee8572 100644 --- a/Content.Shared/Access/Systems/AccessReaderSystem.cs +++ b/Content.Shared/Access/Systems/AccessReaderSystem.cs @@ -6,6 +6,7 @@ using Content.Shared.PDA; using Content.Shared.Access.Components; using Robust.Shared.Prototypes; using Content.Shared.Hands.EntitySystems; +using Content.Shared.MachineLinking.Events; namespace Content.Shared.Access.Systems { @@ -20,6 +21,13 @@ namespace Content.Shared.Access.Systems base.Initialize(); SubscribeLocalEvent(OnInit); SubscribeLocalEvent(OnEmagged); + SubscribeLocalEvent(OnLinkAttempt); + } + + private void OnLinkAttempt(EntityUid uid, AccessReaderComponent component, LinkAttemptEvent args) + { + if (component.Enabled && !IsAllowed(component, args.User)) + args.Cancel(); } private void OnInit(EntityUid uid, AccessReaderComponent reader, ComponentInit args) diff --git a/Content.Shared/MachineLinking/Events/LinkAttemptEvent.cs b/Content.Shared/MachineLinking/Events/LinkAttemptEvent.cs new file mode 100644 index 0000000000..8def85fbd6 --- /dev/null +++ b/Content.Shared/MachineLinking/Events/LinkAttemptEvent.cs @@ -0,0 +1,20 @@ +namespace Content.Shared.MachineLinking.Events +{ + public sealed class LinkAttemptEvent : CancellableEntityEventArgs + { + public readonly EntityUid Transmitter; + public readonly EntityUid Receiver; + public readonly EntityUid User; + public readonly string TransmitterPort; + public readonly string ReceiverPort; + + public LinkAttemptEvent(EntityUid user, EntityUid transmitter, string transmitterPort, EntityUid receiver, string receiverPort) + { + User = user; + Transmitter = transmitter; + TransmitterPort = transmitterPort; + Receiver = receiver; + ReceiverPort = receiverPort; + } + } +}