From 6e13cb7f3ba028a37d5bfc8372b80ecb40bf5f91 Mon Sep 17 00:00:00 2001 From: Paul Chote Date: Thu, 22 Aug 2013 19:01:41 +1200 Subject: [PATCH] Unacquire invalid AI targets. --- OpenRA.Game/Traits/Target.cs | 9 ++++++--- OpenRA.Mods.RA/AI/HackyAI.cs | 12 ++++++------ 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/OpenRA.Game/Traits/Target.cs b/OpenRA.Game/Traits/Target.cs index a2b3845a56..50e17d9fab 100644 --- a/OpenRA.Game/Traits/Target.cs +++ b/OpenRA.Game/Traits/Target.cs @@ -38,11 +38,14 @@ namespace OpenRA.Traits public static Target FromActor(Actor a) { + if (a == null) + return Target.Invalid; + return new Target { actor = a, - targetable = a != null ? a.TraitOrDefault() : null, - type = a != null ? TargetType.Actor : TargetType.Invalid, + targetable = a.TraitOrDefault(), + type = TargetType.Actor, generation = a.Generation, }; } @@ -73,7 +76,7 @@ namespace OpenRA.Traits public bool IsValidFor(Actor targeter) { - if (Type == TargetType.Invalid) + if (targeter == null || Type == TargetType.Invalid) return false; if (targetable != null && !targetable.TargetableBy(actor, targeter)) diff --git a/OpenRA.Mods.RA/AI/HackyAI.cs b/OpenRA.Mods.RA/AI/HackyAI.cs index 7437b08734..7b64fa2795 100644 --- a/OpenRA.Mods.RA/AI/HackyAI.cs +++ b/OpenRA.Mods.RA/AI/HackyAI.cs @@ -99,7 +99,7 @@ namespace OpenRA.Mods.RA.AI HackyAI bot; XRandom random; - Actor target; + Target target; StateMachine fsm; //fuzzy @@ -113,7 +113,8 @@ namespace OpenRA.Mods.RA.AI this.world = bot.world; this.random = bot.random; this.type = type; - this.target = target; + this.target = Traits.Target.FromActor(target); + fsm = new StateMachine(this); switch (type) @@ -144,14 +145,13 @@ namespace OpenRA.Mods.RA.AI public Actor Target { - get { return target; } - set { target = value; } + get { return target.Actor; } + set { target = Traits.Target.FromActor(value); } } public bool TargetIsValid { - get { return (target != null && !target.IsDead() && !target.Destroyed - && target.IsInWorld && !target.HasTrait()); } + get { return target.IsValidFor(units.FirstOrDefault()) && !target.Actor.HasTrait(); } } //**********************************************************************************