summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorworktycho <work.tycho@gmail.com>2015-05-20 23:40:25 +0200
committerworktycho <work.tycho@gmail.com>2015-05-20 23:40:25 +0200
commit1bdd205eb8195c4e44d2072aa2e1ddb0a11745c6 (patch)
tree68b959cc0ca2eaee66add4887fed70785e4ce283
parentMerge pull request #2074 from SafwatHalaby/rmUnique (diff)
parentPath recalculation improvements (diff)
downloadcuberite-1bdd205eb8195c4e44d2072aa2e1ddb0a11745c6.tar
cuberite-1bdd205eb8195c4e44d2072aa2e1ddb0a11745c6.tar.gz
cuberite-1bdd205eb8195c4e44d2072aa2e1ddb0a11745c6.tar.bz2
cuberite-1bdd205eb8195c4e44d2072aa2e1ddb0a11745c6.tar.lz
cuberite-1bdd205eb8195c4e44d2072aa2e1ddb0a11745c6.tar.xz
cuberite-1bdd205eb8195c4e44d2072aa2e1ddb0a11745c6.tar.zst
cuberite-1bdd205eb8195c4e44d2072aa2e1ddb0a11745c6.zip
-rw-r--r--src/Mobs/Monster.cpp5
-rw-r--r--src/Mobs/Path.cpp12
-rw-r--r--src/Mobs/Path.h10
3 files changed, 17 insertions, 10 deletions
diff --git a/src/Mobs/Monster.cpp b/src/Mobs/Monster.cpp
index 2b00f6959..f5d961096 100644
--- a/src/Mobs/Monster.cpp
+++ b/src/Mobs/Monster.cpp
@@ -177,13 +177,14 @@ bool cMonster::TickPathFinding(cChunk & a_Chunk)
case ePathFinderStatus::NEARBY_FOUND:
{
m_NoPathToTarget = true;
- m_Path->AcceptNearbyPath();
+ m_PathFinderDestination = m_Path->AcceptNearbyPath();
break;
}
case ePathFinderStatus::PATH_NOT_FOUND:
{
- StopMovingToPosition(); // Give up pathfinding to that destination.
+ ResetPathFinding(); // Try to calculate a path again.
+ // Note that the next time may succeed, e.g. if a player breaks a barrier.
break;
}
case ePathFinderStatus::CALCULATING:
diff --git a/src/Mobs/Path.cpp b/src/Mobs/Path.cpp
index bf5e4ba5e..eba29be7e 100644
--- a/src/Mobs/Path.cpp
+++ b/src/Mobs/Path.cpp
@@ -6,6 +6,7 @@
#include "Path.h"
#include "../Chunk.h"
+
#define DISTANCE_MANHATTAN 0 // 1: More speed, a bit less accuracy 0: Max accuracy, less speed.
#define HEURISTICS_ONLY 0 // 1: Much more speed, much less accurate.
#define CALCULATIONS_PER_STEP 10 // Higher means more CPU load but faster path calculations.
@@ -178,11 +179,18 @@ bool cPath::Step_Internal()
// Calculation not finished yet.
// Check if we have a new NearestPoint.
- if (CurrentCell->m_H < m_NearestPointToTarget->m_H)
+
+ if ((m_Destination - CurrentCell->m_Location).Length() < 5)
+ {
+ if (m_Rand.NextInt(4) == 0)
+ {
+ m_NearestPointToTarget = CurrentCell;
+ }
+ }
+ else if (CurrentCell->m_H < m_NearestPointToTarget->m_H)
{
m_NearestPointToTarget = CurrentCell;
}
-
// process a currentCell by inspecting all neighbors.
// Check North, South, East, West on all 3 different heights.
diff --git a/src/Mobs/Path.h b/src/Mobs/Path.h
index acc56ef2d..b296bbdf5 100644
--- a/src/Mobs/Path.h
+++ b/src/Mobs/Path.h
@@ -1,16 +1,13 @@
#pragma once
-/* Wanna use the pathfinder? Put this in your header file:
-
-// Fwd: cPath
+/*
+// Needed Fwds: cPath
enum class ePathFinderStatus;
class cPath;
-
-Put this in your .cpp:
-#include "...Path.h"
*/
+#include "../FastRandom.h"
#ifdef COMPILING_PATHFIND_DEBUGGER
/* Note: the COMPILING_PATHFIND_DEBUGGER flag is used by Native / WiseOldMan95 to debug
this class outside of MCServer. This preprocessor flag is never set when compiling MCServer. */
@@ -166,6 +163,7 @@ private:
Vector3i m_Source;
int m_StepsLeft;
cPathCell * m_NearestPointToTarget;
+ cFastRandom m_Rand;
/* Control fields */
ePathFinderStatus m_Status;