From 72301bf02f4b8d9569139e7bfcc23df9a46f2479 Mon Sep 17 00:00:00 2001 From: ccrs Date: Tue, 16 Apr 2019 23:29:04 +0200 Subject: Core/Movement: implement and use new remove method in MotionMaster All erases within MotionMaster are now done by itr. Previous impl used value erase which uses the custom comparator which does not identify elements uniquely --> wrong values were deleted ref #23187#discussion_r275791179 (cherry picked from commit 11de6b5f866e087307a719b931be8c51b984c54e) --- src/server/game/Movement/MotionMaster.cpp | 42 +++++++++++-------------------- 1 file changed, 15 insertions(+), 27 deletions(-) (limited to 'src/server/game/Movement/MotionMaster.cpp') diff --git a/src/server/game/Movement/MotionMaster.cpp b/src/server/game/Movement/MotionMaster.cpp index 2114b94f6a4..9f36af744b1 100644 --- a/src/server/game/Movement/MotionMaster.cpp +++ b/src/server/game/Movement/MotionMaster.cpp @@ -363,12 +363,7 @@ void MotionMaster::Remove(MovementGenerator* movement, MovementSlot slot/* = MOT { auto itr = _generators.find(movement); if (itr != _generators.end()) - { - MovementGenerator* pointer = *itr; - bool const top = GetCurrentMovementGenerator() == pointer; - _generators.erase(pointer); - Delete(pointer, top, false); - } + Remove(itr, GetCurrentMovementGenerator() == *itr, false); } break; default: @@ -409,12 +404,7 @@ void MotionMaster::Remove(MovementGeneratorType type, MovementSlot slot/* = MOTI }); if (itr != _generators.end()) - { - MovementGenerator* pointer = *itr; - bool const top = GetCurrentMovementGenerator() == pointer; - _generators.erase(pointer); - Delete(pointer, top, false); - } + Remove(itr, GetCurrentMovementGenerator() == *itr, false); } break; default: @@ -1079,13 +1069,18 @@ void MotionMaster::LaunchMoveSpline(Movement::MoveSplineInit&& init, uint32 id/* /******************** Private methods ********************/ -void MotionMaster::Pop(bool active, bool movementInform) +void MotionMaster::Remove(MotionMasterContainer::iterator iterator, bool active, bool movementInform) { - MovementGenerator* pointer = *_generators.begin(); - _generators.erase(pointer); + MovementGenerator* pointer = *iterator; + _generators.erase(iterator); Delete(pointer, active, movementInform); } +void MotionMaster::Pop(bool active, bool movementInform) +{ + Remove(_generators.begin(), active, movementInform); +} + void MotionMaster::DirectInitialize() { // Clear ALL movement generators (including default) @@ -1180,14 +1175,11 @@ void MotionMaster::DirectAdd(MovementGenerator* movement, MovementSlot slot/* = { if (movement->Priority >= (*_generators.begin())->Priority) { - MovementGenerator* pointer = *_generators.begin(); - if (movement->Priority == pointer->Priority) - { - _generators.erase(pointer); - Delete(pointer, true, false); - } + auto itr = _generators.begin(); + if (movement->Priority == (*itr)->Priority) + Remove(itr, true, false); else - pointer->Deactivate(_owner); + (*itr)->Deactivate(_owner); } else { @@ -1197,11 +1189,7 @@ void MotionMaster::DirectAdd(MovementGenerator* movement, MovementSlot slot/* = }); if (itr != _generators.end()) - { - MovementGenerator* pointer = *itr; - _generators.erase(pointer); - Delete(pointer, false, false); - } + Remove(itr, false, false); } } else -- cgit v1.2.3