Tweak visibility; hopefully allows targeting of detected units

This commit is contained in:
Paul Chote
2010-08-15 05:43:00 +12:00
parent 7f191887ec
commit 230d59f655
8 changed files with 15 additions and 15 deletions

View File

@@ -122,7 +122,7 @@ namespace OpenRA.Graphics
foreach (var t in world.Queries.WithTraitMultiple<IRadarSignature>()) foreach (var t in world.Queries.WithTraitMultiple<IRadarSignature>())
{ {
if (!t.Actor.IsVisible()) if (!t.Actor.IsVisible(world.LocalPlayer))
continue; continue;
var color = t.Trait.RadarSignatureColor(t.Actor); var color = t.Trait.RadarSignatureColor(t.Actor);

View File

@@ -58,7 +58,7 @@ namespace OpenRA.Traits
Color RadarSignatureColor(Actor self); Color RadarSignatureColor(Actor self);
} }
public interface IVisibilityModifier { bool IsVisible(Actor self); } public interface IVisibilityModifier { bool IsVisible(Actor self, Player byPlayer); }
public interface IRadarColorModifier { Color RadarColorOverride(Actor self); } public interface IRadarColorModifier { Color RadarColorOverride(Actor self); }
public interface IOccupySpace public interface IOccupySpace
{ {

View File

@@ -174,7 +174,7 @@ namespace OpenRA.Widgets
IEnumerable<Actor> SelectActorsInBox(World world, float2 a, float2 b) IEnumerable<Actor> SelectActorsInBox(World world, float2 a, float2 b)
{ {
return world.FindUnits(a, b) return world.FindUnits(a, b)
.Where( x => x.HasTrait<Selectable>() && x.IsVisible() ) .Where( x => x.HasTrait<Selectable>() && x.IsVisible(world.LocalPlayer) )
.GroupBy(x => (x.Owner == world.LocalPlayer) ? x.Info.Traits.Get<SelectableInfo>().Priority : 0) .GroupBy(x => (x.Owner == world.LocalPlayer) ? x.Info.Traits.Get<SelectableInfo>().Priority : 0)
.OrderByDescending(g => g.Key) .OrderByDescending(g => g.Key)
.Select( g => g.AsEnumerable() ) .Select( g => g.AsEnumerable() )

View File

@@ -44,7 +44,7 @@ namespace OpenRA.Widgets
} }
var actor = world.FindUnitsAtMouse(Viewport.LastMousePos).FirstOrDefault(); var actor = world.FindUnitsAtMouse(Viewport.LastMousePos).FirstOrDefault();
if (actor == null || !actor.IsVisible()) if (actor == null || !actor.IsVisible(world.LocalPlayer))
return; return;
var text = actor.Info.Traits.Contains<ValuedInfo>() var text = actor.Info.Traits.Contains<ValuedInfo>()

View File

@@ -40,7 +40,7 @@ namespace OpenRA
public static IEnumerable<Actor> FindUnitsAtMouse(this World world, int2 mouseLocation) public static IEnumerable<Actor> FindUnitsAtMouse(this World world, int2 mouseLocation)
{ {
var loc = mouseLocation + Game.viewport.Location; var loc = mouseLocation + Game.viewport.Location;
return FindUnits(world, loc, loc).Where(a => a.IsVisible()); return FindUnits(world, loc, loc).Where(a => a.IsVisible(world.LocalPlayer));
} }
public static IEnumerable<Actor> FindUnits(this World world, float2 a, float2 b) public static IEnumerable<Actor> FindUnits(this World world, float2 a, float2 b)
@@ -101,7 +101,7 @@ namespace OpenRA
world.IsCellBuildable(t, building.WaterBound, toIgnore)); world.IsCellBuildable(t, building.WaterBound, toIgnore));
} }
public static bool IsVisible(this Actor a) /* must never be relied on in synced code! */ public static bool IsVisible(this Actor a, Player byPlayer) /* must never be relied on in synced code! */
{ {
if (a.World.LocalPlayer != null && a.World.LocalPlayer.Shroud.Disabled) if (a.World.LocalPlayer != null && a.World.LocalPlayer.Shroud.Disabled)
return true; return true;
@@ -110,7 +110,7 @@ namespace OpenRA
if (!Shroud.GetVisOrigins(a).Any(o => a.World.Map.IsInMap(o) && shroud.exploredCells[o.X, o.Y])) // covered by shroud if (!Shroud.GetVisOrigins(a).Any(o => a.World.Map.IsInMap(o) && shroud.exploredCells[o.X, o.Y])) // covered by shroud
return false; return false;
if (a.TraitsImplementing<IVisibilityModifier>().Any(t => !t.IsVisible(a))) if (a.TraitsImplementing<IVisibilityModifier>().Any(t => !t.IsVisible(a, byPlayer)))
return false; return false;
return true; return true;

View File

@@ -18,9 +18,9 @@ namespace OpenRA.Mods.RA
class InvisibleToOthers : IRenderModifier, IVisibilityModifier, IRadarColorModifier class InvisibleToOthers : IRenderModifier, IVisibilityModifier, IRadarColorModifier
{ {
public bool IsVisible(Actor self) public bool IsVisible(Actor self, Player byPlayer)
{ {
return self.Owner == self.World.LocalPlayer; return self.Owner == byPlayer;
} }
public Color RadarColorOverride(Actor self) public Color RadarColorOverride(Actor self)

View File

@@ -29,17 +29,17 @@ namespace OpenRA.Mods.RA
shroud = self.World.WorldActor.Trait<Shroud>(); shroud = self.World.WorldActor.Trait<Shroud>();
} }
public bool IsVisible(Actor self) public bool IsVisible(Actor self, Player byPlayer)
{ {
return self.World.LocalPlayer == null return self.World.LocalPlayer == null
|| self.Owner == self.World.LocalPlayer || self.Owner == byPlayer
|| self.World.LocalPlayer.Shroud.Disabled || self.World.LocalPlayer.Shroud.Disabled
|| Shroud.GetVisOrigins(self).Any(o => self.World.Map.IsInMap(o) && shroud.visibleCells[o.X, o.Y] != 0); || Shroud.GetVisOrigins(self).Any(o => self.World.Map.IsInMap(o) && shroud.visibleCells[o.X, o.Y] != 0);
} }
public IEnumerable<Renderable> ModifyRender(Actor self, IEnumerable<Renderable> r) public IEnumerable<Renderable> ModifyRender(Actor self, IEnumerable<Renderable> r)
{ {
if (IsVisible(self)) if (IsVisible(self, self.World.LocalPlayer))
cache = r.ToArray(); cache = r.ToArray();
return cache; return cache;

View File

@@ -27,10 +27,10 @@ namespace OpenRA.Mods.RA
shroud = self.World.WorldActor.Trait<Shroud>(); shroud = self.World.WorldActor.Trait<Shroud>();
} }
public bool IsVisible(Actor self) public bool IsVisible(Actor self, Player byPlayer)
{ {
return self.World.LocalPlayer == null return self.World.LocalPlayer == null
|| self.Owner == self.World.LocalPlayer || self.Owner == byPlayer
|| self.World.LocalPlayer.Shroud.Disabled || self.World.LocalPlayer.Shroud.Disabled
|| shroud.visibleCells[self.Location.X, self.Location.Y] > 0; || shroud.visibleCells[self.Location.X, self.Location.Y] > 0;
} }
@@ -38,7 +38,7 @@ namespace OpenRA.Mods.RA
static Renderable[] Nothing = { }; static Renderable[] Nothing = { };
public IEnumerable<Renderable> ModifyRender(Actor self, IEnumerable<Renderable> r) public IEnumerable<Renderable> ModifyRender(Actor self, IEnumerable<Renderable> r)
{ {
return IsVisible(self) ? r : Nothing; return IsVisible(self, self.World.LocalPlayer) ? r : Nothing;
} }
} }
} }