using System.Collections.Generic; using System.Linq; using JetBrains.Annotations; using Robust.Shared.GameObjects; using Robust.Shared.IoC; using Robust.Shared.Serialization; namespace Robust.Shared.Containers { /// /// Default implementation for containers, /// cannot be inherited. If additional logic is needed, /// this logic should go on the systems that are holding this container. /// For example, inventory containers should be modified only through an inventory component. /// [UsedImplicitly] [SerializedType(ClassName)] public sealed class Container : BaseContainer { private const string ClassName = "Container"; /// /// The generic container class uses a list of entities /// private List _containerList = new(); /// public override IReadOnlyList ContainedEntities => _containerList; /// public override string ContainerType => ClassName; /// public override void ExposeData(ObjectSerializer serializer) { base.ExposeData(serializer); #if SERV3 // ONLY PAUL CAN MAKE ME WHOLE serializer.DataField(ref _containerList, "ents", new List()); #else if (serializer.Writing) { serializer.DataWriteFunction("ents", new List(), () => _containerList.Select(e => e.Uid).ToList()); } else { var entMan = IoCManager.Resolve(); serializer.DataReadFunction("ents", new List(), value => _containerList = value.Select((uid => entMan.GetEntity(uid))).ToList()); } #endif } /// protected override void InternalInsert(IEntity toinsert) { _containerList.Add(toinsert); base.InternalInsert(toinsert); } /// protected override void InternalRemove(IEntity toremove) { _containerList.Remove(toremove); base.InternalRemove(toremove); } /// public override bool Contains(IEntity contained) { return _containerList.Contains(contained); } /// public override void Shutdown() { base.Shutdown(); foreach (var entity in _containerList) { entity.Delete(); } } } }