2021-10-29 13:40:15 +01:00
using Content.Server.Chemistry.EntitySystems ;
using Content.Server.Fluids.Components ;
2021-11-03 16:48:03 -07:00
using Content.Shared.FixedPoint ;
2021-10-27 09:24:18 +01:00
using JetBrains.Annotations ;
using Robust.Shared.GameObjects ;
using Robust.Shared.IoC ;
using Robust.Shared.Utility ;
namespace Content.Server.Fluids.EntitySystems
{
[UsedImplicitly]
public sealed class EvaporationSystem : EntitySystem
{
[Dependency] private readonly SolutionContainerSystem _solutionContainerSystem = default ! ;
public override void Update ( float frameTime )
{
base . Update ( frameTime ) ;
var queueDelete = new RemQueue < EvaporationComponent > ( ) ;
foreach ( var evaporationComponent in EntityManager . EntityQuery < EvaporationComponent > ( ) )
{
2021-12-05 18:09:01 +01:00
var uid = evaporationComponent . Owner ;
2021-10-27 09:24:18 +01:00
evaporationComponent . Accumulator + = frameTime ;
if ( ! _solutionContainerSystem . TryGetSolution ( uid , evaporationComponent . SolutionName , out var solution ) )
{
// If no solution, delete the entity
2022-02-10 15:07:21 -06:00
EntityManager . QueueDeleteEntity ( uid ) ;
2021-10-27 09:24:18 +01:00
continue ;
}
if ( evaporationComponent . Accumulator < evaporationComponent . EvaporateTime )
continue ;
evaporationComponent . Accumulator - = evaporationComponent . EvaporateTime ;
2022-02-10 15:07:21 -06:00
if ( evaporationComponent . EvaporationToggle = = true )
{
_solutionContainerSystem . SplitSolution ( uid , solution ,
FixedPoint2 . Min ( FixedPoint2 . New ( 1 ) , solution . CurrentVolume ) ) ; // removes 1 unit, or solution current volume, whichever is lower.
}
2021-10-27 09:24:18 +01:00
2022-02-10 15:07:21 -06:00
if ( solution . CurrentVolume < = 0 )
2021-10-27 09:24:18 +01:00
{
EntityManager . QueueDeleteEntity ( uid ) ;
}
2022-02-10 15:07:21 -06:00
else if ( solution . CurrentVolume < = evaporationComponent . LowerLimit // if puddle is too big or too small to evaporate.
2021-10-27 09:24:18 +01:00
| | solution . CurrentVolume > = evaporationComponent . UpperLimit )
{
2022-02-10 15:07:21 -06:00
evaporationComponent . EvaporationToggle = false ; // pause evaporation
2021-10-27 09:24:18 +01:00
}
2022-02-10 15:07:21 -06:00
else evaporationComponent . EvaporationToggle = true ; // unpause evaporation, e.g. if a puddle previously above evaporation UpperLimit was brought down below evaporation UpperLimit via mopping.
2021-10-27 09:24:18 +01:00
}
foreach ( var evaporationComponent in queueDelete )
{
2021-12-03 15:53:09 +01:00
EntityManager . RemoveComponent ( evaporationComponent . Owner , evaporationComponent ) ;
2021-10-27 09:24:18 +01:00
}
}
}
}