Surveillance cameras (#8246)
* 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>
This commit is contained in:
@@ -0,0 +1,7 @@
|
||||
namespace Content.Server.SurveillanceCamera;
|
||||
|
||||
// Dummy component for active surveillance monitors.
|
||||
[RegisterComponent]
|
||||
public sealed class ActiveSurveillanceCameraMonitorComponent : Component
|
||||
{
|
||||
}
|
||||
@@ -0,0 +1,46 @@
|
||||
using Content.Shared.DeviceNetwork;
|
||||
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.List;
|
||||
|
||||
namespace Content.Server.SurveillanceCamera;
|
||||
|
||||
[RegisterComponent]
|
||||
[Friend(typeof(SurveillanceCameraSystem))]
|
||||
public sealed class SurveillanceCameraComponent : Component
|
||||
{
|
||||
// List of active viewers. This is for bookkeeping purposes,
|
||||
// so that when a camera shuts down, any entity viewing it
|
||||
// will immediately have their subscription revoked.
|
||||
public HashSet<EntityUid> ActiveViewers { get; } = new();
|
||||
|
||||
// Monitors != Viewers, as viewers are entities that are tied
|
||||
// to a player session that's viewing from this camera
|
||||
//
|
||||
// Monitors are grouped sets of viewers, and may be
|
||||
// completely different monitor types (e.g., monitor console,
|
||||
// AI, etc.)
|
||||
public HashSet<EntityUid> ActiveMonitors { get; } = new();
|
||||
|
||||
// If this camera is active or not. Deactivating a camera
|
||||
// will not allow it to obtain any new viewers.
|
||||
[ViewVariables]
|
||||
public bool Active { get; set; } = true;
|
||||
|
||||
// This one isn't easy to deal with. Will require a UI
|
||||
// to change/set this so mapping these in isn't
|
||||
// the most terrible thing possible.
|
||||
[ViewVariables(VVAccess.ReadWrite)]
|
||||
[DataField("id")]
|
||||
public string CameraId { get; set; } = "camera";
|
||||
|
||||
[ViewVariables(VVAccess.ReadWrite)]
|
||||
[DataField("nameSet")]
|
||||
public bool NameSet { get; set; }
|
||||
|
||||
[ViewVariables(VVAccess.ReadWrite)]
|
||||
[DataField("networkSet")]
|
||||
public bool NetworkSet { get; set; }
|
||||
|
||||
// This has to be device network frequency prototypes.
|
||||
[DataField("setupAvailableNetworks", customTypeSerializer:typeof(PrototypeIdListSerializer<DeviceFrequencyPrototype>))]
|
||||
public List<string> AvailableNetworks { get; } = new();
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
namespace Content.Server.SurveillanceCamera;
|
||||
|
||||
[RegisterComponent]
|
||||
[Friend(typeof(SurveillanceCameraMonitorSystem))]
|
||||
public sealed class SurveillanceCameraMonitorComponent : Component
|
||||
{
|
||||
// Currently active camera viewed by this monitor.
|
||||
public EntityUid? ActiveCamera { get; set; }
|
||||
public string ActiveCameraAddress { get; set; } = string.Empty;
|
||||
|
||||
// Last time this monitor was sent a heartbeat.
|
||||
public float LastHeartbeat { get; set; }
|
||||
// Last time this monitor sent a heartbeat.
|
||||
public float LastHeartbeatSent { get; set; }
|
||||
|
||||
// Next camera this monitor is trying to connect to.
|
||||
// If the monitor has connected to the camera, this
|
||||
// should be set to null.
|
||||
public string? NextCameraAddress { get; set; }
|
||||
|
||||
[ViewVariables]
|
||||
// Set of viewers currently looking at this monitor.
|
||||
public HashSet<EntityUid> Viewers { get; } = new();
|
||||
|
||||
// Current active subnet.
|
||||
public string ActiveSubnet { get; set; } = default!;
|
||||
|
||||
// Known cameras in this subnet by address with name values.
|
||||
// This is cleared when the subnet is changed.
|
||||
public Dictionary<string, string> KnownCameras { get; } = new();
|
||||
|
||||
[ViewVariables]
|
||||
// The subnets known by this camera monitor.
|
||||
public Dictionary<string, string> KnownSubnets { get; } = new();
|
||||
}
|
||||
@@ -0,0 +1,31 @@
|
||||
using Content.Shared.DeviceNetwork;
|
||||
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype;
|
||||
using Robust.Shared.Serialization.TypeSerializers.Implementations.Custom.Prototype.List;
|
||||
|
||||
namespace Content.Server.SurveillanceCamera;
|
||||
|
||||
[RegisterComponent]
|
||||
public sealed class SurveillanceCameraRouterComponent : Component
|
||||
{
|
||||
[ViewVariables] public bool Active { get; set; }
|
||||
|
||||
// The name of the subnet connected to this router.
|
||||
[DataField("subnetName")]
|
||||
public string SubnetName { get; set; } = string.Empty;
|
||||
|
||||
[ViewVariables]
|
||||
// The monitors to route to. This raises an issue related to
|
||||
// camera monitors disappearing before sending a D/C packet,
|
||||
// this could probably be refreshed every time a new monitor
|
||||
// is added or removed from active routing.
|
||||
public HashSet<string> MonitorRoutes { get; } = new();
|
||||
|
||||
[ViewVariables]
|
||||
// The frequency that talks to this router's subnet.
|
||||
public uint SubnetFrequency;
|
||||
[DataField("subnetFrequency", customTypeSerializer:typeof(PrototypeIdSerializer<DeviceFrequencyPrototype>))]
|
||||
public string? SubnetFrequencyId { get; set; }
|
||||
|
||||
[DataField("setupAvailableNetworks", customTypeSerializer:typeof(PrototypeIdListSerializer<DeviceFrequencyPrototype>))]
|
||||
public List<string> AvailableNetworks { get; } = new();
|
||||
}
|
||||
Reference in New Issue
Block a user