diff options
author | Shauren <shauren.trinity@gmail.com> | 2020-04-24 18:45:56 +0200 |
---|---|---|
committer | GitHub <noreply@github.com> | 2020-04-24 18:45:56 +0200 |
commit | 1a415147b9acc945163f6c8044e886983cbe8900 (patch) | |
tree | ae2d3709f586815853ef7519619e6f3c24dc8489 /src/server/game/Movement/MotionMaster.cpp | |
parent | bbfbb7d4bfa869755e702b40b53dbd295f8c964d (diff) | |
parent | 72ffe65dacf9a6eb62f337c2a49d8fff2716febd (diff) |
Merge pull request #24433 from funjoker/cherry-picks
Diffstat (limited to 'src/server/game/Movement/MotionMaster.cpp')
-rw-r--r-- | src/server/game/Movement/MotionMaster.cpp | 45 |
1 files changed, 24 insertions, 21 deletions
diff --git a/src/server/game/Movement/MotionMaster.cpp b/src/server/game/Movement/MotionMaster.cpp index f4190f2520c..3e775d238a4 100644 --- a/src/server/game/Movement/MotionMaster.cpp +++ b/src/server/game/Movement/MotionMaster.cpp @@ -43,10 +43,16 @@ MotionMaster::~MotionMaster() // clear ALL movement generators (including default) while (!empty()) { - MovementGenerator *curr = top(); + MovementGenerator* movement = top(); pop(); - if (curr && !IsStatic(curr)) - delete curr; // Skip finalizing on delete, it might launch new movement + if (movement && !IsStatic(movement)) + delete movement; + } + + while (!_expireList.empty()) + { + delete _expireList.back(); + _expireList.pop_back(); } } @@ -89,13 +95,15 @@ void MotionMaster::UpdateMotion(uint32 diff) ASSERT(!empty()); _cleanFlag |= MMCF_UPDATE; - bool isMoveGenUpdateSuccess = top()->Update(_owner, diff); - _cleanFlag &= ~MMCF_UPDATE; - - if (!isMoveGenUpdateSuccess) + if (!top()->Update(_owner, diff)) + { + _cleanFlag &= ~MMCF_UPDATE; MovementExpired(); + } + else + _cleanFlag &= ~MMCF_UPDATE; - if (_expireList) + if (!_expireList.empty()) ClearExpireList(); } @@ -115,14 +123,10 @@ void MotionMaster::Clear(bool reset /*= true*/) void MotionMaster::ClearExpireList() { - for (size_t i = 0; i < _expireList->size(); ++i) - { - MovementGenerator* mg = (*_expireList)[i]; - DirectDelete(mg); - } + for (auto itr : _expireList) + DirectDelete(itr); - delete _expireList; - _expireList = nullptr; + _expireList.clear(); if (empty()) Initialize(); @@ -159,7 +163,7 @@ MovementGeneratorType MotionMaster::GetCurrentMovementGeneratorType() const MovementGeneratorType MotionMaster::GetMotionSlotType(int slot) const { if (!_slot[slot]) - return NULL_MOTION_TYPE; + return MAX_MOTION_TYPE; else return _slot[slot]->GetMovementGeneratorType(); } @@ -429,7 +433,7 @@ void MotionMaster::MoveKnockbackFrom(float srcX, float srcY, float speedXY, floa float dist = 2 * moveTimeHalf * speedXY; float max_height = -Movement::computeFallElevation(moveTimeHalf, false, -speedZ); - _owner->GetNearPoint(_owner, x, y, z, _owner->GetObjectSize(), dist, _owner->GetAngle(srcX, srcY) + float(M_PI)); + _owner->GetNearPoint(_owner, x, y, z, _owner->GetCombatReach(), dist, _owner->GetAngle(srcX, srcY) + float(M_PI)); Movement::MoveSplineInit init(_owner); init.MoveTo(x, y, z); @@ -453,7 +457,7 @@ void MotionMaster::MoveJumpTo(float angle, float speedXY, float speedZ) float moveTimeHalf = speedZ / Movement::gravity; float dist = 2 * moveTimeHalf * speedXY; - _owner->GetClosePoint(x, y, z, _owner->GetObjectSize(), dist, angle); + _owner->GetClosePoint(x, y, z, _owner->GetCombatReach(), dist, angle); MoveJump(x, y, z, 0.0f, speedXY, speedZ); } @@ -835,7 +839,6 @@ void MotionMaster::DelayedDelete(MovementGenerator* curr) TC_LOG_FATAL("misc", "Unit (Entry %u) is trying to delete its updating Movement Generator (Type %u)!", _owner->GetEntry(), curr->GetMovementGeneratorType()); if (IsStatic(curr)) return; - if (!_expireList) - _expireList = new ExpireList(); - _expireList->push_back(curr); + + _expireList.push_back(curr); } |