From b33da2538ed728bdc97cca20ada36913097160b0 Mon Sep 17 00:00:00 2001
From: Justin Clarke Casey
Date: Wed, 16 Jan 2008 20:27:12 +0000
Subject: * Fix mantis 345 - it is now possible to duplicate prims directly in
the region again without breakage * This includes their inventories * Also,
this revision properly synchronizes prim inventory crud.
---
OpenSim/Region/Environment/Scenes/InnerScene.cs | 7 +-
.../Region/Environment/Scenes/SceneObjectGroup.cs | 6 +-
.../Scenes/SceneObjectPart.Inventory.cs | 209 ++++++++++++---------
.../Region/Environment/Scenes/SceneObjectPart.cs | 8 +-
4 files changed, 133 insertions(+), 97 deletions(-)
(limited to 'OpenSim/Region/Environment/Scenes')
diff --git a/OpenSim/Region/Environment/Scenes/InnerScene.cs b/OpenSim/Region/Environment/Scenes/InnerScene.cs
index 0116428..9aa3f20 100644
--- a/OpenSim/Region/Environment/Scenes/InnerScene.cs
+++ b/OpenSim/Region/Environment/Scenes/InnerScene.cs
@@ -928,17 +928,22 @@ namespace OpenSim.Region.Environment.Scenes
{
SceneObjectGroup copy = originPrim.Copy(AgentID, GroupID);
copy.AbsolutePosition = copy.AbsolutePosition + offset;
+ copy.ResetIDs();
+
lock (Entities)
{
Entities.Add(copy.UUID, copy);
}
+
m_numPrim++;
+
+ copy.StartScripts();
copy.ScheduleGroupForFullUpdate();
}
}
else
{
- MainLog.Instance.Warn("client", "Attempted to duplicate nonexistant prim");
+ MainLog.Instance.Warn("SCENE", "Attempted to duplicate nonexistant prim id {0}", GroupID);
}
}
diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs
index 0b7f2a4..3327fea 100644
--- a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs
@@ -572,9 +572,8 @@ namespace OpenSim.Region.Environment.Scenes
///
public void CopyRootPart(SceneObjectPart part, LLUUID cAgentID, LLUUID cGroupID)
{
- SceneObjectPart newPart = part.Copy(m_scene.PrimIDAllocate(), OwnerID, GroupID);
+ SceneObjectPart newPart = part.Copy(m_scene.PrimIDAllocate(), OwnerID, GroupID, m_parts.Count);
newPart.SetParent(this);
- newPart.LinkNum = m_parts.Count;
m_parts.Add(newPart.UUID, newPart);
SetPartAsRoot(newPart);
}
@@ -602,9 +601,8 @@ namespace OpenSim.Region.Environment.Scenes
///
public void CopyPart(SceneObjectPart part, LLUUID cAgentID, LLUUID cGroupID)
{
- SceneObjectPart newPart = part.Copy(m_scene.PrimIDAllocate(), OwnerID, GroupID);
+ SceneObjectPart newPart = part.Copy(m_scene.PrimIDAllocate(), OwnerID, GroupID, m_parts.Count);
newPart.SetParent(this);
- newPart.LinkNum = m_parts.Count;
m_parts.Add(newPart.UUID, newPart);
SetPartAsNonRoot(newPart);
}
diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectPart.Inventory.cs b/OpenSim/Region/Environment/Scenes/SceneObjectPart.Inventory.cs
index 5132a6c..be2ddae 100644
--- a/OpenSim/Region/Environment/Scenes/SceneObjectPart.Inventory.cs
+++ b/OpenSim/Region/Environment/Scenes/SceneObjectPart.Inventory.cs
@@ -88,13 +88,16 @@ namespace OpenSim.Region.Environment.Scenes
///
@@ -191,7 +199,12 @@ namespace OpenSim.Region.Environment.Scenes
item.ParentID = m_folderID;
item.CreationDate = 1000;
item.ParentPartID = UUID;
- m_taskInventory.Add(item.ItemID, item);
+
+ lock (m_taskInventory)
+ {
+ m_taskInventory.Add(item.ItemID, item);
+ }
+
m_inventorySerial++;
}
@@ -202,9 +215,12 @@ namespace OpenSim.Region.Environment.Scenes
///
public void AddInventoryItems(ICollection items)
{
- foreach (TaskInventoryItem item in items)
- {
- m_taskInventory.Add(item.ItemID, item);
+ lock (m_taskInventory)
+ {
+ foreach (TaskInventoryItem item in items)
+ {
+ m_taskInventory.Add(item.ItemID, item);
+ }
}
m_inventorySerial++;
@@ -217,16 +233,19 @@ namespace OpenSim.Region.Environment.Scenes
/// null if the item does not exist
public TaskInventoryItem GetInventoryItem(LLUUID itemID)
{
- if (m_taskInventory.ContainsKey(itemID))
- {
- return m_taskInventory[itemID];
- }
- else
- {
- MainLog.Instance.Error(
- "PRIMINVENTORY",
- "Tried to retrieve item ID {0} from prim {1}, {2} but the item does not exist in this inventory",
- itemID, Name, UUID);
+ lock (m_taskInventory)
+ {
+ if (m_taskInventory.ContainsKey(itemID))
+ {
+ return m_taskInventory[itemID];
+ }
+ else
+ {
+ MainLog.Instance.Error(
+ "PRIMINVENTORY",
+ "Tried to retrieve item ID {0} from prim {1}, {2} but the item does not exist in this inventory",
+ itemID, Name, UUID);
+ }
}
return null;
@@ -240,20 +259,23 @@ namespace OpenSim.Region.Environment.Scenes
/// false if the item did not exist, true if the update occurred succesfully
public bool UpdateInventoryItem(TaskInventoryItem item)
{
- if (m_taskInventory.ContainsKey(item.ItemID))
- {
- m_taskInventory[item.ItemID] = item;
- m_inventorySerial++;
-
- return true;
+ lock (m_taskInventory)
+ {
+ if (m_taskInventory.ContainsKey(item.ItemID))
+ {
+ m_taskInventory[item.ItemID] = item;
+ m_inventorySerial++;
+
+ return true;
+ }
+ else
+ {
+ MainLog.Instance.Error(
+ "PRIMINVENTORY",
+ "Tried to retrieve item ID {0} from prim {1}, {2} but the item does not exist in this inventory",
+ item.ItemID, Name, UUID);
+ }
}
- else
- {
- MainLog.Instance.Error(
- "PRIMINVENTORY",
- "Tried to retrieve item ID {0} from prim {1}, {2} but the item does not exist in this inventory",
- item.ItemID, Name, UUID);
- }
return false;
}
@@ -266,21 +288,24 @@ namespace OpenSim.Region.Environment.Scenes
/// in this prim's inventory.
public int RemoveInventoryItem(LLUUID itemID)
{
- if (m_taskInventory.ContainsKey(itemID))
- {
- int type = m_taskInventory[itemID].InvType;
- m_taskInventory.Remove(itemID);
- m_inventorySerial++;
-
- return type;
+ lock (m_taskInventory)
+ {
+ if (m_taskInventory.ContainsKey(itemID))
+ {
+ int type = m_taskInventory[itemID].InvType;
+ m_taskInventory.Remove(itemID);
+ m_inventorySerial++;
+
+ return type;
+ }
+ else
+ {
+ MainLog.Instance.Error(
+ "PRIMINVENTORY",
+ "Tried to remove item ID {0} from prim {1}, {2} but the item does not exist in this inventory",
+ itemID, Name, UUID);
+ }
}
- else
- {
- MainLog.Instance.Error(
- "PRIMINVENTORY",
- "Tried to remove item ID {0} from prim {1}, {2} but the item does not exist in this inventory",
- itemID, Name, UUID);
- }
return -1;
}
@@ -309,32 +334,36 @@ namespace OpenSim.Region.Environment.Scenes
{
byte[] fileData = new byte[0];
InventoryStringBuilder invString = new InventoryStringBuilder(m_folderID, UUID);
- foreach (TaskInventoryItem item in m_taskInventory.Values)
- {
- invString.AddItemStart();
- invString.AddNameValueLine("item_id", item.ItemID.ToString());
- invString.AddNameValueLine("parent_id", item.ParentID.ToString());
-
- invString.AddPermissionsStart();
- invString.AddNameValueLine("base_mask", "0x7FFFFFFF");
- invString.AddNameValueLine("owner_mask", "0x7FFFFFFF");
- invString.AddNameValueLine("group_mask", "0x7FFFFFFF");
- invString.AddNameValueLine("everyone_mask", "0x7FFFFFFF");
- invString.AddNameValueLine("next_owner_mask", "0x7FFFFFFF");
- invString.AddNameValueLine("creator_id", item.CreatorID.ToString());
- invString.AddNameValueLine("owner_id", item.OwnerID.ToString());
- invString.AddNameValueLine("last_owner_id", item.LastOwnerID.ToString());
- invString.AddNameValueLine("group_id", item.GroupID.ToString());
- invString.AddSectionEnd();
-
- invString.AddNameValueLine("asset_id", item.AssetID.ToString());
- invString.AddNameValueLine("type", TaskInventoryItem.Types[item.Type]);
- invString.AddNameValueLine("inv_type", TaskInventoryItem.InvTypes[item.InvType]);
- invString.AddNameValueLine("flags", "0x00");
- invString.AddNameValueLine("name", item.Name + "|");
- invString.AddNameValueLine("desc", item.Description + "|");
- invString.AddNameValueLine("creation_date", item.CreationDate.ToString());
- invString.AddSectionEnd();
+
+ lock (m_taskInventory)
+ {
+ foreach (TaskInventoryItem item in m_taskInventory.Values)
+ {
+ invString.AddItemStart();
+ invString.AddNameValueLine("item_id", item.ItemID.ToString());
+ invString.AddNameValueLine("parent_id", item.ParentID.ToString());
+
+ invString.AddPermissionsStart();
+ invString.AddNameValueLine("base_mask", "0x7FFFFFFF");
+ invString.AddNameValueLine("owner_mask", "0x7FFFFFFF");
+ invString.AddNameValueLine("group_mask", "0x7FFFFFFF");
+ invString.AddNameValueLine("everyone_mask", "0x7FFFFFFF");
+ invString.AddNameValueLine("next_owner_mask", "0x7FFFFFFF");
+ invString.AddNameValueLine("creator_id", item.CreatorID.ToString());
+ invString.AddNameValueLine("owner_id", item.OwnerID.ToString());
+ invString.AddNameValueLine("last_owner_id", item.LastOwnerID.ToString());
+ invString.AddNameValueLine("group_id", item.GroupID.ToString());
+ invString.AddSectionEnd();
+
+ invString.AddNameValueLine("asset_id", item.AssetID.ToString());
+ invString.AddNameValueLine("type", TaskInventoryItem.Types[item.Type]);
+ invString.AddNameValueLine("inv_type", TaskInventoryItem.InvTypes[item.InvType]);
+ invString.AddNameValueLine("flags", "0x00");
+ invString.AddNameValueLine("name", item.Name + "|");
+ invString.AddNameValueLine("desc", item.Description + "|");
+ invString.AddNameValueLine("creation_date", item.CreationDate.ToString());
+ invString.AddSectionEnd();
+ }
}
fileData = Helpers.StringToField(invString.BuildString);
diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs
index 93073c1..7866739 100644
--- a/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs
+++ b/OpenSim/Region/Environment/Scenes/SceneObjectPart.cs
@@ -952,10 +952,10 @@ namespace OpenSim.Region.Environment.Scenes
#region Copying
///
- ///
+ /// Duplicates this part.
///
///
- public SceneObjectPart Copy(uint localID, LLUUID AgentID, LLUUID GroupID)
+ public SceneObjectPart Copy(uint localID, LLUUID AgentID, LLUUID GroupID, int linkNum)
{
SceneObjectPart dupe = (SceneObjectPart) MemberwiseClone();
dupe.m_shape = m_shape.Copy();
@@ -977,6 +977,10 @@ namespace OpenSim.Region.Environment.Scenes
dupe.ObjectSaleType = ObjectSaleType;
dupe.SalePrice = SalePrice;
dupe.Category = Category;
+
+ dupe.TaskInventory = (TaskInventoryDictionary)dupe.TaskInventory.Clone();
+
+ dupe.ResetIDs(linkNum);
// This may be wrong... it might have to be applied in SceneObjectGroup to the object that's being duplicated.
dupe.LastOwnerID = ObjectOwner;
--
cgit v1.1