diff --git a/Content.Server/Anomaly/Effects/ElectricityAnomalySystem.cs b/Content.Server/Anomaly/Effects/ElectricityAnomalySystem.cs index 8b5a72449f..bc6aa3bb1f 100644 --- a/Content.Server/Anomaly/Effects/ElectricityAnomalySystem.cs +++ b/Content.Server/Anomaly/Effects/ElectricityAnomalySystem.cs @@ -1,8 +1,10 @@ -using Content.Server.Electrocution; +using Content.Server.Electrocution; using Content.Server.Emp; using Content.Server.Lightning; +using Content.Server.Power.Components; using Content.Shared.Anomaly.Components; using Content.Shared.Anomaly.Effects.Components; +using Content.Shared.Mobs.Components; using Content.Shared.StatusEffect; using Robust.Shared.Random; using Robust.Shared.Timing; @@ -12,7 +14,6 @@ namespace Content.Server.Anomaly.Effects; public sealed class ElectricityAnomalySystem : EntitySystem { [Dependency] private readonly IGameTiming _timing = default!; - [Dependency] private readonly SharedTransformSystem _transform = default!; [Dependency] private readonly IRobustRandom _random = default!; [Dependency] private readonly LightningSystem _lightning = default!; [Dependency] private readonly ElectrocutionSystem _electrocution = default!; @@ -26,21 +27,38 @@ public sealed class ElectricityAnomalySystem : EntitySystem SubscribeLocalEvent(OnSupercritical); } - private void OnPulse(Entity anomaly, ref AnomalyPulseEvent args) + private void OnPulse(EntityUid uid, ElectricityAnomalyComponent component, ref AnomalyPulseEvent args) { - var range = anomaly.Comp.MaxElectrocuteRange * args.Stability; - - int boltCount = (int)MathF.Floor(MathHelper.Lerp((float)anomaly.Comp.MinBoltCount, (float)anomaly.Comp.MaxBoltCount, args.Severity)); - - _lightning.ShootRandomLightnings(anomaly, range, boltCount); + var range = component.MaxElectrocuteRange * args.Stability; + var xform = Transform(uid); + foreach (var (ent, comp) in _lookup.GetEntitiesInRange(xform.MapPosition, range)) + { + _lightning.ShootLightning(uid, ent); + } } - private void OnSupercritical(Entity anomaly, ref AnomalySupercriticalEvent args) + private void OnSupercritical(EntityUid uid, ElectricityAnomalyComponent component, ref AnomalySupercriticalEvent args) { - var range = anomaly.Comp.MaxElectrocuteRange * 3; + var poweredQuery = GetEntityQuery(); + var mobQuery = GetEntityQuery(); + var validEnts = new HashSet(); + foreach (var ent in _lookup.GetEntitiesInRange(uid, component.MaxElectrocuteRange * 2)) + { + if (mobQuery.HasComponent(ent)) + validEnts.Add(ent); - _emp.EmpPulse(_transform.GetMapCoordinates(anomaly), range, anomaly.Comp.EmpEnergyConsumption, anomaly.Comp.EmpDisabledDuration); - _lightning.ShootRandomLightnings(anomaly, range, anomaly.Comp.MaxBoltCount * 3, arcDepth: 3); + if (_random.Prob(0.01f) && poweredQuery.HasComponent(ent)) + validEnts.Add(ent); + } + + // goodbye, sweet perf + foreach (var ent in validEnts) + { + _lightning.ShootLightning(uid, ent); + } + + var empRange = component.MaxElectrocuteRange * 3; + _emp.EmpPulse(Transform(uid).MapPosition, empRange, component.EmpEnergyConsumption, component.EmpDisabledDuration); } public override void Update(float frameTime) diff --git a/Content.Server/Lightning/LightningSystem.cs b/Content.Server/Lightning/LightningSystem.cs index 5e975f3179..ae95a2a491 100644 --- a/Content.Server/Lightning/LightningSystem.cs +++ b/Content.Server/Lightning/LightningSystem.cs @@ -75,6 +75,7 @@ public sealed class LightningSystem : SharedLightningSystem var targets = _lookup.GetComponentsInRange(Transform(user).MapPosition, range).ToList(); _random.Shuffle(targets); targets.Sort((x, y) => y.Priority.CompareTo(x.Priority)); + //var realCount = Math.Min(targets.Count, boltCount); int shootedCount = 0; int count = -1; diff --git a/Content.Shared/Anomaly/Effects/Components/ElectricityAnomalyComponent.cs b/Content.Shared/Anomaly/Effects/Components/ElectricityAnomalyComponent.cs index e48e0ae6a7..5e4fc333e3 100644 --- a/Content.Shared/Anomaly/Effects/Components/ElectricityAnomalyComponent.cs +++ b/Content.Shared/Anomaly/Effects/Components/ElectricityAnomalyComponent.cs @@ -1,65 +1,53 @@ -using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; +using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom; namespace Content.Shared.Anomaly.Effects.Components; [RegisterComponent] public sealed partial class ElectricityAnomalyComponent : Component { - /// - /// the minimum number of lightning strikes - /// - [DataField, ViewVariables(VVAccess.ReadWrite)] - public int MinBoltCount = 2; - - /// - /// the number of lightning strikes, at the maximum severity of the anomaly - /// - [DataField, ViewVariables(VVAccess.ReadWrite)] - public int MaxBoltCount = 5; - /// /// The maximum radius of the passive electrocution effect /// scales with stability /// - [DataField, ViewVariables(VVAccess.ReadWrite)] + [DataField("maxElectrocutionRange"), ViewVariables(VVAccess.ReadWrite)] public float MaxElectrocuteRange = 7f; /// /// The maximum amount of damage the electrocution can do /// scales with severity /// - [DataField, ViewVariables(VVAccess.ReadWrite)] + [DataField("maxElectrocuteDamage"), ViewVariables(VVAccess.ReadWrite)] public float MaxElectrocuteDamage = 20f; /// /// The maximum amount of time the electrocution lasts /// scales with severity /// - [DataField, ViewVariables(VVAccess.ReadWrite)] + [DataField("maxElectrocuteDuration"), ViewVariables(VVAccess.ReadWrite)] public TimeSpan MaxElectrocuteDuration = TimeSpan.FromSeconds(8); /// /// The maximum chance that each second, when in range of the anomaly, you will be electrocuted. /// scales with stability /// - [DataField, ViewVariables(VVAccess.ReadWrite)] + [DataField("passiveElectrocutionChance"), ViewVariables(VVAccess.ReadWrite)] public float PassiveElectrocutionChance = 0.05f; /// /// Used for tracking seconds, so that we can shock people in a non-tick-dependent way. /// - [DataField(customTypeSerializer: typeof(TimeOffsetSerializer)), ViewVariables(VVAccess.ReadWrite)] + [DataField("nextSecond", customTypeSerializer: typeof(TimeOffsetSerializer)), ViewVariables(VVAccess.ReadWrite)] public TimeSpan NextSecond = TimeSpan.Zero; /// /// Energy consumed from devices by the emp pulse upon going supercritical. /// - [DataField, ViewVariables(VVAccess.ReadWrite)] + [DataField("empEnergyConsumption"), ViewVariables(VVAccess.ReadWrite)] public float EmpEnergyConsumption = 100000f; /// /// Duration of devices being disabled by the emp pulse upon going supercritical. /// - [DataField, ViewVariables(VVAccess.ReadWrite)] + [DataField("empDisabledDuration"), ViewVariables(VVAccess.ReadWrite)] public float EmpDisabledDuration = 60f; }