diff --git a/OpenRA.Mods.Common/Traits/Attack/AttackBase.cs b/OpenRA.Mods.Common/Traits/Attack/AttackBase.cs index 94a51f9571..985df88fdc 100644 --- a/OpenRA.Mods.Common/Traits/Attack/AttackBase.cs +++ b/OpenRA.Mods.Common/Traits/Attack/AttackBase.cs @@ -39,7 +39,7 @@ namespace OpenRA.Mods.Common.Traits public override abstract object Create(ActorInitializer init); } - public abstract class AttackBase : PausableConditionalTrait, INotifyCreated, IIssueOrder, IResolveOrder, IOrderVoice, ISync + public abstract class AttackBase : PausableConditionalTrait, INotifyCreated, ITick, IIssueOrder, IResolveOrder, IOrderVoice, ISync { readonly string attackOrderName = "Attack"; readonly string forceAttackOrderName = "ForceAttack"; @@ -50,10 +50,13 @@ namespace OpenRA.Mods.Common.Traits protected IFacing facing; protected Building building; protected IPositionable positionable; + protected INotifyAiming[] notifyAiming; protected Func> getArmaments; readonly Actor self; + bool wasAiming; + public AttackBase(Actor self, AttackBaseInfo info) : base(info) { @@ -65,12 +68,30 @@ namespace OpenRA.Mods.Common.Traits facing = self.TraitOrDefault(); building = self.TraitOrDefault(); positionable = self.TraitOrDefault(); + notifyAiming = self.TraitsImplementing().ToArray(); getArmaments = InitializeGetArmaments(self); base.Created(self); } + void ITick.Tick(Actor self) + { + Tick(self); + } + + protected virtual void Tick(Actor self) + { + if (!wasAiming && IsAiming) + foreach (var n in notifyAiming) + n.StartedAiming(self, this); + else if (wasAiming && !IsAiming) + foreach (var n in notifyAiming) + n.StoppedAiming(self, this); + + wasAiming = IsAiming; + } + protected virtual Func> InitializeGetArmaments(Actor self) { var armaments = self.TraitsImplementing() diff --git a/OpenRA.Mods.Common/Traits/Attack/AttackCharges.cs b/OpenRA.Mods.Common/Traits/Attack/AttackCharges.cs index 776c24feeb..2f09fbb7b6 100644 --- a/OpenRA.Mods.Common/Traits/Attack/AttackCharges.cs +++ b/OpenRA.Mods.Common/Traits/Attack/AttackCharges.cs @@ -34,7 +34,7 @@ namespace OpenRA.Mods.Common.Traits public override object Create(ActorInitializer init) { return new AttackCharges(init.Self, this); } } - public class AttackCharges : AttackOmni, INotifyCreated, ITick, INotifyAttack, INotifySold + public class AttackCharges : AttackOmni, INotifyAttack, INotifySold { readonly AttackChargesInfo info; ConditionManager conditionManager; @@ -56,7 +56,7 @@ namespace OpenRA.Mods.Common.Traits base.Created(self); } - void ITick.Tick(Actor self) + protected override void Tick(Actor self) { // Stop charging when we lose our target charging &= self.CurrentActivity is SetTarget; @@ -70,6 +70,8 @@ namespace OpenRA.Mods.Common.Traits if (ChargeLevel == 0 && conditionManager != null && chargingToken != ConditionManager.InvalidConditionToken) chargingToken = conditionManager.RevokeCondition(self, chargingToken); + + base.Tick(self); } protected override bool CanAttack(Actor self, Target target) diff --git a/OpenRA.Mods.Common/Traits/Attack/AttackFollow.cs b/OpenRA.Mods.Common/Traits/Attack/AttackFollow.cs index 2581534d79..057a1e7ae0 100644 --- a/OpenRA.Mods.Common/Traits/Attack/AttackFollow.cs +++ b/OpenRA.Mods.Common/Traits/Attack/AttackFollow.cs @@ -22,19 +22,14 @@ namespace OpenRA.Mods.Common.Traits public override object Create(ActorInitializer init) { return new AttackFollow(init.Self, this); } } - public class AttackFollow : AttackBase, ITick, INotifyOwnerChanged + public class AttackFollow : AttackBase, INotifyOwnerChanged { public Target Target { get; protected set; } public AttackFollow(Actor self, AttackFollowInfo info) : base(self, info) { } - void ITick.Tick(Actor self) - { - Tick(self); - } - - protected virtual void Tick(Actor self) + protected override void Tick(Actor self) { if (IsTraitDisabled) { @@ -44,6 +39,8 @@ namespace OpenRA.Mods.Common.Traits DoAttack(self, Target); IsAiming = Target.IsValidFor(self); + + base.Tick(self); } public override Activity GetAttackActivity(Actor self, Target newTarget, bool allowMove, bool forceAttack) diff --git a/OpenRA.Mods.Common/TraitsInterfaces.cs b/OpenRA.Mods.Common/TraitsInterfaces.cs index 68ab438fd6..ac0c38bfe2 100644 --- a/OpenRA.Mods.Common/TraitsInterfaces.cs +++ b/OpenRA.Mods.Common/TraitsInterfaces.cs @@ -88,6 +88,13 @@ namespace OpenRA.Mods.Common.Traits void WarnCrush(Actor self, Actor crusher, HashSet crushClasses); } + [RequireExplicitImplementation] + public interface INotifyAiming + { + void StartedAiming(Actor self, AttackBase attack); + void StoppedAiming(Actor self, AttackBase attack); + } + [RequireExplicitImplementation] public interface INotifyAttack {