using Content.Server.Atmos; using Content.Server.Disposal.Tube.Components; using Content.Shared.Atmos; using Content.Shared.Body.Components; using Content.Shared.Item; using Robust.Shared.Containers; using Robust.Shared.Physics; namespace Content.Server.Disposal.Unit.Components { // TODO: Add gas [RegisterComponent] public sealed class DisposalHolderComponent : Component, IGasMixtureHolder { [Dependency] private readonly IEntityManager _entMan = default!; public Container Container = null!; /// /// The total amount of time that it will take for this entity to /// be pushed to the next tube /// [ViewVariables] public float StartingTime { get; set; } /// /// Time left until the entity is pushed to the next tube /// [ViewVariables] public float TimeLeft { get; set; } [ViewVariables] public IDisposalTubeComponent? PreviousTube { get; set; } [ViewVariables] public Direction PreviousDirection { get; set; } = Direction.Invalid; [ViewVariables] public Direction PreviousDirectionFrom => (PreviousDirection == Direction.Invalid) ? Direction.Invalid : PreviousDirection.GetOpposite(); [ViewVariables] public IDisposalTubeComponent? CurrentTube { get; set; } // CurrentDirection is not null when CurrentTube isn't null. [ViewVariables] public Direction CurrentDirection { get; set; } = Direction.Invalid; /// Mistake prevention [ViewVariables] public bool IsExitingDisposals { get; set; } = false; /// /// A list of tags attached to the content, used for sorting /// [ViewVariables] public HashSet Tags { get; set; } = new(); [ViewVariables] [DataField("air")] public GasMixture Air { get; set; } = new (70); protected override void Initialize() { base.Initialize(); Container = ContainerHelpers.EnsureContainer(Owner, nameof(DisposalHolderComponent)); } private bool CanInsert(EntityUid entity) { if (!Container.CanInsert(entity)) { return false; } return _entMan.HasComponent(entity) || _entMan.HasComponent(entity); } public bool TryInsert(EntityUid entity) { if (!CanInsert(entity) || !Container.Insert(entity)) { return false; } if (_entMan.TryGetComponent(entity, out IPhysBody? physics)) { physics.CanCollide = false; } return true; } } }