using Robust.Shared.GameObjects;
using Robust.Shared.Serialization;
using Robust.Shared.ViewVariables;
namespace Content.Server.GameObjects.Components.Power
{
///
/// Component that creates power and supplies it to the powernet
///
[RegisterComponent]
public class PowerGeneratorComponent : Component
{
public override string Name => "PowerGenerator";
///
/// Power supply from this entity
///
private float _supply = 1000; //arbitrary initial magic number to start
[ViewVariables(VVAccess.ReadWrite)]
public float Supply
{
get => _supply;
set { UpdateSupply(value); }
}
public override void ExposeData(ObjectSerializer serializer)
{
base.ExposeData(serializer);
serializer.DataField(ref _supply, "supply", 1000);
}
public override void OnAdd()
{
base.OnAdd();
if (!Owner.TryGetComponent(out PowerNodeComponent node))
{
Owner.AddComponent();
node = Owner.GetComponent();
}
node.OnPowernetConnect += PowernetConnect;
node.OnPowernetDisconnect += PowernetDisconnect;
node.OnPowernetRegenerate += PowernetRegenerate;
}
public override void OnRemove()
{
if (Owner.TryGetComponent(out PowerNodeComponent node))
{
if (node.Parent != null)
{
node.Parent.RemoveGenerator(this);
}
node.OnPowernetConnect -= PowernetConnect;
node.OnPowernetDisconnect -= PowernetDisconnect;
node.OnPowernetRegenerate -= PowernetRegenerate;
}
base.OnRemove();
}
private void UpdateSupply(float value)
{
_supply = value;
var node = Owner.GetComponent();
node?.Parent?.UpdateGenerator(this);
}
///
/// Node has become anchored to a powernet
///
///
///
private void PowernetConnect(object sender, PowernetEventArgs eventarg)
{
eventarg.Powernet.AddGenerator(this);
}
///
/// Node has had its powernet regenerated
///
///
///
private void PowernetRegenerate(object sender, PowernetEventArgs eventarg)
{
eventarg.Powernet.AddGenerator(this);
}
///
/// Node has become unanchored from a powernet
///
///
///
private void PowernetDisconnect(object sender, PowernetEventArgs eventarg)
{
eventarg.Powernet.RemoveGenerator(this);
}
}
}