Remove ActorMap query for each actor.

This commit is contained in:
Paul Chote
2015-11-26 18:30:43 +00:00
parent 7b31f18046
commit fb99a1f3c2

View File

@@ -39,8 +39,9 @@ namespace OpenRA.Orders
public IEnumerable<Order> Order(World world, CPos xy, MouseInput mi) public IEnumerable<Order> Order(World world, CPos xy, MouseInput mi)
{ {
var target = TargetForInput(world, xy, mi); var target = TargetForInput(world, xy, mi);
var actorsAt = world.ActorMap.GetActorsAt(xy).ToList();
var orders = world.Selection.Actors var orders = world.Selection.Actors
.Select(a => OrderForUnit(a, target, mi)) .Select(a => OrderForUnit(a, target, actorsAt, mi))
.Where(o => o != null) .Where(o => o != null)
.ToList(); .ToList();
@@ -65,12 +66,14 @@ namespace OpenRA.Orders
{ {
var useSelect = false; var useSelect = false;
var target = TargetForInput(world, xy, mi); var target = TargetForInput(world, xy, mi);
var actorsAt = world.ActorMap.GetActorsAt(xy).ToList();
if (target.Type == TargetType.Actor && target.Actor.Info.HasTraitInfo<SelectableInfo>() && if (target.Type == TargetType.Actor && target.Actor.Info.HasTraitInfo<SelectableInfo>() &&
(mi.Modifiers.HasModifier(Modifiers.Shift) || !world.Selection.Actors.Any())) (mi.Modifiers.HasModifier(Modifiers.Shift) || !world.Selection.Actors.Any()))
useSelect = true; useSelect = true;
var ordersWithCursor = world.Selection.Actors 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); .Where(o => o != null && o.Cursor != null);
var cursorOrder = ordersWithCursor.MaxByOrDefault(o => o.Order.OrderPriority); 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 // 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) 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 underCursor = world.Selection.Actors.WithHighestSelectionPriority();
var o = OrderForUnit(underCursor, target, mi); var o = OrderForUnit(underCursor, target, actorsAt, mi);
if (o != null && o.Order.OverrideSelection) if (o != null && o.Order.OverrideSelection)
return false; return false;
return true; return true;
} }
static UnitOrderResult OrderForUnit(Actor self, Target target, MouseInput mi) static UnitOrderResult OrderForUnit(Actor self, Target target, List<Actor> actorsAt, MouseInput mi)
{ {
if (mi.Button != Game.Settings.Game.MouseButtonPreference.Action) if (mi.Button != Game.Settings.Game.MouseButtonPreference.Action)
return null; return null;
@@ -113,8 +122,6 @@ namespace OpenRA.Orders
if (mi.Modifiers.HasModifier(Modifiers.Alt)) if (mi.Modifiers.HasModifier(Modifiers.Alt))
modifiers |= TargetModifiers.ForceMove; modifiers |= TargetModifiers.ForceMove;
var actorsAt = self.World.ActorMap.GetActorsAt(self.World.Map.CellContaining(target.CenterPosition)).ToList();
foreach (var o in self.TraitsImplementing<IIssueOrder>() foreach (var o in self.TraitsImplementing<IIssueOrder>()
.SelectMany(trait => trait.Orders .SelectMany(trait => trait.Orders
.Select(x => new { Trait = trait, Order = x })) .Select(x => new { Trait = trait, Order = x }))