using Content.Server.Weather; using Content.Shared.Chemistry.Components; using Content.Shared.Chemistry.Reagent; using Content.Shared.FixedPoint; using Content.Shared.Fluids.Components; using Content.Shared.Maps; using Robust.Shared.Map; using Robust.Shared.Map.Components; namespace Content.Server.Fluids.EntitySystems; public sealed partial class PuddleSystem { [Dependency] private readonly WeatherSystem _weather = default!; //CP14 private static readonly TimeSpan EvaporationCooldown = TimeSpan.FromSeconds(1); private void OnEvaporationMapInit(Entity entity, ref MapInitEvent args) { entity.Comp.NextTick = _timing.CurTime + EvaporationCooldown; //CP14 Force evaporation under sky var xform = Transform(entity); if (TryComp(xform.GridUid, out var mapGrid)) { var tileRef = _map.GetTileRef(xform.GridUid.Value, mapGrid, xform.Coordinates); entity.Comp.CP14ForceEvaporation = _weather.CanWeatherAffect(xform.GridUid.Value, mapGrid, tileRef); } //CP14 End force evaporation under sky } private void UpdateEvaporation(EntityUid uid, Solution solution) { if (HasComp(uid)) { return; } if (solution.GetTotalPrototypeQuantity(GetEvaporatingReagents(solution)) > 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.ResolveSolution(uid, puddle.SolutionName, ref puddle.Solution, out var puddleSolution)) continue; // Yes, this means that 50u water + 50u holy water evaporates twice as fast as 100u water. foreach ((string evaporatingReagent, FixedPoint2 evaporatingSpeed) in GetEvaporationSpeeds(puddleSolution)) { var reagentTick = evaporation.EvaporationAmount * EvaporationCooldown.TotalSeconds * evaporatingSpeed; puddleSolution.SplitSolutionWithOnly(reagentTick, evaporatingReagent); } //CP14 force evaporation under sky if (evaporation.CP14ForceEvaporation) { var reagentTick = evaporation.EvaporationAmount * EvaporationCooldown.TotalSeconds; puddleSolution.SplitSolution(reagentTick); } //CP14 force evaporation under sky end // Despawn if we're done if (puddleSolution.Volume == FixedPoint2.Zero) { // Spawn a *sparkle* Spawn("PuddleSparkle", xformQuery.GetComponent(uid).Coordinates); QueueDel(uid); } _solutionContainerSystem.UpdateChemicals(puddle.Solution.Value); } } }