Support multiple ITargetable traits
This commit is contained in:
@@ -63,13 +63,13 @@ namespace OpenRA.Mods.Common.AI
|
||||
if (!a.HasTrait<AttackBase>())
|
||||
return false;
|
||||
|
||||
var targetable = target.TraitOrDefault<ITargetable>();
|
||||
if (targetable == null)
|
||||
var targetTypes = target.TraitsImplementing<ITargetable>().Where(Exts.IsTraitEnabled).SelectMany(t => t.TargetTypes);
|
||||
if (!targetTypes.Any())
|
||||
return false;
|
||||
|
||||
var arms = a.TraitsImplementing<Armament>();
|
||||
foreach (var arm in arms)
|
||||
if (arm.Weapon.IsValidTarget(targetable.TargetTypes))
|
||||
if (arm.Weapon.IsValidTarget(targetTypes))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
|
||||
@@ -125,14 +125,11 @@ namespace OpenRA.Mods.Common.AI
|
||||
if (a == null)
|
||||
return 0;
|
||||
|
||||
var targetable = a.TraitOrDefault<ITargetable>();
|
||||
if (targetable == null)
|
||||
var targetable = a.TraitsImplementing<ITargetable>().Where(Exts.IsTraitEnabled);
|
||||
if (!targetable.Any(t => t.TargetableBy(a, firedBy.PlayerActor)))
|
||||
return 0;
|
||||
|
||||
if (!targetable.TargetableBy(a, firedBy.PlayerActor))
|
||||
return 0;
|
||||
|
||||
if (Types.Intersect(targetable.TargetTypes).Any())
|
||||
if (Types.Intersect(targetable.SelectMany(t => t.TargetTypes)).Any())
|
||||
{
|
||||
switch (TargetMetric)
|
||||
{
|
||||
|
||||
@@ -29,8 +29,7 @@ namespace OpenRA.Mods.Common.Activities
|
||||
|
||||
bool IsTargetable(Actor self, Actor viewer)
|
||||
{
|
||||
var targetable = self.TraitOrDefault<ITargetable>();
|
||||
return targetable != null && targetable.TargetableBy(self, viewer);
|
||||
return self.TraitsImplementing<ITargetable>().Any(t => t.IsTraitEnabled() && t.TargetableBy(self, viewer));
|
||||
}
|
||||
|
||||
public override Activity Tick(Actor self)
|
||||
|
||||
@@ -77,7 +77,7 @@ namespace OpenRA.Mods.Common.Orders
|
||||
|
||||
public override bool CanTargetActor(Actor self, Actor target, TargetModifiers modifiers, ref string cursor)
|
||||
{
|
||||
return target.TraitsImplementing<ITargetable>().Any(t => t.TargetTypes.Intersect(targetTypes).Any());
|
||||
return target.TraitsImplementing<ITargetable>().Any(t => t.IsTraitEnabled() && t.TargetTypes.Intersect(targetTypes).Any());
|
||||
}
|
||||
|
||||
public override bool CanTargetFrozenActor(Actor self, FrozenActor target, TargetModifiers modifiers, ref string cursor)
|
||||
|
||||
@@ -35,8 +35,7 @@ namespace OpenRA.Mods.Common.Traits
|
||||
{
|
||||
get
|
||||
{
|
||||
return IsTraitDisabled ? None
|
||||
: (self.CenterPosition.Z > 0 ? info.TargetTypes : info.GroundedTargetTypes);
|
||||
return (self.CenterPosition.Z > 0) ? info.TargetTypes : info.GroundedTargetTypes;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -57,8 +57,8 @@ namespace OpenRA.Mods.Common.Traits
|
||||
if (info.ValidFactions.Any() && !info.ValidFactions.Contains(collector.Owner.Faction.InternalName))
|
||||
return false;
|
||||
|
||||
var targetable = collector.Info.Traits.GetOrDefault<ITargetableInfo>();
|
||||
if (targetable == null || !info.ValidTargets.Intersect(targetable.GetTargetTypes()).Any())
|
||||
var targetable = collector.TraitsImplementing<ITargetable>();
|
||||
if (!info.ValidTargets.Intersect(targetable.SelectMany(t => t.TargetTypes)).Any())
|
||||
return false;
|
||||
|
||||
var positionable = collector.TraitOrDefault<IPositionable>();
|
||||
|
||||
@@ -46,7 +46,7 @@ namespace OpenRA.Mods.Common.Traits
|
||||
return cloak.IsVisible(self, viewer.Owner);
|
||||
}
|
||||
|
||||
public virtual string[] TargetTypes { get { return IsTraitDisabled ? None : Info.TargetTypes; } }
|
||||
public virtual string[] TargetTypes { get { return Info.TargetTypes; } }
|
||||
|
||||
public virtual IEnumerable<WPos> TargetablePositions(Actor self)
|
||||
{
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
#endregion
|
||||
|
||||
using System.Collections.Generic;
|
||||
using System.Linq;
|
||||
using OpenRA.Traits;
|
||||
|
||||
namespace OpenRA.Mods.Common.Warheads
|
||||
@@ -58,8 +59,8 @@ namespace OpenRA.Mods.Common.Warheads
|
||||
return false;
|
||||
|
||||
// A target type is valid if it is in the valid targets list, and not in the invalid targets list.
|
||||
var targetable = victim.TraitOrDefault<ITargetable>();
|
||||
if (targetable == null || !IsValidTarget(targetable.TargetTypes))
|
||||
var targetable = victim.TraitsImplementing<ITargetable>().Where(Exts.IsTraitEnabled);
|
||||
if (!IsValidTarget(targetable.SelectMany(t => t.TargetTypes)))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
@@ -74,8 +75,8 @@ namespace OpenRA.Mods.Common.Warheads
|
||||
return false;
|
||||
|
||||
// A target type is valid if it is in the valid targets list, and not in the invalid targets list.
|
||||
var targetable = victim.Info.Traits.GetOrDefault<ITargetableInfo>();
|
||||
if (targetable == null || !IsValidTarget(targetable.GetTargetTypes()))
|
||||
var targetable = victim.Info.Traits.WithInterface<ITargetableInfo>();
|
||||
if (!IsValidTarget(targetable.SelectMany(t => t.GetTargetTypes())))
|
||||
return false;
|
||||
|
||||
return true;
|
||||
|
||||
Reference in New Issue
Block a user