Some fixes to Cloak.IsVisible()

This commit is contained in:
penev92
2015-01-04 23:34:51 +02:00
parent e353fe5263
commit 17dfda4c9d
3 changed files with 16 additions and 11 deletions

View File

@@ -123,14 +123,9 @@ namespace OpenRA.Mods.Common.Traits
if (!Cloaked || self.Owner.IsAlliedWith(viewer)) if (!Cloaked || self.Owner.IsAlliedWith(viewer))
return true; return true;
return self.World.ActorsWithTrait<DetectCloaked>().Any(a => return self.World.ActorsWithTrait<DetectCloaked>().Any(a => a.Actor.Owner.IsAlliedWith(viewer)
{ && Info.CloakTypes.Intersect(a.Trait.Info.CloakTypes).Any()
var dc = a.Actor.Info.Traits.Get<DetectCloakedInfo>(); && (self.CenterPosition - a.Actor.CenterPosition).Length <= WRange.FromCells(a.Trait.Info.Range).Range);
return a.Actor.Owner.IsAlliedWith(viewer)
&& Info.CloakTypes.Intersect(dc.CloakTypes).Any()
&& (self.CenterPosition - a.Actor.CenterPosition).Length <= WRange.FromCells(dc.Range).Range;
});
} }
public Color RadarColorOverride(Actor self) public Color RadarColorOverride(Actor self)

View File

@@ -13,14 +13,24 @@ using OpenRA.Traits;
namespace OpenRA.Mods.Common.Traits namespace OpenRA.Mods.Common.Traits
{ {
[Desc("Actor can reveal Cloak actors in a specified range.")] [Desc("Actor can reveal Cloak actors in a specified range.")]
public class DetectCloakedInfo : TraitInfo<DetectCloaked> public class DetectCloakedInfo : ITraitInfo
{ {
[Desc("Specific cloak classifications I can reveal.")] [Desc("Specific cloak classifications I can reveal.")]
public readonly string[] CloakTypes = { "Cloak" }; public readonly string[] CloakTypes = { "Cloak" };
[Desc("Measured in cells.")] [Desc("Measured in cells.")]
public readonly int Range = 5; public readonly int Range = 5;
public object Create(ActorInitializer init) { return new DetectCloaked(this); }
} }
public class DetectCloaked { } public class DetectCloaked
{
public readonly DetectCloakedInfo Info;
public DetectCloaked(DetectCloakedInfo info)
{
Info = info;
}
}
} }

View File

@@ -38,7 +38,7 @@ namespace OpenRA.Mods.Common.Traits
public virtual bool TargetableBy(Actor self, Actor viewer) public virtual bool TargetableBy(Actor self, Actor viewer)
{ {
if (cloak == null || !cloak.Cloaked) if (cloak == null)
return true; return true;
return cloak.IsVisible(self, viewer.Owner); return cloak.IsVisible(self, viewer.Owner);