diff --git a/OpenRA.Mods.Common/Traits/Air/TargetableAircraft.cs b/OpenRA.Mods.Common/Traits/Air/TargetableAircraft.cs index 9067f61630..e8d9924197 100644 --- a/OpenRA.Mods.Common/Traits/Air/TargetableAircraft.cs +++ b/OpenRA.Mods.Common/Traits/Air/TargetableAircraft.cs @@ -35,8 +35,8 @@ namespace OpenRA.Mods.Common.Traits { get { - return (self.CenterPosition.Z > 0) ? info.TargetTypes - : info.GroundedTargetTypes; + return IsTraitDisabled ? None + : (self.CenterPosition.Z > 0 ? info.TargetTypes : info.GroundedTargetTypes); } } } diff --git a/OpenRA.Mods.Common/Traits/TargetableUnit.cs b/OpenRA.Mods.Common/Traits/TargetableUnit.cs index a38111173a..733c792b10 100644 --- a/OpenRA.Mods.Common/Traits/TargetableUnit.cs +++ b/OpenRA.Mods.Common/Traits/TargetableUnit.cs @@ -14,7 +14,7 @@ using OpenRA.Traits; namespace OpenRA.Mods.Common.Traits { [Desc("Actor can be targeted.")] - public class TargetableUnitInfo : ITraitInfo, ITargetableInfo + public class TargetableUnitInfo : UpgradableTraitInfo, ITargetableInfo { [Desc("Target type. Used for filtering (in)valid targets.")] public readonly string[] TargetTypes = { }; @@ -22,35 +22,37 @@ namespace OpenRA.Mods.Common.Traits public bool RequiresForceFire = false; - public virtual object Create(ActorInitializer init) { return new TargetableUnit(init.Self, this); } + public override object Create(ActorInitializer init) { return new TargetableUnit(init.Self, this); } } - public class TargetableUnit : ITargetable + public class TargetableUnit : UpgradableTrait, ITargetable { - readonly TargetableUnitInfo info; + protected static readonly string[] None = new string[] { }; protected Cloak cloak; public TargetableUnit(Actor self, TargetableUnitInfo info) + : base(info) { - this.info = info; cloak = self.TraitOrDefault(); } public virtual bool TargetableBy(Actor self, Actor viewer) { + if (IsTraitDisabled) + return false; if (cloak == null || (!viewer.IsDead && viewer.HasTrait())) return true; return cloak.IsVisible(self, viewer.Owner); } - public virtual string[] TargetTypes { get { return info.TargetTypes; } } + public virtual string[] TargetTypes { get { return IsTraitDisabled ? None : Info.TargetTypes; } } public virtual IEnumerable TargetablePositions(Actor self) { yield return self.CenterPosition; } - public bool RequiresForceFire { get { return info.RequiresForceFire; } } + public bool RequiresForceFire { get { return Info.RequiresForceFire; } } } } diff --git a/OpenRA.Mods.RA/Traits/TargetableSubmarine.cs b/OpenRA.Mods.RA/Traits/TargetableSubmarine.cs index c5aad54b27..f90d1d79aa 100644 --- a/OpenRA.Mods.RA/Traits/TargetableSubmarine.cs +++ b/OpenRA.Mods.RA/Traits/TargetableSubmarine.cs @@ -34,7 +34,8 @@ namespace OpenRA.Mods.RA.Traits { get { - return cloak.Cloaked ? info.CloakedTargetTypes : info.TargetTypes; + return IsTraitDisabled ? None + : (cloak.Cloaked ? info.CloakedTargetTypes : info.TargetTypes); } } } diff --git a/mods/ra/maps/allies-03a/map.yaml b/mods/ra/maps/allies-03a/map.yaml index 4fc30fa115..3771f96b66 100644 --- a/mods/ra/maps/allies-03a/map.yaml +++ b/mods/ra/maps/allies-03a/map.yaml @@ -1382,21 +1382,15 @@ Rules: -ExternalCaptures: Captures: CaptureTypes: building - Cloak@JAIL: + TargetableUnit: UpgradeTypes: jail - UpgradeMinEnabledLevel: 1 - InitialDelay: 0 - CloakDelay: 0 - Palette: + UpgradeMaxEnabledLevel: 0 RenderSprites: Image: E6 MEDI: - Cloak@JAIL: + TargetableUnit: UpgradeTypes: jail - UpgradeMinEnabledLevel: 1 - InitialDelay: 0 - CloakDelay: 0 - Palette: + UpgradeMaxEnabledLevel: 0 E7.noautotarget: Inherits: E7 AutoTarget: diff --git a/mods/ra/maps/allies-03b/map.yaml b/mods/ra/maps/allies-03b/map.yaml index 4b50e2f691..5740bc6431 100644 --- a/mods/ra/maps/allies-03b/map.yaml +++ b/mods/ra/maps/allies-03b/map.yaml @@ -1278,21 +1278,15 @@ Rules: Captures: CaptureTypes: building WithInfantryBody: - Cloak@JAIL: + TargetableUnit: UpgradeTypes: jail - UpgradeMinEnabledLevel: 1 - InitialDelay: 0 - CloakDelay: 0 - Palette: + UpgradeMaxEnabledLevel: 0 RenderSprites: Image: E6 MEDI: - Cloak@JAIL: + TargetableUnit: UpgradeTypes: jail - UpgradeMinEnabledLevel: 1 - InitialDelay: 0 - CloakDelay: 0 - Palette: + UpgradeMaxEnabledLevel: 0 E7.noautotarget: Inherits: E7 AutoTarget: @@ -1312,12 +1306,6 @@ Rules: CAMERA: RevealsShroud: Range: 8c5 - FTUR: - DetectCloaked: - Range: 0 - DOME: - DetectCloaked: - Range: 0 CAMERA.VeryLarge: Inherits: CAMERA RevealsShroud: