From ebf9f4a38e18513957c469b317105f55ba2498e2 Mon Sep 17 00:00:00 2001 From: godisdeadLOL <169250097+godisdeadLOL@users.noreply.github.com> Date: Tue, 22 Apr 2025 21:15:12 +0300 Subject: [PATCH] Fingerprint taking improvements (#31864) * now using event to check access to fingerprint * Opps actually commiting the changes --------- Co-authored-by: YourUsername Co-authored-by: beck-thompson --- .../Systems/FingerprintMaskSystem.cs | 24 +++++++++++++++++++ .../Forensics/Systems/ForensicPadSystem.cs | 11 +++++++-- .../Forensics/Systems/ForensicsSystem.cs | 23 ++++++++++++++---- Content.Shared/Forensics/Events.cs | 14 +++++++++++ .../Locale/en-US/forensics/forensics.ftl | 3 ++- 5 files changed, 68 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 0000000000..05008d1662 --- /dev/null +++ b/Content.Server/Forensics/Systems/FingerprintMaskSystem.cs @@ -0,0 +1,24 @@ +using Content.Shared.Forensics; +using Content.Shared.Forensics.Components; +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) + { + if (args.Args.Cancelled) + return; + + args.Args.Blocker = uid; + args.Args.Cancel(); + } +} diff --git a/Content.Server/Forensics/Systems/ForensicPadSystem.cs b/Content.Server/Forensics/Systems/ForensicPadSystem.cs index 2841f36b00..d675950faa 100644 --- a/Content.Server/Forensics/Systems/ForensicPadSystem.cs +++ b/Content.Server/Forensics/Systems/ForensicPadSystem.cs @@ -18,6 +18,8 @@ namespace Content.Server.Forensics [Dependency] private readonly SharedDoAfterSystem _doAfterSystem = default!; [Dependency] private readonly InventorySystem _inventory = default!; [Dependency] private readonly PopupSystem _popupSystem = default!; + [Dependency] private readonly MetaDataSystem _metaData = default!; + [Dependency] private readonly ForensicsSystem _forensics = default!; [Dependency] private readonly LabelSystem _label = default!; public override void Initialize() @@ -58,9 +60,14 @@ namespace Content.Server.Forensics 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 66818855e5..2c75cc3b19 100644 --- a/Content.Server/Forensics/Systems/ForensicsSystem.cs +++ b/Content.Server/Forensics/Systems/ForensicsSystem.cs @@ -299,11 +299,9 @@ namespace Content.Server.Forensics { 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 _)) component.Fingerprints.Add(fingerprint.Fingerprint ?? ""); } @@ -364,6 +362,23 @@ namespace Content.Server.Forensics } } + /// + /// Checks if there's a way to access 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 0506f48a3d..85494b37a0 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,16 @@ public record struct GenerateDnaEvent() /// public required string DNA; } + +/// +/// An event to check if the fingerprint is accessible. +/// +public sealed class TryAccessFingerprintEvent : CancellableEntityEventArgs, IInventoryRelayEvent +{ + SlotFlags IInventoryRelayEvent.TargetSlots => SlotFlags.WITHOUT_POCKET; + + /// + /// Entity that blocked access. + /// + public EntityUid? Blocker; +} diff --git a/Resources/Locale/en-US/forensics/forensics.ftl b/Resources/Locale/en-US/forensics/forensics.ftl index 80eea069fa..6eae96f27d 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.