diff --git a/OpenRA.Mods.RA/Air/HeliAttack.cs b/OpenRA.Mods.RA/Air/HeliAttack.cs index 2bad762b79..38a8b8ae43 100755 --- a/OpenRA.Mods.RA/Air/HeliAttack.cs +++ b/OpenRA.Mods.RA/Air/HeliAttack.cs @@ -43,7 +43,7 @@ namespace OpenRA.Mods.RA.Air var desiredFacing = Util.GetFacing(dist, aircraft.Facing); aircraft.Facing = Util.TickFacing(aircraft.Facing, desiredFacing, aircraft.ROT); - if (!Combat.IsInRange(self.CenterLocation, attack.GetMaximumRange(), target)) + if (!target.IsInRange(self.CenterPosition, attack.GetMaximumRange())) aircraft.TickMove(PSubPos.PerPx * aircraft.MovementSpeed, desiredFacing); attack.DoAttack( self, target ); diff --git a/OpenRA.Mods.RA/Attack/AttackBase.cs b/OpenRA.Mods.RA/Attack/AttackBase.cs index a3bd02a1f9..6f98b5f7e8 100644 --- a/OpenRA.Mods.RA/Attack/AttackBase.cs +++ b/OpenRA.Mods.RA/Attack/AttackBase.cs @@ -140,7 +140,7 @@ namespace OpenRA.Mods.RA public abstract Activity GetAttackActivity(Actor self, Target newTarget, bool allowMove); public bool HasAnyValidWeapons(Target t) { return Armaments.Any(a => a.IsValidAgainst(self.World, t)); } - public float GetMaximumRange() { return Armaments.Select(a => a.Weapon.Range).Aggregate(0f, Math.Max); } + public WRange GetMaximumRange() { return new WRange((int)(1024*Armaments.Max(a => a.Weapon.Range))); } public Armament ChooseArmamentForTarget(Target t) { return Armaments.FirstOrDefault(a => a.IsValidAgainst(self.World, t)); } diff --git a/OpenRA.Mods.RA/AutoHeal.cs b/OpenRA.Mods.RA/AutoHeal.cs index 60b4ca4f40..130f133801 100644 --- a/OpenRA.Mods.RA/AutoHeal.cs +++ b/OpenRA.Mods.RA/AutoHeal.cs @@ -19,10 +19,10 @@ namespace OpenRA.Mods.RA class AutoHeal : INotifyIdle { - public void TickIdle( Actor self ) + public void TickIdle(Actor self) { var attack = self.Trait(); - var inRange = self.World.FindUnitsInCircle(self.CenterLocation, (int)(Game.CellSize * attack.GetMaximumRange())); + var inRange = self.World.FindUnitsInCircle(self.CenterPosition, attack.GetMaximumRange()); var target = inRange .Where(a => a != self && a.AppearsFriendlyTo(self)) @@ -31,8 +31,8 @@ namespace OpenRA.Mods.RA .Where(a => attack.HasAnyValidWeapons(Target.FromActor(a))) .ClosestTo( self.CenterLocation ); - if( target != null ) - self.QueueActivity(attack.GetAttackActivity(self, Target.FromActor( target ), false )); + if (target != null) + self.QueueActivity(attack.GetAttackActivity(self, Target.FromActor(target), false)); } } } diff --git a/OpenRA.Mods.RA/AutoTarget.cs b/OpenRA.Mods.RA/AutoTarget.cs index d53f66fcc3..993ff3f7c3 100644 --- a/OpenRA.Mods.RA/AutoTarget.cs +++ b/OpenRA.Mods.RA/AutoTarget.cs @@ -87,8 +87,9 @@ namespace OpenRA.Mods.RA var target = ScanForTarget(self, null); if (target != null) { - self.SetTargetLine(Target.FromActor(target), Color.Red, false); - attack.AttackTarget(Target.FromActor(target), false, Info.AllowMovement && stance != UnitStance.Defend); + var t = Target.FromActor(target); + self.SetTargetLine(t, Color.Red, false); + attack.AttackTarget(t, false, Info.AllowMovement && stance != UnitStance.Defend); } } @@ -100,10 +101,9 @@ namespace OpenRA.Mods.RA public Actor ScanForTarget(Actor self, Actor currentTarget) { - var range = Info.ScanRadius > 0 ? Info.ScanRadius : attack.GetMaximumRange(); - - if (self.IsIdle || currentTarget == null || !Combat.IsInRange(self.CenterLocation, range, currentTarget)) - if(nextScanTime <= 0) + var range = Info.ScanRadius > 0 ? WRange.FromCells(Info.ScanRadius) : attack.GetMaximumRange(); + if (self.IsIdle || currentTarget == null || !Target.FromActor(currentTarget).IsInRange(self.CenterPosition, range)) + if (nextScanTime <= 0) return ChooseTarget(self, range); return currentTarget; @@ -116,11 +116,10 @@ namespace OpenRA.Mods.RA attack.AttackTarget(Target.FromActor(targetActor), false, Info.AllowMovement && stance != UnitStance.Defend); } - Actor ChooseTarget(Actor self, float range) + Actor ChooseTarget(Actor self, WRange range) { nextScanTime = self.World.SharedRandom.Next(Info.MinimumScanTimeInterval, Info.MaximumScanTimeInterval); - - var inRange = self.World.FindUnitsInCircle(self.CenterLocation, (int)(Game.CellSize * range)); + var inRange = self.World.FindUnitsInCircle(self.CenterPosition, range); if (self.Owner.HasFogVisibility()) { diff --git a/OpenRA.Mods.RA/RenderRangeCircle.cs b/OpenRA.Mods.RA/RenderRangeCircle.cs index e0ca291fe7..c931a1627c 100644 --- a/OpenRA.Mods.RA/RenderRangeCircle.cs +++ b/OpenRA.Mods.RA/RenderRangeCircle.cs @@ -47,9 +47,11 @@ namespace OpenRA.Mods.RA if (self.Owner != self.World.LocalPlayer) return; + // Hack: Convert world coords to cells + var pxRange = self.Trait().GetMaximumRange().Range / 1024f; wr.DrawRangeCircleWithContrast( Color.FromArgb(128, Color.Yellow), - self.CenterLocation.ToFloat2(), self.Trait().GetMaximumRange(), + self.CenterLocation.ToFloat2(), pxRange, Color.FromArgb(96, Color.Black), 1); }