* cameras but i didn't feel like git stashing them * Adds more functionality server-side for surveillance cameras * rider moment * Adds skeleton for SurveillanceCameraMonitorBoundUi on client * whoops * makes surveillance camera monitor UI more defined * removes tree from SurveillanceCameraMonitorWindow * surveillance camera active flag, other routing things * actually sets how SurveillanceCameraMonitorSystem sends camera info to clients * adds entity yaml, changes field * adds the camera/monitor entities, makes the UI open * SurveillanceCameraRouters (not implemented fully) * subnets for cameras, server-side * it works! * fixes rotation in cameras * whoops restores surveillance cameras to ignored components makes it so that switching cameras now lerps the other camera * makes the UI work * makes it so that cameras actually refresh now * cleanup * adds camera.rsi * cleans up prototypes a bit * adds camera subnet frequencies, cameras in subnets * adds surveillance camera router subnets * might fix testing errors * adds the circuit board to the surveillance camera monitor * fixes up the camera monitor (the detective will get his tv soon) * adds heartbeat, ensures subnet data is passed into cameras to send * fixes up a few things * whoops * changes to UI internals * fixes subnet selection issue * localized strings for UI * changes 'test' id to 'camera' for cameras * whoops * missing s * camera static! * adds a delay to camera switching * adjusts a few things in camera timing * adds setup for cameras/routers, localization for frequency names * adds setup ui for routers, makes subnet names in monitor window follow frequency name in prototype * localization, some cleanup * ui adjustments * adds surveillance camera visuals * fixes a bug when closing the UI for monitors * adds disconnect message to UI * adds construction graph to cameras * adds the camera to the construction menu * fixes network selection for setup, tweak to assembly * adds surveillance camera router construction, fixes up surveillance camera wire cutting * adds disconnect button to monitor UI * switches around the status text * tweaks monitor UI * makes the address actually show * might make tests pass * UI adjustments, hard name limit * ok, that didn't work * adds wireless cameras * makes the television work/look nicer * adds tripod cameras in addition to mobile cameras * makes wireless cameras constructable * fixes up those prototypes * reorganization in C#, small cleanup * ensures that power changes deactivate some devices * adds a component to the television, comments out a function * actually, never mind, i forgot that wireless cameras existed/are creatable for a second * tweaks to router construction, removes SubnetTest from prototypes * removes it from frequencies too * Apply suggestions from code review Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com> * type serializers into components * setup window opens centered, enum is now byte * replaces active monitor list with ActiveSurveillanceCameraMonitorComponent * adds paused/deleted entity checks, changes how verbs are given * removes EntitySystem.Get<T>() references * fixes bug related to selecting network from setup, alphabet-orders network listing in setup * rider moment * adds minwidth to surveillance camera setup window * addresses reviews * should fix the issue with camera visuals not updating properly * addresses some reviews * addresses further review * addresses reviews related to RSIs * never needed a key there anyways * changes a few things with routers to ensure that they're active * whoops * ensurecomp over addcomp * whoops Co-authored-by: metalgearsloth <31366439+metalgearsloth@users.noreply.github.com>
124 lines
3.8 KiB
C#
124 lines
3.8 KiB
C#
using Content.Client.Eye;
|
|
using Content.Shared.SurveillanceCamera;
|
|
using Robust.Client.GameObjects;
|
|
|
|
namespace Content.Client.SurveillanceCamera.UI;
|
|
|
|
public sealed class SurveillanceCameraMonitorBoundUserInterface : BoundUserInterface
|
|
{
|
|
[Dependency] private readonly IEntityManager _entityManager = default!;
|
|
private readonly EyeLerpingSystem _eyeLerpingSystem;
|
|
private readonly SurveillanceCameraMonitorSystem _surveillanceCameraMonitorSystem;
|
|
|
|
private SurveillanceCameraMonitorWindow? _window;
|
|
private EntityUid? _currentCamera;
|
|
|
|
public SurveillanceCameraMonitorBoundUserInterface(ClientUserInterfaceComponent owner, object uiKey) : base(owner, uiKey)
|
|
{
|
|
IoCManager.InjectDependencies(this);
|
|
_eyeLerpingSystem = _entityManager.EntitySysManager.GetEntitySystem<EyeLerpingSystem>();
|
|
_surveillanceCameraMonitorSystem = _entityManager.EntitySysManager.GetEntitySystem<SurveillanceCameraMonitorSystem>();
|
|
}
|
|
|
|
protected override void Open()
|
|
{
|
|
base.Open();
|
|
|
|
_window = new SurveillanceCameraMonitorWindow();
|
|
|
|
if (State != null)
|
|
{
|
|
UpdateState(State);
|
|
}
|
|
|
|
_window.OpenCentered();
|
|
|
|
_window.CameraSelected += OnCameraSelected;
|
|
_window.SubnetOpened += OnSubnetRequest;
|
|
_window.CameraRefresh += OnCameraRefresh;
|
|
_window.SubnetRefresh += OnSubnetRefresh;
|
|
_window.OnClose += Close;
|
|
_window.CameraSwitchTimer += OnCameraSwitchTimer;
|
|
_window.CameraDisconnect += OnCameraDisconnect;
|
|
}
|
|
|
|
private void OnCameraSelected(string address)
|
|
{
|
|
SendMessage(new SurveillanceCameraMonitorSwitchMessage(address));
|
|
}
|
|
|
|
private void OnSubnetRequest(string subnet)
|
|
{
|
|
SendMessage(new SurveillanceCameraMonitorSubnetRequestMessage(subnet));
|
|
}
|
|
|
|
private void OnCameraSwitchTimer()
|
|
{
|
|
_surveillanceCameraMonitorSystem.AddTimer(Owner.Owner, _window!.OnSwitchTimerComplete);
|
|
}
|
|
|
|
private void OnCameraRefresh()
|
|
{
|
|
SendMessage(new SurveillanceCameraRefreshCamerasMessage());
|
|
}
|
|
|
|
private void OnSubnetRefresh()
|
|
{
|
|
SendMessage(new SurveillanceCameraRefreshSubnetsMessage());
|
|
}
|
|
|
|
private void OnCameraDisconnect()
|
|
{
|
|
SendMessage(new SurveillanceCameraDisconnectMessage());
|
|
}
|
|
|
|
protected override void UpdateState(BoundUserInterfaceState state)
|
|
{
|
|
if (_window == null || state is not SurveillanceCameraMonitorUiState cast)
|
|
{
|
|
return;
|
|
}
|
|
|
|
if (cast.ActiveCamera == null)
|
|
{
|
|
_window.UpdateState(null, cast.Subnets, cast.ActiveAddress, cast.ActiveSubnet, cast.Cameras);
|
|
|
|
if (_currentCamera != null)
|
|
{
|
|
_surveillanceCameraMonitorSystem.RemoveTimer(Owner.Owner);
|
|
_eyeLerpingSystem.RemoveEye(_currentCamera.Value);
|
|
_currentCamera = null;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
if (_currentCamera == null)
|
|
{
|
|
_eyeLerpingSystem.AddEye(cast.ActiveCamera.Value);
|
|
_currentCamera = cast.ActiveCamera;
|
|
}
|
|
else if (_currentCamera != cast.ActiveCamera)
|
|
{
|
|
_eyeLerpingSystem.RemoveEye(_currentCamera.Value);
|
|
_eyeLerpingSystem.AddEye(cast.ActiveCamera.Value);
|
|
_currentCamera = cast.ActiveCamera;
|
|
}
|
|
|
|
if (_entityManager.TryGetComponent(cast.ActiveCamera, out EyeComponent eye))
|
|
{
|
|
_window.UpdateState(eye.Eye, cast.Subnets, cast.ActiveAddress, cast.ActiveSubnet, cast.Cameras);
|
|
}
|
|
}
|
|
}
|
|
|
|
protected override void Dispose(bool disposing)
|
|
{
|
|
base.Dispose(disposing);
|
|
|
|
if (disposing)
|
|
{
|
|
_window?.Dispose();
|
|
}
|
|
}
|
|
}
|