using System; using System.Collections.Generic; using JetBrains.Annotations; using Robust.Shared.GameObjects; using Robust.Shared.IoC; using Robust.Shared.Serialization; using Robust.Shared.Serialization.Manager.Attributes; using Robust.Shared.ViewVariables; namespace Robust.Shared.Containers { [UsedImplicitly] [SerializedType(ClassName)] public sealed class ContainerSlot : BaseContainer { private const string ClassName = "ContainerSlot"; /// public override IReadOnlyList ContainedEntities { get { if (ContainedEntity == null) return Array.Empty(); return _containedEntityArray; } } [ViewVariables] [DataField("ent")] public EntityUid? ContainedEntity { get => _containedEntity; private set { _containedEntity = value; if (value != null) _containedEntityArray[0] = value!.Value; } } public override List ExpectedEntities => _expectedEntities; private EntityUid? _containedEntity; private readonly List _expectedEntities = new(); // Used by ContainedEntities to avoid allocating. private readonly EntityUid[] _containedEntityArray = new EntityUid[1]; /// public override string ContainerType => ClassName; /// public override bool CanInsert(EntityUid toinsert, IEntityManager? entMan = null) { return (ContainedEntity == null) && CanInsertIfEmpty(toinsert, entMan); } /// /// Checks if the entity can be inserted into this container, assuming that the container slot is empty. /// /// /// Useful if you need to know whether an item could be inserted into a slot, without having to actually eject /// the currently contained entity first. /// /// The entity to attempt to insert. /// True if the entity could be inserted into an empty slot, false otherwise. public bool CanInsertIfEmpty(EntityUid toinsert, IEntityManager? entMan = null) { return base.CanInsert(toinsert, entMan); } /// public override bool Contains(EntityUid contained) { if (contained == ContainedEntity) return true; return false; } /// protected override void InternalInsert(EntityUid toinsert, IEntityManager entMan, MetaDataComponent? meta = null) { ContainedEntity = toinsert; base.InternalInsert(toinsert, entMan, meta); } /// protected override void InternalRemove(EntityUid toremove, IEntityManager entMan, MetaDataComponent? meta = null) { ContainedEntity = null; base.InternalRemove(toremove, entMan, meta); } /// public override void Shutdown() { base.Shutdown(); if (ContainedEntity is {} contained) { IoCManager.Resolve().DeleteEntity(contained); } } } }