using Content.Server.Hands.Components; using Content.Server.Items; using Content.Shared.Acts; using Content.Shared.Item; using Content.Shared.Popups; using Robust.Shared.Containers; using Robust.Shared.GameObjects; using Robust.Shared.IoC; using Robust.Shared.Localization; using Robust.Shared.Serialization.Manager.Attributes; using Robust.Shared.ViewVariables; namespace Content.Server.Storage.Components { /// /// Logic for secret single slot stash, like plant pot or toilet cistern /// [RegisterComponent] public class SecretStashComponent : Component, IDestroyAct { [Dependency] private readonly IEntityManager _entities = default!; public override string Name => "SecretStash"; [ViewVariables] [DataField("maxItemSize")] private int _maxItemSize = (int) ReferenceSizes.Pocket; [ViewVariables] [DataField("secretPartName")] private readonly string? _secretPartNameOverride = null; [ViewVariables] private ContainerSlot _itemContainer = default!; public string SecretPartName => _secretPartNameOverride ?? Loc.GetString("comp-secret-stash-secret-part-name", ("name", IoCManager.Resolve().GetComponent(Owner).EntityName)); protected override void Initialize() { base.Initialize(); _itemContainer = ContainerHelpers.EnsureContainer(Owner, "stash", out _); } /// /// Tries to hide item inside secret stash from hands of user /// /// /// /// True if item was hidden inside stash public bool TryHideItem(EntityUid user, EntityUid itemToHide) { if (_itemContainer.ContainedEntity != null) { Owner.PopupMessage(user, Loc.GetString("comp-secret-stash-action-hide-container-not-empty")); return false; } if (!IoCManager.Resolve().TryGetComponent(itemToHide, out ItemComponent? item)) return false; if (item.Size > _maxItemSize) { Owner.PopupMessage(user, Loc.GetString("comp-secret-stash-action-hide-item-too-big",("item", itemToHide),("stash", SecretPartName))); return false; } if (!IoCManager.Resolve().TryGetComponent(user, out HandsComponent? hands)) return false; if (!hands.Drop(itemToHide, _itemContainer)) return false; Owner.PopupMessage(user, Loc.GetString("comp-secret-stash-action-hide-success", ("item", itemToHide), ("this", SecretPartName))); return true; } /// /// Try get item and place it in users hand /// If user can't take it by hands, will drop item from container /// /// /// True if user recieved item public bool TryGetItem(EntityUid user) { if (_itemContainer.ContainedEntity is not {Valid: true} contained) return false; Owner.PopupMessage(user, Loc.GetString("comp-secret-stash-action-get-item-found-something", ("stash", SecretPartName))); if (IoCManager.Resolve().TryGetComponent(user, out HandsComponent? hands)) { if (!IoCManager.Resolve().TryGetComponent(contained, out ItemComponent? item)) return false; hands.PutInHandOrDrop(item); } else if (_itemContainer.Remove(contained)) { IoCManager.Resolve().GetComponent(contained).Coordinates = IoCManager.Resolve().GetComponent(Owner).Coordinates; } return true; } /// /// Is there something inside secret stash item container? /// /// public bool HasItemInside() { return _itemContainer.ContainedEntity != null; } public void OnDestroy(DestructionEventArgs eventArgs) { // drop item inside if (_itemContainer.ContainedEntity is {Valid: true} contained) { _entities.GetComponent(contained).Coordinates = _entities.GetComponent(Owner).Coordinates; } } } }