using SS14.Shared.GameObjects; using SS14.Shared.Interfaces.GameObjects; using SS14.Shared.IoC; using SS14.Shared.Utility; using System; using YamlDotNet.RepresentationModel; namespace Content.Server.GameObjects.Components.Power { /// /// Feeds energy from the powernet and may have the ability to supply back into it /// public class PowerStorageComponent : Component { public override string Name => "PowerStorage"; /// /// Maximum amount of energy the internal battery can store /// public float Capacity { get; private set; } = 10000; //arbitrary value replace /// /// Energy the battery is currently storing /// public float Charge { get; private set; } = 0; /// /// Rate at which energy will be taken to charge internal battery /// public float ChargeRate { get; private set; } = 1000; /// /// Rate at which energy will be distributed to the powernet if needed /// public float DistributionRate { get; private set; } = 1000; private bool _chargepowernet = false; /// /// Do we distribute power into the powernet from our stores if the powernet requires it? /// public bool ChargePowernet { get => _chargepowernet; set { _chargepowernet = value; if (Owner.TryGetComponent(out PowerNodeComponent node)) { if (node.Parent != null) node.Parent.UpdateStorageType(this); } } } public override void LoadParameters(YamlMappingNode mapping) { if (mapping.TryGetNode("Capacity", out YamlNode node)) { Capacity = node.AsFloat(); } if (mapping.TryGetNode("Charge", out node)) { Charge = node.AsFloat(); } if (mapping.TryGetNode("ChargeRate", out node)) { ChargeRate = node.AsFloat(); } if (mapping.TryGetNode("DistributionRate", out node)) { DistributionRate = node.AsFloat(); } if (mapping.TryGetNode("ChargePowernet", out node)) { _chargepowernet = node.AsBool(); } } 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.RemovePowerStorage(this); } node.OnPowernetConnect -= PowernetConnect; node.OnPowernetDisconnect -= PowernetDisconnect; node.OnPowernetRegenerate -= PowernetRegenerate; } base.OnRemove(); } /// /// Checks if the storage can supply the amount of charge directly requested /// public bool CanDeductCharge(float todeduct) { if (Charge > todeduct) return true; return false; } /// /// Deducts the requested charge from the energy storage /// public void DeductCharge(float todeduct) { Charge = Math.Min(0, Charge - todeduct); } /// /// Returns all possible charge available from the energy storage /// public float RequestAllCharge() { return Math.Min(ChargeRate, Capacity - Charge); } /// /// Returns the charge available from the energy storage /// public float RequestCharge() { return Math.Min(ChargeRate, Capacity - Charge); } /// /// Returns the charge available from the energy storage /// public float AvailableCharge() { return Math.Min(DistributionRate, Charge); } /// /// Gives the storage one full tick of charging its energy storage /// public void ChargePowerTick() { Charge = Math.Min(Charge + ChargeRate, Capacity); } /// /// Takes from the storage one full tick of energy /// public void RetrievePassiveStorage() { Charge = Math.Min(Charge - DistributionRate, 0); } /// /// Node has become anchored to a powernet /// /// /// private void PowernetConnect(object sender, PowernetEventArgs eventarg) { eventarg.Powernet.AddPowerStorage(this); } /// /// Node has had its powernet regenerated /// /// /// private void PowernetRegenerate(object sender, PowernetEventArgs eventarg) { eventarg.Powernet.AddPowerStorage(this); } /// /// Node has become unanchored from a powernet /// /// /// private void PowernetDisconnect(object sender, PowernetEventArgs eventarg) { eventarg.Powernet.RemovePowerStorage(this); } } }