From 2df70799f81916683692b7aeeeb9d3f3d2661946 Mon Sep 17 00:00:00 2001 From: chromiumboy <50505512+chromiumboy@users.noreply.github.com> Date: Tue, 8 Aug 2023 13:30:46 -0500 Subject: [PATCH] Add access configurator (#18638) The access configurator programs the access levels of any access reader. To use the access configurator, players must: - Insert an ID card - Click a nearby entity with an access reader with the access configurator in hand - Change the access list Note that players only need one of the access levels listed on the device to lock/unlock it, but will only be able to alter access settings when they all of the access levels listed on the device For example, an airlock which has 'Science' and 'Engineering' access listed can be opened by any player with either 'Science' or 'Engineering' access. However, to change the access settings on this airlock, a player must have both 'Science' and 'Engineering' access. This is to prevent people from easily breaking into secure areas with this tool, by adding one of their own access levels to the target device Obviously, the most useful ID card to use with this tool is one with all access, since it can change the settings of any device. Removing all access requirements from a device will make it useable by anyone. --------- Co-authored-by: Kevin Zheng --- .../Access/AccessOverriderSystem.cs | 11 + .../UI/AccessOverriderBoundUserInterface.cs | 72 +++++ .../Access/UI/AccessOverriderWindow.xaml | 23 ++ .../Access/UI/AccessOverriderWindow.xaml.cs | 111 ++++++++ .../Access/Systems/AccessOverriderSystem.cs | 265 ++++++++++++++++++ .../Components/AccessOverriderComponent.cs | 80 ++++++ .../Systems/SharedAccessOverriderSystem.cs | 72 +++++ .../systems/access-overrider-system.ftl | 9 + .../Catalog/Fills/Lockers/heads.yml | 3 + .../Objects/Tools/access_configurator.yml | 74 +++++ .../Doors/Airlocks/base_structureairlocks.yml | 1 + .../access_configurator.rsi/equipped-BELT.png | Bin 0 -> 1422 bytes .../Tools/access_configurator.rsi/icon.png | Bin 0 -> 7579 bytes .../access_configurator.rsi/inhand-left.png | Bin 0 -> 2401 bytes .../access_configurator.rsi/inhand-right.png | Bin 0 -> 2363 bytes .../Tools/access_configurator.rsi/meta.json | 62 ++++ 16 files changed, 783 insertions(+) create mode 100644 Content.Client/Access/AccessOverriderSystem.cs create mode 100644 Content.Client/Access/UI/AccessOverriderBoundUserInterface.cs create mode 100644 Content.Client/Access/UI/AccessOverriderWindow.xaml create mode 100644 Content.Client/Access/UI/AccessOverriderWindow.xaml.cs create mode 100644 Content.Server/Access/Systems/AccessOverriderSystem.cs create mode 100644 Content.Shared/Access/Components/AccessOverriderComponent.cs create mode 100644 Content.Shared/Access/Systems/SharedAccessOverriderSystem.cs create mode 100644 Resources/Locale/en-US/access/systems/access-overrider-system.ftl create mode 100644 Resources/Prototypes/Entities/Objects/Tools/access_configurator.yml create mode 100644 Resources/Textures/Objects/Tools/access_configurator.rsi/equipped-BELT.png create mode 100644 Resources/Textures/Objects/Tools/access_configurator.rsi/icon.png create mode 100644 Resources/Textures/Objects/Tools/access_configurator.rsi/inhand-left.png create mode 100644 Resources/Textures/Objects/Tools/access_configurator.rsi/inhand-right.png create mode 100644 Resources/Textures/Objects/Tools/access_configurator.rsi/meta.json diff --git a/Content.Client/Access/AccessOverriderSystem.cs b/Content.Client/Access/AccessOverriderSystem.cs new file mode 100644 index 0000000000..88d933c8c4 --- /dev/null +++ b/Content.Client/Access/AccessOverriderSystem.cs @@ -0,0 +1,11 @@ +using Content.Shared.Access.Systems; +using JetBrains.Annotations; + +namespace Content.Client.Access +{ + [UsedImplicitly] + public sealed class AccessOverriderSystem : SharedAccessOverriderSystem + { + + } +} diff --git a/Content.Client/Access/UI/AccessOverriderBoundUserInterface.cs b/Content.Client/Access/UI/AccessOverriderBoundUserInterface.cs new file mode 100644 index 0000000000..cb43185484 --- /dev/null +++ b/Content.Client/Access/UI/AccessOverriderBoundUserInterface.cs @@ -0,0 +1,72 @@ +using Content.Shared.Access.Components; +using Content.Shared.Access.Systems; +using Content.Shared.Containers.ItemSlots; +using Robust.Client.GameObjects; +using Robust.Shared.Prototypes; +using static Content.Shared.Access.Components.AccessOverriderComponent; + +namespace Content.Client.Access.UI +{ + public sealed class AccessOverriderBoundUserInterface : BoundUserInterface + { + [Dependency] private readonly IPrototypeManager _prototypeManager = default!; + private readonly SharedAccessOverriderSystem _accessOverriderSystem = default!; + + private AccessOverriderWindow? _window; + + public AccessOverriderBoundUserInterface(EntityUid owner, Enum uiKey) : base(owner, uiKey) + { + _accessOverriderSystem = EntMan.System(); + } + + protected override void Open() + { + base.Open(); + + List accessLevels; + + if (EntMan.TryGetComponent(Owner, out var accessOverrider)) + { + accessLevels = accessOverrider.AccessLevels; + accessLevels.Sort(); + } + + else + { + accessLevels = new List(); + _accessOverriderSystem.Log.Error($"No AccessOverrider component found for {EntMan.ToPrettyString(Owner)}!"); + } + + _window = new AccessOverriderWindow(this, _prototypeManager, accessLevels) + { + Title = EntMan.GetComponent(Owner).EntityName + }; + + _window.PrivilegedIdButton.OnPressed += _ => SendMessage(new ItemSlotButtonPressedEvent(PrivilegedIdCardSlotId)); + + _window.OnClose += Close; + _window.OpenCentered(); + } + + protected override void Dispose(bool disposing) + { + base.Dispose(disposing); + if (!disposing) + return; + + _window?.Dispose(); + } + + protected override void UpdateState(BoundUserInterfaceState state) + { + base.UpdateState(state); + var castState = (AccessOverriderBoundUserInterfaceState) state; + _window?.UpdateState(castState); + } + + public void SubmitData(List newAccessList) + { + SendMessage(new WriteToTargetAccessReaderIdMessage(newAccessList)); + } + } +} diff --git a/Content.Client/Access/UI/AccessOverriderWindow.xaml b/Content.Client/Access/UI/AccessOverriderWindow.xaml new file mode 100644 index 0000000000..ae482140bc --- /dev/null +++ b/Content.Client/Access/UI/AccessOverriderWindow.xaml @@ -0,0 +1,23 @@ + + + + +