diff --git a/apps/openmw/mwmechanics/aisequence.cpp b/apps/openmw/mwmechanics/aisequence.cpp index 980a23a3ed..6d2c15549f 100644 --- a/apps/openmw/mwmechanics/aisequence.cpp +++ b/apps/openmw/mwmechanics/aisequence.cpp @@ -137,7 +137,7 @@ void AiSequence::execute (const MWWorld::Ptr& actor,float duration) float nearestDist = std::numeric_limits::max(); Ogre::Vector3 vActorPos = Ogre::Vector3(actor.getRefData().getPosition().pos); - for(std::list::iterator it = mPackages.begin(); it != mPackages.end(); ++it) + for(std::list::iterator it = mPackages.begin(); it != mPackages.end();) { if ((*it)->getTypeId() != AiPackage::TypeIdCombat) break; @@ -147,7 +147,7 @@ void AiSequence::execute (const MWWorld::Ptr& actor,float duration) if (target.isEmpty()) { delete *it; - mPackages.erase(it++); + it = mPackages.erase(it); } else { @@ -159,20 +159,26 @@ void AiSequence::execute (const MWWorld::Ptr& actor,float duration) nearestDist = distTo; itActualCombat = it; } + ++it; } } - // all targets disappeared - if (nearestDist == std::numeric_limits::max()) + if (!mPackages.empty()) + { + if (nearestDist < std::numeric_limits::max() && mPackages.begin() != itActualCombat) + { + // move combat package with nearest target to the front + mPackages.splice(mPackages.begin(), mPackages, itActualCombat); + } + + package = mPackages.front(); + mLastAiPackage = package->getTypeId(); + } + else { mDone = true; return; } - else if (mPackages.begin() != itActualCombat) - { - // move combat package with nearest target to the front - mPackages.splice(mPackages.begin(), mPackages, itActualCombat); - } } if (package->execute (actor,duration))