]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Predict inflatable barriers verb (#32420)
authorbeck-thompson <107373427+beck-thompson@users.noreply.github.com>
Thu, 10 Apr 2025 10:39:13 +0000 (03:39 -0700)
committerGitHub <noreply@github.com>
Thu, 10 Apr 2025 10:39:13 +0000 (20:39 +1000)
* First commit

* evil

* Made it not do weird things

* address review!

Content.Server/Engineering/Components/DisassembleOnAltVerbComponent.cs [deleted file]
Content.Server/Engineering/EntitySystems/DisassembleOnAltVerbSystem.cs [deleted file]
Content.Shared/Engineering/Components/DisassembleOnAltVerbComponent.cs [new file with mode: 0644]
Content.Shared/Engineering/Systems/DisassembleOnAltVerbSystem.cs [new file with mode: 0644]
Resources/Prototypes/Entities/Objects/Misc/inflatable_wall.yml

diff --git a/Content.Server/Engineering/Components/DisassembleOnAltVerbComponent.cs b/Content.Server/Engineering/Components/DisassembleOnAltVerbComponent.cs
deleted file mode 100644 (file)
index 6e4123e..0000000
+++ /dev/null
@@ -1,16 +0,0 @@
-using System.Threading;
-using Robust.Shared.Prototypes;
-using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
-
-namespace Content.Server.Engineering.Components
-{
-    [RegisterComponent]
-    public sealed partial class DisassembleOnAltVerbComponent : Component
-    {
-        [DataField("prototype", customTypeSerializer: typeof(PrototypeIdSerializer<EntityPrototype>))]
-        public string? Prototype { get; private set; }
-
-        [DataField("doAfter")]
-        public float DoAfterTime = 0;
-    }
-}
diff --git a/Content.Server/Engineering/EntitySystems/DisassembleOnAltVerbSystem.cs b/Content.Server/Engineering/EntitySystems/DisassembleOnAltVerbSystem.cs
deleted file mode 100644 (file)
index d694f84..0000000
+++ /dev/null
@@ -1,69 +0,0 @@
-using Content.Server.Engineering.Components;
-using Content.Shared.DoAfter;
-using Content.Shared.Hands.EntitySystems;
-using Content.Shared.Verbs;
-using JetBrains.Annotations;
-
-namespace Content.Server.Engineering.EntitySystems
-{
-    [UsedImplicitly]
-    public sealed class DisassembleOnAltVerbSystem : EntitySystem
-    {
-        [Dependency] private readonly SharedHandsSystem _handsSystem = default!;
-
-        public override void Initialize()
-        {
-            base.Initialize();
-
-            SubscribeLocalEvent<DisassembleOnAltVerbComponent, GetVerbsEvent<AlternativeVerb>>(AddDisassembleVerb);
-        }
-        private void AddDisassembleVerb(EntityUid uid, DisassembleOnAltVerbComponent component, GetVerbsEvent<AlternativeVerb> args)
-        {
-            if (!args.CanInteract || !args.CanAccess || args.Hands == null)
-                return;
-
-            AlternativeVerb verb = new()
-            {
-                Act = () =>
-                {
-                    AttemptDisassemble(uid, args.User, args.Target, component);
-                },
-                Text = Loc.GetString("disassemble-system-verb-disassemble"),
-                Priority = 2
-            };
-            args.Verbs.Add(verb);
-        }
-
-        public async void AttemptDisassemble(EntityUid uid, EntityUid user, EntityUid target, DisassembleOnAltVerbComponent? component = null)
-        {
-            if (!Resolve(uid, ref component))
-                return;
-            if (string.IsNullOrEmpty(component.Prototype))
-                return;
-
-            if (component.DoAfterTime > 0 && TryGet<SharedDoAfterSystem>(out var doAfterSystem))
-            {
-                var doAfterArgs = new DoAfterArgs(EntityManager, user, component.DoAfterTime, new AwaitedDoAfterEvent(), null)
-                {
-                    BreakOnMove = true,
-                };
-                var result = await doAfterSystem.WaitDoAfter(doAfterArgs);
-
-                if (result != DoAfterStatus.Finished)
-                    return;
-            }
-
-            if (component.Deleted || Deleted(uid))
-                return;
-
-            if (!TryComp(uid, out TransformComponent? transformComp))
-                return;
-
-            var entity = EntityManager.SpawnEntity(component.Prototype, transformComp.Coordinates);
-
-            _handsSystem.TryPickup(user, entity);
-
-            EntityManager.DeleteEntity(uid);
-        }
-    }
-}
diff --git a/Content.Shared/Engineering/Components/DisassembleOnAltVerbComponent.cs b/Content.Shared/Engineering/Components/DisassembleOnAltVerbComponent.cs
new file mode 100644 (file)
index 0000000..83d31b4
--- /dev/null
@@ -0,0 +1,28 @@
+using Content.Shared.DoAfter;
+using Robust.Shared.GameStates;
+using Robust.Shared.Prototypes;
+using Robust.Shared.Serialization;
+
+namespace Content.Shared.Engineering.Components;
+
+/// <summary>
+///     Add a verb to entities that will disassemble them after an optional doafter to a specified prototype.
+/// </summary>
+[RegisterComponent, NetworkedComponent, AutoGenerateComponentState]
+public sealed partial class DisassembleOnAltVerbComponent : Component
+{
+    /// <summary>
+    ///     The prototype that is spawned after disassembly. If null, nothing will spawn.
+    /// </summary>
+    [DataField, AutoNetworkedField]
+    public EntProtoId? PrototypeToSpawn;
+
+    /// <summary>
+    ///     The time it takes to disassemble the entity.
+    /// </summary>
+    [DataField, AutoNetworkedField]
+    public TimeSpan DisassembleTime = TimeSpan.FromSeconds(0);
+}
+
+[Serializable, NetSerializable]
+public sealed partial class DisassembleDoAfterEvent : SimpleDoAfterEvent;
diff --git a/Content.Shared/Engineering/Systems/DisassembleOnAltVerbSystem.cs b/Content.Shared/Engineering/Systems/DisassembleOnAltVerbSystem.cs
new file mode 100644 (file)
index 0000000..f64f246
--- /dev/null
@@ -0,0 +1,61 @@
+using Content.Shared.DoAfter;
+using Content.Shared.Engineering.Components;
+using Content.Shared.Hands.EntitySystems;
+using Content.Shared.Verbs;
+using Robust.Shared.Network;
+
+namespace Content.Shared.Engineering.Systems;
+
+public sealed partial class DisassembleOnAltVerbSystem : EntitySystem
+{
+    [Dependency] private readonly SharedDoAfterSystem _doAfter = default!;
+    [Dependency] private readonly SharedHandsSystem _handsSystem = default!;
+    [Dependency] private readonly INetManager _net = default!;
+
+    public override void Initialize()
+    {
+        base.Initialize();
+
+        SubscribeLocalEvent<DisassembleOnAltVerbComponent, GetVerbsEvent<AlternativeVerb>>(AddDisassembleVerb);
+        SubscribeLocalEvent<DisassembleOnAltVerbComponent, DisassembleDoAfterEvent>(OnDisassembleDoAfter);
+    }
+    private void AddDisassembleVerb(Entity<DisassembleOnAltVerbComponent> entity, ref GetVerbsEvent<AlternativeVerb> args)
+    {
+        if (!args.CanInteract || !args.CanAccess || args.Hands == null)
+            return;
+
+        // Doafter setup
+        var doAfterArgs = new DoAfterArgs(EntityManager,
+            args.User,
+            entity.Comp.DisassembleTime,
+            new DisassembleDoAfterEvent(),
+            entity,
+            entity)
+        {
+            BreakOnMove = true,
+        };
+
+        // Actual verb stuff
+        AlternativeVerb verb = new()
+        {
+            Act = () =>
+            {
+                _doAfter.TryStartDoAfter(doAfterArgs);
+            },
+            Text = Loc.GetString("disassemble-system-verb-disassemble"),
+            Priority = 2
+        };
+        args.Verbs.Add(verb);
+    }
+
+    private void OnDisassembleDoAfter(Entity<DisassembleOnAltVerbComponent> entity, ref DisassembleDoAfterEvent args)
+    {
+        if (!_net.IsServer) // This is odd but it works :)
+            return;
+
+        if (TrySpawnNextTo(entity.Comp.PrototypeToSpawn, entity.Owner, out var spawnedEnt))
+            _handsSystem.TryPickup(args.User, spawnedEnt.Value);
+
+        QueueDel(entity.Owner);
+    }
+}
index be732c17af03c8cc1644f89ce2ce66b860a73591..06410848476e327461aeee2472d9d9d1bb74ece5 100644 (file)
@@ -31,8 +31,8 @@
       - !type:DoActsBehavior
         acts: [ "Destruction" ]
   - type: DisassembleOnAltVerb
-    prototype: InflatableWallStack1
-    doAfter: 3
+    prototypeToSpawn: InflatableWallStack1
+    disassembleTime: 3
   - type: Airtight
   - type: Transform
     anchored: true
@@ -79,7 +79,7 @@
       - !type:DoActsBehavior
         acts: [ "Destruction" ]
   - type: DisassembleOnAltVerb
-    prototype: InflatableDoorStack1
-    doAfter: 3
+    prototypeToSpawn: InflatableDoorStack1
+    disassembleTime: 3
   - type: Occluder
     enabled: false