PlungerSystem.cs 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. using Content.Shared.DoAfter;
  2. using Content.Shared.Interaction;
  3. using Content.Shared.Popups;
  4. using Content.Shared.Plunger.Components;
  5. using Robust.Shared.Audio.Systems;
  6. using Robust.Shared.Timing;
  7. using Content.Shared.Random.Helpers;
  8. using Robust.Shared.Network;
  9. using Robust.Shared.Prototypes;
  10. using Robust.Shared.Random;
  11. using Content.Shared.Random;
  12. namespace Content.Shared.Plunger.Systems;
  13. /// <summary>
  14. /// Plungers can be used to unblock entities with PlungerUseComponent.
  15. /// </summary>
  16. public sealed class PlungerSystem : EntitySystem
  17. {
  18. [Dependency] private readonly IPrototypeManager _proto = default!;
  19. [Dependency] private readonly IRobustRandom _random = default!;
  20. [Dependency] private readonly SharedAudioSystem _audio = default!;
  21. [Dependency] private readonly SharedDoAfterSystem _doAfter = default!;
  22. [Dependency] private readonly SharedPopupSystem _popup = default!;
  23. public override void Initialize()
  24. {
  25. SubscribeLocalEvent<PlungerComponent, AfterInteractEvent>(OnInteract);
  26. SubscribeLocalEvent<PlungerComponent, PlungerDoAfterEvent>(OnDoAfter);
  27. }
  28. private void OnInteract(EntityUid uid, PlungerComponent component, AfterInteractEvent args)
  29. {
  30. if (args.Handled)
  31. return;
  32. if (!args.CanReach || args.Target is not { Valid: true } target)
  33. return;
  34. if (!TryComp<PlungerUseComponent>(args.Target, out var plunger))
  35. return;
  36. if (plunger.NeedsPlunger)
  37. return;
  38. _doAfter.TryStartDoAfter(new DoAfterArgs(EntityManager, args.User, component.PlungeDuration, new PlungerDoAfterEvent(), uid, target, uid)
  39. {
  40. BreakOnMove = true,
  41. BreakOnDamage = true,
  42. MovementThreshold = 1.0f,
  43. });
  44. args.Handled = true;
  45. }
  46. private void OnDoAfter(EntityUid uid, PlungerComponent component, DoAfterEvent args)
  47. {
  48. if (args.Cancelled || args.Handled || args.Args.Target == null)
  49. return;
  50. if (args.Target is not { Valid: true } target)
  51. return;
  52. if (!TryComp(target, out PlungerUseComponent? plunge))
  53. return;
  54. _popup.PopupClient(Loc.GetString("plunger-unblock", ("target", target)), args.User, args.User, PopupType.Medium);
  55. plunge.Plunged = true;
  56. var spawn = _proto.Index<WeightedRandomEntityPrototype>(plunge.PlungerLoot).Pick(_random);
  57. _audio.PlayPredicted(plunge.Sound, uid, uid);
  58. Spawn(spawn, Transform(target).Coordinates);
  59. RemComp<PlungerUseComponent>(target);
  60. Dirty(target, plunge);
  61. args.Handled = true;
  62. }
  63. }