diff options
author | Safwat Halaby <SafwatHalaby@users.noreply.github.com> | 2015-12-21 15:47:43 +0100 |
---|---|---|
committer | Safwat Halaby <SafwatHalaby@users.noreply.github.com> | 2015-12-21 15:47:43 +0100 |
commit | b4874d213c279ee102a5fdc103dc098911f4255b (patch) | |
tree | 7e2691d58bb11479bd280155b4f5f62466082818 | |
parent | Merge pull request #2783 from cuberite/seadragon91-patch-spawnpoint-fix (diff) | |
download | cuberite-b4874d213c279ee102a5fdc103dc098911f4255b.tar cuberite-b4874d213c279ee102a5fdc103dc098911f4255b.tar.gz cuberite-b4874d213c279ee102a5fdc103dc098911f4255b.tar.bz2 cuberite-b4874d213c279ee102a5fdc103dc098911f4255b.tar.lz cuberite-b4874d213c279ee102a5fdc103dc098911f4255b.tar.xz cuberite-b4874d213c279ee102a5fdc103dc098911f4255b.tar.zst cuberite-b4874d213c279ee102a5fdc103dc098911f4255b.zip |
-rw-r--r-- | src/Mobs/Path.cpp | 90 | ||||
-rw-r--r-- | src/Mobs/Path.h | 33 | ||||
-rw-r--r-- | src/Mobs/PathFinder.cpp | 16 | ||||
-rw-r--r-- | src/Mobs/PathFinder.h | 2 |
4 files changed, 38 insertions, 103 deletions
diff --git a/src/Mobs/Path.cpp b/src/Mobs/Path.cpp index f3a0d6cf2..c0cffbeb4 100644 --- a/src/Mobs/Path.cpp +++ b/src/Mobs/Path.cpp @@ -39,7 +39,34 @@ cPath::cPath( m_Chunk(&a_Chunk), m_BadChunkFound(false) { - ResetImpl(a_StartingPoint, a_EndingPoint, a_BoundingBoxWidth, a_BoundingBoxHeight); + // TODO: if src not walkable OR dest not walkable, then abort. + // Borrow a new "isWalkable" from ProcessIfWalkable, make ProcessIfWalkable also call isWalkable + + a_BoundingBoxWidth = 1; // Until we improve physics, if ever. + + m_BoundingBoxWidth = CeilC(a_BoundingBoxWidth); + m_BoundingBoxHeight = CeilC(a_BoundingBoxHeight); + m_HalfWidth = a_BoundingBoxWidth / 2; + + int HalfWidthInt = FloorC(a_BoundingBoxWidth / 2); + m_Source.x = FloorC(a_StartingPoint.x - HalfWidthInt); + m_Source.y = FloorC(a_StartingPoint.y); + m_Source.z = FloorC(a_StartingPoint.z - HalfWidthInt); + + m_Destination.x = FloorC(a_EndingPoint.x - HalfWidthInt); + m_Destination.y = FloorC(a_EndingPoint.y); + m_Destination.z = FloorC(a_EndingPoint.z - HalfWidthInt); + + if (GetCell(m_Source)->m_IsSolid || GetCell(m_Destination)->m_IsSolid) + { + m_Status = ePathFinderStatus::PATH_NOT_FOUND; + return; + } + + m_NearestPointToTarget = GetCell(m_Source); + m_Status = ePathFinderStatus::CALCULATING; + + ProcessCell(GetCell(m_Source), nullptr, 0); } cPath::cPath() : m_IsValid(false) @@ -470,64 +497,3 @@ cPathCell * cPath::GetCell(const Vector3i & a_Location) return &m_Map[a_Location]; } } - - - - - -void cPath::ResetImpl( - const Vector3d & a_StartingPoint, const Vector3d & a_EndingPoint, - double a_BoundingBoxWidth, double a_BoundingBoxHeight -) -{ - // TODO: if src not walkable OR dest not walkable, then abort. - // Borrow a new "isWalkable" from ProcessIfWalkable, make ProcessIfWalkable also call isWalkable - - a_BoundingBoxWidth = 1; // Until we improve physics, if ever. - - m_BoundingBoxWidth = CeilC(a_BoundingBoxWidth); - m_BoundingBoxHeight = CeilC(a_BoundingBoxHeight); - m_HalfWidth = a_BoundingBoxWidth / 2; - - int HalfWidthInt = FloorC(a_BoundingBoxWidth / 2); - m_Source.x = FloorC(a_StartingPoint.x - HalfWidthInt); - m_Source.y = FloorC(a_StartingPoint.y); - m_Source.z = FloorC(a_StartingPoint.z - HalfWidthInt); - - m_Destination.x = FloorC(a_EndingPoint.x - HalfWidthInt); - m_Destination.y = FloorC(a_EndingPoint.y); - m_Destination.z = FloorC(a_EndingPoint.z - HalfWidthInt); - - if (GetCell(m_Source)->m_IsSolid || GetCell(m_Destination)->m_IsSolid) - { - m_Status = ePathFinderStatus::PATH_NOT_FOUND; - return; - } - - m_NearestPointToTarget = GetCell(m_Source); - m_Status = ePathFinderStatus::CALCULATING; - - ProcessCell(GetCell(m_Source), nullptr, 0); -} - - - - - -void cPath::Reset( - cChunk & a_Chunk, - const Vector3d & a_StartingPoint, const Vector3d & a_EndingPoint, int a_MaxSteps, - double a_BoundingBoxWidth, double a_BoundingBoxHeight, - int a_MaxUp, int a_MaxDown -) -{ - m_Map.clear(); - m_OpenList = decltype(m_OpenList){}; - m_StepsLeft = a_MaxSteps; - m_IsValid = true; - m_CurrentPoint = 0; // GetNextPoint increments this to 1, but that's fine, since the first cell is always a_StartingPoint - m_Chunk = &a_Chunk; - m_BadChunkFound = false; - ResetImpl(a_StartingPoint, a_EndingPoint, a_BoundingBoxWidth, a_BoundingBoxHeight); -} - diff --git a/src/Mobs/Path.h b/src/Mobs/Path.h index d133c3669..158853a8c 100644 --- a/src/Mobs/Path.h +++ b/src/Mobs/Path.h @@ -79,8 +79,7 @@ public: /** delete default constructors */ cPath(const cPath & a_other) = delete; cPath(cPath && a_other) = delete; - - /** delete default assignment operators */ + cPath & operator=(const cPath & a_other) = delete; cPath & operator=(cPath && a_other) = delete; @@ -137,31 +136,6 @@ public: return m_PathPoints.size() - m_CurrentPoint; } - /** Recreates a pathfinder instance. A Mob will probably need a single pathfinder instance for its entire life. - - Note that if you have a man-sized mob (1x1x2, zombies, etc), you are advised to call this function without parameters - because the declaration might change in later version of the pathFinder, and a parameter-less call always assumes a man-sized mob. - - If your mob is not man-sized, you are advised to use cPath(width, height), this would be compatible with future versions, - but please be aware that as of now those parameters will be ignored and your mob will be assumed to be man sized. - - @param a_BoundingBoxWidth the character's boundingbox width in blocks. Currently the parameter is ignored and 1 is assumed. - @param a_BoundingBoxHeight the character's boundingbox width in blocks. Currently the parameter is ignored and 2 is assumed. - @param a_MaxUp the character's max jump height in blocks. Currently the parameter is ignored and 1 is assumed. - @param a_MaxDown How far is the character willing to fall? Currently the parameter is ignored and 1 is assumed. */ - /** Attempts to find a path starting from source to destination. - After calling this, you are expected to call Step() once per tick or once per several ticks until it returns true. You should then call getPath() to obtain the path. - Calling this before a path is found resets the current path and starts another search. - @param a_StartingPoint The function expects this position to be the lowest block the mob is in, a rule of thumb: "The block where the Zombie's knees are at". - @param a_EndingPoint "The block where the Zombie's knees want to be". - @param a_MaxSteps The maximum steps before giving up. */ - void Reset( - cChunk & a_Chunk, - const Vector3d & a_StartingPoint, const Vector3d & a_EndingPoint, int a_MaxSteps, - double a_BoundingBoxWidth, double a_BoundingBoxHeight, - int a_MaxUp = 1, int a_MaxDown = 1 - ); - @@ -174,11 +148,6 @@ private: void FinishCalculation(ePathFinderStatus a_NewStatus); // Clears the memory used for calculating the path and changes the status. void AttemptToFindAlternative(); void BuildPath(); - /** Handles all logic associated with reseting the path to a clean state */ - void ResetImpl( - const Vector3d & a_StartingPoint, const Vector3d & a_EndingPoint, - double a_BoundingBoxWidth, double a_BoundingBoxHeight - ); /* Openlist and closedlist management */ void OpenListAdd(cPathCell * a_Cell); diff --git a/src/Mobs/PathFinder.cpp b/src/Mobs/PathFinder.cpp index cb7d0c493..28dce4dc2 100644 --- a/src/Mobs/PathFinder.cpp +++ b/src/Mobs/PathFinder.cpp @@ -46,17 +46,17 @@ ePathFinderStatus cPathFinder::GetNextWayPoint(cChunk & a_Chunk, const Vector3d } // If m_Path has not been initialized yet, initialize it. - if (!m_Path.IsValid()) + if (!m_Path->IsValid()) { ResetPathFinding(a_Chunk); } - switch (m_Path.CalculationStep(a_Chunk)) + switch (m_Path->CalculationStep(a_Chunk)) { case ePathFinderStatus::NEARBY_FOUND: { m_NoPathToTarget = true; - m_PathDestination = m_Path.AcceptNearbyPath(); + m_PathDestination = m_Path->AcceptNearbyPath(); if (a_DontCare) { m_FinalDestination = m_PathDestination; @@ -89,7 +89,7 @@ ePathFinderStatus cPathFinder::GetNextWayPoint(cChunk & a_Chunk, const Vector3d return ePathFinderStatus::CALCULATING; } - if (m_Path.NoMoreWayPoints()) + if (m_Path->NoMoreWayPoints()) { // We're always heading towards m_PathDestination. // If m_PathDestination is exactly m_FinalDestination, then we're about to reach the destination. @@ -108,10 +108,10 @@ ePathFinderStatus cPathFinder::GetNextWayPoint(cChunk & a_Chunk, const Vector3d } - if (m_Path.IsFirstPoint() || ((m_WayPoint - m_Source).SqrLength() < WAYPOINT_RADIUS)) + if (m_Path->IsFirstPoint() || ((m_WayPoint - m_Source).SqrLength() < WAYPOINT_RADIUS)) { // if the mob has just started or if the mob reached a waypoint, give them a new waypoint. - m_WayPoint = m_Path.GetNextPoint(); + m_WayPoint = m_Path->GetNextPoint(); m_GiveUpCounter = 40; return ePathFinderStatus::PATH_FOUND; } @@ -142,7 +142,7 @@ void cPathFinder::ResetPathFinding(cChunk &a_Chunk) m_NoPathToTarget = false; m_PathDestination = m_FinalDestination; m_DeviationOrigin = m_PathDestination; - m_Path.Reset(a_Chunk, m_Source, m_PathDestination, 20, m_Width, m_Height); + m_Path.reset(new cPath(a_Chunk, m_Source, m_PathDestination, 20, m_Width, m_Height)); } @@ -248,7 +248,7 @@ bool cPathFinder::EnsureProperDestination(cChunk & a_Chunk) bool cPathFinder::PathIsTooOld() const { - size_t acceptableDeviation = m_Path.WayPointsLeft() / 2; + size_t acceptableDeviation = m_Path->WayPointsLeft() / 2; if (acceptableDeviation == 0) { acceptableDeviation = 1; diff --git a/src/Mobs/PathFinder.h b/src/Mobs/PathFinder.h index 1570679bf..312bb950c 100644 --- a/src/Mobs/PathFinder.h +++ b/src/Mobs/PathFinder.h @@ -52,7 +52,7 @@ private: double m_Height; /** The current cPath instance we have. This is discarded and recreated when a path recalculation is needed. */ - cPath m_Path; + std::unique_ptr<cPath> m_Path; /** If 0, will give up reaching the next m_WayPoint and will recalculate path. */ int m_GiveUpCounter; |