aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Framework/AvatarAppearance.cs
diff options
context:
space:
mode:
authorJustin Clark-Casey (justincc)2013-03-19 21:44:18 +0000
committerJustin Clark-Casey (justincc)2013-03-19 21:49:29 +0000
commit364816421985c052521cf7b444e124760c0a1025 (patch)
treeb6e51feda080bd3e131fabfc990e6533bb7cd83c /OpenSim/Framework/AvatarAppearance.cs
parentFor the moment, disable the output of the 'scene' statistics in SimExtraStats... (diff)
downloadopensim-SC-364816421985c052521cf7b444e124760c0a1025.zip
opensim-SC-364816421985c052521cf7b444e124760c0a1025.tar.gz
opensim-SC-364816421985c052521cf7b444e124760c0a1025.tar.bz2
opensim-SC-364816421985c052521cf7b444e124760c0a1025.tar.xz
Prevent multiple instances of the same item ID being appended to an AvatarAppearance
It looks like this was happening when AttachmentsModule.RezAttachments was doing a secondary set of each attachment to update with the asset ID (initially they only have the inventory ID). However, with multi-attach this was appending a second copy of the same attachment rather than updating the data that was already there. This commit requires both simulator and service to be updated.
Diffstat (limited to '')
-rw-r--r--OpenSim/Framework/AvatarAppearance.cs78
1 files changed, 48 insertions, 30 deletions
diff --git a/OpenSim/Framework/AvatarAppearance.cs b/OpenSim/Framework/AvatarAppearance.cs
index 95e9667..494ae5e 100644
--- a/OpenSim/Framework/AvatarAppearance.cs
+++ b/OpenSim/Framework/AvatarAppearance.cs
@@ -459,45 +459,59 @@ namespace OpenSim.Framework
459 if (attachpoint == 0) 459 if (attachpoint == 0)
460 return false; 460 return false;
461 461
462 if (item == UUID.Zero) 462 lock (m_attachments)
463 { 463 {
464 lock (m_attachments) 464 if (item == UUID.Zero)
465 { 465 {
466 if (m_attachments.ContainsKey(attachpoint)) 466 if (m_attachments.ContainsKey(attachpoint))
467 { 467 {
468 m_attachments.Remove(attachpoint); 468 m_attachments.Remove(attachpoint);
469 return true; 469 return true;
470 } 470 }
471
472 return false;
471 } 473 }
472
473 return false;
474 }
475 474
476 // When a user logs in, the attachment item ids are pulled from persistence in the Avatars table. However, 475 // When a user logs in, the attachment item ids are pulled from persistence in the Avatars table. However,
477 // the asset ids are not saved. When the avatar enters a simulator the attachments are set again. If 476 // the asset ids are not saved. When the avatar enters a simulator the attachments are set again. If
478 // we simply perform an item check here then the asset ids (which are now present) are never set, and NPC attachments 477 // we simply perform an item check here then the asset ids (which are now present) are never set, and NPC attachments
479 // later fail unless the attachment is detached and reattached. 478 // later fail unless the attachment is detached and reattached.
480 // 479 //
481 // Therefore, we will carry on with the set if the existing attachment has no asset id. 480 // Therefore, we will carry on with the set if the existing attachment has no asset id.
482 AvatarAttachment existingAttachment = GetAttachmentForItem(item); 481 AvatarAttachment existingAttachment = GetAttachmentForItem(item);
483 if (existingAttachment != null 482 if (existingAttachment != null)
484 && existingAttachment.AssetID != UUID.Zero 483 {
485 && existingAttachment.AttachPoint == (attachpoint & 0x7F)) 484// m_log.DebugFormat(
486 { 485// "[AVATAR APPEARANCE]: Found existing attachment for {0}, asset {1} at point {2}",
487 // m_log.DebugFormat("[AVATAR APPEARANCE] attempt to attach an already attached item {0}",item); 486// existingAttachment.ItemID, existingAttachment.AssetID, existingAttachment.AttachPoint);
488 return false; 487
489 } 488 if (existingAttachment.AssetID != UUID.Zero && existingAttachment.AttachPoint == (attachpoint & 0x7F))
490 489 {
491 // check if this is an append or a replace, 0x80 marks it as an append 490 m_log.DebugFormat(
492 if ((attachpoint & 0x80) > 0) 491 "[AVATAR APPEARANCE]: Ignoring attempt to attach an already attached item {0} at point {1}",
493 { 492 item, attachpoint);
494 // strip the append bit 493
495 int point = attachpoint & 0x7F; 494 return false;
496 AppendAttachment(new AvatarAttachment(point, item, asset)); 495 }
497 } 496 else
498 else 497 {
499 { 498 // Remove it here so that the later append does not add a second attachment but we still update
500 ReplaceAttachment(new AvatarAttachment(attachpoint,item, asset)); 499 // the assetID
500 DetachAttachment(existingAttachment.ItemID);
501 }
502 }
503
504 // check if this is an append or a replace, 0x80 marks it as an append
505 if ((attachpoint & 0x80) > 0)
506 {
507 // strip the append bit
508 int point = attachpoint & 0x7F;
509 AppendAttachment(new AvatarAttachment(point, item, asset));
510 }
511 else
512 {
513 ReplaceAttachment(new AvatarAttachment(attachpoint,item, asset));
514 }
501 } 515 }
502 516
503 return true; 517 return true;
@@ -547,6 +561,10 @@ namespace OpenSim.Framework
547 int index = kvp.Value.FindIndex(delegate(AvatarAttachment a) { return a.ItemID == itemID; }); 561 int index = kvp.Value.FindIndex(delegate(AvatarAttachment a) { return a.ItemID == itemID; });
548 if (index >= 0) 562 if (index >= 0)
549 { 563 {
564// m_log.DebugFormat(
565// "[AVATAR APPEARANCE]: Detaching attachment {0}, index {1}, point {2}",
566// m_attachments[kvp.Key][index].ItemID, index, m_attachments[kvp.Key][index].AttachPoint);
567
550 // Remove it from the list of attachments at that attach point 568 // Remove it from the list of attachments at that attach point
551 m_attachments[kvp.Key].RemoveAt(index); 569 m_attachments[kvp.Key].RemoveAt(index);
552 570