diff --git a/OpenRA.Game/Widgets/MapPreviewWidget.cs b/OpenRA.Game/Widgets/MapPreviewWidget.cs index 7228805b2b..3416da1f22 100644 --- a/OpenRA.Game/Widgets/MapPreviewWidget.cs +++ b/OpenRA.Game/Widgets/MapPreviewWidget.cs @@ -11,6 +11,7 @@ using System; using System.Collections.Generic; using System.Drawing; +using System.Linq; using OpenRA.FileFormats; using OpenRA.Graphics; @@ -21,6 +22,7 @@ namespace OpenRA.Widgets public Func Map = () => null; public Func> SpawnColors = () => new Dictionary(); public Action OnMouseDown = _ => {}; + public Action OnTooltip = (_, __) => { }; public bool IgnoreMouseInput = false; public bool ShowSpawnPoints = true; @@ -96,7 +98,8 @@ namespace OpenRA.Widgets { var colors = SpawnColors(); - foreach (var p in map.GetSpawnPoints()) + var spawnPoints = map.GetSpawnPoints().ToList(); + foreach (var p in spawnPoints) { var owned = colors.ContainsKey(p); var pos = ConvertToPreview(p); @@ -107,6 +110,11 @@ namespace OpenRA.Widgets WidgetUtils.FillRectWithColor(new Rectangle(pos.X + offset.X + 2, pos.Y + offset.Y + 2, 12, 12), colors[p]); Game.Renderer.RgbaSpriteRenderer.DrawSprite(sprite, pos + offset); + + if ((pos - Viewport.LastMousePos).LengthSquared < 64) + { + OnTooltip(spawnPoints.IndexOf(p) + 1, pos); + } } } } diff --git a/OpenRA.Mods.RA/Widgets/Logic/LobbyLogic.cs b/OpenRA.Mods.RA/Widgets/Logic/LobbyLogic.cs index 2c9ab8136b..57a49a23cb 100644 --- a/OpenRA.Mods.RA/Widgets/Logic/LobbyLogic.cs +++ b/OpenRA.Mods.RA/Widgets/Logic/LobbyLogic.cs @@ -110,7 +110,8 @@ namespace OpenRA.Mods.RA.Widgets.Logic mapPreview.IsVisible = () => Map != null; mapPreview.Map = () => Map; mapPreview.OnMouseDown = mi => LobbyUtils.SelectSpawnPoint( orderManager, mapPreview, Map, mi ); - mapPreview.SpawnColors = () => LobbyUtils.GetSpawnColors( orderManager, Map ); + mapPreview.OnTooltip = (spawnPoint, pos) => LobbyUtils.ShowSpawnPointTooltip(orderManager, spawnPoint, pos); + mapPreview.SpawnColors = () => LobbyUtils.GetSpawnColors(orderManager, Map); var mapTitle = lobby.GetOrNull("MAP_TITLE"); if (mapTitle != null) diff --git a/OpenRA.Mods.RA/Widgets/Logic/LobbyUtils.cs b/OpenRA.Mods.RA/Widgets/Logic/LobbyUtils.cs index 38048cfda7..fd0ab270f2 100644 --- a/OpenRA.Mods.RA/Widgets/Logic/LobbyUtils.cs +++ b/OpenRA.Mods.RA/Widgets/Logic/LobbyUtils.cs @@ -151,7 +151,7 @@ namespace OpenRA.Mods.RA.Widgets.Logic { var spawns = map.GetSpawnPoints(); return orderManager.LobbyInfo.Clients - .Where( c => c.SpawnPoint != 0 ) + .Where( c => c.SpawnPoint != 0) .ToDictionary( c => spawns[c.SpawnPoint - 1], c => c.ColorRamp.GetColor(0)); @@ -173,9 +173,20 @@ namespace OpenRA.Mods.RA.Widgets.Logic if (selectedSpawn == 0 || !owned) { var locals = orderManager.LobbyInfo.Clients.Where(c => c.Index == orderManager.LocalClient.Index || (Game.IsHost && c.Bot != null)); - var playerToMove = locals.Where(c => (selectedSpawn == 0) ^ (c.SpawnPoint == 0)).FirstOrDefault(); + var playerToMove = locals.FirstOrDefault(c => (selectedSpawn == 0) ^ (c.SpawnPoint == 0)); orderManager.IssueOrder(Order.Command("spawn {0} {1}".F((playerToMove ?? orderManager.LocalClient).Index, selectedSpawn))); } } + + public static void ShowSpawnPointTooltip(OrderManager orderManager, int spawnPoint, int2 position) + { + var client = orderManager.LobbyInfo.Clients.FirstOrDefault(c => c.SpawnPoint == spawnPoint); + if (client != null) + { + var rect = new Rectangle(position.X, position.Y, Game.Renderer.Fonts["Regular"].Measure(client.Name).X + 15, 25); + WidgetUtils.DrawPanel("dialog4", rect); + Game.Renderer.Fonts["Regular"].DrawText(client.Name, position + new int2(5, 5), Color.White); + } + } } }