diff options
-rw-r--r-- | src/server/game/Movement/MotionMaster.cpp | 73 | ||||
-rw-r--r-- | src/server/game/Movement/MotionMaster.h | 6 |
2 files changed, 49 insertions, 30 deletions
diff --git a/src/server/game/Movement/MotionMaster.cpp b/src/server/game/Movement/MotionMaster.cpp index a29684dfbe2..0e6b216aa44 100644 --- a/src/server/game/Movement/MotionMaster.cpp +++ b/src/server/game/Movement/MotionMaster.cpp @@ -117,6 +117,17 @@ void MotionMaster::Clear(bool reset /*= true*/) DirectClean(reset); } +void MotionMaster::Clear(MovementSlot slot) +{ + if (empty() || slot >= MAX_MOTION_SLOT) + return; + + if (_cleanFlag & MMCF_UPDATE) + DelayedClean(slot); + else + DirectClean(slot); +} + void MotionMaster::MovementExpired(bool reset /*= true*/) { if (_cleanFlag & MMCF_UPDATE) @@ -131,29 +142,6 @@ void MotionMaster::MovementExpired(bool reset /*= true*/) DirectExpire(reset); } -void MotionMaster::ExpireMovement(MovementSlot slot) -{ - if (empty() || slot >= MAX_MOTION_SLOT) - return; - - if (MovementGenerator* motion = GetMotionSlot(slot)) - { - DirectDelete(motion); - _slot[slot] = nullptr; - } - - if (!top()) - { - while (!empty() && !top()) - --_top; - - if (empty()) - Initialize(); - else if (NeedInitTop()) - InitTop(); - } -} - MovementGeneratorType MotionMaster::GetCurrentMovementGeneratorType() const { if (empty()) @@ -754,7 +742,7 @@ void MotionMaster::InitTop() void MotionMaster::Mutate(MovementGenerator *m, MovementSlot slot) { - if (MovementGenerator *curr = _slot[slot]) + if (MovementGenerator* curr = _slot[slot]) { _slot[slot] = nullptr; // in case a new one is generated in this slot during directdelete if (_top == slot && (_cleanFlag & MMCF_UPDATE)) @@ -781,7 +769,7 @@ void MotionMaster::DirectClean(bool reset) { while (size() > 1) { - MovementGenerator *curr = top(); + MovementGenerator* curr = top(); pop(); if (curr) DirectDelete(curr); @@ -800,18 +788,47 @@ void MotionMaster::DelayedClean() { while (size() > 1) { - MovementGenerator *curr = top(); + MovementGenerator* curr = top(); pop(); if (curr) DelayedDelete(curr); } } +void MotionMaster::DirectClean(MovementSlot slot) +{ + if (MovementGenerator* motion = GetMotionSlot(slot)) + { + _slot[slot] = nullptr; + DirectDelete(motion); + } + + while (!empty() && !top()) + --_top; + + if (empty()) + Initialize(); + else if (NeedInitTop()) + InitTop(); +} + +void MotionMaster::DelayedClean(MovementSlot slot) +{ + if (MovementGenerator* motion = GetMotionSlot(slot)) + { + _slot[slot] = nullptr; + DelayedDelete(motion); + } + + while (!empty() && !top()) + --_top; +} + void MotionMaster::DirectExpire(bool reset) { if (size() > 1) { - MovementGenerator *curr = top(); + MovementGenerator* curr = top(); pop(); DirectDelete(curr); } @@ -831,7 +848,7 @@ void MotionMaster::DelayedExpire() { if (size() > 1) { - MovementGenerator *curr = top(); + MovementGenerator* curr = top(); pop(); DelayedDelete(curr); } diff --git a/src/server/game/Movement/MotionMaster.h b/src/server/game/Movement/MotionMaster.h index 703ca60d50b..01d6574945f 100644 --- a/src/server/game/Movement/MotionMaster.h +++ b/src/server/game/Movement/MotionMaster.h @@ -120,8 +120,8 @@ class TC_GAME_API MotionMaster void UpdateMotion(uint32 diff); void Clear(bool reset = true); + void Clear(MovementSlot slot); void MovementExpired(bool reset = true); - void ExpireMovement(MovementSlot slot); MovementGeneratorType GetCurrentMovementGeneratorType() const; MovementGeneratorType GetMotionSlotType(int slot) const; @@ -188,10 +188,12 @@ class TC_GAME_API MotionMaster bool NeedInitTop() const; void InitTop(); - void Mutate(MovementGenerator *m, MovementSlot slot); + void Mutate(MovementGenerator* m, MovementSlot slot); void DirectClean(bool reset); void DelayedClean(); + void DirectClean(MovementSlot slot); + void DelayedClean(MovementSlot slot); void DirectExpire(bool reset); void DelayedExpire(); void DirectDelete(MovementGenerator* curr); |