diff --git a/Content.Server/Lock/Components/ActivatableUIRequiresLockComponent.cs b/Content.Server/Lock/Components/ActivatableUIRequiresLockComponent.cs new file mode 100644 index 0000000000..dac677c1c2 --- /dev/null +++ b/Content.Server/Lock/Components/ActivatableUIRequiresLockComponent.cs @@ -0,0 +1,15 @@ +namespace Content.Server.Lock.Components; + +/// +/// This is used for activatable UIs that require the entity to have a lock in a certain state. +/// +[RegisterComponent] +public sealed partial class ActivatableUIRequiresLockComponent : Component +{ + /// + /// TRUE: the lock must be locked to access the UI. + /// FALSE: the lock must be unlocked to access the UI. + /// + [DataField("requireLocked"), ViewVariables(VVAccess.ReadWrite)] + public bool requireLocked = false; +} diff --git a/Content.Server/Lock/EntitySystems/ActivatableUIRequiresLockSystem.cs b/Content.Server/Lock/EntitySystems/ActivatableUIRequiresLockSystem.cs new file mode 100644 index 0000000000..bfb2fbc6e1 --- /dev/null +++ b/Content.Server/Lock/EntitySystems/ActivatableUIRequiresLockSystem.cs @@ -0,0 +1,41 @@ +using Content.Server.Lock.Components; +using Content.Server.Popups; +using Content.Server.UserInterface; +using Content.Shared.Lock; + +namespace Content.Server.Lock.EntitySystems; +public sealed class ActivatableUIRequiresLockSystem : EntitySystem +{ + [Dependency] private readonly ActivatableUISystem _activatableUI = default!; + [Dependency] private readonly PopupSystem _popupSystem = default!; + + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent(OnUIOpenAttempt); + SubscribeLocalEvent(LockToggled); + } + + private void OnUIOpenAttempt(EntityUid uid, ActivatableUIRequiresLockComponent component, ActivatableUIOpenAttemptEvent args) + { + if (args.Cancelled) + return; + + if (TryComp(uid, out var lockComp) && lockComp.Locked != component.requireLocked) + { + args.Cancel(); + if (lockComp.Locked) + _popupSystem.PopupEntity(Loc.GetString("entity-storage-component-locked-message"), uid, args.User); + } + } + + private void LockToggled(EntityUid uid, ActivatableUIRequiresLockComponent component, LockToggledEvent args) + { + if (!TryComp(uid, out var lockComp) || lockComp.Locked == component.requireLocked) + return; + + _activatableUI.CloseAll(uid); + } +} + diff --git a/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml b/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml index 8b1f61a8c5..ac19ad2f23 100644 --- a/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml +++ b/Resources/Prototypes/Entities/Mobs/Cyborgs/base_borg_chassis.yml @@ -208,5 +208,6 @@ - AllAccess - type: Lock locked: true + - type: ActivatableUIRequiresLock - type: AccessReader access: [["Command"], ["Research"]]