diff options
Diffstat (limited to 'src/server/game/Movement/MotionMaster.cpp')
-rw-r--r-- | src/server/game/Movement/MotionMaster.cpp | 73 |
1 files changed, 45 insertions, 28 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); } |