]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Give prototype refactor (#29697)
authorShadowCommander <10494922+ShadowCommander@users.noreply.github.com>
Thu, 19 Sep 2024 00:08:37 +0000 (17:08 -0700)
committerGitHub <noreply@github.com>
Thu, 19 Sep 2024 00:08:37 +0000 (10:08 +1000)
* Update GivePrototype

* File scoped namespace

* Change to EntProtoId instead of ProtoId<> for better validation

Content.Server/Construction/Completions/GivePrototype.cs

index f45bd5ba1052870280bfe2ebb5e457236edbcec5..f05feb70c0346d74ac0060acb90a2704e13da8a4 100644 (file)
@@ -1,44 +1,50 @@
 using Content.Server.Stack;
 using Content.Shared.Construction;
+using Content.Shared.Hands.Components;
 using Content.Shared.Hands.EntitySystems;
 using Content.Shared.Prototypes;
 using Content.Shared.Stacks;
 using JetBrains.Annotations;
 using Robust.Shared.Prototypes;
-using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
 
-namespace Content.Server.Construction.Completions
+namespace Content.Server.Construction.Completions;
+
+[UsedImplicitly]
+[DataDefinition]
+public sealed partial class GivePrototype : IGraphAction
 {
-    [UsedImplicitly]
-    [DataDefinition]
-    public sealed partial class GivePrototype : IGraphAction
+    [DataField]
+    public EntProtoId Prototype { get; private set; } = string.Empty;
+
+    [DataField]
+    public int Amount { get; private set; } = 1;
+
+    public void PerformAction(EntityUid uid, EntityUid? userUid, IEntityManager entityManager)
     {
-        [DataField("prototype", customTypeSerializer:typeof(PrototypeIdSerializer<EntityPrototype>))]
-        public string Prototype { get; private set; } = string.Empty;
-        [DataField("amount")]
-        public int Amount { get; private set; } = 1;
+        if (string.IsNullOrEmpty(Prototype))
+            return;
 
-        public void PerformAction(EntityUid uid, EntityUid? userUid, IEntityManager entityManager)
+        if (EntityPrototypeHelpers.HasComponent<StackComponent>(Prototype))
         {
-            if (string.IsNullOrEmpty(Prototype))
-                return;
+            var stackSystem = entityManager.EntitySysManager.GetEntitySystem<StackSystem>();
+            var stacks = stackSystem.SpawnMultiple(Prototype, Amount, userUid ?? uid);
 
-            var coordinates = entityManager.GetComponent<TransformComponent>(userUid ?? uid).Coordinates;
+            if (userUid is null || !entityManager.TryGetComponent(userUid, out HandsComponent? handsComp))
+                return;
 
-            if (EntityPrototypeHelpers.HasComponent<StackComponent>(Prototype))
+            foreach (var item in stacks)
             {
-                var stackEnt = entityManager.SpawnEntity(Prototype, coordinates);
-                var stack = entityManager.GetComponent<StackComponent>(stackEnt);
-                entityManager.EntitySysManager.GetEntitySystem<StackSystem>().SetCount(stackEnt, Amount, stack);
-                entityManager.EntitySysManager.GetEntitySystem<SharedHandsSystem>().PickupOrDrop(userUid, stackEnt);
+                stackSystem.TryMergeToHands(item, userUid.Value, hands: handsComp);
             }
-            else
+        }
+        else
+        {
+            var handsSystem = entityManager.EntitySysManager.GetEntitySystem<SharedHandsSystem>();
+            var handsComp = userUid is not null ? entityManager.GetComponent<HandsComponent>(userUid.Value) : null;
+            for (var i = 0; i < Amount; i++)
             {
-                for (var i = 0; i < Amount; i++)
-                {
-                    var item = entityManager.SpawnEntity(Prototype, coordinates);
-                    entityManager.EntitySysManager.GetEntitySystem<SharedHandsSystem>().PickupOrDrop(userUid, item);
-                }
+                var item = entityManager.SpawnNextToOrDrop(Prototype, userUid ?? uid);
+                handsSystem.PickupOrDrop(userUid, item, handsComp: handsComp);
             }
         }
     }