diff --git a/Content.Shared/Containers/ContainerCompComponent.cs b/Content.Shared/Containers/ContainerCompComponent.cs new file mode 100644 index 0000000000..b1415e0d8b --- /dev/null +++ b/Content.Shared/Containers/ContainerCompComponent.cs @@ -0,0 +1,17 @@ +using Robust.Shared.GameStates; +using Robust.Shared.Prototypes; + +namespace Content.Shared.Containers; + +/// +/// Applies container changes whenever an entity is inserted into the specified container on this entity. +/// +[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 index 0000000000..1e1983a331 --- /dev/null +++ b/Content.Shared/Containers/ContainerCompSystem.cs @@ -0,0 +1,44 @@ +using Robust.Shared.Containers; +using Robust.Shared.Prototypes; + +namespace Content.Shared.Containers; + +/// +/// Applies / removes an entity prototype from a child entity when it's inserted into a container. +/// +public sealed class ContainerCompSystem : EntitySystem +{ + [Dependency] private readonly IPrototypeManager _proto = default!; + + public override void Initialize() + { + base.Initialize(); + SubscribeLocalEvent(OnConInsert); + SubscribeLocalEvent(OnConRemove); + } + + private void OnConRemove(Entity 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 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); + } + } +}