using Content.Shared.Body;
using Content.Shared.Whitelist;
using Robust.Shared.Prototypes;
namespace Content.Shared.EntityEffects.Effects.Body;
///
/// Drops or deletes organs matching the category and entity filters.
///
///
public sealed partial class RemoveOrgansEntityEffectSystem : EntityEffectSystem
{
[Dependency] private BodySystem _body = default!;
[Dependency] private SharedTransformSystem _transform = default!;
[Dependency] private EntityWhitelistSystem _whitelist = default!;
protected override void Effect(Entity entity, ref EntityEffectEvent args)
{
var categories = args.Effect.Categories;
var excludedCategories = args.Effect.ExcludedCategories;
var maxCount = args.Effect.MaxCount;
var delete = args.Effect.Delete;
if (maxCount is <= 0)
return;
var selected = new List();
foreach (var organ in _body.EnumerateOrgans(entity.AsNullable()))
{
if (!_whitelist.CheckBoth(organ, args.Effect.Blacklist, args.Effect.Whitelist))
continue;
var category = organ.Comp1.Category;
if (categories != null && (category == null || !categories.Contains(category.Value)))
continue;
if (category != null && excludedCategories.Contains(category.Value))
continue;
selected.Add(organ);
if (selected.Count == maxCount)
break;
}
foreach (var organ in selected)
{
if (delete)
PredictedQueueDel(organ);
else
_transform.AttachToGridOrMap(organ);
}
}
}
///
public sealed partial class RemoveOrgans : EntityEffectBase
{
///
/// Categories to remove. Null allows any category, including uncategorized organs.
///
[DataField]
public HashSet>? Categories;
///
/// Categories to keep, even if included in Categories.
///
[DataField]
public HashSet> ExcludedCategories = [];
///
/// Additional filter for the organs, not the body.
///
[DataField]
public EntityWhitelist? Whitelist;
///
/// Organs to keep regardless of the other filters.
///
[DataField]
public EntityWhitelist? Blacklist;
///
/// Delete selected organs instead of dropping them.
///
[DataField]
public bool Delete;
///
/// Maximum number to remove in body enumeration order. Null removes all matches; zero or less removes none.
///
[DataField]
public int? MaxCount;
}