diff --git a/OpenRA.Mods.RA/Effects/GpsDot.cs b/OpenRA.Mods.RA/Effects/GpsDot.cs index c9da29dc8b..f3cd8360bd 100644 --- a/OpenRA.Mods.RA/Effects/GpsDot.cs +++ b/OpenRA.Mods.RA/Effects/GpsDot.cs @@ -45,8 +45,6 @@ namespace OpenRA.Mods.RA.Effects anim.PlayRepeating(info.String); self.World.AddFrameEndTask(w => w.Add(this)); - if (self.World.LocalPlayer != null) - watcher = self.World.LocalPlayer.PlayerActor.Trait(); } bool firstTick = true; @@ -55,7 +53,7 @@ namespace OpenRA.Mods.RA.Effects if (self.Destroyed) world.AddFrameEndTask(w => w.Remove(this)); - if (world.LocalPlayer == null || !self.IsInWorld || self.Destroyed) + if (!self.IsInWorld || self.Destroyed) return; // Can be granted at runtime via a crate, so can't cache @@ -68,6 +66,10 @@ namespace OpenRA.Mods.RA.Effects firstTick = false; } + // Can change with the Shroud selector for observers so don't cache. + if (self.World.RenderPlayer != null) + watcher = self.World.RenderPlayer.PlayerActor.Trait(); + var hasGps = (watcher != null && (watcher.Granted || watcher.GrantedAllies)); var hasDot = (huf != null && !huf.IsVisible(self, self.World.RenderPlayer)); var dotHidden = (cloak != null && cloak.Cloaked) || (spy != null && spy.Disguised); @@ -84,7 +86,6 @@ namespace OpenRA.Mods.RA.Effects var palette = wr.Palette(info.IndicatorPalettePrefix+self.Owner.InternalName); yield return new Renderable(anim.Image, p.ToFloat2() - 0.5f * anim.Image.size, palette, p.Y) .WithScale(1.5f); - } } } diff --git a/OpenRA.Mods.RA/SupportPowers/GpsPower.cs b/OpenRA.Mods.RA/SupportPowers/GpsPower.cs index 7b8bf92112..c3554b9d5e 100755 --- a/OpenRA.Mods.RA/SupportPowers/GpsPower.cs +++ b/OpenRA.Mods.RA/SupportPowers/GpsPower.cs @@ -31,7 +31,7 @@ namespace OpenRA.Mods.RA List actors = new List { }; - public GpsWatcher( Player owner ) { this.owner = owner; } + public GpsWatcher(Player owner) { this.owner = owner; } public void GpsRem(Actor atek) { @@ -62,16 +62,15 @@ namespace OpenRA.Mods.RA foreach (TraitPair i in atek.World.ActorsWithTrait()) i.Trait.RefreshGranted(); - if ((Granted || GrantedAllies) && atek.World.LocalPlayer != null && (atek.World.LocalPlayer.Stances[atek.Owner] == Stance.Ally)) + if ((Granted || GrantedAllies) && atek.Owner.IsAlliedWith(atek.World.RenderPlayer)) atek.Owner.Shroud.ExploreAll(atek.World); } void RefreshGranted() { Granted = (actors.Count > 0 && Launched); - GrantedAllies = owner.World.ActorsWithTrait().Any(p => - p.Actor.Owner.Stances[owner] == Stance.Ally && p.Trait.Granted); - + GrantedAllies = owner.World.ActorsWithTrait().Any(p => p.Actor.Owner.IsAlliedWith(owner) && p.Trait.Granted); + if (Granted || GrantedAllies) owner.Shroud.ExploreAll(owner.World); }