Add Selection.Hash for tracking selection changes.

This commit is contained in:
Paul Chote
2017-06-03 15:46:51 +01:00
committed by Curtis Shmyr
parent e8d6d63707
commit 8dfb7d8bbc

View File

@@ -19,10 +19,22 @@ namespace OpenRA
{
public class Selection
{
public int Hash { get; private set; }
public IEnumerable<Actor> Actors { get { return actors; } }
readonly HashSet<Actor> actors = new HashSet<Actor>();
void UpdateHash()
{
Hash = actors.Count << 16;
foreach (var a in actors)
Hash ^= Sync.HashActor(a);
}
public void Add(World w, Actor a)
{
actors.Add(a);
UpdateHash();
foreach (var sel in a.TraitsImplementing<INotifySelected>())
sel.Selected(a);
foreach (var ns in w.WorldActor.TraitsImplementing<INotifySelection>())
@@ -58,6 +70,8 @@ namespace OpenRA
}
}
UpdateHash();
foreach (var a in newSelection)
foreach (var sel in a.TraitsImplementing<INotifySelected>())
sel.Selected(a);
@@ -85,12 +99,16 @@ namespace OpenRA
}
}
public IEnumerable<Actor> Actors { get { return actors; } }
public void Clear() { actors.Clear(); }
public void Clear()
{
actors.Clear();
UpdateHash();
}
public void Tick(World world)
{
actors.RemoveWhere(a => !a.IsInWorld || (!a.Owner.IsAlliedWith(world.RenderPlayer) && world.FogObscures(a)));
UpdateHash();
foreach (var cg in controlGroups.Values)
{