PuddleSystem.Evaporation.cs 2.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  1. using Content.Shared.Chemistry.Components;
  2. using Content.Shared.FixedPoint;
  3. using Content.Shared.Fluids.Components;
  4. using System.Linq;
  5. namespace Content.Server.Fluids.EntitySystems;
  6. public sealed partial class PuddleSystem
  7. {
  8. private static readonly TimeSpan EvaporationCooldown = TimeSpan.FromSeconds(1);
  9. private void OnEvaporationMapInit(Entity<EvaporationComponent> entity, ref MapInitEvent args)
  10. {
  11. entity.Comp.NextTick = _timing.CurTime + EvaporationCooldown;
  12. }
  13. private void UpdateEvaporation(EntityUid uid, Solution solution)
  14. {
  15. if (HasComp<EvaporationComponent>(uid))
  16. {
  17. return;
  18. }
  19. if (solution.GetTotalPrototypeQuantity(EvaporationReagents) > FixedPoint2.Zero)
  20. {
  21. var evaporation = AddComp<EvaporationComponent>(uid);
  22. evaporation.NextTick = _timing.CurTime + EvaporationCooldown;
  23. return;
  24. }
  25. RemComp<EvaporationComponent>(uid);
  26. }
  27. private void TickEvaporation()
  28. {
  29. var query = EntityQueryEnumerator<EvaporationComponent, PuddleComponent>();
  30. var xformQuery = GetEntityQuery<TransformComponent>();
  31. var curTime = _timing.CurTime;
  32. while (query.MoveNext(out var uid, out var evaporation, out var puddle))
  33. {
  34. if (evaporation.NextTick > curTime)
  35. continue;
  36. evaporation.NextTick += EvaporationCooldown;
  37. if (!_solutionContainerSystem.ResolveSolution(uid, puddle.SolutionName, ref puddle.Solution, out var puddleSolution))
  38. continue;
  39. // Capture if this puddle contained only water
  40. var reagentPrototypes = puddleSolution.GetReagentPrototypes(_prototypeManager);
  41. var onlyWater = reagentPrototypes.Count == 1 && reagentPrototypes.Keys.First().ID == "Water";
  42. var reagentTick = evaporation.EvaporationAmount * EvaporationCooldown.TotalSeconds;
  43. puddleSolution.SplitSolutionWithOnly(reagentTick, EvaporationReagents);
  44. // Despawn if we're done
  45. if (puddleSolution.Volume == FixedPoint2.Zero)
  46. {
  47. // Spawn a *sparkle*
  48. if (onlyWater)
  49. Spawn("PuddleSparkle", xformQuery.GetComponent(uid).Coordinates);
  50. QueueDel(uid);
  51. }
  52. _solutionContainerSystem.UpdateChemicals(puddle.Solution.Value);
  53. }
  54. }
  55. }