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; }