(935f68e00) Fix characters waiting when they shouldn't after being left uncontrolled by the player.

This commit is contained in:
Joonas Rikkonen
2019-05-16 06:57:50 +03:00
parent b97ecddf03
commit 3fc539d373
11 changed files with 137 additions and 695 deletions
@@ -16,7 +16,7 @@ namespace Barotrauma
public List<AIObjective> Objectives { get; private set; } = new List<AIObjective>();
private Character character;
private readonly Character character;
private float _waitTimer;
@@ -28,14 +28,7 @@ namespace Barotrauma
get { return _waitTimer; }
set
{
if (CurrentObjective is AIObjectiveCombat || CurrentObjective is AIObjectiveFindSafety)
{
_waitTimer = 0;
}
else
{
_waitTimer = value;
}
_waitTimer = IsAllowedToWait() ? value : 0;
}
}
@@ -205,31 +198,6 @@ namespace Barotrauma
{
CurrentObjective?.TryComplete(deltaTime);
}
else
{
if (CurrentOrder != null)
{
CurrentOrder.TryComplete(deltaTime);
}
else
{
// Wait, if not swimming, climbing, or staying in a forbidden/unsafe hull.
if (character.AIController is HumanAIController humanAI && humanAI.SteeringManager != null)
{
if (!character.AnimController.InWater &&
!character.IsClimbing &&
!humanAI.UnsafeHulls.Contains(character.CurrentHull) &&
!AIObjectiveIdle.IsForbidden(character.CurrentHull))
{
humanAI.SteeringManager.Reset();
}
else
{
CurrentObjective?.TryComplete(deltaTime);
}
}
}
}
}
public void SetOrder(AIObjective objective)
@@ -306,5 +274,19 @@ namespace Barotrauma
}
return newObjective;
}
private bool IsAllowedToWait()
{
if (CurrentOrder != null) { return false; }
if (CurrentObjective is AIObjectiveCombat || CurrentObjective is AIObjectiveFindSafety) { return false; }
if (character.AnimController.InWater) { return false; }
if (character.IsClimbing) { return false; }
if (character.AIController is HumanAIController humanAI)
{
if (humanAI.UnsafeHulls.Contains(character.CurrentHull)) { return false; }
}
if (AIObjectiveIdle.IsForbidden(character.CurrentHull)) { return false; }
return true;
}
}
}