1
0

NanoTaskCartridgeSystem.cs 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. using Content.Shared.CartridgeLoader.Cartridges;
  2. using Content.Shared.CartridgeLoader;
  3. using Content.Shared.Hands.EntitySystems;
  4. using Content.Shared.Interaction;
  5. using Content.Shared.Paper;
  6. using Robust.Shared.Audio;
  7. using Robust.Shared.Audio.Systems;
  8. using Robust.Shared.Timing;
  9. using Robust.Shared.Utility;
  10. namespace Content.Server.CartridgeLoader.Cartridges;
  11. /// <summary>
  12. /// Server-side class implementing the core UI logic of NanoTask
  13. /// </summary>
  14. public sealed class NanoTaskCartridgeSystem : SharedNanoTaskCartridgeSystem
  15. {
  16. [Dependency] private readonly CartridgeLoaderSystem _cartridgeLoader = default!;
  17. [Dependency] private readonly IGameTiming _timing = default!;
  18. [Dependency] private readonly PaperSystem _paper = default!;
  19. [Dependency] private readonly SharedAudioSystem _audio = default!;
  20. [Dependency] private readonly SharedHandsSystem _hands = default!;
  21. public override void Initialize()
  22. {
  23. base.Initialize();
  24. SubscribeLocalEvent<NanoTaskCartridgeComponent, CartridgeMessageEvent>(OnUiMessage);
  25. SubscribeLocalEvent<NanoTaskCartridgeComponent, CartridgeUiReadyEvent>(OnUiReady);
  26. SubscribeLocalEvent<NanoTaskCartridgeComponent, CartridgeRemovedEvent>(OnCartridgeRemoved);
  27. SubscribeLocalEvent<NanoTaskInteractionComponent, InteractUsingEvent>(OnInteractUsing);
  28. }
  29. private void OnCartridgeRemoved(Entity<NanoTaskCartridgeComponent> ent, ref CartridgeRemovedEvent args)
  30. {
  31. if (!_cartridgeLoader.HasProgram<NanoTaskCartridgeComponent>(args.Loader))
  32. {
  33. RemComp<NanoTaskInteractionComponent>(args.Loader);
  34. }
  35. }
  36. private void OnInteractUsing(Entity<NanoTaskInteractionComponent> ent, ref InteractUsingEvent args)
  37. {
  38. if (!_cartridgeLoader.TryGetProgram<NanoTaskCartridgeComponent>(ent.Owner, out var uid, out var program))
  39. {
  40. return;
  41. }
  42. if (!EntityManager.TryGetComponent<NanoTaskPrintedComponent>(args.Used, out var printed))
  43. {
  44. return;
  45. }
  46. if (printed.Task is NanoTaskItem item)
  47. {
  48. program.Tasks.Add(new(program.Counter++, printed.Task));
  49. args.Handled = true;
  50. EntityManager.DeleteEntity(args.Used);
  51. UpdateUiState(new Entity<NanoTaskCartridgeComponent>(uid.Value, program), ent.Owner);
  52. }
  53. }
  54. /// <summary>
  55. /// This gets called when the ui fragment needs to be updated for the first time after activating
  56. /// </summary>
  57. private void OnUiReady(Entity<NanoTaskCartridgeComponent> ent, ref CartridgeUiReadyEvent args)
  58. {
  59. UpdateUiState(ent, args.Loader);
  60. }
  61. private void SetupPrintedTask(EntityUid uid, NanoTaskItem item)
  62. {
  63. PaperComponent? paper = null;
  64. NanoTaskPrintedComponent? printed = null;
  65. if (!Resolve(uid, ref paper, ref printed))
  66. return;
  67. printed.Task = item;
  68. var msg = new FormattedMessage();
  69. msg.AddText(Loc.GetString("nano-task-printed-description", ("description", item.Description)));
  70. msg.PushNewline();
  71. msg.AddText(Loc.GetString("nano-task-printed-requester", ("requester", item.TaskIsFor)));
  72. msg.PushNewline();
  73. msg.AddText(item.Priority switch {
  74. NanoTaskPriority.High => Loc.GetString("nano-task-printed-high-priority"),
  75. NanoTaskPriority.Medium => Loc.GetString("nano-task-printed-medium-priority"),
  76. NanoTaskPriority.Low => Loc.GetString("nano-task-printed-low-priority"),
  77. _ => "",
  78. });
  79. _paper.SetContent((uid, paper), msg.ToMarkup());
  80. }
  81. /// <summary>
  82. /// The ui messages received here get wrapped by a CartridgeMessageEvent and are relayed from the <see cref="CartridgeLoaderSystem"/>
  83. /// </summary>
  84. /// <remarks>
  85. /// The cartridge specific ui message event needs to inherit from the CartridgeMessageEvent
  86. /// </remarks>
  87. private void OnUiMessage(Entity<NanoTaskCartridgeComponent> ent, ref CartridgeMessageEvent args)
  88. {
  89. if (args is not NanoTaskUiMessageEvent message)
  90. return;
  91. switch (message.Payload)
  92. {
  93. case NanoTaskAddTask task:
  94. if (!task.Item.Validate())
  95. return;
  96. ent.Comp.Tasks.Add(new(ent.Comp.Counter++, task.Item));
  97. break;
  98. case NanoTaskUpdateTask task:
  99. {
  100. if (!task.Item.Data.Validate())
  101. return;
  102. var idx = ent.Comp.Tasks.FindIndex(t => t.Id == task.Item.Id);
  103. if (idx != -1)
  104. ent.Comp.Tasks[idx] = task.Item;
  105. break;
  106. }
  107. case NanoTaskDeleteTask task:
  108. ent.Comp.Tasks.RemoveAll(t => t.Id == task.Id);
  109. break;
  110. case NanoTaskPrintTask task:
  111. {
  112. if (!task.Item.Validate())
  113. return;
  114. if (_timing.CurTime < ent.Comp.NextPrintAllowedAfter)
  115. return;
  116. ent.Comp.NextPrintAllowedAfter = _timing.CurTime + ent.Comp.PrintDelay;
  117. var printed = Spawn("PaperNanoTaskItem", Transform(message.Actor).Coordinates);
  118. _hands.PickupOrDrop(message.Actor, printed);
  119. _audio.PlayPvs(new SoundPathSpecifier("/Audio/Machines/printer.ogg"), ent.Owner);
  120. SetupPrintedTask(printed, task.Item);
  121. break;
  122. }
  123. }
  124. UpdateUiState(ent, GetEntity(args.LoaderUid));
  125. }
  126. private void UpdateUiState(Entity<NanoTaskCartridgeComponent> ent, EntityUid loaderUid)
  127. {
  128. var state = new NanoTaskUiState(ent.Comp.Tasks);
  129. _cartridgeLoader.UpdateCartridgeUiState(loaderUid, state);
  130. }
  131. }