using System.Text; using Robust.Client.Interfaces.Graphics.ClientEye; using Robust.Client.Interfaces.Input; using Robust.Client.UserInterface.Controls; using Robust.Shared.Map; using Robust.Shared.Maths; using Robust.Client.Graphics.Drawing; using Robust.Client.Interfaces.Graphics; using Robust.Client.Interfaces.State; using Robust.Client.Player; using Robust.Shared.Interfaces.GameObjects; using Robust.Shared.Interfaces.Map; using Robust.Shared.Timing; namespace Robust.Client.UserInterface.CustomControls { internal class DebugCoordsPanel : PanelContainer { private readonly IPlayerManager playerManager; private readonly IEyeManager eyeManager; private readonly IInputManager inputManager; private readonly IStateManager stateManager; private readonly IClyde _displayManager; private readonly IMapManager _mapManager; private readonly Label contents; //TODO: Think about a factory for this public DebugCoordsPanel(IPlayerManager playerMan, IEyeManager eyeMan, IInputManager inputMan, IStateManager stateMan, IClyde displayMan, IMapManager mapMan) { playerManager = playerMan; eyeManager = eyeMan; inputManager = inputMan; stateManager = stateMan; _displayManager = displayMan; _mapManager = mapMan; SizeFlagsHorizontal = SizeFlags.None; contents = new Label { FontColorShadowOverride = Color.Black, }; AddChild(contents); PanelOverride = new StyleBoxFlat { BackgroundColor = new Color(67, 105, 255, 138), ContentMarginLeftOverride = 5, ContentMarginTopOverride = 5 }; MouseFilter = contents.MouseFilter = MouseFilterMode.Ignore; } protected override void FrameUpdate(FrameEventArgs args) { if (!VisibleInTree) { return; } var stringBuilder = new StringBuilder(); var mouseScreenPos = inputManager.MouseScreenPosition; var screenSize = _displayManager.ScreenSize; MapCoordinates mouseWorldMap; GridCoordinates mouseGridPos; TileRef tile; mouseWorldMap = eyeManager.ScreenToMap(mouseScreenPos); if (_mapManager.TryFindGridAt(mouseWorldMap, out var mouseGrid)) { mouseGridPos = mouseGrid.MapToGrid(mouseWorldMap); tile = mouseGrid.GetTileRef(mouseGridPos); } else { mouseGridPos = new GridCoordinates(mouseWorldMap.Position, GridId.Invalid); tile = default; } stringBuilder.AppendFormat(@"Positioning Debug: Screen Size: {0} Mouse Pos: Screen: {1} {2} {3} {4} GUI: {5}", screenSize, mouseScreenPos, mouseWorldMap, mouseGridPos, tile, UserInterfaceManager.CurrentlyHovered); stringBuilder.AppendLine("\nAttached Entity:"); if (playerManager.LocalPlayer?.ControlledEntity == null) { stringBuilder.AppendLine("No attached entity."); } else { var entityTransform = playerManager.LocalPlayer.ControlledEntity.Transform; var playerWorldOffset = entityTransform.MapPosition; var playerScreen = eyeManager.WorldToScreen(playerWorldOffset.Position); GridCoordinates playerGridPos; if (_mapManager.TryFindGridAt(playerWorldOffset, out var playerGrid)) { playerGridPos = playerGrid.MapToGrid(playerWorldOffset); } else { playerGridPos = new GridCoordinates(playerWorldOffset.Position, GridId.Invalid); } stringBuilder.AppendFormat(@" Screen: {0} {1} {2} EntityUid: {3}", playerScreen, playerWorldOffset, playerGridPos, entityTransform.Owner.Uid); } contents.Text = stringBuilder.ToString(); MinimumSizeChanged(); } protected override Vector2 CalculateMinimumSize() { return new Vector2(175, contents.CombinedMinimumSize.Y + 10); } } }