aboutsummaryrefslogtreecommitdiffstatshomepage
diff options
context:
space:
mode:
-rw-r--r--OpenSim/Region/Environment/Scenes/Scene.Inventory.cs949
-rw-r--r--OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs11
2 files changed, 484 insertions, 476 deletions
diff --git a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs
index ee515ea..ff58fd8 100644
--- a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs
@@ -1,473 +1,476 @@
1/* 1/*
2* Copyright (c) Contributors, http://opensimulator.org/ 2* Copyright (c) Contributors, http://opensimulator.org/
3* See CONTRIBUTORS.TXT for a full list of copyright holders. 3* See CONTRIBUTORS.TXT for a full list of copyright holders.
4* 4*
5* Redistribution and use in source and binary forms, with or without 5* Redistribution and use in source and binary forms, with or without
6* modification, are permitted provided that the following conditions are met: 6* modification, are permitted provided that the following conditions are met:
7* * Redistributions of source code must retain the above copyright 7* * Redistributions of source code must retain the above copyright
8* notice, this list of conditions and the following disclaimer. 8* notice, this list of conditions and the following disclaimer.
9* * Redistributions in binary form must reproduce the above copyright 9* * Redistributions in binary form must reproduce the above copyright
10* notice, this list of conditions and the following disclaimer in the 10* notice, this list of conditions and the following disclaimer in the
11* documentation and/or other materials provided with the distribution. 11* documentation and/or other materials provided with the distribution.
12* * Neither the name of the OpenSim Project nor the 12* * Neither the name of the OpenSim Project nor the
13* names of its contributors may be used to endorse or promote products 13* names of its contributors may be used to endorse or promote products
14* derived from this software without specific prior written permission. 14* derived from this software without specific prior written permission.
15* 15*
16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS AS IS AND ANY 16* THIS SOFTWARE IS PROVIDED BY THE DEVELOPERS AS IS AND ANY
17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 17* EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 18* WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY 19* DISCLAIMED. IN NO EVENT SHALL THE CONTRIBUTORS BE LIABLE FOR ANY
20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 20* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 21* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 22* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 23* ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS 24* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 25* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
26* 26*
27*/ 27*/
28 28
29using Axiom.Math; 29using Axiom.Math;
30using libsecondlife; 30using libsecondlife;
31using libsecondlife.Packets; 31using libsecondlife.Packets;
32using OpenSim.Framework.Communications.Cache; 32using OpenSim.Framework.Communications.Cache;
33using OpenSim.Framework.Communications.Caches; 33using OpenSim.Framework.Communications.Caches;
34using OpenSim.Framework.Interfaces; 34using OpenSim.Framework.Interfaces;
35using OpenSim.Framework.Types; 35using OpenSim.Framework.Types;
36using OpenSim.Framework.Utilities; 36using OpenSim.Framework.Utilities;
37using OpenSim.Region.Physics.Manager; 37using OpenSim.Region.Physics.Manager;
38 38
39namespace OpenSim.Region.Environment.Scenes 39namespace OpenSim.Region.Environment.Scenes
40{ 40{
41 public partial class Scene 41 public partial class Scene
42 { 42 {
43 //split these method into this partial as a lot of these (hopefully) are only temporary and won't be needed once Caps is more complete 43 //split these method into this partial as a lot of these (hopefully) are only temporary and won't be needed once Caps is more complete
44 // or at least some of they can be moved somewhere else 44 // or at least some of they can be moved somewhere else
45 45
46 public void AddInventoryItem(LLUUID avatarId, InventoryItemBase item) 46 public void AddInventoryItem(LLUUID avatarId, InventoryItemBase item)
47 { 47 {
48 ScenePresence avatar; 48 ScenePresence avatar;
49 49
50 if ( TryGetAvatar( avatarId, out avatar )) 50 if ( TryGetAvatar( avatarId, out avatar ))
51 { 51 {
52 AddInventoryItem(avatar.ControllingClient, item); 52 AddInventoryItem(avatar.ControllingClient, item);
53 } 53 }
54 } 54 }
55 55
56 public void AddInventoryItem(IClientAPI remoteClient, InventoryItemBase item) 56 public void AddInventoryItem(IClientAPI remoteClient, InventoryItemBase item)
57 { 57 {
58 CachedUserInfo userInfo = commsManager.UserProfileCache.GetUserDetails(remoteClient.AgentId); 58 CachedUserInfo userInfo = commsManager.UserProfileCache.GetUserDetails(remoteClient.AgentId);
59 if (userInfo != null) 59 if (userInfo != null)
60 { 60 {
61 userInfo.AddItem(remoteClient.AgentId, item); 61 userInfo.AddItem(remoteClient.AgentId, item);
62 remoteClient.SendInventoryItemUpdate(item); 62 remoteClient.SendInventoryItemUpdate(item);
63 } 63 }
64 } 64 }
65 65
66 public LLUUID CapsUpdateInventoryItemAsset(LLUUID avatarId, LLUUID itemID, byte[] data) 66 public LLUUID CapsUpdateInventoryItemAsset(LLUUID avatarId, LLUUID itemID, byte[] data)
67 { 67 {
68 ScenePresence avatar; 68 ScenePresence avatar;
69 69
70 if (TryGetAvatar(avatarId, out avatar)) 70 if (TryGetAvatar(avatarId, out avatar))
71 { 71 {
72 return CapsUpdateInventoryItemAsset(avatar.ControllingClient, itemID, data); 72 return CapsUpdateInventoryItemAsset(avatar.ControllingClient, itemID, data);
73 } 73 }
74 74
75 return LLUUID.Zero; 75 return LLUUID.Zero;
76 } 76 }
77 77
78 public LLUUID CapsUpdateInventoryItemAsset(IClientAPI remoteClient, LLUUID itemID, byte[] data) 78 public LLUUID CapsUpdateInventoryItemAsset(IClientAPI remoteClient, LLUUID itemID, byte[] data)
79 { 79 {
80 CachedUserInfo userInfo = commsManager.UserProfileCache.GetUserDetails(remoteClient.AgentId); 80 CachedUserInfo userInfo = commsManager.UserProfileCache.GetUserDetails(remoteClient.AgentId);
81 if (userInfo != null) 81 if (userInfo != null)
82 { 82 {
83 if (userInfo.RootFolder != null) 83 if (userInfo.RootFolder != null)
84 { 84 {
85 InventoryItemBase item = userInfo.RootFolder.HasItem(itemID); 85 InventoryItemBase item = userInfo.RootFolder.HasItem(itemID);
86 if (item != null) 86 if (item != null)
87 { 87 {
88 AssetBase asset; 88 AssetBase asset;
89 asset = new AssetBase(); 89 asset = new AssetBase();
90 asset.FullID = LLUUID.Random(); 90 asset.FullID = LLUUID.Random();
91 asset.Type = (sbyte) item.assetType; 91 asset.Type = (sbyte) item.assetType;
92 asset.InvType = (sbyte) item.invType; 92 asset.InvType = (sbyte) item.invType;
93 asset.Name = item.inventoryName; 93 asset.Name = item.inventoryName;
94 asset.Data = data; 94 asset.Data = data;
95 commsManager.AssetCache.AddAsset(asset); 95 commsManager.AssetCache.AddAsset(asset);
96 96
97 item.assetID = asset.FullID; 97 item.assetID = asset.FullID;
98 userInfo.UpdateItem(remoteClient.AgentId, item); 98 userInfo.UpdateItem(remoteClient.AgentId, item);
99 99
100 // remoteClient.SendInventoryItemUpdate(item); 100 // remoteClient.SendInventoryItemUpdate(item);
101 if (item.invType == 7) 101 if (item.invType == 7)
102 { 102 {
103 //do we want to know about updated note cards? 103 //do we want to know about updated note cards?
104 } 104 }
105 else if (item.invType == 10) 105 else if (item.invType == 10)
106 { 106 {
107 // do we want to know about updated scripts 107 // do we want to know about updated scripts
108 } 108 }
109 109
110 return (asset.FullID); 110 return (asset.FullID);
111 } 111 }
112 } 112 }
113 } 113 }
114 return LLUUID.Zero; 114 return LLUUID.Zero;
115 } 115 }
116 116
117 public void UDPUpdateInventoryItemAsset(IClientAPI remoteClient, LLUUID transactionID, LLUUID assetID, 117 public void UDPUpdateInventoryItemAsset(IClientAPI remoteClient, LLUUID transactionID, LLUUID assetID,
118 LLUUID itemID) 118 LLUUID itemID)
119 { 119 {
120 CachedUserInfo userInfo = commsManager.UserProfileCache.GetUserDetails(remoteClient.AgentId); 120 CachedUserInfo userInfo = commsManager.UserProfileCache.GetUserDetails(remoteClient.AgentId);
121 if (userInfo != null) 121 if (userInfo != null)
122 { 122 {
123 if (userInfo.RootFolder != null) 123 if (userInfo.RootFolder != null)
124 { 124 {
125 InventoryItemBase item = userInfo.RootFolder.HasItem(itemID); 125 InventoryItemBase item = userInfo.RootFolder.HasItem(itemID);
126 if (item != null) 126 if (item != null)
127 { 127 {
128 AgentAssetTransactions transactions = 128 AgentAssetTransactions transactions =
129 commsManager.TransactionsManager.GetUserTransActions(remoteClient.AgentId); 129 commsManager.TransactionsManager.GetUserTransActions(remoteClient.AgentId);
130 if (transactions != null) 130 if (transactions != null)
131 { 131 {
132 AssetBase asset = null; 132 AssetBase asset = null;
133 bool addToCache = false; 133 bool addToCache = false;
134 134
135 asset = commsManager.AssetCache.GetAsset(assetID); 135 asset = commsManager.AssetCache.GetAsset(assetID);
136 if (asset == null) 136 if (asset == null)
137 { 137 {
138 asset = transactions.GetTransactionAsset(transactionID); 138 asset = transactions.GetTransactionAsset(transactionID);
139 addToCache = true; 139 addToCache = true;
140 } 140 }
141 141
142 if (asset != null) 142 if (asset != null)
143 { 143 {
144 if (asset.FullID == assetID) 144 if (asset.FullID == assetID)
145 { 145 {
146 asset.Name = item.inventoryName; 146 asset.Name = item.inventoryName;
147 asset.Description = item.inventoryDescription; 147 asset.Description = item.inventoryDescription;
148 asset.InvType = (sbyte) item.invType; 148 asset.InvType = (sbyte) item.invType;
149 asset.Type = (sbyte) item.assetType; 149 asset.Type = (sbyte) item.assetType;
150 item.assetID = asset.FullID; 150 item.assetID = asset.FullID;
151 151
152 if (addToCache) 152 if (addToCache)
153 { 153 {
154 commsManager.AssetCache.AddAsset(asset); 154 commsManager.AssetCache.AddAsset(asset);
155 } 155 }
156 156
157 userInfo.UpdateItem(remoteClient.AgentId, item); 157 userInfo.UpdateItem(remoteClient.AgentId, item);
158 } 158 }
159 } 159 }
160 } 160 }
161 } 161 }
162 } 162 }
163 } 163 }
164 } 164 }
165 165
166 /// <summary> 166 /// <summary>
167 /// temporary method to test out creating new inventory items 167 /// temporary method to test out creating new inventory items
168 /// </summary> 168 /// </summary>
169 /// <param name="remoteClient"></param> 169 /// <param name="remoteClient"></param>
170 /// <param name="transActionID"></param> 170 /// <param name="transActionID"></param>
171 /// <param name="folderID"></param> 171 /// <param name="folderID"></param>
172 /// <param name="callbackID"></param> 172 /// <param name="callbackID"></param>
173 /// <param name="description"></param> 173 /// <param name="description"></param>
174 /// <param name="name"></param> 174 /// <param name="name"></param>
175 /// <param name="invType"></param> 175 /// <param name="invType"></param>
176 /// <param name="type"></param> 176 /// <param name="type"></param>
177 /// <param name="wearableType"></param> 177 /// <param name="wearableType"></param>
178 /// <param name="nextOwnerMask"></param> 178 /// <param name="nextOwnerMask"></param>
179 public void CreateNewInventoryItem(IClientAPI remoteClient, LLUUID transActionID, LLUUID folderID, 179 public void CreateNewInventoryItem(IClientAPI remoteClient, LLUUID transActionID, LLUUID folderID,
180 uint callbackID, string description, string name, sbyte invType, sbyte type, 180 uint callbackID, string description, string name, sbyte invType, sbyte type,
181 byte wearableType, uint nextOwnerMask) 181 byte wearableType, uint nextOwnerMask)
182 { 182 {
183 if (transActionID == LLUUID.Zero) 183 if (transActionID == LLUUID.Zero)
184 { 184 {
185 CachedUserInfo userInfo = commsManager.UserProfileCache.GetUserDetails(remoteClient.AgentId); 185 CachedUserInfo userInfo = commsManager.UserProfileCache.GetUserDetails(remoteClient.AgentId);
186 if (userInfo != null) 186 if (userInfo != null)
187 { 187 {
188 AssetBase asset = new AssetBase(); 188 AssetBase asset = new AssetBase();
189 asset.Name = name; 189 asset.Name = name;
190 asset.Description = description; 190 asset.Description = description;
191 asset.InvType = invType; 191 asset.InvType = invType;
192 asset.Type = type; 192 asset.Type = type;
193 asset.FullID = LLUUID.Random(); 193 asset.FullID = LLUUID.Random();
194 asset.Data = new byte[1]; 194 asset.Data = new byte[1];
195 commsManager.AssetCache.AddAsset(asset); 195 commsManager.AssetCache.AddAsset(asset);
196 196
197 InventoryItemBase item = new InventoryItemBase(); 197 InventoryItemBase item = new InventoryItemBase();
198 item.avatarID = remoteClient.AgentId; 198 item.avatarID = remoteClient.AgentId;
199 item.creatorsID = remoteClient.AgentId; 199 item.creatorsID = remoteClient.AgentId;
200 item.inventoryID = LLUUID.Random(); 200 item.inventoryID = LLUUID.Random();
201 item.assetID = asset.FullID; 201 item.assetID = asset.FullID;
202 item.inventoryDescription = description; 202 item.inventoryDescription = description;
203 item.inventoryName = name; 203 item.inventoryName = name;
204 item.assetType = invType; 204 item.assetType = invType;
205 item.invType = invType; 205 item.invType = invType;
206 item.parentFolderID = folderID; 206 item.parentFolderID = folderID;
207 item.inventoryCurrentPermissions = 2147483647; 207 item.inventoryCurrentPermissions = 2147483647;
208 item.inventoryNextPermissions = nextOwnerMask; 208 item.inventoryNextPermissions = nextOwnerMask;
209 209
210 userInfo.AddItem(remoteClient.AgentId, item); 210 userInfo.AddItem(remoteClient.AgentId, item);
211 remoteClient.SendInventoryItemUpdate(item); 211 remoteClient.SendInventoryItemUpdate(item);
212 } 212 }
213 } 213 }
214 else 214 else
215 { 215 {
216 commsManager.TransactionsManager.HandleInventoryFromTransaction(remoteClient, transActionID, folderID, 216 commsManager.TransactionsManager.HandleInventoryFromTransaction(remoteClient, transActionID, folderID,
217 callbackID, description, name, invType, 217 callbackID, description, name, invType,
218 type, wearableType, nextOwnerMask); 218 type, wearableType, nextOwnerMask);
219 //System.Console.WriteLine("request to create inventory item from transaction " + transActionID); 219 //System.Console.WriteLine("request to create inventory item from transaction " + transActionID);
220 } 220 }
221 } 221 }
222 222
223 /// <summary> 223 /// <summary>
224 /// 224 ///
225 /// </summary> 225 /// </summary>
226 /// <param name="remoteClient"></param> 226 /// <param name="remoteClient"></param>
227 /// <param name="primLocalID"></param> 227 /// <param name="primLocalID"></param>
228 public void RequestTaskInventory(IClientAPI remoteClient, uint primLocalID) 228 public void RequestTaskInventory(IClientAPI remoteClient, uint primLocalID)
229 { 229 {
230 bool hasPrim = false; 230 bool hasPrim = false;
231 foreach (EntityBase ent in Entities.Values) 231 foreach (EntityBase ent in Entities.Values)
232 { 232 {
233 if (ent is SceneObjectGroup) 233 if (ent is SceneObjectGroup)
234 { 234 {
235 hasPrim = ((SceneObjectGroup) ent).HasChildPrim(primLocalID); 235 hasPrim = ((SceneObjectGroup) ent).HasChildPrim(primLocalID);
236 if (hasPrim != false) 236 if (hasPrim != false)
237 { 237 {
238 bool fileChange = ((SceneObjectGroup) ent).GetPartInventoryFileName(remoteClient, primLocalID); 238 bool fileChange = ((SceneObjectGroup) ent).GetPartInventoryFileName(remoteClient, primLocalID);
239 if (fileChange) 239 if (fileChange)
240 { 240 {
241 if (XferManager != null) 241 if (XferManager != null)
242 { 242 {
243 ((SceneObjectGroup) ent).RequestInventoryFile(primLocalID, XferManager); 243 ((SceneObjectGroup) ent).RequestInventoryFile(primLocalID, XferManager);
244 } 244 }
245 } 245 }
246 break; 246 break;
247 } 247 }
248 } 248 }
249 } 249 }
250 } 250 }
251 251
252 public void RemoveTaskInventory(IClientAPI remoteClient, LLUUID itemID, uint localID) 252 public void RemoveTaskInventory(IClientAPI remoteClient, LLUUID itemID, uint localID)
253 { 253 {
254 bool hasPrim = false; 254 bool hasPrim = false;
255 foreach (EntityBase ent in Entities.Values) 255 foreach (EntityBase ent in Entities.Values)
256 { 256 {
257 if (ent is SceneObjectGroup) 257 if (ent is SceneObjectGroup)
258 { 258 {
259 hasPrim = ((SceneObjectGroup) ent).HasChildPrim(localID); 259 hasPrim = ((SceneObjectGroup) ent).HasChildPrim(localID);
260 if (hasPrim != false) 260 if (hasPrim != false)
261 { 261 {
262 int type = ((SceneObjectGroup) ent).RemoveInventoryItem(remoteClient, localID, itemID); 262 int type = ((SceneObjectGroup) ent).RemoveInventoryItem(remoteClient, localID, itemID);
263 ((SceneObjectGroup) ent).GetProperites(remoteClient); 263 ((SceneObjectGroup) ent).GetProperites(remoteClient);
264 if (type == 10) 264 if (type == 10)
265 { 265 {
266 EventManager.TriggerRemoveScript(localID, itemID); 266 EventManager.TriggerRemoveScript(localID, itemID);
267 } 267 }
268 } 268 }
269 } 269 }
270 } 270 }
271 } 271 }
272 272
273 public void RezScript(IClientAPI remoteClient, LLUUID itemID, uint localID) 273 public void RezScript(IClientAPI remoteClient, LLUUID itemID, uint localID)
274 { 274 {
275 CachedUserInfo userInfo = commsManager.UserProfileCache.GetUserDetails(remoteClient.AgentId); 275 CachedUserInfo userInfo = commsManager.UserProfileCache.GetUserDetails(remoteClient.AgentId);
276 LLUUID copyID = LLUUID.Random(); 276 LLUUID copyID = LLUUID.Random();
277 if (userInfo != null) 277 if (userInfo != null)
278 { 278 {
279 if (userInfo.RootFolder != null) 279 if (userInfo.RootFolder != null)
280 { 280 {
281 InventoryItemBase item = userInfo.RootFolder.HasItem(itemID); 281 InventoryItemBase item = userInfo.RootFolder.HasItem(itemID);
282 if (item != null) 282 if (item != null)
283 { 283 {
284 bool isTexture = false; 284 bool isTexture = false;
285 bool rezzed = false; 285 bool rezzed = false;
286 if (item.invType == 0) 286 if (item.invType == 0)
287 { 287 {
288 isTexture = true; 288 isTexture = true;
289 } 289 }
290 AssetBase rezAsset = commsManager.AssetCache.GetAsset(item.assetID, isTexture); 290 AssetBase rezAsset = commsManager.AssetCache.GetAsset(item.assetID, isTexture);
291 if (rezAsset != null) 291 if (rezAsset != null)
292 { 292 {
293 string script = Util.FieldToString(rezAsset.Data); 293 string script = Util.FieldToString(rezAsset.Data);
294 //Console.WriteLine("rez script "+script); 294 //Console.WriteLine("rez script "+script);
295 EventManager.TriggerRezScript(localID, copyID, script); 295 EventManager.TriggerRezScript(localID, copyID, script);
296 rezzed = true; 296 rezzed = true;
297 } 297 }
298 else 298 else
299 { 299 {
300 //lets try once more incase the asset cache is being slow getting the asset from server 300 //lets try once more incase the asset cache is being slow getting the asset from server
301 rezAsset = commsManager.AssetCache.GetAsset(item.assetID, isTexture); 301 rezAsset = commsManager.AssetCache.GetAsset(item.assetID, isTexture);
302 if (rezAsset != null) 302 if (rezAsset != null)
303 { 303 {
304 string script = Util.FieldToString(rezAsset.Data); 304 string script = Util.FieldToString(rezAsset.Data);
305 // Console.WriteLine("rez script " + script); 305 // Console.WriteLine("rez script " + script);
306 EventManager.TriggerRezScript(localID, copyID, script); 306 EventManager.TriggerRezScript(localID, copyID, script);
307 rezzed = true; 307 rezzed = true;
308 } 308 }
309 } 309 }
310 310
311 if (rezzed) 311 if (rezzed)
312 { 312 {
313 bool hasPrim = false; 313 bool hasPrim = false;
314 foreach (EntityBase ent in Entities.Values) 314 foreach (EntityBase ent in Entities.Values)
315 { 315 {
316 if (ent is SceneObjectGroup) 316 if (ent is SceneObjectGroup)
317 { 317 {
318 hasPrim = ((SceneObjectGroup) ent).HasChildPrim(localID); 318 hasPrim = ((SceneObjectGroup) ent).HasChildPrim(localID);
319 if (hasPrim != false) 319 if (hasPrim != false)
320 { 320 {
321 bool added = 321 bool added =
322 ((SceneObjectGroup) ent).AddInventoryItem(remoteClient, localID, item, 322 ((SceneObjectGroup) ent).AddInventoryItem(remoteClient, localID, item,
323 copyID); 323 copyID);
324 ((SceneObjectGroup) ent).GetProperites(remoteClient); 324 ((SceneObjectGroup) ent).GetProperites(remoteClient);
325 } 325 }
326 } 326 }
327 } 327 }
328 } 328 }
329 } 329 }
330 } 330 }
331 } 331 }
332 } 332 }
333 333
334 /// <summary> 334 /// <summary>
335 /// 335 ///
336 /// </summary> 336 /// </summary>
337 /// <param name="packet"></param> 337 /// <param name="packet"></param>
338 /// <param name="simClient"></param> 338 /// <param name="simClient"></param>
339 public void DeRezObject(Packet packet, IClientAPI remoteClient) 339 public void DeRezObject(Packet packet, IClientAPI remoteClient)
340 { 340 {
341 DeRezObjectPacket DeRezPacket = (DeRezObjectPacket) packet; 341 DeRezObjectPacket DeRezPacket = (DeRezObjectPacket) packet;
342 342
343 if (DeRezPacket.AgentBlock.DestinationID == LLUUID.Zero) 343 if (DeRezPacket.AgentBlock.DestinationID == LLUUID.Zero)
344 { 344 {
345 //currently following code not used (or don't know of any case of destination being zero 345 //currently following code not used (or don't know of any case of destination being zero
346 } 346 }
347 else 347 else
348 { 348 {
349 foreach (DeRezObjectPacket.ObjectDataBlock Data in DeRezPacket.ObjectData) 349 foreach (DeRezObjectPacket.ObjectDataBlock Data in DeRezPacket.ObjectData)
350 { 350 {
351 EntityBase selectedEnt = null; 351 EntityBase selectedEnt = null;
352 //OpenSim.Framework.Console.MainConsole.Instance.WriteLine("LocalID:" + Data.ObjectLocalID.ToString()); 352 //OpenSim.Framework.Console.MainConsole.Instance.WriteLine("LocalID:" + Data.ObjectLocalID.ToString());
353 foreach (EntityBase ent in Entities.Values) 353 foreach (EntityBase ent in Entities.Values)
354 { 354 {
355 if (ent.LocalId == Data.ObjectLocalID) 355 if (ent.LocalId == Data.ObjectLocalID)
356 { 356 {
357 selectedEnt = ent; 357 selectedEnt = ent;
358 break; 358 break;
359 } 359 }
360 } 360 }
361 if (selectedEnt != null) 361 if (selectedEnt != null)
362 { 362 {
363 if (PermissionsMngr.CanDeRezObject(remoteClient.AgentId, ((SceneObjectGroup) selectedEnt).UUID)) 363 if (PermissionsMngr.CanDeRezObject(remoteClient.AgentId, ((SceneObjectGroup) selectedEnt).UUID))
364 { 364 {
365 string sceneObjectXml = ((SceneObjectGroup) selectedEnt).ToXmlString(); 365 string sceneObjectXml = ((SceneObjectGroup) selectedEnt).ToXmlString();
366 CachedUserInfo userInfo = commsManager.UserProfileCache.GetUserDetails(remoteClient.AgentId); 366 CachedUserInfo userInfo = commsManager.UserProfileCache.GetUserDetails(remoteClient.AgentId);
367 if (userInfo != null) 367 if (userInfo != null)
368 { 368 {
369 AssetBase asset = new AssetBase(); 369 AssetBase asset = new AssetBase();
370 asset.Name = ((SceneObjectGroup) selectedEnt).GetPartName(selectedEnt.LocalId); 370 asset.Name = ((SceneObjectGroup) selectedEnt).GetPartName(selectedEnt.LocalId);
371 asset.Description = 371 asset.Description =
372 ((SceneObjectGroup) selectedEnt).GetPartDescription(selectedEnt.LocalId); 372 ((SceneObjectGroup) selectedEnt).GetPartDescription(selectedEnt.LocalId);
373 asset.InvType = 6; 373 asset.InvType = 6;
374 asset.Type = 6; 374 asset.Type = 6;
375 asset.FullID = LLUUID.Random(); 375 asset.FullID = LLUUID.Random();
376 asset.Data = Helpers.StringToField(sceneObjectXml); 376 asset.Data = Helpers.StringToField(sceneObjectXml);
377 commsManager.AssetCache.AddAsset(asset); 377 commsManager.AssetCache.AddAsset(asset);
378 378
379 379
380 InventoryItemBase item = new InventoryItemBase(); 380 InventoryItemBase item = new InventoryItemBase();
381 item.avatarID = remoteClient.AgentId; 381 item.avatarID = remoteClient.AgentId;
382 item.creatorsID = remoteClient.AgentId; 382 item.creatorsID = remoteClient.AgentId;
383 item.inventoryID = LLUUID.Random(); 383 item.inventoryID = LLUUID.Random();
384 item.assetID = asset.FullID; 384 item.assetID = asset.FullID;
385 item.inventoryDescription = asset.Description; 385 item.inventoryDescription = asset.Description;
386 item.inventoryName = asset.Name; 386 item.inventoryName = asset.Name;
387 item.assetType = asset.Type; 387 item.assetType = asset.Type;
388 item.invType = asset.InvType; 388 item.invType = asset.InvType;
389 item.parentFolderID = DeRezPacket.AgentBlock.DestinationID; 389 item.parentFolderID = DeRezPacket.AgentBlock.DestinationID;
390 item.inventoryCurrentPermissions = 2147483647; 390 item.inventoryCurrentPermissions = 2147483647;
391 item.inventoryNextPermissions = 2147483647; 391 item.inventoryNextPermissions = 2147483647;
392 392
393 userInfo.AddItem(remoteClient.AgentId, item); 393 userInfo.AddItem(remoteClient.AgentId, item);
394 remoteClient.SendInventoryItemUpdate(item); 394 remoteClient.SendInventoryItemUpdate(item);
395 } 395 }
396 396
397 SceneObjectPart rootPart = 397 DeleteSceneObjectGroup((SceneObjectGroup)selectedEnt);
398 ((SceneObjectGroup) selectedEnt).GetChildPart(((SceneObjectGroup) selectedEnt).UUID); 398 }
399 if (rootPart.PhysActor != null) 399 }
400 { 400 }
401 phyScene.RemovePrim(rootPart.PhysActor); 401 }
402 rootPart.PhysActor = null; 402 }
403 } 403
404 404 public void DeleteSceneObjectGroup(SceneObjectGroup group)
405 storageManager.DataStore.RemoveObject(((SceneObjectGroup) selectedEnt).UUID, 405 {
406 m_regInfo.RegionID); 406 SceneObjectPart rootPart = (group).GetChildPart(group.UUID);
407 ((SceneObjectGroup) selectedEnt).DeleteGroup(); 407 if (rootPart.PhysActor != null)
408 408 {
409 lock (Entities) 409 phyScene.RemovePrim(rootPart.PhysActor);
410 { 410 rootPart.PhysActor = null;
411 Entities.Remove(((SceneObjectGroup) selectedEnt).UUID); 411 }
412 } 412
413 ((SceneObjectGroup) selectedEnt).DeleteParts(); 413 storageManager.DataStore.RemoveObject(group.UUID, m_regInfo.RegionID);
414 } 414 group.DeleteGroup();
415 } 415
416 } 416 lock (Entities)
417 } 417 {
418 } 418 Entities.Remove(group.UUID);
419 419 }
420 public void RezObject(IClientAPI remoteClient, LLUUID itemID, LLVector3 pos) 420 group.DeleteParts();
421 { 421 }
422 CachedUserInfo userInfo = commsManager.UserProfileCache.GetUserDetails(remoteClient.AgentId); 422
423 if (userInfo != null) 423 public void RezObject(IClientAPI remoteClient, LLUUID itemID, LLVector3 pos)
424 { 424 {
425 if (userInfo.RootFolder != null) 425 CachedUserInfo userInfo = commsManager.UserProfileCache.GetUserDetails(remoteClient.AgentId);
426 { 426 if (userInfo != null)
427 InventoryItemBase item = userInfo.RootFolder.HasItem(itemID); 427 {
428 if (item != null) 428 if (userInfo.RootFolder != null)
429 { 429 {
430 AssetBase rezAsset = commsManager.AssetCache.GetAsset(item.assetID, false); 430 InventoryItemBase item = userInfo.RootFolder.HasItem(itemID);
431 if (rezAsset != null) 431 if (item != null)
432 { 432 {
433 AddRezObject(Util.FieldToString(rezAsset.Data), pos); 433 AssetBase rezAsset = commsManager.AssetCache.GetAsset(item.assetID, false);
434 userInfo.DeleteItem(remoteClient.AgentId, item); 434 if (rezAsset != null)
435 remoteClient.SendRemoveInventoryItem(itemID); 435 {
436 } 436 AddRezObject(Util.FieldToString(rezAsset.Data), pos);
437 else 437 userInfo.DeleteItem(remoteClient.AgentId, item);
438 { 438 remoteClient.SendRemoveInventoryItem(itemID);
439 //lets try once more incase the asset cache is being slow getting the asset from server 439 }
440 rezAsset = commsManager.AssetCache.GetAsset(item.assetID, false); 440 else
441 if (rezAsset != null) 441 {
442 { 442 //lets try once more incase the asset cache is being slow getting the asset from server
443 AddRezObject(Util.FieldToString(rezAsset.Data), pos); 443 rezAsset = commsManager.AssetCache.GetAsset(item.assetID, false);
444 userInfo.DeleteItem(remoteClient.AgentId, item); 444 if (rezAsset != null)
445 remoteClient.SendRemoveInventoryItem(itemID); 445 {
446 } 446 AddRezObject(Util.FieldToString(rezAsset.Data), pos);
447 } 447 userInfo.DeleteItem(remoteClient.AgentId, item);
448 } 448 remoteClient.SendRemoveInventoryItem(itemID);
449 } 449 }
450 } 450 }
451 } 451 }
452 452 }
453 private void AddRezObject(string xmlData, LLVector3 pos) 453 }
454 { 454 }
455 SceneObjectGroup group = new SceneObjectGroup(this, m_regionHandle, xmlData); 455
456 AddEntity(group); 456 private void AddRezObject(string xmlData, LLVector3 pos)
457 group.AbsolutePosition = pos; 457 {
458 SceneObjectPart rootPart = group.GetChildPart(group.UUID); 458 SceneObjectGroup group = new SceneObjectGroup(this, m_regionHandle, xmlData);
459 if ((rootPart.ObjectFlags & (uint) LLObject.ObjectFlags.Phantom) == 0) 459 AddEntity(group);
460 { 460 group.AbsolutePosition = pos;
461 PrimitiveBaseShape pbs = rootPart.Shape; 461 SceneObjectPart rootPart = group.GetChildPart(group.UUID);
462 rootPart.PhysActor = phyScene.AddPrimShape( 462 if ((rootPart.ObjectFlags & (uint) LLObject.ObjectFlags.Phantom) == 0)
463 rootPart.Name, 463 {
464 pbs, 464 PrimitiveBaseShape pbs = rootPart.Shape;
465 new PhysicsVector(rootPart.AbsolutePosition.X, rootPart.AbsolutePosition.Y, 465 rootPart.PhysActor = phyScene.AddPrimShape(
466 rootPart.AbsolutePosition.Z), 466 rootPart.Name,
467 new PhysicsVector(rootPart.Scale.X, rootPart.Scale.Y, rootPart.Scale.Z), 467 pbs,
468 new Quaternion(rootPart.RotationOffset.W, rootPart.RotationOffset.X, 468 new PhysicsVector(rootPart.AbsolutePosition.X, rootPart.AbsolutePosition.Y,
469 rootPart.RotationOffset.Y, rootPart.RotationOffset.Z)); 469 rootPart.AbsolutePosition.Z),
470 } 470 new PhysicsVector(rootPart.Scale.X, rootPart.Scale.Y, rootPart.Scale.Z),
471 } 471 new Quaternion(rootPart.RotationOffset.W, rootPart.RotationOffset.X,
472 } 472 rootPart.RotationOffset.Y, rootPart.RotationOffset.Z));
473} 473 }
474 }
475 }
476}
diff --git a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs
index 21edbac..1839051 100644
--- a/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs
+++ b/OpenSim/Region/Environment/Scenes/SceneObjectGroup.cs
@@ -270,26 +270,31 @@ namespace OpenSim.Region.Environment.Scenes
270 StringReader sr = new StringReader(xmlData); 270 StringReader sr = new StringReader(xmlData);
271 XmlTextReader reader = new XmlTextReader(sr); 271 XmlTextReader reader = new XmlTextReader(sr);
272 reader.Read(); 272 reader.Read();
273
273 reader.ReadStartElement("SceneObjectGroup"); 274 reader.ReadStartElement("SceneObjectGroup");
274 // reader.ReadStartElement("RootPart"); 275 // reader.ReadStartElement("RootPart");
275 m_rootPart = SceneObjectPart.FromXml(reader); 276 m_rootPart = SceneObjectPart.FromXml(reader);
276 //reader.ReadEndElement();
277 277
278 while (reader.Read()) 278 reader.Read();
279 bool more = true;
280
281 while (more)
279 { 282 {
280 switch (reader.NodeType) 283 switch (reader.NodeType)
281 { 284 {
282 case XmlNodeType.Element: 285 case XmlNodeType.Element:
283 if (reader.Name == "SceneObjectPart") 286 if (reader.Name == "SceneObjectPart")
284 { 287 {
285 // reader.Read();
286 SceneObjectPart Part = SceneObjectPart.FromXml(reader); 288 SceneObjectPart Part = SceneObjectPart.FromXml(reader);
287 AddPart(Part); 289 AddPart(Part);
290
288 } 291 }
289 break; 292 break;
290 case XmlNodeType.EndElement: 293 case XmlNodeType.EndElement:
294 reader.Read();
291 break; 295 break;
292 } 296 }
297 more = !reader.EOF;
293 } 298 }
294 reader.Close(); 299 reader.Close();
295 sr.Close(); 300 sr.Close();