using Robust.Shared.GameObjects; using Robust.Shared.Interfaces.GameObjects; using Robust.Shared.IoC; using Robust.Shared.Log; using Robust.Shared.Serialization; using Robust.Shared.Utility; using System; using Robust.Shared.ViewVariables; 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 [ViewVariables] 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); } } }