From 4905e097c8947e2384b0243d920567e08f0e6c3c Mon Sep 17 00:00:00 2001 From: Perry Fraser Date: Fri, 4 Jul 2025 17:50:44 -0400 Subject: [PATCH] feat: allow mopping evaporating puddles (#38743) --- .../Fluids/EntitySystems/AbsorbentSystem.cs | 20 ++++++++++++------- .../EntitySystems/PuddleSystem.Evaporation.cs | 1 + .../fluids/components/absorbent-component.ftl | 4 ++-- 3 files changed, 16 insertions(+), 9 deletions(-) diff --git a/Content.Server/Fluids/EntitySystems/AbsorbentSystem.cs b/Content.Server/Fluids/EntitySystems/AbsorbentSystem.cs index 1177c24304..28c36602e1 100644 --- a/Content.Server/Fluids/EntitySystems/AbsorbentSystem.cs +++ b/Content.Server/Fluids/EntitySystems/AbsorbentSystem.cs @@ -277,17 +277,22 @@ public sealed class AbsorbentSystem : SharedAbsorbentSystem if (!_solutionContainerSystem.ResolveSolution(target, puddle.SolutionName, ref puddle.Solution, out var puddleSolution) || puddleSolution.Volume <= 0) return false; - // Check if the puddle has any non-evaporative reagents - if (_puddleSystem.CanFullyEvaporate(puddleSolution)) - { - _popups.PopupEntity(Loc.GetString("mopping-system-puddle-evaporate", ("target", target)), user, user); - return true; - } - Solution puddleSplit; var isRemoved = false; if (absorber.UseAbsorberSolution) { + // No reason to mop something that 1) can evaporate, 2) is an absorber, and 3) is being mopped with + // something that uses absorbers. + var puddleAbsorberVolume = + puddleSolution.GetTotalPrototypeQuantity(_puddleSystem.GetAbsorbentReagents(puddleSolution)); + if (puddleAbsorberVolume == puddleSolution.Volume) + { + _popups.PopupEntity(Loc.GetString("mopping-system-puddle-already-mopped", ("target", target)), + user, + user); + return true; + } + // Check if we have any evaporative reagents on our absorber to transfer var absorberSolution = absorberSoln.Comp.Solution; var available = absorberSolution.GetTotalPrototypeQuantity(_puddleSystem.GetAbsorbentReagents(absorberSolution)); @@ -317,6 +322,7 @@ public sealed class AbsorbentSystem : SharedAbsorbentSystem } else { + // Note: arguably shouldn't this get all solutions? puddleSplit = puddleSolution.SplitSolutionWithout(absorber.PickupAmount, _puddleSystem.GetAbsorbentReagents(puddleSolution)); // Despawn if we're done if (puddleSolution.Volume == FixedPoint2.Zero) diff --git a/Content.Server/Fluids/EntitySystems/PuddleSystem.Evaporation.cs b/Content.Server/Fluids/EntitySystems/PuddleSystem.Evaporation.cs index f92504e74c..245ab8308f 100644 --- a/Content.Server/Fluids/EntitySystems/PuddleSystem.Evaporation.cs +++ b/Content.Server/Fluids/EntitySystems/PuddleSystem.Evaporation.cs @@ -46,6 +46,7 @@ public sealed partial class PuddleSystem 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; diff --git a/Resources/Locale/en-US/fluids/components/absorbent-component.ftl b/Resources/Locale/en-US/fluids/components/absorbent-component.ftl index 51e500a6fe..d6cb60e25e 100644 --- a/Resources/Locale/en-US/fluids/components/absorbent-component.ftl +++ b/Resources/Locale/en-US/fluids/components/absorbent-component.ftl @@ -1,7 +1,7 @@ mopping-system-target-container-empty = { CAPITALIZE(THE($target)) } is empty! mopping-system-target-container-empty-water = { CAPITALIZE(THE($target)) } has no water! -mopping-system-puddle-space = { CAPITALIZE(THE($used)) } is full of water -mopping-system-puddle-evaporate = { CAPITALIZE(THE($target)) } is evaporating +mopping-system-puddle-space = { CAPITALIZE(THE($used)) } is full of water. +mopping-system-puddle-already-mopped = { CAPITALIZE(THE($target)) } is already mopped. mopping-system-no-water = { CAPITALIZE(THE($used)) } has no water! mopping-system-no-hands = You have no hands!