diff options
author | Justin Clarke Casey | 2008-01-16 20:27:12 +0000 |
---|---|---|
committer | Justin Clarke Casey | 2008-01-16 20:27:12 +0000 |
commit | b33da2538ed728bdc97cca20ada36913097160b0 (patch) | |
tree | 0464763a340891a49134d7bd66468302bc38dcad | |
parent | * Fixed a packet counting issue that I introduced (diff) | |
download | opensim-SC-b33da2538ed728bdc97cca20ada36913097160b0.zip opensim-SC-b33da2538ed728bdc97cca20ada36913097160b0.tar.gz opensim-SC-b33da2538ed728bdc97cca20ada36913097160b0.tar.bz2 opensim-SC-b33da2538ed728bdc97cca20ada36913097160b0.tar.xz |
* 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.
5 files changed, 179 insertions, 112 deletions
diff --git a/OpenSim/Framework/TaskInventoryItem.cs b/OpenSim/Framework/TaskInventoryItem.cs index 6e163a9..3009259 100644 --- a/OpenSim/Framework/TaskInventoryItem.cs +++ b/OpenSim/Framework/TaskInventoryItem.cs | |||
@@ -36,7 +36,13 @@ using System; | |||
36 | 36 | ||
37 | namespace OpenSim.Framework | 37 | namespace OpenSim.Framework |
38 | { | 38 | { |
39 | public class TaskInventoryDictionary : Dictionary<LLUUID, TaskInventoryItem>, IXmlSerializable | 39 | /// <summary> |
40 | /// A dictionary for task inventory. | ||
41 | /// | ||
42 | /// This class is not thread safe. Callers must synchronize on Dictionary methods. | ||
43 | /// </summary> | ||
44 | public class TaskInventoryDictionary : Dictionary<LLUUID, TaskInventoryItem>, | ||
45 | ICloneable, IXmlSerializable | ||
40 | { | 46 | { |
41 | private static XmlSerializer tiiSerializer = new XmlSerializer(typeof(TaskInventoryItem)); | 47 | private static XmlSerializer tiiSerializer = new XmlSerializer(typeof(TaskInventoryItem)); |
42 | 48 | ||
@@ -86,19 +92,38 @@ namespace OpenSim.Framework | |||
86 | // see IXmlSerializable | 92 | // see IXmlSerializable |
87 | public void WriteXml(XmlWriter writer) | 93 | public void WriteXml(XmlWriter writer) |
88 | { | 94 | { |
89 | foreach (TaskInventoryItem item in Values) | 95 | lock (this) |
90 | { | 96 | { |
91 | tiiSerializer.Serialize(writer, item); | 97 | foreach (TaskInventoryItem item in Values) |
98 | { | ||
99 | tiiSerializer.Serialize(writer, item); | ||
100 | } | ||
92 | } | 101 | } |
93 | 102 | ||
94 | //tiiSerializer.Serialize(writer, Values); | 103 | //tiiSerializer.Serialize(writer, Values); |
95 | } | 104 | } |
105 | |||
106 | // see ICloneable | ||
107 | public Object Clone() | ||
108 | { | ||
109 | TaskInventoryDictionary clone = new TaskInventoryDictionary(); | ||
110 | |||
111 | lock (this) | ||
112 | { | ||
113 | foreach (LLUUID uuid in Keys) | ||
114 | { | ||
115 | clone.Add(uuid, (TaskInventoryItem)this[uuid].Clone()); | ||
116 | } | ||
117 | } | ||
118 | |||
119 | return clone; | ||
120 | } | ||
96 | } | 121 | } |
97 | 122 | ||
98 | /// <summary> | 123 | /// <summary> |
99 | /// Represents an item in a task inventory | 124 | /// Represents an item in a task inventory |
100 | /// </summary> | 125 | /// </summary> |
101 | public class TaskInventoryItem | 126 | public class TaskInventoryItem : ICloneable |
102 | { | 127 | { |
103 | /// <summary> | 128 | /// <summary> |
104 | /// XXX This should really be factored out into some constants class. | 129 | /// XXX This should really be factored out into some constants class. |
@@ -141,17 +166,7 @@ namespace OpenSim.Framework | |||
141 | String.Empty, | 166 | String.Empty, |
142 | "lsltext", | 167 | "lsltext", |
143 | String.Empty | 168 | String.Empty |
144 | }; | 169 | }; |
145 | |||
146 | /// <summary> | ||
147 | /// Reset the LLUUIDs for this item. | ||
148 | /// </summary> | ||
149 | /// <param name="partID">The new part ID to which this item belongs</param> | ||
150 | public void ResetIDs(LLUUID partID) | ||
151 | { | ||
152 | ItemID = LLUUID.Random(); | ||
153 | ParentPartID = partID; | ||
154 | } | ||
155 | 170 | ||
156 | public LLUUID ItemID = LLUUID.Zero; | 171 | public LLUUID ItemID = LLUUID.Zero; |
157 | public LLUUID ParentID = LLUUID.Zero; //parent folder id | 172 | public LLUUID ParentID = LLUUID.Zero; //parent folder id |
@@ -175,5 +190,21 @@ namespace OpenSim.Framework | |||
175 | public uint CreationDate = 0; | 190 | public uint CreationDate = 0; |
176 | 191 | ||
177 | public LLUUID ParentPartID = LLUUID.Zero; | 192 | public LLUUID ParentPartID = LLUUID.Zero; |
193 | |||
194 | /// <summary> | ||
195 | /// Reset the LLUUIDs for this item. | ||
196 | /// </summary> | ||
197 | /// <param name="partID">The new part ID to which this item belongs</param> | ||
198 | public void ResetIDs(LLUUID partID) | ||
199 | { | ||
200 | ItemID = LLUUID.Random(); | ||
201 | ParentPartID = partID; | ||
202 | } | ||
203 | |||
204 | // See ICloneable | ||
205 | public Object Clone() | ||
206 | { | ||
207 | return MemberwiseClone(); | ||
208 | } | ||
178 | } | 209 | } |
179 | } | 210 | } |
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 | |||
928 | { | 928 | { |
929 | SceneObjectGroup copy = originPrim.Copy(AgentID, GroupID); | 929 | SceneObjectGroup copy = originPrim.Copy(AgentID, GroupID); |
930 | copy.AbsolutePosition = copy.AbsolutePosition + offset; | 930 | copy.AbsolutePosition = copy.AbsolutePosition + offset; |
931 | copy.ResetIDs(); | ||
932 | |||
931 | lock (Entities) | 933 | lock (Entities) |
932 | { | 934 | { |
933 | Entities.Add(copy.UUID, copy); | 935 | Entities.Add(copy.UUID, copy); |
934 | } | 936 | } |
937 | |||
935 | m_numPrim++; | 938 | m_numPrim++; |
939 | |||
940 | copy.StartScripts(); | ||
936 | copy.ScheduleGroupForFullUpdate(); | 941 | copy.ScheduleGroupForFullUpdate(); |
937 | } | 942 | } |
938 | } | 943 | } |
939 | else | 944 | else |
940 | { | 945 | { |
941 | MainLog.Instance.Warn("client", "Attempted to duplicate nonexistant prim"); | 946 | MainLog.Instance.Warn("SCENE", "Attempted to duplicate nonexistant prim id {0}", GroupID); |
942 | } | 947 | } |
943 | } | 948 | } |
944 | 949 | ||
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 | |||
572 | /// <param name="part"></param> | 572 | /// <param name="part"></param> |
573 | public void CopyRootPart(SceneObjectPart part, LLUUID cAgentID, LLUUID cGroupID) | 573 | public void CopyRootPart(SceneObjectPart part, LLUUID cAgentID, LLUUID cGroupID) |
574 | { | 574 | { |
575 | SceneObjectPart newPart = part.Copy(m_scene.PrimIDAllocate(), OwnerID, GroupID); | 575 | SceneObjectPart newPart = part.Copy(m_scene.PrimIDAllocate(), OwnerID, GroupID, m_parts.Count); |
576 | newPart.SetParent(this); | 576 | newPart.SetParent(this); |
577 | newPart.LinkNum = m_parts.Count; | ||
578 | m_parts.Add(newPart.UUID, newPart); | 577 | m_parts.Add(newPart.UUID, newPart); |
579 | SetPartAsRoot(newPart); | 578 | SetPartAsRoot(newPart); |
580 | } | 579 | } |
@@ -602,9 +601,8 @@ namespace OpenSim.Region.Environment.Scenes | |||
602 | /// <param name="part"></param> | 601 | /// <param name="part"></param> |
603 | public void CopyPart(SceneObjectPart part, LLUUID cAgentID, LLUUID cGroupID) | 602 | public void CopyPart(SceneObjectPart part, LLUUID cAgentID, LLUUID cGroupID) |
604 | { | 603 | { |
605 | SceneObjectPart newPart = part.Copy(m_scene.PrimIDAllocate(), OwnerID, GroupID); | 604 | SceneObjectPart newPart = part.Copy(m_scene.PrimIDAllocate(), OwnerID, GroupID, m_parts.Count); |
606 | newPart.SetParent(this); | 605 | newPart.SetParent(this); |
607 | newPart.LinkNum = m_parts.Count; | ||
608 | m_parts.Add(newPart.UUID, newPart); | 606 | m_parts.Add(newPart.UUID, newPart); |
609 | SetPartAsNonRoot(newPart); | 607 | SetPartAsNonRoot(newPart); |
610 | } | 608 | } |
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 | |||
88 | /// <param name="linkNum'>Link number for the part</param> | 88 | /// <param name="linkNum'>Link number for the part</param> |
89 | public void ResetInventoryIDs() | 89 | public void ResetInventoryIDs() |
90 | { | 90 | { |
91 | IList<TaskInventoryItem> items = new List<TaskInventoryItem>(TaskInventory.Values); | 91 | lock (TaskInventory) |
92 | TaskInventory.Clear(); | 92 | { |
93 | 93 | IList<TaskInventoryItem> items = new List<TaskInventoryItem>(TaskInventory.Values); | |
94 | foreach (TaskInventoryItem item in items) | 94 | TaskInventory.Clear(); |
95 | { | 95 | |
96 | item.ResetIDs(UUID); | 96 | foreach (TaskInventoryItem item in items) |
97 | TaskInventory.Add(item.ItemID, item); | 97 | { |
98 | item.ResetIDs(UUID); | ||
99 | TaskInventory.Add(item.ItemID, item); | ||
100 | } | ||
98 | } | 101 | } |
99 | } | 102 | } |
100 | 103 | ||
@@ -103,12 +106,15 @@ namespace OpenSim.Region.Environment.Scenes | |||
103 | /// </summary> | 106 | /// </summary> |
104 | public void StartScripts() | 107 | public void StartScripts() |
105 | { | 108 | { |
106 | foreach (TaskInventoryItem item in m_taskInventory.Values) | 109 | lock (m_taskInventory) |
107 | { | 110 | { |
108 | // XXX more hardcoding badness. Should be an enum in TaskInventoryItem | 111 | foreach (TaskInventoryItem item in m_taskInventory.Values) |
109 | if (10 == item.Type) | ||
110 | { | 112 | { |
111 | StartScript(item); | 113 | // XXX more hardcoding badness. Should be an enum in TaskInventoryItem |
114 | if (10 == item.Type) | ||
115 | { | ||
116 | StartScript(item); | ||
117 | } | ||
112 | } | 118 | } |
113 | } | 119 | } |
114 | } | 120 | } |
@@ -149,18 +155,20 @@ namespace OpenSim.Region.Environment.Scenes | |||
149 | /// </param> | 155 | /// </param> |
150 | public void StartScript(LLUUID itemId) | 156 | public void StartScript(LLUUID itemId) |
151 | { | 157 | { |
152 | if (m_taskInventory.ContainsKey(itemId)) | 158 | lock (m_taskInventory) |
153 | { | 159 | { |
154 | StartScript(m_taskInventory[itemId]); | 160 | if (m_taskInventory.ContainsKey(itemId)) |
155 | } | 161 | { |
156 | else | 162 | StartScript(m_taskInventory[itemId]); |
157 | { | 163 | } |
158 | MainLog.Instance.Error( | 164 | else |
159 | "PRIMINVENTORY", | 165 | { |
160 | "Couldn't start script with ID {0} since it couldn't be found for prim {1}, {2}", | 166 | MainLog.Instance.Error( |
161 | itemId, Name, UUID); | 167 | "PRIMINVENTORY", |
162 | } | 168 | "Couldn't start script with ID {0} since it couldn't be found for prim {1}, {2}", |
163 | 169 | itemId, Name, UUID); | |
170 | } | ||
171 | } | ||
164 | } | 172 | } |
165 | 173 | ||
166 | /// <summary> | 174 | /// <summary> |
@@ -191,7 +199,12 @@ namespace OpenSim.Region.Environment.Scenes | |||
191 | item.ParentID = m_folderID; | 199 | item.ParentID = m_folderID; |
192 | item.CreationDate = 1000; | 200 | item.CreationDate = 1000; |
193 | item.ParentPartID = UUID; | 201 | item.ParentPartID = UUID; |
194 | m_taskInventory.Add(item.ItemID, item); | 202 | |
203 | lock (m_taskInventory) | ||
204 | { | ||
205 | m_taskInventory.Add(item.ItemID, item); | ||
206 | } | ||
207 | |||
195 | m_inventorySerial++; | 208 | m_inventorySerial++; |
196 | } | 209 | } |
197 | 210 | ||
@@ -202,9 +215,12 @@ namespace OpenSim.Region.Environment.Scenes | |||
202 | /// <param name="items"></param> | 215 | /// <param name="items"></param> |
203 | public void AddInventoryItems(ICollection<TaskInventoryItem> items) | 216 | public void AddInventoryItems(ICollection<TaskInventoryItem> items) |
204 | { | 217 | { |
205 | foreach (TaskInventoryItem item in items) | 218 | lock (m_taskInventory) |
206 | { | 219 | { |
207 | m_taskInventory.Add(item.ItemID, item); | 220 | foreach (TaskInventoryItem item in items) |
221 | { | ||
222 | m_taskInventory.Add(item.ItemID, item); | ||
223 | } | ||
208 | } | 224 | } |
209 | 225 | ||
210 | m_inventorySerial++; | 226 | m_inventorySerial++; |
@@ -217,16 +233,19 @@ namespace OpenSim.Region.Environment.Scenes | |||
217 | /// <returns>null if the item does not exist</returns> | 233 | /// <returns>null if the item does not exist</returns> |
218 | public TaskInventoryItem GetInventoryItem(LLUUID itemID) | 234 | public TaskInventoryItem GetInventoryItem(LLUUID itemID) |
219 | { | 235 | { |
220 | if (m_taskInventory.ContainsKey(itemID)) | 236 | lock (m_taskInventory) |
221 | { | 237 | { |
222 | return m_taskInventory[itemID]; | 238 | if (m_taskInventory.ContainsKey(itemID)) |
223 | } | 239 | { |
224 | else | 240 | return m_taskInventory[itemID]; |
225 | { | 241 | } |
226 | MainLog.Instance.Error( | 242 | else |
227 | "PRIMINVENTORY", | 243 | { |
228 | "Tried to retrieve item ID {0} from prim {1}, {2} but the item does not exist in this inventory", | 244 | MainLog.Instance.Error( |
229 | itemID, Name, UUID); | 245 | "PRIMINVENTORY", |
246 | "Tried to retrieve item ID {0} from prim {1}, {2} but the item does not exist in this inventory", | ||
247 | itemID, Name, UUID); | ||
248 | } | ||
230 | } | 249 | } |
231 | 250 | ||
232 | return null; | 251 | return null; |
@@ -240,20 +259,23 @@ namespace OpenSim.Region.Environment.Scenes | |||
240 | /// <returns>false if the item did not exist, true if the update occurred succesfully</returns> | 259 | /// <returns>false if the item did not exist, true if the update occurred succesfully</returns> |
241 | public bool UpdateInventoryItem(TaskInventoryItem item) | 260 | public bool UpdateInventoryItem(TaskInventoryItem item) |
242 | { | 261 | { |
243 | if (m_taskInventory.ContainsKey(item.ItemID)) | 262 | lock (m_taskInventory) |
244 | { | 263 | { |
245 | m_taskInventory[item.ItemID] = item; | 264 | if (m_taskInventory.ContainsKey(item.ItemID)) |
246 | m_inventorySerial++; | 265 | { |
247 | 266 | m_taskInventory[item.ItemID] = item; | |
248 | return true; | 267 | m_inventorySerial++; |
268 | |||
269 | return true; | ||
270 | } | ||
271 | else | ||
272 | { | ||
273 | MainLog.Instance.Error( | ||
274 | "PRIMINVENTORY", | ||
275 | "Tried to retrieve item ID {0} from prim {1}, {2} but the item does not exist in this inventory", | ||
276 | item.ItemID, Name, UUID); | ||
277 | } | ||
249 | } | 278 | } |
250 | else | ||
251 | { | ||
252 | MainLog.Instance.Error( | ||
253 | "PRIMINVENTORY", | ||
254 | "Tried to retrieve item ID {0} from prim {1}, {2} but the item does not exist in this inventory", | ||
255 | item.ItemID, Name, UUID); | ||
256 | } | ||
257 | 279 | ||
258 | return false; | 280 | return false; |
259 | } | 281 | } |
@@ -266,21 +288,24 @@ namespace OpenSim.Region.Environment.Scenes | |||
266 | /// in this prim's inventory.</returns> | 288 | /// in this prim's inventory.</returns> |
267 | public int RemoveInventoryItem(LLUUID itemID) | 289 | public int RemoveInventoryItem(LLUUID itemID) |
268 | { | 290 | { |
269 | if (m_taskInventory.ContainsKey(itemID)) | 291 | lock (m_taskInventory) |
270 | { | 292 | { |
271 | int type = m_taskInventory[itemID].InvType; | 293 | if (m_taskInventory.ContainsKey(itemID)) |
272 | m_taskInventory.Remove(itemID); | 294 | { |
273 | m_inventorySerial++; | 295 | int type = m_taskInventory[itemID].InvType; |
274 | 296 | m_taskInventory.Remove(itemID); | |
275 | return type; | 297 | m_inventorySerial++; |
298 | |||
299 | return type; | ||
300 | } | ||
301 | else | ||
302 | { | ||
303 | MainLog.Instance.Error( | ||
304 | "PRIMINVENTORY", | ||
305 | "Tried to remove item ID {0} from prim {1}, {2} but the item does not exist in this inventory", | ||
306 | itemID, Name, UUID); | ||
307 | } | ||
276 | } | 308 | } |
277 | else | ||
278 | { | ||
279 | MainLog.Instance.Error( | ||
280 | "PRIMINVENTORY", | ||
281 | "Tried to remove item ID {0} from prim {1}, {2} but the item does not exist in this inventory", | ||
282 | itemID, Name, UUID); | ||
283 | } | ||
284 | 309 | ||
285 | return -1; | 310 | return -1; |
286 | } | 311 | } |
@@ -309,32 +334,36 @@ namespace OpenSim.Region.Environment.Scenes | |||
309 | { | 334 | { |
310 | byte[] fileData = new byte[0]; | 335 | byte[] fileData = new byte[0]; |
311 | InventoryStringBuilder invString = new InventoryStringBuilder(m_folderID, UUID); | 336 | InventoryStringBuilder invString = new InventoryStringBuilder(m_folderID, UUID); |
312 | foreach (TaskInventoryItem item in m_taskInventory.Values) | 337 | |
313 | { | 338 | lock (m_taskInventory) |
314 | invString.AddItemStart(); | 339 | { |
315 | invString.AddNameValueLine("item_id", item.ItemID.ToString()); | 340 | foreach (TaskInventoryItem item in m_taskInventory.Values) |
316 | invString.AddNameValueLine("parent_id", item.ParentID.ToString()); | 341 | { |
317 | 342 | invString.AddItemStart(); | |
318 | invString.AddPermissionsStart(); | 343 | invString.AddNameValueLine("item_id", item.ItemID.ToString()); |
319 | invString.AddNameValueLine("base_mask", "0x7FFFFFFF"); | 344 | invString.AddNameValueLine("parent_id", item.ParentID.ToString()); |
320 | invString.AddNameValueLine("owner_mask", "0x7FFFFFFF"); | 345 | |
321 | invString.AddNameValueLine("group_mask", "0x7FFFFFFF"); | 346 | invString.AddPermissionsStart(); |
322 | invString.AddNameValueLine("everyone_mask", "0x7FFFFFFF"); | 347 | invString.AddNameValueLine("base_mask", "0x7FFFFFFF"); |
323 | invString.AddNameValueLine("next_owner_mask", "0x7FFFFFFF"); | 348 | invString.AddNameValueLine("owner_mask", "0x7FFFFFFF"); |
324 | invString.AddNameValueLine("creator_id", item.CreatorID.ToString()); | 349 | invString.AddNameValueLine("group_mask", "0x7FFFFFFF"); |
325 | invString.AddNameValueLine("owner_id", item.OwnerID.ToString()); | 350 | invString.AddNameValueLine("everyone_mask", "0x7FFFFFFF"); |
326 | invString.AddNameValueLine("last_owner_id", item.LastOwnerID.ToString()); | 351 | invString.AddNameValueLine("next_owner_mask", "0x7FFFFFFF"); |
327 | invString.AddNameValueLine("group_id", item.GroupID.ToString()); | 352 | invString.AddNameValueLine("creator_id", item.CreatorID.ToString()); |
328 | invString.AddSectionEnd(); | 353 | invString.AddNameValueLine("owner_id", item.OwnerID.ToString()); |
329 | 354 | invString.AddNameValueLine("last_owner_id", item.LastOwnerID.ToString()); | |
330 | invString.AddNameValueLine("asset_id", item.AssetID.ToString()); | 355 | invString.AddNameValueLine("group_id", item.GroupID.ToString()); |
331 | invString.AddNameValueLine("type", TaskInventoryItem.Types[item.Type]); | 356 | invString.AddSectionEnd(); |
332 | invString.AddNameValueLine("inv_type", TaskInventoryItem.InvTypes[item.InvType]); | 357 | |
333 | invString.AddNameValueLine("flags", "0x00"); | 358 | invString.AddNameValueLine("asset_id", item.AssetID.ToString()); |
334 | invString.AddNameValueLine("name", item.Name + "|"); | 359 | invString.AddNameValueLine("type", TaskInventoryItem.Types[item.Type]); |
335 | invString.AddNameValueLine("desc", item.Description + "|"); | 360 | invString.AddNameValueLine("inv_type", TaskInventoryItem.InvTypes[item.InvType]); |
336 | invString.AddNameValueLine("creation_date", item.CreationDate.ToString()); | 361 | invString.AddNameValueLine("flags", "0x00"); |
337 | invString.AddSectionEnd(); | 362 | invString.AddNameValueLine("name", item.Name + "|"); |
363 | invString.AddNameValueLine("desc", item.Description + "|"); | ||
364 | invString.AddNameValueLine("creation_date", item.CreationDate.ToString()); | ||
365 | invString.AddSectionEnd(); | ||
366 | } | ||
338 | } | 367 | } |
339 | 368 | ||
340 | fileData = Helpers.StringToField(invString.BuildString); | 369 | 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 | |||
952 | #region Copying | 952 | #region Copying |
953 | 953 | ||
954 | /// <summary> | 954 | /// <summary> |
955 | /// | 955 | /// Duplicates this part. |
956 | /// </summary> | 956 | /// </summary> |
957 | /// <returns></returns> | 957 | /// <returns></returns> |
958 | public SceneObjectPart Copy(uint localID, LLUUID AgentID, LLUUID GroupID) | 958 | public SceneObjectPart Copy(uint localID, LLUUID AgentID, LLUUID GroupID, int linkNum) |
959 | { | 959 | { |
960 | SceneObjectPart dupe = (SceneObjectPart) MemberwiseClone(); | 960 | SceneObjectPart dupe = (SceneObjectPart) MemberwiseClone(); |
961 | dupe.m_shape = m_shape.Copy(); | 961 | dupe.m_shape = m_shape.Copy(); |
@@ -977,6 +977,10 @@ namespace OpenSim.Region.Environment.Scenes | |||
977 | dupe.ObjectSaleType = ObjectSaleType; | 977 | dupe.ObjectSaleType = ObjectSaleType; |
978 | dupe.SalePrice = SalePrice; | 978 | dupe.SalePrice = SalePrice; |
979 | dupe.Category = Category; | 979 | dupe.Category = Category; |
980 | |||
981 | dupe.TaskInventory = (TaskInventoryDictionary)dupe.TaskInventory.Clone(); | ||
982 | |||
983 | dupe.ResetIDs(linkNum); | ||
980 | 984 | ||
981 | // This may be wrong... it might have to be applied in SceneObjectGroup to the object that's being duplicated. | 985 | // This may be wrong... it might have to be applied in SceneObjectGroup to the object that's being duplicated. |
982 | dupe.LastOwnerID = ObjectOwner; | 986 | dupe.LastOwnerID = ObjectOwner; |