using Content.Shared.Damage; using Content.Shared.Damage.Systems; using Content.Shared.Whitelist; using Content.Shared.Xenoarchaeology.Artifact.XAE.Components; using Robust.Shared.Random; using Robust.Shared.Timing; namespace Content.Shared.Xenoarchaeology.Artifact.XAE; /// /// System for xeno artifact effect that damages entities from whitelist in area. /// public sealed class XAEDamageInAreaSystem : BaseXAESystem { [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly EntityLookupSystem _lookup = default!; [Dependency] private readonly DamageableSystem _damageable = default!; [Dependency] private readonly EntityWhitelistSystem _whitelistSystem = default!; [Dependency] private readonly IGameTiming _timing = default!; /// Pre-allocated and re-used collection. private readonly HashSet _entitiesInRange = new(); /// protected override void OnActivated(Entity ent, ref XenoArtifactNodeActivatedEvent args) { if (!_timing.IsFirstTimePredicted) return; var damageInAreaComponent = ent.Comp; _entitiesInRange.Clear(); _lookup.GetEntitiesInRange(ent.Owner, damageInAreaComponent.Radius, _entitiesInRange); foreach (var entityInRange in _entitiesInRange) { if (!_random.Prob(damageInAreaComponent.DamageChance)) continue; if (_whitelistSystem.IsWhitelistFail(damageInAreaComponent.Whitelist, entityInRange)) continue; _damageable.TryChangeDamage(entityInRange, damageInAreaComponent.Damage, damageInAreaComponent.IgnoreResistances); } } }