]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Delete unremoveable items when removed from hands or inventory (#15662)
authorbrainfood1183 <113240905+brainfood1183@users.noreply.github.com>
Mon, 24 Apr 2023 00:20:39 +0000 (01:20 +0100)
committerGitHub <noreply@github.com>
Mon, 24 Apr 2023 00:20:39 +0000 (10:20 +1000)
Content.Shared/Interaction/Components/UnremoveableComponent.cs
Content.Shared/Interaction/SharedInteractionSystem.cs
Resources/Prototypes/Entities/Clothing/Back/backpacks.yml

index b2fe954b3fdacb0a25950d3a617a634265bfefe9..bcf294a657550efb2ec5577cfbb758def6266b6a 100644 (file)
@@ -1,8 +1,17 @@
+using Content.Shared.Whitelist;
 using Robust.Shared.GameStates;
 
 namespace Content.Shared.Interaction.Components
 {
     [RegisterComponent]
     [NetworkedComponent]
-    public sealed class UnremoveableComponent : Component {}
+    public sealed class UnremoveableComponent : Component
+    {
+        /// <summary>
+        /// If this is true then unremovable items that are removed from inventory are deleted (typically from corpse gibbing).
+        /// Items within unremovable containers are not deleted when removed.
+        /// </summary>
+        [DataField("deleteOnDrop")]
+        public bool DeleteOnDrop = true;
+    }
 }
index 7d8de660a231c7ab336c49d3b017e4c66a9bd1a4..ac6582f5715e41cdd2691a861bcd5f1c5b10d7f6 100644 (file)
@@ -1,3 +1,4 @@
+using System.ComponentModel;
 using System.Diagnostics.CodeAnalysis;
 using System.Linq;
 using Content.Shared.ActionBlocker;
@@ -7,11 +8,13 @@ using Content.Shared.Administration.Managers;
 using Content.Shared.CombatMode;
 using Content.Shared.Database;
 using Content.Shared.Ghost;
+using Content.Shared.Hands;
 using Content.Shared.Hands.Components;
 using Content.Shared.Input;
 using Content.Shared.Interaction.Components;
 using Content.Shared.Interaction.Events;
 using Content.Shared.Inventory;
+using Content.Shared.Inventory.Events;
 using Content.Shared.Item;
 using Content.Shared.Movement.Components;
 using Content.Shared.Physics;
@@ -24,9 +27,11 @@ using Content.Shared.Verbs;
 using Content.Shared.Wall;
 using JetBrains.Annotations;
 using Robust.Shared.Containers;
+using Robust.Shared.GameObjects;
 using Robust.Shared.Input;
 using Robust.Shared.Input.Binding;
 using Robust.Shared.Map;
+using Robust.Shared.Network;
 using Robust.Shared.Physics;
 using Robust.Shared.Physics.Components;
 using Robust.Shared.Physics.Systems;
@@ -46,6 +51,7 @@ namespace Content.Shared.Interaction
     public abstract partial class SharedInteractionSystem : EntitySystem
     {
         [Dependency] private readonly IGameTiming _gameTiming = default!;
+        [Dependency] private readonly INetManager _net = default!;
         [Dependency] private readonly IMapManager _mapManager = default!;
         [Dependency] private readonly ISharedAdminManager _adminManager = default!;
         [Dependency] private readonly ISharedAdminLogManager _adminLogger = default!;
@@ -76,6 +82,9 @@ namespace Content.Shared.Interaction
             SubscribeLocalEvent<BoundUserInterfaceMessageAttempt>(OnBoundInterfaceInteractAttempt);
             SubscribeAllEvent<InteractInventorySlotEvent>(HandleInteractInventorySlotEvent);
             SubscribeLocalEvent<UnremoveableComponent, ContainerGettingRemovedAttemptEvent>(OnRemoveAttempt);
+            SubscribeLocalEvent<UnremoveableComponent, GotUnequippedEvent>(OnUnequip);
+            SubscribeLocalEvent<UnremoveableComponent, GotUnequippedHandEvent>(OnUnequipHand);
+            SubscribeLocalEvent<UnremoveableComponent, DroppedEvent>(OnDropped);
 
             CommandBinds.Builder
                 .Bind(ContentKeyFunctions.AltActivateItemInWorld,
@@ -133,6 +142,35 @@ namespace Content.Shared.Interaction
             args.Cancel();
         }
 
+        /// <summary>
+        ///     If item has DeleteOnDrop true then item will be deleted if removed from inventory, if it is false then item
+        ///     loses Unremoveable when removed from inventory (gibbing).
+        /// </summary>
+        private void OnUnequip(EntityUid uid, UnremoveableComponent item, GotUnequippedEvent args)
+        {
+            if (!item.DeleteOnDrop)
+                RemCompDeferred<UnremoveableComponent>(uid);
+            else if (_net.IsServer)
+                QueueDel(uid);
+        }
+
+        private void OnUnequipHand(EntityUid uid, UnremoveableComponent item, GotUnequippedHandEvent args)
+        {
+            if (!item.DeleteOnDrop)
+                RemCompDeferred<UnremoveableComponent>(uid);
+            else if (_net.IsServer)
+                QueueDel(uid);
+        }
+
+        private void OnDropped(EntityUid uid, UnremoveableComponent item, DroppedEvent args)
+        {
+            if (!item.DeleteOnDrop)
+                RemCompDeferred<UnremoveableComponent>(uid);
+            else if (_net.IsServer)
+                QueueDel(uid);
+        }
+
+
         private bool HandleTryPullObject(ICommonSession? session, EntityCoordinates coords, EntityUid uid)
         {
             if (!ValidateClientInput(session, coords, uid, out var userEntity))
index e898f592123d89427249a7ad64111b0710fc2fec..9e1a1dc94c8102742da910f332e4eda3b3050a44 100644 (file)
   - type: Sprite
     sprite: Clothing/Back/Backpacks/cluwne.rsi
   - type: Unremoveable
+    deleteOnDrop: false
+