aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShauren <shauren.trinity@gmail.com>2024-04-17 00:06:56 +0200
committerOvahlord <dreadkiller@gmx.de>2024-05-28 16:42:54 +0200
commit6ab79caf0f9d03cda5d7f9be990740e137f0f013 (patch)
tree347d8f0fd1fe527df4564074b3e899aa490f006c
parentd80fb502f69eab411fc269354b9f363a373a1bf1 (diff)
Core/Pathfinding: Allow using PathGenerator with any source location, not only objects current position
(cherry picked from commit e5beb25d2529cee9f7d83f227b06ce3d47f6d2c2)
-rw-r--r--src/server/game/Movement/PathGenerator.cpp27
-rw-r--r--src/server/game/Movement/PathGenerator.h5
2 files changed, 19 insertions, 13 deletions
diff --git a/src/server/game/Movement/PathGenerator.cpp b/src/server/game/Movement/PathGenerator.cpp
index 5189dbd8358..1d8285822ec 100644
--- a/src/server/game/Movement/PathGenerator.cpp
+++ b/src/server/game/Movement/PathGenerator.cpp
@@ -20,6 +20,7 @@
#include "DetourCommon.h"
#include "DetourNavMeshQuery.h"
#include "DisableMgr.h"
+#include "G3DPosition.hpp"
#include "Log.h"
#include "MMapFactory.h"
#include "MMapManager.h"
@@ -31,14 +32,14 @@
PathGenerator::PathGenerator(WorldObject const* owner) :
_polyLength(0), _type(PATHFIND_BLANK), _useStraightPath(false),
_forceDestination(false), _pointPathLimit(MAX_POINT_PATH_LENGTH), _useRaycast(false),
- _endPosition(G3D::Vector3::zero()), _source(owner), _navMesh(nullptr),
+ _startPosition(PositionToVector3(owner)), _endPosition(G3D::Vector3::zero()), _source(owner), _navMesh(nullptr),
_navMeshQuery(nullptr)
{
memset(_pathPolyRefs, 0, sizeof(_pathPolyRefs));
TC_LOG_DEBUG("maps.mmaps", "++ PathGenerator::PathGenerator for {}", _source->GetGUID().ToString());
- uint32 mapId = PhasingHandler::GetTerrainMapId(_source->GetPhaseShift(), _source->GetMapId(), _source->GetMap()->GetTerrain(), _source->GetPositionX(), _source->GetPositionY());
+ uint32 mapId = PhasingHandler::GetTerrainMapId(_source->GetPhaseShift(), _source->GetMapId(), _source->GetMap()->GetTerrain(), _startPosition.x, _startPosition.y);
if (DisableMgr::IsPathfindingEnabled(_source->GetMapId()))
{
MMAP::MMapManager* mmap = MMAP::MMapFactory::createOrGetMMapManager();
@@ -54,12 +55,9 @@ PathGenerator::~PathGenerator()
TC_LOG_DEBUG("maps.mmaps", "++ PathGenerator::~PathGenerator() for {}", _source->GetGUID().ToString());
}
-bool PathGenerator::CalculatePath(float destX, float destY, float destZ, bool forceDest)
+bool PathGenerator::CalculatePath(float srcX, float srcY, float srcZ, float destX, float destY, float destZ, bool forceDest)
{
- float x, y, z;
- _source->GetPosition(x, y, z);
-
- if (!Trinity::IsValidMapCoord(destX, destY, destZ) || !Trinity::IsValidMapCoord(x, y, z))
+ if (!Trinity::IsValidMapCoord(destX, destY, destZ) || !Trinity::IsValidMapCoord(srcX, srcY, srcZ))
return false;
TC_METRIC_DETAILED_EVENT("mmap_events", "CalculatePath", "");
@@ -67,7 +65,7 @@ bool PathGenerator::CalculatePath(float destX, float destY, float destZ, bool fo
G3D::Vector3 dest(destX, destY, destZ);
SetEndPosition(dest);
- G3D::Vector3 start(x, y, z);
+ G3D::Vector3 start(srcX, srcY, srcZ);
SetStartPosition(start);
_forceDestination = forceDest;
@@ -91,6 +89,13 @@ bool PathGenerator::CalculatePath(float destX, float destY, float destZ, bool fo
return true;
}
+bool PathGenerator::CalculatePath(float destX, float destY, float destZ, bool forceDest)
+{
+ float x, y, z;
+ _source->GetPosition(x, y, z);
+ return CalculatePath(x, y, z, destX, destY, destZ, forceDest);
+}
+
dtPolyRef PathGenerator::GetPathPolyByPosition(dtPolyRef const* polyPath, uint32 polyPathSize, float const* point, float* distance) const
{
if (!polyPath || !polyPathSize)
@@ -684,9 +689,9 @@ void PathGenerator::UpdateFilter()
if (_sourceUnit->IsInWater() || _sourceUnit->IsUnderWater())
{
uint16 includedFlags = _filter.getIncludeFlags();
- includedFlags |= GetNavTerrain(_source->GetPositionX(),
- _source->GetPositionY(),
- _source->GetPositionZ());
+ includedFlags |= GetNavTerrain(_startPosition.x,
+ _startPosition.y,
+ _startPosition.z);
_filter.setIncludeFlags(includedFlags);
}
diff --git a/src/server/game/Movement/PathGenerator.h b/src/server/game/Movement/PathGenerator.h
index 3d86cd066b8..c212e826f74 100644
--- a/src/server/game/Movement/PathGenerator.h
+++ b/src/server/game/Movement/PathGenerator.h
@@ -65,6 +65,7 @@ class TC_GAME_API PathGenerator
// Calculate the path from owner to given destination
// return: true if new path was calculated, false otherwise (no change needed)
+ bool CalculatePath(float srcX, float srcY, float srcZ, float destX, float destY, float destZ, bool forceDest = false);
bool CalculatePath(float destX, float destY, float destZ, bool forceDest = false);
bool IsInvalidDestinationZ(WorldObject const* target) const;
@@ -84,7 +85,7 @@ class TC_GAME_API PathGenerator
PathType GetPathType() const { return _type; }
// shortens the path until the destination is the specified distance from the target point
- void ShortenPathUntilDist(G3D::Vector3 const& point, float dist);
+ void ShortenPathUntilDist(G3D::Vector3 const& target, float dist);
private:
@@ -142,7 +143,7 @@ class TC_GAME_API PathGenerator
unsigned char& steerPosFlag, dtPolyRef& steerPosRef);
dtStatus FindSmoothPath(float const* startPos, float const* endPos,
dtPolyRef const* polyPath, uint32 polyPathSize,
- float* smoothPath, int* smoothPathSize, uint32 smoothPathMaxSize);
+ float* smoothPath, int* smoothPathSize, uint32 maxSmoothPathSize);
void AddFarFromPolyFlags(bool startFarFromPoly, bool endFarFromPoly);
};