From e33f0341ada2d8bd6ed4195ac3f0578b23e4ba8c Mon Sep 17 00:00:00 2001 From: Tayrtahn Date: Wed, 19 Jun 2024 11:13:40 -0400 Subject: [PATCH] Code cleanup: radio jammer (#29052) * Code cleanup for radio jammer * More Entity for the people, and fix an accidental variable reuse --- .../Systems/DeviceNetworkJammerSystem.cs | 6 ++ .../Systems/DeviceNetworkJammerSystem.cs | 19 +++-- .../Components/ActiveRadioJammerComponent.cs | 12 --- .../Radio/EntitySystems/JammerSystem.cs | 79 +++++++------------ .../DeviceNetworkJammerComponent.cs | 2 + .../SharedDeviceNetworkJammerSystem.cs | 63 +++++++++++++++ .../Components/ActiveRadioJammerComponent.cs | 13 +++ ...erComponent.cs => RadioJammerComponent.cs} | 6 +- .../Radio/EntitySystems/SharedJammerSystem.cs | 48 +++++++---- 9 files changed, 158 insertions(+), 90 deletions(-) create mode 100644 Content.Client/DeviceNetwork/Systems/DeviceNetworkJammerSystem.cs delete mode 100644 Content.Server/Radio/Components/ActiveRadioJammerComponent.cs create mode 100644 Content.Shared/DeviceNetwork/Systems/SharedDeviceNetworkJammerSystem.cs create mode 100644 Content.Shared/Radio/Components/ActiveRadioJammerComponent.cs rename Content.Shared/Radio/Components/{SharedRadioJammerComponent.cs => RadioJammerComponent.cs} (91%) diff --git a/Content.Client/DeviceNetwork/Systems/DeviceNetworkJammerSystem.cs b/Content.Client/DeviceNetwork/Systems/DeviceNetworkJammerSystem.cs new file mode 100644 index 0000000000..39e03a17da --- /dev/null +++ b/Content.Client/DeviceNetwork/Systems/DeviceNetworkJammerSystem.cs @@ -0,0 +1,6 @@ +using Content.Shared.DeviceNetwork.Systems; + +namespace Content.Client.DeviceNetwork.Systems; + +/// +public sealed class DeviceNetworkJammerSystem : SharedDeviceNetworkJammerSystem; diff --git a/Content.Server/DeviceNetwork/Systems/DeviceNetworkJammerSystem.cs b/Content.Server/DeviceNetwork/Systems/DeviceNetworkJammerSystem.cs index 3d3820562d..0702a72042 100644 --- a/Content.Server/DeviceNetwork/Systems/DeviceNetworkJammerSystem.cs +++ b/Content.Server/DeviceNetwork/Systems/DeviceNetworkJammerSystem.cs @@ -1,12 +1,15 @@ -using Content.Server.DeviceNetwork.Components; using Content.Shared.DeviceNetwork.Components; +using Content.Shared.DeviceNetwork.Systems; using Robust.Server.GameObjects; namespace Content.Server.DeviceNetwork.Systems; -public sealed class DeviceNetworkJammerSystem : EntitySystem +/// +public sealed class DeviceNetworkJammerSystem : SharedDeviceNetworkJammerSystem { - [Dependency] private TransformSystem _transform = default!; + [Dependency] private readonly TransformSystem _transform = default!; + [Dependency] private readonly SharedDeviceNetworkJammerSystem _jammer = default!; + public override void Initialize() { base.Initialize(); @@ -14,20 +17,20 @@ public sealed class DeviceNetworkJammerSystem : EntitySystem SubscribeLocalEvent(BeforePacketSent); } - private void BeforePacketSent(EntityUid uid, TransformComponent xform, BeforePacketSentEvent ev) + private void BeforePacketSent(Entity xform, ref BeforePacketSentEvent ev) { if (ev.Cancelled) return; var query = EntityQueryEnumerator(); - while (query.MoveNext(out _, out var jammerComp, out var jammerXform)) + while (query.MoveNext(out var uid, out var jammerComp, out var jammerXform)) { - if (!jammerComp.JammableNetworks.Contains(ev.NetworkId)) + if (!_jammer.GetJammableNetworks((uid, jammerComp)).Contains(ev.NetworkId)) continue; - if (jammerXform.Coordinates.InRange(EntityManager, _transform, ev.SenderTransform.Coordinates, jammerComp.Range) - || jammerXform.Coordinates.InRange(EntityManager, _transform, xform.Coordinates, jammerComp.Range)) + if (_transform.InRange(jammerXform.Coordinates, ev.SenderTransform.Coordinates, jammerComp.Range) + || _transform.InRange(jammerXform.Coordinates, xform.Comp.Coordinates, jammerComp.Range)) { ev.Cancel(); return; diff --git a/Content.Server/Radio/Components/ActiveRadioJammerComponent.cs b/Content.Server/Radio/Components/ActiveRadioJammerComponent.cs deleted file mode 100644 index ff3e6271be..0000000000 --- a/Content.Server/Radio/Components/ActiveRadioJammerComponent.cs +++ /dev/null @@ -1,12 +0,0 @@ -using Content.Server.Radio.EntitySystems; - -namespace Content.Server.Radio.Components; - -/// -/// Prevents all radio in range from sending messages -/// -[RegisterComponent] -[Access(typeof(JammerSystem))] -public sealed partial class ActiveRadioJammerComponent : Component -{ -} diff --git a/Content.Server/Radio/EntitySystems/JammerSystem.cs b/Content.Server/Radio/EntitySystems/JammerSystem.cs index 223d0e47c0..1fe48d22b4 100644 --- a/Content.Server/Radio/EntitySystems/JammerSystem.cs +++ b/Content.Server/Radio/EntitySystems/JammerSystem.cs @@ -1,14 +1,12 @@ using Content.Server.DeviceNetwork.Components; -using Content.Server.Popups; using Content.Server.Power.EntitySystems; using Content.Server.PowerCell; -using Content.Server.Radio.Components; using Content.Shared.DeviceNetwork.Components; -using Content.Shared.Examine; using Content.Shared.Interaction; using Content.Shared.PowerCell.Components; -using Content.Shared.RadioJammer; using Content.Shared.Radio.EntitySystems; +using Content.Shared.Radio.Components; +using Content.Shared.DeviceNetwork.Systems; namespace Content.Server.Radio.EntitySystems; @@ -17,6 +15,7 @@ public sealed class JammerSystem : SharedJammerSystem [Dependency] private readonly PowerCellSystem _powerCell = default!; [Dependency] private readonly BatterySystem _battery = default!; [Dependency] private readonly SharedTransformSystem _transform = default!; + [Dependency] private readonly SharedDeviceNetworkJammerSystem _jammer = default!; public override void Initialize() { @@ -24,7 +23,6 @@ public sealed class JammerSystem : SharedJammerSystem SubscribeLocalEvent(OnActivate); SubscribeLocalEvent(OnPowerCellChanged); - SubscribeLocalEvent(OnExamine); SubscribeLocalEvent(OnRadioSendAttempt); } @@ -37,27 +35,22 @@ public sealed class JammerSystem : SharedJammerSystem if (_powerCell.TryGetBatteryFromSlot(uid, out var batteryUid, out var battery)) { - if (!_battery.TryUseCharge(batteryUid.Value, GetCurrentWattage(jam) * frameTime, battery)) + if (!_battery.TryUseCharge(batteryUid.Value, GetCurrentWattage((uid, jam)) * frameTime, battery)) { - ChangeLEDState(false, uid); + ChangeLEDState(uid, false); RemComp(uid); RemComp(uid); } else { var percentCharged = battery.CurrentCharge / battery.MaxCharge; - if (percentCharged > .50) + var chargeLevel = percentCharged switch { - ChangeChargeLevel(RadioJammerChargeLevel.High, uid); - } - else if (percentCharged < .15) - { - ChangeChargeLevel(RadioJammerChargeLevel.Low, uid); - } - else - { - ChangeChargeLevel(RadioJammerChargeLevel.Medium, uid); - } + > 0.50f => RadioJammerChargeLevel.High, + < 0.15f => RadioJammerChargeLevel.Low, + _ => RadioJammerChargeLevel.Medium, + }; + ChangeChargeLevel(uid, chargeLevel); } } @@ -65,28 +58,27 @@ public sealed class JammerSystem : SharedJammerSystem } } - private void OnActivate(EntityUid uid, RadioJammerComponent comp, ActivateInWorldEvent args) + private void OnActivate(Entity ent, ref ActivateInWorldEvent args) { if (args.Handled || !args.Complex) return; - var activated = !HasComp(uid) && - _powerCell.TryGetBatteryFromSlot(uid, out var battery) && - battery.CurrentCharge > GetCurrentWattage(comp); + var activated = !HasComp(ent) && + _powerCell.TryGetBatteryFromSlot(ent.Owner, out var battery) && + battery.CurrentCharge > GetCurrentWattage(ent); if (activated) { - ChangeLEDState(true, uid); - EnsureComp(uid); - EnsureComp(uid, out var jammingComp); - jammingComp.Range = GetCurrentRange(comp); - jammingComp.JammableNetworks.Add(DeviceNetworkComponent.DeviceNetIdDefaults.Wireless.ToString()); - Dirty(uid, jammingComp); + ChangeLEDState(ent.Owner, true); + EnsureComp(ent); + EnsureComp(ent, out var jammingComp); + _jammer.SetRange((ent, jammingComp), GetCurrentRange(ent)); + _jammer.AddJammableNetwork((ent, jammingComp), DeviceNetworkComponent.DeviceNetIdDefaults.Wireless.ToString()); } else { - ChangeLEDState(false, uid); - RemCompDeferred(uid); - RemCompDeferred(uid); + ChangeLEDState(ent.Owner, false); + RemCompDeferred(ent); + RemCompDeferred(ent); } var state = Loc.GetString(activated ? "radio-jammer-component-on-state" : "radio-jammer-component-off-state"); var message = Loc.GetString("radio-jammer-component-on-use", ("state", state)); @@ -94,27 +86,12 @@ public sealed class JammerSystem : SharedJammerSystem args.Handled = true; } - private void OnPowerCellChanged(EntityUid uid, ActiveRadioJammerComponent comp, PowerCellChangedEvent args) + private void OnPowerCellChanged(Entity ent, ref PowerCellChangedEvent args) { if (args.Ejected) { - ChangeLEDState(false, uid); - RemCompDeferred(uid); - } - } - - private void OnExamine(EntityUid uid, RadioJammerComponent comp, ExaminedEvent args) - { - if (args.IsInDetailsRange) - { - var powerIndicator = HasComp(uid) - ? Loc.GetString("radio-jammer-component-examine-on-state") - : Loc.GetString("radio-jammer-component-examine-off-state"); - args.PushMarkup(powerIndicator); - - var powerLevel = Loc.GetString(comp.Settings[comp.SelectedPowerLevel].Name); - var switchIndicator = Loc.GetString("radio-jammer-component-switch-setting", ("powerLevel", powerLevel)); - args.PushMarkup(switchIndicator); + ChangeLEDState(ent.Owner, false); + RemCompDeferred(ent); } } @@ -131,9 +108,9 @@ public sealed class JammerSystem : SharedJammerSystem var source = Transform(sourceUid).Coordinates; var query = EntityQueryEnumerator(); - while (query.MoveNext(out _, out _, out var jam, out var transform)) + while (query.MoveNext(out var uid, out _, out var jam, out var transform)) { - if (source.InRange(EntityManager, _transform, transform.Coordinates, GetCurrentRange(jam))) + if (_transform.InRange(source, transform.Coordinates, GetCurrentRange((uid, jam)))) { return true; } diff --git a/Content.Shared/DeviceNetwork/Components/DeviceNetworkJammerComponent.cs b/Content.Shared/DeviceNetwork/Components/DeviceNetworkJammerComponent.cs index 75de0cb8a2..ab320d6d3e 100644 --- a/Content.Shared/DeviceNetwork/Components/DeviceNetworkJammerComponent.cs +++ b/Content.Shared/DeviceNetwork/Components/DeviceNetworkJammerComponent.cs @@ -1,3 +1,4 @@ +using Content.Shared.DeviceNetwork.Systems; using Robust.Shared.GameStates; namespace Content.Shared.DeviceNetwork.Components; @@ -6,6 +7,7 @@ namespace Content.Shared.DeviceNetwork.Components; /// Allow entities to jam DeviceNetwork packets. /// [RegisterComponent, NetworkedComponent, AutoGenerateComponentState] +[Access(typeof(SharedDeviceNetworkJammerSystem))] public sealed partial class DeviceNetworkJammerComponent : Component { /// diff --git a/Content.Shared/DeviceNetwork/Systems/SharedDeviceNetworkJammerSystem.cs b/Content.Shared/DeviceNetwork/Systems/SharedDeviceNetworkJammerSystem.cs new file mode 100644 index 0000000000..fc714ea34f --- /dev/null +++ b/Content.Shared/DeviceNetwork/Systems/SharedDeviceNetworkJammerSystem.cs @@ -0,0 +1,63 @@ +using Content.Shared.DeviceNetwork.Components; + +namespace Content.Shared.DeviceNetwork.Systems; + +/// +public abstract class SharedDeviceNetworkJammerSystem : EntitySystem +{ + /// + /// Sets the range of the jamming effect. + /// + public void SetRange(Entity ent, float value) + { + ent.Comp.Range = value; + Dirty(ent); + } + + /// + public bool TrySetRange(Entity ent, float value) + { + if (!Resolve(ent, ref ent.Comp, logMissing: false)) + return false; + + SetRange((ent, ent.Comp), value); + return true; + } + + /// + /// Returns the set of networks that this entity can jam. + public IReadOnlySet GetJammableNetworks(Entity ent) + { + return ent.Comp.JammableNetworks; + } + + /// + /// Enables this entity to jam packets on the specified network. + /// + public void AddJammableNetwork(Entity ent, string networkId) + { + if (ent.Comp.JammableNetworks.Add(networkId)) + Dirty(ent); + } + + /// + /// Stops this entity from jamming packets on the specified network. + /// + public void RemoveJammableNetwork(Entity ent, string networkId) + { + if (ent.Comp.JammableNetworks.Remove(networkId)) + Dirty(ent); + } + + /// + /// Stops this entity from jamming packets on any networks. + /// + public void ClearJammableNetworks(Entity ent) + { + if (ent.Comp.JammableNetworks.Count == 0) + return; + + ent.Comp.JammableNetworks.Clear(); + Dirty(ent); + } +} diff --git a/Content.Shared/Radio/Components/ActiveRadioJammerComponent.cs b/Content.Shared/Radio/Components/ActiveRadioJammerComponent.cs new file mode 100644 index 0000000000..d5679f1189 --- /dev/null +++ b/Content.Shared/Radio/Components/ActiveRadioJammerComponent.cs @@ -0,0 +1,13 @@ +using Content.Shared.Radio.EntitySystems; +using Robust.Shared.GameStates; + +namespace Content.Shared.Radio.Components; + +/// +/// Prevents all radio in range from sending messages +/// +[RegisterComponent, NetworkedComponent] +[Access(typeof(SharedJammerSystem))] +public sealed partial class ActiveRadioJammerComponent : Component +{ +} diff --git a/Content.Shared/Radio/Components/SharedRadioJammerComponent.cs b/Content.Shared/Radio/Components/RadioJammerComponent.cs similarity index 91% rename from Content.Shared/Radio/Components/SharedRadioJammerComponent.cs rename to Content.Shared/Radio/Components/RadioJammerComponent.cs index e5e52a3e47..8f3519cf7d 100644 --- a/Content.Shared/Radio/Components/SharedRadioJammerComponent.cs +++ b/Content.Shared/Radio/Components/RadioJammerComponent.cs @@ -1,13 +1,14 @@ using Robust.Shared.Serialization; using Robust.Shared.GameStates; -namespace Content.Shared.RadioJammer; +namespace Content.Shared.Radio.Components; /// /// When activated () prevents from sending messages in range /// Suit sensors will also stop working. /// [NetworkedComponent, RegisterComponent] +[AutoGenerateComponentState] public sealed partial class RadioJammerComponent : Component { [DataDefinition] @@ -26,7 +27,7 @@ public sealed partial class RadioJammerComponent : Component public float Range; /// - /// The message that is displayed when switched + /// The message that is displayed when switched. /// to this setting. /// [DataField(required: true)] @@ -49,6 +50,7 @@ public sealed partial class RadioJammerComponent : Component /// Index of the currently selected setting. /// [DataField] + [AutoNetworkedField] public int SelectedPowerLevel = 1; } diff --git a/Content.Shared/Radio/EntitySystems/SharedJammerSystem.cs b/Content.Shared/Radio/EntitySystems/SharedJammerSystem.cs index e1f632735c..8c5baf93f5 100644 --- a/Content.Shared/Radio/EntitySystems/SharedJammerSystem.cs +++ b/Content.Shared/Radio/EntitySystems/SharedJammerSystem.cs @@ -1,13 +1,15 @@ using Content.Shared.Popups; -using Content.Shared.DeviceNetwork.Components; using Content.Shared.Verbs; -using Content.Shared.RadioJammer; +using Content.Shared.Examine; +using Content.Shared.Radio.Components; +using Content.Shared.DeviceNetwork.Systems; namespace Content.Shared.Radio.EntitySystems; public abstract class SharedJammerSystem : EntitySystem { [Dependency] private readonly SharedAppearanceSystem _appearance = default!; + [Dependency] private readonly SharedDeviceNetworkJammerSystem _jammer = default!; [Dependency] protected readonly SharedPopupSystem Popup = default!; public override void Initialize() @@ -15,6 +17,7 @@ public abstract class SharedJammerSystem : EntitySystem base.Initialize(); SubscribeLocalEvent>(OnGetVerb); + SubscribeLocalEvent(OnExamine); } private void OnGetVerb(Entity entity, ref GetVerbsEvent args) @@ -38,13 +41,11 @@ public abstract class SharedJammerSystem : EntitySystem Act = () => { entity.Comp.SelectedPowerLevel = currIndex; - if (TryComp(entity.Owner, out var jammerComp)) + Dirty(entity); + if (_jammer.TrySetRange(entity.Owner, GetCurrentRange(entity))) { - // This is a little sketcy but only way to do it. - jammerComp.Range = GetCurrentRange(entity.Comp); - Dirty(entity.Owner, jammerComp); + Popup.PopupPredicted(Loc.GetString(setting.Message), user, user); } - Popup.PopupPredicted(Loc.GetString(setting.Message), user, user); }, Text = Loc.GetString(setting.Name), }; @@ -53,26 +54,39 @@ public abstract class SharedJammerSystem : EntitySystem } } - public float GetCurrentWattage(RadioJammerComponent jammer) + private void OnExamine(Entity ent, ref ExaminedEvent args) { - return jammer.Settings[jammer.SelectedPowerLevel].Wattage; + if (args.IsInDetailsRange) + { + var powerIndicator = HasComp(ent) + ? Loc.GetString("radio-jammer-component-examine-on-state") + : Loc.GetString("radio-jammer-component-examine-off-state"); + args.PushMarkup(powerIndicator); + + var powerLevel = Loc.GetString(ent.Comp.Settings[ent.Comp.SelectedPowerLevel].Name); + var switchIndicator = Loc.GetString("radio-jammer-component-switch-setting", ("powerLevel", powerLevel)); + args.PushMarkup(switchIndicator); + } } - public float GetCurrentRange(RadioJammerComponent jammer) + public float GetCurrentWattage(Entity jammer) { - return jammer.Settings[jammer.SelectedPowerLevel].Range; + return jammer.Comp.Settings[jammer.Comp.SelectedPowerLevel].Wattage; } - protected void ChangeLEDState(bool isLEDOn, EntityUid uid, - AppearanceComponent? appearance = null) + public float GetCurrentRange(Entity jammer) { - _appearance.SetData(uid, RadioJammerVisuals.LEDOn, isLEDOn, appearance); + return jammer.Comp.Settings[jammer.Comp.SelectedPowerLevel].Range; } - protected void ChangeChargeLevel(RadioJammerChargeLevel chargeLevel, EntityUid uid, - AppearanceComponent? appearance = null) + protected void ChangeLEDState(Entity ent, bool isLEDOn) { - _appearance.SetData(uid, RadioJammerVisuals.ChargeLevel, chargeLevel, appearance); + _appearance.SetData(ent, RadioJammerVisuals.LEDOn, isLEDOn, ent.Comp); + } + + protected void ChangeChargeLevel(Entity ent, RadioJammerChargeLevel chargeLevel) + { + _appearance.SetData(ent, RadioJammerVisuals.ChargeLevel, chargeLevel, ent.Comp); } }