2021-01-24 02:42:33 -06:00
#nullable enable
2021-03-05 01:08:38 +01:00
using System.Linq ;
2021-01-24 02:42:33 -06:00
using Content.Server.GameObjects.Components.NodeContainer ;
using Content.Server.GameObjects.Components.NodeContainer.Nodes ;
using Content.Shared.Atmos ;
using Robust.Shared.GameObjects ;
using Robust.Shared.Log ;
2021-03-05 01:08:38 +01:00
using Robust.Shared.Serialization.Manager.Attributes ;
2021-01-24 02:42:33 -06:00
using Robust.Shared.ViewVariables ;
namespace Content.Server.GameObjects.Components.Atmos.Piping
{
/// <summary>
/// Generates gas in the attached pipe.
/// </summary>
[RegisterComponent]
public class GasGeneratorComponent : Component
{
public override string Name = > "GasGenerator" ;
/// <summary>
/// If the generator is producing gas.
/// </summary>
2021-03-05 01:08:38 +01:00
[DataField("generatorEnabled")]
2021-01-24 02:42:33 -06:00
[ViewVariables(VVAccess.ReadWrite)]
2021-03-05 01:08:38 +01:00
public bool GeneratorEnabled { get ; set ; } = true ;
2021-01-24 02:42:33 -06:00
/// <summary>
/// What gas is being generated.
/// </summary>
2021-03-05 01:08:38 +01:00
[DataField("generatedGas")]
2021-01-24 02:42:33 -06:00
[ViewVariables(VVAccess.ReadWrite)]
2021-03-05 01:08:38 +01:00
public Gas GeneratedGas { get ; set ; } = Gas . Oxygen ;
2021-01-24 02:42:33 -06:00
/// <summary>
/// Molar rate of gas generation.
/// </summary>
2021-03-05 01:08:38 +01:00
[DataField("gasGenerationRate")]
2021-01-24 02:42:33 -06:00
[ViewVariables(VVAccess.ReadWrite)]
2021-03-05 01:08:38 +01:00
public float GasGenerationRate { get ; set ; } = 10 ;
2021-01-24 02:42:33 -06:00
/// <summary>
/// The pipe pressure above which the generator stops producing gas.
/// </summary>
2021-03-05 01:08:38 +01:00
[DataField("generatorPressureCap")]
2021-01-24 02:42:33 -06:00
[ViewVariables(VVAccess.ReadWrite)]
2021-03-05 01:08:38 +01:00
public float GeneratorPressureCap { get ; set ; } = 10 ;
2021-01-24 02:42:33 -06:00
/// <summary>
/// The pipe to which generated gas is added.
/// </summary>
[ViewVariables]
private PipeNode ? Pipe { get ; set ; }
public override void Initialize ( )
{
base . Initialize ( ) ;
Owner . EnsureComponentWarn < PipeNetDeviceComponent > ( ) ;
SetPipes ( ) ;
}
public override void HandleMessage ( ComponentMessage message , IComponent ? component )
{
base . HandleMessage ( message , component ) ;
switch ( message )
{
case PipeNetUpdateMessage :
Update ( ) ;
break ;
}
}
private void Update ( )
{
if ( ! GeneratorEnabled )
return ;
if ( Pipe = = null | | Pipe . Air . Pressure > GeneratorPressureCap )
return ;
Pipe . Air . AdjustMoles ( GeneratedGas , GasGenerationRate ) ;
}
private void SetPipes ( )
{
if ( ! Owner . TryGetComponent < NodeContainerComponent > ( out var container ) )
{
2021-03-31 12:41:23 -07:00
Logger . Warning ( $"{nameof(GasGeneratorComponent)} on {Owner?.Prototype?.ID}, Uid {Owner?.Uid} did not have a {nameof(NodeContainerComponent)}." ) ;
2021-01-24 02:42:33 -06:00
return ;
}
Pipe = container . Nodes . OfType < PipeNode > ( ) . FirstOrDefault ( ) ;
if ( Pipe = = null )
{
2021-03-31 12:41:23 -07:00
Logger . Warning ( $"{nameof(GasGeneratorComponent)} on {Owner?.Prototype?.ID}, Uid {Owner?.Uid} could not find compatible {nameof(PipeNode)}s on its {nameof(NodeContainerComponent)}." ) ;
2021-01-24 02:42:33 -06:00
return ;
}
}
}
}