From fb99a1f3c265bfc85ad2aa099291809c5845b650 Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Thu, 26 Nov 2015 18:30:43 +0000 Subject: [PATCH] Remove ActorMap query for each actor. --- OpenRA.Game/Orders/UnitOrderGenerator.cs | 21 ++++++++++++++------- 1 file changed, 14 insertions(+), 7 deletions(-) diff --git a/OpenRA.Game/Orders/UnitOrderGenerator.cs b/OpenRA.Game/Orders/UnitOrderGenerator.cs index 198b8fc0dd..02e7113d42 100644 --- a/OpenRA.Game/Orders/UnitOrderGenerator.cs +++ b/OpenRA.Game/Orders/UnitOrderGenerator.cs @@ -39,8 +39,9 @@ namespace OpenRA.Orders public IEnumerable Order(World world, CPos xy, MouseInput mi) { var target = TargetForInput(world, xy, mi); + var actorsAt = world.ActorMap.GetActorsAt(xy).ToList(); var orders = world.Selection.Actors - .Select(a => OrderForUnit(a, target, mi)) + .Select(a => OrderForUnit(a, target, actorsAt, mi)) .Where(o => o != null) .ToList(); @@ -65,12 +66,14 @@ namespace OpenRA.Orders { var useSelect = false; var target = TargetForInput(world, xy, mi); + var actorsAt = world.ActorMap.GetActorsAt(xy).ToList(); + if (target.Type == TargetType.Actor && target.Actor.Info.HasTraitInfo() && (mi.Modifiers.HasModifier(Modifiers.Shift) || !world.Selection.Actors.Any())) useSelect = true; var ordersWithCursor = world.Selection.Actors - .Select(a => OrderForUnit(a, target, mi)) + .Select(a => OrderForUnit(a, target, actorsAt, mi)) .Where(o => o != null && o.Cursor != null); var cursorOrder = ordersWithCursor.MaxByOrDefault(o => o.Order.OrderPriority); @@ -81,17 +84,23 @@ namespace OpenRA.Orders // Used for classic mouse orders, determines whether or not action at xy is move or select public static bool InputOverridesSelection(World world, int2 xy, MouseInput mi) { - var target = Target.FromActor(world.ScreenMap.ActorsAt(xy).WithHighestSelectionPriority()); + var actor = world.ScreenMap.ActorsAt(xy).WithHighestSelectionPriority(); + if (actor == null) + return true; + + var target = Target.FromActor(actor); + var cell = world.Map.CellContaining(target.CenterPosition); + var actorsAt = world.ActorMap.GetActorsAt(cell).ToList(); var underCursor = world.Selection.Actors.WithHighestSelectionPriority(); - var o = OrderForUnit(underCursor, target, mi); + var o = OrderForUnit(underCursor, target, actorsAt, mi); if (o != null && o.Order.OverrideSelection) return false; return true; } - static UnitOrderResult OrderForUnit(Actor self, Target target, MouseInput mi) + static UnitOrderResult OrderForUnit(Actor self, Target target, List actorsAt, MouseInput mi) { if (mi.Button != Game.Settings.Game.MouseButtonPreference.Action) return null; @@ -113,8 +122,6 @@ namespace OpenRA.Orders if (mi.Modifiers.HasModifier(Modifiers.Alt)) modifiers |= TargetModifiers.ForceMove; - var actorsAt = self.World.ActorMap.GetActorsAt(self.World.Map.CellContaining(target.CenterPosition)).ToList(); - foreach (var o in self.TraitsImplementing() .SelectMany(trait => trait.Orders .Select(x => new { Trait = trait, Order = x }))