(17fdbc9de) New path is also needed if the old becomes unreachable. Ignore the new path if it's unreachable.

This commit is contained in:
Joonas Rikkonen
2019-05-18 17:29:40 +03:00
parent 75640a321f
commit 9521f0ae2f
9 changed files with 74 additions and 103 deletions
@@ -85,12 +85,18 @@ namespace Barotrauma
if (Character.Submarine != null || SelectedAiTarget?.Entity?.Submarine != null)
{
if (steeringManager != insideSteering) insideSteering.Reset();
if (steeringManager != insideSteering)
{
insideSteering.Reset();
}
steeringManager = insideSteering;
}
else
{
if (steeringManager != outsideSteering) outsideSteering.Reset();
if (steeringManager != outsideSteering)
{
outsideSteering.Reset();
}
steeringManager = outsideSteering;
}
@@ -144,9 +144,9 @@ namespace Barotrauma
protected override Vector2 DoSteeringSeek(Vector2 target, float weight)
{
bool isDifferentTarget = Vector2.DistanceSquared(target, currentTarget) > 1;
bool needsNewPath = currentPath != null && currentPath.Unreachable || Vector2.DistanceSquared(target, currentTarget) > 1;
//find a new path if one hasn't been found yet or the target is different from the current target
if (currentPath == null || isDifferentTarget || findPathTimer < -1.0f)
if (currentPath == null || needsNewPath || findPathTimer < -1.0f)
{
IsPathDirty = true;
@@ -164,7 +164,7 @@ namespace Barotrauma
}
var newPath = pathFinder.FindPath(pos, target, "(Character: " + character.Name + ")");
if (currentPath == null || isDifferentTarget || newPath.Cost < currentPath.Cost)
if (currentPath == null || needsNewPath || !newPath.Unreachable && newPath.Cost < currentPath.Cost)
{
currentPath = newPath;
}
@@ -424,7 +424,7 @@ namespace Barotrauma
// It's possible that we could reach another buttons.
// If this becomes an issue, we could go through them here and check if any of them are reachable
// (would have to cache a collection of buttons instead of a single reference in the CanAccess filter method above)
currentPath.Unreachable = true;
//currentPath.Unreachable = true;
return;
}
}
@@ -117,7 +117,7 @@ namespace Barotrauma
// Take the sub position into account in the sim pos
if (character.Submarine == null && Target.Submarine != null)
{
currTargetSimPos += Target.Submarine.SimPosition;
//currTargetSimPos += Target.Submarine.SimPosition;
}
else if (character.Submarine != null && Target.Submarine == null)
{
@@ -165,8 +165,8 @@ namespace Barotrauma
{
Vector2 nodePos = node.Position;
float xDiff = System.Math.Abs(start.X - nodePos.X);
float yDiff = System.Math.Abs(start.Y - nodePos.Y);
float xDiff = Math.Abs(start.X - nodePos.X);
float yDiff = Math.Abs(start.Y - nodePos.Y);
if (yDiff > 1.0f && node.Waypoint.Ladders == null && node.Waypoint.Stairs == null)
{
@@ -190,7 +190,7 @@ namespace Barotrauma
if (body != null)
{
if (body.UserData is Submarine) continue;
//if (body.UserData is Submarine) continue;
if (body.UserData is Structure && !((Structure)body.UserData).IsPlatform) continue;
if (body.UserData is Item && body.FixtureList[0].CollisionCategories.HasFlag(Physics.CollisionWall)) continue;
}
@@ -216,8 +216,7 @@ namespace Barotrauma
{
Vector2 nodePos = node.Position;
// TODO: use squared distance
float dist = Vector2.Distance(end, nodePos);
float dist = Vector2.DistanceSquared(end, nodePos);
if (insideSubmarine)
{
//much higher cost to waypoints that are outside
@@ -235,7 +234,7 @@ namespace Barotrauma
if (body != null)
{
if (body.UserData is Submarine) continue;
//if (body.UserData is Submarine) continue;
if (body.UserData is Structure && !((Structure)body.UserData).IsPlatform) continue;
if (body.UserData is Item && body.FixtureList[0].CollisionCategories.HasFlag(Physics.CollisionWall)) continue;