diff --git a/Content.Server/Objectives/Components/RoleRequirementComponent.cs b/Content.Server/Objectives/Components/RoleRequirementComponent.cs index 86f8d7cedf..3fbf09b65a 100644 --- a/Content.Server/Objectives/Components/RoleRequirementComponent.cs +++ b/Content.Server/Objectives/Components/RoleRequirementComponent.cs @@ -1,5 +1,6 @@ using Content.Server.Objectives.Systems; -using Content.Shared.Whitelist; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Generic; namespace Content.Server.Objectives.Components; @@ -10,6 +11,9 @@ namespace Content.Server.Objectives.Components; [RegisterComponent, Access(typeof(RoleRequirementSystem))] public sealed partial class RoleRequirementComponent : Component { - [DataField(required: true), ViewVariables(VVAccess.ReadWrite)] - public EntityWhitelist Roles = new(); + /// + /// Mind role component whitelist. + /// + [DataField(required: true, customTypeSerializer: typeof(CustomHashSetSerializer))] + public HashSet Roles = new(); } diff --git a/Content.Server/Objectives/Systems/RoleRequirementSystem.cs b/Content.Server/Objectives/Systems/RoleRequirementSystem.cs index 83d4c2ea4c..a86d6bf23a 100644 --- a/Content.Server/Objectives/Systems/RoleRequirementSystem.cs +++ b/Content.Server/Objectives/Systems/RoleRequirementSystem.cs @@ -1,6 +1,6 @@ using Content.Server.Objectives.Components; using Content.Shared.Objectives.Components; -using Content.Shared.Whitelist; +using Content.Shared.Roles; namespace Content.Server.Objectives.Systems; @@ -9,7 +9,7 @@ namespace Content.Server.Objectives.Systems; /// public sealed class RoleRequirementSystem : EntitySystem { - [Dependency] private readonly EntityWhitelistSystem _whitelistSystem = default!; + [Dependency] private readonly SharedRoleSystem _roles = default!; public override void Initialize() { base.Initialize(); @@ -22,7 +22,19 @@ public sealed class RoleRequirementSystem : EntitySystem if (args.Cancelled) return; - if (_whitelistSystem.IsWhitelistFail(comp.Roles, args.MindId)) - args.Cancelled = true; + foreach (var role in comp.Roles) + { + if (!EntityManager.ComponentFactory.TryGetRegistration(role, out var roleReg)) + { + Log.Error($"Role component not found for RoleRequirementComponent: {role}"); + continue; + } + + if (_roles.MindHasRole(args.MindId, roleReg.Type, out _)) + return; // whitelist pass + } + + // whitelist fail + args.Cancelled = true; } } diff --git a/Content.Shared/Whitelist/EntityWhitelist.cs b/Content.Shared/Whitelist/EntityWhitelist.cs index cbe4633360..e08bb339e5 100644 --- a/Content.Shared/Whitelist/EntityWhitelist.cs +++ b/Content.Shared/Whitelist/EntityWhitelist.cs @@ -10,6 +10,9 @@ namespace Content.Shared.Whitelist; /// Does not whitelist by prototypes, since that is undesirable; you're better off just adding a tag to all /// entity prototypes that need to be whitelisted, and checking for that. /// +/// +/// Do not add more conditions like itemsize to the whitelist, this should stay as lightweight as possible! +/// /// /// whitelist: /// tags: @@ -32,12 +35,6 @@ public sealed partial class EntityWhitelist [DataField] public string[]? Components; // TODO yaml validation - /// - /// Mind Role Prototype names that are allowed in the whitelist. - /// - [DataField] public string[]? MindRoles; - // TODO yaml validation - /// /// Item sizes that are allowed in the whitelist. /// diff --git a/Content.Shared/Whitelist/EntityWhitelistSystem.cs b/Content.Shared/Whitelist/EntityWhitelistSystem.cs index 9a6e87c1b4..b33bbf2586 100644 --- a/Content.Shared/Whitelist/EntityWhitelistSystem.cs +++ b/Content.Shared/Whitelist/EntityWhitelistSystem.cs @@ -1,6 +1,5 @@ using System.Diagnostics.CodeAnalysis; using Content.Shared.Item; -using Content.Shared.Roles; using Content.Shared.Tag; namespace Content.Shared.Whitelist; @@ -8,7 +7,6 @@ namespace Content.Shared.Whitelist; public sealed class EntityWhitelistSystem : EntitySystem { [Dependency] private readonly IComponentFactory _factory = default!; - [Dependency] private readonly SharedRoleSystem _roles = default!; [Dependency] private readonly TagSystem _tag = default!; private EntityQuery _itemQuery; @@ -57,22 +55,6 @@ public sealed class EntityWhitelistSystem : EntitySystem } } - if (list.MindRoles != null) - { - var regs = StringsToRegs(list.MindRoles); - - foreach (var role in regs) - { - if ( _roles.MindHasRole(uid, role.Type, out _)) - { - if (!list.RequireAll) - return true; - } - else if (list.RequireAll) - return false; - } - } - if (list.Registrations != null && list.Registrations.Count > 0) { foreach (var reg in list.Registrations) diff --git a/Resources/Prototypes/Objectives/dragon.yml b/Resources/Prototypes/Objectives/dragon.yml index 9d81c62ab3..35740896e3 100644 --- a/Resources/Prototypes/Objectives/dragon.yml +++ b/Resources/Prototypes/Objectives/dragon.yml @@ -9,8 +9,7 @@ issuer: objective-issuer-dragon - type: RoleRequirement roles: - mindRoles: - - DragonRole + - DragonRole - type: entity parent: BaseDragonObjective diff --git a/Resources/Prototypes/Objectives/ninja.yml b/Resources/Prototypes/Objectives/ninja.yml index 28b624519c..76d74876b0 100644 --- a/Resources/Prototypes/Objectives/ninja.yml +++ b/Resources/Prototypes/Objectives/ninja.yml @@ -9,8 +9,7 @@ issuer: objective-issuer-spiderclan - type: RoleRequirement roles: - mindRoles: - - NinjaRole + - NinjaRole - type: entity parent: BaseNinjaObjective diff --git a/Resources/Prototypes/Objectives/paradoxClone.yml b/Resources/Prototypes/Objectives/paradoxClone.yml index 073c014af0..40a1021676 100644 --- a/Resources/Prototypes/Objectives/paradoxClone.yml +++ b/Resources/Prototypes/Objectives/paradoxClone.yml @@ -9,8 +9,7 @@ issuer: objective-issuer-paradox - type: RoleRequirement roles: - mindRoles: - - ParadoxCloneRole + - ParadoxCloneRole - type: Tag tags: - ParadoxCloneObjectiveBlacklist # don't copy the objectives from other clones diff --git a/Resources/Prototypes/Objectives/thief.yml b/Resources/Prototypes/Objectives/thief.yml index b5d0141cb7..f887029fcc 100644 --- a/Resources/Prototypes/Objectives/thief.yml +++ b/Resources/Prototypes/Objectives/thief.yml @@ -7,8 +7,7 @@ issuer: objective-issuer-thief - type: RoleRequirement roles: - mindRoles: - - ThiefRole + - ThiefRole - type: entity abstract: true diff --git a/Resources/Prototypes/Objectives/traitor.yml b/Resources/Prototypes/Objectives/traitor.yml index b6f31449c0..de222df6cc 100644 --- a/Resources/Prototypes/Objectives/traitor.yml +++ b/Resources/Prototypes/Objectives/traitor.yml @@ -7,8 +7,7 @@ issuer: objective-issuer-syndicate - type: RoleRequirement roles: - mindRoles: - - TraitorRole + - TraitorRole - type: entity abstract: true diff --git a/Resources/Prototypes/Objectives/wizard.yml b/Resources/Prototypes/Objectives/wizard.yml index fc8ef6dca3..52ac7e365a 100644 --- a/Resources/Prototypes/Objectives/wizard.yml +++ b/Resources/Prototypes/Objectives/wizard.yml @@ -9,8 +9,7 @@ issuer: objective-issuer-swf - type: RoleRequirement roles: - mindRoles: - - WizardRole + - WizardRole - type: entity parent: [BaseWizardObjective, BaseSurviveObjective]