SharedVendingMachineSystem.Restock.cs 2.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091
  1. using Content.Shared.DoAfter;
  2. using Content.Shared.Interaction;
  3. using Content.Shared.Popups;
  4. using Content.Shared.Wires;
  5. using Robust.Shared.Audio;
  6. namespace Content.Shared.VendingMachines;
  7. public abstract partial class SharedVendingMachineSystem
  8. {
  9. public bool TryAccessMachine(EntityUid uid,
  10. VendingMachineRestockComponent restock,
  11. VendingMachineComponent machineComponent,
  12. EntityUid user,
  13. EntityUid target)
  14. {
  15. if (!TryComp<WiresPanelComponent>(target, out var panel) || !panel.Open)
  16. {
  17. if (_net.IsServer)
  18. {
  19. Popup.PopupCursor(Loc.GetString("vending-machine-restock-needs-panel-open",
  20. ("this", uid),
  21. ("user", user),
  22. ("target", target)),
  23. user);
  24. }
  25. return false;
  26. }
  27. return true;
  28. }
  29. public bool TryMatchPackageToMachine(EntityUid uid,
  30. VendingMachineRestockComponent component,
  31. VendingMachineComponent machineComponent,
  32. EntityUid user,
  33. EntityUid target)
  34. {
  35. if (!component.CanRestock.Contains(machineComponent.PackPrototypeId))
  36. {
  37. if (_net.IsServer)
  38. {
  39. Popup.PopupCursor(Loc.GetString("vending-machine-restock-invalid-inventory", ("this", uid), ("user", user),
  40. ("target", target)), user);
  41. }
  42. return false;
  43. }
  44. return true;
  45. }
  46. private void OnAfterInteract(EntityUid uid, VendingMachineRestockComponent component, AfterInteractEvent args)
  47. {
  48. if (args.Target is not { } target || !args.CanReach || args.Handled)
  49. return;
  50. if (!TryComp<VendingMachineComponent>(args.Target, out var machineComponent))
  51. return;
  52. if (!TryMatchPackageToMachine(uid, component, machineComponent, args.User, target))
  53. return;
  54. if (!TryAccessMachine(uid, component, machineComponent, args.User, target))
  55. return;
  56. args.Handled = true;
  57. var doAfterArgs = new DoAfterArgs(EntityManager, args.User, (float)component.RestockDelay.TotalSeconds, new RestockDoAfterEvent(), target,
  58. target: target, used: uid)
  59. {
  60. BreakOnMove = true,
  61. BreakOnDamage = true,
  62. NeedHand = true,
  63. };
  64. if (!_doAfter.TryStartDoAfter(doAfterArgs))
  65. return;
  66. if (_net.IsServer)
  67. {
  68. Popup.PopupEntity(Loc.GetString("vending-machine-restock-start", ("this", uid), ("user", args.User),
  69. ("target", target)),
  70. args.User,
  71. PopupType.Medium);
  72. }
  73. Audio.PlayPredicted(component.SoundRestockStart, uid, args.User);
  74. }
  75. }