BatteryWeaponFireModesSystem.cs 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. using System.Linq;
  2. using Content.Shared.Database;
  3. using Content.Shared.Examine;
  4. using Content.Shared.Interaction;
  5. using Content.Shared.Popups;
  6. using Content.Shared.Verbs;
  7. using Content.Shared.Weapons.Ranged.Components;
  8. using Content.Shared.Weapons.Ranged.Events;
  9. using Robust.Shared.Prototypes;
  10. namespace Content.Shared.Weapons.Ranged.Systems;
  11. public sealed class BatteryWeaponFireModesSystem : EntitySystem
  12. {
  13. [Dependency] private readonly IPrototypeManager _prototypeManager = default!;
  14. [Dependency] private readonly SharedPopupSystem _popupSystem = default!;
  15. public override void Initialize()
  16. {
  17. base.Initialize();
  18. SubscribeLocalEvent<BatteryWeaponFireModesComponent, ActivateInWorldEvent>(OnInteractHandEvent);
  19. SubscribeLocalEvent<BatteryWeaponFireModesComponent, GetVerbsEvent<Verb>>(OnGetVerb);
  20. SubscribeLocalEvent<BatteryWeaponFireModesComponent, ExaminedEvent>(OnExamined);
  21. }
  22. private void OnExamined(EntityUid uid, BatteryWeaponFireModesComponent component, ExaminedEvent args)
  23. {
  24. if (component.FireModes.Count < 2)
  25. return;
  26. var fireMode = GetMode(component);
  27. if (!_prototypeManager.TryIndex<EntityPrototype>(fireMode.Prototype, out var proto))
  28. return;
  29. args.PushMarkup(Loc.GetString("gun-set-fire-mode", ("mode", proto.Name)));
  30. }
  31. private BatteryWeaponFireMode GetMode(BatteryWeaponFireModesComponent component)
  32. {
  33. return component.FireModes[component.CurrentFireMode];
  34. }
  35. private void OnGetVerb(EntityUid uid, BatteryWeaponFireModesComponent component, GetVerbsEvent<Verb> args)
  36. {
  37. if (!args.CanAccess || !args.CanInteract || args.Hands == null)
  38. return;
  39. if (component.FireModes.Count < 2)
  40. return;
  41. for (var i = 0; i < component.FireModes.Count; i++)
  42. {
  43. var fireMode = component.FireModes[i];
  44. var entProto = _prototypeManager.Index<EntityPrototype>(fireMode.Prototype);
  45. var index = i;
  46. var v = new Verb
  47. {
  48. Priority = 1,
  49. Category = VerbCategory.SelectType,
  50. Text = entProto.Name,
  51. Disabled = i == component.CurrentFireMode,
  52. Impact = LogImpact.Low,
  53. DoContactInteraction = true,
  54. Act = () =>
  55. {
  56. SetFireMode(uid, component, index, args.User);
  57. }
  58. };
  59. args.Verbs.Add(v);
  60. }
  61. }
  62. private void OnInteractHandEvent(EntityUid uid, BatteryWeaponFireModesComponent component, ActivateInWorldEvent args)
  63. {
  64. if (!args.Complex)
  65. return;
  66. if (component.FireModes.Count < 2)
  67. return;
  68. CycleFireMode(uid, component, args.User);
  69. }
  70. private void CycleFireMode(EntityUid uid, BatteryWeaponFireModesComponent component, EntityUid user)
  71. {
  72. if (component.FireModes.Count < 2)
  73. return;
  74. var index = (component.CurrentFireMode + 1) % component.FireModes.Count;
  75. SetFireMode(uid, component, index, user);
  76. }
  77. private void SetFireMode(EntityUid uid, BatteryWeaponFireModesComponent component, int index, EntityUid? user = null)
  78. {
  79. var fireMode = component.FireModes[index];
  80. component.CurrentFireMode = index;
  81. Dirty(uid, component);
  82. if (TryComp(uid, out ProjectileBatteryAmmoProviderComponent? projectileBatteryAmmoProviderComponent))
  83. {
  84. if (!_prototypeManager.TryIndex<EntityPrototype>(fireMode.Prototype, out var prototype))
  85. return;
  86. // TODO: Have this get the info directly from the batteryComponent when power is moved to shared.
  87. var OldFireCost = projectileBatteryAmmoProviderComponent.FireCost;
  88. projectileBatteryAmmoProviderComponent.Prototype = fireMode.Prototype;
  89. projectileBatteryAmmoProviderComponent.FireCost = fireMode.FireCost;
  90. float FireCostDiff = (float)fireMode.FireCost / (float)OldFireCost;
  91. projectileBatteryAmmoProviderComponent.Shots = (int)Math.Round(projectileBatteryAmmoProviderComponent.Shots/FireCostDiff);
  92. projectileBatteryAmmoProviderComponent.Capacity = (int)Math.Round(projectileBatteryAmmoProviderComponent.Capacity/FireCostDiff);
  93. Dirty(uid, projectileBatteryAmmoProviderComponent);
  94. var updateClientAmmoEvent = new UpdateClientAmmoEvent();
  95. RaiseLocalEvent(uid, ref updateClientAmmoEvent);
  96. if (user != null)
  97. {
  98. _popupSystem.PopupClient(Loc.GetString("gun-set-fire-mode", ("mode", prototype.Name)), uid, user.Value);
  99. }
  100. }
  101. }
  102. }