diff --git a/Content.Client/_Sunrise/CartridgeLoader/Cartridges/PhotoCaptureOverlay.cs b/Content.Client/_Sunrise/CartridgeLoader/Cartridges/PhotoCaptureOverlay.cs index ac90e81002..1c8db1d406 100644 --- a/Content.Client/_Sunrise/CartridgeLoader/Cartridges/PhotoCaptureOverlay.cs +++ b/Content.Client/_Sunrise/CartridgeLoader/Cartridges/PhotoCaptureOverlay.cs @@ -10,21 +10,19 @@ namespace Content.Client._Sunrise.CartridgeLoader.Cartridges; public sealed class PhotoCaptureOverlay : Overlay { - private readonly IPlayerManager _playerManager; + [Dependency] private readonly IPlayerManager _playerManager = default!; + [Dependency] private readonly IStateManager _stateManager = default!; + [Dependency] private readonly IEyeManager _eyeManager = default!; + [Dependency] private readonly IEntityManager _entityManager = default!; + private readonly SharedTransformSystem _transformSystem; - private readonly IStateManager _stateManager; - private readonly IEyeManager _eyeManager; - private readonly IEntityManager _entityManager; public override OverlaySpace Space => OverlaySpace.ScreenSpace; - public PhotoCaptureOverlay(IPlayerManager playerManager, SharedTransformSystem transformSystem, IStateManager stateManager, IEyeManager eyeManager, IEntityManager entityManager) + public PhotoCaptureOverlay() { - _playerManager = playerManager; - _transformSystem = transformSystem; - _stateManager = stateManager; - _eyeManager = eyeManager; - _entityManager = entityManager; + IoCManager.InjectDependencies(this); + _transformSystem = _entityManager.System(); } protected override void Draw(in OverlayDrawArgs args) @@ -38,17 +36,24 @@ public sealed class PhotoCaptureOverlay : Overlay var screenHandle = args.ScreenHandle; var viewportControl = (Control)viewportState.Viewport; - if (_playerManager.LocalPlayer?.ControlledEntity is not { } player) - return; + var overlaySystem = _entityManager.System(); + var photoSystem = _entityManager.System(); - var playerPos = _transformSystem.GetWorldPosition(player); + var source = overlaySystem.ActiveCameraEntity; - var system = _entityManager.System(); - var targetPos = system.GetCameraPosition(player, system.CaptureDistance); + if (source == null || !_entityManager.EntityExists(source.Value)) + { + if (_playerManager.LocalSession?.AttachedEntity is not { } player) + return; + source = player; + } + + var sourcePos = _transformSystem.GetWorldPosition(source.Value); + var targetPos = photoSystem.GetCameraPosition(source.Value, photoSystem.CaptureDistance); var targetScreen = _eyeManager.WorldToScreen(targetPos); - var playerScreen = _eyeManager.WorldToScreen(playerPos); - var offsetScreen = _eyeManager.WorldToScreen(playerPos + new Vector2(1, 0)); + var playerScreen = _eyeManager.WorldToScreen(sourcePos); + var offsetScreen = _eyeManager.WorldToScreen(sourcePos + new Vector2(1, 0)); var pixelsPerMeter = (offsetScreen - playerScreen).Length(); if (pixelsPerMeter < 1) return; diff --git a/Content.Client/_Sunrise/CartridgeLoader/Cartridges/PhotoCartridgeClientSystem.cs b/Content.Client/_Sunrise/CartridgeLoader/Cartridges/PhotoCartridgeClientSystem.cs index b699bf7a9e..246416c1ad 100644 --- a/Content.Client/_Sunrise/CartridgeLoader/Cartridges/PhotoCartridgeClientSystem.cs +++ b/Content.Client/_Sunrise/CartridgeLoader/Cartridges/PhotoCartridgeClientSystem.cs @@ -1,4 +1,3 @@ -using System; using System.IO; using System.Linq; using System.Numerics; @@ -12,12 +11,9 @@ using SixLabors.ImageSharp; using SixLabors.ImageSharp.PixelFormats; using SixLabors.ImageSharp.Processing; using Robust.Client.Player; -using Robust.Shared.Maths; -using Robust.Shared.GameObjects; using Robust.Client.UserInterface; using Robust.Shared.Physics; using Robust.Shared.Physics.Systems; -using Content.Shared.Physics; using Robust.Shared.Map.Components; using Robust.Shared.Timing; @@ -25,7 +21,6 @@ namespace Content.Client._Sunrise.CartridgeLoader.Cartridges; public sealed class PhotoCartridgeClientSystem : EntitySystem { - [Dependency] private readonly IClyde _clyde = default!; [Dependency] private readonly IClientNetManager _netManager = default!; [Dependency] private readonly ILogManager _logManager = default!; [Dependency] private readonly IStateManager _stateManager = default!; @@ -33,15 +28,11 @@ public sealed class PhotoCartridgeClientSystem : EntitySystem [Dependency] private readonly SharedTransformSystem _transformSystem = default!; [Dependency] private readonly IEntityManager _entityManager = default!; [Dependency] private readonly SharedPhysicsSystem _physics = default!; - [Dependency] private readonly IOverlayManager _overlayManager = default!; [Dependency] private readonly IEyeManager _eyeManager = default!; [Dependency] private readonly IGameTiming _timing = default!; private TimeSpan _nextCaptureTime = TimeSpan.Zero; public bool CameraReady => _timing.CurTime >= _nextCaptureTime; - - private PhotoCaptureOverlay? _overlay; - public bool OverlayEnabled { get; private set; } public float CaptureDistance { get; set; } = 2.0f; private ISawmill _sawmill = default!; @@ -53,26 +44,10 @@ public sealed class PhotoCartridgeClientSystem : EntitySystem { _sawmill = _logManager.GetSawmill("photo.cartridge.client"); _netManager.RegisterNetMessage(accept: NetMessageAccept.Server); - _overlay = new PhotoCaptureOverlay(_playerManager, _transformSystem, _stateManager, _eyeManager, _entityManager); } public void Shutdown() { - _overlayManager.RemoveOverlay(); - } - - public void SetOverlayEnabled(bool enabled) - { - OverlayEnabled = enabled; - if (enabled) - { - if (!_overlayManager.HasOverlay()) - _overlayManager.AddOverlay(_overlay!); - } - else - { - _overlayManager.RemoveOverlay(); - } } public Vector2 GetCameraPosition(EntityUid source, float distance) diff --git a/Content.Client/_Sunrise/CartridgeLoader/Cartridges/PhotoOverlaySystem.cs b/Content.Client/_Sunrise/CartridgeLoader/Cartridges/PhotoOverlaySystem.cs new file mode 100644 index 0000000000..87e63650f5 --- /dev/null +++ b/Content.Client/_Sunrise/CartridgeLoader/Cartridges/PhotoOverlaySystem.cs @@ -0,0 +1,40 @@ +using Robust.Client.Graphics; + +namespace Content.Client._Sunrise.CartridgeLoader.Cartridges; + +public sealed class PhotoOverlaySystem : EntitySystem +{ + [Dependency] private readonly IOverlayManager _overlayManager = default!; + + private PhotoCaptureOverlay? _overlay; + public bool OverlayEnabled { get; private set; } + public EntityUid? ActiveCameraEntity { get; set; } + + public override void Initialize() + { + base.Initialize(); + _overlay = new PhotoCaptureOverlay(); + } + + public void SetOverlayEnabled(bool enabled, EntityUid? source = null) + { + OverlayEnabled = enabled; + ActiveCameraEntity = source; + + if (enabled) + { + if (!_overlayManager.HasOverlay()) + _overlayManager.AddOverlay(_overlay!); + } + else + { + _overlayManager.RemoveOverlay(); + } + } + + public override void Shutdown() + { + base.Shutdown(); + _overlayManager.RemoveOverlay(); + } +} diff --git a/Content.Client/_Sunrise/CartridgeLoader/Cartridges/PhotoUiFragment.xaml b/Content.Client/_Sunrise/CartridgeLoader/Cartridges/PhotoUiFragment.xaml index 3393d0ccfa..d86e5aabc4 100644 --- a/Content.Client/_Sunrise/CartridgeLoader/Cartridges/PhotoUiFragment.xaml +++ b/Content.Client/_Sunrise/CartridgeLoader/Cartridges/PhotoUiFragment.xaml @@ -4,12 +4,12 @@ Orientation="Vertical"> -