diff --git a/OpenRA.Mods.Cnc/Traits/TDGunboat.cs b/OpenRA.Mods.Cnc/Traits/TDGunboat.cs index 35153139f9..f55dbb46c8 100644 --- a/OpenRA.Mods.Cnc/Traits/TDGunboat.cs +++ b/OpenRA.Mods.Cnc/Traits/TDGunboat.cs @@ -182,11 +182,15 @@ namespace OpenRA.Mods.Cnc.Traits public Activity MoveTo(CPos cell, int nearEnough) { return null; } public Activity MoveTo(CPos cell, Actor ignoreActor) { return null; } - public Activity MoveWithinRange(Target target, WDist range, Color? targetLineColor = null) { return null; } - public Activity MoveWithinRange(Target target, WDist minRange, WDist maxRange, Color? targetLineColor = null) { return null; } - public Activity MoveFollow(Actor self, Target target, WDist minRange, WDist maxRange, Color? targetLineColor = null) { return null; } + public Activity MoveWithinRange(Target target, WDist range, + WPos? initialTargetPosition = null, Color? targetLineColor = null) { return null; } + public Activity MoveWithinRange(Target target, WDist minRange, WDist maxRange, + WPos? initialTargetPosition = null, Color? targetLineColor = null) { return null; } + public Activity MoveFollow(Actor self, Target target, WDist minRange, WDist maxRange, + WPos? initialTargetPosition = null, Color? targetLineColor = null) { return null; } public Activity MoveIntoWorld(Actor self, CPos cell, SubCell subCell = SubCell.Any) { return null; } - public Activity MoveToTarget(Actor self, Target target, Color? targetLineColor = null) { return null; } + public Activity MoveToTarget(Actor self, Target target, + WPos? initialTargetPosition = null, Color? targetLineColor = null) { return null; } public Activity MoveIntoTarget(Actor self, Target target) { return null; } public Activity VisualMove(Actor self, WPos fromPos, WPos toPos) { return null; } diff --git a/OpenRA.Mods.Common/Activities/Air/Fly.cs b/OpenRA.Mods.Common/Activities/Air/Fly.cs index 32bfd71ff2..c2ca376ded 100644 --- a/OpenRA.Mods.Common/Activities/Air/Fly.cs +++ b/OpenRA.Mods.Common/Activities/Air/Fly.cs @@ -25,14 +25,15 @@ namespace OpenRA.Mods.Common.Activities readonly WDist minRange; bool soundPlayed; - public Fly(Actor self, Target t, Color? targetLineColor = null) + public Fly(Actor self, Target t, WPos? initialTargetPosition = null, Color? targetLineColor = null) { aircraft = self.Trait(); target = t; } - public Fly(Actor self, Target t, WDist minRange, WDist maxRange, Color? targetLineColor = null) - : this(self, t) + public Fly(Actor self, Target t, WDist minRange, WDist maxRange, + WPos? initialTargetPosition = null, Color? targetLineColor = null) + : this(self, t, initialTargetPosition, targetLineColor) { this.maxRange = maxRange; this.minRange = minRange; diff --git a/OpenRA.Mods.Common/Activities/Air/FlyFollow.cs b/OpenRA.Mods.Common/Activities/Air/FlyFollow.cs index ec10e1c9d0..7118ecbf09 100644 --- a/OpenRA.Mods.Common/Activities/Air/FlyFollow.cs +++ b/OpenRA.Mods.Common/Activities/Air/FlyFollow.cs @@ -24,7 +24,8 @@ namespace OpenRA.Mods.Common.Activities readonly Color? targetLineColor; Target target; - public FlyFollow(Actor self, Target target, WDist minRange, WDist maxRange, Color? targetLineColor = null) + public FlyFollow(Actor self, Target target, WDist minRange, WDist maxRange, + WPos? initialTargetPosition, Color? targetLineColor = null) { this.target = target; aircraft = self.Trait(); diff --git a/OpenRA.Mods.Common/Activities/Air/HeliFly.cs b/OpenRA.Mods.Common/Activities/Air/HeliFly.cs index be8dc80474..f101c17aa6 100644 --- a/OpenRA.Mods.Common/Activities/Air/HeliFly.cs +++ b/OpenRA.Mods.Common/Activities/Air/HeliFly.cs @@ -25,14 +25,15 @@ namespace OpenRA.Mods.Common.Activities readonly WDist minRange; bool soundPlayed; - public HeliFly(Actor self, Target t, Color? targetLineColor = null) + public HeliFly(Actor self, Target t, WPos? initialTargetPosition = null, Color? targetLineColor = null) { aircraft = self.Trait(); target = t; } - public HeliFly(Actor self, Target t, WDist minRange, WDist maxRange, Color? targetLineColor = null) - : this(self, t) + public HeliFly(Actor self, Target t, WDist minRange, WDist maxRange, + WPos? initialTargetPosition = null, Color? targetLineColor = null) + : this(self, t, initialTargetPosition, targetLineColor) { this.maxRange = maxRange; this.minRange = minRange; diff --git a/OpenRA.Mods.Common/Activities/Move/Follow.cs b/OpenRA.Mods.Common/Activities/Move/Follow.cs index ad44e74f6b..b8e740c64b 100644 --- a/OpenRA.Mods.Common/Activities/Move/Follow.cs +++ b/OpenRA.Mods.Common/Activities/Move/Follow.cs @@ -24,7 +24,8 @@ namespace OpenRA.Mods.Common.Activities readonly IMove move; readonly Color? targetLineColor; - public Follow(Actor self, Target target, WDist minRange, WDist maxRange, Color? targetLineColor = null) + public Follow(Actor self, Target target, WDist minRange, WDist maxRange, + WPos? initialTargetPosition, Color? targetLineColor = null) { this.target = target; this.minRange = minRange; diff --git a/OpenRA.Mods.Common/Activities/Move/MoveAdjacentTo.cs b/OpenRA.Mods.Common/Activities/Move/MoveAdjacentTo.cs index 3cecaaa76d..b3aa1b9d21 100644 --- a/OpenRA.Mods.Common/Activities/Move/MoveAdjacentTo.cs +++ b/OpenRA.Mods.Common/Activities/Move/MoveAdjacentTo.cs @@ -48,7 +48,7 @@ namespace OpenRA.Mods.Common.Activities Activity inner; bool repath; - public MoveAdjacentTo(Actor self, Target target, Color? targetLineColor = null) + public MoveAdjacentTo(Actor self, Target target, WPos? initialTargetPosition = null, Color? targetLineColor = null) { Target = target; @@ -56,7 +56,9 @@ namespace OpenRA.Mods.Common.Activities pathFinder = self.World.WorldActor.Trait(); domainIndex = self.World.WorldActor.Trait(); - if (target.IsValidFor(self)) + if (initialTargetPosition.HasValue) + targetPosition = self.World.Map.CellContaining(initialTargetPosition.Value); + else if (target.IsValidFor(self) && target.Actor.CanBeViewedByPlayer(self.Owner)) targetPosition = self.World.Map.CellContaining(target.CenterPosition); repath = true; diff --git a/OpenRA.Mods.Common/Activities/Move/MoveWithinRange.cs b/OpenRA.Mods.Common/Activities/Move/MoveWithinRange.cs index 39351c7b5a..bc99433da7 100644 --- a/OpenRA.Mods.Common/Activities/Move/MoveWithinRange.cs +++ b/OpenRA.Mods.Common/Activities/Move/MoveWithinRange.cs @@ -21,8 +21,9 @@ namespace OpenRA.Mods.Common.Activities readonly WDist maxRange; readonly WDist minRange; - public MoveWithinRange(Actor self, Target target, WDist minRange, WDist maxRange, Color? targetLineColor = null) - : base(self, target, targetLineColor) + public MoveWithinRange(Actor self, Target target, WDist minRange, WDist maxRange, + WPos? initialTargetPosition = null, Color? targetLineColor = null) + : base(self, target, initialTargetPosition, targetLineColor) { this.minRange = minRange; this.maxRange = maxRange; diff --git a/OpenRA.Mods.Common/Traits/Air/Aircraft.cs b/OpenRA.Mods.Common/Traits/Air/Aircraft.cs index 2a8ed1a5ea..d456afc305 100644 --- a/OpenRA.Mods.Common/Traits/Air/Aircraft.cs +++ b/OpenRA.Mods.Common/Traits/Air/Aircraft.cs @@ -605,28 +605,35 @@ namespace OpenRA.Mods.Common.Traits return new HeliFly(self, Target.FromCell(self.World, cell)); } - public Activity MoveWithinRange(Target target, WDist range, Color? targetLineColor = null) + public Activity MoveWithinRange(Target target, WDist range, + WPos? initialTargetPosition = null, Color? targetLineColor = null) { if (!Info.CanHover) - return new Fly(self, target, WDist.Zero, range, targetLineColor); + return new Fly(self, target, WDist.Zero, range, initialTargetPosition, targetLineColor); - return new HeliFly(self, target, WDist.Zero, range, targetLineColor); + return new HeliFly(self, target, WDist.Zero, range, initialTargetPosition, targetLineColor); } - public Activity MoveWithinRange(Target target, WDist minRange, WDist maxRange, Color? targetLineColor = null) + public Activity MoveWithinRange(Target target, WDist minRange, WDist maxRange, + WPos? initialTargetPosition = null, Color? targetLineColor = null) { if (!Info.CanHover) - return new Fly(self, target, minRange, maxRange, targetLineColor); + return new Fly(self, target, minRange, maxRange, + initialTargetPosition, targetLineColor); - return new HeliFly(self, target, minRange, maxRange, targetLineColor); + return new HeliFly(self, target, minRange, maxRange, + initialTargetPosition, targetLineColor); } - public Activity MoveFollow(Actor self, Target target, WDist minRange, WDist maxRange, Color? targetLineColor = null) + public Activity MoveFollow(Actor self, Target target, WDist minRange, WDist maxRange, + WPos? initialTargetPosition = null, Color? targetLineColor = null) { if (!Info.CanHover) - return new FlyFollow(self, target, minRange, maxRange, targetLineColor); + return new FlyFollow(self, target, minRange, maxRange, + initialTargetPosition, targetLineColor); - return new Follow(self, target, minRange, maxRange, targetLineColor); + return new Follow(self, target, minRange, maxRange, + initialTargetPosition, targetLineColor); } public Activity MoveIntoWorld(Actor self, CPos cell, SubCell subCell = SubCell.Any) @@ -637,12 +644,16 @@ namespace OpenRA.Mods.Common.Traits return new HeliFly(self, Target.FromCell(self.World, cell, subCell)); } - public Activity MoveToTarget(Actor self, Target target, Color? targetLineColor = null) + public Activity MoveToTarget(Actor self, Target target, + WPos? initialTargetPosition = null, Color? targetLineColor = null) { if (!Info.CanHover) - return new Fly(self, target, WDist.FromCells(3), WDist.FromCells(5), targetLineColor); + return new Fly(self, target, WDist.FromCells(3), WDist.FromCells(5), + initialTargetPosition, targetLineColor); - return ActivityUtils.SequenceActivities(new HeliFly(self, target, targetLineColor), new Turn(self, Info.InitialFacing)); + return ActivityUtils.SequenceActivities( + new HeliFly(self, target, initialTargetPosition, targetLineColor), + new Turn(self, Info.InitialFacing)); } public Activity MoveIntoTarget(Actor self, Target target) diff --git a/OpenRA.Mods.Common/Traits/Mobile.cs b/OpenRA.Mods.Common/Traits/Mobile.cs index 5ae57c273f..68ec3b8f28 100644 --- a/OpenRA.Mods.Common/Traits/Mobile.cs +++ b/OpenRA.Mods.Common/Traits/Mobile.cs @@ -467,19 +467,22 @@ namespace OpenRA.Mods.Common.Traits return new Move(self, cell, WDist.Zero, ignoreActor); } - public Activity MoveWithinRange(Target target, WDist range, Color? targetLineColor = null) + public Activity MoveWithinRange(Target target, WDist range, + WPos? initialTargetPosition = null, Color? targetLineColor = null) { - return new MoveWithinRange(self, target, WDist.Zero, range, targetLineColor); + return new MoveWithinRange(self, target, WDist.Zero, range, initialTargetPosition, targetLineColor); } - public Activity MoveWithinRange(Target target, WDist minRange, WDist maxRange, Color? targetLineColor = null) + public Activity MoveWithinRange(Target target, WDist minRange, WDist maxRange, + WPos? initialTargetPosition = null, Color? targetLineColor = null) { - return new MoveWithinRange(self, target, minRange, maxRange, targetLineColor); + return new MoveWithinRange(self, target, minRange, maxRange, initialTargetPosition, targetLineColor); } - public Activity MoveFollow(Actor self, Target target, WDist minRange, WDist maxRange, Color? targetLineColor = null) + public Activity MoveFollow(Actor self, Target target, WDist minRange, WDist maxRange, + WPos? initialTargetPosition = null, Color? targetLineColor = null) { - return new Follow(self, target, minRange, maxRange, targetLineColor); + return new Follow(self, target, minRange, maxRange, initialTargetPosition, targetLineColor); } public Activity MoveIntoWorld(Actor self, CPos cell, SubCell subCell = SubCell.Any) @@ -500,12 +503,13 @@ namespace OpenRA.Mods.Common.Traits return VisualMove(self, pos, self.World.Map.CenterOfSubCell(cell, subCell), cell); } - public Activity MoveToTarget(Actor self, Target target, Color? targetLineColor = null) + public Activity MoveToTarget(Actor self, Target target, + WPos? initialTargetPosition = null, Color? targetLineColor = null) { if (target.Type == TargetType.Invalid) return null; - return new MoveAdjacentTo(self, target, targetLineColor); + return new MoveAdjacentTo(self, target, initialTargetPosition, targetLineColor); } public Activity MoveIntoTarget(Actor self, Target target) diff --git a/OpenRA.Mods.Common/TraitsInterfaces.cs b/OpenRA.Mods.Common/TraitsInterfaces.cs index e043e2b1b8..0e1e5fd001 100644 --- a/OpenRA.Mods.Common/TraitsInterfaces.cs +++ b/OpenRA.Mods.Common/TraitsInterfaces.cs @@ -397,11 +397,15 @@ namespace OpenRA.Mods.Common.Traits { Activity MoveTo(CPos cell, int nearEnough); Activity MoveTo(CPos cell, Actor ignoreActor); - Activity MoveWithinRange(Target target, WDist range, Color? targetLineColor = null); - Activity MoveWithinRange(Target target, WDist minRange, WDist maxRange, Color? targetLineColor = null); - Activity MoveFollow(Actor self, Target target, WDist minRange, WDist maxRange, Color? targetLineColor = null); + Activity MoveWithinRange(Target target, WDist range, + WPos? initialTargetPosition = null, Color? targetLineColor = null); + Activity MoveWithinRange(Target target, WDist minRange, WDist maxRange, + WPos? initialTargetPosition = null, Color? targetLineColor = null); + Activity MoveFollow(Actor self, Target target, WDist minRange, WDist maxRange, + WPos? initialTargetPosition = null, Color? targetLineColor = null); + Activity MoveToTarget(Actor self, Target target, + WPos? initialTargetPosition = null, Color? targetLineColor = null); Activity MoveIntoWorld(Actor self, CPos cell, SubCell subCell = SubCell.Any); - Activity MoveToTarget(Actor self, Target target, Color? targetLineColor = null); Activity MoveIntoTarget(Actor self, Target target); Activity VisualMove(Actor self, WPos fromPos, WPos toPos); int EstimatedMoveDuration(Actor self, WPos fromPos, WPos toPos);