FlatpackSystem.cs 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. using Content.Server.Audio;
  2. using Content.Server.Power.Components;
  3. using Content.Server.Power.EntitySystems;
  4. using Content.Shared.Construction;
  5. using Content.Shared.Construction.Components;
  6. using Content.Shared.Containers.ItemSlots;
  7. using Content.Shared.Power;
  8. using Robust.Shared.Prototypes;
  9. using Robust.Shared.Timing;
  10. namespace Content.Server.Construction;
  11. /// <inheritdoc/>
  12. public sealed class FlatpackSystem : SharedFlatpackSystem
  13. {
  14. [Dependency] private readonly IGameTiming _timing = default!;
  15. [Dependency] private readonly AmbientSoundSystem _ambientSound = default!;
  16. [Dependency] private readonly ItemSlotsSystem _itemSlots = default!;
  17. /// <inheritdoc/>
  18. public override void Initialize()
  19. {
  20. base.Initialize();
  21. SubscribeLocalEvent<FlatpackCreatorComponent, FlatpackCreatorStartPackBuiMessage>(OnStartPack);
  22. SubscribeLocalEvent<FlatpackCreatorComponent, PowerChangedEvent>(OnPowerChanged);
  23. }
  24. private void OnStartPack(Entity<FlatpackCreatorComponent> ent, ref FlatpackCreatorStartPackBuiMessage args)
  25. {
  26. var (uid, comp) = ent;
  27. if (!this.IsPowered(ent, EntityManager) || comp.Packing)
  28. return;
  29. if (!_itemSlots.TryGetSlot(uid, comp.SlotId, out var itemSlot) || itemSlot.Item is not { } board)
  30. return;
  31. Dictionary<string, int> cost;
  32. if (TryComp<MachineBoardComponent>(board, out var machine))
  33. cost = GetFlatpackCreationCost(ent, (board, machine));
  34. else if (TryComp<ComputerBoardComponent>(board, out var computer) && computer.Prototype != null)
  35. cost = GetFlatpackCreationCost(ent, null);
  36. else
  37. {
  38. Log.Error($"Encountered invalid flatpack board while packing: {ToPrettyString(board)}");
  39. return;
  40. }
  41. if (!MaterialStorage.CanChangeMaterialAmount(uid, cost))
  42. return;
  43. _itemSlots.SetLock(uid, comp.SlotId, true);
  44. comp.Packing = true;
  45. comp.PackEndTime = _timing.CurTime + comp.PackDuration;
  46. Appearance.SetData(uid, FlatpackCreatorVisuals.Packing, true);
  47. _ambientSound.SetAmbience(uid, true);
  48. Dirty(uid, comp);
  49. }
  50. private void OnPowerChanged(Entity<FlatpackCreatorComponent> ent, ref PowerChangedEvent args)
  51. {
  52. if (args.Powered)
  53. return;
  54. FinishPacking(ent, true);
  55. }
  56. private void FinishPacking(Entity<FlatpackCreatorComponent> ent, bool interrupted)
  57. {
  58. var (uid, comp) = ent;
  59. _itemSlots.SetLock(uid, comp.SlotId, false);
  60. comp.Packing = false;
  61. Appearance.SetData(uid, FlatpackCreatorVisuals.Packing, false);
  62. _ambientSound.SetAmbience(uid, false);
  63. Dirty(uid, comp);
  64. if (interrupted)
  65. return;
  66. if (!_itemSlots.TryGetSlot(uid, comp.SlotId, out var itemSlot) || itemSlot.Item is not { } board)
  67. return;
  68. Dictionary<string, int> cost;
  69. EntProtoId proto;
  70. if (TryComp<MachineBoardComponent>(board, out var machine))
  71. {
  72. cost = GetFlatpackCreationCost(ent, (board, machine));
  73. proto = machine.Prototype;
  74. }
  75. else if (TryComp<ComputerBoardComponent>(board, out var computer) && computer.Prototype != null)
  76. {
  77. cost = GetFlatpackCreationCost(ent, null);
  78. proto = computer.Prototype;
  79. }
  80. else
  81. {
  82. Log.Error($"Encountered invalid flatpack board while packing: {ToPrettyString(board)}");
  83. return;
  84. }
  85. if (!MaterialStorage.TryChangeMaterialAmount((ent, null), cost))
  86. return;
  87. var flatpack = Spawn(comp.BaseFlatpackPrototype, Transform(ent).Coordinates);
  88. SetupFlatpack(flatpack, proto, board);
  89. Del(board);
  90. }
  91. public override void Update(float frameTime)
  92. {
  93. base.Update(frameTime);
  94. var query = EntityQueryEnumerator<FlatpackCreatorComponent>();
  95. while (query.MoveNext(out var uid, out var comp))
  96. {
  97. if (!comp.Packing)
  98. continue;
  99. if (_timing.CurTime < comp.PackEndTime)
  100. continue;
  101. FinishPacking((uid, comp), false);
  102. }
  103. }
  104. }