SharedToiletSystem.cs 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  1. using Content.Shared.Buckle.Components;
  2. using Content.Shared.Interaction;
  3. using Content.Shared.Verbs;
  4. using Content.Shared.Plunger.Components;
  5. using Robust.Shared.Audio.Systems;
  6. using Robust.Shared.Random;
  7. using Robust.Shared.Utility;
  8. using Content.Shared.Toilet.Components;
  9. namespace Content.Shared.Toilet.Systems
  10. {
  11. /// <summary>
  12. /// Handles sprite changes for both toilet seat up and down as well as for lid open and closed. Handles interactions with hidden stash
  13. /// </summary>
  14. public abstract class SharedToiletSystem : EntitySystem
  15. {
  16. [Dependency] private readonly IRobustRandom _random = default!;
  17. [Dependency] private readonly SharedAudioSystem _audio = default!;
  18. [Dependency] private readonly SharedAppearanceSystem _appearance = default!;
  19. public override void Initialize()
  20. {
  21. base.Initialize();
  22. SubscribeLocalEvent<ToiletComponent, MapInitEvent>(OnMapInit);
  23. SubscribeLocalEvent<ToiletComponent, GetVerbsEvent<AlternativeVerb>>(OnToggleSeatVerb);
  24. SubscribeLocalEvent<ToiletComponent, ActivateInWorldEvent>(OnActivateInWorld);
  25. }
  26. private void OnMapInit(EntityUid uid, ToiletComponent component, MapInitEvent args)
  27. {
  28. if (_random.Prob(0.5f))
  29. component.ToggleSeat = true;
  30. if (_random.Prob(0.3f))
  31. {
  32. TryComp<PlungerUseComponent>(uid, out var plunger);
  33. if (plunger == null)
  34. return;
  35. plunger.NeedsPlunger = true;
  36. }
  37. UpdateAppearance(uid);
  38. Dirty(uid, component);
  39. }
  40. public bool CanToggle(EntityUid uid)
  41. {
  42. return TryComp<StrapComponent>(uid, out var strap) && strap.BuckledEntities.Count == 0;
  43. }
  44. private void OnToggleSeatVerb(EntityUid uid, ToiletComponent component, GetVerbsEvent<AlternativeVerb> args)
  45. {
  46. if (!args.CanInteract || !args.CanAccess || !CanToggle(uid) || args.Hands == null)
  47. return;
  48. AlternativeVerb toggleVerb = new()
  49. {
  50. Act = () => ToggleToiletSeat(uid, args.User, component)
  51. };
  52. if (component.ToggleSeat)
  53. {
  54. toggleVerb.Text = Loc.GetString("toilet-seat-close");
  55. toggleVerb.Icon =
  56. new SpriteSpecifier.Texture(new ResPath("/Textures/Interface/VerbIcons/close.svg.192dpi.png"));
  57. }
  58. else
  59. {
  60. toggleVerb.Text = Loc.GetString("toilet-seat-open");
  61. toggleVerb.Icon =
  62. new SpriteSpecifier.Texture(new ResPath("/Textures/Interface/VerbIcons/open.svg.192dpi.png"));
  63. }
  64. args.Verbs.Add(toggleVerb);
  65. }
  66. private void OnActivateInWorld(EntityUid uid, ToiletComponent comp, ActivateInWorldEvent args)
  67. {
  68. if (args.Handled || !args.Complex)
  69. return;
  70. args.Handled = true;
  71. ToggleToiletSeat(uid, args.User, comp);
  72. }
  73. public void ToggleToiletSeat(EntityUid uid, EntityUid? user = null, ToiletComponent? component = null, MetaDataComponent? meta = null)
  74. {
  75. if (!Resolve(uid, ref component))
  76. return;
  77. component.ToggleSeat = !component.ToggleSeat;
  78. _audio.PlayPredicted(component.SeatSound, uid, uid);
  79. UpdateAppearance(uid, component);
  80. Dirty(uid, component, meta);
  81. }
  82. private void UpdateAppearance(EntityUid uid, ToiletComponent? component = null)
  83. {
  84. if (!Resolve(uid, ref component))
  85. return;
  86. _appearance.SetData(uid, ToiletVisuals.SeatVisualState, component.ToggleSeat ? SeatVisualState.SeatUp : SeatVisualState.SeatDown);
  87. }
  88. }
  89. }