Move ApcPowerReceiverComponent Powered state to shared (#28206)

* Try syncing powered state to client

For some reason the client is not receiving the ApcPowerReceiverComponentState, so it's not working.

* Fix powered state not syncing to client

The client PowerReceiverSystem was abstract, which prevented it from
running initialize.

* Flip check so that it runs bigger checks first

PowerDisabled skips the others.
NeedsPower skips the receiving check.

* Disallow changing Powered manually

* Move Powered update to PowerReceiverSystem

* Move appearance to event subscription

* Move metadata component to AllEntityQuery

* Cleanup

* Move Powered update back to PowerNetSystem

It's easier to use the EntityQueries and it dosen't need to be updated
anywhere else.

* Put appearance updating back

* Move IsPowered to shared

* Simplify IsPowered

* Cleanup

* Remove duplicate PowerChangedEvent

PowerChangedEvent on ProviderChanged doesn't seem to be needed
PowerChangedEvent gets raised by in update if the power state changes
after a new provider is connected
This commit is contained in:
ShadowCommander
2024-05-29 23:46:22 -07:00
committed by GitHub
parent ce2446a612
commit e2bf127323
8 changed files with 98 additions and 27 deletions

View File

@@ -19,6 +19,7 @@ namespace Content.Server.Power.EntitySystems
[Dependency] private readonly AppearanceSystem _appearance = default!;
[Dependency] private readonly PowerNetConnectorSystem _powerNetConnector = default!;
[Dependency] private readonly IParallelManager _parMan = default!;
[Dependency] private readonly PowerReceiverSystem _powerReceiver = default!;
private readonly PowerState _powerState = new();
private readonly HashSet<PowerNet> _powerNetReconnectQueue = new();
@@ -302,19 +303,27 @@ namespace Content.Server.Power.EntitySystems
var enumerator = AllEntityQuery<ApcPowerReceiverComponent>();
while (enumerator.MoveNext(out var uid, out var apcReceiver))
{
var powered = apcReceiver.Powered;
if (powered == apcReceiver.PoweredLastUpdate)
var powered = !apcReceiver.PowerDisabled
&& (!apcReceiver.NeedsPower
|| MathHelper.CloseToPercent(apcReceiver.NetworkLoad.ReceivingPower,
apcReceiver.Load));
// If new value is the same as the old, then exit
if (!apcReceiver.Recalculate && apcReceiver.Powered == powered)
continue;
if (metaQuery.GetComponent(uid).EntityPaused)
var metadata = metaQuery.Comp(uid);
if (metadata.EntityPaused)
continue;
apcReceiver.PoweredLastUpdate = powered;
var ev = new PowerChangedEvent(apcReceiver.Powered, apcReceiver.NetworkLoad.ReceivingPower);
apcReceiver.Recalculate = false;
apcReceiver.Powered = powered;
Dirty(uid, apcReceiver, metadata);
var ev = new PowerChangedEvent(powered, apcReceiver.NetworkLoad.ReceivingPower);
RaiseLocalEvent(uid, ref ev);
if (appearanceQuery.TryGetComponent(uid, out var appearance))
if (appearanceQuery.TryComp(uid, out var appearance))
_appearance.SetData(uid, PowerDeviceVisuals.Powered, powered, appearance);
}
}