using System.Linq; using Content.Shared.Damage; using Content.Shared.Damage.Components; using Content.Shared.Damage.Systems; using Content.Shared.Mobs.Systems; using Content.Shared.Whitelist; using Robust.Shared.Timing; namespace Content.Server._Sunrise.AoEHeal; /// /// Лечение по области /// public sealed class AoEHealSystem : EntitySystem { [Dependency] private readonly EntityLookupSystem _lookupSystem = default!; [Dependency] private readonly DamageableSystem _damageableSystem = default!; [Dependency] private readonly IGameTiming _timing = default!; [Dependency] private readonly EntityWhitelistSystem _whitelist = default!; [Dependency] private readonly MobStateSystem _mobState = default!; [Dependency] private readonly MobThresholdSystem _mobThreshold = default!; private TimeSpan? _prev = TimeSpan.Zero; private readonly TimeSpan _delay = TimeSpan.FromSeconds(2); public override void Update(float frameTime) { base.Update(frameTime); if (_timing.CurTime - _prev < _delay) return; _prev = _timing.CurTime; var query = EntityQueryEnumerator(); while (query.MoveNext(out var uid, out var aoEHealComponent, out var xform)) { var targetsQuery = _lookupSystem.GetEntitiesInRange(xform.Coordinates, aoEHealComponent.Range); foreach (var target in targetsQuery // Проходит ли ВЛ? .Where(target => !_whitelist.IsWhitelistFail(aoEHealComponent.EntityWhitelist, target)) // Если нам важно, то жива ли цель? .Where(target => !aoEHealComponent.AliveTargets || _mobState.IsAlive(target))) { if (aoEHealComponent.Threshold != null && // AoE компоненту важно хилить до какого-то уровня от макс здоровья _mobThreshold.TryGetDeadThreshold(target, out var threshold) && target.Comp.Damage.GetTotal() < threshold * (1f - aoEHealComponent.Threshold)) // Не лечим если урона мало continue; _damageableSystem.TryChangeDamage(target.Owner, aoEHealComponent.Damage); } } } }