From acab6f1f4ba575e4cbc1d095a56e063227c071de Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Sat, 9 Apr 2016 11:59:54 -0400 Subject: [PATCH] Fix custom order generators for left-click targeting. --- OpenRA.Game/Orders/GenericSelectTarget.cs | 6 ++++++ OpenRA.Game/Orders/UnitOrderGenerator.cs | 17 ++++++++++++++--- OpenRA.Game/Traits/TraitsInterfaces.cs | 2 +- .../Widgets/WorldInteractionControllerWidget.cs | 6 ++---- .../Orders/AircraftMoveOrderTargeter.cs | 5 ++++- .../Orders/DeployOrderTargeter.cs | 2 +- OpenRA.Mods.Common/Orders/UnitOrderTargeter.cs | 2 +- OpenRA.Mods.Common/Traits/Attack/AttackBase.cs | 2 +- .../Traits/Buildings/RallyPoint.cs | 2 +- OpenRA.Mods.Common/Traits/Harvester.cs | 2 +- OpenRA.Mods.Common/Traits/Mobile.cs | 5 ++++- OpenRA.Mods.RA/Traits/Minelayer.cs | 2 +- OpenRA.Mods.RA/Traits/PortableChrono.cs | 2 +- 13 files changed, 38 insertions(+), 17 deletions(-) diff --git a/OpenRA.Game/Orders/GenericSelectTarget.cs b/OpenRA.Game/Orders/GenericSelectTarget.cs index 1f8b81f667..a740c80d6b 100644 --- a/OpenRA.Game/Orders/GenericSelectTarget.cs +++ b/OpenRA.Game/Orders/GenericSelectTarget.cs @@ -58,5 +58,11 @@ namespace OpenRA.Orders { return world.Map.Contains(cell) ? Cursor : "generic-blocked"; } + + public override bool InputOverridesSelection(World world, int2 xy, MouseInput mi) + { + // Custom order generators always override selection + return true; + } } } diff --git a/OpenRA.Game/Orders/UnitOrderGenerator.cs b/OpenRA.Game/Orders/UnitOrderGenerator.cs index 7f1712cb8a..406a63ae02 100644 --- a/OpenRA.Game/Orders/UnitOrderGenerator.cs +++ b/OpenRA.Game/Orders/UnitOrderGenerator.cs @@ -83,7 +83,7 @@ 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) + public virtual bool InputOverridesSelection(World world, int2 xy, MouseInput mi) { var actor = world.ScreenMap.ActorsAt(xy).WithHighestSelectionPriority(xy); if (actor == null) @@ -95,8 +95,19 @@ namespace OpenRA.Orders var underCursor = world.Selection.Actors.WithHighestSelectionPriority(xy); var o = OrderForUnit(underCursor, target, actorsAt, cell, mi); - if (o != null && o.Order.OverrideSelection) - return true; + if (o != null) + { + var modifiers = TargetModifiers.None; + if (mi.Modifiers.HasModifier(Modifiers.Ctrl)) + modifiers |= TargetModifiers.ForceAttack; + if (mi.Modifiers.HasModifier(Modifiers.Shift)) + modifiers |= TargetModifiers.ForceQueue; + if (mi.Modifiers.HasModifier(Modifiers.Alt)) + modifiers |= TargetModifiers.ForceMove; + + if (o.Order.TargetOverridesSelection(modifiers)) + return true; + } return false; } diff --git a/OpenRA.Game/Traits/TraitsInterfaces.cs b/OpenRA.Game/Traits/TraitsInterfaces.cs index c6db694f5b..ab349f54b4 100644 --- a/OpenRA.Game/Traits/TraitsInterfaces.cs +++ b/OpenRA.Game/Traits/TraitsInterfaces.cs @@ -108,7 +108,7 @@ namespace OpenRA.Traits int OrderPriority { get; } bool CanTarget(Actor self, Target target, List othersAtTarget, ref TargetModifiers modifiers, ref string cursor); bool IsQueued { get; } - bool OverrideSelection { get; } + bool TargetOverridesSelection(TargetModifiers modifiers); } public interface IResolveOrder { void ResolveOrder(Actor self, Order order); } diff --git a/OpenRA.Game/Widgets/WorldInteractionControllerWidget.cs b/OpenRA.Game/Widgets/WorldInteractionControllerWidget.cs index 2333cb39c1..8954690abd 100644 --- a/OpenRA.Game/Widgets/WorldInteractionControllerWidget.cs +++ b/OpenRA.Game/Widgets/WorldInteractionControllerWidget.cs @@ -103,10 +103,8 @@ namespace OpenRA.Widgets var selectableActor = World.ScreenMap.ActorsAt(mousePos).Any(x => x.Info.HasTraitInfo() && (x.Owner.IsAlliedWith(World.RenderPlayer) || !World.FogObscures(x))); - var ignoreSelection = mi.Modifiers.HasModifier(Modifiers.Ctrl) || mi.Modifiers.HasModifier(Modifiers.Alt) || - UnitOrderGenerator.InputOverridesSelection(World, mousePos, mi); - - if (ignoreSelection || !selectableActor) + var uog = (UnitOrderGenerator)World.OrderGenerator; + if (!selectableActor || uog.InputOverridesSelection(World, mousePos, mi)) { // Order units instead of selecting ApplyOrders(World, mi); diff --git a/OpenRA.Mods.Common/Orders/AircraftMoveOrderTargeter.cs b/OpenRA.Mods.Common/Orders/AircraftMoveOrderTargeter.cs index cc2d450a54..52daa80ab5 100644 --- a/OpenRA.Mods.Common/Orders/AircraftMoveOrderTargeter.cs +++ b/OpenRA.Mods.Common/Orders/AircraftMoveOrderTargeter.cs @@ -19,7 +19,10 @@ namespace OpenRA.Mods.Common.Orders { public string OrderID { get { return "Move"; } } public int OrderPriority { get { return 4; } } - public bool OverrideSelection { get { return false; } } + public bool TargetOverridesSelection(TargetModifiers modifiers) + { + return modifiers.HasModifier(TargetModifiers.ForceMove); + } readonly AircraftInfo info; diff --git a/OpenRA.Mods.Common/Orders/DeployOrderTargeter.cs b/OpenRA.Mods.Common/Orders/DeployOrderTargeter.cs index 8c64f0413c..68113c6a88 100644 --- a/OpenRA.Mods.Common/Orders/DeployOrderTargeter.cs +++ b/OpenRA.Mods.Common/Orders/DeployOrderTargeter.cs @@ -33,7 +33,7 @@ namespace OpenRA.Mods.Common.Orders public string OrderID { get; private set; } public int OrderPriority { get; private set; } - public bool OverrideSelection { get { return true; } } + public bool TargetOverridesSelection(TargetModifiers modifiers) { return true; } public bool CanTarget(Actor self, Target target, List othersAtTarget, ref TargetModifiers modifiers, ref string cursor) { diff --git a/OpenRA.Mods.Common/Orders/UnitOrderTargeter.cs b/OpenRA.Mods.Common/Orders/UnitOrderTargeter.cs index 7c92652766..637f38a27e 100644 --- a/OpenRA.Mods.Common/Orders/UnitOrderTargeter.cs +++ b/OpenRA.Mods.Common/Orders/UnitOrderTargeter.cs @@ -31,7 +31,7 @@ namespace OpenRA.Mods.Common.Orders public string OrderID { get; private set; } public int OrderPriority { get; private set; } public bool? ForceAttack = null; - public bool OverrideSelection { get { return true; } } + public bool TargetOverridesSelection(TargetModifiers modifiers) { return true; } public abstract bool CanTargetActor(Actor self, Actor target, TargetModifiers modifiers, ref string cursor); public abstract bool CanTargetFrozenActor(Actor self, FrozenActor target, TargetModifiers modifiers, ref string cursor); diff --git a/OpenRA.Mods.Common/Traits/Attack/AttackBase.cs b/OpenRA.Mods.Common/Traits/Attack/AttackBase.cs index 7697983380..a50e61a309 100644 --- a/OpenRA.Mods.Common/Traits/Attack/AttackBase.cs +++ b/OpenRA.Mods.Common/Traits/Attack/AttackBase.cs @@ -309,7 +309,7 @@ namespace OpenRA.Mods.Common.Traits public string OrderID { get; private set; } public int OrderPriority { get; private set; } - public bool OverrideSelection { get { return true; } } + public bool TargetOverridesSelection(TargetModifiers modifiers) { return true; } bool CanTargetActor(Actor self, Target target, ref TargetModifiers modifiers, ref string cursor) { diff --git a/OpenRA.Mods.Common/Traits/Buildings/RallyPoint.cs b/OpenRA.Mods.Common/Traits/Buildings/RallyPoint.cs index 4af326d87a..8eb2b284d2 100644 --- a/OpenRA.Mods.Common/Traits/Buildings/RallyPoint.cs +++ b/OpenRA.Mods.Common/Traits/Buildings/RallyPoint.cs @@ -88,7 +88,7 @@ namespace OpenRA.Mods.Common.Traits { public string OrderID { get { return "SetRallyPoint"; } } public int OrderPriority { get { return 0; } } - public bool OverrideSelection { get { return true; } } + public bool TargetOverridesSelection(TargetModifiers modifiers) { return true; } public bool CanTarget(Actor self, Target target, List othersAtTarget, ref TargetModifiers modifiers, ref string cursor) { diff --git a/OpenRA.Mods.Common/Traits/Harvester.cs b/OpenRA.Mods.Common/Traits/Harvester.cs index 184364c980..e7fa19b4a5 100644 --- a/OpenRA.Mods.Common/Traits/Harvester.cs +++ b/OpenRA.Mods.Common/Traits/Harvester.cs @@ -452,7 +452,7 @@ namespace OpenRA.Mods.Common.Traits public string OrderID { get { return "Harvest"; } } public int OrderPriority { get { return 10; } } public bool IsQueued { get; protected set; } - public bool OverrideSelection { get { return true; } } + public bool TargetOverridesSelection(TargetModifiers modifiers) { return true; } public bool CanTarget(Actor self, Target target, List othersAtTarget, ref TargetModifiers modifiers, ref string cursor) { diff --git a/OpenRA.Mods.Common/Traits/Mobile.cs b/OpenRA.Mods.Common/Traits/Mobile.cs index 7166f0fea1..0a3cd8c0ee 100644 --- a/OpenRA.Mods.Common/Traits/Mobile.cs +++ b/OpenRA.Mods.Common/Traits/Mobile.cs @@ -720,7 +720,10 @@ namespace OpenRA.Mods.Common.Traits { readonly Mobile mobile; readonly bool rejectMove; - public bool OverrideSelection { get { return false; } } + public bool TargetOverridesSelection(TargetModifiers modifiers) + { + return modifiers.HasModifier(TargetModifiers.ForceMove); + } public MoveOrderTargeter(Actor self, Mobile unit) { diff --git a/OpenRA.Mods.RA/Traits/Minelayer.cs b/OpenRA.Mods.RA/Traits/Minelayer.cs index ab933a47a8..ee7bb034a3 100644 --- a/OpenRA.Mods.RA/Traits/Minelayer.cs +++ b/OpenRA.Mods.RA/Traits/Minelayer.cs @@ -201,7 +201,7 @@ namespace OpenRA.Mods.RA.Traits { public string OrderID { get { return "BeginMinefield"; } } public int OrderPriority { get { return 5; } } - public bool OverrideSelection { get { return true; } } + public bool TargetOverridesSelection(TargetModifiers modifiers) { return true; } public bool CanTarget(Actor self, Target target, List othersAtTarget, ref TargetModifiers modifiers, ref string cursor) { diff --git a/OpenRA.Mods.RA/Traits/PortableChrono.cs b/OpenRA.Mods.RA/Traits/PortableChrono.cs index 35be7ea19a..c0a2f9e98c 100644 --- a/OpenRA.Mods.RA/Traits/PortableChrono.cs +++ b/OpenRA.Mods.RA/Traits/PortableChrono.cs @@ -119,7 +119,7 @@ namespace OpenRA.Mods.RA.Traits public string OrderID { get { return "PortableChronoTeleport"; } } public int OrderPriority { get { return 5; } } public bool IsQueued { get; protected set; } - public bool OverrideSelection { get { return true; } } + public bool TargetOverridesSelection(TargetModifiers modifiers) { return true; } public bool CanTarget(Actor self, Target target, List othersAtTarget, ref TargetModifiers modifiers, ref string cursor) {