diff options
Merge branch 'master' into careminster-presence-refactor
This was rather conflicted. Please test linking.
Diffstat (limited to 'OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs')
-rw-r--r-- | OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs | 69 |
1 files changed, 67 insertions, 2 deletions
diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs index 8b4f0ed..10931b7 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs | |||
@@ -37,6 +37,7 @@ using log4net; | |||
37 | using OpenSim.Framework; | 37 | using OpenSim.Framework; |
38 | using OpenSim.Region.Framework.Interfaces; | 38 | using OpenSim.Region.Framework.Interfaces; |
39 | using OpenSim.Region.Framework.Scenes.Scripting; | 39 | using OpenSim.Region.Framework.Scenes.Scripting; |
40 | using OpenSim.Region.Framework.Scenes.Serialization; | ||
40 | 41 | ||
41 | namespace OpenSim.Region.Framework.Scenes | 42 | namespace OpenSim.Region.Framework.Scenes |
42 | { | 43 | { |
@@ -722,6 +723,71 @@ namespace OpenSim.Region.Framework.Scenes | |||
722 | return items; | 723 | return items; |
723 | } | 724 | } |
724 | 725 | ||
726 | public SceneObjectGroup GetRezReadySceneObject(TaskInventoryItem item) | ||
727 | { | ||
728 | UUID ownerID = item.OwnerID; | ||
729 | AssetBase rezAsset = m_part.ParentGroup.Scene.AssetService.Get(item.AssetID.ToString()); | ||
730 | |||
731 | if (null == rezAsset) | ||
732 | { | ||
733 | m_log.WarnFormat( | ||
734 | "[PRIM INVENTORY]: Could not find asset {0} for inventory item {1} in {2}", | ||
735 | item.AssetID, item.Name, m_part.Name); | ||
736 | return null; | ||
737 | } | ||
738 | |||
739 | string xmlData = Utils.BytesToString(rezAsset.Data); | ||
740 | SceneObjectGroup group = SceneObjectSerializer.FromOriginalXmlFormat(xmlData); | ||
741 | |||
742 | group.ResetIDs(); | ||
743 | |||
744 | SceneObjectPart rootPart = group.GetChildPart(group.UUID); | ||
745 | |||
746 | // Since renaming the item in the inventory does not affect the name stored | ||
747 | // in the serialization, transfer the correct name from the inventory to the | ||
748 | // object itself before we rez. | ||
749 | rootPart.Name = item.Name; | ||
750 | rootPart.Description = item.Description; | ||
751 | |||
752 | List<SceneObjectPart> partList = null; | ||
753 | |||
754 | lock (group.Children) | ||
755 | partList = new List<SceneObjectPart>(group.Children.Values); | ||
756 | |||
757 | group.SetGroup(m_part.GroupID, null); | ||
758 | |||
759 | if ((rootPart.OwnerID != item.OwnerID) || (item.CurrentPermissions & 16) != 0) | ||
760 | { | ||
761 | if (m_part.ParentGroup.Scene.Permissions.PropagatePermissions()) | ||
762 | { | ||
763 | foreach (SceneObjectPart part in partList) | ||
764 | { | ||
765 | part.EveryoneMask = item.EveryonePermissions; | ||
766 | part.NextOwnerMask = item.NextPermissions; | ||
767 | } | ||
768 | |||
769 | group.ApplyNextOwnerPermissions(); | ||
770 | } | ||
771 | } | ||
772 | |||
773 | foreach (SceneObjectPart part in partList) | ||
774 | { | ||
775 | if ((part.OwnerID != item.OwnerID) || (item.CurrentPermissions & 16) != 0) | ||
776 | { | ||
777 | part.LastOwnerID = part.OwnerID; | ||
778 | part.OwnerID = item.OwnerID; | ||
779 | part.Inventory.ChangeInventoryOwner(item.OwnerID); | ||
780 | } | ||
781 | |||
782 | part.EveryoneMask = item.EveryonePermissions; | ||
783 | part.NextOwnerMask = item.NextPermissions; | ||
784 | } | ||
785 | |||
786 | rootPart.TrimPermissions(); | ||
787 | |||
788 | return group; | ||
789 | } | ||
790 | |||
725 | /// <summary> | 791 | /// <summary> |
726 | /// Update an existing inventory item. | 792 | /// Update an existing inventory item. |
727 | /// </summary> | 793 | /// </summary> |
@@ -1197,6 +1263,5 @@ namespace OpenSim.Region.Framework.Scenes | |||
1197 | 1263 | ||
1198 | Items.LockItemsForRead(false); | 1264 | Items.LockItemsForRead(false); |
1199 | } | 1265 | } |
1200 | |||
1201 | } | 1266 | } |
1202 | } | 1267 | } \ No newline at end of file |