]> git.smokeofanarchy.ru Git - space-station-14.git/commitdiff
Add ContainerComp (#31311)
authormetalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
Sun, 25 Aug 2024 12:06:06 +0000 (22:06 +1000)
committerGitHub <noreply@github.com>
Sun, 25 Aug 2024 12:06:06 +0000 (22:06 +1000)
Applies EntProtoId changes upon insertion / removal from container. Can also be useful for borgs / mechs / vehicles in future but atm I just used it for AI.

Content.Shared/Containers/ContainerCompComponent.cs [new file with mode: 0644]
Content.Shared/Containers/ContainerCompSystem.cs [new file with mode: 0644]

diff --git a/Content.Shared/Containers/ContainerCompComponent.cs b/Content.Shared/Containers/ContainerCompComponent.cs
new file mode 100644 (file)
index 0000000..b1415e0
--- /dev/null
@@ -0,0 +1,17 @@
+using Robust.Shared.GameStates;
+using Robust.Shared.Prototypes;
+
+namespace Content.Shared.Containers;
+
+/// <summary>
+/// Applies container changes whenever an entity is inserted into the specified container on this entity.
+/// </summary>
+[RegisterComponent, NetworkedComponent]
+public sealed partial class ContainerCompComponent : Component
+{
+    [DataField(required: true)]
+    public EntProtoId Proto;
+
+    [DataField(required: true)]
+    public string Container = string.Empty;
+}
diff --git a/Content.Shared/Containers/ContainerCompSystem.cs b/Content.Shared/Containers/ContainerCompSystem.cs
new file mode 100644 (file)
index 0000000..1e1983a
--- /dev/null
@@ -0,0 +1,44 @@
+using Robust.Shared.Containers;
+using Robust.Shared.Prototypes;
+
+namespace Content.Shared.Containers;
+
+/// <summary>
+/// Applies / removes an entity prototype from a child entity when it's inserted into a container.
+/// </summary>
+public sealed class ContainerCompSystem : EntitySystem
+{
+    [Dependency] private readonly IPrototypeManager _proto = default!;
+
+    public override void Initialize()
+    {
+        base.Initialize();
+        SubscribeLocalEvent<ContainerCompComponent, EntInsertedIntoContainerMessage>(OnConInsert);
+        SubscribeLocalEvent<ContainerCompComponent, EntRemovedFromContainerMessage>(OnConRemove);
+    }
+
+    private void OnConRemove(Entity<ContainerCompComponent> ent, ref EntRemovedFromContainerMessage args)
+    {
+        if (args.Container.ID != ent.Comp.Container)
+            return;
+
+        if (_proto.TryIndex(ent.Comp.Container, out var entProto))
+        {
+            foreach (var entry in entProto.Components.Values)
+            {
+                RemComp(args.Entity, entry.Component);
+            }
+        }
+    }
+
+    private void OnConInsert(Entity<ContainerCompComponent> ent, ref EntInsertedIntoContainerMessage args)
+    {
+        if (args.Container.ID != ent.Comp.Container)
+            return;
+
+        if (_proto.TryIndex(ent.Comp.Proto, out var entProto))
+        {
+            EntityManager.AddComponents(args.Entity, entProto.Components);
+        }
+    }
+}