diff --git a/Content.Shared/Access/Components/AccessComponent.cs b/Content.Shared/Access/Components/AccessComponent.cs index cc971d713d..1df8facafa 100644 --- a/Content.Shared/Access/Components/AccessComponent.cs +++ b/Content.Shared/Access/Components/AccessComponent.cs @@ -21,4 +21,17 @@ namespace Content.Shared.Access.Components [DataField("groups", readOnly: true, customTypeSerializer: typeof(PrototypeIdHashSetSerializer))] public readonly HashSet Groups = new(); } + + /// + /// Event raised on an entity to find additional entities which provide access. + /// + [ByRefEvent] + public struct GetAdditionalAccessEvent + { + public HashSet Entities = new(); + + public GetAdditionalAccessEvent() + { + } + } } diff --git a/Content.Shared/Access/Systems/AccessReaderSystem.cs b/Content.Shared/Access/Systems/AccessReaderSystem.cs index 692b574f0f..6e2336d1cb 100644 --- a/Content.Shared/Access/Systems/AccessReaderSystem.cs +++ b/Content.Shared/Access/Systems/AccessReaderSystem.cs @@ -108,7 +108,7 @@ namespace Content.Shared.Access.Systems /// /// Finds the access tags on the given entity /// - /// The entity that to search. + /// The entity that is being searched. public ICollection FindAccessTags(EntityUid uid) { HashSet? tags = null; @@ -117,18 +117,19 @@ namespace Content.Shared.Access.Systems // check entity itself FindAccessTagsItem(uid, ref tags, ref owned); - foreach (var item in _handsSystem.EnumerateHeld(uid)) + FindAccessItemsInventory(uid, out var items); + + var ev = new GetAdditionalAccessEvent { - FindAccessTagsItem(item, ref tags, ref owned); + Entities = items + }; + RaiseLocalEvent(uid, ref ev); + foreach (var ent in ev.Entities) + { + FindAccessTagsItem(ent, ref tags, ref owned); } - // maybe its inside an inventory slot? - if (_inventorySystem.TryGetSlotEntity(uid, "id", out var idUid)) - { - FindAccessTagsItem(idUid.Value, ref tags, ref owned); - } - - return ((ICollection?) tags) ?? Array.Empty(); + return (ICollection?) tags ?? Array.Empty(); } /// @@ -163,6 +164,24 @@ namespace Content.Shared.Access.Systems } } + public bool FindAccessItemsInventory(EntityUid uid, out HashSet items) + { + items = new(); + + foreach (var item in _handsSystem.EnumerateHeld(uid)) + { + items.Add(item); + } + + // maybe its inside an inventory slot? + if (_inventorySystem.TryGetSlotEntity(uid, "id", out var idUid)) + { + items.Add(idUid.Value); + } + + return items.Any(); + } + /// /// Try to find on this item /// or inside this item (if it's pda) diff --git a/Content.Shared/Vehicle/SharedVehicleSystem.cs b/Content.Shared/Vehicle/SharedVehicleSystem.cs index bad50ffc38..e47c768ec0 100644 --- a/Content.Shared/Vehicle/SharedVehicleSystem.cs +++ b/Content.Shared/Vehicle/SharedVehicleSystem.cs @@ -1,3 +1,6 @@ +using System.Linq; +using Content.Shared.Access.Components; +using Content.Shared.Access.Systems; using Content.Shared.Vehicle.Components; using Content.Shared.Actions; using Content.Shared.Buckle.Components; @@ -9,6 +12,8 @@ using Robust.Shared.Serialization; using Robust.Shared.Containers; using Content.Shared.Tag; using Content.Shared.Audio; +using Content.Shared.Hands.EntitySystems; +using Content.Shared.Inventory; namespace Content.Shared.Vehicle; @@ -24,6 +29,7 @@ public abstract partial class SharedVehicleSystem : EntitySystem [Dependency] private readonly SharedAmbientSoundSystem _ambientSound = default!; [Dependency] private readonly SharedTransformSystem _transform = default!; [Dependency] private readonly TagSystem _tagSystem = default!; + [Dependency] private readonly AccessReaderSystem _access = default!; private const string KeySlot = "key_slot"; @@ -37,6 +43,7 @@ public abstract partial class SharedVehicleSystem : EntitySystem SubscribeLocalEvent(OnVehicleRotate); SubscribeLocalEvent(OnEntInserted); SubscribeLocalEvent(OnEntRemoved); + SubscribeLocalEvent(OnGetAdditionalAccess); } /// @@ -177,6 +184,17 @@ public abstract partial class SharedVehicleSystem : EntitySystem } } + private void OnGetAdditionalAccess(EntityUid uid, VehicleComponent component, ref GetAdditionalAccessEvent args) + { + if (component.Rider == null) + return; + var rider = component.Rider.Value; + + args.Entities.Add(rider); + _access.FindAccessItemsInventory(rider, out var items); + args.Entities = args.Entities.Union(items).ToHashSet(); + } + /// /// Set the draw depth for the sprite. /// diff --git a/Resources/Prototypes/Entities/Objects/Vehicles/buckleable.yml b/Resources/Prototypes/Entities/Objects/Vehicles/buckleable.yml index 5bdd52d8c9..392cdc3122 100644 --- a/Resources/Prototypes/Entities/Objects/Vehicles/buckleable.yml +++ b/Resources/Prototypes/Entities/Objects/Vehicles/buckleable.yml @@ -89,10 +89,6 @@ map: ["enum.VehicleVisualLayers.AutoAnimate"] netsync: false noRot: true - - type: Access - tags: - - Maintenance - - Janitor - type: UnpoweredFlashlight toggleAction: name: action-name-toggle-light @@ -180,12 +176,6 @@ map: ["enum.VehicleVisualLayers.AutoAnimate"] netsync: false noRot: true - - type: Access - tags: - - Security - - Brig - - Maintenance - - Service - type: Strap buckleOffset: "0.15, -0.05" maxBuckleDistance: 1 @@ -230,10 +220,6 @@ map: ["enum.VehicleVisualLayers.AutoAnimate"] netsync: false noRot: true - - type: Access - tags: - - Cargo - - Maintenance - type: RandomMetadata descriptionSegments: [ATVDescriptions] - type: MovementSpeedModifier @@ -290,10 +276,6 @@ map: ["enum.VehicleVisualLayers.AutoAnimate"] netsync: false noRot: true - - type: Access - tags: - - Maintenance - - Service - type: Strap buckleOffset: "0.15, -0.05" maxBuckleDistance: 1