From 4cf5cb9031cf2996e8f6f9bfe358ebf187ae2630 Mon Sep 17 00:00:00 2001 From: ccrs Date: Tue, 8 Aug 2017 19:35:13 +0200 Subject: Core/Movement: add new helper that cleans the referenced MovementSlot (cherry picked from commit ee2d7c1d53986d32779379caf0591d6cde530ead) --- src/server/game/Movement/MotionMaster.cpp | 57 ++++++++++++++++++++++--------- src/server/game/Movement/MotionMaster.h | 1 + 2 files changed, 41 insertions(+), 17 deletions(-) (limited to 'src/server') diff --git a/src/server/game/Movement/MotionMaster.cpp b/src/server/game/Movement/MotionMaster.cpp index 295c70039e6..19e900a8806 100644 --- a/src/server/game/Movement/MotionMaster.cpp +++ b/src/server/game/Movement/MotionMaster.cpp @@ -117,23 +117,6 @@ void MotionMaster::Clear(bool reset /*= true*/) DirectClean(reset); } -void MotionMaster::ClearExpireList() -{ - for (auto itr : _expireList) - DirectDelete(itr); - - _expireList.clear(); - - if (empty()) - Initialize(); - else if (NeedInitTop()) - InitTop(); - else if (_cleanFlag & MMCF_RESET) - top()->Reset(_owner); - - _cleanFlag &= ~MMCF_RESET; -} - void MotionMaster::MovementExpired(bool reset /*= true*/) { if (_cleanFlag & MMCF_UPDATE) @@ -148,6 +131,29 @@ 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()) @@ -847,3 +853,20 @@ void MotionMaster::DelayedDelete(MovementGenerator* curr) _expireList.push_back(curr); } + +void MotionMaster::ClearExpireList() +{ + for (auto itr : _expireList) + DirectDelete(itr); + + _expireList.clear(); + + if (empty()) + Initialize(); + else if (NeedInitTop()) + InitTop(); + else if (_cleanFlag & MMCF_RESET) + top()->Reset(_owner); + + _cleanFlag &= ~MMCF_RESET; +} diff --git a/src/server/game/Movement/MotionMaster.h b/src/server/game/Movement/MotionMaster.h index 7cb72c353f7..703ca60d50b 100644 --- a/src/server/game/Movement/MotionMaster.h +++ b/src/server/game/Movement/MotionMaster.h @@ -121,6 +121,7 @@ class TC_GAME_API MotionMaster void Clear(bool reset = true); void MovementExpired(bool reset = true); + void ExpireMovement(MovementSlot slot); MovementGeneratorType GetCurrentMovementGeneratorType() const; MovementGeneratorType GetMotionSlotType(int slot) const; -- cgit v1.2.3