using Content.Server.Atmos;
using Content.Server.GameObjects.Components.Chemistry;
using Content.Server.GameObjects.Components.Metabolism;
using Content.Server.Interfaces;
using Content.Shared.Chemistry;
using Robust.Shared.GameObjects;
using Robust.Shared.Serialization;
using Robust.Shared.ViewVariables;
namespace Content.Server.GameObjects.Components.Body.Circulatory
{
[RegisterComponent]
public class BloodstreamComponent : Component, IGasMixtureHolder
{
public override string Name => "Bloodstream";
///
/// Max volume of internal solution storage
///
[ViewVariables] private ReagentUnit _initialMaxVolume;
///
/// Internal solution for reagent storage
///
[ViewVariables] private SolutionComponent _internalSolution;
///
/// Empty volume of internal solution
///
[ViewVariables] public ReagentUnit EmptyVolume => _internalSolution.EmptyVolume;
[ViewVariables] public GasMixture Air { get; set; } = new GasMixture(6);
[ViewVariables] public SolutionComponent Solution => _internalSolution;
public override void Initialize()
{
base.Initialize();
_internalSolution = Owner.EnsureComponent();
_internalSolution.MaxVolume = _initialMaxVolume;
}
public override void ExposeData(ObjectSerializer serializer)
{
base.ExposeData(serializer);
serializer.DataField(ref _initialMaxVolume, "maxVolume", ReagentUnit.New(250));
}
///
/// Attempt to transfer provided solution to internal solution.
/// Only supports complete transfers
///
/// Solution to be transferred
/// Whether or not transfer was a success
public bool TryTransferSolution(Solution solution)
{
// For now doesn't support partial transfers
if (solution.TotalVolume + _internalSolution.CurrentVolume > _internalSolution.MaxVolume)
{
return false;
}
_internalSolution.TryAddSolution(solution, false, true);
return true;
}
public void PumpToxins(GasMixture into, float pressure)
{
if (!Owner.TryGetComponent(out MetabolismComponent metabolism))
{
Air.PumpGasTo(into, pressure);
return;
}
var toxins = metabolism.Clean(this);
toxins.PumpGasTo(into, pressure);
Air.Merge(toxins);
}
}
}