using System; using System.Diagnostics; using Content.Server.GameObjects.Components.NodeContainer.NodeGroups; using Robust.Shared.GameObjects; using Robust.Shared.Serialization; using Robust.Shared.ViewVariables; namespace Content.Server.GameObjects.Components.Power.PowerNetComponents { [RegisterComponent] public class PowerConsumerComponent : BasePowerNetComponent { public override string Name => "PowerConsumer"; /// /// How much power this needs to be fully powered. /// [ViewVariables(VVAccess.ReadWrite)] public int DrawRate { get => _drawRate; set => SetDrawRate(value); } private int _drawRate; /// /// Determines which s receive power when there is not enough /// power for each. /// [ViewVariables(VVAccess.ReadWrite)] public Priority Priority { get => _priority; set => SetPriority(value); } private Priority _priority; /// /// How much power this is currently receiving from s. /// [ViewVariables] public int ReceivedPower { get => _receivedPower; set => SetReceivedPower(value); } private int _receivedPower; public event EventHandler OnReceivedPowerChanged; public override void ExposeData(ObjectSerializer serializer) { base.ExposeData(serializer); serializer.DataField(ref _drawRate, "drawRate", 0); serializer.DataField(ref _priority, "priority", Priority.First); } protected override void AddSelfToNet(IPowerNet powerNet) { powerNet.AddConsumer(this); } protected override void RemoveSelfFromNet(IPowerNet powerNet) { powerNet.RemoveConsumer(this); } private void SetDrawRate(int newDrawRate) { var oldDrawRate = DrawRate; _drawRate = newDrawRate; //must be set before updating powernet, as it checks the DrawRate of every consumer Net.UpdateConsumerDraw(this, oldDrawRate, newDrawRate); } private void SetReceivedPower(int newReceivedPower) { Debug.Assert(newReceivedPower >= 0 && newReceivedPower <= DrawRate); if(_receivedPower == newReceivedPower) return; _receivedPower = newReceivedPower; OnReceivedPowerChanged?.Invoke(this, new ReceivedPowerChangedEventArgs(_drawRate, _receivedPower)); } private void SetPriority(Priority newPriority) { Net.UpdateConsumerPriority(this, Priority, newPriority); _priority = newPriority; } } public enum Priority { First, Last, } public class ReceivedPowerChangedEventArgs : EventArgs { public readonly int DrawRate; public readonly int ReceivedPower; public ReceivedPowerChangedEventArgs(int drawRate, int receivedPower) { DrawRate = drawRate; ReceivedPower = receivedPower; } } }