diff --git a/Content.Server/Cabinet/ItemCabinetSystem.cs b/Content.Server/Cabinet/ItemCabinetSystem.cs index a5b77ac3ed..39165021bb 100644 --- a/Content.Server/Cabinet/ItemCabinetSystem.cs +++ b/Content.Server/Cabinet/ItemCabinetSystem.cs @@ -27,6 +27,8 @@ namespace Content.Server.Cabinet SubscribeLocalEvent(OnContainerModified); SubscribeLocalEvent(OnContainerModified); + + SubscribeLocalEvent(OnLockToggleAttempt); } private void OnComponentInit(EntityUid uid, ItemCabinetComponent cabinet, ComponentInit args) @@ -63,6 +65,13 @@ namespace Content.Server.Cabinet UpdateAppearance(uid, cabinet); } + private void OnLockToggleAttempt(EntityUid uid, ItemCabinetComponent cabinet, ref LockToggleAttemptEvent args) + { + // Cannot lock or unlock while open. + if (cabinet.Opened) + args.Cancelled = true; + } + private void AddToggleOpenVerb(EntityUid uid, ItemCabinetComponent cabinet, GetVerbsEvent args) { if (args.Hands == null || !args.CanAccess || !args.CanInteract) diff --git a/Content.Server/Lock/LockComponent.cs b/Content.Server/Lock/LockComponent.cs index bec563d9b7..0585986091 100644 --- a/Content.Server/Lock/LockComponent.cs +++ b/Content.Server/Lock/LockComponent.cs @@ -14,3 +14,17 @@ namespace Content.Server.Storage.Components [ViewVariables(VVAccess.ReadWrite)] [DataField("lockingSound")] public SoundSpecifier LockSound { get; set; } = new SoundPathSpecifier("/Audio/Machines/door_lock_on.ogg"); } } +[ByRefEvent] +public struct LockToggleAttemptEvent +{ + public bool Silent = false; + public bool Cancelled = false; + public EntityUid User; + + public LockToggleAttemptEvent(EntityUid user, bool silent = false) + { + User = user; + Silent = silent; + } +} +public sealed class LockToggleAttemptArgs : EventArgs { } diff --git a/Content.Server/Lock/LockSystem.cs b/Content.Server/Lock/LockSystem.cs index 3d417c7100..6088740d04 100644 --- a/Content.Server/Lock/LockSystem.cs +++ b/Content.Server/Lock/LockSystem.cs @@ -148,23 +148,14 @@ namespace Content.Server.Lock /// /// Before locking the entity, check whether it's a locker. If is, prevent it from being locked from the inside or while it is open. /// - public bool CanToggleLock(EntityUid uid, EntityUid user, EntityStorageComponent? storage = null, bool quiet = true) + public bool CanToggleLock(EntityUid uid, EntityUid user, bool quiet = true) { - if (!Resolve(uid, ref storage, logMissing: false)) - return true; - if (!HasComp(user)) return false; - // Cannot lock if the entity is currently opened. - if (storage.Open) - return false; - - // Cannot (un)lock from the inside. Maybe a bad idea? Security jocks could trap nerds in lockers? - if (storage.Contents.Contains(user)) - return false; - - return true; + var ev = new LockToggleAttemptEvent(user, quiet); + RaiseLocalEvent(uid, ref ev, true); + return !ev.Cancelled; } private bool HasUserAccess(EntityUid uid, EntityUid user, AccessReaderComponent? reader = null, bool quiet = true) diff --git a/Content.Server/Storage/EntitySystems/EntityStorageSystem.cs b/Content.Server/Storage/EntitySystems/EntityStorageSystem.cs index b4ea126052..de29706eb1 100644 --- a/Content.Server/Storage/EntitySystems/EntityStorageSystem.cs +++ b/Content.Server/Storage/EntitySystems/EntityStorageSystem.cs @@ -45,11 +45,13 @@ public sealed class EntityStorageSystem : EntitySystem SubscribeLocalEvent(OnInteract); SubscribeLocalEvent(OnWeldableAttempt); SubscribeLocalEvent(OnWelded); + SubscribeLocalEvent(OnLockToggleAttempt); SubscribeLocalEvent(OnDestroy); SubscribeLocalEvent(OnInsideInhale); SubscribeLocalEvent(OnInsideExhale); SubscribeLocalEvent(OnInsideExposed); + } private void OnInit(EntityUid uid, EntityStorageComponent component, ComponentInit args) @@ -102,6 +104,17 @@ public sealed class EntityStorageSystem : EntitySystem component.IsWeldedShut = args.IsWelded; } + private void OnLockToggleAttempt(EntityUid uid, EntityStorageComponent target, ref LockToggleAttemptEvent args) + { + // Cannot (un)lock open lockers. + if (target.Open) + args.Cancelled = true; + + // Cannot (un)lock from the inside. Maybe a bad idea? Security jocks could trap nerds in lockers? + if (target.Contents.Contains(args.User)) + args.Cancelled = true; + } + private void OnDestroy(EntityUid uid, EntityStorageComponent component, DestructionEventArgs args) { component.Open = true;