diff --git a/OpenRA.Game/Primitives/SpatiallyPartitioned.cs b/OpenRA.Game/Primitives/SpatiallyPartitioned.cs index 6bc9833300..128832fe4d 100644 --- a/OpenRA.Game/Primitives/SpatiallyPartitioned.cs +++ b/OpenRA.Game/Primitives/SpatiallyPartitioned.cs @@ -30,14 +30,22 @@ namespace OpenRA.Primitives itemBoundsBins = Exts.MakeArray(rows * cols, _ => new Dictionary()); } + void ValidateBounds(Rectangle bounds) + { + if (bounds.Width <= 0 || bounds.Height <= 0) + throw new ArgumentException("bounds must be non-empty.", "bounds"); + } + public void Add(T item, Rectangle bounds) { + ValidateBounds(bounds); itemBounds.Add(item, bounds); MutateBins(item, bounds, addItem); } public void Update(T item, Rectangle bounds) { + ValidateBounds(bounds); MutateBins(item, itemBounds[item], removeItem); MutateBins(item, itemBounds[item] = bounds, addItem); } diff --git a/OpenRA.Mods.Common/Traits/Immobile.cs b/OpenRA.Mods.Common/Traits/Immobile.cs index be0ea75bbd..2926c02e25 100644 --- a/OpenRA.Mods.Common/Traits/Immobile.cs +++ b/OpenRA.Mods.Common/Traits/Immobile.cs @@ -55,14 +55,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); } } }