Merge pull request #3726 from pchote/cloak-fix

Cloak fixes
This commit is contained in:
Matthias Mailänder
2013-08-23 09:27:56 -07:00
36 changed files with 135 additions and 132 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;
@@ -37,17 +38,20 @@ namespace OpenRA.Traits
public static Target FromActor(Actor a)
{
if (a == null)
return Target.Invalid;
return new Target
{
actor = a,
type = a != null ? TargetType.Actor : TargetType.Invalid,
targetable = a.TraitOrDefault<ITargetable>(),
type = TargetType.Actor,
generation = a.Generation,
};
}
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 +74,17 @@ namespace OpenRA.Traits
}
}
public bool IsValidFor(Actor targeter)
{
if (targeter == null || 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
{