using Content.Shared.Access.Components; using Content.Shared.Roles; using Robust.Shared.Prototypes; namespace Content.Shared.Access.Systems { public sealed class AccessSystem : EntitySystem { [Dependency] private readonly IPrototypeManager _prototypeManager = default!; public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnAccessInit); } private void OnAccessInit(EntityUid uid, AccessComponent component, MapInitEvent args) { // Add all tags in groups to the list of tags. foreach (var group in component.Groups) { if (!_prototypeManager.TryIndex(group, out var proto)) continue; component.Tags.UnionWith(proto.Tags); } } /// /// Replaces the set of access tags we have with the provided set. /// /// The new access tags public bool TrySetTags(EntityUid uid, IEnumerable newTags, AccessComponent? access = null) { if (!Resolve(uid, ref access)) return false; access.Tags.Clear(); access.Tags.UnionWith(newTags); return true; } public bool TryAddGroups(EntityUid uid, IEnumerable newGroups, AccessComponent? access = null) { if (!Resolve(uid, ref access)) return false; foreach (var group in newGroups) { if (!_prototypeManager.TryIndex(group, out var proto)) continue; access.Tags.UnionWith(proto.Tags); } return true; } /// /// Set the access on an to the access for a specific job. /// /// The ID of the entity with the access component. /// The job prototype to use access from. /// Whether to apply extended job access. /// The access component. public void SetAccessToJob( EntityUid uid, JobPrototype prototype, bool extended, AccessComponent? access = null) { if (!Resolve(uid, ref access)) return; access.Tags.Clear(); access.Tags.UnionWith(prototype.Access); TryAddGroups(uid, prototype.AccessGroups, access); if (extended) { access.Tags.UnionWith(prototype.ExtendedAccess); TryAddGroups(uid, prototype.ExtendedAccessGroups, access); } } } }