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 | |
| 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')
| -rw-r--r-- | src/server/game/Chat/ChatLink.h | 4 | ||||
| -rw-r--r-- | src/server/game/Entities/Object/Object.h | 2 | ||||
| -rw-r--r-- | src/server/game/Movement/MotionMaster.h | 18 | ||||
| -rw-r--r-- | src/server/game/Movement/MovementGenerators/FleeingMovementGenerator.cpp | 15 | ||||
| -rw-r--r-- | src/server/game/Warden/Warden.cpp | 2 |
5 files changed, 28 insertions, 13 deletions
diff --git a/src/server/game/Chat/ChatLink.h b/src/server/game/Chat/ChatLink.h index c151bbd4b8e..cc86cb538ea 100644 --- a/src/server/game/Chat/ChatLink.h +++ b/src/server/game/Chat/ChatLink.h @@ -57,7 +57,7 @@ class ItemChatLink : public ChatLink { public: ItemChatLink() : ChatLink(), _item(NULL), _suffix(NULL), _property(NULL) - { + { memset(_data, 0, sizeof(_data)); } virtual bool Initialize(std::istringstream& iss); @@ -102,7 +102,7 @@ class AchievementChatLink : public ChatLink { public: AchievementChatLink() : ChatLink(), _guid(0), _achievement(NULL) - { + { memset(_data, 0, sizeof(_data)); } virtual bool Initialize(std::istringstream& iss); diff --git a/src/server/game/Entities/Object/Object.h b/src/server/game/Entities/Object/Object.h index edcdf25ba33..8d3b1ff9554 100644 --- a/src/server/game/Entities/Object/Object.h +++ b/src/server/game/Entities/Object/Object.h @@ -537,7 +537,7 @@ class MapObject protected: MapObject() : _moveState(MAP_OBJECT_CELL_MOVE_NONE) - { + { _newPosition.Relocate(0.0f, 0.0f, 0.0f, 0.0f); } 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); diff --git a/src/server/game/Warden/Warden.cpp b/src/server/game/Warden/Warden.cpp index 2462fc203d2..4611a4da884 100644 --- a/src/server/game/Warden/Warden.cpp +++ b/src/server/game/Warden/Warden.cpp @@ -32,7 +32,7 @@ Warden::Warden() : _session(NULL), _inputCrypto(16), _outputCrypto(16), _checkTimer(10000/*10 sec*/), _clientResponseTimer(0), _dataSent(false), _previousTimestamp(0), _module(NULL), _initialized(false) -{ +{ memset(_inputKey, 0, sizeof(_inputKey)); memset(_outputKey, 0, sizeof(_outputKey)); memset(_seed, 0, sizeof(_seed)); |
