aboutsummaryrefslogtreecommitdiffstatshomepage
path: root/OpenSim/Framework/AvatarAppearance.cs
diff options
context:
space:
mode:
Diffstat (limited to 'OpenSim/Framework/AvatarAppearance.cs')
-rw-r--r--OpenSim/Framework/AvatarAppearance.cs36
1 files changed, 33 insertions, 3 deletions
diff --git a/OpenSim/Framework/AvatarAppearance.cs b/OpenSim/Framework/AvatarAppearance.cs
index 0b0afeb..cce44b0 100644
--- a/OpenSim/Framework/AvatarAppearance.cs
+++ b/OpenSim/Framework/AvatarAppearance.cs
@@ -414,12 +414,16 @@ namespace OpenSim.Framework
414 414
415 internal void ReplaceAttachment(AvatarAttachment attach) 415 internal void ReplaceAttachment(AvatarAttachment attach)
416 { 416 {
417// m_log.DebugFormat(
418// "[AVATAR APPEARANCE]: Replacing itemID={0}, assetID={1} at {2}",
419// attach.ItemID, attach.AssetID, attach.AttachPoint);
420
417 m_attachments[attach.AttachPoint] = new List<AvatarAttachment>(); 421 m_attachments[attach.AttachPoint] = new List<AvatarAttachment>();
418 m_attachments[attach.AttachPoint].Add(attach); 422 m_attachments[attach.AttachPoint].Add(attach);
419 } 423 }
420 424
421 /// <summary> 425 /// <summary>
422 /// Add an attachment 426 /// Set an attachment
423 /// </summary> 427 /// </summary>
424 /// <remarks> 428 /// <remarks>
425 /// If the attachpoint has the 429 /// If the attachpoint has the
@@ -449,11 +453,20 @@ namespace OpenSim.Framework
449 m_attachments.Remove(attachpoint); 453 m_attachments.Remove(attachpoint);
450 return true; 454 return true;
451 } 455 }
456
452 return false; 457 return false;
453 } 458 }
454 459
455 // check if the item is already attached at this point 460 // When a user logs in, the attachment item ids are pulled from persistence in the Avatars table. However,
456 if (GetAttachpoint(item) == (attachpoint & 0x7F)) 461 // the asset ids are not saved. When the avatar enters a simulator the attachments are set again. If
462 // we simply perform an item check here then the asset ids (which are now present) are never set, and NPC attachments
463 // later fail unless the attachment is detached and reattached.
464 //
465 // Therefore, we will carry on with the set if the existing attachment has no asset id.
466 AvatarAttachment existingAttachment = GetAttachmentForItem(item);
467 if (existingAttachment != null
468 && existingAttachment.AssetID != UUID.Zero
469 && existingAttachment.AttachPoint == (attachpoint & 0x7F))
457 { 470 {
458 // m_log.DebugFormat("[AVATAR APPEARANCE] attempt to attach an already attached item {0}",item); 471 // m_log.DebugFormat("[AVATAR APPEARANCE] attempt to attach an already attached item {0}",item);
459 return false; 472 return false;
@@ -474,6 +487,23 @@ namespace OpenSim.Framework
474 return true; 487 return true;
475 } 488 }
476 489
490 /// <summary>
491 /// If the item is already attached, return it.
492 /// </summary>
493 /// <param name="itemID"></param>
494 /// <returns>Returns null if this item is not attached.</returns>
495 public AvatarAttachment GetAttachmentForItem(UUID itemID)
496 {
497 foreach (KeyValuePair<int, List<AvatarAttachment>> kvp in m_attachments)
498 {
499 int index = kvp.Value.FindIndex(delegate(AvatarAttachment a) { return a.ItemID == itemID; });
500 if (index >= 0)
501 return kvp.Value[index];
502 }
503
504 return null;
505 }
506
477 public int GetAttachpoint(UUID itemID) 507 public int GetAttachpoint(UUID itemID)
478 { 508 {
479 foreach (KeyValuePair<int, List<AvatarAttachment>> kvp in m_attachments) 509 foreach (KeyValuePair<int, List<AvatarAttachment>> kvp in m_attachments)