using Content.Shared.Inventory; using Content.Shared.Foldable; namespace Content.Shared._Amour.Hole; public partial class SharedHoleSystem { [Dependency] private readonly InventorySystem _inventory = default!; public bool HasAccessTo(Entity entity, string to) { if (!Resolve(entity.Owner, ref entity.Comp1) || !TryFind(entity, to, out var hole)) return false; return HasAccessTo(entity, new Entity(hole.Owner, hole.Comp)); } public bool HasAccessTo(Entity entity, Entity hole) { if (!Resolve(entity, ref entity.Comp1) || !Resolve(hole, ref hole.Comp)) return false; if (!Resolve(entity, ref entity.Comp2)) return true; foreach (var slot in hole.Comp.HoleNotVisibleIn) { if (slot == "jumpsuit" && _inventory.TryGetSlotEntity(entity, "jumpsuit", out var jumpsuit, entity) && TryComp(jumpsuit, out var foldedItem) && foldedItem.IsFolded && hole.Comp.IsVisibleInFoldedJumpsuit) continue; if (_inventory.TryGetSlotEntity(entity, slot, out var item, entity) && !(HasComp(item) && hole.Comp.IsVisibleInSkirt)) { return false; } } return true; } public bool TryFind(Entity entity, string to, out Entity hole) { hole = new Entity(); if (!Resolve(entity.Owner, ref entity.Comp)) return false; foreach (var holeUid in entity.Comp.Slot.ContainedEntities) { if (!TryComp(holeUid, out var holeComponent) || holeComponent.HoleName != to) continue; hole.Owner = holeUid; hole.Comp = holeComponent; return true; } return false; } }