1
0

SharedSolutionContainerMixerSystem.cs 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. using Content.Shared.Chemistry.Components;
  2. using Content.Shared.Chemistry.Reaction;
  3. using Content.Shared.Interaction;
  4. using Content.Shared.Popups;
  5. using Robust.Shared.Audio.Systems;
  6. using Robust.Shared.Containers;
  7. using Robust.Shared.Network;
  8. using Robust.Shared.Timing;
  9. namespace Content.Shared.Chemistry.EntitySystems;
  10. /// <summary>
  11. /// This handles <see cref="SolutionContainerMixerComponent"/>
  12. /// </summary>
  13. public abstract class SharedSolutionContainerMixerSystem : EntitySystem
  14. {
  15. [Dependency] private readonly IGameTiming _timing = default!;
  16. [Dependency] private readonly INetManager _net = default!;
  17. [Dependency] private readonly SharedAppearanceSystem _appearance = default!;
  18. [Dependency] private readonly SharedAudioSystem _audio = default!;
  19. [Dependency] private readonly SharedContainerSystem _container = default!;
  20. [Dependency] private readonly SharedPopupSystem _popup = default!;
  21. [Dependency] private readonly SharedSolutionContainerSystem _solution = default!;
  22. /// <inheritdoc/>
  23. public override void Initialize()
  24. {
  25. SubscribeLocalEvent<SolutionContainerMixerComponent, ActivateInWorldEvent>(OnActivateInWorld);
  26. SubscribeLocalEvent<SolutionContainerMixerComponent, ContainerIsRemovingAttemptEvent>(OnRemoveAttempt);
  27. }
  28. private void OnActivateInWorld(Entity<SolutionContainerMixerComponent> entity, ref ActivateInWorldEvent args)
  29. {
  30. if (args.Handled || !args.Complex)
  31. return;
  32. TryStartMix(entity, args.User);
  33. args.Handled = true;
  34. }
  35. private void OnRemoveAttempt(Entity<SolutionContainerMixerComponent> ent, ref ContainerIsRemovingAttemptEvent args)
  36. {
  37. if (args.Container.ID == ent.Comp.ContainerId && ent.Comp.Mixing)
  38. args.Cancel();
  39. }
  40. protected virtual bool HasPower(Entity<SolutionContainerMixerComponent> entity)
  41. {
  42. return true;
  43. }
  44. public void TryStartMix(Entity<SolutionContainerMixerComponent> entity, EntityUid? user)
  45. {
  46. var (uid, comp) = entity;
  47. if (comp.Mixing)
  48. return;
  49. if (!HasPower(entity))
  50. {
  51. if (user != null)
  52. _popup.PopupClient(Loc.GetString("solution-container-mixer-no-power"), entity, user.Value);
  53. return;
  54. }
  55. if (!_container.TryGetContainer(uid, comp.ContainerId, out var container) || container.Count == 0)
  56. {
  57. if (user != null)
  58. _popup.PopupClient(Loc.GetString("solution-container-mixer-popup-nothing-to-mix"), entity, user.Value);
  59. return;
  60. }
  61. comp.Mixing = true;
  62. if (_net.IsServer)
  63. comp.MixingSoundEntity = _audio.PlayPvs(comp.MixingSound, entity, comp.MixingSound?.Params.WithLoop(true));
  64. comp.MixTimeEnd = _timing.CurTime + comp.MixDuration;
  65. _appearance.SetData(entity, SolutionContainerMixerVisuals.Mixing, true);
  66. Dirty(uid, comp);
  67. }
  68. public void StopMix(Entity<SolutionContainerMixerComponent> entity)
  69. {
  70. var (uid, comp) = entity;
  71. if (!comp.Mixing)
  72. return;
  73. _audio.Stop(comp.MixingSoundEntity);
  74. _appearance.SetData(entity, SolutionContainerMixerVisuals.Mixing, false);
  75. comp.Mixing = false;
  76. comp.MixingSoundEntity = null;
  77. Dirty(uid, comp);
  78. }
  79. public void FinishMix(Entity<SolutionContainerMixerComponent> entity)
  80. {
  81. var (uid, comp) = entity;
  82. if (!comp.Mixing)
  83. return;
  84. StopMix(entity);
  85. if (!TryComp<ReactionMixerComponent>(entity, out var reactionMixer)
  86. || !_container.TryGetContainer(uid, comp.ContainerId, out var container))
  87. return;
  88. foreach (var ent in container.ContainedEntities)
  89. {
  90. if (!_solution.TryGetFitsInDispenser(ent, out var soln, out _))
  91. continue;
  92. _solution.UpdateChemicals(soln.Value, true, reactionMixer);
  93. }
  94. }
  95. public override void Update(float frameTime)
  96. {
  97. base.Update(frameTime);
  98. var query = EntityQueryEnumerator<SolutionContainerMixerComponent>();
  99. while (query.MoveNext(out var uid, out var comp))
  100. {
  101. if (!comp.Mixing)
  102. continue;
  103. if (_timing.CurTime < comp.MixTimeEnd)
  104. continue;
  105. FinishMix((uid, comp));
  106. }
  107. }
  108. }