diff --git a/OpenRA.Mods.Common/Activities/Attack.cs b/OpenRA.Mods.Common/Activities/Attack.cs index af11e47cd9..20ca4ed63c 100644 --- a/OpenRA.Mods.Common/Activities/Attack.cs +++ b/OpenRA.Mods.Common/Activities/Attack.cs @@ -114,7 +114,7 @@ namespace OpenRA.Mods.Common.Activities return NextActivity; } - var targetedPosition = Target.Positions.PositionClosestTo(pos); + var targetedPosition = attack.Info.AttackTargetCenter ? Target.CenterPosition : Target.Positions.PositionClosestTo(pos); var desiredFacing = (targetedPosition - pos).Yaw.Facing; if (facing.Facing != desiredFacing) { diff --git a/OpenRA.Mods.Common/Traits/Armament.cs b/OpenRA.Mods.Common/Traits/Armament.cs index ecbbbce541..b4c2e471ad 100644 --- a/OpenRA.Mods.Common/Traits/Armament.cs +++ b/OpenRA.Mods.Common/Traits/Armament.cs @@ -102,6 +102,8 @@ namespace OpenRA.Mods.Common.Traits public readonly Barrel[] Barrels; readonly Actor self; + readonly AttackBase[] attackTraits; + AttackBase attack; Turreted turret; AmmoPool ammoPool; BodyOrientation coords; @@ -134,6 +136,7 @@ namespace OpenRA.Mods.Common.Traits barrels.Add(new Barrel { Offset = WVec.Zero, Yaw = WAngle.Zero }); Barrels = barrels.ToArray(); + attackTraits = self.TraitsImplementing().Where(a => a.Info.Armaments.Contains(Info.Name)).ToArray(); } public virtual WDist MaxRange() @@ -190,6 +193,10 @@ namespace OpenRA.Mods.Common.Traits // The world coordinate model uses Actor.Orientation public virtual Barrel CheckFire(Actor self, IFacing facing, Target target) { + attack = attackTraits.FirstOrDefault(Exts.IsTraitEnabled); + if (attack == null) + return null; + if (IsReloading) return null; @@ -229,7 +236,7 @@ namespace OpenRA.Mods.Common.Traits Source = muzzlePosition(), CurrentSource = muzzlePosition, SourceActor = self, - PassiveTarget = target.Positions.PositionClosestTo(muzzlePosition()), + PassiveTarget = attack.Info.AttackTargetCenter ? target.CenterPosition : target.Positions.PositionClosestTo(muzzlePosition()), GuidedTarget = target }; diff --git a/OpenRA.Mods.Common/Traits/Attack/AttackBase.cs b/OpenRA.Mods.Common/Traits/Attack/AttackBase.cs index 58d4391307..6749ec6d8e 100644 --- a/OpenRA.Mods.Common/Traits/Attack/AttackBase.cs +++ b/OpenRA.Mods.Common/Traits/Attack/AttackBase.cs @@ -24,6 +24,9 @@ namespace OpenRA.Mods.Common.Traits [Desc("Armament names")] public readonly string[] Armaments = { "primary", "secondary" }; + [Desc("Attack the target's center, instead of the closest targetable offset.")] + public readonly bool AttackTargetCenter = false; + public readonly string Cursor = null; public readonly string OutsideRangeCursor = null; diff --git a/OpenRA.Mods.Common/Traits/Attack/AttackFrontal.cs b/OpenRA.Mods.Common/Traits/Attack/AttackFrontal.cs index ba0f27f032..b516eea19b 100644 --- a/OpenRA.Mods.Common/Traits/Attack/AttackFrontal.cs +++ b/OpenRA.Mods.Common/Traits/Attack/AttackFrontal.cs @@ -40,7 +40,7 @@ namespace OpenRA.Mods.Common.Traits var f = facing.Facing; var pos = self.CenterPosition; - var targetedPosition = target.Positions.PositionClosestTo(pos); + var targetedPosition = Info.AttackTargetCenter ? target.CenterPosition : target.Positions.PositionClosestTo(pos); var delta = targetedPosition - pos; var facingToTarget = delta.HorizontalLengthSquared != 0 ? delta.Yaw.Facing : f; diff --git a/OpenRA.Mods.Common/Traits/Attack/AttackGarrisoned.cs b/OpenRA.Mods.Common/Traits/Attack/AttackGarrisoned.cs index 01448c5d33..2bd34d93cc 100644 --- a/OpenRA.Mods.Common/Traits/Attack/AttackGarrisoned.cs +++ b/OpenRA.Mods.Common/Traits/Attack/AttackGarrisoned.cs @@ -146,7 +146,7 @@ namespace OpenRA.Mods.Common.Traits return; var pos = self.CenterPosition; - var targetedPosition = target.Positions.PositionClosestTo(pos); + var targetedPosition = Info.AttackTargetCenter ? target.CenterPosition : 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 af43949202..c94a589c94 100644 --- a/OpenRA.Mods.Common/Traits/Turreted.cs +++ b/OpenRA.Mods.Common/Traits/Turreted.cs @@ -131,7 +131,8 @@ namespace OpenRA.Mods.Common.Traits return false; var pos = self.CenterPosition; - var delta = target.Positions.PositionClosestTo(pos) - pos; + var targetPos = attack != null && attack.Info.AttackTargetCenter ? target.CenterPosition : target.Positions.PositionClosestTo(pos); + var delta = targetPos - pos; DesiredFacing = delta.HorizontalLengthSquared != 0 ? delta.Yaw.Facing : TurretFacing; MoveTurret(); return HasAchievedDesiredFacing;