Check ITargetable when deciding target validity. Fixes #3659.

This commit is contained in:
Paul Chote
2013-08-18 17:15:22 +12:00
parent 8fd4243861
commit bc5c11e44f
26 changed files with 62 additions and 44 deletions

View File

@@ -18,7 +18,6 @@ namespace OpenRA.Mods.RA.Activities
public class Attack : Activity
{
protected Target Target;
ITargetable targetable;
WRange Range;
bool AllowMovement;
@@ -33,9 +32,6 @@ namespace OpenRA.Mods.RA.Activities
public Attack(Target target, WRange range, bool allowMovement)
{
Target = target;
if (target.Type == TargetType.Actor)
targetable = target.Actor.TraitOrDefault<ITargetable>();
Range = range;
AllowMovement = allowMovement;
}
@@ -54,13 +50,11 @@ namespace OpenRA.Mods.RA.Activities
return NextActivity;
var type = Target.Type;
if (type != TargetType.Actor && type != TargetType.Terrain)
return NextActivity;
if (type == TargetType.Actor && !self.Owner.HasFogVisibility() && Target.Actor.HasTrait<Mobile>() && !self.Owner.Shroud.IsTargetable(Target.Actor))
if (!Target.IsValidFor(self) || type == TargetType.FrozenActor)
return NextActivity;
if (targetable != null && !targetable.TargetableBy(Target.Actor, self))
// TODO: This is horrible, and probably wrong. Work out what it is trying to solve, then redo it properly.
if (type == TargetType.Actor && !self.Owner.HasFogVisibility() && Target.Actor.HasTrait<Mobile>() && !self.Owner.Shroud.IsTargetable(Target.Actor))
return NextActivity;
if (!Target.IsInRange(self.CenterPosition, Range))

View File

@@ -29,7 +29,7 @@ namespace OpenRA.Mods.RA.Activities
var capturable = target.Actor.Trait<Capturable>();
if (IsCanceled || !self.IsInWorld || self.IsDead())
if (IsCanceled || !self.IsInWorld || self.IsDead() || !target.IsValidFor(self))
{
if (capturable.CaptureInProgress)
capturable.EndCapture();

View File

@@ -27,7 +27,7 @@ namespace OpenRA.Mods.RA.Activities
public override Activity Tick(Actor self)
{
if (IsCanceled || target.Type != TargetType.Actor)
if (IsCanceled || !target.IsValidFor(self))
return NextActivity;
self.World.AddFrameEndTask(w => w.Add(new DelayedAction(delay, () =>

View File

@@ -27,7 +27,10 @@ namespace OpenRA.Mods.RA.Activities
public override Activity Tick(Actor self)
{
if (IsCanceled || target.Type != TargetType.Actor)
if (IsCanceled || !target.IsValidFor(self))
return NextActivity;
if (target.Type != TargetType.Actor)
return NextActivity;
var targetActor = target.Actor;

View File

@@ -27,7 +27,10 @@ namespace OpenRA.Mods.RA.Activities
public override Activity Tick(Actor self)
{
if (IsCanceled || target.Type != TargetType.Actor)
if (IsCanceled || !target.IsValidFor(self))
return NextActivity;
if (target.Type != TargetType.Actor)
return NextActivity;
if (!Util.AdjacentCells(target).Any(c => c == self.Location))

View File

@@ -32,7 +32,7 @@ namespace OpenRA.Mods.RA.Activities
public override Activity Tick(Actor self)
{
if (IsCanceled || !target.IsValid)
if (IsCanceled || !target.IsValidFor(self))
return NextActivity;
if (target.IsInRange(self.CenterPosition, range) || --nextPathTime > 0)

View File

@@ -22,6 +22,9 @@ namespace OpenRA.Mods.RA.Activities
protected override Activity InnerTick(Actor self, AttackBase attack)
{
if (!Target.IsValidFor(self))
return NextActivity;
if (Target.Type == TargetType.Actor && Target.Actor.GetDamageState() == DamageState.Undamaged)
return NextActivity;

View File

@@ -23,7 +23,10 @@ namespace OpenRA.Mods.RA.Activities
public override Activity Tick(Actor self)
{
if (IsCanceled || target.Type != TargetType.Actor)
if (IsCanceled || !target.IsValidFor(self))
return NextActivity;
if (target.Type != TargetType.Actor)
return NextActivity;
var actor = target.Actor;

View File

@@ -21,7 +21,7 @@ namespace OpenRA.Mods.RA.Activities
public override Activity Tick(Actor self)
{
if (IsCanceled || !target.IsValid)
if (IsCanceled || !target.IsValidFor(self))
return NextActivity;
var mobile = self.Trait<Mobile>();