diff options
| author | zengwf <darkerone@sina.com> | 2014-01-12 00:32:16 +0000 |
|---|---|---|
| committer | Duarte Duarte <dnpd.dd@gmail.com> | 2014-01-12 00:33:33 +0000 |
| commit | 23acf75d3bea64528ade17262d9c2fe3fe2aa026 (patch) | |
| tree | d5fe264426a40296fdcd1d4e411abf17c0295857 /src/server/game/Movement | |
| parent | 0eadb41ed1ae5e26bc2ced603b4e268f8d8ed513 (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.h | 18 | ||||
| -rw-r--r-- | src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.cpp | 15 |
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); |
