From 01dda0b5ae07733afcf7b75dc415b580af79d461 Mon Sep 17 00:00:00 2001 From: B_Kirill <153602297+B-Kirill@users.noreply.github.com> Date: Wed, 1 Jul 2026 18:39:34 +1000 Subject: [PATCH] Some camera map fixes and improvements (#44446) --- .../UI/SurveillanceCameraMonitorBoundUi.cs | 2 +- .../SurveillanceCameraMonitorWindow.xaml.cs | 3 +- .../UI/SurveillanceCameraNavMapControl.cs | 2 +- .../Systems/SurveillanceCameraMapSystem.cs | 45 ++++++++++--------- .../SurveillanceCameraMapComponent.cs | 1 + 5 files changed, 29 insertions(+), 24 deletions(-) diff --git a/Content.Client/SurveillanceCamera/UI/SurveillanceCameraMonitorBoundUi.cs b/Content.Client/SurveillanceCamera/UI/SurveillanceCameraMonitorBoundUi.cs index 561744cf62..0c22a6631a 100644 --- a/Content.Client/SurveillanceCamera/UI/SurveillanceCameraMonitorBoundUi.cs +++ b/Content.Client/SurveillanceCamera/UI/SurveillanceCameraMonitorBoundUi.cs @@ -36,7 +36,7 @@ public sealed class SurveillanceCameraMonitorBoundUserInterface : BoundUserInter _window.CameraDisconnect += OnCameraDisconnect; var xform = EntMan.GetComponent(Owner); - var gridUid = xform.GridUid ?? xform.MapUid; + var gridUid = xform.GridUid; if (gridUid is not null) _window?.SetMap(gridUid.Value); diff --git a/Content.Client/SurveillanceCamera/UI/SurveillanceCameraMonitorWindow.xaml.cs b/Content.Client/SurveillanceCamera/UI/SurveillanceCameraMonitorWindow.xaml.cs index 9d7ca81f08..6daee03c0c 100644 --- a/Content.Client/SurveillanceCamera/UI/SurveillanceCameraMonitorWindow.xaml.cs +++ b/Content.Client/SurveillanceCamera/UI/SurveillanceCameraMonitorWindow.xaml.cs @@ -23,6 +23,7 @@ public sealed partial class SurveillanceCameraMonitorWindow : DefaultWindow [Dependency] private IPrototypeManager _prototypeManager = default!; [Dependency] private IResourceCache _resourceCache = default!; [Dependency] private IEntityManager _entityManager = default!; + [Dependency] private IEntityNetworkManager _entityNetManager = default!; /// /// Triggered when a camera is selected. @@ -224,6 +225,6 @@ public sealed partial class SurveillanceCameraMonitorWindow : DefaultWindow if (!string.IsNullOrEmpty(marker.Address)) CameraSelected?.Invoke(marker.Address, marker.Subnet); else - _entityManager.RaisePredictiveEvent(new RequestCameraMarkerUpdateMessage(netEntity)); + _entityNetManager.SendSystemNetworkMessage(new RequestCameraMarkerUpdateMessage(netEntity)); } } diff --git a/Content.Client/SurveillanceCamera/UI/SurveillanceCameraNavMapControl.cs b/Content.Client/SurveillanceCamera/UI/SurveillanceCameraNavMapControl.cs index ae8d4d6304..5d806ba458 100644 --- a/Content.Client/SurveillanceCamera/UI/SurveillanceCameraNavMapControl.cs +++ b/Content.Client/SurveillanceCamera/UI/SurveillanceCameraNavMapControl.cs @@ -23,7 +23,7 @@ public sealed partial class SurveillanceCameraNavMapControl : NavMapControl private readonly Texture _invalidTexture; private string _activeCameraAddress = string.Empty; - private HashSet _availableSubnets = new(); + private HashSet _availableSubnets = []; private (Dictionary Cameras, string ActiveAddress, HashSet AvailableSubnets) _lastState; public bool EnableCameraSelection { get; set; } diff --git a/Content.Server/SurveillanceCamera/Systems/SurveillanceCameraMapSystem.cs b/Content.Server/SurveillanceCamera/Systems/SurveillanceCameraMapSystem.cs index ad592fa098..a2417372a2 100644 --- a/Content.Server/SurveillanceCamera/Systems/SurveillanceCameraMapSystem.cs +++ b/Content.Server/SurveillanceCamera/Systems/SurveillanceCameraMapSystem.cs @@ -1,4 +1,5 @@ using System.Numerics; +using Content.Server.DeviceNetwork.Systems; using Content.Server.Power.Components; using Content.Shared.DeviceNetwork.Components; using Content.Shared.SurveillanceCamera.Components; @@ -11,40 +12,42 @@ public sealed partial class SurveillanceCameraMapSystem : EntitySystem public override void Initialize() { + base.Initialize(); + + SubscribeLocalEvent(OnCameraInit, after: [typeof(DeviceNetworkSystem)]); SubscribeLocalEvent(OnCameraMoved); - SubscribeLocalEvent(OnCameraUnpaused); SubscribeNetworkEvent(OnRequestCameraMarkerUpdate); } - private void OnCameraUnpaused(EntityUid uid, SurveillanceCameraComponent comp, ref EntityUnpausedEvent args) + private void OnCameraInit(Entity ent, ref MapInitEvent args) { - if (Terminating(uid)) - return; - - UpdateCameraMarker((uid, comp)); + UpdateCameraMarker(ent); } - private void OnCameraMoved(EntityUid uid, SurveillanceCameraComponent comp, ref MoveEvent args) + private void OnCameraMoved(Entity ent, ref MoveEvent args) { - if (Terminating(uid)) + if (!args.ParentChanged) + { + UpdateCameraMarker(ent); return; + } var oldGridUid = _transform.GetGrid(args.OldPosition); - var newGridUid = _transform.GetGrid(args.NewPosition); + var newGridUid = args.Component.GridUid; - if (oldGridUid != newGridUid && oldGridUid is not null && !Terminating(oldGridUid.Value)) + if (oldGridUid != newGridUid && oldGridUid is not null && !TerminatingOrDeleted(oldGridUid.Value)) { if (TryComp(oldGridUid, out var oldMapComp)) { - var netEntity = GetNetEntity(uid); + var netEntity = GetNetEntity(ent.Owner); if (oldMapComp.Cameras.Remove(netEntity)) Dirty(oldGridUid.Value, oldMapComp); } } - if (newGridUid is not null && !Terminating(newGridUid.Value)) - UpdateCameraMarker((uid, comp)); + if (newGridUid is not null && !TerminatingOrDeleted(newGridUid.Value)) + UpdateCameraMarker(ent); } private void OnRequestCameraMarkerUpdate(RequestCameraMarkerUpdateMessage args) @@ -63,13 +66,13 @@ public sealed partial class SurveillanceCameraMapSystem : EntitySystem { var (uid, comp) = camera; - if (Terminating(uid)) + if (TerminatingOrDeleted(uid)) return; if (!TryComp(uid, out TransformComponent? xform) || !TryComp(uid, out DeviceNetworkComponent? deviceNet)) return; - var gridUid = xform.GridUid ?? xform.MapUid; + var gridUid = xform.GridUid; if (gridUid is null) return; @@ -85,7 +88,7 @@ public sealed partial class SurveillanceCameraMapSystem : EntitySystem var powered = CompOrNull(uid)?.Powered ?? true; var active = comp.Active && powered; - bool exists = mapComp.Cameras.TryGetValue(netEntity, out var existing); + var exists = mapComp.Cameras.TryGetValue(netEntity, out var existing); if (exists && existing.Position.Equals(localPos) && @@ -117,12 +120,12 @@ public sealed partial class SurveillanceCameraMapSystem : EntitySystem if (!TryComp(cameraUid, out TransformComponent? xform)) return; - var gridUid = xform.GridUid ?? xform.MapUid; - if (gridUid == null || !TryComp(gridUid.Value, out var mapComp)) + var gridUid = xform.GridUid; + if (gridUid is null || !TryComp(gridUid.Value, out var mapComp)) return; var netEntity = GetNetEntity(cameraUid); - if (mapComp.Cameras.TryGetValue(netEntity, out var marker)) + if (mapComp.Cameras.TryGetValue(netEntity, out var marker) && marker.Visible != visible) { marker.Visible = visible; mapComp.Cameras[netEntity] = marker; @@ -138,8 +141,8 @@ public sealed partial class SurveillanceCameraMapSystem : EntitySystem if (!TryComp(cameraUid, out TransformComponent? xform)) return false; - var gridUid = xform.GridUid ?? xform.MapUid; - if (gridUid == null || !TryComp(gridUid, out var mapComp)) + var gridUid = xform.GridUid; + if (gridUid is null || !TryComp(gridUid, out var mapComp)) return false; var netEntity = GetNetEntity(cameraUid); diff --git a/Content.Shared/SurveillanceCamera/Components/SurveillanceCameraMapComponent.cs b/Content.Shared/SurveillanceCamera/Components/SurveillanceCameraMapComponent.cs index 86e199e2e9..754240f604 100644 --- a/Content.Shared/SurveillanceCamera/Components/SurveillanceCameraMapComponent.cs +++ b/Content.Shared/SurveillanceCamera/Components/SurveillanceCameraMapComponent.cs @@ -13,6 +13,7 @@ public sealed partial class SurveillanceCameraMapComponent : Component /// /// Dictionary of cameras on on the current grid. /// + [ViewVariables] [AutoNetworkedField] public Dictionary Cameras = new(); }