From 2423f1797ba7d1b7ad7790fe1e349a561fb5c518 Mon Sep 17 00:00:00 2001 From: YourUsername Date: Thu, 5 Sep 2024 23:30:52 +0300 Subject: [PATCH] now using event to check access to fingerprint --- .../Systems/FingerprintMaskSystem.cs | 20 ++++++++++++++++ .../Forensics/Systems/ForensicPadSystem.cs | 10 ++++++-- .../Forensics/Systems/ForensicsSystem.cs | 23 +++++++++++++++---- Content.Shared/Forensics/Events.cs | 11 +++++++++ .../Locale/en-US/forensics/forensics.ftl | 3 ++- 5 files changed, 60 insertions(+), 7 deletions(-) create mode 100644 Content.Server/Forensics/Systems/FingerprintMaskSystem.cs diff --git a/Content.Server/Forensics/Systems/FingerprintMaskSystem.cs b/Content.Server/Forensics/Systems/FingerprintMaskSystem.cs new file mode 100644 index 00000000000000..bdfbcee0aa2f80 --- /dev/null +++ b/Content.Server/Forensics/Systems/FingerprintMaskSystem.cs @@ -0,0 +1,20 @@ +using Content.Shared.Forensics; +using Content.Shared.Inventory; + +namespace Content.Server.Forensics; + +public sealed class FingerprintMaskSystem : EntitySystem +{ + public override void Initialize() + { + base.Initialize(); + + SubscribeLocalEvent>(OnTryAccessFingerprint); + } + + private void OnTryAccessFingerprint(EntityUid uid, FingerprintMaskComponent comp, ref InventoryRelayedEvent args) + { + args.Args.Blocker = uid; + args.Args.Cancel(); + } +} diff --git a/Content.Server/Forensics/Systems/ForensicPadSystem.cs b/Content.Server/Forensics/Systems/ForensicPadSystem.cs index 42512cb1fdc452..c40f5f459e787f 100644 --- a/Content.Server/Forensics/Systems/ForensicPadSystem.cs +++ b/Content.Server/Forensics/Systems/ForensicPadSystem.cs @@ -17,6 +17,7 @@ public sealed class ForensicPadSystem : EntitySystem [Dependency] private readonly InventorySystem _inventory = default!; [Dependency] private readonly PopupSystem _popupSystem = default!; [Dependency] private readonly MetaDataSystem _metaData = default!; + [Dependency] private readonly ForensicsSystem _forensics = default!; public override void Initialize() { @@ -56,9 +57,14 @@ private void OnAfterInteract(EntityUid uid, ForensicPadComponent component, Afte return; } - if (_inventory.TryGetSlotEntity(args.Target.Value, "gloves", out var gloves)) + if (!_forensics.CanAccessFingerprint(args.Target.Value, out var blocker)) { - _popupSystem.PopupEntity(Loc.GetString("forensic-pad-gloves", ("target", Identity.Entity(args.Target.Value, EntityManager))), args.Target.Value, args.User); + + if (blocker is { } item) + _popupSystem.PopupEntity(Loc.GetString("forensic-pad-no-access-due", ("entity", Identity.Entity(item, EntityManager))), args.Target.Value, args.User); + else + _popupSystem.PopupEntity(Loc.GetString("forensic-pad-no-access"), args.Target.Value, args.User); + return; } diff --git a/Content.Server/Forensics/Systems/ForensicsSystem.cs b/Content.Server/Forensics/Systems/ForensicsSystem.cs index 34529aba4a2f7d..4b491d17c35398 100644 --- a/Content.Server/Forensics/Systems/ForensicsSystem.cs +++ b/Content.Server/Forensics/Systems/ForensicsSystem.cs @@ -289,11 +289,9 @@ private void ApplyEvidence(EntityUid user, EntityUid target) { if (TryComp(gloves, out var fiber) && !string.IsNullOrEmpty(fiber.FiberMaterial)) component.Fibers.Add(string.IsNullOrEmpty(fiber.FiberColor) ? Loc.GetString("forensic-fibers", ("material", fiber.FiberMaterial)) : Loc.GetString("forensic-fibers-colored", ("color", fiber.FiberColor), ("material", fiber.FiberMaterial))); - - if (HasComp(gloves)) - return; } - if (TryComp(user, out var fingerprint)) + + if (TryComp(user, out var fingerprint) && CanAccessFingerprint(user, out var _)) component.Fingerprints.Add(fingerprint.Fingerprint ?? ""); } @@ -322,6 +320,23 @@ public void TransferDna(EntityUid recipient, EntityUid donor, bool canDnaBeClean } } + /// + /// Checks if there's an access to the fingerprint of the target entity. + /// + /// The entity with the fingerprint + /// The entity that blocked accessing the fingerprint + public bool CanAccessFingerprint(EntityUid target, out EntityUid? blocker) + { + var ev = new TryAccessFingerprintEvent(); + + RaiseLocalEvent(target, ev); + if (!ev.Cancelled && TryComp(target, out var inv)) + _inventory.RelayEvent((target, inv), ev); + + blocker = ev.Blocker; + return !ev.Cancelled; + } + #endregion } } diff --git a/Content.Shared/Forensics/Events.cs b/Content.Shared/Forensics/Events.cs index f7b9475cb577c8..9fd8016d47668a 100644 --- a/Content.Shared/Forensics/Events.cs +++ b/Content.Shared/Forensics/Events.cs @@ -1,4 +1,5 @@ using Content.Shared.DoAfter; +using Content.Shared.Inventory; using Robust.Shared.Serialization; namespace Content.Shared.Forensics; @@ -68,3 +69,13 @@ public record struct GenerateDnaEvent() /// public string DNA; } + +/// +/// An event to check if the fingerprint is accessible. +/// +public sealed class TryAccessFingerprintEvent : CancellableEntityEventArgs, IInventoryRelayEvent +{ + SlotFlags IInventoryRelayEvent.TargetSlots => ~SlotFlags.POCKET; + + public EntityUid? Blocker; +} diff --git a/Resources/Locale/en-US/forensics/forensics.ftl b/Resources/Locale/en-US/forensics/forensics.ftl index 712e8511bb061f..bf0b67ac281877 100644 --- a/Resources/Locale/en-US/forensics/forensics.ftl +++ b/Resources/Locale/en-US/forensics/forensics.ftl @@ -9,7 +9,8 @@ forensic-scanner-interface-clear = Clear forensic-scanner-report-title = Forensics Report: {$entity} forensic-pad-unused = It hasn't been used. forensic-pad-sample = It has a sample: {$sample} -forensic-pad-gloves = {CAPITALIZE($target)} is wearing gloves. +forensic-pad-no-access-due = Can't access the fingerprint due to {THE($entity)}. +forensic-pad-no-access = Can't access the fingerprint. forensic-pad-start-scan-target = {CAPITALIZE($user)} is trying to take a sample of your fingerprints. forensic-pad-start-scan-user = You start taking a sample of {CAPITALIZE($target)}'s fingerprints. forensic-pad-already-used = This pad has already been used.