diff --git a/OpenRA.Mods.Common/Traits/AffectsShroud.cs b/OpenRA.Mods.Common/Traits/AffectsShroud.cs index c0ab258f51..6eb87e0c07 100644 --- a/OpenRA.Mods.Common/Traits/AffectsShroud.cs +++ b/OpenRA.Mods.Common/Traits/AffectsShroud.cs @@ -22,6 +22,9 @@ namespace OpenRA.Mods.Common.Traits [Desc("If >= 0, prevent cells that are this much higher than the actor from being revealed.")] public readonly int MaxHeightDelta = -1; + [Desc("If > 0, force visibility to be recalculated if the unit moves within a cell by more than this distance.")] + public readonly WDist MoveRecalculationThreshold = new WDist(256); + [Desc("Possible values are CenterPosition (measure range from the center) and ", "Footprint (measure range from the footprint)")] public readonly VisibilityType Type = VisibilityType.Footprint; @@ -43,6 +46,7 @@ namespace OpenRA.Mods.Common.Traits protected bool CachedTraitDisabled { get; private set; } bool dirty; + WPos cachedPos; protected abstract void AddCellsToPlayerShroud(Actor self, Player player, PPos[] uv); protected abstract void RemoveCellsFromPlayerShroud(Actor self, Player player); @@ -89,6 +93,10 @@ namespace OpenRA.Mods.Common.Traits var projectedLocation = self.World.Map.CellContaining(projectedPos); var traitDisabled = IsTraitDisabled; var range = Range; + var pos = self.CenterPosition; + + if (Info.MoveRecalculationThreshold.Length > 0 && (pos - cachedPos).LengthSquared > Info.MoveRecalculationThreshold.LengthSquared) + dirty = true; if (!dirty && cachedLocation == projectedLocation && cachedRange == range && traitDisabled == CachedTraitDisabled) return; @@ -96,6 +104,7 @@ namespace OpenRA.Mods.Common.Traits cachedRange = range; cachedLocation = projectedLocation; CachedTraitDisabled = traitDisabled; + cachedPos = pos; dirty = false; var cells = ProjectedCells(self);