diff --git a/OpenRA.Mods.RA/Traits/GpsWatcher.cs b/OpenRA.Mods.RA/Traits/GpsWatcher.cs index 9ff24f79bf..713d0f6063 100644 --- a/OpenRA.Mods.RA/Traits/GpsWatcher.cs +++ b/OpenRA.Mods.RA/Traits/GpsWatcher.cs @@ -32,6 +32,9 @@ namespace OpenRA.Mods.RA.Traits [Sync] public bool GrantedAllies { get; private set; } [Sync] public bool Granted { get; private set; } + // Whether this watcher has explored the terrain (by becoming Launched, or an ally becoming Launched) + [Sync] bool explored; + readonly Player owner; readonly List actors = new List(); @@ -70,21 +73,23 @@ namespace OpenRA.Mods.RA.Traits foreach (var i in atek.World.ActorsWithTrait()) i.Trait.RefreshGranted(); - - if ((Granted || GrantedAllies) && atek.Owner.IsAlliedWith(owner)) - atek.Owner.Shroud.ExploreAll(); } void RefreshGranted() { var wasGranted = Granted; var wasGrantedAllies = GrantedAllies; + var allyWatchers = owner.World.ActorsWithTrait().Where(kv => kv.Actor.Owner.IsAlliedWith(owner)); Granted = actors.Count > 0 && Launched; - GrantedAllies = owner.World.ActorsHavingTrait(g => g.Granted).Any(p => p.Owner.IsAlliedWith(owner)); + GrantedAllies = allyWatchers.Any(w => w.Trait.Granted); - if (Granted || GrantedAllies) + var allyLaunched = allyWatchers.Any(w => w.Trait.Launched); + if ((Launched || allyLaunched) && !explored) + { + explored = true; owner.Shroud.ExploreAll(); + } if (wasGranted != Granted || wasGrantedAllies != GrantedAllies) foreach (var tp in notifyOnRefresh.ToList())