diff --git a/OpenRA.Mods.RA/Effects/GpsDot.cs b/OpenRA.Mods.RA/Effects/GpsDot.cs index d8515b5380..4f9f9c3082 100644 --- a/OpenRA.Mods.RA/Effects/GpsDot.cs +++ b/OpenRA.Mods.RA/Effects/GpsDot.cs @@ -37,14 +37,22 @@ namespace OpenRA.Mods.RA.Effects readonly GpsDotInfo info; readonly Animation anim; - readonly Dictionary showToPlayer = new Dictionary(); + readonly Dictionary stateByPlayer = new Dictionary(); + readonly Lazy huf; + readonly Lazy fuf; + readonly Lazy disguise; + readonly Lazy cloak; + readonly Cache frozen; - Lazy huf; - Lazy fuf; - Lazy disguise; - Lazy cloak; - Cache watcher; - Cache frozen; + class DotState + { + public readonly GpsWatcher Gps; + public bool IsVisible; + public DotState(GpsWatcher gps) + { + Gps = gps; + } + } public GpsDot(Actor self, GpsDotInfo info) { @@ -60,15 +68,14 @@ namespace OpenRA.Mods.RA.Effects disguise = Exts.Lazy(() => self.TraitOrDefault()); cloak = Exts.Lazy(() => self.TraitOrDefault()); - watcher = new Cache(p => p.PlayerActor.Trait()); frozen = new Cache(p => p.PlayerActor.Trait()); - showToPlayer = self.World.Players.ToDictionary(x => x, x => false); + stateByPlayer = self.World.Players.ToDictionary(p => p, p => new DotState(p.PlayerActor.Trait())); } public bool IsDotVisible(Player toPlayer) { - return showToPlayer[toPlayer]; + return stateByPlayer[toPlayer].IsVisible; } bool ShouldShowIndicator(Player toPlayer) @@ -106,14 +113,14 @@ namespace OpenRA.Mods.RA.Effects foreach (var player in self.World.Players) { - var gps = watcher[player]; - showToPlayer[player] = (gps.Granted || gps.GrantedAllies) && ShouldShowIndicator(player); + var state = stateByPlayer[player]; + state.IsVisible = (state.Gps.Granted || state.Gps.GrantedAllies) && ShouldShowIndicator(player); } } public IEnumerable Render(WorldRenderer wr) { - if (self.World.RenderPlayer == null || !showToPlayer[self.World.RenderPlayer] || self.Disposed) + if (self.World.RenderPlayer == null || !IsDotVisible(self.World.RenderPlayer) || self.Disposed) return SpriteRenderable.None; var palette = wr.Palette(info.IndicatorPalettePrefix + self.Owner.InternalName);