"FindEnemy" functions ignore hidden actors

(helped by reaperrr and abcdefg30)
This commit is contained in:
dnqbob
2020-04-28 19:34:35 +08:00
committed by abcdefg30
parent 2d7790f5e4
commit 86394eb56c

View File

@@ -126,6 +126,21 @@ namespace OpenRA.Mods.Common.Traits
&& !a.GetEnabledTargetTypes().IsEmpty;
}
public bool IsNotHiddenUnit(Actor a)
{
var hasModifier = false;
var visModifiers = a.TraitsImplementing<IVisibilityModifier>();
foreach (var v in visModifiers)
{
if (v.IsVisible(a, Player))
return true;
hasModifier = true;
}
return !hasModifier;
}
protected override void Created(Actor self)
{
// Special case handling is required for the Player actor.
@@ -160,12 +175,13 @@ namespace OpenRA.Mods.Common.Traits
internal Actor FindClosestEnemy(WPos pos)
{
return World.Actors.Where(IsEnemyUnit).ClosestTo(pos);
var units = World.Actors.Where(IsEnemyUnit);
return units.Where(IsNotHiddenUnit).ClosestTo(pos) ?? units.ClosestTo(pos);
}
internal Actor FindClosestEnemy(WPos pos, WDist radius)
{
return World.FindActorsInCircle(pos, radius).Where(IsEnemyUnit).ClosestTo(pos);
return World.FindActorsInCircle(pos, radius).Where(a => IsEnemyUnit(a) && IsNotHiddenUnit(a)).ClosestTo(pos);
}
void CleanSquads()