Merge pull request #3782 from pchote/hackyai-target-fix
Filter AI targets based on what it can actually attack.
This commit is contained in:
@@ -441,28 +441,34 @@ namespace OpenRA.Mods.RA.AI
|
|||||||
return target;
|
return target;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal Actor FindClosestEnemy(WPos pos)
|
bool IsValidTarget(Actor a, Actor targeter)
|
||||||
{
|
{
|
||||||
var allEnemyUnits = world.Actors
|
if (p.Stances[a.Owner] != Stance.Enemy)
|
||||||
.Where(unit => p.Stances[unit.Owner] == Stance.Enemy && !unit.HasTrait<Husk>() &&
|
return false;
|
||||||
unit.HasTrait<ITargetable>()).ToList();
|
|
||||||
|
|
||||||
if (allEnemyUnits.Count > 0)
|
// TODO: We shouldn't need to check this explicitly
|
||||||
return allEnemyUnits.ClosestTo(pos);
|
if (!a.HasTrait<Husk>())
|
||||||
|
return false;
|
||||||
|
|
||||||
return null;
|
var targetable = a.TraitOrDefault<ITargetable>();
|
||||||
|
if (targetable == null || !targetable.TargetableBy(a, targeter))
|
||||||
|
return false;
|
||||||
|
|
||||||
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
internal Actor FindClosestEnemy(WPos pos, WRange radius)
|
internal Actor FindClosestEnemy(Actor targeter, WPos pos)
|
||||||
{
|
{
|
||||||
var enemyUnits = world.FindActorsInCircle(pos, radius)
|
return world.Actors
|
||||||
.Where(unit => p.Stances[unit.Owner] == Stance.Enemy &&
|
.Where(unit => IsValidTarget(unit, targeter))
|
||||||
!unit.HasTrait<Husk>() && unit.HasTrait<ITargetable>()).ToList();
|
.ClosestTo(pos);
|
||||||
|
}
|
||||||
|
|
||||||
if (enemyUnits.Count > 0)
|
internal Actor FindClosestEnemy(Actor targeter, WPos pos, WRange radius)
|
||||||
return enemyUnits.ClosestTo(pos);
|
{
|
||||||
|
return world.FindActorsInCircle(pos, radius)
|
||||||
return null;
|
.Where(unit => IsValidTarget(unit, targeter))
|
||||||
|
.ClosestTo(pos);
|
||||||
}
|
}
|
||||||
|
|
||||||
List<Actor> FindEnemyConstructionYards()
|
List<Actor> FindEnemyConstructionYards()
|
||||||
|
|||||||
@@ -183,8 +183,8 @@ namespace OpenRA.Mods.RA.AI
|
|||||||
|
|
||||||
if (!owner.TargetIsValid)
|
if (!owner.TargetIsValid)
|
||||||
{
|
{
|
||||||
var a = owner.units.Random(owner.random);
|
var targeter = owner.units.Random(owner.random);
|
||||||
var closestEnemy = owner.bot.FindClosestEnemy(a.CenterPosition);
|
var closestEnemy = owner.bot.FindClosestEnemy(targeter, targeter.CenterPosition);
|
||||||
if (closestEnemy != null)
|
if (closestEnemy != null)
|
||||||
owner.Target = closestEnemy;
|
owner.Target = closestEnemy;
|
||||||
else
|
else
|
||||||
|
|||||||
@@ -33,8 +33,11 @@ namespace OpenRA.Mods.RA.AI
|
|||||||
|
|
||||||
if (!owner.TargetIsValid)
|
if (!owner.TargetIsValid)
|
||||||
{
|
{
|
||||||
var t = owner.bot.FindClosestEnemy(owner.units.FirstOrDefault().CenterPosition);
|
var targeter = owner.units.First();
|
||||||
if (t == null) return;
|
var t = owner.bot.FindClosestEnemy(targeter, targeter.CenterPosition);
|
||||||
|
if (t == null)
|
||||||
|
return;
|
||||||
|
|
||||||
owner.Target = t;
|
owner.Target = t;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -71,7 +74,8 @@ namespace OpenRA.Mods.RA.AI
|
|||||||
|
|
||||||
if (!owner.TargetIsValid)
|
if (!owner.TargetIsValid)
|
||||||
{
|
{
|
||||||
var closestEnemy = owner.bot.FindClosestEnemy(owner.units.Random(owner.random).CenterPosition);
|
var targeter = owner.units.Random(owner.random);
|
||||||
|
var closestEnemy = owner.bot.FindClosestEnemy(targeter, targeter.CenterPosition);
|
||||||
if (closestEnemy != null)
|
if (closestEnemy != null)
|
||||||
owner.Target = closestEnemy;
|
owner.Target = closestEnemy;
|
||||||
else
|
else
|
||||||
@@ -129,7 +133,8 @@ namespace OpenRA.Mods.RA.AI
|
|||||||
|
|
||||||
if (!owner.TargetIsValid)
|
if (!owner.TargetIsValid)
|
||||||
{
|
{
|
||||||
var closestEnemy = owner.bot.FindClosestEnemy(owner.units.Random(owner.random).CenterPosition);
|
var targeter = owner.units.Random(owner.random);
|
||||||
|
var closestEnemy = owner.bot.FindClosestEnemy(targeter, targeter.CenterPosition);
|
||||||
if (closestEnemy != null)
|
if (closestEnemy != null)
|
||||||
owner.Target = closestEnemy;
|
owner.Target = closestEnemy;
|
||||||
else
|
else
|
||||||
@@ -141,7 +146,7 @@ namespace OpenRA.Mods.RA.AI
|
|||||||
|
|
||||||
foreach (var a in owner.units)
|
foreach (var a in owner.units)
|
||||||
if (!BusyAttack(a))
|
if (!BusyAttack(a))
|
||||||
owner.world.IssueOrder(new Order("Attack", a, false) { TargetActor = owner.bot.FindClosestEnemy(a.CenterPosition) });
|
owner.world.IssueOrder(new Order("Attack", a, false) { TargetActor = owner.bot.FindClosestEnemy(a, a.CenterPosition) });
|
||||||
|
|
||||||
if (ShouldFlee(owner))
|
if (ShouldFlee(owner))
|
||||||
{
|
{
|
||||||
|
|||||||
@@ -32,7 +32,8 @@ namespace OpenRA.Mods.RA.AI
|
|||||||
|
|
||||||
if (!owner.TargetIsValid)
|
if (!owner.TargetIsValid)
|
||||||
{
|
{
|
||||||
owner.Target = owner.bot.FindClosestEnemy(owner.CenterPosition, WRange.FromCells(8));
|
var targeter = owner.units.FirstOrDefault();
|
||||||
|
owner.Target = owner.bot.FindClosestEnemy(targeter, owner.CenterPosition, WRange.FromCells(8));
|
||||||
|
|
||||||
if (owner.Target == null)
|
if (owner.Target == null)
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user