From 3885f0b55986e085437d7c7d3f01a7e6d664139b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Mail=C3=A4nder?= Date: Sun, 21 Feb 2016 11:34:33 +0100 Subject: [PATCH 1/2] Fix screen map updates for boundless actors. --- OpenRA.Mods.Common/Traits/Air/Aircraft.cs | 14 +++++++++++--- OpenRA.Mods.Common/Traits/Crates/Crate.cs | 8 ++++++-- OpenRA.Mods.Common/Traits/Husk.cs | 12 +++++++++--- OpenRA.Mods.Common/Traits/Mobile.cs | 12 +++++++++--- 4 files changed, 35 insertions(+), 11 deletions(-) diff --git a/OpenRA.Mods.Common/Traits/Air/Aircraft.cs b/OpenRA.Mods.Common/Traits/Air/Aircraft.cs index c6b9a08a77..a64d9f9832 100644 --- a/OpenRA.Mods.Common/Traits/Air/Aircraft.cs +++ b/OpenRA.Mods.Common/Traits/Air/Aircraft.cs @@ -135,7 +135,10 @@ namespace OpenRA.Mods.Common.Traits { self.World.ActorMap.AddInfluence(self, this); self.World.ActorMap.AddPosition(self, this); - self.World.ScreenMap.Add(self); + + if (!self.Bounds.Size.IsEmpty) + self.World.ScreenMap.Add(self); + var altitude = self.World.Map.DistanceAboveTerrain(CenterPosition); if (altitude.Length >= Info.MinAirborneAltitude) OnAirborneAltitudeReached(); @@ -352,7 +355,9 @@ namespace OpenRA.Mods.Common.Traits if (!self.IsInWorld) return; - self.World.ScreenMap.Update(self); + if (!self.Bounds.Size.IsEmpty) + self.World.ScreenMap.Update(self); + self.World.ActorMap.UpdatePosition(self, this); var altitude = self.World.Map.DistanceAboveTerrain(CenterPosition); var isAirborne = altitude.Length >= Info.MinAirborneAltitude; @@ -604,7 +609,10 @@ namespace OpenRA.Mods.Common.Traits UnReserve(); self.World.ActorMap.RemoveInfluence(self, this); self.World.ActorMap.RemovePosition(self, this); - self.World.ScreenMap.Remove(self); + + if (!self.Bounds.Size.IsEmpty) + self.World.ScreenMap.Remove(self); + OnCruisingAltitudeLeft(); OnAirborneAltitudeLeft(); } diff --git a/OpenRA.Mods.Common/Traits/Crates/Crate.cs b/OpenRA.Mods.Common/Traits/Crates/Crate.cs index 6b175539e0..1d3d960b4c 100644 --- a/OpenRA.Mods.Common/Traits/Crates/Crate.cs +++ b/OpenRA.Mods.Common/Traits/Crates/Crate.cs @@ -208,7 +208,9 @@ namespace OpenRA.Mods.Common.Traits { self.World.ActorMap.AddInfluence(self, this); self.World.ActorMap.AddPosition(self, this); - self.World.ScreenMap.Add(self); + + if (!self.Bounds.Size.IsEmpty) + self.World.ScreenMap.Add(self); var cs = self.World.WorldActor.TraitOrDefault(); if (cs != null) @@ -219,7 +221,9 @@ namespace OpenRA.Mods.Common.Traits { self.World.ActorMap.RemoveInfluence(self, this); self.World.ActorMap.RemovePosition(self, this); - self.World.ScreenMap.Remove(self); + + if (!self.Bounds.Size.IsEmpty) + self.World.ScreenMap.Remove(self); 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 1002b01d55..ab4bc339b5 100644 --- a/OpenRA.Mods.Common/Traits/Husk.cs +++ b/OpenRA.Mods.Common/Traits/Husk.cs @@ -106,21 +106,27 @@ namespace OpenRA.Mods.Common.Traits TopLeft = self.World.Map.CellContaining(pos); self.World.ActorMap.AddInfluence(self, this); self.World.ActorMap.UpdatePosition(self, this); - self.World.ScreenMap.Update(self); + + if (!self.Bounds.Size.IsEmpty) + self.World.ScreenMap.Update(self); } public void AddedToWorld(Actor self) { self.World.ActorMap.AddInfluence(self, this); self.World.ActorMap.AddPosition(self, this); - self.World.ScreenMap.Add(self); + + if (!self.Bounds.Size.IsEmpty) + self.World.ScreenMap.Add(self); } public void RemovedFromWorld(Actor self) { self.World.ActorMap.RemoveInfluence(self, this); self.World.ActorMap.RemovePosition(self, this); - self.World.ScreenMap.Remove(self); + + if (!self.Bounds.Size.IsEmpty) + self.World.ScreenMap.Remove(self); } public bool Disabled diff --git a/OpenRA.Mods.Common/Traits/Mobile.cs b/OpenRA.Mods.Common/Traits/Mobile.cs index 11c6aeacf5..d00521fbfd 100644 --- a/OpenRA.Mods.Common/Traits/Mobile.cs +++ b/OpenRA.Mods.Common/Traits/Mobile.cs @@ -431,7 +431,9 @@ namespace OpenRA.Mods.Common.Traits CenterPosition = pos; if (self.IsInWorld) { - self.World.ScreenMap.Update(self); + if (!self.Bounds.Size.IsEmpty) + self.World.ScreenMap.Update(self); + self.World.ActorMap.UpdatePosition(self, this); } } @@ -440,14 +442,18 @@ namespace OpenRA.Mods.Common.Traits { self.World.ActorMap.AddInfluence(self, this); self.World.ActorMap.AddPosition(self, this); - self.World.ScreenMap.Add(self); + + if (!self.Bounds.Size.IsEmpty) + self.World.ScreenMap.Add(self); } public void RemovedFromWorld(Actor self) { self.World.ActorMap.RemoveInfluence(self, this); self.World.ActorMap.RemovePosition(self, this); - self.World.ScreenMap.Remove(self); + + if (!self.Bounds.Size.IsEmpty) + self.World.ScreenMap.Remove(self); } public IEnumerable Orders { get { yield return new MoveOrderTargeter(self, this); } } From 9734054582bd7bd9c9fea9432dc3339e25df5140 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Matthias=20Mail=C3=A4nder?= Date: Fri, 26 Feb 2016 10:49:36 +0100 Subject: [PATCH 2/2] Reduce duplication. --- OpenRA.Game/World.cs | 29 +++++++++++++++++++++++ OpenRA.Mods.Common/Traits/Air/Aircraft.cs | 16 +++---------- OpenRA.Mods.Common/Traits/Crates/Crate.cs | 18 +++----------- OpenRA.Mods.Common/Traits/Husk.cs | 16 +++---------- OpenRA.Mods.Common/Traits/Mobile.cs | 20 +++------------- 5 files changed, 41 insertions(+), 58 deletions(-) diff --git a/OpenRA.Game/World.cs b/OpenRA.Game/World.cs index b37f5c4448..9a9559f0d8 100644 --- a/OpenRA.Game/World.cs +++ b/OpenRA.Game/World.cs @@ -193,6 +193,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 a64d9f9832..75fa87381b 100644 --- a/OpenRA.Mods.Common/Traits/Air/Aircraft.cs +++ b/OpenRA.Mods.Common/Traits/Air/Aircraft.cs @@ -133,11 +133,7 @@ namespace OpenRA.Mods.Common.Traits public void AddedToWorld(Actor self) { - self.World.ActorMap.AddInfluence(self, this); - self.World.ActorMap.AddPosition(self, this); - - if (!self.Bounds.Size.IsEmpty) - self.World.ScreenMap.Add(self); + self.World.AddToMaps(self, this); var altitude = self.World.Map.DistanceAboveTerrain(CenterPosition); if (altitude.Length >= Info.MinAirborneAltitude) @@ -355,10 +351,8 @@ namespace OpenRA.Mods.Common.Traits if (!self.IsInWorld) return; - if (!self.Bounds.Size.IsEmpty) - self.World.ScreenMap.Update(self); + self.World.UpdateMaps(self, this); - self.World.ActorMap.UpdatePosition(self, this); var altitude = self.World.Map.DistanceAboveTerrain(CenterPosition); var isAirborne = altitude.Length >= Info.MinAirborneAltitude; if (isAirborne && !airborne) @@ -607,11 +601,7 @@ namespace OpenRA.Mods.Common.Traits public void RemovedFromWorld(Actor self) { UnReserve(); - self.World.ActorMap.RemoveInfluence(self, this); - self.World.ActorMap.RemovePosition(self, this); - - if (!self.Bounds.Size.IsEmpty) - 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 1d3d960b4c..39556d05b8 100644 --- a/OpenRA.Mods.Common/Traits/Crates/Crate.cs +++ b/OpenRA.Mods.Common/Traits/Crates/Crate.cs @@ -156,11 +156,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) @@ -206,11 +202,7 @@ namespace OpenRA.Mods.Common.Traits public void AddedToWorld(Actor self) { - self.World.ActorMap.AddInfluence(self, this); - self.World.ActorMap.AddPosition(self, this); - - if (!self.Bounds.Size.IsEmpty) - self.World.ScreenMap.Add(self); + self.World.AddToMaps(self, this); var cs = self.World.WorldActor.TraitOrDefault(); if (cs != null) @@ -219,11 +211,7 @@ namespace OpenRA.Mods.Common.Traits public void RemovedFromWorld(Actor self) { - self.World.ActorMap.RemoveInfluence(self, this); - self.World.ActorMap.RemovePosition(self, this); - - if (!self.Bounds.Size.IsEmpty) - 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 ab4bc339b5..59acb6c314 100644 --- a/OpenRA.Mods.Common/Traits/Husk.cs +++ b/OpenRA.Mods.Common/Traits/Husk.cs @@ -105,28 +105,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); - if (!self.Bounds.Size.IsEmpty) - 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); - - if (!self.Bounds.Size.IsEmpty) - 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); - - if (!self.Bounds.Size.IsEmpty) - 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 d00521fbfd..eb8fa3945d 100644 --- a/OpenRA.Mods.Common/Traits/Mobile.cs +++ b/OpenRA.Mods.Common/Traits/Mobile.cs @@ -429,31 +429,17 @@ namespace OpenRA.Mods.Common.Traits public void SetVisualPosition(Actor self, WPos pos) { CenterPosition = pos; - if (self.IsInWorld) - { - if (!self.Bounds.Size.IsEmpty) - 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); - - if (!self.Bounds.Size.IsEmpty) - 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); - - if (!self.Bounds.Size.IsEmpty) - self.World.ScreenMap.Remove(self); + self.World.RemoveFromMaps(self, this); } public IEnumerable Orders { get { yield return new MoveOrderTargeter(self, this); } }