64 lines
2.2 KiB
C#
64 lines
2.2 KiB
C#
using Content.Server.DeviceNetwork.Systems;
|
|
using Content.Server.Medical.CrewMonitoring;
|
|
using Content.Shared.DeviceNetwork.Components;
|
|
using Content.Shared.Medical.SuitSensors;
|
|
using Robust.Shared.Timing;
|
|
|
|
namespace Content.Server.Medical.SuitSensors;
|
|
|
|
public sealed class SuitSensorSystem : SharedSuitSensorSystem
|
|
{
|
|
[Dependency] private readonly IGameTiming _gameTiming = default!;
|
|
[Dependency] private readonly DeviceNetworkSystem _deviceNetworkSystem = default!;
|
|
[Dependency] private readonly SingletonDeviceNetServerSystem _singletonServerSystem = default!;
|
|
|
|
public override void Update(float frameTime)
|
|
{
|
|
base.Update(frameTime);
|
|
|
|
var curTime = _gameTiming.CurTime;
|
|
var sensors = EntityQueryEnumerator<SuitSensorComponent, DeviceNetworkComponent>();
|
|
|
|
while (sensors.MoveNext(out var uid, out var sensor, out var device))
|
|
{
|
|
if (device.TransmitFrequency is null)
|
|
continue;
|
|
|
|
// check if sensor is ready to update
|
|
if (curTime < sensor.NextUpdate)
|
|
continue;
|
|
|
|
if (!CheckSensorAssignedStation((uid, sensor)))
|
|
continue;
|
|
|
|
sensor.NextUpdate += sensor.UpdateRate;
|
|
|
|
// get sensor status
|
|
var status = GetSensorState((uid, sensor));
|
|
if (status == null)
|
|
continue;
|
|
|
|
//Retrieve active server address if the sensor isn't connected to a server
|
|
if (sensor.ConnectedServer == null)
|
|
{
|
|
if (!_singletonServerSystem.TryGetActiveServerAddress<CrewMonitoringServerComponent>(sensor.StationId!.Value, out var address))
|
|
continue;
|
|
|
|
sensor.ConnectedServer = address;
|
|
}
|
|
|
|
// Send it to the connected server
|
|
var payload = SuitSensorToPacket(status);
|
|
|
|
// Clear the connected server if its address isn't on the network
|
|
if (!_deviceNetworkSystem.IsAddressPresent(device.DeviceNetId, sensor.ConnectedServer))
|
|
{
|
|
sensor.ConnectedServer = null;
|
|
continue;
|
|
}
|
|
|
|
_deviceNetworkSystem.QueuePacket(uid, sensor.ConnectedServer, payload, device: device);
|
|
}
|
|
}
|
|
}
|