]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Fix whatever the fuck is going on in storage system slightly (#28236)
authorDrSmugleaf <10968691+DrSmugleaf@users.noreply.github.com>
Fri, 24 May 2024 01:23:55 +0000 (18:23 -0700)
committerGitHub <noreply@github.com>
Fri, 24 May 2024 01:23:55 +0000 (18:23 -0700)
* Fix whatever the fuck is going on in storage system slightly

* Fix inverted check

* h

* Add silent bool

* Silent

Content.Shared/Interaction/Components/BypassInteractionChecksComponent.cs [new file with mode: 0644]
Content.Shared/Inventory/InventorySystem.Slots.cs
Content.Shared/Lock/LockSystem.cs
Content.Shared/Storage/EntitySystems/SharedStorageSystem.cs
Content.Shared/Storage/StorageComponent.cs
Resources/Prototypes/Entities/Mobs/Player/admin_ghost.yml

diff --git a/Content.Shared/Interaction/Components/BypassInteractionChecksComponent.cs b/Content.Shared/Interaction/Components/BypassInteractionChecksComponent.cs
new file mode 100644 (file)
index 0000000..ca0ff96
--- /dev/null
@@ -0,0 +1,6 @@
+using Robust.Shared.GameStates;
+
+namespace Content.Shared.Interaction.Components;
+
+[RegisterComponent, NetworkedComponent]
+public sealed partial class BypassInteractionChecksComponent : Component;
index 19831278b0a51e698926befb873fbe6357ae2bc4..228b788722eca6d6376d6d8289abd45242c716ee 100644 (file)
@@ -75,7 +75,7 @@ public partial class InventorySystem : EntitySystem
 
         if (TryGetSlotEntity(uid, ev.Slot, out var entityUid) && TryComp<StorageComponent>(entityUid, out var storageComponent))
         {
-            _storageSystem.OpenStorageUI(entityUid.Value, uid, storageComponent);
+            _storageSystem.OpenStorageUI(entityUid.Value, uid, storageComponent, false);
         }
     }
 
index 54f5d801ea0cb529a7a6f1b7730c5295f0d6ca4f..4115358d9d78198edf3bb5a370ceb9b6253ee26a 100644 (file)
@@ -8,6 +8,7 @@ using Content.Shared.Hands.Components;
 using Content.Shared.IdentityManagement;
 using Content.Shared.Interaction;
 using Content.Shared.Popups;
+using Content.Shared.Storage;
 using Content.Shared.Storage.Components;
 using Content.Shared.Verbs;
 using Content.Shared.Wires;
@@ -42,11 +43,13 @@ public sealed class LockSystem : EntitySystem
         SubscribeLocalEvent<LockComponent, GotEmaggedEvent>(OnEmagged);
         SubscribeLocalEvent<LockComponent, LockDoAfter>(OnDoAfterLock);
         SubscribeLocalEvent<LockComponent, UnlockDoAfter>(OnDoAfterUnlock);
+        SubscribeLocalEvent<LockComponent, StorageInteractAttemptEvent>(OnStorageInteractAttempt);
 
         SubscribeLocalEvent<LockedWiresPanelComponent, LockToggleAttemptEvent>(OnLockToggleAttempt);
         SubscribeLocalEvent<LockedWiresPanelComponent, AttemptChangePanelEvent>(OnAttemptChangePanel);
         SubscribeLocalEvent<LockedAnchorableComponent, UnanchorAttemptEvent>(OnUnanchorAttempt);
     }
+
     private void OnStartup(EntityUid uid, LockComponent lockComp, ComponentStartup args)
     {
         _appearanceSystem.SetData(uid, LockVisuals.Locked, lockComp.Locked);
@@ -293,6 +296,12 @@ public sealed class LockSystem : EntitySystem
         TryUnlock(uid, args.User, skipDoAfter: true);
     }
 
+    private void OnStorageInteractAttempt(Entity<LockComponent> ent, ref StorageInteractAttemptEvent args)
+    {
+        if (ent.Comp.Locked)
+            args.Cancelled = true;
+    }
+
     private void OnLockToggleAttempt(Entity<LockedWiresPanelComponent> ent, ref LockToggleAttemptEvent args)
     {
         if (args.Cancelled)
index 6dd7f9d4184477fcafb835d5b683c9d3fa34a16e..ea0c9632f0ecb1173fb2c8963f258068432ecde2 100644 (file)
@@ -2,17 +2,15 @@ using System.Collections.Frozen;
 using System.Diagnostics.CodeAnalysis;
 using System.Linq;
 using Content.Shared.ActionBlocker;
-using Content.Shared.Administration;
-using Content.Shared.Administration.Managers;
 using Content.Shared.Containers.ItemSlots;
 using Content.Shared.Destructible;
 using Content.Shared.DoAfter;
-using Content.Shared.Ghost;
 using Content.Shared.Hands.Components;
 using Content.Shared.Hands.EntitySystems;
 using Content.Shared.Implants.Components;
 using Content.Shared.Input;
 using Content.Shared.Interaction;
+using Content.Shared.Interaction.Components;
 using Content.Shared.Inventory;
 using Content.Shared.Item;
 using Content.Shared.Lock;
@@ -40,7 +38,6 @@ public abstract class SharedStorageSystem : EntitySystem
 {
     [Dependency] private   readonly IPrototypeManager _prototype = default!;
     [Dependency] protected readonly IRobustRandom Random = default!;
-    [Dependency] private readonly ISharedAdminManager _admin = default!;
     [Dependency] protected readonly ActionBlockerSystem ActionBlocker = default!;
     [Dependency] private   readonly EntityLookupSystem _entityLookupSystem = default!;
     [Dependency] private   readonly SharedAppearanceSystem _appearance = default!;
@@ -249,17 +246,8 @@ public abstract class SharedStorageSystem : EntitySystem
 
     private void AddUiVerb(EntityUid uid, StorageComponent component, GetVerbsEvent<ActivationVerb> args)
     {
-        var silent = false;
-        if (!args.CanAccess || !args.CanInteract || TryComp<LockComponent>(uid, out var lockComponent) && lockComponent.Locked)
-        {
-            // we allow admins to open the storage anyways
-            if (!_admin.HasAdminFlag(args.User, AdminFlags.Admin))
-                return;
-
-            silent = true;
-        }
-
-        silent |= HasComp<GhostComponent>(args.User);
+        if (!CanInteract(args.User, (uid, component), args.CanAccess && args.CanInteract))
+            return;
 
         // Does this player currently have the storage UI open?
         var uiOpen = _ui.IsUiOpen(uid, StorageComponent.StorageUiKey.Key, args.User);
@@ -274,7 +262,7 @@ public abstract class SharedStorageSystem : EntitySystem
                 }
                 else
                 {
-                    OpenStorageUI(uid, args.User, component, silent);
+                    OpenStorageUI(uid, args.User, component);
                 }
             }
         };
@@ -298,13 +286,16 @@ public abstract class SharedStorageSystem : EntitySystem
     ///     Opens the storage UI for an entity
     /// </summary>
     /// <param name="entity">The entity to open the UI for</param>
-    public void OpenStorageUI(EntityUid uid, EntityUid entity, StorageComponent? storageComp = null, bool silent = false)
+    public void OpenStorageUI(EntityUid uid, EntityUid entity, StorageComponent? storageComp = null, bool silent = true)
     {
         if (!Resolve(uid, ref storageComp, false))
             return;
 
         // prevent spamming bag open / honkerton honk sound
         silent |= TryComp<UseDelayComponent>(uid, out var useDelay) && UseDelay.IsDelayed((uid, useDelay));
+        if (!CanInteract(entity, (uid, storageComp), silent: silent))
+            return;
+
         if (!silent)
         {
             if (!_ui.IsUiOpen(uid, StorageComponent.StorageUiKey.Key))
@@ -326,7 +317,7 @@ public abstract class SharedStorageSystem : EntitySystem
 
         var entities = component.Container.ContainedEntities;
 
-        if (entities.Count == 0 || TryComp(uid, out LockComponent? lockComponent) && lockComponent.Locked)
+        if (entities.Count == 0 || !CanInteract(args.User, (uid, component)))
             return;
 
         // if the target is storage, add a verb to transfer storage.
@@ -337,7 +328,7 @@ public abstract class SharedStorageSystem : EntitySystem
             {
                 Text = Loc.GetString("storage-component-transfer-verb"),
                 IconEntity = GetNetEntity(args.Using),
-                Act = () => TransferEntities(uid, args.Target, args.User, component, lockComponent, targetStorage, targetLock)
+                Act = () => TransferEntities(uid, args.Target, args.User, component, null, targetStorage, targetLock)
             };
 
             args.Verbs.Add(verb);
@@ -350,7 +341,7 @@ public abstract class SharedStorageSystem : EntitySystem
     /// <returns>true if inserted, false otherwise</returns>
     private void OnInteractUsing(EntityUid uid, StorageComponent storageComp, InteractUsingEvent args)
     {
-        if (args.Handled || !storageComp.ClickInsert || TryComp(uid, out LockComponent? lockComponent) && lockComponent.Locked)
+        if (args.Handled || !CanInteract(args.User, (uid, storageComp), storageComp.ClickInsert, false))
             return;
 
         if (HasComp<PlaceableSurfaceComponent>(uid))
@@ -368,7 +359,7 @@ public abstract class SharedStorageSystem : EntitySystem
     /// </summary>
     private void OnActivate(EntityUid uid, StorageComponent storageComp, ActivateInWorldEvent args)
     {
-        if (args.Handled || TryComp<LockComponent>(uid, out var lockComponent) && lockComponent.Locked)
+        if (args.Handled || !CanInteract(args.User, (uid, storageComp), storageComp.ClickInsert))
             return;
 
         // Toggle
@@ -378,7 +369,7 @@ public abstract class SharedStorageSystem : EntitySystem
         }
         else
         {
-            OpenStorageUI(uid, args.User, storageComp);
+            OpenStorageUI(uid, args.User, storageComp, false);
         }
 
         args.Handled = true;
@@ -392,7 +383,7 @@ public abstract class SharedStorageSystem : EntitySystem
         if (args.Handled)
             return;
 
-        OpenStorageUI(uid, args.Performer, storageComp);
+        OpenStorageUI(uid, args.Performer, storageComp, false);
         args.Handled = true;
     }
 
@@ -1403,7 +1394,7 @@ public abstract class SharedStorageSystem : EntitySystem
     }
 
     /// <summary>
-    /// Checks if a storage's UI is open by anyone when locked, and closes it unless they're an admin.
+    /// Checks if a storage's UI is open by anyone when locked, and closes it.
     /// </summary>
     private void OnLockToggled(EntityUid uid, StorageComponent component, ref LockToggledEvent args)
     {
@@ -1413,11 +1404,8 @@ public abstract class SharedStorageSystem : EntitySystem
         // Gets everyone looking at the UI
         foreach (var actor in _ui.GetActors(uid, StorageComponent.StorageUiKey.Key).ToList())
         {
-            if (_admin.HasAdminFlag(actor, AdminFlags.Admin))
-                continue;
-
-            // And closes it unless they're an admin
-            _ui.CloseUi(uid, StorageComponent.StorageUiKey.Key, actor);
+            if (!CanInteract(actor, (uid, component)))
+                _ui.CloseUi(uid, StorageComponent.StorageUiKey.Key, actor);
         }
     }
 
@@ -1457,7 +1445,7 @@ public abstract class SharedStorageSystem : EntitySystem
 
         if (!_ui.IsUiOpen(storageEnt.Value, StorageComponent.StorageUiKey.Key, playerEnt))
         {
-            OpenStorageUI(storageEnt.Value, playerEnt);
+            OpenStorageUI(storageEnt.Value, playerEnt, silent: false);
         }
         else
         {
@@ -1472,6 +1460,20 @@ public abstract class SharedStorageSystem : EntitySystem
 #endif
     }
 
+    private bool CanInteract(EntityUid user, Entity<StorageComponent> storage, bool canInteract = true, bool silent = true)
+    {
+        if (HasComp<BypassInteractionChecksComponent>(user))
+            return true;
+
+        if (!canInteract)
+            return false;
+
+        var ev = new StorageInteractAttemptEvent(silent);
+        RaiseLocalEvent(storage, ref ev);
+
+        return !ev.Cancelled;
+    }
+
     /// <summary>
     /// Plays a clientside pickup animation for the specified uid.
     /// </summary>
index ef682dd4f94cb4278a336cdad312ecb409d10269..2860f8dacfe82cbcfe1ef65f6a442fc26d837ddf 100644 (file)
@@ -5,7 +5,6 @@ using Robust.Shared.Audio;
 using Robust.Shared.Containers;
 using Robust.Shared.GameStates;
 using Robust.Shared.Map;
-using Robust.Shared.Player;
 using Robust.Shared.Prototypes;
 using Robust.Shared.Serialization;
 
@@ -228,6 +227,9 @@ namespace Content.Shared.Storage
         }
     }
 
+    [ByRefEvent]
+    public record struct StorageInteractAttemptEvent(bool Silent, bool Cancelled = false);
+
     [NetSerializable]
     [Serializable]
     public enum StorageVisuals : byte
index 8171ec0053caa5e96cf53f85f87a5c0ecbd46efc..b294729e07a46297a053291e2803f4cd4ea12f06 100644 (file)
@@ -90,6 +90,7 @@
   - type: InventorySlots
   - type: Loadout
     prototypes: [ MobAghostGear ]
+  - type: BypassInteractionChecks
 
 - type: entity
   id: ActionAGhostShowSolar