Raise power events by ref and not broadcast (#11923)

Also some other minor stuff.
This commit is contained in:
metalgearsloth
2022-10-15 15:08:15 +11:00
committed by GitHub
parent 920fde469d
commit 0b38589728
40 changed files with 89 additions and 80 deletions

View File

@@ -47,7 +47,7 @@ namespace Content.Server.AME
} }
} }
private static void OnAMEPowerChange(EntityUid uid, AMEControllerComponent component, PowerChangedEvent args) private static void OnAMEPowerChange(EntityUid uid, AMEControllerComponent component, ref PowerChangedEvent args)
{ {
component.UpdateUserInterface(); component.UpdateUserInterface();
} }

View File

@@ -34,7 +34,7 @@ namespace Content.Server.Advertise
RefreshTimer(uid, true, advertise); RefreshTimer(uid, true, advertise);
} }
private void OnPowerChanged(EntityUid uid, AdvertiseComponent advertise, PowerChangedEvent args) private void OnPowerChanged(EntityUid uid, AdvertiseComponent advertise, ref PowerChangedEvent args)
{ {
SetEnabled(uid, args.Powered, advertise); SetEnabled(uid, args.Powered, advertise);
} }

View File

@@ -10,7 +10,7 @@ public sealed partial class ArcadeSystem
SubscribeLocalEvent<BlockGameArcadeComponent, PowerChangedEvent>(OnBlockPowerChanged); SubscribeLocalEvent<BlockGameArcadeComponent, PowerChangedEvent>(OnBlockPowerChanged);
} }
private static void OnBlockPowerChanged(EntityUid uid, BlockGameArcadeComponent component, PowerChangedEvent args) private static void OnBlockPowerChanged(EntityUid uid, BlockGameArcadeComponent component, ref PowerChangedEvent args)
{ {
component.OnPowerStateChanged(args); component.OnPowerStateChanged(args);
} }

View File

@@ -10,7 +10,7 @@ public sealed partial class ArcadeSystem
SubscribeLocalEvent<SpaceVillainArcadeComponent, PowerChangedEvent>(OnSVillainPower); SubscribeLocalEvent<SpaceVillainArcadeComponent, PowerChangedEvent>(OnSVillainPower);
} }
private void OnSVillainPower(EntityUid uid, SpaceVillainArcadeComponent component, PowerChangedEvent args) private void OnSVillainPower(EntityUid uid, SpaceVillainArcadeComponent component, ref PowerChangedEvent args)
{ {
component.OnPowerStateChanged(args); component.OnPowerStateChanged(args);
} }

View File

@@ -195,7 +195,7 @@ public sealed class AirAlarmSystem : EntitySystem
UpdateUI(uid, component); UpdateUI(uid, component);
} }
private void OnPowerChanged(EntityUid uid, AirAlarmComponent component, PowerChangedEvent args) private void OnPowerChanged(EntityUid uid, AirAlarmComponent component, ref PowerChangedEvent args)
{ {
if (args.Powered) if (args.Powered)
{ {

View File

@@ -56,7 +56,7 @@ public sealed class AtmosAlarmableSystem : EntitySystem
false); false);
} }
private void OnPowerChange(EntityUid uid, AtmosAlarmableComponent component, PowerChangedEvent args) private void OnPowerChange(EntityUid uid, AtmosAlarmableComponent component, ref PowerChangedEvent args)
{ {
if (!args.Powered) if (!args.Powered)
{ {

View File

@@ -142,7 +142,7 @@ public sealed class AtmosMonitorSystem : EntitySystem
} }
} }
private void OnPowerChangedEvent(EntityUid uid, AtmosMonitorComponent component, PowerChangedEvent args) private void OnPowerChangedEvent(EntityUid uid, AtmosMonitorComponent component, ref PowerChangedEvent args)
{ {
if (TryComp<AtmosDeviceComponent>(uid, out var atmosDeviceComponent)) if (TryComp<AtmosDeviceComponent>(uid, out var atmosDeviceComponent))
{ {

View File

@@ -173,7 +173,7 @@ namespace Content.Server.Atmos.Piping.Unary.EntitySystems
UpdateState(uid, component); UpdateState(uid, component);
} }
private void OnPowerChanged(EntityUid uid, GasVentPumpComponent component, PowerChangedEvent args) private void OnPowerChanged(EntityUid uid, GasVentPumpComponent component, ref PowerChangedEvent args)
{ {
component.Enabled = args.Powered; component.Enabled = args.Powered;
UpdateState(uid, component); UpdateState(uid, component);

View File

@@ -138,7 +138,7 @@ namespace Content.Server.Atmos.Piping.Unary.EntitySystems
UpdateState(uid, component); UpdateState(uid, component);
} }
private void OnPowerChanged(EntityUid uid, GasVentScrubberComponent component, PowerChangedEvent args) private void OnPowerChanged(EntityUid uid, GasVentScrubberComponent component, ref PowerChangedEvent args)
{ {
component.Enabled = args.Powered; component.Enabled = args.Powered;
UpdateState(uid, component); UpdateState(uid, component);

View File

@@ -104,7 +104,7 @@ namespace Content.Server.Atmos.Portable
UpdateDrainingAppearance(uid, portableNode.ConnectionsEnabled); UpdateDrainingAppearance(uid, portableNode.ConnectionsEnabled);
} }
private void OnPowerChanged(EntityUid uid, PortableScrubberComponent component, PowerChangedEvent args) private void OnPowerChanged(EntityUid uid, PortableScrubberComponent component, ref PowerChangedEvent args)
{ {
UpdateAppearance(uid, component.Full, args.Powered); UpdateAppearance(uid, component.Full, args.Powered);
component.Enabled = args.Powered; component.Enabled = args.Powered;

View File

@@ -13,7 +13,7 @@ namespace Content.Server.Audio
SubscribeLocalEvent<AmbientOnPoweredComponent, PowerNetBatterySupplyEvent>(HandlePowerSupply); SubscribeLocalEvent<AmbientOnPoweredComponent, PowerNetBatterySupplyEvent>(HandlePowerSupply);
} }
private void HandlePowerSupply(EntityUid uid, AmbientOnPoweredComponent component, PowerNetBatterySupplyEvent args) private void HandlePowerSupply(EntityUid uid, AmbientOnPoweredComponent component, ref PowerNetBatterySupplyEvent args)
{ {
if (!EntityManager.TryGetComponent<AmbientSoundComponent>(uid, out var ambientSound)) return; if (!EntityManager.TryGetComponent<AmbientSoundComponent>(uid, out var ambientSound)) return;
if (ambientSound.Enabled == args.Supply) return; if (ambientSound.Enabled == args.Supply) return;
@@ -21,7 +21,7 @@ namespace Content.Server.Audio
Dirty(ambientSound); Dirty(ambientSound);
} }
private void HandlePowerChange(EntityUid uid, AmbientOnPoweredComponent component, PowerChangedEvent args) private void HandlePowerChange(EntityUid uid, AmbientOnPoweredComponent component, ref PowerChangedEvent args)
{ {
if (!EntityManager.TryGetComponent<AmbientSoundComponent>(uid, out var ambientSound)) return; if (!EntityManager.TryGetComponent<AmbientSoundComponent>(uid, out var ambientSound)) return;
if (ambientSound.Enabled == args.Powered) return; if (ambientSound.Enabled == args.Powered) return;

View File

@@ -106,7 +106,7 @@ namespace Content.Server.Bed
RaiseLocalEvent(args.BuckledEntity, metabolicEvent, false); RaiseLocalEvent(args.BuckledEntity, metabolicEvent, false);
} }
private void OnPowerChanged(EntityUid uid, StasisBedComponent component, PowerChangedEvent args) private void OnPowerChanged(EntityUid uid, StasisBedComponent component, ref PowerChangedEvent args)
{ {
UpdateAppearance(uid, args.Powered); UpdateAppearance(uid, args.Powered);
UpdateMetabolisms(uid, component, args.Powered); UpdateMetabolisms(uid, component, args.Powered);

View File

@@ -109,7 +109,7 @@ public sealed partial class CargoSystem
appearance?.SetData(CargoTelepadVisuals.State, CargoTelepadState.Unpowered); appearance?.SetData(CargoTelepadVisuals.State, CargoTelepadState.Unpowered);
} }
private void OnTelepadPowerChange(EntityUid uid, CargoTelepadComponent component, PowerChangedEvent args) private void OnTelepadPowerChange(EntityUid uid, CargoTelepadComponent component, ref PowerChangedEvent args)
{ {
SetEnabled(component); SetEnabled(component);
} }

View File

@@ -59,7 +59,7 @@ namespace Content.Server.Cloning.Systems
UpdateUserInterface(consoleComponent); UpdateUserInterface(consoleComponent);
} }
private void OnPowerChanged(EntityUid uid, CloningConsoleComponent component, PowerChangedEvent args) private void OnPowerChanged(EntityUid uid, CloningConsoleComponent component, ref PowerChangedEvent args)
{ {
UpdateUserInterface(component); UpdateUserInterface(component);
} }

View File

@@ -31,7 +31,7 @@ public sealed partial class ConstructionSystem
CreateComputerBoard(component); CreateComputerBoard(component);
} }
private void OnCompPowerChange(EntityUid uid, ComputerComponent component, PowerChangedEvent args) private void OnCompPowerChange(EntityUid uid, ComputerComponent component, ref PowerChangedEvent args)
{ {
if (TryComp<AppearanceComponent>(uid, out var appearance)) if (TryComp<AppearanceComponent>(uid, out var appearance))
{ {

View File

@@ -303,7 +303,7 @@ namespace Content.Server.Disease
/// <summary> /// <summary>
/// Makes sure the machine is visually off/on. /// Makes sure the machine is visually off/on.
/// </summary> /// </summary>
private void OnPowerChanged(EntityUid uid, DiseaseMachineComponent component, PowerChangedEvent args) private void OnPowerChanged(EntityUid uid, DiseaseMachineComponent component, ref PowerChangedEvent args)
{ {
UpdateAppearance(uid, args.Powered, false); UpdateAppearance(uid, args.Powered, false);
} }

View File

@@ -319,7 +319,7 @@ namespace Content.Server.Disposal.Unit.EntitySystems
RemComp<ActiveDisposalUnitComponent>(uid); RemComp<ActiveDisposalUnitComponent>(uid);
} }
private void HandlePowerChange(EntityUid uid, DisposalUnitComponent component, PowerChangedEvent args) private void HandlePowerChange(EntityUid uid, DisposalUnitComponent component, ref PowerChangedEvent args)
{ {
if (!component.Running) if (!component.Running)
return; return;

View File

@@ -30,7 +30,7 @@ namespace Content.Server.Doors.Systems
SubscribeLocalEvent<AirlockComponent, BeforeDoorPryEvent>(OnDoorPry); SubscribeLocalEvent<AirlockComponent, BeforeDoorPryEvent>(OnDoorPry);
} }
private void OnPowerChanged(EntityUid uid, AirlockComponent component, PowerChangedEvent args) private void OnPowerChanged(EntityUid uid, AirlockComponent component, ref PowerChangedEvent args)
{ {
if (TryComp<AppearanceComponent>(uid, out var appearanceComponent)) if (TryComp<AppearanceComponent>(uid, out var appearanceComponent))
{ {

View File

@@ -266,7 +266,7 @@ namespace Content.Server.Kitchen.EntitySystems
UpdateUserInterfaceState(uid, component); UpdateUserInterfaceState(uid, component);
} }
private void OnPowerChanged(EntityUid uid, MicrowaveComponent component, PowerChangedEvent args) private void OnPowerChanged(EntityUid uid, MicrowaveComponent component, ref PowerChangedEvent args)
{ {
if (!args.Powered) if (!args.Powered)
{ {

View File

@@ -34,7 +34,7 @@ namespace Content.Server.Kitchen.EntitySystems
SubscribeLocalEvent<ReagentGrinderComponent, ComponentInit>(OnComponentInit); SubscribeLocalEvent<ReagentGrinderComponent, ComponentInit>(OnComponentInit);
SubscribeLocalEvent<ReagentGrinderComponent, ComponentRemove>(OnComponentRemove); SubscribeLocalEvent<ReagentGrinderComponent, ComponentRemove>(OnComponentRemove);
SubscribeLocalEvent<ReagentGrinderComponent, PowerChangedEvent>((_, component, _) => EnqueueUiUpdate(component)); SubscribeLocalEvent<ReagentGrinderComponent, PowerChangedEvent>(OnPowerChange);
SubscribeLocalEvent<ReagentGrinderComponent, InteractUsingEvent>(OnInteractUsing); SubscribeLocalEvent<ReagentGrinderComponent, InteractUsingEvent>(OnInteractUsing);
SubscribeLocalEvent<StackComponent, ExtractableScalingEvent>(ExtractableScaling); SubscribeLocalEvent<StackComponent, ExtractableScalingEvent>(ExtractableScaling);
@@ -43,6 +43,11 @@ namespace Content.Server.Kitchen.EntitySystems
SubscribeLocalEvent<ReagentGrinderComponent, ContainerIsRemovingAttemptEvent>(OnEntRemoveAttempt); SubscribeLocalEvent<ReagentGrinderComponent, ContainerIsRemovingAttemptEvent>(OnEntRemoveAttempt);
} }
private void OnPowerChange(EntityUid uid, ReagentGrinderComponent component, ref PowerChangedEvent args)
{
EnqueueUiUpdate(component);
}
private void OnEntRemoveAttempt(EntityUid uid, ReagentGrinderComponent component, ContainerIsRemovingAttemptEvent args) private void OnEntRemoveAttempt(EntityUid uid, ReagentGrinderComponent component, ContainerIsRemovingAttemptEvent args)
{ {
if (component.Busy) if (component.Busy)

View File

@@ -243,7 +243,7 @@ namespace Content.Server.Lathe
_appearance.SetData(uid, LatheVisuals.InsertingColor, color); _appearance.SetData(uid, LatheVisuals.InsertingColor, color);
} }
private void OnPowerChanged(EntityUid uid, LatheComponent component, PowerChangedEvent args) private void OnPowerChanged(EntityUid uid, LatheComponent component, ref PowerChangedEvent args)
{ {
if (!args.Powered) if (!args.Powered)
{ {

View File

@@ -34,7 +34,7 @@ namespace Content.Server.Light.EntitySystems
SubscribeLocalEvent<EmergencyLightComponent, PowerChangedEvent>(OnEmergencyPower); SubscribeLocalEvent<EmergencyLightComponent, PowerChangedEvent>(OnEmergencyPower);
} }
private void OnEmergencyPower(EntityUid uid, EmergencyLightComponent component, PowerChangedEvent args) private void OnEmergencyPower(EntityUid uid, EmergencyLightComponent component, ref PowerChangedEvent args)
{ {
UpdateState(component); UpdateState(component);
} }

View File

@@ -14,7 +14,7 @@ namespace Content.Server.Light.EntitySystems
SubscribeLocalEvent<LitOnPoweredComponent, PowerNetBatterySupplyEvent>(OnPowerSupply); SubscribeLocalEvent<LitOnPoweredComponent, PowerNetBatterySupplyEvent>(OnPowerSupply);
} }
private void OnPowerChanged(EntityUid uid, LitOnPoweredComponent component, PowerChangedEvent args) private void OnPowerChanged(EntityUid uid, LitOnPoweredComponent component, ref PowerChangedEvent args)
{ {
if (EntityManager.TryGetComponent<PointLightComponent>(uid, out var light)) if (EntityManager.TryGetComponent<PointLightComponent>(uid, out var light))
{ {
@@ -22,7 +22,7 @@ namespace Content.Server.Light.EntitySystems
} }
} }
private void OnPowerSupply(EntityUid uid, LitOnPoweredComponent component, PowerNetBatterySupplyEvent args) private void OnPowerSupply(EntityUid uid, LitOnPoweredComponent component, ref PowerNetBatterySupplyEvent args)
{ {
if (EntityManager.TryGetComponent<PointLightComponent>(uid, out var light)) if (EntityManager.TryGetComponent<PointLightComponent>(uid, out var light))
{ {

View File

@@ -347,7 +347,7 @@ namespace Content.Server.Light.EntitySystems
args.Handled = true; args.Handled = true;
} }
private void OnPowerChanged(EntityUid uid, PoweredLightComponent component, PowerChangedEvent args) private void OnPowerChanged(EntityUid uid, PoweredLightComponent component, ref PowerChangedEvent args)
{ {
UpdateLight(uid, component); UpdateLight(uid, component);
} }

View File

@@ -10,7 +10,7 @@ public sealed partial class ParticleAcceleratorSystem
SubscribeLocalEvent<ParticleAcceleratorControlBoxComponent, PowerChangedEvent>(OnControlBoxPowerChange); SubscribeLocalEvent<ParticleAcceleratorControlBoxComponent, PowerChangedEvent>(OnControlBoxPowerChange);
} }
private static void OnControlBoxPowerChange(EntityUid uid, ParticleAcceleratorControlBoxComponent component, PowerChangedEvent args) private static void OnControlBoxPowerChange(EntityUid uid, ParticleAcceleratorControlBoxComponent component, ref PowerChangedEvent args)
{ {
component.OnPowerStateChanged(args); component.OnPowerStateChanged(args);
} }

View File

@@ -13,7 +13,7 @@ namespace Content.Server.ParticleAccelerator.EntitySystems
private static void PowerBoxReceivedChanged( private static void PowerBoxReceivedChanged(
EntityUid uid, EntityUid uid,
ParticleAcceleratorPowerBoxComponent component, ParticleAcceleratorPowerBoxComponent component,
PowerConsumerReceivedChanged args) ref PowerConsumerReceivedChanged args)
{ {
component.Master?.PowerBoxReceivedChanged(args); component.Master?.PowerBoxReceivedChanged(args);
} }

View File

@@ -87,7 +87,7 @@ namespace Content.Server.Physics.Controllers
} }
} }
private void OnPowerChanged(EntityUid uid, ConveyorComponent component, PowerChangedEvent args) private void OnPowerChanged(EntityUid uid, ConveyorComponent component, ref PowerChangedEvent args)
{ {
UpdateAppearance(component); UpdateAppearance(component);
} }

View File

@@ -71,15 +71,10 @@ namespace Content.Server.Power.Components
/// <summary> /// <summary>
/// Raised whenever an ApcPowerReceiver becomes powered / unpowered. /// Raised whenever an ApcPowerReceiver becomes powered / unpowered.
/// </summary> /// </summary>
public sealed class PowerChangedEvent : EntityEventArgs [ByRefEvent]
public readonly record struct PowerChangedEvent(bool Powered, float ReceivingPower)
{ {
public readonly bool Powered; public readonly bool Powered = Powered;
public readonly float ReceivingPower; public readonly float ReceivingPower = ReceivingPower;
public PowerChangedEvent(bool powered, float receivingPower)
{
Powered = powered;
ReceivingPower = receivingPower;
}
} }
} }

View File

@@ -28,7 +28,7 @@ namespace Content.Server.Power.EntitySystems
args.Cancel(); args.Cancel();
} }
private void OnPowerChanged(EntityUid uid, ActivatableUIRequiresPowerComponent component, PowerChangedEvent args) private void OnPowerChanged(EntityUid uid, ActivatableUIRequiresPowerComponent component, ref PowerChangedEvent args)
{ {
if (!args.Powered) if (!args.Powered)
_activatableUISystem.CloseAll(uid); _activatableUISystem.CloseAll(uid);

View File

@@ -47,7 +47,7 @@ internal sealed class ChargerSystem : EntitySystem
_itemSlotsSystem.RemoveItemSlot(uid, component.ChargerSlot); _itemSlotsSystem.RemoveItemSlot(uid, component.ChargerSlot);
} }
private void OnPowerChanged(EntityUid uid, ChargerComponent component, PowerChangedEvent args) private void OnPowerChanged(EntityUid uid, ChargerComponent component, ref PowerChangedEvent args)
{ {
component.UpdateStatus(); component.UpdateStatus();
} }

View File

@@ -5,6 +5,7 @@ using Content.Server.Power.NodeGroups;
using Content.Server.Power.Pow3r; using Content.Server.Power.Pow3r;
using JetBrains.Annotations; using JetBrains.Annotations;
using Content.Shared.Power; using Content.Shared.Power;
using Robust.Server.GameObjects;
namespace Content.Server.Power.EntitySystems namespace Content.Server.Power.EntitySystems
{ {
@@ -14,6 +15,8 @@ namespace Content.Server.Power.EntitySystems
[UsedImplicitly] [UsedImplicitly]
public sealed class PowerNetSystem : EntitySystem public sealed class PowerNetSystem : EntitySystem
{ {
[Dependency] private readonly AppearanceSystem _appearance = default!;
private readonly PowerState _powerState = new(); private readonly PowerState _powerState = new();
private readonly HashSet<PowerNet> _powerNetReconnectQueue = new(); private readonly HashSet<PowerNet> _powerNetReconnectQueue = new();
private readonly HashSet<ApcNet> _apcNetReconnectQueue = new(); private readonly HashSet<ApcNet> _apcNetReconnectQueue = new();
@@ -247,23 +250,24 @@ namespace Content.Server.Power.EntitySystems
continue; continue;
apcReceiver.PoweredLastUpdate = powered; apcReceiver.PoweredLastUpdate = powered;
var ev = new PowerChangedEvent(apcReceiver.Powered, apcReceiver.NetworkLoad.ReceivingPower);
RaiseLocalEvent(apcReceiver.Owner, new PowerChangedEvent(apcReceiver.Powered, apcReceiver.NetworkLoad.ReceivingPower), true); RaiseLocalEvent(apcReceiver.Owner, ref ev);
if (appearanceQuery.TryGetComponent(apcReceiver.Owner, out var appearance)) if (appearanceQuery.TryGetComponent(apcReceiver.Owner, out var appearance))
appearance.SetData(PowerDeviceVisuals.Powered, powered); _appearance.SetData(appearance.Owner, PowerDeviceVisuals.Powered, powered, appearance);
} }
foreach (var consumer in EntityManager.EntityQuery<PowerConsumerComponent>()) foreach (var consumer in EntityManager.EntityQuery<PowerConsumerComponent>())
{ {
var newRecv = consumer.NetworkLoad.ReceivingPower; var newRecv = consumer.NetworkLoad.ReceivingPower;
ref var lastRecv = ref consumer.LastReceived; ref var lastRecv = ref consumer.LastReceived;
if (!MathHelper.CloseToPercent(lastRecv, newRecv)) if (MathHelper.CloseToPercent(lastRecv, newRecv))
{ continue;
lastRecv = newRecv; lastRecv = newRecv;
var msg = new PowerConsumerReceivedChanged(newRecv, consumer.DrawRate); var msg = new PowerConsumerReceivedChanged(newRecv, consumer.DrawRate);
RaiseLocalEvent(consumer.Owner, msg, true); RaiseLocalEvent(consumer.Owner, ref msg);
}
} }
foreach (var powerNetBattery in EntityManager.EntityQuery<PowerNetworkBatteryComponent>()) foreach (var powerNetBattery in EntityManager.EntityQuery<PowerNetworkBatteryComponent>())
@@ -273,11 +277,13 @@ namespace Content.Server.Power.EntitySystems
if (lastSupply == 0f && currentSupply != 0f) if (lastSupply == 0f && currentSupply != 0f)
{ {
RaiseLocalEvent(powerNetBattery.Owner, new PowerNetBatterySupplyEvent {Supply = true}, true); var ev = new PowerNetBatterySupplyEvent(true);
RaiseLocalEvent(powerNetBattery.Owner, ref ev);
} }
else if (lastSupply > 0f && currentSupply == 0f) else if (lastSupply > 0f && currentSupply == 0f)
{ {
RaiseLocalEvent(powerNetBattery.Owner, new PowerNetBatterySupplyEvent {Supply = false}, true); var ev = new PowerNetBatterySupplyEvent(false);
RaiseLocalEvent(powerNetBattery.Owner, ref ev);
} }
powerNetBattery.LastSupply = currentSupply; powerNetBattery.LastSupply = currentSupply;
@@ -329,9 +335,11 @@ namespace Content.Server.Power.EntitySystems
consumer.NetworkLoad.LinkedNetwork = netNode.Id; consumer.NetworkLoad.LinkedNetwork = netNode.Id;
} }
var batteryQuery = GetEntityQuery<PowerNetworkBatteryComponent>();
foreach (var apc in net.Apcs) foreach (var apc in net.Apcs)
{ {
var netBattery = EntityManager.GetComponent<PowerNetworkBatteryComponent>(apc.Owner); var netBattery = batteryQuery.GetComponent(apc.Owner);
netNode.BatteriesDischarging.Add(netBattery.NetworkBattery.Id); netNode.BatteriesDischarging.Add(netBattery.NetworkBattery.Id);
netBattery.NetworkBattery.LinkedNetworkDischarging = netNode.Id; netBattery.NetworkBattery.LinkedNetworkDischarging = netNode.Id;
} }
@@ -358,16 +366,18 @@ namespace Content.Server.Power.EntitySystems
supplier.NetworkSupply.LinkedNetwork = netNode.Id; supplier.NetworkSupply.LinkedNetwork = netNode.Id;
} }
var batteryQuery = GetEntityQuery<PowerNetworkBatteryComponent>();
foreach (var charger in net.Chargers) foreach (var charger in net.Chargers)
{ {
var battery = EntityManager.GetComponent<PowerNetworkBatteryComponent>(charger.Owner); var battery = batteryQuery.GetComponent(charger.Owner);
netNode.BatteriesCharging.Add(battery.NetworkBattery.Id); netNode.BatteriesCharging.Add(battery.NetworkBattery.Id);
battery.NetworkBattery.LinkedNetworkCharging = netNode.Id; battery.NetworkBattery.LinkedNetworkCharging = netNode.Id;
} }
foreach (var discharger in net.Dischargers) foreach (var discharger in net.Dischargers)
{ {
var battery = EntityManager.GetComponent<PowerNetworkBatteryComponent>(discharger.Owner); var battery = batteryQuery.GetComponent(discharger.Owner);
netNode.BatteriesDischarging.Add(battery.NetworkBattery.Id); netNode.BatteriesDischarging.Add(battery.NetworkBattery.Id);
battery.NetworkBattery.LinkedNetworkDischarging = netNode.Id; battery.NetworkBattery.LinkedNetworkDischarging = netNode.Id;
} }
@@ -378,7 +388,7 @@ namespace Content.Server.Power.EntitySystems
/// Raised before power network simulation happens, to synchronize battery state from /// Raised before power network simulation happens, to synchronize battery state from
/// components like <see cref="BatteryComponent"/> into <see cref="PowerNetworkBatteryComponent"/>. /// components like <see cref="BatteryComponent"/> into <see cref="PowerNetworkBatteryComponent"/>.
/// </summary> /// </summary>
public struct NetworkBatteryPreSync public readonly struct NetworkBatteryPreSync
{ {
} }
@@ -386,31 +396,27 @@ namespace Content.Server.Power.EntitySystems
/// Raised after power network simulation happens, to synchronize battery charge changes from /// Raised after power network simulation happens, to synchronize battery charge changes from
/// <see cref="PowerNetworkBatteryComponent"/> to components like <see cref="BatteryComponent"/>. /// <see cref="PowerNetworkBatteryComponent"/> to components like <see cref="BatteryComponent"/>.
/// </summary> /// </summary>
public struct NetworkBatteryPostSync public readonly struct NetworkBatteryPostSync
{ {
} }
/// <summary> /// <summary>
/// Raised when the amount of receiving power on a <see cref="PowerConsumerComponent"/> changes. /// Raised when the amount of receiving power on a <see cref="PowerConsumerComponent"/> changes.
/// </summary> /// </summary>
public sealed class PowerConsumerReceivedChanged : EntityEventArgs [ByRefEvent]
public readonly record struct PowerConsumerReceivedChanged(float ReceivedPower, float DrawRate)
{ {
public float ReceivedPower { get; } public readonly float ReceivedPower = ReceivedPower;
public float DrawRate { get; } public readonly float DrawRate = DrawRate;
public PowerConsumerReceivedChanged(float receivedPower, float drawRate)
{
ReceivedPower = receivedPower;
DrawRate = drawRate;
}
} }
/// <summary> /// <summary>
/// Raised whenever a <see cref="PowerNetworkBatteryComponent"/> changes from / to 0 CurrentSupply. /// Raised whenever a <see cref="PowerNetworkBatteryComponent"/> changes from / to 0 CurrentSupply.
/// </summary> /// </summary>
public sealed class PowerNetBatterySupplyEvent : EntityEventArgs [ByRefEvent]
public readonly record struct PowerNetBatterySupplyEvent(bool Supply)
{ {
public bool Supply { get; init; } public readonly bool Supply = Supply;
} }
public struct PowerStatistics public struct PowerStatistics

View File

@@ -1,11 +1,14 @@
using Content.Server.Power.Components; using Content.Server.Power.Components;
using Content.Shared.Examine; using Content.Shared.Examine;
using Content.Shared.Power; using Content.Shared.Power;
using Robust.Server.GameObjects;
namespace Content.Server.Power.EntitySystems namespace Content.Server.Power.EntitySystems
{ {
public sealed class PowerReceiverSystem : EntitySystem public sealed class PowerReceiverSystem : EntitySystem
{ {
[Dependency] private readonly AppearanceSystem _appearance = default!;
public override void Initialize() public override void Initialize()
{ {
base.Initialize(); base.Initialize();
@@ -25,8 +28,9 @@ namespace Content.Server.Power.EntitySystems
private void OnExamined(EntityUid uid, ApcPowerReceiverComponent component, ExaminedEvent args) private void OnExamined(EntityUid uid, ApcPowerReceiverComponent component, ExaminedEvent args)
{ {
args.PushMarkup(Loc.GetString("power-receiver-component-on-examine-main", args.PushMarkup(Loc.GetString("power-receiver-component-on-examine-main",
("stateText", Loc.GetString( component.Powered ? "power-receiver-component-on-examine-powered" : ("stateText", Loc.GetString( component.Powered
"power-receiver-component-on-examine-unpowered")))); ? "power-receiver-component-on-examine-powered"
: "power-receiver-component-on-examine-unpowered"))));
} }
private void OnProviderShutdown(EntityUid uid, ApcPowerProviderComponent component, ComponentShutdown args) private void OnProviderShutdown(EntityUid uid, ApcPowerProviderComponent component, ComponentShutdown args)
@@ -77,11 +81,10 @@ namespace Content.Server.Power.EntitySystems
private void ProviderChanged(ApcPowerReceiverComponent receiver) private void ProviderChanged(ApcPowerReceiverComponent receiver)
{ {
receiver.NetworkLoad.LinkedNetwork = default; receiver.NetworkLoad.LinkedNetwork = default;
var ev = new PowerChangedEvent(receiver.Powered, receiver.NetworkLoad.ReceivingPower);
RaiseLocalEvent(receiver.Owner, new PowerChangedEvent(receiver.Powered, receiver.NetworkLoad.ReceivingPower), true); RaiseLocalEvent(receiver.Owner, ref ev);
_appearance.SetData(receiver.Owner, PowerDeviceVisuals.Powered, receiver.Powered);
if (TryComp(receiver.Owner, out AppearanceComponent? appearance))
appearance.SetData(PowerDeviceVisuals.Powered, receiver.Powered);
} }
/// <summary> /// <summary>

View File

@@ -145,7 +145,7 @@ namespace Content.Server.Shuttles.Systems
UpdateState(component); UpdateState(component);
} }
private void OnConsolePowerChange(EntityUid uid, ShuttleConsoleComponent component, PowerChangedEvent args) private void OnConsolePowerChange(EntityUid uid, ShuttleConsoleComponent component, ref PowerChangedEvent args)
{ {
UpdateState(component); UpdateState(component);
} }

View File

@@ -223,7 +223,7 @@ namespace Content.Server.Shuttles.Systems
DisableThruster(uid, component); DisableThruster(uid, component);
} }
private void OnPowerChange(EntityUid uid, ThrusterComponent component, PowerChangedEvent args) private void OnPowerChange(EntityUid uid, ThrusterComponent component, ref PowerChangedEvent args)
{ {
if (args.Powered && CanEnable(uid, component)) if (args.Powered && CanEnable(uid, component))
{ {

View File

@@ -71,7 +71,7 @@ namespace Content.Server.Singularity.EntitySystems
private void ReceivedChanged( private void ReceivedChanged(
EntityUid uid, EntityUid uid,
EmitterComponent component, EmitterComponent component,
PowerConsumerReceivedChanged args) ref PowerConsumerReceivedChanged args)
{ {
if (!component.IsOn) if (!component.IsOn)
{ {

View File

@@ -181,7 +181,7 @@ public sealed class SurveillanceCameraMonitorSystem : EntitySystem
TrySwitchCameraByAddress(uid, message.Address, component); TrySwitchCameraByAddress(uid, message.Address, component);
} }
private void OnPowerChanged(EntityUid uid, SurveillanceCameraMonitorComponent component, PowerChangedEvent args) private void OnPowerChanged(EntityUid uid, SurveillanceCameraMonitorComponent component, ref PowerChangedEvent args)
{ {
if (!args.Powered) if (!args.Powered)
{ {

View File

@@ -86,7 +86,7 @@ public sealed class SurveillanceCameraRouterSystem : EntitySystem
} }
} }
private void OnPowerChanged(EntityUid uid, SurveillanceCameraRouterComponent component, PowerChangedEvent args) private void OnPowerChanged(EntityUid uid, SurveillanceCameraRouterComponent component, ref PowerChangedEvent args)
{ {
component.MonitorRoutes.Clear(); component.MonitorRoutes.Clear();
component.Active = args.Powered; component.Active = args.Powered;

View File

@@ -143,7 +143,7 @@ public sealed class SurveillanceCameraSystem : EntitySystem
private void OnPowerChanged(EntityUid camera, SurveillanceCameraComponent component, PowerChangedEvent args) private void OnPowerChanged(EntityUid camera, SurveillanceCameraComponent component, ref PowerChangedEvent args)
{ {
SetActive(camera, args.Powered, component); SetActive(camera, args.Powered, component);
} }

View File

@@ -119,7 +119,7 @@ namespace Content.Server.VendingMachines
AuthorizedVend(uid, entity, args.Type, args.ID, component); AuthorizedVend(uid, entity, args.Type, args.ID, component);
} }
private void OnPowerChanged(EntityUid uid, VendingMachineComponent component, PowerChangedEvent args) private void OnPowerChanged(EntityUid uid, VendingMachineComponent component, ref PowerChangedEvent args)
{ {
TryUpdateVisualState(uid, component); TryUpdateVisualState(uid, component);
} }

View File

@@ -391,7 +391,7 @@ public sealed class WiresSystem : EntitySystem
#endregion #endregion
#region Event Handling #region Event Handling
private void OnWiresPowered(EntityUid uid, WiresComponent component, PowerChangedEvent args) private void OnWiresPowered(EntityUid uid, WiresComponent component, ref PowerChangedEvent args)
{ {
UpdateUserInterface(uid); UpdateUserInterface(uid);
foreach (var wire in component.WiresList) foreach (var wire in component.WiresList)