using Content.Shared.Access.Components; using Content.Shared.Roles; using Robust.Shared.GameStates; using Robust.Shared.Prototypes; using Robust.Shared.Serialization; namespace Content.Shared.Access.Systems { public abstract class SharedAccessSystem : EntitySystem { [Dependency] private readonly IPrototypeManager _prototypeManager = default!; public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnAccessInit); SubscribeLocalEvent(OnGetAccessTags); } 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.Resolve(group, out var proto)) continue; component.Tags.UnionWith(proto.Tags); Dirty(uid, component); } } private void OnGetAccessTags(EntityUid uid, AccessComponent component, ref GetAccessTagsEvent args) { if (!component.Enabled) return; args.Tags.UnionWith(component.Tags); } public void SetAccessEnabled(EntityUid uid, bool val, AccessComponent? component = null) { if (!Resolve(uid, ref component, false)) return; component.Enabled = val; Dirty(uid, component); } /// /// 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); Dirty(uid, access); return true; } /// /// Gets the set of access tags. /// /// The new access tags public IEnumerable>? TryGetTags(EntityUid uid, AccessComponent? access = null) { return !Resolve(uid, ref access) ? null : access.Tags; } public bool TryAddGroups(EntityUid uid, IEnumerable> newGroups, AccessComponent? access = null) { if (!Resolve(uid, ref access)) return false; foreach (var group in newGroups) { if (!_prototypeManager.Resolve(group, out var proto)) continue; access.Tags.UnionWith(proto.Tags); } Dirty(uid, access); 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); Dirty(uid, access); TryAddGroups(uid, prototype.AccessGroups, access); if (extended) { access.Tags.UnionWith(prototype.ExtendedAccess); TryAddGroups(uid, prototype.ExtendedAccessGroups, access); } } } }