if (!_jammer.GetJammableNetworks((uid, jammerComp)).Contains(ev.NetworkId))
continue;
+ if (jammerComp.FrequenciesExcluded != null &&
+ jammerComp.FrequenciesExcluded.Contains(ev.Frequency))
+ continue;
+
if (_transform.InRange(jammerXform.Coordinates, ev.SenderTransform.Coordinates, jammerComp.Range)
|| _transform.InRange(jammerXform.Coordinates, xform.Comp.Coordinates, jammerComp.Range))
{
if (connection.Owner == packet.Sender)
continue;
- BeforePacketSentEvent beforeEv = new(packet.Sender, xform, senderPos, connection.NetIdEnum.ToString());
+ BeforePacketSentEvent beforeEv = new(packet.Sender, xform, senderPos, connection.NetIdEnum.ToString(), packet.Frequency);
RaiseLocalEvent(connection.Owner, beforeEv, false);
if (!beforeEv.Cancelled)
EnsureComp<DeviceNetworkJammerComponent>(ent, out var jammingComp);
_jammer.SetRange((ent, jammingComp), GetCurrentRange(ent));
_jammer.AddJammableNetwork((ent, jammingComp), DeviceNetworkComponent.DeviceNetIdDefaults.Wireless.ToString());
+
+ // Add excluded frequencies using the system method
+ if (ent.Comp.FrequenciesExcluded != null)
+ {
+ foreach (var freq in ent.Comp.FrequenciesExcluded)
+ {
+ _jammer.AddExcludedFrequency((ent, jammingComp), (uint)freq);
+ }
+ }
}
else
{
private void OnRadioSendAttempt(ref RadioSendAttemptEvent args)
{
- if (ShouldCancelSend(args.RadioSource))
+ if (ShouldCancelSend(args.RadioSource, args.Channel.Frequency))
{
args.Cancelled = true;
}
}
- private bool ShouldCancelSend(EntityUid sourceUid)
+ private bool ShouldCancelSend(EntityUid sourceUid, int frequency)
{
var source = Transform(sourceUid).Coordinates;
var query = EntityQueryEnumerator<ActiveRadioJammerComponent, RadioJammerComponent, TransformComponent>();
while (query.MoveNext(out var uid, out _, out var jam, out var transform))
{
+ // Check if this jammer excludes the frequency
+ if (jam.FrequenciesExcluded != null && jam.FrequenciesExcluded.Contains(frequency))
+ continue;
+
if (_transform.InRange(source, transform.Coordinates, GetCurrentRange((uid, jam))))
{
return true;
[DataField, AutoNetworkedField]
public HashSet<string> JammableNetworks = [];
+ /// <summary>
+ /// Device networks frequencies that wont be jammed.
+ /// </summary>
+ [DataField]
+ public HashSet<uint> FrequenciesExcluded = [];
+
}
/// </summary>
public readonly string NetworkId;
- public BeforePacketSentEvent(EntityUid sender, TransformComponent xform, Vector2 senderPosition, string networkId)
+ /// <summary>
+ /// The frequency the packet is sent on.
+ /// </summary>
+ public readonly uint Frequency;
+
+ public BeforePacketSentEvent(EntityUid sender, TransformComponent xform, Vector2 senderPosition, string networkId, uint frequency)
{
Sender = sender;
SenderTransform = xform;
SenderPosition = senderPosition;
NetworkId = networkId;
+ Frequency = frequency;
}
-}
\ No newline at end of file
+}
ent.Comp.JammableNetworks.Clear();
Dirty(ent);
}
+
+ /// <summary>
+ /// Enables this entity to stop packets with the specified frequency from being jammmed.
+ /// </summary>
+ public void AddExcludedFrequency(Entity<DeviceNetworkJammerComponent> ent, uint frequency)
+ {
+ if (ent.Comp.FrequenciesExcluded.Add(frequency))
+ Dirty(ent);
+ }
+
+ /// <summary>
+ /// Stops this entity to stop packets with the specified frequency from being jammmed.
+ /// </summary>
+ public void RemoveExcludedFrequency(Entity<DeviceNetworkJammerComponent> ent, uint frequency)
+ {
+ if (ent.Comp.FrequenciesExcluded.Remove(frequency))
+ Dirty(ent);
+ }
+
+ /// <summary>
+ /// Stops this entity to stop packets with any frequency from being jammmed.
+ /// </summary>
+ public void ClearExcludedFrequency(Entity<DeviceNetworkJammerComponent> ent)
+ {
+ if (ent.Comp.FrequenciesExcluded.Count == 0)
+ return;
+
+ ent.Comp.FrequenciesExcluded.Clear();
+ Dirty(ent);
+ }
}
namespace Content.Shared.Radio.Components;
/// <summary>
-/// Prevents all radio in range from sending messages
+/// Prevents all non whitelisted radios from sending messages
/// </summary>
[RegisterComponent, NetworkedComponent]
[Access(typeof(SharedJammerSystem))]
[DataField(required: true), ViewVariables(VVAccess.ReadOnly)]
public RadioJamSetting[] Settings;
+ /// <summary>
+ /// Frequencies that are NOT jammed by this jammer.
+ /// </summary>
+ [DataField]
+ public HashSet<int> FrequenciesExcluded = [];
+
/// <summary>
/// Index of the currently selected setting.
/// </summary>
id: XenoborgRadioJammer
name: xenoborg radio jammer
components:
+ - type: RadioJammer
+ frequenciesExcluded:
+ - 2002 # xenoborg radio
+ - 2003 # mothership radio
+ - 2004 # xenoborg network
+ - 2005 # mothership network
- type: ItemSlots
slots:
cell_slot: