using Content.Shared.Tag;
using Robust.Shared.Prototypes;
using Robust.Shared.Serialization;
+using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom;
+using Robust.Shared.Serialization.TypeSerializers.Implementations.Generic;
namespace Content.Shared.Whitelist;
/// <summary>
/// Component names that are allowed in the whitelist.
/// </summary>
- [DataField] public string[]? Components;
- // TODO yaml validation
+ [DataField(customTypeSerializer:typeof(CustomArraySerializer<string, ComponentNameSerializer>))]
+ public string[]? Components;
/// <summary>
/// Item sizes that are allowed in the whitelist.
using System.Diagnostics.CodeAnalysis;
using Content.Shared.Item;
using Content.Shared.Tag;
+using Robust.Shared.Utility;
namespace Content.Shared.Whitelist;
/// </summary>
public bool IsValid(EntityWhitelist list, EntityUid uid)
{
- if (list.Components != null)
- {
- if (list.Registrations == null)
- {
- var regs = StringsToRegs(list.Components);
- list.Registrations = new List<ComponentRegistration>();
- list.Registrations.AddRange(regs);
- }
- }
+ list.Registrations ??= StringsToRegs(list.Components);
- if (list.Registrations != null && list.Registrations.Count > 0)
+ if (list.Registrations != null)
{
foreach (var reg in list.Registrations)
{
- if (HasComp(uid, reg.Type))
+ if (EntityManager.HasComponent(uid, reg))
{
if (!list.RequireAll)
return true;
return IsWhitelistFailOrNull(blacklist, uid);
}
- private List<ComponentRegistration> StringsToRegs(string[]? input)
+ private List<ComponentRegistration>? StringsToRegs(string[]? input)
{
- var list = new List<ComponentRegistration>();
-
if (input == null || input.Length == 0)
- return list;
+ return null;
+ var list = new List<ComponentRegistration>(input.Length);
foreach (var name in input)
{
- var availability = Factory.GetComponentAvailability(name);
- if (Factory.TryGetRegistration(name, out var registration)
- && availability == ComponentAvailability.Available)
- {
+ if (Factory.TryGetRegistration(name, out var registration))
list.Add(registration);
- }
- else if (availability == ComponentAvailability.Unknown)
- {
- Log.Error($"StringsToRegs failed: Unknown component name {name} passed to EntityWhitelist!");
- }
+ else if (Factory.GetComponentAvailability(name) != ComponentAvailability.Ignore)
+ Log.Error($"{nameof(StringsToRegs)} failed: Unknown component name {name} passed to EntityWhitelist!");
}
return list;