RCDAmmoSystem.cs 2.1 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162
  1. using Content.Shared.Charges.Components;
  2. using Content.Shared.Charges.Systems;
  3. using Content.Shared.Examine;
  4. using Content.Shared.Interaction;
  5. using Content.Shared.Popups;
  6. using Content.Shared.RCD.Components;
  7. using Robust.Shared.Timing;
  8. namespace Content.Shared.RCD.Systems;
  9. public sealed class RCDAmmoSystem : EntitySystem
  10. {
  11. [Dependency] private readonly SharedChargesSystem _charges = default!;
  12. [Dependency] private readonly SharedPopupSystem _popup = default!;
  13. [Dependency] private readonly IGameTiming _timing = default!;
  14. public override void Initialize()
  15. {
  16. base.Initialize();
  17. SubscribeLocalEvent<RCDAmmoComponent, ExaminedEvent>(OnExamine);
  18. SubscribeLocalEvent<RCDAmmoComponent, AfterInteractEvent>(OnAfterInteract);
  19. }
  20. private void OnExamine(EntityUid uid, RCDAmmoComponent comp, ExaminedEvent args)
  21. {
  22. if (!args.IsInDetailsRange)
  23. return;
  24. var examineMessage = Loc.GetString("rcd-ammo-component-on-examine", ("charges", comp.Charges));
  25. args.PushText(examineMessage);
  26. }
  27. private void OnAfterInteract(EntityUid uid, RCDAmmoComponent comp, AfterInteractEvent args)
  28. {
  29. if (args.Handled || !args.CanReach || !_timing.IsFirstTimePredicted)
  30. return;
  31. if (args.Target is not { Valid: true } target ||
  32. !HasComp<RCDComponent>(target) ||
  33. !TryComp<LimitedChargesComponent>(target, out var charges))
  34. return;
  35. var user = args.User;
  36. args.Handled = true;
  37. var count = Math.Min(charges.MaxCharges - charges.Charges, comp.Charges);
  38. if (count <= 0)
  39. {
  40. _popup.PopupClient(Loc.GetString("rcd-ammo-component-after-interact-full"), target, user);
  41. return;
  42. }
  43. _popup.PopupClient(Loc.GetString("rcd-ammo-component-after-interact-refilled"), target, user);
  44. _charges.AddCharges(target, count, charges);
  45. comp.Charges -= count;
  46. Dirty(uid, comp);
  47. // prevent having useless ammo with 0 charges
  48. if (comp.Charges <= 0)
  49. QueueDel(uid);
  50. }
  51. }