aboutsummaryrefslogtreecommitdiff
path: root/src/server/game/Movement
diff options
context:
space:
mode:
authorzengwf <darkerone@sina.com>2014-01-12 00:32:16 +0000
committerDuarte Duarte <dnpd.dd@gmail.com>2014-01-12 00:33:33 +0000
commit23acf75d3bea64528ade17262d9c2fe3fe2aa026 (patch)
treed5fe264426a40296fdcd1d4e411abf17c0295857 /src/server/game/Movement
parent0eadb41ed1ae5e26bc2ced603b4e268f8d8ed513 (diff)
Core/Movement: Add LOS check for fleeingmovement target point.
Prevents fleeing or feared units from going to upper floor ignoring walls/ceilings with mmaps on(and usually get stucked). Current implementation just randomly selects a distance and angle against the frighting unit, when in narrow circumstance such as underground caves, such targeting point would be at another floor. Closes #11300 Ref #9475 (needs fixed confirmation)
Diffstat (limited to 'src/server/game/Movement')
-rw-r--r--src/server/game/Movement/MotionMaster.h18
-rw-r--r--src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.cpp15
2 files changed, 24 insertions, 9 deletions
diff --git a/src/server/game/Movement/MotionMaster.h b/src/server/game/Movement/MotionMaster.h
index c05d7804948..aabb117ef50 100644
--- a/src/server/game/Movement/MotionMaster.h
+++ b/src/server/game/Movement/MotionMaster.h
@@ -96,11 +96,11 @@ class MotionMaster //: private std::stack<MovementGenerator *>
}
void push(_Ty _Val) { ++_top; Impl[_top] = _Val; }
- bool needInitTop() const
- {
+ bool needInitTop() const
+ {
if (empty())
return false;
- return _needInit[_top];
+ return _needInit[_top];
}
void InitTop();
public:
@@ -120,15 +120,15 @@ class MotionMaster //: private std::stack<MovementGenerator *>
bool empty() const { return (_top < 0); }
int size() const { return _top + 1; }
- _Ty top() const
- {
+ _Ty top() const
+ {
ASSERT(!empty());
- return Impl[_top];
+ return Impl[_top];
}
- _Ty GetMotionSlot(int slot) const
- {
+ _Ty GetMotionSlot(int slot) const
+ {
ASSERT(slot >= 0);
- return Impl[slot];
+ return Impl[slot];
}
void DirectDelete(_Ty curr);
diff --git a/src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.cpp b/src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.cpp
index bc2460fa709..572d65b07c7 100644
--- a/src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.cpp
+++ b/src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.cpp
@@ -25,6 +25,7 @@
#include "MoveSplineInit.h"
#include "MoveSpline.h"
#include "Player.h"
+#include "VMapFactory.h"
#define MIN_QUIET_DISTANCE 28.0f
#define MAX_QUIET_DISTANCE 43.0f
@@ -43,6 +44,20 @@ void FleeingMovementGenerator<T>::_setTargetLocation(T* owner)
float x, y, z;
_getPoint(owner, x, y, z);
+ // Add LOS check for target point
+ Position mypos;
+ owner->GetPosition(&mypos);
+ bool isInLOS = VMAP::VMapFactory::createOrGetVMapManager()->isInLineOfSight(owner->GetMapId(),
+ mypos.m_positionX,
+ mypos.m_positionY,
+ mypos.m_positionZ + 2.0f,
+ x, y, z + 2.0f);
+ if (!isInLOS)
+ {
+ i_nextCheckTime.Reset(200);
+ return;
+ }
+
PathGenerator path(owner);
path.SetPathLengthLimit(30.0f);
bool result = path.CalculatePath(x, y, z);