don't let the AI assign orders to units not in the world

This commit is contained in:
Matthias Mailänder
2015-09-26 13:24:07 +02:00
parent 699a7f8227
commit 4579e8af06

View File

@@ -182,7 +182,7 @@ namespace OpenRA.Mods.Common.AI
readonly IPathFinder pathfinder; readonly IPathFinder pathfinder;
readonly Func<Actor, bool> isEnemyUnit; readonly Func<Actor, bool> isEnemyUnit;
readonly Predicate<Actor> unitIsDeadOrHasNewOwner; readonly Predicate<Actor> unitCannotBeOrdered;
Dictionary<SupportPowerInstance, int> waitingPowers = new Dictionary<SupportPowerInstance, int>(); Dictionary<SupportPowerInstance, int> waitingPowers = new Dictionary<SupportPowerInstance, int>();
Dictionary<string, SupportPowerDecision> powerDecisions = new Dictionary<string, SupportPowerDecision>(); Dictionary<string, SupportPowerDecision> powerDecisions = new Dictionary<string, SupportPowerDecision>();
@@ -236,7 +236,8 @@ namespace OpenRA.Mods.Common.AI
Player.Stances[unit.Owner] == Stance.Enemy Player.Stances[unit.Owner] == Stance.Enemy
&& !unit.Info.HasTraitInfo<HuskInfo>() && !unit.Info.HasTraitInfo<HuskInfo>()
&& unit.Info.HasTraitInfo<ITargetableInfo>(); && unit.Info.HasTraitInfo<ITargetableInfo>();
unitIsDeadOrHasNewOwner = a => a.Owner != Player || a.IsDead;
unitCannotBeOrdered = a => a.Owner != Player || a.IsDead || !a.IsInWorld;
foreach (var decision in info.PowerDecisions) foreach (var decision in info.PowerDecisions)
powerDecisions.Add(decision.OrderName, decision); powerDecisions.Add(decision.OrderName, decision);
@@ -606,7 +607,7 @@ namespace OpenRA.Mods.Common.AI
{ {
squads.RemoveAll(s => !s.IsValid); squads.RemoveAll(s => !s.IsValid);
foreach (var s in squads) foreach (var s in squads)
s.Units.RemoveAll(unitIsDeadOrHasNewOwner); s.Units.RemoveAll(unitCannotBeOrdered);
} }
// Use of this function requires that one squad of this type. Hence it is a piece of shit // Use of this function requires that one squad of this type. Hence it is a piece of shit
@@ -625,8 +626,9 @@ namespace OpenRA.Mods.Common.AI
void AssignRolesToIdleUnits(Actor self) void AssignRolesToIdleUnits(Actor self)
{ {
CleanSquads(); CleanSquads();
activeUnits.RemoveAll(unitIsDeadOrHasNewOwner);
unitsHangingAroundTheBase.RemoveAll(unitIsDeadOrHasNewOwner); activeUnits.RemoveAll(unitCannotBeOrdered);
unitsHangingAroundTheBase.RemoveAll(unitCannotBeOrdered);
if (--rushTicks <= 0) if (--rushTicks <= 0)
{ {