diff --git a/Content.Server/Audio/AmbientSoundSystem.cs b/Content.Server/Audio/AmbientSoundSystem.cs index 5b55ce9fb6..8c5d157d34 100644 --- a/Content.Server/Audio/AmbientSoundSystem.cs +++ b/Content.Server/Audio/AmbientSoundSystem.cs @@ -1,4 +1,5 @@ using Content.Server.Power.Components; +using Content.Server.Power.EntitySystems; using Content.Shared.Audio; using Robust.Shared.GameObjects; @@ -10,6 +11,15 @@ namespace Content.Server.Audio { base.Initialize(); SubscribeLocalEvent(HandlePowerChange); + SubscribeLocalEvent(HandlePowerSupply); + } + + private void HandlePowerSupply(EntityUid uid, AmbientOnPoweredComponent component, PowerNetBatterySupplyEvent args) + { + if (!ComponentManager.TryGetComponent(uid, out var ambientSound)) return; + if (ambientSound.Enabled == args.Supply) return; + ambientSound.Enabled = args.Supply; + ambientSound.Dirty(); } private void HandlePowerChange(EntityUid uid, AmbientOnPoweredComponent component, PowerChangedEvent args) diff --git a/Content.Server/Power/EntitySystems/PowerNetSystem.cs b/Content.Server/Power/EntitySystems/PowerNetSystem.cs index d88d89bbb6..a9c883830d 100644 --- a/Content.Server/Power/EntitySystems/PowerNetSystem.cs +++ b/Content.Server/Power/EntitySystems/PowerNetSystem.cs @@ -19,6 +19,8 @@ namespace Content.Server.Power.EntitySystems private readonly HashSet _powerNetReconnectQueue = new(); private readonly HashSet _apcNetReconnectQueue = new(); + private readonly Dictionary _lastSupply = new(); + private readonly BatteryRampPegSolver _solver = new(); public override void Initialize() @@ -150,6 +152,14 @@ namespace Content.Server.Power.EntitySystems { base.Update(frameTime); + // Setup for events. + { + foreach (var powerNetBattery in ComponentManager.EntityQuery()) + { + _lastSupply[powerNetBattery] = powerNetBattery.CurrentSupply; + } + } + // Reconnect networks. { foreach (var apcNet in _apcNetReconnectQueue) @@ -207,6 +217,27 @@ namespace Content.Server.Power.EntitySystems RaiseLocalEvent(consumer.Owner.Uid, msg); } } + + foreach (var powerNetBattery in ComponentManager.EntityQuery()) + { + if (!_lastSupply.TryGetValue(powerNetBattery, out var lastPowerSupply)) + { + lastPowerSupply = 0f; + } + + var currentSupply = powerNetBattery.CurrentSupply; + + if (lastPowerSupply == 0f && currentSupply != 0f) + { + RaiseLocalEvent(powerNetBattery.Owner.Uid, new PowerNetBatterySupplyEvent {Supply = true}); + } + else if (lastPowerSupply > 0f && currentSupply == 0f) + { + RaiseLocalEvent(powerNetBattery.Owner.Uid, new PowerNetBatterySupplyEvent {Supply = false}); + } + } + + _lastSupply.Clear(); } } @@ -324,6 +355,14 @@ namespace Content.Server.Power.EntitySystems } } + /// + /// Raised whenever a changes from / to 0 CurrentSupply. + /// + public sealed class PowerNetBatterySupplyEvent : EntityEventArgs + { + public bool Supply { get; init; } + } + public struct PowerStatistics { public int CountNetworks; diff --git a/Resources/Prototypes/Entities/Structures/Power/parts.yml b/Resources/Prototypes/Entities/Structures/Power/parts.yml index 5f093eb5a9..4fa3813bcb 100644 --- a/Resources/Prototypes/Entities/Structures/Power/parts.yml +++ b/Resources/Prototypes/Entities/Structures/Power/parts.yml @@ -46,6 +46,7 @@ placement: mode: SnapgridCenter components: + - type: AmbientOnPowered - type: AmbientSound volume: -15 range: 2