Use Target range checks in AutoTarget and dependencies.
This commit is contained in:
@@ -43,7 +43,7 @@ namespace OpenRA.Mods.RA.Air
|
|||||||
var desiredFacing = Util.GetFacing(dist, aircraft.Facing);
|
var desiredFacing = Util.GetFacing(dist, aircraft.Facing);
|
||||||
aircraft.Facing = Util.TickFacing(aircraft.Facing, desiredFacing, aircraft.ROT);
|
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);
|
aircraft.TickMove(PSubPos.PerPx * aircraft.MovementSpeed, desiredFacing);
|
||||||
|
|
||||||
attack.DoAttack( self, target );
|
attack.DoAttack( self, target );
|
||||||
|
|||||||
@@ -140,7 +140,7 @@ namespace OpenRA.Mods.RA
|
|||||||
public abstract Activity GetAttackActivity(Actor self, Target newTarget, bool allowMove);
|
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 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)); }
|
public Armament ChooseArmamentForTarget(Target t) { return Armaments.FirstOrDefault(a => a.IsValidAgainst(self.World, t)); }
|
||||||
|
|
||||||
|
|||||||
@@ -22,7 +22,7 @@ namespace OpenRA.Mods.RA
|
|||||||
public void TickIdle(Actor self)
|
public void TickIdle(Actor self)
|
||||||
{
|
{
|
||||||
var attack = self.Trait<AttackBase>();
|
var attack = self.Trait<AttackBase>();
|
||||||
var inRange = self.World.FindUnitsInCircle(self.CenterLocation, (int)(Game.CellSize * attack.GetMaximumRange()));
|
var inRange = self.World.FindUnitsInCircle(self.CenterPosition, attack.GetMaximumRange());
|
||||||
|
|
||||||
var target = inRange
|
var target = inRange
|
||||||
.Where(a => a != self && a.AppearsFriendlyTo(self))
|
.Where(a => a != self && a.AppearsFriendlyTo(self))
|
||||||
|
|||||||
@@ -87,8 +87,9 @@ namespace OpenRA.Mods.RA
|
|||||||
var target = ScanForTarget(self, null);
|
var target = ScanForTarget(self, null);
|
||||||
if (target != null)
|
if (target != null)
|
||||||
{
|
{
|
||||||
self.SetTargetLine(Target.FromActor(target), Color.Red, false);
|
var t = Target.FromActor(target);
|
||||||
attack.AttackTarget(Target.FromActor(target), false, Info.AllowMovement && stance != UnitStance.Defend);
|
self.SetTargetLine(t, Color.Red, false);
|
||||||
|
attack.AttackTarget(t, false, Info.AllowMovement && stance != UnitStance.Defend);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -100,9 +101,8 @@ namespace OpenRA.Mods.RA
|
|||||||
|
|
||||||
public Actor ScanForTarget(Actor self, Actor currentTarget)
|
public Actor ScanForTarget(Actor self, Actor currentTarget)
|
||||||
{
|
{
|
||||||
var range = Info.ScanRadius > 0 ? Info.ScanRadius : attack.GetMaximumRange();
|
var range = Info.ScanRadius > 0 ? WRange.FromCells(Info.ScanRadius) : attack.GetMaximumRange();
|
||||||
|
if (self.IsIdle || currentTarget == null || !Target.FromActor(currentTarget).IsInRange(self.CenterPosition, range))
|
||||||
if (self.IsIdle || currentTarget == null || !Combat.IsInRange(self.CenterLocation, range, currentTarget))
|
|
||||||
if (nextScanTime <= 0)
|
if (nextScanTime <= 0)
|
||||||
return ChooseTarget(self, range);
|
return ChooseTarget(self, range);
|
||||||
|
|
||||||
@@ -116,11 +116,10 @@ namespace OpenRA.Mods.RA
|
|||||||
attack.AttackTarget(Target.FromActor(targetActor), false, Info.AllowMovement && stance != UnitStance.Defend);
|
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);
|
nextScanTime = self.World.SharedRandom.Next(Info.MinimumScanTimeInterval, Info.MaximumScanTimeInterval);
|
||||||
|
var inRange = self.World.FindUnitsInCircle(self.CenterPosition, range);
|
||||||
var inRange = self.World.FindUnitsInCircle(self.CenterLocation, (int)(Game.CellSize * range));
|
|
||||||
|
|
||||||
if (self.Owner.HasFogVisibility())
|
if (self.Owner.HasFogVisibility())
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -47,9 +47,11 @@ namespace OpenRA.Mods.RA
|
|||||||
if (self.Owner != self.World.LocalPlayer)
|
if (self.Owner != self.World.LocalPlayer)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
// Hack: Convert world coords to cells
|
||||||
|
var pxRange = self.Trait<AttackBase>().GetMaximumRange().Range / 1024f;
|
||||||
wr.DrawRangeCircleWithContrast(
|
wr.DrawRangeCircleWithContrast(
|
||||||
Color.FromArgb(128, Color.Yellow),
|
Color.FromArgb(128, Color.Yellow),
|
||||||
self.CenterLocation.ToFloat2(), self.Trait<AttackBase>().GetMaximumRange(),
|
self.CenterLocation.ToFloat2(), pxRange,
|
||||||
Color.FromArgb(96, Color.Black),
|
Color.FromArgb(96, Color.Black),
|
||||||
1);
|
1);
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user