diff --git a/apps/openmw/mwmechanics/aipackage.cpp b/apps/openmw/mwmechanics/aipackage.cpp index 8880820dd..8af2c71ed 100644 --- a/apps/openmw/mwmechanics/aipackage.cpp +++ b/apps/openmw/mwmechanics/aipackage.cpp @@ -158,7 +158,7 @@ bool MWMechanics::AiPackage::pathTo(const MWWorld::Ptr& actor, const osg::Vec3f& zTurn(actor, getZAngleToPoint(position, dest)); smoothTurn(actor, getXAngleToPoint(position, dest), 0); world->removeActorPath(actor); - return isDestReached; + return isDestReached || mPathFinder.pathWasPossible(); } world->updateActorPath(actor, mPathFinder.getPath(), halfExtents, position, dest); diff --git a/apps/openmw/mwmechanics/pathfinding.cpp b/apps/openmw/mwmechanics/pathfinding.cpp index a82dcf717..77ab78fd7 100644 --- a/apps/openmw/mwmechanics/pathfinding.cpp +++ b/apps/openmw/mwmechanics/pathfinding.cpp @@ -318,6 +318,7 @@ namespace MWMechanics mPath.clear(); mPath.push_back(endPoint); mConstructed = true; + mPossible = true; } void PathFinder::buildPathByPathgrid(const osg::Vec3f& startPoint, const osg::Vec3f& endPoint, @@ -329,6 +330,7 @@ namespace MWMechanics buildPathByPathgridImpl(startPoint, endPoint, pathgridGraph, std::back_inserter(mPath)); mConstructed = true; + mPossible = !mPath.empty(); } void PathFinder::buildPathByNavMesh(const MWWorld::ConstPtr& actor, const osg::Vec3f& startPoint, @@ -342,6 +344,7 @@ namespace MWMechanics mPath.push_back(endPoint); mConstructed = true; + mPossible = !mPath.empty(); } void PathFinder::buildPath(const MWWorld::ConstPtr& actor, const osg::Vec3f& startPoint, const osg::Vec3f& endPoint, @@ -367,6 +370,7 @@ namespace MWMechanics mPath.push_back(endPoint); mConstructed = true; + mPossible = !mPath.empty(); } bool PathFinder::buildPathByNavigatorImpl(const MWWorld::ConstPtr& actor, const osg::Vec3f& startPoint, diff --git a/apps/openmw/mwmechanics/pathfinding.hpp b/apps/openmw/mwmechanics/pathfinding.hpp index 5af822fee..ed786dc84 100644 --- a/apps/openmw/mwmechanics/pathfinding.hpp +++ b/apps/openmw/mwmechanics/pathfinding.hpp @@ -74,6 +74,7 @@ namespace MWMechanics public: PathFinder() : mConstructed(false) + , mPossible(false) , mCell(nullptr) { } @@ -81,6 +82,7 @@ namespace MWMechanics void clearPath() { mConstructed = false; + mPossible = false; mPath.clear(); mCell = nullptr; } @@ -109,6 +111,11 @@ namespace MWMechanics return mConstructed && mPath.empty(); } + bool pathWasPossible() const + { + return mPossible; + } + /// In radians float getZAngleToNext(float x, float y) const; @@ -137,6 +144,7 @@ namespace MWMechanics void addPointToPath(const osg::Vec3f& point) { mConstructed = true; + mPossible = true; mPath.push_back(point); } @@ -196,6 +204,7 @@ namespace MWMechanics private: bool mConstructed; + bool mPossible; std::deque mPath; const MWWorld::CellStore* mCell;