Fix BUG-225288: Detaching stops unrelated animations

This is to do with misunderstandings related to how .find()
works with multimaps. .find() will, in fact, return an iterator
to the first iterator it finds, and will iterate through all
elements in the multimap when incremented, not just items with
the same key.

Change code working with animation sources to be aware of this
fact, so unrelated animation sources do not have their animations
stopped.
meow-7.2.2
Salad Dais 2023-11-09 15:41:08 +00:00 committed by Andrey Lihatskiy
parent 4d4abdd769
commit dd694f0add
2 changed files with 11 additions and 1 deletions

View File

@ -4152,6 +4152,12 @@ void process_avatar_animation(LLMessageSystem *mesgsys, void **user_data)
LLVOAvatar::AnimSourceIterator anim_it = avatarp->mAnimationSources.find(object_id);
for (;anim_it != avatarp->mAnimationSources.end(); ++anim_it)
{
if (anim_it->first != object_id)
{
// elements with the same key are always contiguous, bail if we went past the
// end of this object's animations
break;
}
if (anim_it->second == animation_id)
{
anim_found = TRUE;

View File

@ -834,7 +834,11 @@ void LLVOAvatarSelf::stopMotionFromSource(const LLUUID& source_id)
for (AnimSourceIterator motion_it = mAnimationSources.find(source_id); motion_it != mAnimationSources.end(); )
{
gAgent.sendAnimationRequest(motion_it->second, ANIM_REQUEST_STOP);
mAnimationSources.erase(motion_it++);
mAnimationSources.erase(motion_it);
// Must find() after each erase() to deal with potential iterator invalidation
// This also ensures that we don't go past the end of this source's animations
// into those of another source.
motion_it = mAnimationSources.find(source_id);
}