diff --git a/OpenRa.Game/Traits/Activities/Move.cs b/OpenRa.Game/Traits/Activities/Move.cs index 603b73232e..7d07b4d550 100755 --- a/OpenRa.Game/Traits/Activities/Move.cs +++ b/OpenRa.Game/Traits/Activities/Move.cs @@ -99,8 +99,6 @@ namespace OpenRa.Game.Traits.Activities unit.Facing, 0 ); - Game.UnitInfluence.Update( mobile ); - move.TickMove( self, mobile, this ); return null; @@ -129,10 +127,10 @@ namespace OpenRa.Game.Traits.Activities return null; } - Game.UnitInfluence.Remove( mobile ); + Game.UnitInfluence.Remove( self, mobile ); var newPath = getPath(self, mobile).TakeWhile(a => a != self.Location).ToList(); - Game.UnitInfluence.Add( mobile ); + Game.UnitInfluence.Add( self, mobile ); if (newPath.Count != 0) path = newPath; @@ -219,7 +217,6 @@ namespace OpenRa.Game.Traits.Activities moveFraction - moveFractionTotal ); mobile.fromCell = mobile.toCell; mobile.toCell = nextCell.Value; - Game.UnitInfluence.Update( mobile ); return ret; } else @@ -232,7 +229,6 @@ namespace OpenRa.Game.Traits.Activities unit.Facing, moveFraction - moveFractionTotal ); mobile.fromCell = mobile.toCell; - Game.UnitInfluence.Update( mobile ); return ret2; } } diff --git a/OpenRa.Game/Traits/Mobile.cs b/OpenRa.Game/Traits/Mobile.cs index 4feb981222..0a0da91524 100644 --- a/OpenRa.Game/Traits/Mobile.cs +++ b/OpenRa.Game/Traits/Mobile.cs @@ -7,25 +7,25 @@ namespace OpenRa.Game.Traits { class Mobile : IOrder, IOccupySpace { - public Actor self; + readonly Actor self; int2 __fromCell; public int2 fromCell { get { return __fromCell; } - set { Game.UnitInfluence.Remove(this); __fromCell = value; Game.UnitInfluence.Add(this); } + set { Game.UnitInfluence.Remove(self, this); __fromCell = value; Game.UnitInfluence.Add(self, this); } } public int2 toCell { get { return self.Location; } - set { Game.UnitInfluence.Remove(this); self.Location = value; Game.UnitInfluence.Add(this); } + set { Game.UnitInfluence.Remove(self, this); self.Location = value; Game.UnitInfluence.Add(self, this); } } public Mobile(Actor self) { this.self = self; - fromCell = toCell; - Game.UnitInfluence.Update(this); + __fromCell = toCell; + Game.UnitInfluence.Add(self, this); } public Order IssueOrder(Actor self, int2 xy, bool lmb, Actor underCursor) diff --git a/OpenRa.Game/UnitInfluenceMap.cs b/OpenRa.Game/UnitInfluenceMap.cs index 461ae141ed..472d76d1fb 100644 --- a/OpenRa.Game/UnitInfluenceMap.cs +++ b/OpenRa.Game/UnitInfluenceMap.cs @@ -12,7 +12,7 @@ namespace OpenRa.Game public UnitInfluenceMap() { - Game.world.ActorRemoved += a => Remove(a.traits.GetOrDefault()); + Game.world.ActorRemoved += a => Remove(a, a.traits.WithInterface().FirstOrDefault()); } public void Tick() @@ -25,21 +25,18 @@ namespace OpenRa.Game { for( int y = 0 ; y < 128 ; y++ ) for( int x = 0 ; x < 128 ; x++ ) - if( influence[ x, y ] != null && !influence[ x, y ].traits.Get().OccupiedCells().Contains( new int2( x, y ) ) ) + if( influence[ x, y ] != null && !influence[ x, y ].traits.WithInterface().First().OccupiedCells().Contains( new int2( x, y ) ) ) throw new InvalidOperationException( "UIM: Sanity check failed A" ); foreach( var a in Game.world.Actors ) - { - if( !a.traits.Contains() ) - continue; - foreach( var cell in a.traits.Get().OccupiedCells() ) - if( influence[ cell.X, cell.Y ] != a ) - throw new InvalidOperationException( "UIM: Sanity check failed B" ); - } + foreach( var ios in a.traits.WithInterface() ) + foreach( var cell in ios.OccupiedCells() ) + if( influence[ cell.X, cell.Y ] != a ) + throw new InvalidOperationException( "UIM: Sanity check failed B" ); } [Conditional( "SANITY_CHECKS" )] - void SanityCheckAdd( Mobile a ) + void SanityCheckAdd( IOccupySpace a ) { foreach( var c in a.OccupiedCells() ) if( influence[c.X, c.Y] != null ) @@ -51,30 +48,28 @@ namespace OpenRa.Game return influence[ a.X, a.Y ]; } - public void Add(Mobile a) + public void Add( Actor self, IOccupySpace unit ) { - SanityCheckAdd(a); - foreach (var c in a.OccupiedCells()) - influence[c.X, c.Y] = a.self; + SanityCheckAdd( unit ); + foreach( var c in unit.OccupiedCells() ) + influence[c.X, c.Y] = self; } - public void Remove(Mobile a) + public void Remove( Actor self, IOccupySpace unit ) { - if (a == null) return; - - var min = int2.Max(new int2(0, 0), a.self.Location - searchDistance); - var max = int2.Min(new int2(128, 128), a.self.Location + searchDistance); + var min = int2.Max(new int2(0, 0), self.Location - searchDistance); + var max = int2.Min(new int2(128, 128), self.Location + searchDistance); for (var j = min.Y; j <= max.Y; j++) for (var i = min.X; i <= max.X; i++) - if (influence[i, j] == a.self) + if (influence[i, j] == self) influence[i, j] = null; } - public void Update(Mobile a) + public void Update(Actor self, IOccupySpace unit) { - Remove(a); - if (!a.self.IsDead) Add(a); + Remove(self, unit); + if (!self.IsDead) Add(self, unit); } } }