Power struct enumerators (#12396)

This commit is contained in:
Leon Friedrich
2022-11-07 05:33:56 +13:00
committed by GitHub
parent bae7b8d0d8
commit e29dc8c785

View File

@@ -206,28 +206,7 @@ namespace Content.Server.Power.EntitySystems
{ {
base.Update(frameTime); base.Update(frameTime);
// Reconnect networks. ReconnectNetworks();
{
foreach (var apcNet in _apcNetReconnectQueue)
{
if (apcNet.Removed)
continue;
DoReconnectApcNet(apcNet);
}
_apcNetReconnectQueue.Clear();
foreach (var powerNet in _powerNetReconnectQueue)
{
if (powerNet.Removed)
continue;
DoReconnectPowerNet(powerNet);
}
_powerNetReconnectQueue.Clear();
}
// Synchronize batteries // Synchronize batteries
RaiseLocalEvent(new NetworkBatteryPreSync()); RaiseLocalEvent(new NetworkBatteryPreSync());
@@ -241,53 +220,90 @@ namespace Content.Server.Power.EntitySystems
// Send events where necessary. // Send events where necessary.
// TODO: Instead of querying ALL power components every tick, and then checking if an event needs to be // TODO: Instead of querying ALL power components every tick, and then checking if an event needs to be
// raised, should probably assemble a list of entity Uids during the actual solver steps. // raised, should probably assemble a list of entity Uids during the actual solver steps.
UpdateApcPowerReceiver();
UpdatePowerConsumer();
UpdateNetworkBattery();
}
private void ReconnectNetworks()
{
foreach (var apcNet in _apcNetReconnectQueue)
{ {
var appearanceQuery = GetEntityQuery<AppearanceComponent>(); if (apcNet.Removed)
foreach (var apcReceiver in EntityManager.EntityQuery<ApcPowerReceiverComponent>()) continue;
DoReconnectApcNet(apcNet);
}
_apcNetReconnectQueue.Clear();
foreach (var powerNet in _powerNetReconnectQueue)
{
if (powerNet.Removed)
continue;
DoReconnectPowerNet(powerNet);
}
_powerNetReconnectQueue.Clear();
}
private void UpdateApcPowerReceiver()
{
var appearanceQuery = GetEntityQuery<AppearanceComponent>();
var enumerator = EntityQueryEnumerator<ApcPowerReceiverComponent>();
while (enumerator.MoveNext(out var apcReceiver))
{
var powered = apcReceiver.Powered;
if (powered == apcReceiver.PoweredLastUpdate)
continue;
apcReceiver.PoweredLastUpdate = powered;
var ev = new PowerChangedEvent(apcReceiver.Powered, apcReceiver.NetworkLoad.ReceivingPower);
RaiseLocalEvent(apcReceiver.Owner, ref ev);
if (appearanceQuery.TryGetComponent(apcReceiver.Owner, out var appearance))
_appearance.SetData(appearance.Owner, PowerDeviceVisuals.Powered, powered, appearance);
}
}
private void UpdatePowerConsumer()
{
var enumerator = EntityQueryEnumerator<PowerConsumerComponent>();
while (enumerator.MoveNext(out var consumer))
{
var newRecv = consumer.NetworkLoad.ReceivingPower;
ref var lastRecv = ref consumer.LastReceived;
if (MathHelper.CloseToPercent(lastRecv, newRecv))
continue;
lastRecv = newRecv;
var msg = new PowerConsumerReceivedChanged(newRecv, consumer.DrawRate);
RaiseLocalEvent(consumer.Owner, ref msg);
}
}
private void UpdateNetworkBattery()
{
var enumerator = EntityQueryEnumerator<PowerNetworkBatteryComponent>();
while (enumerator.MoveNext(out var powerNetBattery))
{
var lastSupply = powerNetBattery.LastSupply;
var currentSupply = powerNetBattery.CurrentSupply;
if (lastSupply == 0f && currentSupply != 0f)
{ {
var powered = apcReceiver.Powered; var ev = new PowerNetBatterySupplyEvent(true);
if (powered == apcReceiver.PoweredLastUpdate) RaiseLocalEvent(powerNetBattery.Owner, ref ev);
continue; }
else if (lastSupply > 0f && currentSupply == 0f)
apcReceiver.PoweredLastUpdate = powered; {
var ev = new PowerChangedEvent(apcReceiver.Powered, apcReceiver.NetworkLoad.ReceivingPower); var ev = new PowerNetBatterySupplyEvent(false);
RaiseLocalEvent(powerNetBattery.Owner, ref ev);
RaiseLocalEvent(apcReceiver.Owner, ref ev);
if (appearanceQuery.TryGetComponent(apcReceiver.Owner, out var appearance))
_appearance.SetData(appearance.Owner, PowerDeviceVisuals.Powered, powered, appearance);
} }
foreach (var consumer in EntityManager.EntityQuery<PowerConsumerComponent>()) powerNetBattery.LastSupply = currentSupply;
{
var newRecv = consumer.NetworkLoad.ReceivingPower;
ref var lastRecv = ref consumer.LastReceived;
if (MathHelper.CloseToPercent(lastRecv, newRecv))
continue;
lastRecv = newRecv;
var msg = new PowerConsumerReceivedChanged(newRecv, consumer.DrawRate);
RaiseLocalEvent(consumer.Owner, ref msg);
}
foreach (var powerNetBattery in EntityManager.EntityQuery<PowerNetworkBatteryComponent>())
{
var lastSupply = powerNetBattery.LastSupply;
var currentSupply = powerNetBattery.CurrentSupply;
if (lastSupply == 0f && currentSupply != 0f)
{
var ev = new PowerNetBatterySupplyEvent(true);
RaiseLocalEvent(powerNetBattery.Owner, ref ev);
}
else if (lastSupply > 0f && currentSupply == 0f)
{
var ev = new PowerNetBatterySupplyEvent(false);
RaiseLocalEvent(powerNetBattery.Owner, ref ev);
}
powerNetBattery.LastSupply = currentSupply;
}
} }
} }