diff options
author | Justin Clark-Casey (justincc) | 2013-03-19 21:44:18 +0000 |
---|---|---|
committer | Justin Clark-Casey (justincc) | 2013-03-19 21:49:29 +0000 |
commit | 364816421985c052521cf7b444e124760c0a1025 (patch) | |
tree | b6e51feda080bd3e131fabfc990e6533bb7cd83c /OpenSim/Framework/AvatarAppearance.cs | |
parent | For the moment, disable the output of the 'scene' statistics in SimExtraStats... (diff) | |
download | opensim-SC_OLD-364816421985c052521cf7b444e124760c0a1025.zip opensim-SC_OLD-364816421985c052521cf7b444e124760c0a1025.tar.gz opensim-SC_OLD-364816421985c052521cf7b444e124760c0a1025.tar.bz2 opensim-SC_OLD-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 'OpenSim/Framework/AvatarAppearance.cs')
-rw-r--r-- | OpenSim/Framework/AvatarAppearance.cs | 78 |
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 | ||