using SS14.Shared.GameObjects;
using SS14.Shared.Interfaces.GameObjects;
using SS14.Shared.IoC;
using SS14.Shared.Log;
using SS14.Shared.Utility;
using System;
using YamlDotNet.RepresentationModel;
namespace Content.Server.GameObjects.Components.Power
{
///
/// Component that creates power and supplies it to the powernet
///
public class PowerGeneratorComponent : Component
{
public override string Name => "PowerGenerator";
///
/// Power supply from this entity
///
private float _supply = 1000; //arbitrary initial magic number to start
public float Supply
{
get => _supply;
set { UpdateSupply(value); }
}
public override void LoadParameters(YamlMappingNode mapping)
{
if (mapping.TryGetNode("Supply", out YamlNode node))
{
Supply = node.AsFloat();
}
}
public override void OnAdd(IEntity owner)
{
base.OnAdd(owner);
if (!owner.TryGetComponent(out PowerNodeComponent node))
{
var factory = IoCManager.Resolve();
node = factory.GetComponent();
owner.AddComponent(node);
}
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);
}
}
}