Files
OpenRA/OpenRA.Mods.Common/Traits/Radar/AppearsOnRadar.cs
RoosterDragon 0899d02377 Avoid allocations when generating RadarSignatureCells.
The RadarWidget can supply a reusable buffer to each trait to avoid individual traits having to return new enumerables. Additionally, this allows the two traits to avoid LINQ and further allocations as they can manually enumerate and populate the buffer themselves.
2017-12-12 00:00:51 +01:00

64 lines
2.0 KiB
C#

#region Copyright & License Information
/*
* Copyright 2007-2017 The OpenRA Developers (see AUTHORS)
* This file is part of OpenRA, which is free software. It is made
* available to you under the terms of the GNU General Public License
* as published by the Free Software Foundation, either version 3 of
* the License, or (at your option) any later version. For more
* information, see COPYING.
*/
#endregion
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Linq;
using OpenRA.Primitives;
using OpenRA.Traits;
namespace OpenRA.Mods.Common.Traits.Radar
{
public class AppearsOnRadarInfo : ConditionalTraitInfo
{
public readonly bool UseLocation = false;
[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 : ConditionalTrait<AppearsOnRadarInfo>, IRadarSignature
{
IRadarColorModifier modifier;
public AppearsOnRadar(AppearsOnRadarInfo info)
: base(info) { }
protected override void Created(Actor self)
{
base.Created(self);
modifier = self.TraitsImplementing<IRadarColorModifier>().FirstOrDefault();
}
public void PopulateRadarSignatureCells(Actor self, List<Pair<CPos, Color>> destinationBuffer)
{
var viewer = self.World.RenderPlayer ?? self.World.LocalPlayer;
if (IsTraitDisabled || (viewer != null && !Info.ValidStances.HasStance(self.Owner.Stances[viewer])))
return;
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)
{
destinationBuffer.Add(Pair.New(self.Location, color));
return;
}
foreach (var cell in self.OccupiesSpace.OccupiedCells())
destinationBuffer.Add(Pair.New(cell.First, color));
}
}
}