using Content.Server.Cargo.Systems; using Content.Server.Power.Components; using Content.Shared.Examine; using JetBrains.Annotations; namespace Content.Server.Power.EntitySystems { [UsedImplicitly] public sealed class BatterySystem : EntitySystem { public override void Initialize() { base.Initialize(); SubscribeLocalEvent(OnExamine); SubscribeLocalEvent(CalculateBatteryPrice); SubscribeLocalEvent(PreSync); SubscribeLocalEvent(PostSync); } private void OnExamine(EntityUid uid, ExaminableBatteryComponent component, ExaminedEvent args) { if (!TryComp(uid, out var batteryComponent)) return; if (args.IsInDetailsRange) { var effectiveMax = batteryComponent.MaxCharge; if (effectiveMax == 0) effectiveMax = 1; var chargeFraction = batteryComponent.CurrentCharge / effectiveMax; var chargePercentRounded = (int) (chargeFraction * 100); args.PushMarkup( Loc.GetString( "examinable-battery-component-examine-detail", ("percent", chargePercentRounded), ("markupPercentColor", "green") ) ); } } private void PreSync(NetworkBatteryPreSync ev) { foreach (var (netBat, bat) in EntityManager.EntityQuery()) { netBat.NetworkBattery.Capacity = bat.MaxCharge; netBat.NetworkBattery.CurrentStorage = bat.CurrentCharge; } } private void PostSync(NetworkBatteryPostSync ev) { foreach (var (netBat, bat) in EntityManager.EntityQuery()) { bat.CurrentCharge = netBat.NetworkBattery.CurrentStorage; } } public override void Update(float frameTime) { foreach (var (comp, batt) in EntityManager.EntityQuery()) { if (!comp.AutoRecharge) continue; if (batt.IsFullyCharged) continue; batt.CurrentCharge += comp.AutoRechargeRate * frameTime; } } /// /// Gets the price for the power contained in an entity's battery. /// private void CalculateBatteryPrice(EntityUid uid, BatteryComponent component, ref PriceCalculationEvent args) { args.Price += component.CurrentCharge * component.PricePerJoule; } } }