Add INotifyAiming interface

And trigger notifications from Attack* traits.
This commit is contained in:
reaperrr
2018-05-14 02:56:41 +02:00
committed by Paul Chote
parent 4898873617
commit bd38fe4926
4 changed files with 37 additions and 10 deletions

View File

@@ -39,7 +39,7 @@ namespace OpenRA.Mods.Common.Traits
public override abstract object Create(ActorInitializer init);
}
public abstract class AttackBase : PausableConditionalTrait<AttackBaseInfo>, INotifyCreated, IIssueOrder, IResolveOrder, IOrderVoice, ISync
public abstract class AttackBase : PausableConditionalTrait<AttackBaseInfo>, 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<IEnumerable<Armament>> 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<IFacing>();
building = self.TraitOrDefault<Building>();
positionable = self.TraitOrDefault<IPositionable>();
notifyAiming = self.TraitsImplementing<INotifyAiming>().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<IEnumerable<Armament>> InitializeGetArmaments(Actor self)
{
var armaments = self.TraitsImplementing<Armament>()

View File

@@ -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)

View File

@@ -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)

View File

@@ -88,6 +88,13 @@ namespace OpenRA.Mods.Common.Traits
void WarnCrush(Actor self, Actor crusher, HashSet<string> crushClasses);
}
[RequireExplicitImplementation]
public interface INotifyAiming
{
void StartedAiming(Actor self, AttackBase attack);
void StoppedAiming(Actor self, AttackBase attack);
}
[RequireExplicitImplementation]
public interface INotifyAttack
{