diff --git a/OpenRA.Mods.RA/Activities/Attack.cs b/OpenRA.Mods.RA/Activities/Attack.cs index 7650cb40e0..920341b0a1 100755 --- a/OpenRA.Mods.RA/Activities/Attack.cs +++ b/OpenRA.Mods.RA/Activities/Attack.cs @@ -45,7 +45,7 @@ namespace OpenRA.Mods.RA.Activities var mobile = self.Trait(); var targetCell = Util.CellContaining(Target.CenterLocation); - if (!Combat.IsInRange( self.CenterLocation, Range, Util.CenterOfCell(targetCell))) + if (!Combat.IsInRange( self.CenterLocation, Range, Target)) return Util.SequenceActivities( mobile.MoveTo( Target, Range ), this ); var desiredFacing = Util.GetFacing((targetCell - self.Location).ToFloat2(), 0); diff --git a/OpenRA.Mods.RA/AttackLeap.cs b/OpenRA.Mods.RA/AttackLeap.cs index e54f0d88cb..23ba4a296e 100644 --- a/OpenRA.Mods.RA/AttackLeap.cs +++ b/OpenRA.Mods.RA/AttackLeap.cs @@ -32,7 +32,7 @@ namespace OpenRA.Mods.RA if (IsLeaping) return; var weapon = self.Trait().Weapons[0].Info; - if( !Combat.IsInRange( self.CenterLocation, weapon.Range, target.Actor ) ) return; + if( !Combat.IsInRange( self.CenterLocation, weapon.Range, target ) ) return; self.CancelActivity(); self.QueueActivity(new Leap(self, target)); diff --git a/OpenRA.Mods.RA/Combat.cs b/OpenRA.Mods.RA/Combat.cs index 0688e76f56..14dec726a1 100755 --- a/OpenRA.Mods.RA/Combat.cs +++ b/OpenRA.Mods.RA/Combat.cs @@ -234,5 +234,14 @@ namespace OpenRA.Mods.RA var rsq = range * range * Game.CellSize * Game.CellSize; return ( attackOrigin - targetLocation ).LengthSquared < rsq; } + + public static bool IsInRange( float2 attackOrigin, float range, Target target ) + { + if( !target.IsValid ) return false; + if( target.IsActor ) + return IsInRange( attackOrigin, range, target.Actor ); + else + return IsInRange( attackOrigin, range, target.CenterLocation ); + } } } diff --git a/OpenRA.Mods.RA/Weapon.cs b/OpenRA.Mods.RA/Weapon.cs index 6b5f758c3c..df55a0eba2 100644 --- a/OpenRA.Mods.RA/Weapon.cs +++ b/OpenRA.Mods.RA/Weapon.cs @@ -102,13 +102,10 @@ namespace OpenRA.Mods.RA if (limitedAmmo != null && !limitedAmmo.HasAmmo()) return; - if( target.IsActor && !Combat.IsInRange( self.CenterLocation, Info.Range, target.Actor ) ) + if( !Combat.IsInRange( self.CenterLocation, Info.Range, target ) ) return; - else if( !target.IsActor && !Combat.IsInRange( self.CenterLocation, Info.Range, target.CenterLocation ) ) + if( Combat.IsInRange( self.CenterLocation, Info.MinRange, target ) ) return; - - if (Info.MinRange * Info.MinRange * Game.CellSize * Game.CellSize > - (target.CenterLocation - self.CenterLocation).LengthSquared) return; if (!IsValidAgainst(self.World, target)) return;