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);
}
}
}
}