call DoAttack from activities instead of from Tick in AttackPlane/AttackHeli

This commit is contained in:
Bob
2010-10-24 01:28:37 +13:00
committed by Chris Forbes
parent 158d6e5647
commit c5358f7c82
3 changed files with 37 additions and 18 deletions

View File

@@ -14,24 +14,39 @@ namespace OpenRA.Mods.RA.Activities
{ {
public class FlyAttack : CancelableActivity public class FlyAttack : CancelableActivity
{ {
Target Target; readonly Target Target;
IActivity inner;
public FlyAttack(Target target) { Target = target; } public FlyAttack(Target target) { Target = target; }
public override IActivity Tick(Actor self) public override IActivity Tick(Actor self)
{ {
if (IsCanceled) return NextActivity; if( !Target.IsValid )
if (!Target.IsValid) Cancel( self );
return NextActivity;
var limitedAmmo = self.TraitOrDefault<LimitedAmmo>(); var limitedAmmo = self.TraitOrDefault<LimitedAmmo>();
if (limitedAmmo != null && !limitedAmmo.HasAmmo()) if( limitedAmmo != null && !limitedAmmo.HasAmmo() )
return NextActivity; Cancel( self );
return Util.SequenceActivities( self.Trait<AttackPlane>().DoAttack( self );
if( IsCanceled && inner == null ) return NextActivity;
if( inner == null )
{
inner = Util.SequenceActivities(
Fly.ToPx(Target.CenterLocation), Fly.ToPx(Target.CenterLocation),
new FlyTimed(50), new FlyTimed(50));
this); }
inner = inner.Tick( self );
return this;
}
protected override bool OnCancel( Actor self )
{
if( inner != null )
inner.Cancel( self );
return base.OnCancel( self );
} }
} }

View File

@@ -39,7 +39,8 @@ namespace OpenRA.Mods.RA.Activities
return this; return this;
} }
var range = self.Trait<AttackBase>().GetMaximumRange() - 1; var attack = self.Trait<AttackBase>();
var range = attack.GetMaximumRange() - 1;
var dist = target.CenterLocation - self.CenterLocation; var dist = target.CenterLocation - self.CenterLocation;
var desiredFacing = Util.GetFacing(dist, aircraft.Facing); var desiredFacing = Util.GetFacing(dist, aircraft.Facing);
@@ -49,6 +50,8 @@ namespace OpenRA.Mods.RA.Activities
if (!float2.WithinEpsilon(float2.Zero, dist, range * Game.CellSize)) if (!float2.WithinEpsilon(float2.Zero, dist, range * Game.CellSize))
aircraft.center += (rawSpeed / dist.Length) * dist; aircraft.center += (rawSpeed / dist.Length) * dist;
attack.DoAttack( self );
return this; return this;
} }
} }

View File

@@ -20,17 +20,18 @@ namespace OpenRA.Mods.RA
readonly int FacingTolerance; readonly int FacingTolerance;
public override void Tick(Actor self) protected override bool CanAttack( Actor self )
{ {
base.Tick(self); if( !base.CanAttack( self ) )
return false;
if (!target.IsValid) return;
var facing = self.Trait<IFacing>().Facing; var facing = self.Trait<IFacing>().Facing;
var facingToTarget = Util.GetFacing(target.CenterLocation - self.CenterLocation, facing); var facingToTarget = Util.GetFacing(target.CenterLocation - self.CenterLocation, facing);
if (Math.Abs(facingToTarget - facing) % 256 < FacingTolerance) if( Math.Abs( facingToTarget - facing ) % 256 >= FacingTolerance )
DoAttack(self); return false;
return true;
} }
} }
} }