diff --git a/OpenSim/Region/CoreModules/World/Land/Tests/PrimCountModuleTests.cs b/OpenSim/Region/CoreModules/World/Land/Tests/PrimCountModuleTests.cs
index 80b28598ab..dd55f980b8 100644
--- a/OpenSim/Region/CoreModules/World/Land/Tests/PrimCountModuleTests.cs
+++ b/OpenSim/Region/CoreModules/World/Land/Tests/PrimCountModuleTests.cs
@@ -104,6 +104,29 @@ namespace OpenSim.Region.CoreModules.World.Land.Tests
Assert.That(pc.Simulator, Is.EqualTo(5));
}
+ ///
+ /// Test count after a parcel owner owned copied object is added.
+ ///
+ [Test]
+ public void TestCopiedOwnerObject()
+ {
+ TestHelper.InMethod();
+// log4net.Config.XmlConfigurator.Configure();
+
+ IPrimCounts pc = m_lo.PrimCounts;
+
+ SceneObjectGroup sog = SceneSetupHelpers.CreateSceneObject(3, m_userId, 0x01);
+ m_scene.AddNewSceneObject(sog, false);
+ m_scene.SceneGraph.DuplicateObject(sog.LocalId, Vector3.Zero, 0, m_userId, UUID.Zero, Quaternion.Identity);
+
+ Assert.That(pc.Owner, Is.EqualTo(6));
+ Assert.That(pc.Group, Is.EqualTo(0));
+ Assert.That(pc.Others, Is.EqualTo(0));
+ Assert.That(pc.Users[m_userId], Is.EqualTo(6));
+ Assert.That(pc.Users[m_dummyUserId], Is.EqualTo(0));
+ Assert.That(pc.Simulator, Is.EqualTo(6));
+ }
+
///
/// Test count after a parcel owner owned object is removed.
///
diff --git a/OpenSim/Region/Framework/Scenes/SceneGraph.cs b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
index 1621398bcb..60855b2c36 100644
--- a/OpenSim/Region/Framework/Scenes/SceneGraph.cs
+++ b/OpenSim/Region/Framework/Scenes/SceneGraph.cs
@@ -363,6 +363,10 @@ namespace OpenSim.Region.Framework.Scenes
if (Entities.ContainsKey(sceneObject.UUID))
return false;
+
+// m_log.DebugFormat(
+// "[SCENEGRAPH]: Adding scene object {0} {1}, with {2} parts on {3}",
+// sceneObject.Name, sceneObject.UUID, sceneObject.Parts.Length, m_parentScene.RegionInfo.RegionName);
SceneObjectPart[] children = sceneObject.Parts;
@@ -1798,7 +1802,10 @@ namespace OpenSim.Region.Framework.Scenes
///
public SceneObjectGroup DuplicateObject(uint originalPrimID, Vector3 offset, uint flags, UUID AgentID, UUID GroupID, Quaternion rot)
{
- //m_log.DebugFormat("[SCENE]: Duplication of object {0} at offset {1} requested by agent {2}", originalPrim, offset, AgentID);
+// m_log.DebugFormat(
+// "[SCENE]: Duplication of object {0} at offset {1} requested by agent {2}",
+// originalPrimID, offset, AgentID);
+
SceneObjectGroup original = GetGroupByPrim(originalPrimID);
if (original != null)
{
@@ -1829,7 +1836,28 @@ namespace OpenSim.Region.Framework.Scenes
copy.RootPart.SalePrice = 10;
}
+ // FIXME: This section needs to be refactored so that it just calls AddSceneObject()
Entities.Add(copy);
+
+ lock (SceneObjectGroupsByFullID)
+ SceneObjectGroupsByFullID[copy.UUID] = copy;
+
+ SceneObjectPart[] children = copy.Parts;
+
+ lock (SceneObjectGroupsByFullPartID)
+ {
+ SceneObjectGroupsByFullPartID[copy.UUID] = copy;
+ foreach (SceneObjectPart part in children)
+ SceneObjectGroupsByFullPartID[part.UUID] = copy;
+ }
+
+ lock (SceneObjectGroupsByLocalPartID)
+ {
+ SceneObjectGroupsByLocalPartID[copy.LocalId] = copy;
+ foreach (SceneObjectPart part in children)
+ SceneObjectGroupsByLocalPartID[copy.LocalId] = copy;
+ }
+ // PROBABLE END OF FIXME
// Since we copy from a source group that is in selected
// state, but the copy is shown deselected in the viewer,