diff --git a/OpenRA.Game/Actor.cs b/OpenRA.Game/Actor.cs index 99db31f290..52c5e2c172 100755 --- a/OpenRA.Game/Actor.cs +++ b/OpenRA.Game/Actor.cs @@ -105,7 +105,7 @@ namespace OpenRA return mods.Aggregate(sprites, (m, p) => p.ModifyRender(this, m)); } - public Order Order( int2 xy, MouseInput mi ) + public Order Order( int2 xy, MouseInput mi, Actor underCursor ) { if (Owner != World.LocalPlayer) return null; @@ -115,11 +115,6 @@ namespace OpenRA if (Destroyed) return null; - - var underCursor = World.FindUnitsAtMouse(mi.Location) - .Where(a => a.Info.Traits.Contains()) - .OrderByDescending(a => a.Info.Traits.Contains() ? a.Info.Traits.Get().Priority : int.MinValue) - .FirstOrDefault(); return TraitsImplementing() .OrderByDescending( x => x.OrderPriority( this, xy, mi, underCursor ) ) diff --git a/OpenRA.Game/Orders/UnitOrderGenerator.cs b/OpenRA.Game/Orders/UnitOrderGenerator.cs index c420ff5a7b..e2b432fd98 100644 --- a/OpenRA.Game/Orders/UnitOrderGenerator.cs +++ b/OpenRA.Game/Orders/UnitOrderGenerator.cs @@ -18,9 +18,9 @@ namespace OpenRA.Orders class UnitOrderGenerator : IOrderGenerator { public IEnumerable Order( World world, int2 xy, MouseInput mi ) - { + { var orders = world.Selection.Actors - .Select(a => a.Order(xy, mi)) + .Select(a => a.Order(xy, mi, UnderCursor(world, mi))) .Where(o => o != null) .ToArray(); @@ -55,17 +55,26 @@ namespace OpenRA.Orders Game.Renderer.Flush(); } - public string GetCursor( World world, int2 xy, MouseInput mi ) + public Actor UnderCursor(World world, MouseInput mi) { + return world.FindUnitsAtMouse(mi.Location) + .Where(a => a.Info.Traits.Contains()) + .OrderByDescending(a => a.Info.Traits.Contains() ? a.Info.Traits.Get().Priority : int.MinValue) + .FirstOrDefault(); + } + + public string GetCursor( World world, int2 xy, MouseInput mi ) + { + if (mi.Modifiers.HasModifier(Modifiers.Shift) || !world.Selection.Actors.Any()) + if (UnderCursor(world, mi) != null) + return "select"; + var c = Order(world, xy, mi) .Select(o => o.Subject.TraitsImplementing() .Select(pc => pc.CursorForOrder(o.Subject, o)).FirstOrDefault(a => a != null)) .FirstOrDefault(a => a != null); - return c ?? - (world.FindUnitsAtMouse(mi.Location) - .Any(a => a.Info.Traits.Contains()) - ? "select" : "default"); + return c ?? "default"; } } }