diff --git a/OpenRA.Game/Selection.cs b/OpenRA.Game/Selection.cs index c2c902b339..250cade7a0 100644 --- a/OpenRA.Game/Selection.cs +++ b/OpenRA.Game/Selection.cs @@ -19,10 +19,22 @@ namespace OpenRA { public class Selection { + public int Hash { get; private set; } + public IEnumerable Actors { get { return actors; } } readonly HashSet actors = new HashSet(); + + 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()) sel.Selected(a); foreach (var ns in w.WorldActor.TraitsImplementing()) @@ -58,6 +70,8 @@ namespace OpenRA } } + UpdateHash(); + foreach (var a in newSelection) foreach (var sel in a.TraitsImplementing()) sel.Selected(a); @@ -85,12 +99,16 @@ namespace OpenRA } } - public IEnumerable 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) {