SUPER CAMERA(OCHKO) (#501)
* SUPER CAMERA(OCHKO) * Удобный монитор камер и портативный мониторинг для детектива. (#25) * Улучшение мониторинга камер * Портативный монитор камер для дека * чейнжлог * Revert "Удобный монитор камер и портативный мониторинг для детектива. (#25)" This reverts commit adf35bb8f6ddd6256b18841a81b330224ebff103. * Revert "Revert "Удобный монитор камер и портативный мониторинг для детектива. (#25)"" This reverts commit bd30fe45046b7b8508e8277f8c186d03338354cd. * cleanups * its so over --------- Co-authored-by: Vigers Ray <60344369+VigersRay@users.noreply.github.com> Co-authored-by: drdth <drdtheuser@gmail.com>
This commit is contained in:
committed by
GitHub
parent
a1f562d181
commit
3ed0f2c4bb
@@ -2,13 +2,16 @@ using System.Linq;
|
||||
using Content.Server.DeviceNetwork;
|
||||
using Content.Server.DeviceNetwork.Systems;
|
||||
using Content.Server.Power.Components;
|
||||
using Content.Server.SurveillanceCamera.Components;
|
||||
using Content.Server.SurveillanceCamera.Systems;
|
||||
using Content.Shared.DeviceNetwork;
|
||||
using Content.Shared.UserInterface;
|
||||
using Content.Shared.SurveillanceCamera;
|
||||
using Robust.Server.GameObjects;
|
||||
using Robust.Shared.Player;
|
||||
using Robust.Shared.Map;
|
||||
|
||||
namespace Content.Server.SurveillanceCamera;
|
||||
namespace Content.Server.SurveillanceCamera.Systems;
|
||||
|
||||
public sealed class SurveillanceCameraMonitorSystem : EntitySystem
|
||||
{
|
||||
@@ -28,7 +31,6 @@ public sealed class SurveillanceCameraMonitorSystem : EntitySystem
|
||||
subs.Event<SurveillanceCameraRefreshCamerasMessage>(OnRefreshCamerasMessage);
|
||||
subs.Event<SurveillanceCameraRefreshSubnetsMessage>(OnRefreshSubnetsMessage);
|
||||
subs.Event<SurveillanceCameraDisconnectMessage>(OnDisconnectMessage);
|
||||
subs.Event<SurveillanceCameraMonitorSubnetRequestMessage>(OnSubnetRequest);
|
||||
subs.Event<SurveillanceCameraMonitorSwitchMessage>(OnSwitchMessage);
|
||||
subs.Event<BoundUIClosedEvent>(OnBoundUiClose);
|
||||
});
|
||||
@@ -87,15 +89,6 @@ public sealed class SurveillanceCameraMonitorSystem : EntitySystem
|
||||
RefreshSubnets(uid, component);
|
||||
}
|
||||
|
||||
private void OnSubnetRequest(EntityUid uid, SurveillanceCameraMonitorComponent component,
|
||||
SurveillanceCameraMonitorSubnetRequestMessage args)
|
||||
{
|
||||
if (args.Session.AttachedEntity != null)
|
||||
{
|
||||
SetActiveSubnet(uid, args.Subnet, component);
|
||||
}
|
||||
}
|
||||
|
||||
private void OnPacketReceived(EntityUid uid, SurveillanceCameraMonitorComponent component,
|
||||
DeviceNetworkPacketEvent args)
|
||||
{
|
||||
@@ -127,28 +120,48 @@ public sealed class SurveillanceCameraMonitorSystem : EntitySystem
|
||||
case SurveillanceCameraSystem.CameraDataMessage:
|
||||
if (!args.Data.TryGetValue(SurveillanceCameraSystem.CameraNameData, out string? name)
|
||||
|| !args.Data.TryGetValue(SurveillanceCameraSystem.CameraSubnetData, out string? subnetData)
|
||||
|| !args.Data.TryGetValue(SurveillanceCameraSystem.CameraAddressData, out string? address))
|
||||
|| !args.Data.TryGetValue(SurveillanceCameraSystem.CameraAddressData, out string? address)
|
||||
|| !args.Data.TryGetValue(SurveillanceCameraSystem.CameraUid, out EntityUid cameraUid)
|
||||
|| !args.Data.TryGetValue(SurveillanceCameraSystem.CameraSubnetColor, out Color color))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (component.ActiveSubnet != subnetData)
|
||||
if (!component.KnownSubnets.TryGetValue(subnetData, out var subnetAddress))
|
||||
{
|
||||
DisconnectFromSubnet(uid, subnetData);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!component.KnownCameras.ContainsKey(address))
|
||||
var netEntCamera = GetNetEntity(cameraUid);
|
||||
|
||||
if (!component.KnownCameras.ContainsKey(netEntCamera))
|
||||
{
|
||||
component.KnownCameras.Add(address, name);
|
||||
var coordinates = EntityCoordinates.Invalid;
|
||||
|
||||
if (TryComp<TransformComponent>(cameraUid, out var transform))
|
||||
{
|
||||
if (transform.GridUid != null)
|
||||
{
|
||||
coordinates = transform.Coordinates;
|
||||
}
|
||||
}
|
||||
|
||||
component.KnownCameras.Add(netEntCamera,
|
||||
new CameraData {
|
||||
Name = name,
|
||||
CameraAddress = address,
|
||||
SubnetAddress = subnetAddress,
|
||||
SubnetColor = color,
|
||||
Coordinates = GetNetCoordinates(coordinates)
|
||||
});
|
||||
}
|
||||
|
||||
UpdateUserInterface(uid, component);
|
||||
break;
|
||||
case SurveillanceCameraSystem.CameraSubnetData:
|
||||
if (args.Data.TryGetValue(SurveillanceCameraSystem.CameraSubnetData, out string? subnet)
|
||||
&& !component.KnownSubnets.ContainsKey(subnet))
|
||||
if (args.Data.TryGetValue(SurveillanceCameraSystem.CameraSubnetData, out string? subnet))
|
||||
{
|
||||
component.KnownSubnets.Add(subnet, args.SenderAddress);
|
||||
component.KnownSubnets.TryAdd(subnet, args.SenderAddress);
|
||||
}
|
||||
|
||||
UpdateUserInterface(uid, component);
|
||||
@@ -161,13 +174,30 @@ public sealed class SurveillanceCameraMonitorSystem : EntitySystem
|
||||
SurveillanceCameraDisconnectMessage message)
|
||||
{
|
||||
DisconnectCamera(uid, true, component);
|
||||
// Sunrise-start
|
||||
foreach (var subnet in component.KnownSubnets)
|
||||
{
|
||||
DisconnectFromSubnet(uid, subnet.Key);
|
||||
component.KnownCameras.Clear();
|
||||
UpdateUserInterface(uid, component);
|
||||
ConnectToSubnet(uid, subnet.Key);
|
||||
}
|
||||
// Sunrise-end
|
||||
}
|
||||
|
||||
private void OnRefreshCamerasMessage(EntityUid uid, SurveillanceCameraMonitorComponent component,
|
||||
SurveillanceCameraRefreshCamerasMessage message)
|
||||
{
|
||||
component.KnownCameras.Clear();
|
||||
RequestActiveSubnetInfo(uid, component);
|
||||
// Sunrise-start
|
||||
foreach (var subnet in component.KnownSubnets)
|
||||
{
|
||||
DisconnectFromSubnet(uid, subnet.Key);
|
||||
DisconnectCamera(uid, true, component);
|
||||
component.KnownCameras.Clear();
|
||||
UpdateUserInterface(uid, component);
|
||||
ConnectToSubnet(uid, subnet.Key);
|
||||
}
|
||||
// Sunrise-end
|
||||
}
|
||||
|
||||
private void OnRefreshSubnetsMessage(EntityUid uid, SurveillanceCameraMonitorComponent component,
|
||||
@@ -181,7 +211,7 @@ public sealed class SurveillanceCameraMonitorSystem : EntitySystem
|
||||
// there would be a null check here, but honestly
|
||||
// whichever one is the "latest" switch message gets to
|
||||
// do the switch
|
||||
TrySwitchCameraByAddress(uid, message.Address, component);
|
||||
TrySwitchCameraByUid(uid, GetEntity(message.CameraNetEntity), component);
|
||||
}
|
||||
|
||||
private void OnPowerChanged(EntityUid uid, SurveillanceCameraMonitorComponent component, ref PowerChangedEvent args)
|
||||
@@ -190,7 +220,6 @@ public sealed class SurveillanceCameraMonitorSystem : EntitySystem
|
||||
{
|
||||
RemoveActiveCamera(uid, component);
|
||||
component.NextCameraAddress = null;
|
||||
component.ActiveSubnet = string.Empty;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -208,20 +237,17 @@ public sealed class SurveillanceCameraMonitorSystem : EntitySystem
|
||||
|
||||
private void OnBoundUiClose(EntityUid uid, SurveillanceCameraMonitorComponent component, BoundUIClosedEvent args)
|
||||
{
|
||||
if (args.Session.AttachedEntity == null)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
RemoveViewer(uid, args.Session.AttachedEntity.Value, component);
|
||||
RemoveViewer(uid, args.Entity, component);
|
||||
}
|
||||
|
||||
#endregion
|
||||
|
||||
private void SendHeartbeat(EntityUid uid, SurveillanceCameraMonitorComponent? monitor = null)
|
||||
{
|
||||
if (!Resolve(uid, ref monitor)
|
||||
|| monitor.LastHeartbeatSent < _heartbeatDelay
|
||||
|| !monitor.KnownSubnets.TryGetValue(monitor.ActiveSubnet, out var subnetAddress))
|
||||
|| monitor.ActiveCamera == null
|
||||
|| !monitor.KnownCameras.TryGetValue(GetNetEntity(monitor.ActiveCamera.Value), out var cameraData))
|
||||
{
|
||||
return;
|
||||
}
|
||||
@@ -232,7 +258,7 @@ public sealed class SurveillanceCameraMonitorSystem : EntitySystem
|
||||
{ SurveillanceCameraSystem.CameraAddressData, monitor.ActiveCameraAddress }
|
||||
};
|
||||
|
||||
_deviceNetworkSystem.QueuePacket(uid, subnetAddress, payload);
|
||||
_deviceNetworkSystem.QueuePacket(uid, cameraData.SubnetAddress, payload);
|
||||
}
|
||||
|
||||
private void DisconnectCamera(EntityUid uid, bool removeViewers, SurveillanceCameraMonitorComponent? monitor = null)
|
||||
@@ -278,28 +304,10 @@ public sealed class SurveillanceCameraMonitorSystem : EntitySystem
|
||||
_deviceNetworkSystem.QueuePacket(uid, null, payload);
|
||||
}
|
||||
|
||||
private void SetActiveSubnet(EntityUid uid, string subnet,
|
||||
SurveillanceCameraMonitorComponent? monitor = null)
|
||||
private void RequestSubnetInfo(EntityUid uid, string subnet, SurveillanceCameraMonitorComponent? monitor = null)
|
||||
{
|
||||
if (!Resolve(uid, ref monitor)
|
||||
|| !monitor.KnownSubnets.ContainsKey(subnet))
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
DisconnectFromSubnet(uid, monitor.ActiveSubnet);
|
||||
DisconnectCamera(uid, true, monitor);
|
||||
monitor.ActiveSubnet = subnet;
|
||||
monitor.KnownCameras.Clear();
|
||||
UpdateUserInterface(uid, monitor);
|
||||
|
||||
ConnectToSubnet(uid, subnet);
|
||||
}
|
||||
|
||||
private void RequestActiveSubnetInfo(EntityUid uid, SurveillanceCameraMonitorComponent? monitor = null)
|
||||
{
|
||||
if (!Resolve(uid, ref monitor)
|
||||
|| !monitor.KnownSubnets.TryGetValue(monitor.ActiveSubnet, out var address))
|
||||
|| !monitor.KnownSubnets.TryGetValue(subnet, out var address))
|
||||
{
|
||||
return;
|
||||
}
|
||||
@@ -325,7 +333,7 @@ public sealed class SurveillanceCameraMonitorSystem : EntitySystem
|
||||
};
|
||||
_deviceNetworkSystem.QueuePacket(uid, address, payload);
|
||||
|
||||
RequestActiveSubnetInfo(uid);
|
||||
RequestSubnetInfo(uid, subnet, monitor);
|
||||
}
|
||||
|
||||
private void DisconnectFromSubnet(EntityUid uid, string subnet, SurveillanceCameraMonitorComponent? monitor = null)
|
||||
@@ -415,11 +423,12 @@ public sealed class SurveillanceCameraMonitorSystem : EntitySystem
|
||||
UpdateUserInterface(uid, monitor);
|
||||
}
|
||||
|
||||
private void TrySwitchCameraByAddress(EntityUid uid, string address,
|
||||
private void TrySwitchCameraByAddress(EntityUid uid,
|
||||
string camera,
|
||||
string subnet,
|
||||
SurveillanceCameraMonitorComponent? monitor = null)
|
||||
{
|
||||
if (!Resolve(uid, ref monitor)
|
||||
|| !monitor.KnownSubnets.TryGetValue(monitor.ActiveSubnet, out var subnetAddress))
|
||||
if (!Resolve(uid, ref monitor))
|
||||
{
|
||||
return;
|
||||
}
|
||||
@@ -427,11 +436,11 @@ public sealed class SurveillanceCameraMonitorSystem : EntitySystem
|
||||
var payload = new NetworkPayload()
|
||||
{
|
||||
{DeviceNetworkConstants.Command, SurveillanceCameraSystem.CameraConnectMessage},
|
||||
{SurveillanceCameraSystem.CameraAddressData, address}
|
||||
{SurveillanceCameraSystem.CameraAddressData, camera}
|
||||
};
|
||||
|
||||
monitor.NextCameraAddress = address;
|
||||
_deviceNetworkSystem.QueuePacket(uid, subnetAddress, payload);
|
||||
monitor.NextCameraAddress = camera;
|
||||
_deviceNetworkSystem.QueuePacket(uid, subnet, payload);
|
||||
}
|
||||
|
||||
// Attempts to switch over the current viewed camera on this monitor
|
||||
@@ -486,7 +495,7 @@ public sealed class SurveillanceCameraMonitorSystem : EntitySystem
|
||||
return;
|
||||
}
|
||||
|
||||
var state = new SurveillanceCameraMonitorUiState(GetNetEntity(monitor.ActiveCamera), monitor.KnownSubnets.Keys.ToHashSet(), monitor.ActiveCameraAddress, monitor.ActiveSubnet, monitor.KnownCameras);
|
||||
var state = new SurveillanceCameraMonitorUiState(GetNetEntity(monitor.ActiveCamera), monitor.KnownSubnets.Keys.ToHashSet(), monitor.ActiveCameraAddress, monitor.KnownCameras);
|
||||
_userInterface.TrySetUiState(uid, SurveillanceCameraMonitorUiKey.Key, state);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user