diff --git a/OpenRA.Mods.Common/Traits/Render/DrawLineToTarget.cs b/OpenRA.Mods.Common/Traits/Render/DrawLineToTarget.cs index 964a68b955..891c8e0d60 100644 --- a/OpenRA.Mods.Common/Traits/Render/DrawLineToTarget.cs +++ b/OpenRA.Mods.Common/Traits/Render/DrawLineToTarget.cs @@ -10,9 +10,8 @@ #endregion using System.Collections.Generic; -using OpenRA.Activities; +using System.Linq; using OpenRA.Graphics; -using OpenRA.Primitives; using OpenRA.Traits; namespace OpenRA.Mods.Common.Traits @@ -35,6 +34,7 @@ namespace OpenRA.Mods.Common.Traits public class DrawLineToTarget : IRenderAboveShroudWhenSelected, INotifySelected { readonly DrawLineToTargetInfo info; + readonly List renderableCache = new List(); int lifetime; public DrawLineToTarget(Actor self, DrawLineToTargetInfo info) @@ -61,17 +61,18 @@ namespace OpenRA.Mods.Common.Traits IEnumerable IRenderAboveShroudWhenSelected.RenderAboveShroud(Actor self, WorldRenderer wr) { if (!self.Owner.IsAlliedWith(self.World.LocalPlayer)) - yield break; + return Enumerable.Empty(); // Players want to see the lines when in waypoint mode. var force = Game.GetModifierKeys().HasModifier(Modifiers.Shift); if (--lifetime <= 0 && !force) - yield break; + return Enumerable.Empty(); if (!(force || Game.Settings.Game.DrawTargetLine)) - yield break; + return Enumerable.Empty(); + renderableCache.Clear(); var prev = self.CenterPosition; var a = self.CurrentActivity; for (; a != null; a = a.NextActivity) @@ -88,14 +89,18 @@ namespace OpenRA.Mods.Common.Traits var pos = n.Target.CenterPosition; if (tile == null) - yield return new TargetLineRenderable(new[] { prev, pos }, n.Color, info.LineWidth, info.MarkerWidth); + renderableCache.Add(new TargetLineRenderable(new[] { prev, pos }, n.Color, info.LineWidth, info.MarkerWidth)); else - yield return new SpriteRenderable(tile, pos, WVec.Zero, -511, pal, 1f, true); + renderableCache.Add(new SpriteRenderable(tile, pos, WVec.Zero, -511, pal, 1f, true)); prev = pos; } } } + + // Reverse draw order so target markers are drawn on top of the next line + renderableCache.Reverse(); + return renderableCache; } bool IRenderAboveShroudWhenSelected.SpatiallyPartitionable { get { return false; } }