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. /// In Joules. /// public float Capacity { get; private set; } = 10000; //arbitrary value replace /// /// Energy the battery is currently storing. /// In Joules. /// public float Charge { get; private set; } = 0; /// /// Rate at which energy will be taken to charge internal battery. /// In Watts. /// public float ChargeRate { get; private set; } = 1000; /// /// Rate at which energy will be distributed to the powernet if needed. /// In Watts. /// 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.Max(0, Charge - todeduct); } public void AddCharge(float charge) { Charge = Math.Min(Capacity, Charge + charge); } /// /// Returns the charge available from the energy storage /// public float RequestCharge(float frameTime) { return Math.Min(ChargeRate * frameTime, Capacity - Charge); } /// /// Returns the charge available from the energy storage /// public float AvailableCharge(float frameTime) { return Math.Min(DistributionRate * frameTime, Charge); } public void ChargePowerTick(float frameTime) { AddCharge(RequestCharge(frameTime)); } /// /// 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); } } }