diff --git a/OpenRA.Mods.RA/Traits/SupportPowers/GpsPower.cs b/OpenRA.Mods.RA/Traits/SupportPowers/GpsPower.cs index 0042174594..15a0f535b9 100644 --- a/OpenRA.Mods.RA/Traits/SupportPowers/GpsPower.cs +++ b/OpenRA.Mods.RA/Traits/SupportPowers/GpsPower.cs @@ -41,17 +41,22 @@ namespace OpenRA.Mods.RA.Traits [Desc("Custom palette is a player palette BaseName")] public readonly bool SatellitePaletteIsPlayerPalette = true; + [Desc("Requires an actor with an online `ProvidesRadar` to show GPS dots.")] + public readonly bool RequiresActiveRadar = true; + public override object Create(ActorInitializer init) { return new GpsPower(init.Self, this); } } - class GpsPower : SupportPower, INotifyKilled, INotifySold, INotifyOwnerChanged + class GpsPower : SupportPower, INotifyKilled, INotifySold, INotifyOwnerChanged, ITick { + readonly Actor self; readonly GpsPowerInfo info; GpsWatcher owner; public GpsPower(Actor self, GpsPowerInfo info) : base(self, info) { + this.self = self; this.info = info; owner = self.Owner.PlayerActor.Trait(); owner.GpsAdd(self); @@ -93,5 +98,22 @@ namespace OpenRA.Mods.RA.Traits owner = newOwner.PlayerActor.Trait(); owner.GpsAdd(self); } + + bool NoActiveRadar { get { return !self.World.ActorsHavingTrait(r => r.IsActive).Any(a => a.Owner == self.Owner); } } + bool wasDisabled; + + public void Tick(Actor self) + { + if (!wasDisabled && (self.IsDisabled() || (info.RequiresActiveRadar && NoActiveRadar))) + { + wasDisabled = true; + RemoveGps(self); + } + else if (wasDisabled && !self.IsDisabled() && !(info.RequiresActiveRadar && NoActiveRadar)) + { + wasDisabled = false; + owner.GpsAdd(self); + } + } } } diff --git a/mods/ra/rules/structures.yaml b/mods/ra/rules/structures.yaml index 50e1313522..848259086c 100644 --- a/mods/ra/rules/structures.yaml +++ b/mods/ra/rules/structures.yaml @@ -776,7 +776,7 @@ ATEK: OneShot: yes ChargeTime: 480 Description: GPS Satellite - LongDesc: Reveals map terrain and provides tactical\ninformation. + LongDesc: Reveals map terrain and provides tactical\ninformation. Requires power and active radar. RevealDelay: 15 LaunchSound: satlnch1.aud DisplayTimer: True