Add ActorsHavingTrait<TTrait>([Func<TTrait, bool])

This commit is contained in:
atlimit8
2015-10-25 04:45:53 -05:00
parent 0997f5b52f
commit b6f17df260
27 changed files with 132 additions and 125 deletions

View File

@@ -185,8 +185,7 @@ namespace OpenRA.Graphics
if (World.Type == WorldType.Regular && Game.Settings.Game.AlwaysShowStatusBars)
{
foreach (var g in World.Actors.Where(a => !a.Disposed
&& a.Info.HasTraitInfo<SelectableInfo>()
foreach (var g in World.ActorsHavingTrait<Selectable>().Where(a => !a.Disposed
&& !World.FogObscures(a)
&& !World.Selection.Actors.Contains(a)))

View File

@@ -107,6 +107,16 @@ namespace OpenRA
return InnerGet<T>().All();
}
public IEnumerable<Actor> ActorsHavingTrait<T>()
{
return InnerGet<T>().Actors();
}
public IEnumerable<Actor> ActorsHavingTrait<T>(Func<T, bool> predicate)
{
return InnerGet<T>().Actors(predicate);
}
public void RemoveActor(Actor a)
{
foreach (var t in traits)
@@ -196,6 +206,33 @@ namespace OpenRA
return new AllEnumerable(this);
}
public IEnumerable<Actor> Actors()
{
++Queries;
Actor last = null;
for (var i = 0; i < actors.Count; i++)
{
if (actors[i] == last)
continue;
yield return actors[i];
last = actors[i];
}
}
public IEnumerable<Actor> Actors(Func<T, bool> predicate)
{
++Queries;
Actor last = null;
for (var i = 0; i < actors.Count; i++)
{
if (actors[i] == last || !predicate(traits[i]))
continue;
yield return actors[i];
last = actors[i];
}
}
class AllEnumerable : IEnumerable<TraitPair<T>>
{
readonly TraitContainer<T> container;

View File

@@ -351,6 +351,16 @@ namespace OpenRA
return TraitDict.ActorsWithTrait<T>();
}
public IEnumerable<Actor> ActorsHavingTrait<T>()
{
return TraitDict.ActorsHavingTrait<T>();
}
public IEnumerable<Actor> ActorsHavingTrait<T>(Func<T, bool> predicate)
{
return TraitDict.ActorsHavingTrait<T>(predicate);
}
public void OnPlayerWinStateChanged(Player player)
{
var pi = gameInfo.GetPlayer(player);