diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
index 2c49ba89fc..732e3e3cef 100644
--- a/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Attachments/AttachmentsModule.cs
@@ -502,17 +502,28 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments
if (group.GetFromItemID() == itemID)
{
m_scene.EventManager.TriggerOnAttach(group.LocalId, itemID, UUID.Zero);
- group.DetachToInventoryPrep();
-// m_log.Debug("[ATTACHMENTS MODULE]: Saving attachpoint: " + ((uint)group.GetAttachmentPoint()).ToString());
+ sp.RemoveAttachment(group);
- // If an item contains scripts, it's always changed.
- // This ensures script state is saved on detach
- foreach (SceneObjectPart p in group.Parts)
- if (p.Inventory.ContainsScripts())
- group.HasGroupChanged = true;
+ // Prepare sog for storage
+ group.ForEachPart(
+ delegate(SceneObjectPart part)
+ {
+ part.AttachedAvatar = UUID.Zero;
+
+ // If there are any scripts,
+ // then always trigger a new object and state persistence in UpdateKnownItem()
+ if (part.Inventory.ContainsScripts())
+ group.HasGroupChanged = true;
+ }
+ );
+
+ group.RootPart.SetParentLocalId(0);
+ group.RootPart.IsAttachment = false;
+ group.AbsolutePosition = group.RootPart.AttachedPos;
UpdateKnownItem(sp.ControllingClient, group, group.GetFromItemID(), group.OwnerID);
m_scene.DeleteSceneObject(group, false);
+
return;
}
}
diff --git a/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs b/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs
index 859f6ffdb8..afcf05a8e1 100644
--- a/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs
+++ b/OpenSim/Region/CoreModules/Avatar/Attachments/Tests/AttachmentsModuleTests.cs
@@ -147,7 +147,7 @@ namespace OpenSim.Region.CoreModules.Avatar.Attachments.Tests
}
[Test]
- public void TestRemoveAttachment()
+ public void TestDetachAttachmentToInventory()
{
TestHelpers.InMethod();
// log4net.Config.XmlConfigurator.Configure();
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
index 8f0fa556aa..00e3363a0a 100644
--- a/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneObjectGroup.cs
@@ -147,15 +147,16 @@ namespace OpenSim.Region.Framework.Scenes
return false;
}
- ///
+ ///
/// Is this scene object acting as an attachment?
- ///
+ ///
+ ///
/// We return false if the group has already been deleted.
///
/// TODO: At the moment set must be done on the part itself. There may be a case for doing it here since I
/// presume either all or no parts in a linkset can be part of an attachment (in which
/// case the value would get proprogated down into all the descendent parts).
- ///
+ ///
public bool IsAttachment
{
get
@@ -1017,31 +1018,6 @@ namespace OpenSim.Region.Framework.Scenes
m_rootPart.ClearUndoState();
}
- public void DetachToInventoryPrep()
- {
- ScenePresence avatar = m_scene.GetScenePresence(m_rootPart.AttachedAvatar);
- //Vector3 detachedpos = new Vector3(127f, 127f, 127f);
- if (avatar != null)
- {
- //detachedpos = avatar.AbsolutePosition;
- avatar.RemoveAttachment(this);
- }
-
- m_rootPart.AttachedAvatar = UUID.Zero;
-
- SceneObjectPart[] parts = m_parts.GetArray();
- for (int i = 0; i < parts.Length; i++)
- parts[i].AttachedAvatar = UUID.Zero;
-
- m_rootPart.SetParentLocalId(0);
- //m_rootPart.SetAttachmentPoint((byte)0);
- m_rootPart.IsAttachment = false;
- AbsolutePosition = m_rootPart.AttachedPos;
- //m_rootPart.ApplyPhysics(m_rootPart.GetEffectiveObjectFlags(), m_scene.m_physicalPrim);
- //AttachToBackup();
- //m_rootPart.ScheduleFullUpdate();
- }
-
///
///
///