ItemCabinetSystem.cs 3.2 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495
  1. using Content.Shared.Containers.ItemSlots;
  2. using Content.Shared.Interaction;
  3. using Content.Shared.Nutrition.Components;
  4. using Content.Shared.Nutrition.EntitySystems;
  5. using Robust.Shared.Containers;
  6. using System.Diagnostics.CodeAnalysis;
  7. namespace Content.Shared.Cabinet;
  8. /// <summary>
  9. /// Controls ItemCabinet slot locking and visuals.
  10. /// </summary>
  11. public sealed class ItemCabinetSystem : EntitySystem
  12. {
  13. [Dependency] private readonly ItemSlotsSystem _slots = default!;
  14. [Dependency] private readonly OpenableSystem _openable = default!;
  15. [Dependency] private readonly SharedAppearanceSystem _appearance = default!;
  16. /// <inheritdoc/>
  17. public override void Initialize()
  18. {
  19. base.Initialize();
  20. SubscribeLocalEvent<ItemCabinetComponent, ComponentStartup>(OnStartup);
  21. SubscribeLocalEvent<ItemCabinetComponent, MapInitEvent>(OnMapInit);
  22. SubscribeLocalEvent<ItemCabinetComponent, EntInsertedIntoContainerMessage>(OnContainerModified);
  23. SubscribeLocalEvent<ItemCabinetComponent, EntRemovedFromContainerMessage>(OnContainerModified);
  24. SubscribeLocalEvent<ItemCabinetComponent, OpenableOpenedEvent>(OnOpened);
  25. SubscribeLocalEvent<ItemCabinetComponent, OpenableClosedEvent>(OnClosed);
  26. }
  27. private void OnStartup(Entity<ItemCabinetComponent> ent, ref ComponentStartup args)
  28. {
  29. UpdateAppearance(ent);
  30. }
  31. private void OnMapInit(Entity<ItemCabinetComponent> ent, ref MapInitEvent args)
  32. {
  33. // update at mapinit to avoid copy pasting locked: true and locked: false for each closed/open prototype
  34. SetSlotLock(ent, !_openable.IsOpen(ent));
  35. }
  36. private void UpdateAppearance(Entity<ItemCabinetComponent> ent)
  37. {
  38. _appearance.SetData(ent, ItemCabinetVisuals.ContainsItem, HasItem(ent));
  39. }
  40. private void OnContainerModified(EntityUid uid, ItemCabinetComponent component, ContainerModifiedMessage args)
  41. {
  42. if (args.Container.ID == component.Slot)
  43. UpdateAppearance((uid, component));
  44. }
  45. private void OnOpened(Entity<ItemCabinetComponent> ent, ref OpenableOpenedEvent args)
  46. {
  47. SetSlotLock(ent, false);
  48. }
  49. private void OnClosed(Entity<ItemCabinetComponent> ent, ref OpenableClosedEvent args)
  50. {
  51. SetSlotLock(ent, true);
  52. }
  53. /// <summary>
  54. /// Tries to get the cabinet's item slot.
  55. /// </summary>
  56. public bool TryGetSlot(Entity<ItemCabinetComponent> ent, [NotNullWhen(true)] out ItemSlot? slot)
  57. {
  58. slot = null;
  59. if (!TryComp<ItemSlotsComponent>(ent, out var slots))
  60. return false;
  61. return _slots.TryGetSlot(ent, ent.Comp.Slot, out slot, slots);
  62. }
  63. /// <summary>
  64. /// Returns true if the cabinet contains an item.
  65. /// </summary>
  66. public bool HasItem(Entity<ItemCabinetComponent> ent)
  67. {
  68. return TryGetSlot(ent, out var slot) && slot.HasItem;
  69. }
  70. /// <summary>
  71. /// Lock or unlock the underlying item slot.
  72. /// </summary>
  73. public void SetSlotLock(Entity<ItemCabinetComponent> ent, bool closed)
  74. {
  75. if (!TryComp<ItemSlotsComponent>(ent, out var slots))
  76. return;
  77. if (_slots.TryGetSlot(ent, ent.Comp.Slot, out var slot, slots))
  78. _slots.SetLock(ent, slot, closed, slots);
  79. }
  80. }