From 43880ea7b8f6d14724c4663603ef68def66bd0c3 Mon Sep 17 00:00:00 2001 From: atlimit8 Date: Mon, 29 May 2017 03:58:16 -0500 Subject: [PATCH] Make AppearsOnRadar trait conditional --- .../Traits/Radar/AppearsOnRadar.cs | 24 ++++++++++++------- 1 file changed, 15 insertions(+), 9 deletions(-) diff --git a/OpenRA.Mods.Common/Traits/Radar/AppearsOnRadar.cs b/OpenRA.Mods.Common/Traits/Radar/AppearsOnRadar.cs index c583986495..e23d141c55 100644 --- a/OpenRA.Mods.Common/Traits/Radar/AppearsOnRadar.cs +++ b/OpenRA.Mods.Common/Traits/Radar/AppearsOnRadar.cs @@ -18,38 +18,44 @@ using OpenRA.Traits; namespace OpenRA.Mods.Common.Traits.Radar { - public class AppearsOnRadarInfo : ITraitInfo + public class AppearsOnRadarInfo : ConditionalTraitInfo { public readonly bool UseLocation = false; - public object Create(ActorInitializer init) { return new AppearsOnRadar(this); } + [Desc("Player stances who can view this actor on radar.")] + public readonly Stance ValidStances = Stance.Ally | Stance.Neutral | Stance.Enemy; + + public override object Create(ActorInitializer init) { return new AppearsOnRadar(this); } } - public class AppearsOnRadar : IRadarSignature, INotifyCreated + public class AppearsOnRadar : ConditionalTrait, IRadarSignature { - readonly AppearsOnRadarInfo info; + static readonly IEnumerable> NoCells = Enumerable.Empty>(); IRadarColorModifier modifier; Color currentColor = Color.Transparent; Func, Pair> cellToSignature; public AppearsOnRadar(AppearsOnRadarInfo info) - { - this.info = info; - } + : base(info) { } - public void Created(Actor self) + protected override void Created(Actor self) { + base.Created(self); modifier = self.TraitsImplementing().FirstOrDefault(); } public IEnumerable> RadarSignatureCells(Actor self) { + var viewer = self.World.RenderPlayer ?? self.World.LocalPlayer; + if (IsTraitDisabled || (viewer != null && !Info.ValidStances.HasStance(self.Owner.Stances[viewer]))) + return NoCells; + var color = Game.Settings.Game.UsePlayerStanceColors ? self.Owner.PlayerStanceColor(self) : self.Owner.Color.RGB; if (modifier != null) color = modifier.RadarColorOverride(self, color); - if (info.UseLocation) + if (Info.UseLocation) return new[] { Pair.New(self.Location, color) }; // PERF: Cache cellToSignature delegate to avoid allocations as color does not change often.