1
0

EnvelopeSystem.cs 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108
  1. using Content.Shared.DoAfter;
  2. using Content.Shared.Containers.ItemSlots;
  3. using Content.Shared.Verbs;
  4. using Robust.Shared.Audio.Systems;
  5. using Content.Shared.Examine;
  6. namespace Content.Shared.Paper;
  7. public sealed class EnvelopeSystem : EntitySystem
  8. {
  9. [Dependency] private readonly SharedDoAfterSystem _doAfterSystem = default!;
  10. [Dependency] private readonly SharedAudioSystem _audioSystem = default!;
  11. [Dependency] private readonly ItemSlotsSystem _itemSlotsSystem = default!;
  12. public override void Initialize()
  13. {
  14. base.Initialize();
  15. SubscribeLocalEvent<EnvelopeComponent, ItemSlotInsertAttemptEvent>(OnInsertAttempt);
  16. SubscribeLocalEvent<EnvelopeComponent, ItemSlotEjectAttemptEvent>(OnEjectAttempt);
  17. SubscribeLocalEvent<EnvelopeComponent, GetVerbsEvent<AlternativeVerb>>(OnGetAltVerbs);
  18. SubscribeLocalEvent<EnvelopeComponent, EnvelopeDoAfterEvent>(OnDoAfter);
  19. SubscribeLocalEvent<EnvelopeComponent, ExaminedEvent>(OnExamine);
  20. }
  21. private void OnExamine(Entity<EnvelopeComponent> ent, ref ExaminedEvent args)
  22. {
  23. if (ent.Comp.State == EnvelopeComponent.EnvelopeState.Sealed)
  24. {
  25. args.PushMarkup(Loc.GetString("envelope-sealed-examine", ("envelope", ent.Owner)));
  26. }
  27. else if (ent.Comp.State == EnvelopeComponent.EnvelopeState.Torn)
  28. {
  29. args.PushMarkup(Loc.GetString("envelope-torn-examine", ("envelope", ent.Owner)));
  30. }
  31. }
  32. private void OnGetAltVerbs(Entity<EnvelopeComponent> ent, ref GetVerbsEvent<AlternativeVerb> args)
  33. {
  34. if (!args.CanAccess || !args.CanInteract || args.Hands == null)
  35. return;
  36. if (ent.Comp.State == EnvelopeComponent.EnvelopeState.Torn)
  37. return;
  38. var user = args.User;
  39. args.Verbs.Add(new AlternativeVerb()
  40. {
  41. Text = Loc.GetString(ent.Comp.State == EnvelopeComponent.EnvelopeState.Open ? "envelope-verb-seal" : "envelope-verb-tear"),
  42. IconEntity = GetNetEntity(ent.Owner),
  43. Act = () =>
  44. {
  45. TryStartDoAfter(ent, user, ent.Comp.State == EnvelopeComponent.EnvelopeState.Open ? ent.Comp.SealDelay : ent.Comp.TearDelay);
  46. },
  47. });
  48. }
  49. private void OnInsertAttempt(Entity<EnvelopeComponent> ent, ref ItemSlotInsertAttemptEvent args)
  50. {
  51. args.Cancelled |= ent.Comp.State != EnvelopeComponent.EnvelopeState.Open;
  52. }
  53. private void OnEjectAttempt(Entity<EnvelopeComponent> ent, ref ItemSlotEjectAttemptEvent args)
  54. {
  55. args.Cancelled |= ent.Comp.State == EnvelopeComponent.EnvelopeState.Sealed;
  56. }
  57. private void TryStartDoAfter(Entity<EnvelopeComponent> ent, EntityUid user, TimeSpan delay)
  58. {
  59. if (ent.Comp.EnvelopeDoAfter.HasValue)
  60. return;
  61. var doAfterEventArgs = new DoAfterArgs(EntityManager, user, delay, new EnvelopeDoAfterEvent(), ent.Owner, ent.Owner)
  62. {
  63. BreakOnDamage = true,
  64. NeedHand = true,
  65. BreakOnHandChange = true,
  66. MovementThreshold = 0.01f,
  67. DistanceThreshold = 1.0f,
  68. };
  69. if (_doAfterSystem.TryStartDoAfter(doAfterEventArgs, out var doAfterId))
  70. ent.Comp.EnvelopeDoAfter = doAfterId;
  71. }
  72. private void OnDoAfter(Entity<EnvelopeComponent> ent, ref EnvelopeDoAfterEvent args)
  73. {
  74. ent.Comp.EnvelopeDoAfter = null;
  75. if (args.Cancelled)
  76. return;
  77. if (ent.Comp.State == EnvelopeComponent.EnvelopeState.Open)
  78. {
  79. _audioSystem.PlayPredicted(ent.Comp.SealSound, ent.Owner, args.User);
  80. ent.Comp.State = EnvelopeComponent.EnvelopeState.Sealed;
  81. Dirty(ent.Owner, ent.Comp);
  82. }
  83. else if (ent.Comp.State == EnvelopeComponent.EnvelopeState.Sealed)
  84. {
  85. _audioSystem.PlayPredicted(ent.Comp.TearSound, ent.Owner, args.User);
  86. ent.Comp.State = EnvelopeComponent.EnvelopeState.Torn;
  87. Dirty(ent.Owner, ent.Comp);
  88. if (_itemSlotsSystem.TryGetSlot(ent.Owner, ent.Comp.SlotId, out var slotComp))
  89. _itemSlotsSystem.TryEjectToHands(ent.Owner, slotComp, args.User);
  90. }
  91. }
  92. }