From 7d58b5fa157b4c3e842573d9fb02a9822034f4b0 Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Wed, 31 Aug 2011 17:53:58 +0100
Subject: move common code into AttachmentsModule.DeleteAttachmentsFromScene()

---
 .../CoreModules/Avatar/Attachments/AttachmentsModule.cs | 10 ++++++++++
 .../Framework/EntityTransfer/EntityTransferModule.cs    |  6 +-----
 .../Region/Framework/Interfaces/IAttachmentsModule.cs   |  9 +++++++++
 OpenSim/Region/Framework/Interfaces/IScenePresence.cs   | 17 +++++++++++++++--
 OpenSim/Region/Framework/Scenes/ScenePresence.cs        | 14 +-------------
 OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs   |  6 +-----
 6 files changed, 37 insertions(+), 25 deletions(-)

(limited to 'OpenSim/Region')

diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
index 9e5ce8f..587f35e 100644
--- a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
@@ -147,6 +147,16 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
                 }
             }
         }
+
+        public void DeleteAttachmentsFromScene(IScenePresence sp, bool silent)
+        {
+            foreach (SceneObjectGroup sop in sp.GetAttachments())
+            {
+                sop.Scene.DeleteSceneObject(sop, silent);
+            }
+
+            sp.ClearAttachments();
+        }
         
         /// <summary>
         /// Called by client
diff --git a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
index c24cc17..82bdf20 100644
--- a/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/EntityTransfer/EntityTransferModule.cs
@@ -559,11 +559,7 @@ namespace OpenSim.Region.CoreModules.Framework.EntityTransfer
 
         protected virtual void AgentHasMovedAway(ScenePresence sp, bool logout)
         {
-            foreach (SceneObjectGroup sop in sp.GetAttachments())
-            {
-                sop.Scene.DeleteSceneObject(sop, true);
-            }
-            sp.ClearAttachments();
+            sp.Scene.AttachmentsModule.DeleteAttachmentsFromScene(sp, true);
         }
 
         protected void KillEntity(Scene scene, uint localID)
diff --git a/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs b/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs
index ce795f1..dd11ded 100644
--- a/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs
+++ b/OpenSim/Region/Framework/Interfaces/IAttachmentsModule.cs
@@ -48,6 +48,15 @@ namespace OpenSim.Region.Framework.Interfaces
         void SaveChangedAttachments(IScenePresence sp);
 
         /// <summary>
+        /// Delete all the presence's attachments from the scene
+        /// </summary>
+        /// <param name="sp">
+        /// This is done when a root agent leaves/is demoted to child (for instance, on logout, teleport or region cross).
+        /// </param>
+        /// <param name="silent"></param>
+        void DeleteAttachmentsFromScene(IScenePresence sp, bool silent);
+
+        /// <summary>
         /// Attach an object to an avatar from the world.
         /// </summary>
         /// <param name="controllingClient"></param>
diff --git a/OpenSim/Region/Framework/Interfaces/IScenePresence.cs b/OpenSim/Region/Framework/Interfaces/IScenePresence.cs
index 788b36f..91e4bf2 100644
--- a/OpenSim/Region/Framework/Interfaces/IScenePresence.cs
+++ b/OpenSim/Region/Framework/Interfaces/IScenePresence.cs
@@ -62,9 +62,22 @@ namespace OpenSim.Region.Framework.Interfaces
         /// A copy of the list.
         /// </returns>
         /// <remarks>
-        ///  Do not change this list directly - use methods such as
-        /// AddAttachment() and RemoveAttachment().
+        ///  Do not change this list directly - use the attachments module.
         /// </remarks>
         List<SceneObjectGroup> GetAttachments();
+
+        /// <summary>
+        /// The scene objects attached to this avatar at a specific attachment point.
+        /// </summary>
+        /// <param name="attachmentPoint"></param>
+        /// <returns></returns>
+        List<SceneObjectGroup> GetAttachments(uint attachmentPoint);
+
+        bool HasAttachments();
+
+        // Don't use these methods directly.  Instead, use the AttachmentsModule
+        void AddAttachment(SceneObjectGroup gobj);
+        void RemoveAttachment(SceneObjectGroup gobj);
+        void ClearAttachments();
     }
 }
\ No newline at end of file
diff --git a/OpenSim/Region/Framework/Scenes/ScenePresence.cs b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
index 5e96b0a..0d284a5 100644
--- a/OpenSim/Region/Framework/Scenes/ScenePresence.cs
+++ b/OpenSim/Region/Framework/Scenes/ScenePresence.cs
@@ -3401,19 +3401,7 @@ namespace OpenSim.Region.Framework.Scenes
 
         public void Close()
         {
-            lock (m_attachments)
-            {
-                // Delete attachments from scene
-                // Don't try to save, as this thread won't live long
-                // enough to complete the save. This would cause no copy
-                // attachments to poof!
-                //
-                foreach (SceneObjectGroup grp in m_attachments)
-                {
-                    m_scene.DeleteSceneObject(grp, false);
-                }
-                m_attachments.Clear();
-            }
+            m_scene.AttachmentsModule.DeleteAttachmentsFromScene(this, false);
             
             lock (m_knownChildRegions)
             {
diff --git a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs
index e58dca2..2fdeeab 100644
--- a/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs
+++ b/OpenSim/Region/OptionalModules/World/NPC/NPCModule.cs
@@ -143,11 +143,7 @@ namespace OpenSim.Region.OptionalModules.World.NPC
                 if (!m_avatars.ContainsKey(agentId))
                     return false;
 
-            // FIXME: An extremely bad bit of code that reaches directly into the attachments list and manipulates it
-            foreach (SceneObjectGroup att in sp.GetAttachments())
-                scene.DeleteSceneObject(att, false);
-
-            sp.ClearAttachments();
+            scene.AttachmentsModule.DeleteAttachmentsFromScene(sp, false);
 
             AvatarAppearance npcAppearance = new AvatarAppearance(appearance, true);
             sp.Appearance = npcAppearance;
-- 
cgit v1.1