diff --git a/OpenRA.Mods.Common/Traits/Render/WithAimAnimation.cs b/OpenRA.Mods.Common/Traits/Render/WithAimAnimation.cs index 1044d46b0e..b268cf76ca 100644 --- a/OpenRA.Mods.Common/Traits/Render/WithAimAnimation.cs +++ b/OpenRA.Mods.Common/Traits/Render/WithAimAnimation.cs @@ -41,25 +41,35 @@ namespace OpenRA.Mods.Common.Traits.Render public class WithAimAnimation : ConditionalTrait, INotifyAiming { - readonly AttackBase attack; + readonly AttackBase[] attackBases; readonly WithSpriteBody wsb; public WithAimAnimation(ActorInitializer init, WithAimAnimationInfo info) : base(info) { - attack = init.Self.Trait(); + attackBases = init.Self.TraitsImplementing().ToArray(); wsb = init.Self.TraitsImplementing().First(w => w.Info.Name == Info.Body); } - protected void UpdateSequence() + void UpdateSequence(bool isAiming) { - var seq = !IsTraitDisabled && attack.IsAiming ? Info.Sequence : wsb.Info.Sequence; + var seq = !IsTraitDisabled && isAiming ? Info.Sequence : wsb.Info.Sequence; wsb.DefaultAnimation.ReplaceAnim(seq); } - void INotifyAiming.StartedAiming(Actor self, AttackBase ab) { UpdateSequence(); } - void INotifyAiming.StoppedAiming(Actor self, AttackBase ab) { UpdateSequence(); } - protected override void TraitEnabled(Actor self) { UpdateSequence(); } - protected override void TraitDisabled(Actor self) { UpdateSequence(); } + void INotifyAiming.StartedAiming(Actor self, AttackBase ab) + { + // We know that at least one AttackBase is aiming + UpdateSequence(true); + } + + void INotifyAiming.StoppedAiming(Actor self, AttackBase ab) { UpdateSequence(attackBases.Any(a => a.IsAiming)); } + protected override void TraitEnabled(Actor self) { UpdateSequence(attackBases.Any(a => a.IsAiming)); } + + protected override void TraitDisabled(Actor self) + { + // Stop regardless of any aiming AttackBases + UpdateSequence(false); + } } } diff --git a/OpenRA.Mods.Common/Traits/Render/WithTurretAimAnimation.cs b/OpenRA.Mods.Common/Traits/Render/WithTurretAimAnimation.cs index e3a3d5636f..1ba04389c3 100644 --- a/OpenRA.Mods.Common/Traits/Render/WithTurretAimAnimation.cs +++ b/OpenRA.Mods.Common/Traits/Render/WithTurretAimAnimation.cs @@ -41,26 +41,35 @@ namespace OpenRA.Mods.Common.Traits.Render public class WithTurretAimAnimation : ConditionalTrait, INotifyAiming { - readonly AttackBase attack; + readonly AttackBase[] attackBases; readonly WithSpriteTurret wst; public WithTurretAimAnimation(ActorInitializer init, WithTurretAimAnimationInfo info) : base(info) { - attack = init.Self.Trait(); - wst = init.Self.TraitsImplementing() - .Single(st => st.Info.Turret == info.Turret); + attackBases = init.Self.TraitsImplementing().ToArray(); + wst = init.Self.TraitsImplementing().Single(st => st.Info.Turret == info.Turret); } - protected void UpdateSequence() + void UpdateSequence(bool isAiming) { - var seq = !IsTraitDisabled && attack.IsAiming ? Info.Sequence : wst.Info.Sequence; + var seq = !IsTraitDisabled && isAiming ? Info.Sequence : wst.Info.Sequence; wst.DefaultAnimation.ReplaceAnim(seq); } - void INotifyAiming.StartedAiming(Actor self, AttackBase ab) { UpdateSequence(); } - void INotifyAiming.StoppedAiming(Actor self, AttackBase ab) { UpdateSequence(); } - protected override void TraitEnabled(Actor self) { UpdateSequence(); } - protected override void TraitDisabled(Actor self) { UpdateSequence(); } + void INotifyAiming.StartedAiming(Actor self, AttackBase ab) + { + // We know that at least one AttackBase is aiming + UpdateSequence(true); + } + + void INotifyAiming.StoppedAiming(Actor self, AttackBase ab) { UpdateSequence(attackBases.Any(a => a.IsAiming)); } + protected override void TraitEnabled(Actor self) { UpdateSequence(attackBases.Any(a => a.IsAiming)); } + + protected override void TraitDisabled(Actor self) + { + // Stop regardless of any aiming AttackBases + UpdateSequence(false); + } } }