using Content.Server.Fluids.Components; using Content.Shared.Chemistry.Components; using Content.Shared.Chemistry.Reagent; using Content.Shared.FixedPoint; using Content.Shared.Fluids.Components; namespace Content.Server.Fluids.EntitySystems; public sealed partial class PuddleSystem { private static readonly TimeSpan EvaporationCooldown = TimeSpan.FromSeconds(1); [ValidatePrototypeId] private const string Water = "Water"; [ValidatePrototypeId] private const string SoapyWater = "SoapyWater"; public static string[] EvaporationReagents = new[] { Water, SoapyWater }; private void OnEvaporationMapInit(EntityUid uid, EvaporationComponent component, MapInitEvent args) { component.NextTick = _timing.CurTime + EvaporationCooldown; } private void UpdateEvaporation(EntityUid uid, Solution solution) { if (HasComp(uid)) { return; } if (solution.GetTotalPrototypeQuantity(EvaporationReagents) > FixedPoint2.Zero) { var evaporation = AddComp(uid); evaporation.NextTick = _timing.CurTime + EvaporationCooldown; return; } RemComp(uid); } private void TickEvaporation() { var query = EntityQueryEnumerator(); var xformQuery = GetEntityQuery(); 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.TryGetSolution(uid, puddle.SolutionName, out var puddleSolution)) continue; var reagentTick = evaporation.EvaporationAmount * EvaporationCooldown.TotalSeconds; puddleSolution.SplitSolutionWithOnly(reagentTick, EvaporationReagents); // Despawn if we're done if (puddleSolution.Volume == FixedPoint2.Zero) { // Spawn a *sparkle* Spawn("PuddleSparkle", xformQuery.GetComponent(uid).Coordinates); QueueDel(uid); } } } public bool CanFullyEvaporate(Solution solution) { return solution.GetTotalPrototypeQuantity(EvaporationReagents) == solution.Volume; } }