From 3efdccbb12fc2d5339870ade39e1b1d54da4fe9b Mon Sep 17 00:00:00 2001 From: Melanie Thielker Date: Wed, 26 Nov 2008 07:34:38 +0000 Subject: Committing the LCO database layer. Native MySQL, no ADO. New reconnect mechanism to prevent prim loss. Preserve link order on sim restart and drag copy. Fix drag-copied prims' inventories. Fix persistence of child prim inventories. --- .../Region/Environment/Scenes/SceneObjectGroup.cs | 20 ++++++++++++++++---- OpenSim/Region/Environment/Scenes/SceneObjectPart.cs | 10 +++++++++- .../Environment/Scenes/SceneObjectPartInventory.cs | 8 ++++++-- 3 files changed, 31 insertions(+), 7 deletions(-) (limited to 'OpenSim/Region/Environment/Scenes') diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs index 9839126..7bdcb5c 100644 --- a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs +++ b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs @@ -1336,6 +1336,8 @@ namespace OpenSim.Region.Environment.Scenes dupe.CopyRootPart(m_rootPart, OwnerID, GroupID, userExposed); + dupe.m_rootPart.LinkNum = m_rootPart.LinkNum; + if (userExposed) dupe.m_rootPart.TrimPermissions(); @@ -1368,16 +1370,25 @@ namespace OpenSim.Region.Environment.Scenes } List partList = new List(m_parts.Values); + partList.Sort(delegate(SceneObjectPart p1, SceneObjectPart p2) + { + return p1.LinkNum.CompareTo(p2.LinkNum); + } + ); + foreach (SceneObjectPart part in partList) { if (part.UUID != m_rootPart.UUID) { - dupe.CopyPart(part, OwnerID, GroupID, userExposed); + SceneObjectPart newPart = + dupe.CopyPart(part, OwnerID, GroupID, userExposed); + + newPart.LinkNum = part.LinkNum; if (userExposed) { - SetPartOwner(part, cAgentID, cGroupID); - part.ScheduleFullUpdate(); + SetPartOwner(newPart, cAgentID, cGroupID); + newPart.ScheduleFullUpdate(); } } } @@ -1507,7 +1518,7 @@ namespace OpenSim.Region.Environment.Scenes /// /// /// - public void CopyPart(SceneObjectPart part, UUID cAgentID, UUID cGroupID, bool userExposed) + public SceneObjectPart CopyPart(SceneObjectPart part, UUID cAgentID, UUID cGroupID, bool userExposed) { SceneObjectPart newPart = part.Copy(m_scene.AllocateLocalId(), OwnerID, GroupID, m_parts.Count, userExposed); newPart.SetParent(this); @@ -1519,6 +1530,7 @@ namespace OpenSim.Region.Environment.Scenes SetPartAsNonRoot(newPart); + return newPart; } /// diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs index e97b99f..5b494d3 100644 --- a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs +++ b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs @@ -1263,10 +1263,18 @@ if (m_shape != null) { dupe._category = _category; dupe.m_rezzed = m_rezzed; - dupe.m_inventory.Items = (TaskInventoryDictionary)dupe.m_inventory.Items.Clone(); + dupe.m_inventory = new SceneObjectPartInventory(dupe); + dupe.m_inventory.Items = (TaskInventoryDictionary)m_inventory.Items.Clone(); if (userExposed) + { dupe.ResetIDs(linkNum); + dupe.m_inventory.HasInventoryChanged = true; + } + else + { + dupe.m_inventory.HasInventoryChanged = m_inventory.HasInventoryChanged; + } // Move afterwards ResetIDs as it clears the localID dupe.LocalId = localID; diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Environment/Scenes/SceneObjectPartInventory.cs index ae43c5e..3f94a7e 100644 --- a/OpenSim/Region/Environment/Scenes/SceneObjectPartInventory.cs +++ b/OpenSim/Region/Environment/Scenes/SceneObjectPartInventory.cs @@ -64,7 +64,7 @@ namespace OpenSim.Region.Environment.Scenes /// /// Tracks whether inventory has changed since the last persistent backup /// - protected bool HasInventoryChanged; + internal bool HasInventoryChanged; /// /// Inventory serial number @@ -81,7 +81,11 @@ namespace OpenSim.Region.Environment.Scenes protected internal TaskInventoryDictionary Items { get { return m_items; } - set { m_items = value; } + set + { + m_items = value; + m_inventorySerial++; + } } /// -- cgit v1.1