using Content.Shared.Whitelist; using Robust.Shared.Map; namespace Content.Shared._CP14.MagicSpell.Spells; public sealed partial class CP14SpellArea : CP14SpellEffect { [DataField(required: true)] public List Effects { get; set; } = new(); [DataField] public EntityWhitelist? Whitelist; /// /// How many entities can be subject to EntityEffect? Leave 0 to remove the restriction. /// [DataField] public int MaxTargets = 0; [DataField(required: true)] public float Range = 1f; [DataField] public bool AffectCaster = false; public override void Effect(EntityManager entManager, CP14SpellEffectBaseArgs args) { EntityCoordinates? targetPoint = null; if (args.Target is not null && entManager.TryGetComponent(args.Target.Value, out var transformComponent)) targetPoint = transformComponent.Coordinates; else if (args.Position is not null) targetPoint = args.Position; if (targetPoint is null) return; var lookup = entManager.System(); var whitelist = entManager.System(); var entitiesAround = lookup.GetEntitiesInRange(targetPoint.Value, Range, LookupFlags.Uncontained); var count = 0; foreach (var entity in entitiesAround) { if (entity == args.User && !AffectCaster) continue; if (Whitelist is not null && !whitelist.IsValid(Whitelist, entity)) continue; foreach (var effect in Effects) { effect.Effect(entManager, new CP14SpellEffectBaseArgs(args.User, null, entity, targetPoint)); } count++; if (MaxTargets > 0 && count >= MaxTargets) break; } } }