2021-01-07 00:37:17 -06:00
#nullable enable
using Content.Server.GameObjects.Components.NodeContainer ;
2020-10-10 05:37:52 -06:00
using Content.Server.GameObjects.Components.NodeContainer.Nodes ;
using Robust.Shared.GameObjects ;
using Robust.Shared.Log ;
using Robust.Shared.ViewVariables ;
using System.Linq ;
namespace Content.Server.GameObjects.Components.Atmos.Piping
{
[RegisterComponent]
2021-01-07 00:37:17 -06:00
public class GasCanisterPortComponent : Component
2020-10-10 05:37:52 -06:00
{
public override string Name = > "GasCanisterPort" ;
[ViewVariables]
2021-01-07 00:37:17 -06:00
public GasCanisterComponent ? ConnectedCanister { get ; private set ; }
2020-10-10 05:37:52 -06:00
[ViewVariables]
public bool ConnectedToCanister = > ConnectedCanister ! = null ;
[ViewVariables]
2021-01-07 00:37:17 -06:00
private PipeNode ? _gasPort ;
2020-10-10 05:37:52 -06:00
public override void Initialize ( )
{
base . Initialize ( ) ;
2021-01-07 00:37:17 -06:00
Owner . EnsureComponentWarn < PipeNetDeviceComponent > ( ) ;
SetGasPort ( ) ;
2020-10-10 05:37:52 -06:00
if ( Owner . TryGetComponent < SnapGridComponent > ( out var snapGrid ) )
{
2021-01-07 00:37:17 -06:00
var entities = snapGrid . GetLocal ( ) ;
foreach ( var entity in entities )
2020-10-10 05:37:52 -06:00
{
2021-01-07 00:37:17 -06:00
if ( entity . TryGetComponent < GasCanisterComponent > ( out var canister ) & & canister . Anchored & & ! canister . ConnectedToPort )
{
canister . TryConnectToPort ( ) ;
break ;
}
2020-10-10 05:37:52 -06:00
}
}
}
public override void OnRemove ( )
{
base . OnRemove ( ) ;
ConnectedCanister ? . DisconnectFromPort ( ) ;
}
2021-01-07 00:37:17 -06:00
public override void HandleMessage ( ComponentMessage message , IComponent ? component )
{
base . HandleMessage ( message , component ) ;
switch ( message )
{
case PipeNetUpdateMessage :
Update ( ) ;
break ;
}
}
public void Update ( )
2020-10-10 05:37:52 -06:00
{
2021-01-07 00:37:17 -06:00
if ( _gasPort = = null | | ConnectedCanister = = null )
return ;
ConnectedCanister . Air . Share ( _gasPort . Air , 1 ) ;
ConnectedCanister . AirWasUpdated ( ) ;
2020-10-10 05:37:52 -06:00
}
public void ConnectGasCanister ( GasCanisterComponent gasCanister )
{
ConnectedCanister = gasCanister ;
}
public void DisconnectGasCanister ( )
{
ConnectedCanister = null ;
}
2021-01-07 00:37:17 -06:00
private void SetGasPort ( )
{
if ( ! Owner . TryGetComponent < NodeContainerComponent > ( out var container ) )
{
2021-01-24 02:42:33 -06:00
Logger . Error ( $"{nameof(GasCanisterPortComponent)} on {Owner?.Prototype?.ID}, Uid {Owner?.Uid} did not have a {nameof(NodeContainerComponent)}." ) ;
2021-01-07 00:37:17 -06:00
return ;
}
_gasPort = container . Nodes . OfType < PipeNode > ( ) . FirstOrDefault ( ) ;
if ( _gasPort = = null )
{
2021-01-24 02:42:33 -06:00
Logger . Error ( $"{nameof(GasCanisterPortComponent)} on {Owner?.Prototype?.ID}, Uid {Owner?.Uid} could not find compatible {nameof(PipeNode)}s on its {nameof(NodeContainerComponent)}." ) ;
2021-01-07 00:37:17 -06:00
return ;
}
}
2020-10-10 05:37:52 -06:00
}
}