diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs index b2e5dc36e3..743fd50ecb 100644 --- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs +++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs @@ -1661,6 +1661,13 @@ namespace OpenSim.Region.Framework.Scenes /// protected internal void LinkObjects(SceneObjectPart root, List children) { + SceneObjectGroup parentGroup = root.ParentGroup; + if (parentGroup == null) return; + + // Cowardly refuse to link to a group owned root + if (parentGroup.OwnerID == parentGroup.GroupID) + return; + Monitor.Enter(m_updateLock); try { @@ -1683,11 +1690,14 @@ namespace OpenSim.Region.Framework.Scenes foreach (SceneObjectGroup child in childGroups) { - parentGroup.LinkToGroup(child); + if (parentGroup.OwnerID == child.OwnerID) + { + parentGroup.LinkToGroup(child); - // this is here so physics gets updated! - // Don't remove! Bad juju! Stay away! or fix physics! - child.AbsolutePosition = child.AbsolutePosition; + // this is here so physics gets updated! + // Don't remove! Bad juju! Stay away! or fix physics! + child.AbsolutePosition = child.AbsolutePosition; + } } // We need to explicitly resend the newly link prim's object properties since no other actions @@ -1725,9 +1735,14 @@ namespace OpenSim.Region.Framework.Scenes if (part.ParentGroup.PrimCount != 1) // Skip single { if (part.LinkNum < 2) // Root + { rootParts.Add(part); + } else + { + part.LastOwnerID = part.ParentGroup.RootPart.LastOwnerID; childParts.Add(part); + } SceneObjectGroup group = part.ParentGroup; if (!affectedGroups.Contains(group))