diff --git a/OpenRA.Game/World.cs b/OpenRA.Game/World.cs index 1ad996673b..98bffa816a 100644 --- a/OpenRA.Game/World.cs +++ b/OpenRA.Game/World.cs @@ -194,6 +194,35 @@ namespace OpenRA player.Shroud.ExploreAll(this); } + public void AddToMaps(Actor self, IOccupySpace ios) + { + ActorMap.AddInfluence(self, ios); + ActorMap.AddPosition(self, ios); + + if (!self.Bounds.Size.IsEmpty) + ScreenMap.Add(self); + } + + public void UpdateMaps(Actor self, IOccupySpace ios) + { + if (!self.IsInWorld) + return; + + if (!self.Bounds.Size.IsEmpty) + ScreenMap.Update(self); + + ActorMap.UpdatePosition(self, ios); + } + + public void RemoveFromMaps(Actor self, IOccupySpace ios) + { + ActorMap.RemoveInfluence(self, ios); + ActorMap.RemovePosition(self, ios); + + if (!self.Bounds.Size.IsEmpty) + ScreenMap.Remove(self); + } + public void LoadComplete(WorldRenderer wr) { // ScreenMap must be initialized before anything else diff --git a/OpenRA.Mods.Common/Traits/Air/Aircraft.cs b/OpenRA.Mods.Common/Traits/Air/Aircraft.cs index ae5428f29e..fea619a866 100644 --- a/OpenRA.Mods.Common/Traits/Air/Aircraft.cs +++ b/OpenRA.Mods.Common/Traits/Air/Aircraft.cs @@ -134,9 +134,8 @@ namespace OpenRA.Mods.Common.Traits public void AddedToWorld(Actor self) { - self.World.ActorMap.AddInfluence(self, this); - self.World.ActorMap.AddPosition(self, this); - self.World.ScreenMap.Add(self); + self.World.AddToMaps(self, this); + var altitude = self.World.Map.DistanceAboveTerrain(CenterPosition); if (altitude.Length >= Info.MinAirborneAltitude) OnAirborneAltitudeReached(); @@ -353,8 +352,8 @@ namespace OpenRA.Mods.Common.Traits if (!self.IsInWorld) return; - self.World.ScreenMap.Update(self); - self.World.ActorMap.UpdatePosition(self, this); + self.World.UpdateMaps(self, this); + var altitude = self.World.Map.DistanceAboveTerrain(CenterPosition); var isAirborne = altitude.Length >= Info.MinAirborneAltitude; if (isAirborne && !airborne) @@ -603,9 +602,8 @@ namespace OpenRA.Mods.Common.Traits public void RemovedFromWorld(Actor self) { UnReserve(); - self.World.ActorMap.RemoveInfluence(self, this); - self.World.ActorMap.RemovePosition(self, this); - self.World.ScreenMap.Remove(self); + self.World.RemoveFromMaps(self, this); + OnCruisingAltitudeLeft(); OnAirborneAltitudeLeft(); } diff --git a/OpenRA.Mods.Common/Traits/Crates/Crate.cs b/OpenRA.Mods.Common/Traits/Crates/Crate.cs index 01c7ea08ce..d8ec47e7ce 100644 --- a/OpenRA.Mods.Common/Traits/Crates/Crate.cs +++ b/OpenRA.Mods.Common/Traits/Crates/Crate.cs @@ -157,11 +157,7 @@ namespace OpenRA.Mods.Common.Traits public void SetVisualPosition(Actor self, WPos pos) { CenterPosition = pos; - if (self.IsInWorld) - { - self.World.ScreenMap.Update(self); - self.World.ActorMap.UpdatePosition(self, this); - } + self.World.UpdateMaps(self, this); } // Sets only the location (Location) @@ -207,9 +203,7 @@ namespace OpenRA.Mods.Common.Traits public void AddedToWorld(Actor self) { - self.World.ActorMap.AddInfluence(self, this); - self.World.ActorMap.AddPosition(self, this); - self.World.ScreenMap.Add(self); + self.World.AddToMaps(self, this); var cs = self.World.WorldActor.TraitOrDefault(); if (cs != null) @@ -218,9 +212,7 @@ namespace OpenRA.Mods.Common.Traits public void RemovedFromWorld(Actor self) { - self.World.ActorMap.RemoveInfluence(self, this); - self.World.ActorMap.RemovePosition(self, this); - self.World.ScreenMap.Remove(self); + self.World.RemoveFromMaps(self, this); var cs = self.World.WorldActor.TraitOrDefault(); if (cs != null) diff --git a/OpenRA.Mods.Common/Traits/Husk.cs b/OpenRA.Mods.Common/Traits/Husk.cs index 92879d3025..426de9ba25 100644 --- a/OpenRA.Mods.Common/Traits/Husk.cs +++ b/OpenRA.Mods.Common/Traits/Husk.cs @@ -106,22 +106,18 @@ namespace OpenRA.Mods.Common.Traits CenterPosition = pos; TopLeft = self.World.Map.CellContaining(pos); self.World.ActorMap.AddInfluence(self, this); - self.World.ActorMap.UpdatePosition(self, this); - self.World.ScreenMap.Update(self); + + self.World.UpdateMaps(self, this); } public void AddedToWorld(Actor self) { - self.World.ActorMap.AddInfluence(self, this); - self.World.ActorMap.AddPosition(self, this); - self.World.ScreenMap.Add(self); + self.World.AddToMaps(self, this); } public void RemovedFromWorld(Actor self) { - self.World.ActorMap.RemoveInfluence(self, this); - self.World.ActorMap.RemovePosition(self, this); - self.World.ScreenMap.Remove(self); + self.World.RemoveFromMaps(self, this); } public bool Disabled diff --git a/OpenRA.Mods.Common/Traits/Mobile.cs b/OpenRA.Mods.Common/Traits/Mobile.cs index 9e4a548a83..0cfc5d6266 100644 --- a/OpenRA.Mods.Common/Traits/Mobile.cs +++ b/OpenRA.Mods.Common/Traits/Mobile.cs @@ -430,25 +430,17 @@ namespace OpenRA.Mods.Common.Traits public void SetVisualPosition(Actor self, WPos pos) { CenterPosition = pos; - if (self.IsInWorld) - { - self.World.ScreenMap.Update(self); - self.World.ActorMap.UpdatePosition(self, this); - } + self.World.UpdateMaps(self, this); } public void AddedToWorld(Actor self) { - self.World.ActorMap.AddInfluence(self, this); - self.World.ActorMap.AddPosition(self, this); - self.World.ScreenMap.Add(self); + self.World.AddToMaps(self, this); } public void RemovedFromWorld(Actor self) { - self.World.ActorMap.RemoveInfluence(self, this); - self.World.ActorMap.RemovePosition(self, this); - self.World.ScreenMap.Remove(self); + self.World.RemoveFromMaps(self, this); } public IEnumerable Orders { get { yield return new MoveOrderTargeter(self, this); } }