aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Movement
diff options
context:
space:
mode:
authorTrisjdc <trisjdc@gmail.com>2014-07-04 22:22:28 +0100
committerTrisjdc <trisjdc@gmail.com>2014-07-04 22:22:28 +0100
commit124398feefc64fe77ab01f469fbde645edbeb80f (patch)
treeed349f73fe411bbfdce0f5d3446767975b9bea2d /src/server/game/Movement
parent4302226a853811f1346ca96a78af0e649cdb4580 (diff)
Core/Spells: Improve charge path logic, get a point to the target and then reduce it by the necessary distance
Diffstat (limited to 'src/server/game/Movement')
-rw-r--r--src/server/game/Movement/PathGenerator.cpp38
-rw-r--r--src/server/game/Movement/PathGenerator.h2
2 files changed, 40 insertions, 0 deletions
diff --git a/src/server/game/Movement/PathGenerator.cpp b/src/server/game/Movement/PathGenerator.cpp
index d6912bac7c8..3140fc23296 100644
--- a/src/server/game/Movement/PathGenerator.cpp
+++ b/src/server/game/Movement/PathGenerator.cpp
@@ -882,3 +882,41 @@ float PathGenerator::Dist3DSqr(G3D::Vector3 const& p1, G3D::Vector3 const& p2) c
{
return (p1 - p2).squaredLength();
}
+
+void PathGenerator::ReducePathLenghtByDist(float dist)
+{
+ if (GetPathType() == PATHFIND_BLANK)
+ {
+ TC_LOG_ERROR("maps", "PathGenerator::ReducePathLenghtByDist called before path was built");
+ return;
+ }
+
+ if (_pathPoints.size() < 2) // path building failure
+ return;
+
+ uint32 i = _pathPoints.size();
+ G3D::Vector3 nextVec = _pathPoints[--i];
+ while (i > 0)
+ {
+ G3D::Vector3 currVec = _pathPoints[--i];
+ G3D::Vector3 diffVec = (nextVec - currVec);
+ float len = diffVec.length();
+ if (len > dist)
+ {
+ float step = dist / len;
+ // same as nextVec
+ _pathPoints[i + 1] -= diffVec * step;
+ _pathPoints.resize(i + 2);
+ break;
+ }
+ else if (i == 0) // at second point
+ {
+ _pathPoints[1] = _pathPoints[0];
+ _pathPoints.resize(2);
+ break;
+ }
+
+ dist -= len;
+ nextVec = currVec; // we're going backwards
+ }
+}
diff --git a/src/server/game/Movement/PathGenerator.h b/src/server/game/Movement/PathGenerator.h
index 6e0d72ec8da..a9a13c37251 100644
--- a/src/server/game/Movement/PathGenerator.h
+++ b/src/server/game/Movement/PathGenerator.h
@@ -72,6 +72,8 @@ class PathGenerator
PathType GetPathType() const { return _type; }
+ void ReducePathLenghtByDist(float dist); // path must be already built
+
private:
dtPolyRef _pathPolyRefs[MAX_PATH_LENGTH]; // array of detour polygon references