diff --git a/OpenRA.Mods.Common/Activities/Attack.cs b/OpenRA.Mods.Common/Activities/Attack.cs index 8b450dda13..af11e47cd9 100644 --- a/OpenRA.Mods.Common/Activities/Attack.cs +++ b/OpenRA.Mods.Common/Activities/Attack.cs @@ -100,8 +100,9 @@ namespace OpenRA.Mods.Common.Activities minRange = armaments.Max(a => a.Weapon.MinRange); maxRange = armaments.Min(a => a.MaxRange()); + var pos = self.CenterPosition; var mobile = move as Mobile; - if (!Target.IsInRange(self.CenterPosition, maxRange) || Target.IsInRange(self.CenterPosition, minRange) + if (!Target.IsInRange(pos, maxRange) || Target.IsInRange(pos, minRange) || (mobile != null && !mobile.CanInteractWithGroundLayer(self))) { // Try to move within range, drop the target otherwise @@ -113,7 +114,8 @@ namespace OpenRA.Mods.Common.Activities return NextActivity; } - var desiredFacing = (Target.CenterPosition - self.CenterPosition).Yaw.Facing; + var targetedPosition = Target.Positions.PositionClosestTo(pos); + var desiredFacing = (targetedPosition - pos).Yaw.Facing; if (facing.Facing != desiredFacing) { attackStatus |= AttackStatus.NeedsToTurn; diff --git a/OpenRA.Mods.Common/Traits/Attack/AttackFrontal.cs b/OpenRA.Mods.Common/Traits/Attack/AttackFrontal.cs index f8ff0c9c35..ba0f27f032 100644 --- a/OpenRA.Mods.Common/Traits/Attack/AttackFrontal.cs +++ b/OpenRA.Mods.Common/Traits/Attack/AttackFrontal.cs @@ -39,7 +39,9 @@ namespace OpenRA.Mods.Common.Traits return false; var f = facing.Facing; - var delta = target.CenterPosition - self.CenterPosition; + var pos = self.CenterPosition; + var targetedPosition = target.Positions.PositionClosestTo(pos); + var delta = targetedPosition - pos; var facingToTarget = delta.HorizontalLengthSquared != 0 ? delta.Yaw.Facing : f; if (Math.Abs(facingToTarget - f) % 256 > info.FacingTolerance) diff --git a/OpenRA.Mods.Common/Traits/Attack/AttackGarrisoned.cs b/OpenRA.Mods.Common/Traits/Attack/AttackGarrisoned.cs index fafddd3566..01448c5d33 100644 --- a/OpenRA.Mods.Common/Traits/Attack/AttackGarrisoned.cs +++ b/OpenRA.Mods.Common/Traits/Attack/AttackGarrisoned.cs @@ -146,7 +146,8 @@ namespace OpenRA.Mods.Common.Traits return; var pos = self.CenterPosition; - var targetYaw = (target.CenterPosition - self.CenterPosition).Yaw; + var targetedPosition = target.Positions.PositionClosestTo(pos); + var targetYaw = (targetedPosition - pos).Yaw; foreach (var a in Armaments) { diff --git a/OpenRA.Mods.Common/Traits/Turreted.cs b/OpenRA.Mods.Common/Traits/Turreted.cs index 5c93b25438..af43949202 100644 --- a/OpenRA.Mods.Common/Traits/Turreted.cs +++ b/OpenRA.Mods.Common/Traits/Turreted.cs @@ -130,7 +130,8 @@ namespace OpenRA.Mods.Common.Traits if (self.IsDisabled()) return false; - var delta = target.CenterPosition - self.CenterPosition; + var pos = self.CenterPosition; + var delta = target.Positions.PositionClosestTo(pos) - pos; DesiredFacing = delta.HorizontalLengthSquared != 0 ? delta.Yaw.Facing : TurretFacing; MoveTurret(); return HasAchievedDesiredFacing;