1
0

SharedCartridgeLoaderSystem.cs 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. using Content.Shared.Containers.ItemSlots;
  2. using Robust.Shared.Containers;
  3. namespace Content.Shared.CartridgeLoader;
  4. public abstract class SharedCartridgeLoaderSystem : EntitySystem
  5. {
  6. public const string InstalledContainerId = "program-container";
  7. [Dependency] private readonly ItemSlotsSystem _itemSlotsSystem = default!;
  8. [Dependency] private readonly SharedAppearanceSystem _appearanceSystem = default!;
  9. [Dependency] private readonly SharedContainerSystem _container = default!;
  10. public override void Initialize()
  11. {
  12. base.Initialize();
  13. SubscribeLocalEvent<CartridgeLoaderComponent, ComponentInit>(OnComponentInit);
  14. SubscribeLocalEvent<CartridgeLoaderComponent, ComponentRemove>(OnComponentRemove);
  15. SubscribeLocalEvent<CartridgeLoaderComponent, EntInsertedIntoContainerMessage>(OnItemInserted);
  16. SubscribeLocalEvent<CartridgeLoaderComponent, EntRemovedFromContainerMessage>(OnItemRemoved);
  17. }
  18. private void OnComponentInit(EntityUid uid, CartridgeLoaderComponent loader, ComponentInit args)
  19. {
  20. _itemSlotsSystem.AddItemSlot(uid, CartridgeLoaderComponent.CartridgeSlotId, loader.CartridgeSlot);
  21. }
  22. /// <summary>
  23. /// Marks installed program entities for deletion when the component gets removed
  24. /// </summary>
  25. private void OnComponentRemove(EntityUid uid, CartridgeLoaderComponent loader, ComponentRemove args)
  26. {
  27. _itemSlotsSystem.RemoveItemSlot(uid, loader.CartridgeSlot);
  28. if (_container.TryGetContainer(uid, InstalledContainerId, out var cont))
  29. _container.ShutdownContainer(cont);
  30. }
  31. protected virtual void OnItemInserted(EntityUid uid, CartridgeLoaderComponent loader, EntInsertedIntoContainerMessage args)
  32. {
  33. UpdateAppearanceData(uid, loader);
  34. }
  35. protected virtual void OnItemRemoved(EntityUid uid, CartridgeLoaderComponent loader, EntRemovedFromContainerMessage args)
  36. {
  37. UpdateAppearanceData(uid, loader);
  38. }
  39. private void UpdateAppearanceData(EntityUid uid, CartridgeLoaderComponent loader)
  40. {
  41. _appearanceSystem.SetData(uid, CartridgeLoaderVisuals.CartridgeInserted, loader.CartridgeSlot.HasItem);
  42. }
  43. }
  44. /// <summary>
  45. /// Gets sent to program / cartridge entities when they get inserted or installed
  46. /// </summary>
  47. public sealed class CartridgeAddedEvent : EntityEventArgs
  48. {
  49. public readonly EntityUid Loader;
  50. public CartridgeAddedEvent(EntityUid loader)
  51. {
  52. Loader = loader;
  53. }
  54. }
  55. /// <summary>
  56. /// Gets sent to cartridge entities when they get ejected
  57. /// </summary>
  58. public sealed class CartridgeRemovedEvent : EntityEventArgs
  59. {
  60. public readonly EntityUid Loader;
  61. public CartridgeRemovedEvent(EntityUid loader)
  62. {
  63. Loader = loader;
  64. }
  65. }
  66. /// <summary>
  67. /// Gets sent to program / cartridge entities when they get activated
  68. /// </summary>
  69. /// <remarks>
  70. /// Don't update the programs ui state in this events listener
  71. /// </remarks>
  72. public sealed class CartridgeActivatedEvent : EntityEventArgs
  73. {
  74. public readonly EntityUid Loader;
  75. public CartridgeActivatedEvent(EntityUid loader)
  76. {
  77. Loader = loader;
  78. }
  79. }
  80. /// <summary>
  81. /// Gets sent to program / cartridge entities when they get deactivated
  82. /// </summary>
  83. public sealed class CartridgeDeactivatedEvent : EntityEventArgs
  84. {
  85. public readonly EntityUid Loader;
  86. public CartridgeDeactivatedEvent(EntityUid loader)
  87. {
  88. Loader = loader;
  89. }
  90. }
  91. /// <summary>
  92. /// Gets sent to program / cartridge entities when the ui is ready to be updated by the cartridge.
  93. /// </summary>
  94. /// <remarks>
  95. /// This is used for the initial ui state update because updating the ui in the activate event doesn't work
  96. /// </remarks>
  97. public sealed class CartridgeUiReadyEvent : EntityEventArgs
  98. {
  99. public readonly EntityUid Loader;
  100. public CartridgeUiReadyEvent(EntityUid loader)
  101. {
  102. Loader = loader;
  103. }
  104. }
  105. /// <summary>
  106. /// Gets sent by the cartridge loader system to the cartridge loader entity so another system
  107. /// can handle displaying the notification
  108. /// </summary>
  109. /// <param name="Message">The message to be displayed</param>
  110. [ByRefEvent]
  111. public record struct CartridgeLoaderNotificationSentEvent(string Header, string Message);