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