diff --git a/Content.Server/Anomaly/Effects/ElectricityAnomalySystem.cs b/Content.Server/Anomaly/Effects/ElectricityAnomalySystem.cs index bc6aa3bb1f..8b5a72449f 100644 --- a/Content.Server/Anomaly/Effects/ElectricityAnomalySystem.cs +++ b/Content.Server/Anomaly/Effects/ElectricityAnomalySystem.cs @@ -1,10 +1,8 @@ -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; @@ -14,6 +12,7 @@ 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!; @@ -27,38 +26,21 @@ public sealed class ElectricityAnomalySystem : EntitySystem SubscribeLocalEvent(OnSupercritical); } - private void OnPulse(EntityUid uid, ElectricityAnomalyComponent component, ref AnomalyPulseEvent args) + private void OnPulse(Entity anomaly, ref AnomalyPulseEvent args) { - var range = component.MaxElectrocuteRange * args.Stability; - var xform = Transform(uid); - foreach (var (ent, comp) in _lookup.GetEntitiesInRange(xform.MapPosition, range)) - { - _lightning.ShootLightning(uid, ent); - } + 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); } - private void OnSupercritical(EntityUid uid, ElectricityAnomalyComponent component, ref AnomalySupercriticalEvent args) + private void OnSupercritical(Entity anomaly, ref AnomalySupercriticalEvent args) { - 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); + var range = anomaly.Comp.MaxElectrocuteRange * 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); + _emp.EmpPulse(_transform.GetMapCoordinates(anomaly), range, anomaly.Comp.EmpEnergyConsumption, anomaly.Comp.EmpDisabledDuration); + _lightning.ShootRandomLightnings(anomaly, range, anomaly.Comp.MaxBoltCount * 3, arcDepth: 3); } public override void Update(float frameTime) diff --git a/Content.Server/Lightning/LightningSystem.cs b/Content.Server/Lightning/LightningSystem.cs index ae95a2a491..5e975f3179 100644 --- a/Content.Server/Lightning/LightningSystem.cs +++ b/Content.Server/Lightning/LightningSystem.cs @@ -75,7 +75,6 @@ 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 5e4fc333e3..e48e0ae6a7 100644 --- a/Content.Shared/Anomaly/Effects/Components/ElectricityAnomalyComponent.cs +++ b/Content.Shared/Anomaly/Effects/Components/ElectricityAnomalyComponent.cs @@ -1,53 +1,65 @@ -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("maxElectrocutionRange"), ViewVariables(VVAccess.ReadWrite)] + [DataField, ViewVariables(VVAccess.ReadWrite)] public float MaxElectrocuteRange = 7f; /// /// The maximum amount of damage the electrocution can do /// scales with severity /// - [DataField("maxElectrocuteDamage"), ViewVariables(VVAccess.ReadWrite)] + [DataField, ViewVariables(VVAccess.ReadWrite)] public float MaxElectrocuteDamage = 20f; /// /// The maximum amount of time the electrocution lasts /// scales with severity /// - [DataField("maxElectrocuteDuration"), ViewVariables(VVAccess.ReadWrite)] + [DataField, 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("passiveElectrocutionChance"), ViewVariables(VVAccess.ReadWrite)] + [DataField, 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("nextSecond", customTypeSerializer: typeof(TimeOffsetSerializer)), ViewVariables(VVAccess.ReadWrite)] + [DataField(customTypeSerializer: typeof(TimeOffsetSerializer)), ViewVariables(VVAccess.ReadWrite)] public TimeSpan NextSecond = TimeSpan.Zero; /// /// Energy consumed from devices by the emp pulse upon going supercritical. /// - [DataField("empEnergyConsumption"), ViewVariables(VVAccess.ReadWrite)] + [DataField, ViewVariables(VVAccess.ReadWrite)] public float EmpEnergyConsumption = 100000f; /// /// Duration of devices being disabled by the emp pulse upon going supercritical. /// - [DataField("empDisabledDuration"), ViewVariables(VVAccess.ReadWrite)] + [DataField, ViewVariables(VVAccess.ReadWrite)] public float EmpDisabledDuration = 60f; }