diff --git a/OpenRA.Game/Traits/CreatesShroud.cs b/OpenRA.Game/Traits/CreatesShroud.cs index 8d087251c4..c5729fad33 100644 --- a/OpenRA.Game/Traits/CreatesShroud.cs +++ b/OpenRA.Game/Traits/CreatesShroud.cs @@ -32,6 +32,13 @@ namespace OpenRA.Traits lobbyShroudFogDisabled = !self.World.LobbyInfo.GlobalSettings.Shroud && !self.World.LobbyInfo.GlobalSettings.Fog; } + CPos[] ShroudedTiles(Actor self) + { + return Shroud.GetVisOrigins(self) + .SelectMany(o => Shroud.FindVisibleTiles(self.World, o, Range)) + .Distinct().ToArray(); + } + public void Tick(Actor self) { if (lobbyShroudFogDisabled) @@ -43,20 +50,20 @@ namespace OpenRA.Traits cachedLocation = self.Location; cachedDisabled = disabled; - CPos[] shrouded = null; + var shrouded = ShroudedTiles(self); foreach (var p in self.World.Players) { p.Shroud.RemoveShroudGeneration(self); - p.Shroud.AddShroudGeneration(self, ref shrouded); + p.Shroud.AddShroudGeneration(self, shrouded); } } } public void AddedToWorld(Actor self) { - CPos[] shrouded = null; + var shrouded = ShroudedTiles(self); foreach (var p in self.World.Players) - p.Shroud.AddShroudGeneration(self, ref shrouded); + p.Shroud.AddShroudGeneration(self, shrouded); } public void RemovedFromWorld(Actor self) diff --git a/OpenRA.Game/Traits/RevealsShroud.cs b/OpenRA.Game/Traits/RevealsShroud.cs index adb1dc459f..f10bbedb10 100644 --- a/OpenRA.Game/Traits/RevealsShroud.cs +++ b/OpenRA.Game/Traits/RevealsShroud.cs @@ -31,6 +31,13 @@ namespace OpenRA.Traits lobbyShroudFogDisabled = !self.World.LobbyInfo.GlobalSettings.Shroud && !self.World.LobbyInfo.GlobalSettings.Fog; } + CPos[] VisibleTiles(Actor self) + { + return Shroud.GetVisOrigins(self) + .SelectMany(o => Shroud.FindVisibleTiles(self.World, o, Range)) + .Distinct().ToArray(); + } + public void Tick(Actor self) { if (lobbyShroudFogDisabled) @@ -40,20 +47,20 @@ namespace OpenRA.Traits { cachedLocation = self.Location; - CPos[] visible = null; + var visible = VisibleTiles(self); foreach (var p in self.World.Players) { p.Shroud.RemoveVisibility(self); - p.Shroud.AddVisibility(self, ref visible); + p.Shroud.AddVisibility(self, visible); } } } public void AddedToWorld(Actor self) { - CPos[] visible = null; + var visible = VisibleTiles(self); foreach (var p in self.World.Players) - p.Shroud.AddVisibility(self, ref visible); + p.Shroud.AddVisibility(self, visible); } public void RemovedFromWorld(Actor self) diff --git a/OpenRA.Game/Traits/World/Shroud.cs b/OpenRA.Game/Traits/World/Shroud.cs index 462f8d39fa..4ced59c1ca 100644 --- a/OpenRA.Game/Traits/World/Shroud.cs +++ b/OpenRA.Game/Traits/World/Shroud.cs @@ -77,7 +77,7 @@ namespace OpenRA.Traits return GetVisOrigins(actor).SelectMany(o => FindVisibleTiles(actor.World, o, range)).Distinct().ToArray(); } - static IEnumerable FindVisibleTiles(World world, CPos position, WRange radius) + public static IEnumerable FindVisibleTiles(World world, CPos position, WRange radius) { var map = world.Map; var r = (radius.Range + 1023) / 1024; @@ -89,15 +89,11 @@ namespace OpenRA.Traits yield return cell; } - public void AddVisibility(Actor a, ref CPos[] visible) + public void AddVisibility(Actor a, CPos[] visible) { - var rs = a.TraitOrDefault(); - if (rs == null || !a.Owner.IsAlliedWith(self.Owner) || rs.Range == WRange.Zero) + if (!a.Owner.IsAlliedWith(self.Owner)) return; - // Lazily generate the visible tiles, allowing the caller to re-use them if desired. - visible = visible ?? FindVisibleTiles(a, rs.Range); - foreach (var c in visible) { var uv = c.ToMPos(map); @@ -134,15 +130,11 @@ namespace OpenRA.Traits Invalidate(visible); } - public void AddShroudGeneration(Actor a, ref CPos[] shrouded) + public void AddShroudGeneration(Actor a, CPos[] shrouded) { - var cs = a.TraitOrDefault(); - if (cs == null || a.Owner.IsAlliedWith(self.Owner) || cs.Range == WRange.Zero) + if (a.Owner.IsAlliedWith(self.Owner)) return; - // Lazily generate the shrouded tiles, allowing the caller to re-use them if desired. - shrouded = shrouded ?? FindVisibleTiles(a, cs.Range); - foreach (var c in shrouded) generatedShroudCount[c]++; @@ -177,10 +169,17 @@ namespace OpenRA.Traits CPos[] shrouded = null; foreach (var p in self.World.Players) { - p.Shroud.RemoveVisibility(self); - p.Shroud.AddVisibility(self, ref visible); - p.Shroud.RemoveShroudGeneration(self); - p.Shroud.AddShroudGeneration(self, ref shrouded); + if (p.Shroud.visibility.TryGetValue(self, out visible)) + { + p.Shroud.RemoveVisibility(self); + p.Shroud.AddVisibility(self, visible); + } + + if (p.Shroud.generation.TryGetValue(self, out shrouded)) + { + p.Shroud.RemoveShroudGeneration(self); + p.Shroud.AddShroudGeneration(self, shrouded); + } } } }