From 6b4c2e9b40f7f16589fccd31ce95e26c3ed3c47f Mon Sep 17 00:00:00 2001 From: Leon Friedrich <60421075+ElectroJr@users.noreply.github.com> Date: Mon, 27 Jun 2022 20:09:21 +1200 Subject: [PATCH] Add more instrument interaction checks (#9223) --- Content.Client/Instruments/UI/InstrumentMenu.xaml.cs | 9 ++++++++- Content.Server/UserInterface/ActivatableUISystem.cs | 11 +++++++++++ 2 files changed, 19 insertions(+), 1 deletion(-) diff --git a/Content.Client/Instruments/UI/InstrumentMenu.xaml.cs b/Content.Client/Instruments/UI/InstrumentMenu.xaml.cs index 6762b3450c..7ab5e5f5fd 100644 --- a/Content.Client/Instruments/UI/InstrumentMenu.xaml.cs +++ b/Content.Client/Instruments/UI/InstrumentMenu.xaml.cs @@ -2,6 +2,7 @@ using System; using System.IO; using System.Threading.Tasks; using Content.Client.Interactable; +using Content.Shared.ActionBlocker; using Content.Shared.Interaction; using Robust.Client.Audio.Midi; using Robust.Client.AutoGenerated; @@ -132,6 +133,8 @@ namespace Content.Client.Instruments.UI private bool PlayCheck() { + // TODO all of these checks should also be done server-side. + var instrumentEnt = _owner.Instrument?.Owner; var instrument = _owner.Instrument; @@ -151,8 +154,12 @@ namespace Content.Client.Instruments.UI if ((instrument.Handheld && (conMan == null || conMan.Owner != localPlayer.ControlledEntity))) return false; + var entSysMan = IoCManager.Resolve(); + if (!entSysMan.GetEntitySystem().CanInteract(localPlayer.ControlledEntity.Value, instrumentEnt)) + return false; + // We check that we're in range unobstructed just in case. - return EntitySystem.Get().InRangeUnobstructed(localPlayer.ControlledEntity.Value, instrumentEnt.Value); + return entSysMan.GetEntitySystem().InRangeUnobstructed(localPlayer.ControlledEntity.Value, instrumentEnt.Value); } private void MidiStopButtonOnPressed(ButtonEventArgs? obj) diff --git a/Content.Server/UserInterface/ActivatableUISystem.cs b/Content.Server/UserInterface/ActivatableUISystem.cs index 2323651590..b48bd6c3d0 100644 --- a/Content.Server/UserInterface/ActivatableUISystem.cs +++ b/Content.Server/UserInterface/ActivatableUISystem.cs @@ -1,5 +1,6 @@ using Content.Server.Administration.Managers; using Content.Server.Ghost.Components; +using Content.Shared.ActionBlocker; using Content.Shared.Hands; using Content.Shared.Hands.Components; using Content.Shared.Interaction; @@ -15,6 +16,7 @@ namespace Content.Server.UserInterface internal sealed class ActivatableUISystem : EntitySystem { [Dependency] private readonly IAdminManager _adminManager = default!; + [Dependency] private readonly ActionBlockerSystem _blockerSystem = default!; public override void Initialize() { @@ -66,6 +68,9 @@ namespace Content.Server.UserInterface if (!args.CanAccess) return; + if (component.RequireHands && args.Hands == null) + return; + if (component.InHandsOnly && args.Using != uid) return; @@ -106,6 +111,12 @@ namespace Content.Server.UserInterface private bool InteractUI(EntityUid user, ActivatableUIComponent aui) { + if (!_blockerSystem.CanInteract(user, aui.Owner) && (!aui.AllowSpectator || !HasComp(user))) + return false; + + if (aui.RequireHands && !HasComp(user)) + return false; + if (!EntityManager.TryGetComponent(user, out ActorComponent? actor)) return false; if (aui.AdminOnly && !_adminManager.IsAdmin(actor.PlayerSession)) return false;