From f96d02a79482f10a303e92a83d0a099e5c05ea22 Mon Sep 17 00:00:00 2001 From: RoosterDragon Date: Sun, 6 Dec 2015 01:17:42 +0000 Subject: [PATCH] Fix GPS dot relying on frozen actor render state. The GPS dot was not displayed if a frozen actor for it was already visible. However, this was mistakenly affecting visibility checks in the world. Now, we only avoid rendering it when the frozen actor is present, but the indicator is still regarded as visible for visilbity checks in the world. --- OpenRA.Mods.RA/Effects/GpsDot.cs | 34 ++++++++++++++++++++++---------- 1 file changed, 24 insertions(+), 10 deletions(-) diff --git a/OpenRA.Mods.RA/Effects/GpsDot.cs b/OpenRA.Mods.RA/Effects/GpsDot.cs index 4f9f9c3082..1ff8497ef9 100644 --- a/OpenRA.Mods.RA/Effects/GpsDot.cs +++ b/OpenRA.Mods.RA/Effects/GpsDot.cs @@ -47,7 +47,8 @@ namespace OpenRA.Mods.RA.Effects class DotState { public readonly GpsWatcher Gps; - public bool IsVisible; + public bool IsTargetable; + public bool ShouldRender; public DotState(GpsWatcher gps) { Gps = gps; @@ -75,11 +76,13 @@ namespace OpenRA.Mods.RA.Effects public bool IsDotVisible(Player toPlayer) { - return stateByPlayer[toPlayer].IsVisible; + return stateByPlayer[toPlayer].IsTargetable; } - bool ShouldShowIndicator(Player toPlayer) + bool IsTargetableBy(Player toPlayer, out bool shouldRenderIndicator) { + shouldRenderIndicator = false; + if (cloak.Value != null && cloak.Value.Cloaked) return false; @@ -88,19 +91,27 @@ namespace OpenRA.Mods.RA.Effects if (huf.Value != null && !huf.Value.IsVisible(self, toPlayer) && toPlayer.Shroud.IsExplored(self.CenterPosition)) + { + var f1 = FrozenActorForPlayer(toPlayer); + shouldRenderIndicator = f1 == null || !f1.HasRenderables; return true; + } if (fuf.Value == null) return false; - var f = frozen[toPlayer].FromID(self.ActorID); - if (f == null) + var f2 = FrozenActorForPlayer(toPlayer); + if (f2 == null) return false; - if (f.HasRenderables || f.NeedRenderables) - return false; + shouldRenderIndicator = !f2.HasRenderables; - return f.Visible && !f.Shrouded; + return f2.Visible && !f2.Shrouded; + } + + FrozenActor FrozenActorForPlayer(Player player) + { + return frozen[player].FromID(self.ActorID); } public void Tick(World world) @@ -114,13 +125,16 @@ namespace OpenRA.Mods.RA.Effects foreach (var player in self.World.Players) { var state = stateByPlayer[player]; - state.IsVisible = (state.Gps.Granted || state.Gps.GrantedAllies) && ShouldShowIndicator(player); + var shouldRender = false; + var targetable = (state.Gps.Granted || state.Gps.GrantedAllies) && IsTargetableBy(player, out shouldRender); + state.IsTargetable = targetable; + state.ShouldRender = targetable && shouldRender; } } public IEnumerable Render(WorldRenderer wr) { - if (self.World.RenderPlayer == null || !IsDotVisible(self.World.RenderPlayer) || self.Disposed) + if (self.World.RenderPlayer == null || !stateByPlayer[self.World.RenderPlayer].ShouldRender || self.Disposed) return SpriteRenderable.None; var palette = wr.Palette(info.IndicatorPalettePrefix + self.Owner.InternalName);