diff --git a/OpenRA.Mods.Common/Traits/Attack/AttackTurreted.cs b/OpenRA.Mods.Common/Traits/Attack/AttackTurreted.cs index 13a5a344c5..9bbfe39754 100644 --- a/OpenRA.Mods.Common/Traits/Attack/AttackTurreted.cs +++ b/OpenRA.Mods.Common/Traits/Attack/AttackTurreted.cs @@ -17,6 +17,9 @@ namespace OpenRA.Mods.Common.Traits [Desc("Actor has a visual turret used to attack.")] public class AttackTurretedInfo : AttackFollowInfo, Requires { + [Desc("Turret names")] + public readonly string[] Turrets = { "primary" }; + public override object Create(ActorInitializer init) { return new AttackTurreted(init.Self, this); } } @@ -27,7 +30,7 @@ namespace OpenRA.Mods.Common.Traits public AttackTurreted(Actor self, AttackTurretedInfo info) : base(self, info) { - turrets = self.TraitsImplementing().ToArray(); + turrets = self.TraitsImplementing().Where(t => info.Turrets.Contains(t.Info.Turret)).ToArray(); } protected override bool CanAttack(Actor self, Target target) diff --git a/OpenRA.Mods.Common/Traits/Turreted.cs b/OpenRA.Mods.Common/Traits/Turreted.cs index e460e07afb..187991db6e 100644 --- a/OpenRA.Mods.Common/Traits/Turreted.cs +++ b/OpenRA.Mods.Common/Traits/Turreted.cs @@ -11,6 +11,7 @@ using System; using System.Collections.Generic; +using System.Linq; using OpenRA.Primitives; using OpenRA.Traits; @@ -42,7 +43,7 @@ namespace OpenRA.Mods.Common.Traits public class Turreted : ITick, ISync, INotifyCreated, IDeathActorInitModifier, IActorPreviewInitModifier { - readonly TurretedInfo info; + public readonly TurretedInfo Info; AttackTurreted attack; IFacing facing; BodyOrientation body; @@ -55,8 +56,8 @@ namespace OpenRA.Mods.Common.Traits // For subclasses that want to move the turret relative to the body protected WVec localOffset = WVec.Zero; - public WVec Offset { get { return info.Offset + localOffset; } } - public string Name { get { return info.Turret; } } + public WVec Offset { get { return Info.Offset + localOffset; } } + public string Name { get { return Info.Turret; } } public static Func TurretFacingFromInit(IActorInitializer init, int def, string turret = null) { @@ -94,13 +95,13 @@ namespace OpenRA.Mods.Common.Traits public Turreted(ActorInitializer init, TurretedInfo info) { - this.info = info; - TurretFacing = TurretFacingFromInit(init, info.InitialFacing, info.Turret)(); + Info = info; + TurretFacing = TurretFacingFromInit(init, Info.InitialFacing, Info.Turret)(); } void INotifyCreated.Created(Actor self) { - attack = self.TraitOrDefault(); + attack = self.TraitsImplementing().SingleOrDefault(at => ((AttackTurretedInfo)at.Info).Turrets.Contains(Info.Turret)); facing = self.TraitOrDefault(); body = self.Trait(); } @@ -115,15 +116,16 @@ namespace OpenRA.Mods.Common.Traits // NOTE: FaceTarget is called in AttackTurreted.CanAttack if the turret has a target. if (attack != null) { - if (!attack.IsAttacking) - { - if (realignTick < info.RealignDelay) - realignTick++; - else if (info.RealignDelay > -1) - DesiredFacing = null; + // Only realign while not attacking anything + if (attack.IsAttacking) + return; - MoveTurret(); - } + if (realignTick < Info.RealignDelay) + realignTick++; + else if (Info.RealignDelay > -1) + DesiredFacing = null; + + MoveTurret(); } else { @@ -135,16 +137,16 @@ namespace OpenRA.Mods.Common.Traits void MoveTurret() { var df = DesiredFacing ?? (facing != null ? facing.Facing : TurretFacing); - TurretFacing = Util.TickFacing(TurretFacing, df, info.TurnSpeed); + TurretFacing = Util.TickFacing(TurretFacing, df, Info.TurnSpeed); } public bool FaceTarget(Actor self, Target target) { - if (self.IsDisabled()) + if (attack == null || attack.IsTraitDisabled) return false; var pos = self.CenterPosition; - var targetPos = attack != null ? attack.GetTargetPosition(pos, target) : target.CenterPosition; + var targetPos = attack.GetTargetPosition(pos, target); var delta = targetPos - pos; DesiredFacing = delta.HorizontalLengthSquared != 0 ? delta.Yaw.Facing : TurretFacing; MoveTurret();