diff --git a/OpenRA.Game/Traits/Waypoint.cs b/OpenRA.Game/Traits/Waypoint.cs index 2e129bbf06..c7afeae949 100644 --- a/OpenRA.Game/Traits/Waypoint.cs +++ b/OpenRA.Game/Traits/Waypoint.cs @@ -33,11 +33,13 @@ namespace OpenRA.Traits public void AddedToWorld(Actor self) { + self.World.ActorMap.AddInfluence(self, this); self.World.ScreenMap.Add(self); } public void RemovedFromWorld(Actor self) { + self.World.ActorMap.RemoveInfluence(self, this); self.World.ScreenMap.Remove(self); } } diff --git a/OpenRA.Game/Traits/World/ActorMap.cs b/OpenRA.Game/Traits/World/ActorMap.cs index 06afa295f0..af50470346 100644 --- a/OpenRA.Game/Traits/World/ActorMap.cs +++ b/OpenRA.Game/Traits/World/ActorMap.cs @@ -37,9 +37,6 @@ namespace OpenRA.Traits { map = world.Map; influence = new InfluenceNode[world.Map.MapSize.X, world.Map.MapSize.Y]; - - world.ActorAdded += a => Add(a, a.OccupiesSpace); - world.ActorRemoved += a => Remove(a, a.OccupiesSpace); } public IEnumerable GetUnitsAt(CPos a) @@ -95,21 +92,19 @@ namespace OpenRA.Traits return false; } - public void Add(Actor self, IOccupySpace unit) + public void AddInfluence(Actor self, IOccupySpace ios) { - if (unit != null) - foreach (var c in unit.OccupiedCells()) - influence[c.First.X, c.First.Y] = new InfluenceNode { next = influence[c.First.X, c.First.Y], subCell = c.Second, actor = self }; + foreach (var c in ios.OccupiedCells()) + influence[c.First.X, c.First.Y] = new InfluenceNode { next = influence[c.First.X, c.First.Y], subCell = c.Second, actor = self }; } - public void Remove(Actor self, IOccupySpace unit) + public void RemoveInfluence(Actor self, IOccupySpace ios) { - if (unit != null) - foreach (var c in unit.OccupiedCells()) - RemoveInner(ref influence[c.First.X, c.First.Y], self); + foreach (var c in ios.OccupiedCells()) + RemoveInfluenceInner(ref influence[c.First.X, c.First.Y], self); } - void RemoveInner(ref InfluenceNode influenceNode, Actor toRemove) + void RemoveInfluenceInner(ref InfluenceNode influenceNode, Actor toRemove) { if (influenceNode == null) return; @@ -117,14 +112,7 @@ namespace OpenRA.Traits influenceNode = influenceNode.next; if (influenceNode != null) - RemoveInner(ref influenceNode.next, toRemove); - } - - public void Update(Actor self, IOccupySpace unit) - { - Remove(self, unit); - if (!self.IsDead()) - Add(self, unit); + RemoveInfluenceInner(ref influenceNode.next, toRemove); } } } diff --git a/OpenRA.Mods.RA/Air/Aircraft.cs b/OpenRA.Mods.RA/Air/Aircraft.cs index ff450b021e..c1baf48b51 100755 --- a/OpenRA.Mods.RA/Air/Aircraft.cs +++ b/OpenRA.Mods.RA/Air/Aircraft.cs @@ -115,11 +115,13 @@ namespace OpenRA.Mods.RA.Air public void AddedToWorld(Actor self) { + self.World.ActorMap.AddInfluence(self, this); self.World.ScreenMap.Add(self); } public void RemovedFromWorld(Actor self) { + self.World.ActorMap.RemoveInfluence(self, this); self.World.ScreenMap.Remove(self); } diff --git a/OpenRA.Mods.RA/Buildings/Building.cs b/OpenRA.Mods.RA/Buildings/Building.cs index 62c64e2c72..0ec7af8b7a 100755 --- a/OpenRA.Mods.RA/Buildings/Building.cs +++ b/OpenRA.Mods.RA/Buildings/Building.cs @@ -160,11 +160,13 @@ namespace OpenRA.Mods.RA.Buildings public void AddedToWorld(Actor self) { + self.World.ActorMap.AddInfluence(self, this); self.World.ScreenMap.Add(self); } public void RemovedFromWorld(Actor self) { + self.World.ActorMap.RemoveInfluence(self, this); self.World.ScreenMap.Remove(self); } } diff --git a/OpenRA.Mods.RA/Crate.cs b/OpenRA.Mods.RA/Crate.cs index 8193cefec3..68ba35bb26 100644 --- a/OpenRA.Mods.RA/Crate.cs +++ b/OpenRA.Mods.RA/Crate.cs @@ -104,7 +104,7 @@ namespace OpenRA.Mods.RA public void SetPosition(Actor self, CPos cell) { if (self.IsInWorld) - self.World.ActorMap.Remove(self, this); + self.World.ActorMap.RemoveInfluence(self, this); Location = cell; CenterPosition = cell.CenterPosition; @@ -116,7 +116,7 @@ namespace OpenRA.Mods.RA if (self.IsInWorld) { - self.World.ActorMap.Add(self, this); + self.World.ActorMap.AddInfluence(self, this); self.World.ScreenMap.Update(self); } } @@ -128,11 +128,13 @@ namespace OpenRA.Mods.RA public void AddedToWorld(Actor self) { + self.World.ActorMap.AddInfluence(self, this); self.World.ScreenMap.Add(self); } public void RemovedFromWorld(Actor self) { + self.World.ActorMap.RemoveInfluence(self, this); self.World.ScreenMap.Remove(self); } } diff --git a/OpenRA.Mods.RA/Husk.cs b/OpenRA.Mods.RA/Husk.cs index 1879b01017..9e41fb64ca 100644 --- a/OpenRA.Mods.RA/Husk.cs +++ b/OpenRA.Mods.RA/Husk.cs @@ -72,20 +72,22 @@ namespace OpenRA.Mods.RA public void SetPosition(Actor self, WPos pos) { - self.World.ActorMap.Remove(self, this); + self.World.ActorMap.RemoveInfluence(self, this); CenterPosition = pos; TopLeft = pos.ToCPos(); - self.World.ActorMap.Add(self, this); + self.World.ActorMap.AddInfluence(self, this); self.World.ScreenMap.Update(self); } public void AddedToWorld(Actor self) { + self.World.ActorMap.AddInfluence(self, this); self.World.ScreenMap.Add(self); } public void RemovedFromWorld(Actor self) { + self.World.ActorMap.RemoveInfluence(self, this); self.World.ScreenMap.Remove(self); } } diff --git a/OpenRA.Mods.RA/Mine.cs b/OpenRA.Mods.RA/Mine.cs index cab1ed9280..f42264d4a8 100644 --- a/OpenRA.Mods.RA/Mine.cs +++ b/OpenRA.Mods.RA/Mine.cs @@ -65,11 +65,13 @@ namespace OpenRA.Mods.RA public void AddedToWorld(Actor self) { + self.World.ActorMap.AddInfluence(self, this); self.World.ScreenMap.Add(self); } public void RemovedFromWorld(Actor self) { + self.World.ActorMap.RemoveInfluence(self, this); self.World.ScreenMap.Remove(self); } } diff --git a/OpenRA.Mods.RA/Move/Mobile.cs b/OpenRA.Mods.RA/Move/Mobile.cs index bb72477cdc..1679654e42 100755 --- a/OpenRA.Mods.RA/Move/Mobile.cs +++ b/OpenRA.Mods.RA/Move/Mobile.cs @@ -237,11 +237,13 @@ namespace OpenRA.Mods.RA.Move public void AddedToWorld(Actor self) { + self.World.ActorMap.AddInfluence(self, this); self.World.ScreenMap.Add(self); } public void RemovedFromWorld(Actor self) { + self.World.ActorMap.RemoveInfluence(self, this); self.World.ScreenMap.Remove(self); } @@ -442,13 +444,13 @@ namespace OpenRA.Mods.RA.Move public void AddInfluence() { if (self.IsInWorld) - self.World.ActorMap.Add(self, this); + self.World.ActorMap.AddInfluence(self, this); } public void RemoveInfluence() { if (self.IsInWorld) - self.World.ActorMap.Remove(self, this); + self.World.ActorMap.RemoveInfluence(self, this); } public void Nudge(Actor self, Actor nudger, bool force)