diff --git a/OpenRA.Mods.RA/Activities/Attack.cs b/OpenRA.Mods.RA/Activities/Attack.cs index ae256f8ee220..0937ec7017ff 100755 --- a/OpenRA.Mods.RA/Activities/Attack.cs +++ b/OpenRA.Mods.RA/Activities/Attack.cs @@ -23,6 +23,11 @@ public class Attack : CancelableActivity int Range; bool AllowMovement; + int nextPathTime; + + const int delayBetweenPathingAttempts = 20; + const int delaySpread = 5; + public Attack(Target target, int range, bool allowMovement) { Target = target; @@ -33,10 +38,7 @@ public Attack(Target target, int range, bool allowMovement) AllowMovement = allowMovement; } - public Attack(Target target, int range) : this(target, range, true) - { - - } + public Attack(Target target, int range) : this(target, range, true) {} public override IActivity Tick( Actor self ) { @@ -56,9 +58,17 @@ protected virtual IActivity InnerTick( Actor self, AttackBase attack ) if (targetable != null && !targetable.TargetableBy(Target.Actor, self)) return NextActivity; - - if (!Combat.IsInRange(self.CenterLocation, Range, Target)) - return (AllowMovement) ? Util.SequenceActivities(self.Trait().MoveWithinRange(Target, Range), this) : NextActivity; + + if (!Combat.IsInRange(self.CenterLocation, Range, Target)) + { + if (--nextPathTime > 0) + return this; + + nextPathTime = self.World.SharedRandom.Next(delayBetweenPathingAttempts - delaySpread, + delayBetweenPathingAttempts + delaySpread); + + return (AllowMovement) ? Util.SequenceActivities(self.Trait().MoveWithinRange(Target, Range), this) : NextActivity; + } var desiredFacing = Util.GetFacing(Target.CenterLocation - self.CenterLocation, 0); if (facing.Facing != desiredFacing) diff --git a/OpenRA.Mods.RA/Activities/Follow.cs b/OpenRA.Mods.RA/Activities/Follow.cs index 28af736ef8e7..65d1e2310bdd 100644 --- a/OpenRA.Mods.RA/Activities/Follow.cs +++ b/OpenRA.Mods.RA/Activities/Follow.cs @@ -18,6 +18,10 @@ public class Follow : CancelableActivity { Target Target; int Range; + int nextPathTime; + + const int delayBetweenPathingAttempts = 20; + const int delaySpread = 5; public Follow(Target target, int range) { @@ -33,8 +37,12 @@ public override IActivity Tick( Actor self ) var inRange = ( Util.CellContaining( Target.CenterLocation ) - self.Location ).LengthSquared < Range * Range; if( inRange ) return this; + if (--nextPathTime > 0) return this; + + nextPathTime = self.World.SharedRandom.Next(delayBetweenPathingAttempts - delaySpread, + delayBetweenPathingAttempts + delaySpread); - var mobile = self.Trait(); + var mobile = self.Trait(); return Util.SequenceActivities( mobile.MoveWithinRange( Target, Range ), this ); } }