From e62b3dba8a1b8c816d6b09dc1f14b915f1560afe Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Tue, 14 Dec 2010 00:11:41 +0000
Subject: reinstate IAttachmentsModule.UpdateAttachmentPosition() since this is
 being used by a 3rd party region module and contains non-obvious attachment
 specific code

There are no functional changes.  UpdateAttachmentPosition() is adapted to the new approach of only saving attachment state on logout
---
 .../CoreModules/Avatar/Attachments/AttachmentsModule.cs  | 16 ++++++++++++++++
 .../Region/Framework/Interfaces/IAttachmentsModule.cs    | 15 +++++++++------
 OpenSim/Region/Framework/Scenes/SceneGraph.cs            |  9 ++-------
 3 files changed, 27 insertions(+), 13 deletions(-)

(limited to 'OpenSim')

diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
index 1f49a01..360a014 100644
--- a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
@@ -484,6 +484,22 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
             }
         }
         
+        public void UpdateAttachmentPosition(SceneObjectGroup sog, Vector3 pos)
+        {
+            // First we save the
+            // attachment point information, then we update the relative 
+            // positioning. Then we have to mark the object as NOT an
+            // attachment. This is necessary in order to correctly save
+            // and retrieve GroupPosition information for the attachment.
+            // Finally, we restore the object's attachment status.
+            byte attachmentPoint = sog.GetAttachmentPoint();
+            sog.UpdateGroupPosition(pos);
+            sog.RootPart.IsAttachment = false;
+            sog.AbsolutePosition = sog.RootPart.AttachedPos;
+            sog.SetAttachmentPoint(attachmentPoint);                                       
+            sog.HasGroupChanged = true;            
+        }
+        
         /// <summary>
         /// Update the attachment asset for the new sog details if they have changed.
         /// </summary>
diff --git a/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs b/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs
index b3576c5..6cc64c6 100644
--- a/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs
+++ b/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs
@@ -113,15 +113,18 @@ namespace OpenSim.Region.Framework.Interfaces
         /// <summary>
         /// Update the user inventory to show a detach.
         /// </summary>
-        /// <param name="itemID">
-        /// A <see cref="UUID"/>
-        /// </param>
-        /// <param name="remoteClient">
-        /// A <see cref="IClientAPI"/>
-        /// </param>
+        /// <param name="itemID">/param>
+        /// <param name="remoteClient"></param>
         void ShowDetachInUserInventory(UUID itemID, IClientAPI remoteClient);
         
         /// <summary>
+        /// Update the position of an attachment.
+        /// </summary>
+        /// <param name="sog"></param>
+        /// <param name="pos"></param>
+        void UpdateAttachmentPosition(SceneObjectGroup sog, Vector3 pos);
+        
+        /// <summary>
         /// Update the user inventory with a changed attachment
         /// </summary>
         /// <param name="remoteClient">
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
index 78e5da3..a2ed54f 100644
--- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
@@ -1281,13 +1281,8 @@ namespace OpenSim.Region.Framework.Scenes
             {
                 if (group.IsAttachment || (group.RootPart.Shape.PCode == 9 && group.RootPart.Shape.State != 0))
                 {
-                    // Set the new attachment point data in the object
-                    byte attachmentPoint = group.GetAttachmentPoint();
-                    group.UpdateGroupPosition(pos);
-                    group.RootPart.IsAttachment = false;
-                    group.AbsolutePosition = group.RootPart.AttachedPos;
-                    group.SetAttachmentPoint(attachmentPoint);
-                    group.HasGroupChanged = true;
+                    if (m_parentScene.AttachmentsModule != null)
+                        m_parentScene.AttachmentsModule.UpdateAttachmentPosition(group, pos);
                 }
                 else
                 {
-- 
cgit v1.1