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]