diff options
Diffstat (limited to '')
-rw-r--r-- | OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | 185 |
1 files changed, 155 insertions, 30 deletions
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs index d2e41f8..cba75f1 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | |||
@@ -31,6 +31,7 @@ using System.Collections; | |||
31 | using System.Reflection; | 31 | using System.Reflection; |
32 | using System.Text; | 32 | using System.Text; |
33 | using System.Timers; | 33 | using System.Timers; |
34 | using System.Xml; | ||
34 | using OpenMetaverse; | 35 | using OpenMetaverse; |
35 | using OpenMetaverse.Packets; | 36 | using OpenMetaverse.Packets; |
36 | using log4net; | 37 | using log4net; |
@@ -139,7 +140,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
139 | { | 140 | { |
140 | userlevel = 1; | 141 | userlevel = 1; |
141 | } | 142 | } |
142 | EventManager.TriggerOnNewInventoryItemUploadComplete(item.Owner, item.AssetID, item.Name, userlevel); | 143 | EventManager.TriggerOnNewInventoryItemUploadComplete(item.Owner, (AssetType)item.AssetType, item.AssetID, item.Name, userlevel); |
143 | 144 | ||
144 | return true; | 145 | return true; |
145 | } | 146 | } |
@@ -178,7 +179,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
178 | { | 179 | { |
179 | userlevel = 1; | 180 | userlevel = 1; |
180 | } | 181 | } |
181 | EventManager.TriggerOnNewInventoryItemUploadComplete(item.Owner, item.AssetID, item.Name, userlevel); | 182 | EventManager.TriggerOnNewInventoryItemUploadComplete(item.Owner, (AssetType)item.AssetType, item.AssetID, item.Name, userlevel); |
182 | 183 | ||
183 | if (originalFolder != UUID.Zero) | 184 | if (originalFolder != UUID.Zero) |
184 | { | 185 | { |
@@ -411,19 +412,21 @@ namespace OpenSim.Region.Framework.Scenes | |||
411 | // itemUpd.NextPermissions, itemUpd.GroupPermissions, itemUpd.EveryOnePermissions, item.Flags, | 412 | // itemUpd.NextPermissions, itemUpd.GroupPermissions, itemUpd.EveryOnePermissions, item.Flags, |
412 | // item.NextPermissions, item.GroupPermissions, item.EveryOnePermissions, item.CurrentPermissions); | 413 | // item.NextPermissions, item.GroupPermissions, item.EveryOnePermissions, item.CurrentPermissions); |
413 | 414 | ||
415 | bool sendUpdate = false; | ||
416 | |||
414 | if (itemUpd.NextPermissions != 0) // Use this to determine validity. Can never be 0 if valid | 417 | if (itemUpd.NextPermissions != 0) // Use this to determine validity. Can never be 0 if valid |
415 | { | 418 | { |
416 | // Create a set of base permissions that will not include export if the user | 419 | // Create a set of base permissions that will not include export if the user |
417 | // is not allowed to change the export flag. | 420 | // is not allowed to change the export flag. |
418 | bool denyExportChange = false; | 421 | bool denyExportChange = false; |
419 | 422 | ||
420 | m_log.InfoFormat("[XXX]: B: {0} O: {1} E: {2}", itemUpd.BasePermissions, itemUpd.CurrentPermissions, itemUpd.EveryOnePermissions); | 423 | // m_log.DebugFormat("[XXX]: B: {0} O: {1} E: {2}", itemUpd.BasePermissions, itemUpd.CurrentPermissions, itemUpd.EveryOnePermissions); |
421 | 424 | ||
422 | // If the user is not the creator or doesn't have "E" in both "B" and "O", deny setting export | 425 | // If the user is not the creator or doesn't have "E" in both "B" and "O", deny setting export |
423 | if ((item.BasePermissions & (uint)(PermissionMask.All | PermissionMask.Export)) != (uint)(PermissionMask.All | PermissionMask.Export) || (item.CurrentPermissions & (uint)PermissionMask.Export) == 0 || item.CreatorIdAsUuid != item.Owner) | 426 | if ((item.BasePermissions & (uint)(PermissionMask.All | PermissionMask.Export)) != (uint)(PermissionMask.All | PermissionMask.Export) || (item.CurrentPermissions & (uint)PermissionMask.Export) == 0 || item.CreatorIdAsUuid != item.Owner) |
424 | denyExportChange = true; | 427 | denyExportChange = true; |
425 | 428 | ||
426 | m_log.InfoFormat("[XXX]: Deny Export Update {0}", denyExportChange); | 429 | // m_log.DebugFormat("[XXX]: Deny Export Update {0}", denyExportChange); |
427 | 430 | ||
428 | // If it is already set, force it set and also force full perm | 431 | // If it is already set, force it set and also force full perm |
429 | // else prevent setting it. It can and should never be set unless | 432 | // else prevent setting it. It can and should never be set unless |
@@ -447,7 +450,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
447 | // If the new state is exportable, force full perm | 450 | // If the new state is exportable, force full perm |
448 | if ((itemUpd.EveryOnePermissions & (uint)PermissionMask.Export) != 0) | 451 | if ((itemUpd.EveryOnePermissions & (uint)PermissionMask.Export) != 0) |
449 | { | 452 | { |
450 | m_log.InfoFormat("[XXX]: Force full perm"); | 453 | // m_log.DebugFormat("[XXX]: Force full perm"); |
451 | itemUpd.NextPermissions = (uint)(PermissionMask.All); | 454 | itemUpd.NextPermissions = (uint)(PermissionMask.All); |
452 | } | 455 | } |
453 | } | 456 | } |
@@ -484,8 +487,13 @@ namespace OpenSim.Region.Framework.Scenes | |||
484 | item.SalePrice = itemUpd.SalePrice; | 487 | item.SalePrice = itemUpd.SalePrice; |
485 | item.SaleType = itemUpd.SaleType; | 488 | item.SaleType = itemUpd.SaleType; |
486 | 489 | ||
490 | if (item.InvType == (int)InventoryType.Wearable && (item.Flags & 0xf) == 0 && (itemUpd.Flags & 0xf) != 0) | ||
491 | { | ||
492 | item.Flags = (uint)(item.Flags & 0xfffffff0) | (itemUpd.Flags & 0xf); | ||
493 | sendUpdate = true; | ||
494 | } | ||
495 | |||
487 | InventoryService.UpdateItem(item); | 496 | InventoryService.UpdateItem(item); |
488 | remoteClient.SendBulkUpdateInventory(item); | ||
489 | } | 497 | } |
490 | 498 | ||
491 | if (UUID.Zero != transactionID) | 499 | if (UUID.Zero != transactionID) |
@@ -495,6 +503,17 @@ namespace OpenSim.Region.Framework.Scenes | |||
495 | AgentTransactionsModule.HandleItemUpdateFromTransaction(remoteClient, transactionID, item); | 503 | AgentTransactionsModule.HandleItemUpdateFromTransaction(remoteClient, transactionID, item); |
496 | } | 504 | } |
497 | } | 505 | } |
506 | else | ||
507 | { | ||
508 | // This MAY be problematic, if it is, another solution | ||
509 | // needs to be found. If inventory item flags are updated | ||
510 | // the viewer's notion of the item needs to be refreshed. | ||
511 | // | ||
512 | // In other situations we cannot send out a bulk update here, since this will cause editing of clothing to start | ||
513 | // failing frequently. Possibly this is a race with a separate transaction that uploads the asset. | ||
514 | if (sendUpdate) | ||
515 | remoteClient.SendBulkUpdateInventory(item); | ||
516 | } | ||
498 | } | 517 | } |
499 | else | 518 | else |
500 | { | 519 | { |
@@ -548,6 +567,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
548 | { | 567 | { |
549 | //Console.WriteLine("Scene.Inventory.cs: GiveInventoryItem"); | 568 | //Console.WriteLine("Scene.Inventory.cs: GiveInventoryItem"); |
550 | 569 | ||
570 | if (!Permissions.CanTransferUserInventory(itemId, senderId, recipient)) | ||
571 | return null; | ||
572 | |||
551 | InventoryItemBase item = new InventoryItemBase(itemId, senderId); | 573 | InventoryItemBase item = new InventoryItemBase(itemId, senderId); |
552 | item = InventoryService.GetItem(item); | 574 | item = InventoryService.GetItem(item); |
553 | 575 | ||
@@ -642,17 +664,13 @@ namespace OpenSim.Region.Framework.Scenes | |||
642 | // a mask | 664 | // a mask |
643 | if (item.InvType == (int)InventoryType.Object) | 665 | if (item.InvType == (int)InventoryType.Object) |
644 | { | 666 | { |
645 | // Create a safe mask for the current perms | ||
646 | uint foldedPerms = (item.CurrentPermissions & 7) << 13; | ||
647 | foldedPerms |= permsMask; | ||
648 | |||
649 | bool isRootMod = (item.CurrentPermissions & | 667 | bool isRootMod = (item.CurrentPermissions & |
650 | (uint)PermissionMask.Modify) != 0 ? | 668 | (uint)PermissionMask.Modify) != 0 ? |
651 | true : false; | 669 | true : false; |
652 | 670 | ||
653 | // Mask the owner perms to the folded perms | 671 | // Mask the owner perms to the folded perms |
654 | ownerPerms &= foldedPerms; | 672 | PermissionsUtil.ApplyFoldedPermissions(item.CurrentPermissions, ref ownerPerms); |
655 | basePerms &= foldedPerms; | 673 | PermissionsUtil.ApplyFoldedPermissions(item.CurrentPermissions, ref basePerms); |
656 | 674 | ||
657 | // If the root was mod, let the mask reflect that | 675 | // If the root was mod, let the mask reflect that |
658 | // We also need to adjust the base here, because | 676 | // We also need to adjust the base here, because |
@@ -1213,9 +1231,16 @@ namespace OpenSim.Region.Framework.Scenes | |||
1213 | { | 1231 | { |
1214 | agentItem.BasePermissions = taskItem.BasePermissions & (taskItem.NextPermissions | (uint)PermissionMask.Move); | 1232 | agentItem.BasePermissions = taskItem.BasePermissions & (taskItem.NextPermissions | (uint)PermissionMask.Move); |
1215 | if (taskItem.InvType == (int)InventoryType.Object) | 1233 | if (taskItem.InvType == (int)InventoryType.Object) |
1216 | agentItem.CurrentPermissions = agentItem.BasePermissions & (((taskItem.CurrentPermissions & 7) << 13) | (taskItem.CurrentPermissions & (uint)PermissionMask.Move)); | 1234 | { |
1235 | uint perms = taskItem.CurrentPermissions; | ||
1236 | PermissionsUtil.ApplyFoldedPermissions(taskItem.CurrentPermissions, ref perms); | ||
1237 | agentItem.BasePermissions = perms | (uint)PermissionMask.Move; | ||
1238 | agentItem.CurrentPermissions = agentItem.BasePermissions; | ||
1239 | } | ||
1217 | else | 1240 | else |
1241 | { | ||
1218 | agentItem.CurrentPermissions = agentItem.BasePermissions & taskItem.CurrentPermissions; | 1242 | agentItem.CurrentPermissions = agentItem.BasePermissions & taskItem.CurrentPermissions; |
1243 | } | ||
1219 | 1244 | ||
1220 | agentItem.Flags |= (uint)InventoryItemFlags.ObjectSlamPerm; | 1245 | agentItem.Flags |= (uint)InventoryItemFlags.ObjectSlamPerm; |
1221 | agentItem.NextPermissions = taskItem.NextPermissions; | 1246 | agentItem.NextPermissions = taskItem.NextPermissions; |
@@ -2124,7 +2149,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
2124 | { | 2149 | { |
2125 | // If we don't have permission, stop right here | 2150 | // If we don't have permission, stop right here |
2126 | if (!permissionToTakeCopy) | 2151 | if (!permissionToTakeCopy) |
2152 | { | ||
2153 | remoteClient.SendAlertMessage("You don't have permission to take the object"); | ||
2127 | return; | 2154 | return; |
2155 | } | ||
2128 | 2156 | ||
2129 | permissionToTake = true; | 2157 | permissionToTake = true; |
2130 | // Don't delete | 2158 | // Don't delete |
@@ -2277,6 +2305,85 @@ namespace OpenSim.Region.Framework.Scenes | |||
2277 | } | 2305 | } |
2278 | 2306 | ||
2279 | /// <summary> | 2307 | /// <summary> |
2308 | /// Returns the list of Scene Objects in an asset. | ||
2309 | /// </summary> | ||
2310 | /// <remarks> | ||
2311 | /// Returns one object if the asset is a regular object, and multiple objects for a coalesced object. | ||
2312 | /// </remarks> | ||
2313 | /// <param name="assetData">Asset data</param> | ||
2314 | /// <param name="attachment">Whether the item is an attachment</param> | ||
2315 | /// <param name="objlist">The objects included in the asset</param> | ||
2316 | /// <param name="veclist">Relative positions of the objects</param> | ||
2317 | /// <param name="bbox">Bounding box of all the objects</param> | ||
2318 | /// <param name="offsetHeight">Offset in the Z axis from the centre of the bounding box | ||
2319 | /// to the centre of the root prim (relevant only when returning a single object)</param> | ||
2320 | /// <returns>true = returning a single object; false = multiple objects</returns> | ||
2321 | public bool GetObjectsToRez(byte[] assetData, bool attachment, out List<SceneObjectGroup> objlist, out List<Vector3> veclist, | ||
2322 | out Vector3 bbox, out float offsetHeight) | ||
2323 | { | ||
2324 | objlist = new List<SceneObjectGroup>(); | ||
2325 | veclist = new List<Vector3>(); | ||
2326 | |||
2327 | XmlDocument doc = new XmlDocument(); | ||
2328 | string xmlData = Utils.BytesToString(assetData); | ||
2329 | doc.LoadXml(xmlData); | ||
2330 | XmlElement e = (XmlElement)doc.SelectSingleNode("/CoalescedObject"); | ||
2331 | |||
2332 | if (e == null || attachment) // Single | ||
2333 | { | ||
2334 | SceneObjectGroup g = SceneObjectSerializer.FromOriginalXmlFormat(xmlData); | ||
2335 | |||
2336 | g.RootPart.AttachPoint = g.RootPart.Shape.State; | ||
2337 | g.RootPart.AttachOffset = g.AbsolutePosition; | ||
2338 | g.RootPart.AttachRotation = g.GroupRotation; | ||
2339 | if (g.RootPart.Shape.PCode != (byte)PCode.NewTree && | ||
2340 | g.RootPart.Shape.PCode != (byte)PCode.Tree) | ||
2341 | g.RootPart.Shape.State = 0; | ||
2342 | |||
2343 | objlist.Add(g); | ||
2344 | veclist.Add(new Vector3(0, 0, 0)); | ||
2345 | bbox = g.GetAxisAlignedBoundingBox(out offsetHeight); | ||
2346 | return true; | ||
2347 | } | ||
2348 | else | ||
2349 | { | ||
2350 | XmlElement coll = (XmlElement)e; | ||
2351 | float bx = Convert.ToSingle(coll.GetAttribute("x")); | ||
2352 | float by = Convert.ToSingle(coll.GetAttribute("y")); | ||
2353 | float bz = Convert.ToSingle(coll.GetAttribute("z")); | ||
2354 | bbox = new Vector3(bx, by, bz); | ||
2355 | offsetHeight = 0; | ||
2356 | |||
2357 | XmlNodeList groups = e.SelectNodes("SceneObjectGroup"); | ||
2358 | foreach (XmlNode n in groups) | ||
2359 | { | ||
2360 | SceneObjectGroup g = SceneObjectSerializer.FromOriginalXmlFormat(n.OuterXml); | ||
2361 | |||
2362 | g.RootPart.AttachPoint = g.RootPart.Shape.State; | ||
2363 | g.RootPart.AttachOffset = g.AbsolutePosition; | ||
2364 | g.RootPart.AttachRotation = g.GroupRotation; | ||
2365 | if (g.RootPart.Shape.PCode != (byte)PCode.NewTree && | ||
2366 | g.RootPart.Shape.PCode != (byte)PCode.Tree) | ||
2367 | g.RootPart.Shape.State = 0; | ||
2368 | |||
2369 | objlist.Add(g); | ||
2370 | |||
2371 | XmlElement el = (XmlElement)n; | ||
2372 | string rawX = el.GetAttribute("offsetx"); | ||
2373 | string rawY = el.GetAttribute("offsety"); | ||
2374 | string rawZ = el.GetAttribute("offsetz"); | ||
2375 | |||
2376 | float x = Convert.ToSingle(rawX); | ||
2377 | float y = Convert.ToSingle(rawY); | ||
2378 | float z = Convert.ToSingle(rawZ); | ||
2379 | veclist.Add(new Vector3(x, y, z)); | ||
2380 | } | ||
2381 | } | ||
2382 | |||
2383 | return false; | ||
2384 | } | ||
2385 | |||
2386 | /// <summary> | ||
2280 | /// Event Handler Rez an object into a scene | 2387 | /// Event Handler Rez an object into a scene |
2281 | /// Calls the non-void event handler | 2388 | /// Calls the non-void event handler |
2282 | /// </summary> | 2389 | /// </summary> |
@@ -2351,19 +2458,25 @@ namespace OpenSim.Region.Framework.Scenes | |||
2351 | /// will be used if it exists.</param> | 2458 | /// will be used if it exists.</param> |
2352 | /// <param name="vel">The velocity of the rezzed object.</param> | 2459 | /// <param name="vel">The velocity of the rezzed object.</param> |
2353 | /// <param name="param"></param> | 2460 | /// <param name="param"></param> |
2354 | /// <returns>The SceneObjectGroup rezzed or null if rez was unsuccessful</returns> | 2461 | /// <returns>The SceneObjectGroup(s) rezzed, or null if rez was unsuccessful</returns> |
2355 | public virtual SceneObjectGroup RezObject( | 2462 | public virtual List<SceneObjectGroup> RezObject( |
2356 | SceneObjectPart sourcePart, TaskInventoryItem item, Vector3 pos, Quaternion? rot, Vector3 vel, int param) | 2463 | SceneObjectPart sourcePart, TaskInventoryItem item, Vector3 pos, Quaternion? rot, Vector3 vel, int param) |
2357 | { | 2464 | { |
2358 | if (null == item) | 2465 | if (null == item) |
2359 | return null; | 2466 | return null; |
2467 | |||
2468 | List<SceneObjectGroup> objlist; | ||
2469 | List<Vector3> veclist; | ||
2360 | 2470 | ||
2361 | SceneObjectGroup group = sourcePart.Inventory.GetRezReadySceneObject(item); | 2471 | bool success = sourcePart.Inventory.GetRezReadySceneObjects(item, out objlist, out veclist); |
2362 | 2472 | if (!success) | |
2363 | if (null == group) | ||
2364 | return null; | 2473 | return null; |
2365 | 2474 | ||
2366 | if (!Permissions.CanRezObject(group.PrimCount, item.OwnerID, pos)) | 2475 | int totalPrims = 0; |
2476 | foreach (SceneObjectGroup group in objlist) | ||
2477 | totalPrims += group.PrimCount; | ||
2478 | |||
2479 | if (!Permissions.CanRezObject(totalPrims, item.OwnerID, pos)) | ||
2367 | return null; | 2480 | return null; |
2368 | 2481 | ||
2369 | if (!Permissions.BypassPermissions()) | 2482 | if (!Permissions.BypassPermissions()) |
@@ -2372,16 +2485,28 @@ namespace OpenSim.Region.Framework.Scenes | |||
2372 | sourcePart.Inventory.RemoveInventoryItem(item.ItemID); | 2485 | sourcePart.Inventory.RemoveInventoryItem(item.ItemID); |
2373 | } | 2486 | } |
2374 | 2487 | ||
2375 | group.FromPartID = sourcePart.UUID; | 2488 | for (int i = 0; i < objlist.Count; i++) |
2376 | AddNewSceneObject(group, true, pos, rot, vel); | 2489 | { |
2377 | 2490 | SceneObjectGroup group = objlist[i]; | |
2378 | // We can only call this after adding the scene object, since the scene object references the scene | 2491 | Vector3 curpos = pos + veclist[i]; |
2379 | // to find out if scripts should be activated at all. | 2492 | |
2380 | group.CreateScriptInstances(param, true, DefaultScriptEngine, 3); | 2493 | if (group.IsAttachment == false && group.RootPart.Shape.State != 0) |
2381 | 2494 | { | |
2382 | group.ScheduleGroupForFullUpdate(); | 2495 | group.RootPart.AttachedPos = group.AbsolutePosition; |
2383 | 2496 | group.RootPart.Shape.LastAttachPoint = (byte)group.AttachmentPoint; | |
2384 | return group; | 2497 | } |
2498 | |||
2499 | group.FromPartID = sourcePart.UUID; | ||
2500 | AddNewSceneObject(group, true, curpos, rot, vel); | ||
2501 | |||
2502 | // We can only call this after adding the scene object, since the scene object references the scene | ||
2503 | // to find out if scripts should be activated at all. | ||
2504 | group.CreateScriptInstances(param, true, DefaultScriptEngine, 3); | ||
2505 | |||
2506 | group.ScheduleGroupForFullUpdate(); | ||
2507 | } | ||
2508 | |||
2509 | return objlist; | ||
2385 | } | 2510 | } |
2386 | 2511 | ||
2387 | public virtual bool returnObjects(SceneObjectGroup[] returnobjects, | 2512 | public virtual bool returnObjects(SceneObjectGroup[] returnobjects, |