From 264f4f07cde42d2df7c6f7c2b3cec429f0595a5c Mon Sep 17 00:00:00 2001
From: Melanie Thielker
Date: Wed, 14 Jul 2010 20:46:26 +0200
Subject: Detach attachments displaced by other attachments

---
 .../Avatar/Attachments/AttachmentsModule.cs        | 24 +++++++++++++++++-----
 1 file changed, 19 insertions(+), 5 deletions(-)

(limited to 'OpenSim')

diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
index 527934d..ff3036a 100644
--- a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
@@ -140,19 +140,33 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
                 group.SetAttachmentPoint((byte)AttachmentPt);
                 group.AbsolutePosition = attachPos;
 
-                // Saves and gets itemID
-                UUID itemId;
+                // Remove any previous attachments
+                ScenePresence sp = m_scene.GetScenePresence(remoteClient.AgentId);
+                UUID itemID = UUID.Zero;
+                if (sp != null)
+                {
+                    foreach(SceneObjectGroup grp in sp.Attachments)
+                    {
+                        if (grp.GetAttachmentPoint() == (byte)AttachmentPt)
+                        {
+                            itemID = grp.GetFromItemID();
+                            break;
+                        }
+                    }
+                    if (itemID != UUID.Zero)
+                        DetachSingleAttachmentToInv(itemID, remoteClient);
+                }
 
                 if (group.GetFromItemID() == UUID.Zero)
                 {
-                    m_scene.attachObjectAssetStore(remoteClient, group, remoteClient.AgentId, out itemId);
+                    m_scene.attachObjectAssetStore(remoteClient, group, remoteClient.AgentId, out itemID);
                 }
                 else
                 {
-                    itemId = group.GetFromItemID();
+                    itemID = group.GetFromItemID();
                 }
 
-                SetAttachmentInventoryStatus(remoteClient, AttachmentPt, itemId, group);
+                SetAttachmentInventoryStatus(remoteClient, AttachmentPt, itemID, group);
 
                 group.AttachToAgent(remoteClient.AgentId, AttachmentPt, attachPos, silent);
                 
-- 
cgit v1.1