47 lines
1.4 KiB
C#
47 lines
1.4 KiB
C#
using Content.Shared.Mind;
|
|
using Content.Shared.Store;
|
|
using Content.Shared.Whitelist;
|
|
|
|
namespace Content.Server.Store.Conditions;
|
|
|
|
/// <summary>
|
|
/// Filters out an entry based on the objectives of an entity.
|
|
/// </summary>
|
|
public sealed partial class BuyerObjectiveWhitelistCondition : ListingCondition
|
|
{
|
|
/// <summary>
|
|
/// A whitelist of objective types.
|
|
/// If there is no whitelist, the object will appear by default.
|
|
/// </summary>
|
|
[DataField]
|
|
public EntityWhitelist? Whitelist;
|
|
|
|
/// <summary>
|
|
/// A blacklist of objective types.
|
|
/// If an objective is both whitelisted and blacklisted the blacklist will take priority and the entry will not appear.
|
|
/// </summary>
|
|
[DataField]
|
|
public EntityWhitelist? Blacklist;
|
|
|
|
public override bool Condition(ListingConditionArgs args)
|
|
{
|
|
var ent = args.EntityManager;
|
|
var whitelistSystem = ent.System<EntityWhitelistSystem>();
|
|
|
|
if (!args.EntityManager.TryGetComponent<MindComponent>(args.Buyer, out var mindComp))
|
|
return true; // inanimate objects don't have minds
|
|
|
|
var whitelisted = false;
|
|
|
|
foreach (var objective in mindComp.Objectives)
|
|
{
|
|
if (whitelistSystem.IsWhitelistPass(Blacklist, objective))
|
|
return false;
|
|
if (whitelistSystem.IsWhitelistPass(Whitelist, objective))
|
|
whitelisted = true;
|
|
}
|
|
|
|
return Whitelist == null || whitelisted;
|
|
}
|
|
}
|