]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Remove instant cryobed insertion (#34619)
authorBooblesnoot42 <108703193+Booblesnoot42@users.noreply.github.com>
Wed, 5 Feb 2025 14:46:21 +0000 (09:46 -0500)
committerGitHub <noreply@github.com>
Wed, 5 Feb 2025 14:46:21 +0000 (15:46 +0100)
* added optional delay to DragInsertContainerComponent

* comments

* Change EntryDelay on DragInsertContainerComponent to use TimeSpan + cleanup

* changed drag insert container comp to match naming conventions

Content.Shared/Containers/DragInsertContainerComponent.cs
Content.Shared/Containers/DragInsertContainerSystem.cs
Resources/Prototypes/Entities/Structures/cryogenic_sleep_unit.yml

index e4cae26fcb1d23214d6fcddb6a97e4049e838882..23cf3f65580e482717a833504b346b42f08388cd 100644 (file)
@@ -17,4 +17,16 @@ public sealed partial class DragInsertContainerComponent : Component
     /// </summary>
     [DataField, ViewVariables(VVAccess.ReadWrite)]
     public bool UseVerbs = true;
+
+    /// <summary>
+    /// The delay in seconds before a drag will be completed.
+    /// </summary>
+    [DataField]
+    public TimeSpan EntryDelay = TimeSpan.Zero;
+
+    /// <summary>
+    /// If entry delay isn't zero, this sets whether an entity dragging itself into the container should be delayed.
+    /// </summary>
+    [DataField]
+    public bool DelaySelfEntry = false;
 }
index b7f5eb500be3145fc4c5069705b4183dac743f48..8ccf00370335c46defadcbd37c7ea46e586588d5 100644 (file)
@@ -2,24 +2,28 @@ using Content.Shared.ActionBlocker;
 using Content.Shared.Administration.Logs;
 using Content.Shared.Climbing.Systems;
 using Content.Shared.Database;
+using Content.Shared.DoAfter;
 using Content.Shared.DragDrop;
 using Content.Shared.Verbs;
 using Robust.Shared.Containers;
+using Robust.Shared.Serialization;
 
 namespace Content.Shared.Containers;
 
-public sealed class DragInsertContainerSystem : EntitySystem
+public sealed partial class DragInsertContainerSystem : EntitySystem
 {
     [Dependency] private readonly ISharedAdminLogManager _adminLog = default!;
     [Dependency] private readonly ActionBlockerSystem _actionBlocker = default!;
     [Dependency] private readonly ClimbSystem _climb = default!;
     [Dependency] private readonly SharedContainerSystem _container = default!;
+    [Dependency] private readonly SharedDoAfterSystem _doAfter = default!;
 
     public override void Initialize()
     {
         base.Initialize();
 
         SubscribeLocalEvent<DragInsertContainerComponent, DragDropTargetEvent>(OnDragDropOn, before: new []{ typeof(ClimbSystem)});
+        SubscribeLocalEvent<DragInsertContainerComponent, DragInsertContainerDoAfterEvent>(OnDragFinished);
         SubscribeLocalEvent<DragInsertContainerComponent, CanDropTargetEvent>(OnCanDragDropOn);
         SubscribeLocalEvent<DragInsertContainerComponent, GetVerbsEvent<AlternativeVerb>>(OnGetAlternativeVerb);
     }
@@ -33,7 +37,34 @@ public sealed class DragInsertContainerSystem : EntitySystem
         if (!_container.TryGetContainer(ent, comp.ContainerId, out var container))
             return;
 
-        args.Handled = Insert(args.Dragged, args.User, ent, container);
+        if (comp.EntryDelay <= TimeSpan.Zero ||
+            !comp.DelaySelfEntry && args.User == args.Dragged)
+        {
+            //instant insertion
+            args.Handled = Insert(args.Dragged, args.User, ent, container);
+            return;
+        }
+
+        //delayed insertion
+        var doAfterArgs = new DoAfterArgs(EntityManager, args.User, comp.EntryDelay, new DragInsertContainerDoAfterEvent(), ent, args.Dragged, ent)
+        {
+            BreakOnDamage = true,
+            BreakOnMove = true,
+            NeedHand = false,
+        };
+        _doAfter.TryStartDoAfter(doAfterArgs);
+        args.Handled = true;
+    }
+
+    private void OnDragFinished(Entity<DragInsertContainerComponent> ent, ref DragInsertContainerDoAfterEvent args)
+    {
+        if (args.Handled || args.Cancelled || args.Args.Target == null)
+            return;
+
+        if (!_container.TryGetContainer(ent, ent.Comp.ContainerId, out var container))
+            return;
+
+        Insert(args.Args.Target.Value, args.User, ent, container);
     }
 
     private void OnCanDragDropOn(Entity<DragInsertContainerComponent> ent, ref CanDropTargetEvent args)
@@ -117,4 +148,9 @@ public sealed class DragInsertContainerSystem : EntitySystem
         _adminLog.Add(LogType.Action, LogImpact.Medium, $"{ToPrettyString(user):player} inserted {ToPrettyString(target):player} into container {ToPrettyString(containerEntity)}");
         return true;
     }
+
+    [Serializable, NetSerializable]
+    public sealed partial class DragInsertContainerDoAfterEvent : SimpleDoAfterEvent
+    {
+    }
 }
index e9e9294e6364f0bd75141f7ee516d12d5d3f6f0b..6ba988dc801ae6818e5e26e6e3a7ce45c82b1bb9 100644 (file)
@@ -25,6 +25,7 @@
     canCollide: false
   - type: DragInsertContainer
     containerId: storage
+    entryDelay: 2
   - type: ExitContainerOnMove
     containerId: storage
   - type: PointLight