diff --git a/OpenRA.Mods.Common/Traits/Turreted.cs b/OpenRA.Mods.Common/Traits/Turreted.cs index 05edf3cd17..a3fc212618 100644 --- a/OpenRA.Mods.Common/Traits/Turreted.cs +++ b/OpenRA.Mods.Common/Traits/Turreted.cs @@ -17,7 +17,7 @@ using OpenRA.Traits; namespace OpenRA.Mods.Common.Traits { - public class TurretedInfo : ITraitInfo, UsesInit, Requires, IActorPreviewInitInfo + public class TurretedInfo : PausableConditionalTraitInfo, UsesInit, Requires, IActorPreviewInitInfo { public readonly string Turret = "primary"; [Desc("Speed at which the turret turns.")] @@ -41,12 +41,11 @@ namespace OpenRA.Mods.Common.Traits yield return new TurretFacingInit(PreviewFacing); } - public virtual object Create(ActorInitializer init) { return new Turreted(init, this); } + public override object Create(ActorInitializer init) { return new Turreted(init, this); } } - public class Turreted : ITick, ISync, INotifyCreated, IDeathActorInitModifier, IActorPreviewInitModifier + public class Turreted : PausableConditionalTrait, ITick, IDeathActorInitModifier, IActorPreviewInitModifier { - public readonly TurretedInfo Info; AttackTurreted attack; IFacing facing; BodyOrientation body; @@ -97,13 +96,14 @@ namespace OpenRA.Mods.Common.Traits } public Turreted(ActorInitializer init, TurretedInfo info) + : base(info) { - Info = info; TurretFacing = TurretFacingFromInit(init, Info.InitialFacing, Info.Turret)(); } - void INotifyCreated.Created(Actor self) + protected override void Created(Actor self) { + base.Created(self); attack = self.TraitsImplementing().SingleOrDefault(at => ((AttackTurretedInfo)at.Info).Turrets.Contains(Info.Turret)); facing = self.TraitOrDefault(); body = self.Trait(); @@ -116,6 +116,9 @@ namespace OpenRA.Mods.Common.Traits protected virtual void Tick(Actor self) { + if (IsTraitDisabled) + return; + // NOTE: FaceTarget is called in AttackTurreted.CanAttack if the turret has a target. if (attack != null) { @@ -145,7 +148,7 @@ namespace OpenRA.Mods.Common.Traits public bool FaceTarget(Actor self, Target target) { - if (attack == null || attack.IsTraitDisabled || attack.IsTraitPaused) + if (IsTraitDisabled || IsTraitPaused || attack == null || attack.IsTraitDisabled || attack.IsTraitPaused) return false; var pos = self.CenterPosition; @@ -158,6 +161,9 @@ namespace OpenRA.Mods.Common.Traits public void StopAiming(Actor self) { + if (IsTraitDisabled) + return; + if (attack != null && attack.IsAiming) attack.OnStopOrder(self); } @@ -223,6 +229,18 @@ namespace OpenRA.Mods.Common.Traits var facingOffset = TurretFacing - bodyFacing(); facings.Value(self.World).Add(Name, () => bodyFacing() + facingOffset); } + + protected override void TraitDisabled(Actor self) + { + if (attack != null && attack.IsAiming) + attack.OnStopOrder(self); + } + + protected override void TraitResumed(Actor self) + { + if (attack != null) + FaceTarget(self, attack.Target); + } } public class TurretFacingInit : IActorInit