diff --git a/OpenRA.Game/Traits/TraitsInterfaces.cs b/OpenRA.Game/Traits/TraitsInterfaces.cs index 2327aa94f5..3d6ed857d1 100644 --- a/OpenRA.Game/Traits/TraitsInterfaces.cs +++ b/OpenRA.Game/Traits/TraitsInterfaces.cs @@ -270,6 +270,7 @@ namespace OpenRA.Traits WDist LargestActorRadius { get; } WDist LargestBlockingActorRadius { get; } + void UpdateOccupiedCells(IOccupySpace ios); event Action CellUpdated; } diff --git a/OpenRA.Mods.Common/Traits/Crushable.cs b/OpenRA.Mods.Common/Traits/Crushable.cs index 2c8efda2b1..0ef095a91b 100644 --- a/OpenRA.Mods.Common/Traits/Crushable.cs +++ b/OpenRA.Mods.Common/Traits/Crushable.cs @@ -90,12 +90,12 @@ namespace OpenRA.Mods.Common.Traits protected override void TraitEnabled(Actor self) { - self.World.ActorMap.UpdatePosition(self, self.OccupiesSpace); + self.World.ActorMap.UpdateOccupiedCells(self.OccupiesSpace); } protected override void TraitDisabled(Actor self) { - self.World.ActorMap.UpdatePosition(self, self.OccupiesSpace); + self.World.ActorMap.UpdateOccupiedCells(self.OccupiesSpace); } } } diff --git a/OpenRA.Mods.Common/Traits/Mobile.cs b/OpenRA.Mods.Common/Traits/Mobile.cs index a16ec3556d..8b583fe4cb 100644 --- a/OpenRA.Mods.Common/Traits/Mobile.cs +++ b/OpenRA.Mods.Common/Traits/Mobile.cs @@ -159,8 +159,11 @@ namespace OpenRA.Mods.Common.Traits var oldValue = movementTypes; movementTypes = value; if (value != oldValue) + { + self.World.ActorMap.UpdateOccupiedCells(self.OccupiesSpace); foreach (var n in notifyMoving) n.MovementTypeChanged(self, value); + } } } #endregion diff --git a/OpenRA.Mods.Common/Traits/World/ActorMap.cs b/OpenRA.Mods.Common/Traits/World/ActorMap.cs index 3a6f01783d..1e400bb39d 100644 --- a/OpenRA.Mods.Common/Traits/World/ActorMap.cs +++ b/OpenRA.Mods.Common/Traits/World/ActorMap.cs @@ -410,6 +410,15 @@ namespace OpenRA.Mods.Common.Traits influenceNode = influenceNode.Next; } + public void UpdateOccupiedCells(IOccupySpace ios) + { + if (CellUpdated == null) + return; + + foreach (var c in ios.OccupiedCells()) + CellUpdated(c.First); + } + void ITick.Tick(Actor self) { // Position updates are done in one pass