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

@@ -22,6 +22,7 @@ namespace OpenRA.Traits
TargetType type;
Actor actor;
ITargetable targetable;
FrozenActor frozen;
WPos pos;
int generation;
@@ -40,6 +41,7 @@ namespace OpenRA.Traits
return new Target
{
actor = a,
targetable = a != null ? a.TraitOrDefault<ITargetable>() : null,
type = a != null ? TargetType.Actor : TargetType.Invalid,
generation = a.Generation,
};
@@ -47,7 +49,6 @@ namespace OpenRA.Traits
public static Target FromFrozenActor(FrozenActor a) { return new Target { frozen = a, type = TargetType.FrozenActor }; }
public bool IsValid { get { return Type != TargetType.Invalid; } }
public Actor Actor { get { return actor; } }
public FrozenActor FrozenActor { get { return frozen; } }
@@ -70,6 +71,17 @@ namespace OpenRA.Traits
}
}
public bool IsValidFor(Actor targeter)
{
if (Type == TargetType.Invalid)
return false;
if (targetable != null && !targetable.TargetableBy(actor, targeter))
return false;
return true;
}
// Representative position - see Positions for the full set of targetable positions.
public WPos CenterPosition
{