Access groups + aghost all access (#6671)

This commit is contained in:
mirrorcult
2022-02-11 19:01:14 -07:00
committed by GitHub
parent 47f6f88fdc
commit aa2727c84d
19 changed files with 160 additions and 82 deletions

View File

@@ -33,6 +33,7 @@ namespace Content.Server.Access.Systems
// set access for access component
_accessSystem.TrySetTags(uid, job.Access);
_accessSystem.TryAddGroups(uid, job.AccessGroups);
// and also change job title on a card id
_cardSystem.TryChangeJobTitle(uid, job.Name);

View File

@@ -0,0 +1,19 @@
using Content.Shared.Access.Components;
using Robust.Shared.Prototypes;
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.Set;
namespace Content.Shared.Access;
/// <summary>
/// Contains a list of access tags that are part of this group.
/// Used by <see cref="AccessComponent"/> to avoid boilerplate.
/// </summary>
[Prototype("accessGroup")]
public sealed class AccessGroupPrototype : IPrototype
{
[DataField("id", required: true)]
public string ID { get; } = default!;
[DataField("tags", required: true, customTypeSerializer:typeof(PrototypeIdHashSetSerializer<AccessLevelPrototype>))]
public HashSet<string> Tags = default!;
}

View File

@@ -13,10 +13,12 @@ namespace Content.Shared.Access.Components
/// </summary>
[RegisterComponent]
[Friend(typeof(AccessSystem))]
public class AccessComponent : Component
public sealed class AccessComponent : Component
{
[DataField("tags", customTypeSerializer: typeof(PrototypeIdHashSetSerializer<AccessLevelPrototype>))]
[ViewVariables]
public HashSet<string> Tags = new();
[DataField("groups", customTypeSerializer: typeof(PrototypeIdHashSetSerializer<AccessGroupPrototype>))]
public HashSet<string> Groups = new();
}
}

View File

@@ -1,11 +1,33 @@
using Content.Shared.Access.Components;
using Robust.Shared.GameObjects;
using System.Collections.Generic;
using Robust.Shared.Prototypes;
namespace Content.Shared.Access.Systems
{
public class AccessSystem : EntitySystem
public sealed class AccessSystem : EntitySystem
{
[Dependency] private readonly IPrototypeManager _prototypeManager = default!;
public override void Initialize()
{
base.Initialize();
SubscribeLocalEvent<AccessComponent, ComponentInit>(OnAccessInit);
}
private void OnAccessInit(EntityUid uid, AccessComponent component, ComponentInit args)
{
// Add all tags in groups to the list of tags.
foreach (var group in component.Groups)
{
if (!_prototypeManager.TryIndex<AccessGroupPrototype>(group, out var proto))
continue;
component.Tags.UnionWith(proto.Tags);
}
}
/// <summary>
/// Replaces the set of access tags we have with the provided set.
/// </summary>
@@ -20,5 +42,21 @@ namespace Content.Shared.Access.Systems
return true;
}
public bool TryAddGroups(EntityUid uid, IEnumerable<string> newGroups, AccessComponent? access = null)
{
if (!Resolve(uid, ref access))
return false;
foreach (var group in newGroups)
{
if (!_prototypeManager.TryIndex<AccessGroupPrototype>(group, out var proto))
continue;
access.Tags.UnionWith(proto.Tags);
}
return true;
}
}
}

View File

@@ -62,5 +62,8 @@ namespace Content.Shared.Roles
[DataField("access", customTypeSerializer: typeof(PrototypeIdListSerializer<AccessLevelPrototype>))]
public IReadOnlyCollection<string> Access { get; } = Array.Empty<string>();
[DataField("accessGroups", customTypeSerializer: typeof(PrototypeIdListSerializer<AccessGroupPrototype>))]
public IReadOnlyCollection<string> AccessGroups { get; } = Array.Empty<string>();
}
}

View File

@@ -6,3 +6,10 @@
- type: accessLevel
id: Salvage
- type: accessGroup
id: Cargo
tags:
- Quartermaster
- Salvage
- Cargo

View File

@@ -7,3 +7,10 @@
- type: accessLevel
id: HeadOfPersonnel
name: Head of Personnel
- type: accessGroup
id: Command
tags:
- Command
- Captain
- HeadOfPersonnel

View File

@@ -4,3 +4,9 @@
- type: accessLevel
id: Engineering
- type: accessGroup
id: Engineering
tags:
- ChiefEngineer
- Engineering

View File

@@ -4,6 +4,13 @@
- type: accessLevel
id: Medical
- type: accessLevel
id: Chemistry
- type: accessGroup
id: Medical
tags:
- ChiefMedicalOfficer
- Medical
- Chemistry

View File

@@ -0,0 +1,29 @@
- type: accessGroup
id: AllAccess
tags:
- Captain
- HeadOfPersonnel
- ChiefEngineer
- ChiefMedicalOfficer
- HeadOfSecurity
- ResearchDirector
- Command
- Security
- Armory
- Brig
- Engineering
- Medical
- Quartermaster
- Salvage
- Cargo
- Research
- Service
- Maintenance
- External
- Janitor
- Theatre
- Bar
- Chemistry
- Kitchen
- Chapel
- Hydroponics

View File

@@ -4,3 +4,9 @@
- type: accessLevel
id: Research
- type: accessGroup
id: Research
tags:
- ResearchDirector
- Research

View File

@@ -4,7 +4,7 @@
- type: accessLevel
id: Security
- type: accessLevel
id: Armory
@@ -13,3 +13,12 @@
#- type: accessLevel
# id: Detective
- type: accessGroup
id: Security
tags:
- HeadOfSecurity
- Security
- Armory
- Brig
# - Detective

View File

@@ -17,4 +17,15 @@
id: Theatre
- type: accessLevel
id: Chapel
id: Chapel
- type: accessGroup
id: Service
tags:
- Bar
- Kitchen
- Hydroponics
- Service
- Janitor
- Theatre
- Chapel

View File

@@ -32,3 +32,6 @@
- type: Body
template: AGhostTemplate
preset: HumanPreset
- type: Access
groups:
- AllAccess

View File

@@ -98,28 +98,8 @@
- Opaque
- type: Tag
- type: Access
tags:
- Maintenance
- Cargo
# - Quartermaster
- Engineering
- ChiefEngineer
- Medical
- ChiefMedicalOfficer
- Research
- ResearchDirector
- Security
- Service
- Captain
- Command
- External
- HeadOfSecurity
- HeadOfPersonnel
- Bar
- Hydroponics
- Kitchen
- Janitor
- Theatre
groups:
- AllAccess
- type: Appearance
visuals:
- type: GenericEnumVisualizer

View File

@@ -347,28 +347,8 @@
jobTitle: Central Commander
- type: Access
#GOD DEAR FUCKING GOD WE NEED AN ALL-ACCESS FLAG
tags:
- Maintenance
- Cargo
# - Quartermaster
- Engineering
# - ChiefEngineer
- Medical
# - ChiefMedicalOfficer
- Research
# - ResearchDirector
- Security
- Service
- Captain
- Command
- External
#- HeadOfSecurity
- HeadOfPersonnel
- Bar
#- Hydroponics
#- Kitchen
- Janitor
- Theatre
groups:
- AllAccess
- type: entity
parent: IDCardStandard

View File

@@ -10,38 +10,8 @@
joinNotifyCrew: true
supervisors: "Nanotrasen officials"
canBeAntag: false
access:
# All of em.
# Could probably do with some kind of wildcard or whatever to automate this.
# HELL FUCKING YEAH WE COULD
# Guys please don't fight
# Seriously though...
- Captain
- HeadOfPersonnel
- ChiefEngineer
- ChiefMedicalOfficer
- HeadOfSecurity
- ResearchDirector
- Command
- Security
- Armory
- Brig
- Engineering
- Medical
- Quartermaster
- Salvage
- Cargo
- Research
- Service
- Maintenance
- External
- Janitor
- Theatre
- Bar
- Chemistry
- Kitchen
- Chapel
- Hydroponics
accessGroups:
- AllAccess
- type: startingGear
id: CaptainGear