JammerSystem.cs 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121
  1. using Content.Server.DeviceNetwork.Components;
  2. using Content.Server.Power.EntitySystems;
  3. using Content.Server.PowerCell;
  4. using Content.Shared.DeviceNetwork.Components;
  5. using Content.Shared.Interaction;
  6. using Content.Shared.PowerCell.Components;
  7. using Content.Shared.Radio.EntitySystems;
  8. using Content.Shared.Radio.Components;
  9. using Content.Shared.DeviceNetwork.Systems;
  10. namespace Content.Server.Radio.EntitySystems;
  11. public sealed class JammerSystem : SharedJammerSystem
  12. {
  13. [Dependency] private readonly PowerCellSystem _powerCell = default!;
  14. [Dependency] private readonly BatterySystem _battery = default!;
  15. [Dependency] private readonly SharedTransformSystem _transform = default!;
  16. [Dependency] private readonly SharedDeviceNetworkJammerSystem _jammer = default!;
  17. public override void Initialize()
  18. {
  19. base.Initialize();
  20. SubscribeLocalEvent<RadioJammerComponent, ActivateInWorldEvent>(OnActivate);
  21. SubscribeLocalEvent<ActiveRadioJammerComponent, PowerCellChangedEvent>(OnPowerCellChanged);
  22. SubscribeLocalEvent<RadioSendAttemptEvent>(OnRadioSendAttempt);
  23. }
  24. public override void Update(float frameTime)
  25. {
  26. var query = EntityQueryEnumerator<ActiveRadioJammerComponent, RadioJammerComponent>();
  27. while (query.MoveNext(out var uid, out var _, out var jam))
  28. {
  29. if (_powerCell.TryGetBatteryFromSlot(uid, out var batteryUid, out var battery))
  30. {
  31. if (!_battery.TryUseCharge(batteryUid.Value, GetCurrentWattage((uid, jam)) * frameTime, battery))
  32. {
  33. ChangeLEDState(uid, false);
  34. RemComp<ActiveRadioJammerComponent>(uid);
  35. RemComp<DeviceNetworkJammerComponent>(uid);
  36. }
  37. else
  38. {
  39. var percentCharged = battery.CurrentCharge / battery.MaxCharge;
  40. var chargeLevel = percentCharged switch
  41. {
  42. > 0.50f => RadioJammerChargeLevel.High,
  43. < 0.15f => RadioJammerChargeLevel.Low,
  44. _ => RadioJammerChargeLevel.Medium,
  45. };
  46. ChangeChargeLevel(uid, chargeLevel);
  47. }
  48. }
  49. }
  50. }
  51. private void OnActivate(Entity<RadioJammerComponent> ent, ref ActivateInWorldEvent args)
  52. {
  53. if (args.Handled || !args.Complex)
  54. return;
  55. var activated = !HasComp<ActiveRadioJammerComponent>(ent) &&
  56. _powerCell.TryGetBatteryFromSlot(ent.Owner, out var battery) &&
  57. battery.CurrentCharge > GetCurrentWattage(ent);
  58. if (activated)
  59. {
  60. ChangeLEDState(ent.Owner, true);
  61. EnsureComp<ActiveRadioJammerComponent>(ent);
  62. EnsureComp<DeviceNetworkJammerComponent>(ent, out var jammingComp);
  63. _jammer.SetRange((ent, jammingComp), GetCurrentRange(ent));
  64. _jammer.AddJammableNetwork((ent, jammingComp), DeviceNetworkComponent.DeviceNetIdDefaults.Wireless.ToString());
  65. }
  66. else
  67. {
  68. ChangeLEDState(ent.Owner, false);
  69. RemCompDeferred<ActiveRadioJammerComponent>(ent);
  70. RemCompDeferred<DeviceNetworkJammerComponent>(ent);
  71. }
  72. var state = Loc.GetString(activated ? "radio-jammer-component-on-state" : "radio-jammer-component-off-state");
  73. var message = Loc.GetString("radio-jammer-component-on-use", ("state", state));
  74. Popup.PopupEntity(message, args.User, args.User);
  75. args.Handled = true;
  76. }
  77. private void OnPowerCellChanged(Entity<ActiveRadioJammerComponent> ent, ref PowerCellChangedEvent args)
  78. {
  79. if (args.Ejected)
  80. {
  81. ChangeLEDState(ent.Owner, false);
  82. RemCompDeferred<ActiveRadioJammerComponent>(ent);
  83. }
  84. }
  85. private void OnRadioSendAttempt(ref RadioSendAttemptEvent args)
  86. {
  87. if (ShouldCancelSend(args.RadioSource))
  88. {
  89. args.Cancelled = true;
  90. }
  91. }
  92. private bool ShouldCancelSend(EntityUid sourceUid)
  93. {
  94. var source = Transform(sourceUid).Coordinates;
  95. var query = EntityQueryEnumerator<ActiveRadioJammerComponent, RadioJammerComponent, TransformComponent>();
  96. while (query.MoveNext(out var uid, out _, out var jam, out var transform))
  97. {
  98. if (_transform.InRange(source, transform.Coordinates, GetCurrentRange((uid, jam))))
  99. {
  100. return true;
  101. }
  102. }
  103. return false;
  104. }
  105. }