SharedJammerSystem.cs 3.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. using Content.Shared.Popups;
  2. using Content.Shared.Verbs;
  3. using Content.Shared.Examine;
  4. using Content.Shared.Radio.Components;
  5. using Content.Shared.DeviceNetwork.Systems;
  6. namespace Content.Shared.Radio.EntitySystems;
  7. public abstract class SharedJammerSystem : EntitySystem
  8. {
  9. [Dependency] private readonly SharedAppearanceSystem _appearance = default!;
  10. [Dependency] private readonly SharedDeviceNetworkJammerSystem _jammer = default!;
  11. [Dependency] protected readonly SharedPopupSystem Popup = default!;
  12. public override void Initialize()
  13. {
  14. base.Initialize();
  15. SubscribeLocalEvent<RadioJammerComponent, GetVerbsEvent<Verb>>(OnGetVerb);
  16. SubscribeLocalEvent<RadioJammerComponent, ExaminedEvent>(OnExamine);
  17. }
  18. private void OnGetVerb(Entity<RadioJammerComponent> entity, ref GetVerbsEvent<Verb> args)
  19. {
  20. if (!args.CanAccess || !args.CanInteract)
  21. return;
  22. var user = args.User;
  23. byte index = 0;
  24. foreach (var setting in entity.Comp.Settings)
  25. {
  26. // This is because Act wont work with index.
  27. // Needs it to be saved in the loop.
  28. var currIndex = index;
  29. var verb = new Verb
  30. {
  31. Priority = currIndex,
  32. Category = VerbCategory.PowerLevel,
  33. Disabled = entity.Comp.SelectedPowerLevel == currIndex,
  34. Act = () =>
  35. {
  36. entity.Comp.SelectedPowerLevel = currIndex;
  37. Dirty(entity);
  38. // If the jammer is off, this won't do anything which is fine.
  39. // The range should be updated when it turns on again!
  40. _jammer.TrySetRange(entity.Owner, GetCurrentRange(entity));
  41. Popup.PopupClient(Loc.GetString(setting.Message), user, user);
  42. },
  43. Text = Loc.GetString(setting.Name),
  44. };
  45. args.Verbs.Add(verb);
  46. index++;
  47. }
  48. }
  49. private void OnExamine(Entity<RadioJammerComponent> ent, ref ExaminedEvent args)
  50. {
  51. if (args.IsInDetailsRange)
  52. {
  53. var powerIndicator = HasComp<ActiveRadioJammerComponent>(ent)
  54. ? Loc.GetString("radio-jammer-component-examine-on-state")
  55. : Loc.GetString("radio-jammer-component-examine-off-state");
  56. args.PushMarkup(powerIndicator);
  57. var powerLevel = Loc.GetString(ent.Comp.Settings[ent.Comp.SelectedPowerLevel].Name);
  58. var switchIndicator = Loc.GetString("radio-jammer-component-switch-setting", ("powerLevel", powerLevel));
  59. args.PushMarkup(switchIndicator);
  60. }
  61. }
  62. public float GetCurrentWattage(Entity<RadioJammerComponent> jammer)
  63. {
  64. return jammer.Comp.Settings[jammer.Comp.SelectedPowerLevel].Wattage;
  65. }
  66. public float GetCurrentRange(Entity<RadioJammerComponent> jammer)
  67. {
  68. return jammer.Comp.Settings[jammer.Comp.SelectedPowerLevel].Range;
  69. }
  70. protected void ChangeLEDState(Entity<AppearanceComponent?> ent, bool isLEDOn)
  71. {
  72. _appearance.SetData(ent, RadioJammerVisuals.LEDOn, isLEDOn, ent.Comp);
  73. }
  74. protected void ChangeChargeLevel(Entity<AppearanceComponent?> ent, RadioJammerChargeLevel chargeLevel)
  75. {
  76. _appearance.SetData(ent, RadioJammerVisuals.ChargeLevel, chargeLevel, ent.Comp);
  77. }
  78. }