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))