From bfa23c18c0bbb7c33a69ffb1cbc2abd70752f59c Mon Sep 17 00:00:00 2001 From: Pavel Penev Date: Tue, 17 Nov 2015 18:16:06 +0200 Subject: [PATCH 1/4] Track GpsDot state per player Should let us fix the issue mentioned in https://github.com/OpenRA/OpenRA/pull/10007#issuecomment-157409237 --- OpenRA.Mods.RA/Effects/GpsDot.cs | 30 ++++++++++++++++++++---------- 1 file changed, 20 insertions(+), 10 deletions(-) diff --git a/OpenRA.Mods.RA/Effects/GpsDot.cs b/OpenRA.Mods.RA/Effects/GpsDot.cs index ded339f9ef..70c10ce1cf 100644 --- a/OpenRA.Mods.RA/Effects/GpsDot.cs +++ b/OpenRA.Mods.RA/Effects/GpsDot.cs @@ -10,6 +10,7 @@ using System; using System.Collections.Generic; +using System.Linq; using OpenRA.Effects; using OpenRA.Graphics; using OpenRA.Mods.Common.Traits; @@ -36,6 +37,8 @@ namespace OpenRA.Mods.RA.Effects readonly GpsDotInfo info; readonly Animation anim; + readonly Dictionary showToPlayer = new Dictionary(); + Lazy huf; Lazy fuf; Lazy disguise; @@ -43,8 +46,6 @@ namespace OpenRA.Mods.RA.Effects Cache watcher; Cache frozen; - bool show = false; - public GpsDot(Actor self, GpsDotInfo info) { this.self = self; @@ -61,9 +62,16 @@ namespace OpenRA.Mods.RA.Effects watcher = new Cache(p => p.PlayerActor.Trait()); frozen = new Cache(p => p.PlayerActor.Trait()); + + showToPlayer = self.World.Players.ToDictionary(x => x, x => false); } - bool ShouldShowIndicator() + public bool IsDotVisible(Player toPlayer) + { + return showToPlayer[toPlayer]; + } + + bool ShouldShowIndicator(Player toPlayer) { if (cloak.Value != null && cloak.Value.Cloaked) return false; @@ -71,13 +79,13 @@ namespace OpenRA.Mods.RA.Effects if (disguise.Value != null && disguise.Value.Disguised) return false; - if (huf.Value != null && !huf.Value.IsVisible(self, self.World.RenderPlayer)) + if (huf.Value != null && !huf.Value.IsVisible(self, toPlayer)) return true; if (fuf.Value == null) return false; - var f = frozen[self.World.RenderPlayer].FromID(self.ActorID); + var f = frozen[toPlayer].FromID(self.ActorID); if (f == null) return false; @@ -92,17 +100,19 @@ namespace OpenRA.Mods.RA.Effects if (self.Disposed) world.AddFrameEndTask(w => w.Remove(this)); - show = false; - if (!self.IsInWorld || self.IsDead || self.World.RenderPlayer == null) + if (!self.IsInWorld || self.IsDead) return; - var gps = watcher[self.World.RenderPlayer]; - show = (gps.Granted || gps.GrantedAllies) && ShouldShowIndicator(); + foreach (var player in self.World.Players) + { + var gps = watcher[player]; + showToPlayer[player] = (gps.Granted || gps.GrantedAllies) && ShouldShowIndicator(player); + } } public IEnumerable Render(WorldRenderer wr) { - if (!show || self.Disposed) + if (self.World.RenderPlayer == null || !showToPlayer[self.World.RenderPlayer] || self.Disposed) return SpriteRenderable.None; var palette = wr.Palette(info.IndicatorPalettePrefix + self.Owner.InternalName); From 217c3881c6e988c4246c1a56d4737591f14b257a Mon Sep 17 00:00:00 2001 From: Pavel Penev Date: Tue, 17 Nov 2015 23:08:11 +0200 Subject: [PATCH 2/4] Add IFogVisibilityModifier.IsVisible(Actor) --- OpenRA.Game/Traits/TraitsInterfaces.cs | 7 ++++++- OpenRA.Mods.RA/Traits/SupportPowers/GpsPower.cs | 9 +++++++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/OpenRA.Game/Traits/TraitsInterfaces.cs b/OpenRA.Game/Traits/TraitsInterfaces.cs index 800317fdf4..8312935b66 100644 --- a/OpenRA.Game/Traits/TraitsInterfaces.cs +++ b/OpenRA.Game/Traits/TraitsInterfaces.cs @@ -189,7 +189,12 @@ namespace OpenRA.Traits public interface IDefaultVisibilityInfo : ITraitInfo { } public interface IDefaultVisibility { bool IsVisible(Actor self, Player byPlayer); } public interface IVisibilityModifier { bool IsVisible(Actor self, Player byPlayer); } - public interface IFogVisibilityModifier { bool HasFogVisibility(Player byPlayer); } + + public interface IFogVisibilityModifier + { + bool IsVisible(Actor actor); + bool HasFogVisibility(Player byPlayer); + } public interface IRadarColorModifier { Color RadarColorOverride(Actor self); } diff --git a/OpenRA.Mods.RA/Traits/SupportPowers/GpsPower.cs b/OpenRA.Mods.RA/Traits/SupportPowers/GpsPower.cs index e8612a11dc..202414ef48 100644 --- a/OpenRA.Mods.RA/Traits/SupportPowers/GpsPower.cs +++ b/OpenRA.Mods.RA/Traits/SupportPowers/GpsPower.cs @@ -80,6 +80,15 @@ namespace OpenRA.Mods.RA.Traits { return Granted || GrantedAllies; } + + public bool IsVisible(Actor actor) + { + var gpsDot = actor.TraitOrDefault(); + if (gpsDot == null) + return false; + + return gpsDot.IsDotVisible(Owner); + } } class GpsPowerInfo : SupportPowerInfo From 78e2eabd176ce07694fdf9272fce69668092bbe8 Mon Sep 17 00:00:00 2001 From: Pavel Penev Date: Sat, 21 Nov 2015 01:10:43 +0200 Subject: [PATCH 3/4] Remove byPlayer parameter from IFogVisibilityModifier.HasFogVisibility() --- OpenRA.Game/Player.cs | 2 +- OpenRA.Game/Traits/TraitsInterfaces.cs | 2 +- OpenRA.Mods.RA/Traits/SupportPowers/GpsPower.cs | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/OpenRA.Game/Player.cs b/OpenRA.Game/Player.cs index bb09eac700..f324b495ee 100644 --- a/OpenRA.Game/Player.cs +++ b/OpenRA.Game/Player.cs @@ -165,7 +165,7 @@ namespace OpenRA return CanViewActor(a); } - public bool HasFogVisibility { get { return fogVisibilities.Any(f => f.HasFogVisibility(this)); } } + public bool HasFogVisibility { get { return fogVisibilities.Any(f => f.HasFogVisibility()); } } #region Scripting interface diff --git a/OpenRA.Game/Traits/TraitsInterfaces.cs b/OpenRA.Game/Traits/TraitsInterfaces.cs index 8312935b66..de5252edbf 100644 --- a/OpenRA.Game/Traits/TraitsInterfaces.cs +++ b/OpenRA.Game/Traits/TraitsInterfaces.cs @@ -193,7 +193,7 @@ namespace OpenRA.Traits public interface IFogVisibilityModifier { bool IsVisible(Actor actor); - bool HasFogVisibility(Player byPlayer); + bool HasFogVisibility(); } public interface IRadarColorModifier { Color RadarColorOverride(Actor self); } diff --git a/OpenRA.Mods.RA/Traits/SupportPowers/GpsPower.cs b/OpenRA.Mods.RA/Traits/SupportPowers/GpsPower.cs index 202414ef48..16ca4eb1ea 100644 --- a/OpenRA.Mods.RA/Traits/SupportPowers/GpsPower.cs +++ b/OpenRA.Mods.RA/Traits/SupportPowers/GpsPower.cs @@ -76,7 +76,7 @@ namespace OpenRA.Mods.RA.Traits Owner.Shroud.ExploreAll(Owner.World); } - public bool HasFogVisibility(Player byPlayer) + public bool HasFogVisibility() { return Granted || GrantedAllies; } From 8d4d37ca467376c7a11e2d4b9e906f60e29e0191 Mon Sep 17 00:00:00 2001 From: Pavel Penev Date: Tue, 17 Nov 2015 19:03:54 +0200 Subject: [PATCH 4/4] Make GPS respect shroud --- OpenRA.Game/Player.cs | 2 +- OpenRA.Mods.RA/Effects/GpsDot.cs | 5 +++-- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/OpenRA.Game/Player.cs b/OpenRA.Game/Player.cs index f324b495ee..f53e9a0895 100644 --- a/OpenRA.Game/Player.cs +++ b/OpenRA.Game/Player.cs @@ -159,7 +159,7 @@ namespace OpenRA public bool CanTargetActor(Actor a) { - if (HasFogVisibility) + if (HasFogVisibility && fogVisibilities.Any(f => f.IsVisible(a))) return true; return CanViewActor(a); diff --git a/OpenRA.Mods.RA/Effects/GpsDot.cs b/OpenRA.Mods.RA/Effects/GpsDot.cs index 70c10ce1cf..d8515b5380 100644 --- a/OpenRA.Mods.RA/Effects/GpsDot.cs +++ b/OpenRA.Mods.RA/Effects/GpsDot.cs @@ -79,7 +79,8 @@ namespace OpenRA.Mods.RA.Effects if (disguise.Value != null && disguise.Value.Disguised) return false; - if (huf.Value != null && !huf.Value.IsVisible(self, toPlayer)) + if (huf.Value != null && !huf.Value.IsVisible(self, toPlayer) + && toPlayer.Shroud.IsExplored(self.CenterPosition)) return true; if (fuf.Value == null) @@ -92,7 +93,7 @@ namespace OpenRA.Mods.RA.Effects if (f.HasRenderables || f.NeedRenderables) return false; - return f.Visible; + return f.Visible && !f.Shrouded; } public void Tick(World world)