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);
}
}