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

@@ -99,7 +99,7 @@ namespace OpenRA.Orders
if (self.Owner != self.World.LocalPlayer)
return null;
if (self.Destroyed || target.Type == TargetType.Invalid)
if (self.Destroyed || !target.IsValidFor(self))
return null;
if (mi.Button == Game.mouseButtonPreference.Action)

View File

@@ -64,7 +64,7 @@ namespace OpenRA.Traits
foreach (var target in targets)
{
if (!target.IsValid)
if (target.Type == TargetType.Invalid)
continue;
var to = wr.ScreenPxPosition(target.CenterPosition);

View File

@@ -161,7 +161,7 @@ namespace OpenRA.Traits
var c = Color.Green;
var wlr = Game.Renderer.WorldLineRenderer;
foreach (var stp in targets.Where(t => t.IsValid).Select(p => wr.ScreenPxPosition(p.CenterPosition)))
foreach (var stp in targets.Where(t => t.Type != TargetType.Invalid).Select(p => wr.ScreenPxPosition(p.CenterPosition)))
{
wlr.DrawLine(stp + new float2(-1, -1), stp + new float2(-1, 1), c, c);
wlr.DrawLine(stp + new float2(-1, 1), stp + new float2(1, 1), c, c);

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
{