| 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667 |
- using Content.Shared.Chemistry.Components;
- using Content.Shared.FixedPoint;
- using Content.Shared.Fluids.Components;
- using System.Linq;
- namespace Content.Server.Fluids.EntitySystems;
- public sealed partial class PuddleSystem
- {
- private static readonly TimeSpan EvaporationCooldown = TimeSpan.FromSeconds(1);
- private void OnEvaporationMapInit(Entity<EvaporationComponent> entity, ref MapInitEvent args)
- {
- entity.Comp.NextTick = _timing.CurTime + EvaporationCooldown;
- }
- private void UpdateEvaporation(EntityUid uid, Solution solution)
- {
- if (HasComp<EvaporationComponent>(uid))
- {
- return;
- }
- if (solution.GetTotalPrototypeQuantity(EvaporationReagents) > FixedPoint2.Zero)
- {
- var evaporation = AddComp<EvaporationComponent>(uid);
- evaporation.NextTick = _timing.CurTime + EvaporationCooldown;
- return;
- }
- RemComp<EvaporationComponent>(uid);
- }
- private void TickEvaporation()
- {
- var query = EntityQueryEnumerator<EvaporationComponent, PuddleComponent>();
- var xformQuery = GetEntityQuery<TransformComponent>();
- var curTime = _timing.CurTime;
- while (query.MoveNext(out var uid, out var evaporation, out var puddle))
- {
- if (evaporation.NextTick > curTime)
- continue;
- evaporation.NextTick += EvaporationCooldown;
- if (!_solutionContainerSystem.ResolveSolution(uid, puddle.SolutionName, ref puddle.Solution, out var puddleSolution))
- continue;
- // Capture if this puddle contained only water
- var reagentPrototypes = puddleSolution.GetReagentPrototypes(_prototypeManager);
- var onlyWater = reagentPrototypes.Count == 1 && reagentPrototypes.Keys.First().ID == "Water";
- var reagentTick = evaporation.EvaporationAmount * EvaporationCooldown.TotalSeconds;
- puddleSolution.SplitSolutionWithOnly(reagentTick, EvaporationReagents);
- // Despawn if we're done
- if (puddleSolution.Volume == FixedPoint2.Zero)
- {
- // Spawn a *sparkle*
- if (onlyWater)
- Spawn("PuddleSparkle", xformQuery.GetComponent(uid).Coordinates);
- QueueDel(uid);
- }
- _solutionContainerSystem.UpdateChemicals(puddle.Solution.Value);
- }
- }
- }
|