diff options
Diffstat (limited to 'OpenSim/Region/Framework/Scenes/Scene.Inventory.cs')
-rw-r--r-- | OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | 347 |
1 files changed, 245 insertions, 102 deletions
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs index 5abd74f..6cf1067 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | |||
@@ -117,34 +117,22 @@ namespace OpenSim.Region.Framework.Scenes | |||
117 | /// <param name="item"></param> | 117 | /// <param name="item"></param> |
118 | public bool AddInventoryItem(InventoryItemBase item) | 118 | public bool AddInventoryItem(InventoryItemBase item) |
119 | { | 119 | { |
120 | if (UUID.Zero == item.Folder) | 120 | InventoryFolderBase folder; |
121 | |||
122 | if (item.Folder == UUID.Zero) | ||
121 | { | 123 | { |
122 | InventoryFolderBase f = InventoryService.GetFolderForType(item.Owner, (AssetType)item.AssetType); | 124 | folder = InventoryService.GetFolderForType(item.Owner, (AssetType)item.AssetType); |
123 | if (f != null) | 125 | if (folder == null) |
124 | { | ||
125 | // m_log.DebugFormat( | ||
126 | // "[LOCAL INVENTORY SERVICES CONNECTOR]: Found folder {0} type {1} for item {2}", | ||
127 | // f.Name, (AssetType)f.Type, item.Name); | ||
128 | |||
129 | item.Folder = f.ID; | ||
130 | } | ||
131 | else | ||
132 | { | 126 | { |
133 | f = InventoryService.GetRootFolder(item.Owner); | 127 | folder = InventoryService.GetRootFolder(item.Owner); |
134 | if (f != null) | 128 | |
135 | { | 129 | if (folder == null) |
136 | item.Folder = f.ID; | ||
137 | } | ||
138 | else | ||
139 | { | ||
140 | m_log.WarnFormat( | ||
141 | "[AGENT INVENTORY]: Could not find root folder for {0} when trying to add item {1} with no parent folder specified", | ||
142 | item.Owner, item.Name); | ||
143 | return false; | 130 | return false; |
144 | } | ||
145 | } | 131 | } |
132 | |||
133 | item.Folder = folder.ID; | ||
146 | } | 134 | } |
147 | 135 | ||
148 | if (InventoryService.AddItem(item)) | 136 | if (InventoryService.AddItem(item)) |
149 | { | 137 | { |
150 | int userlevel = 0; | 138 | int userlevel = 0; |
@@ -264,8 +252,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
264 | 252 | ||
265 | // Update item with new asset | 253 | // Update item with new asset |
266 | item.AssetID = asset.FullID; | 254 | item.AssetID = asset.FullID; |
267 | if (group.UpdateInventoryItem(item)) | 255 | group.UpdateInventoryItem(item); |
268 | remoteClient.SendAgentAlertMessage("Script saved", false); | ||
269 | 256 | ||
270 | part.SendPropertiesToClient(remoteClient); | 257 | part.SendPropertiesToClient(remoteClient); |
271 | 258 | ||
@@ -276,12 +263,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
276 | { | 263 | { |
277 | // Needs to determine which engine was running it and use that | 264 | // Needs to determine which engine was running it and use that |
278 | // | 265 | // |
279 | part.Inventory.CreateScriptInstance(item.ItemID, 0, false, DefaultScriptEngine, 0); | 266 | errors = part.Inventory.CreateScriptInstanceEr(item.ItemID, 0, false, DefaultScriptEngine, 0); |
280 | errors = part.Inventory.GetScriptErrors(item.ItemID); | ||
281 | } | ||
282 | else | ||
283 | { | ||
284 | remoteClient.SendAgentAlertMessage("Script saved", false); | ||
285 | } | 267 | } |
286 | 268 | ||
287 | // Tell anyone managing scripts that a script has been reloaded/changed | 269 | // Tell anyone managing scripts that a script has been reloaded/changed |
@@ -349,6 +331,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
349 | 331 | ||
350 | if (UUID.Zero == transactionID) | 332 | if (UUID.Zero == transactionID) |
351 | { | 333 | { |
334 | item.Flags = (item.Flags & ~(uint)255) | (itemUpd.Flags & (uint)255); | ||
352 | item.Name = itemUpd.Name; | 335 | item.Name = itemUpd.Name; |
353 | item.Description = itemUpd.Description; | 336 | item.Description = itemUpd.Description; |
354 | 337 | ||
@@ -736,6 +719,8 @@ namespace OpenSim.Region.Framework.Scenes | |||
736 | return; | 719 | return; |
737 | } | 720 | } |
738 | 721 | ||
722 | if (newName == null) newName = item.Name; | ||
723 | |||
739 | AssetBase asset = AssetService.Get(item.AssetID.ToString()); | 724 | AssetBase asset = AssetService.Get(item.AssetID.ToString()); |
740 | 725 | ||
741 | if (asset != null) | 726 | if (asset != null) |
@@ -792,6 +777,24 @@ namespace OpenSim.Region.Framework.Scenes | |||
792 | } | 777 | } |
793 | 778 | ||
794 | /// <summary> | 779 | /// <summary> |
780 | /// Move an item within the agent's inventory, and leave a copy (used in making a new outfit) | ||
781 | /// </summary> | ||
782 | public void MoveInventoryItemsLeaveCopy(IClientAPI remoteClient, List<InventoryItemBase> items, UUID destfolder) | ||
783 | { | ||
784 | List<InventoryItemBase> moveitems = new List<InventoryItemBase>(); | ||
785 | foreach (InventoryItemBase b in items) | ||
786 | { | ||
787 | CopyInventoryItem(remoteClient, 0, remoteClient.AgentId, b.ID, b.Folder, null); | ||
788 | InventoryItemBase n = InventoryService.GetItem(b); | ||
789 | n.Folder = destfolder; | ||
790 | moveitems.Add(n); | ||
791 | remoteClient.SendInventoryItemCreateUpdate(n, 0); | ||
792 | } | ||
793 | |||
794 | MoveInventoryItem(remoteClient, moveitems); | ||
795 | } | ||
796 | |||
797 | /// <summary> | ||
795 | /// Move an item within the agent's inventory. | 798 | /// Move an item within the agent's inventory. |
796 | /// </summary> | 799 | /// </summary> |
797 | /// <param name="remoteClient"></param> | 800 | /// <param name="remoteClient"></param> |
@@ -1134,6 +1137,10 @@ namespace OpenSim.Region.Framework.Scenes | |||
1134 | { | 1137 | { |
1135 | SceneObjectPart part = GetSceneObjectPart(primLocalId); | 1138 | SceneObjectPart part = GetSceneObjectPart(primLocalId); |
1136 | 1139 | ||
1140 | // Can't move a null item | ||
1141 | if (itemId == UUID.Zero) | ||
1142 | return; | ||
1143 | |||
1137 | if (null == part) | 1144 | if (null == part) |
1138 | { | 1145 | { |
1139 | m_log.WarnFormat( | 1146 | m_log.WarnFormat( |
@@ -1238,21 +1245,28 @@ namespace OpenSim.Region.Framework.Scenes | |||
1238 | return; | 1245 | return; |
1239 | } | 1246 | } |
1240 | 1247 | ||
1241 | if (part.OwnerID != destPart.OwnerID) | 1248 | // Can't transfer this |
1249 | // | ||
1250 | if (part.OwnerID != destPart.OwnerID && (srcTaskItem.CurrentPermissions & (uint)PermissionMask.Transfer) == 0) | ||
1251 | return; | ||
1252 | |||
1253 | bool overrideNoMod = false; | ||
1254 | if ((part.GetEffectiveObjectFlags() & (uint)PrimFlags.AllowInventoryDrop) != 0) | ||
1255 | overrideNoMod = true; | ||
1256 | |||
1257 | if (part.OwnerID != destPart.OwnerID && (destPart.GetEffectiveObjectFlags() & (uint)PrimFlags.AllowInventoryDrop) == 0) | ||
1242 | { | 1258 | { |
1243 | // Source must have transfer permissions | 1259 | // object cannot copy items to an object owned by a different owner |
1244 | if ((srcTaskItem.CurrentPermissions & (uint)PermissionMask.Transfer) == 0) | 1260 | // unless llAllowInventoryDrop has been called |
1245 | return; | ||
1246 | 1261 | ||
1247 | // Object cannot copy items to an object owned by a different owner | 1262 | return; |
1248 | // unless llAllowInventoryDrop has been called on the destination | ||
1249 | if ((destPart.GetEffectiveObjectFlags() & (uint)PrimFlags.AllowInventoryDrop) == 0) | ||
1250 | return; | ||
1251 | } | 1263 | } |
1252 | 1264 | ||
1253 | // must have both move and modify permission to put an item in an object | 1265 | // must have both move and modify permission to put an item in an object |
1254 | if ((part.OwnerMask & ((uint)PermissionMask.Move | (uint)PermissionMask.Modify)) == 0) | 1266 | if (((part.OwnerMask & (uint)PermissionMask.Modify) == 0) && (!overrideNoMod)) |
1267 | { | ||
1255 | return; | 1268 | return; |
1269 | } | ||
1256 | 1270 | ||
1257 | TaskInventoryItem destTaskItem = new TaskInventoryItem(); | 1271 | TaskInventoryItem destTaskItem = new TaskInventoryItem(); |
1258 | 1272 | ||
@@ -1308,6 +1322,14 @@ namespace OpenSim.Region.Framework.Scenes | |||
1308 | 1322 | ||
1309 | public UUID MoveTaskInventoryItems(UUID destID, string category, SceneObjectPart host, List<UUID> items) | 1323 | public UUID MoveTaskInventoryItems(UUID destID, string category, SceneObjectPart host, List<UUID> items) |
1310 | { | 1324 | { |
1325 | SceneObjectPart destPart = GetSceneObjectPart(destID); | ||
1326 | if (destPart != null) // Move into a prim | ||
1327 | { | ||
1328 | foreach(UUID itemID in items) | ||
1329 | MoveTaskInventoryItem(destID, host, itemID); | ||
1330 | return destID; // Prim folder ID == prim ID | ||
1331 | } | ||
1332 | |||
1311 | InventoryFolderBase rootFolder = InventoryService.GetRootFolder(destID); | 1333 | InventoryFolderBase rootFolder = InventoryService.GetRootFolder(destID); |
1312 | 1334 | ||
1313 | UUID newFolderID = UUID.Random(); | 1335 | UUID newFolderID = UUID.Random(); |
@@ -1493,12 +1515,12 @@ namespace OpenSim.Region.Framework.Scenes | |||
1493 | agentTransactions.HandleTaskItemUpdateFromTransaction( | 1515 | agentTransactions.HandleTaskItemUpdateFromTransaction( |
1494 | remoteClient, part, transactionID, currentItem); | 1516 | remoteClient, part, transactionID, currentItem); |
1495 | 1517 | ||
1496 | if ((InventoryType)itemInfo.InvType == InventoryType.Notecard) | 1518 | // if ((InventoryType)itemInfo.InvType == InventoryType.Notecard) |
1497 | remoteClient.SendAgentAlertMessage("Notecard saved", false); | 1519 | // remoteClient.SendAgentAlertMessage("Notecard saved", false); |
1498 | else if ((InventoryType)itemInfo.InvType == InventoryType.LSL) | 1520 | // else if ((InventoryType)itemInfo.InvType == InventoryType.LSL) |
1499 | remoteClient.SendAgentAlertMessage("Script saved", false); | 1521 | // remoteClient.SendAgentAlertMessage("Script saved", false); |
1500 | else | 1522 | // else |
1501 | remoteClient.SendAgentAlertMessage("Item saved", false); | 1523 | // remoteClient.SendAgentAlertMessage("Item saved", false); |
1502 | } | 1524 | } |
1503 | } | 1525 | } |
1504 | 1526 | ||
@@ -1682,7 +1704,7 @@ namespace OpenSim.Region.Framework.Scenes | |||
1682 | } | 1704 | } |
1683 | 1705 | ||
1684 | AssetBase asset = CreateAsset(itemBase.Name, itemBase.Description, (sbyte)itemBase.AssetType, | 1706 | AssetBase asset = CreateAsset(itemBase.Name, itemBase.Description, (sbyte)itemBase.AssetType, |
1685 | Encoding.ASCII.GetBytes("default\n{\n state_entry()\n {\n llSay(0, \"Script running\");\n }\n}"), | 1707 | Encoding.ASCII.GetBytes("default\n{\n state_entry()\n {\n llSay(0, \"Script running\");\n }\n\n touch_start(integer num)\n {\n }\n}"), |
1686 | agentID); | 1708 | agentID); |
1687 | AssetService.Store(asset); | 1709 | AssetService.Store(asset); |
1688 | 1710 | ||
@@ -1838,23 +1860,32 @@ namespace OpenSim.Region.Framework.Scenes | |||
1838 | // build a list of eligible objects | 1860 | // build a list of eligible objects |
1839 | List<uint> deleteIDs = new List<uint>(); | 1861 | List<uint> deleteIDs = new List<uint>(); |
1840 | List<SceneObjectGroup> deleteGroups = new List<SceneObjectGroup>(); | 1862 | List<SceneObjectGroup> deleteGroups = new List<SceneObjectGroup>(); |
1841 | 1863 | List<SceneObjectGroup> takeGroups = new List<SceneObjectGroup>(); | |
1842 | // Start with true for both, then remove the flags if objects | ||
1843 | // that we can't derez are part of the selection | ||
1844 | bool permissionToTake = true; | ||
1845 | bool permissionToTakeCopy = true; | ||
1846 | bool permissionToDelete = true; | ||
1847 | 1864 | ||
1848 | foreach (uint localID in localIDs) | 1865 | foreach (uint localID in localIDs) |
1849 | { | 1866 | { |
1867 | // Start with true for both, then remove the flags if objects | ||
1868 | // that we can't derez are part of the selection | ||
1869 | bool permissionToTake = true; | ||
1870 | bool permissionToTakeCopy = true; | ||
1871 | bool permissionToDelete = true; | ||
1872 | |||
1850 | // Invalid id | 1873 | // Invalid id |
1851 | SceneObjectPart part = GetSceneObjectPart(localID); | 1874 | SceneObjectPart part = GetSceneObjectPart(localID); |
1852 | if (part == null) | 1875 | if (part == null) |
1876 | { | ||
1877 | //Client still thinks the object exists, kill it | ||
1878 | deleteIDs.Add(localID); | ||
1853 | continue; | 1879 | continue; |
1880 | } | ||
1854 | 1881 | ||
1855 | // Already deleted by someone else | 1882 | // Already deleted by someone else |
1856 | if (part.ParentGroup.IsDeleted) | 1883 | if (part.ParentGroup.IsDeleted) |
1884 | { | ||
1885 | //Client still thinks the object exists, kill it | ||
1886 | deleteIDs.Add(localID); | ||
1857 | continue; | 1887 | continue; |
1888 | } | ||
1858 | 1889 | ||
1859 | // Can't delete child prims | 1890 | // Can't delete child prims |
1860 | if (part != part.ParentGroup.RootPart) | 1891 | if (part != part.ParentGroup.RootPart) |
@@ -1862,9 +1893,6 @@ namespace OpenSim.Region.Framework.Scenes | |||
1862 | 1893 | ||
1863 | SceneObjectGroup grp = part.ParentGroup; | 1894 | SceneObjectGroup grp = part.ParentGroup; |
1864 | 1895 | ||
1865 | deleteIDs.Add(localID); | ||
1866 | deleteGroups.Add(grp); | ||
1867 | |||
1868 | if (remoteClient == null) | 1896 | if (remoteClient == null) |
1869 | { | 1897 | { |
1870 | // Autoreturn has a null client. Nothing else does. So | 1898 | // Autoreturn has a null client. Nothing else does. So |
@@ -1881,81 +1909,193 @@ namespace OpenSim.Region.Framework.Scenes | |||
1881 | } | 1909 | } |
1882 | else | 1910 | else |
1883 | { | 1911 | { |
1884 | if (!Permissions.CanTakeCopyObject(grp.UUID, remoteClient.AgentId)) | 1912 | if (action == DeRezAction.TakeCopy) |
1913 | { | ||
1914 | if (!Permissions.CanTakeCopyObject(grp.UUID, remoteClient.AgentId)) | ||
1915 | permissionToTakeCopy = false; | ||
1916 | } | ||
1917 | else | ||
1918 | { | ||
1885 | permissionToTakeCopy = false; | 1919 | permissionToTakeCopy = false; |
1886 | 1920 | } | |
1887 | if (!Permissions.CanTakeObject(grp.UUID, remoteClient.AgentId)) | 1921 | if (!Permissions.CanTakeObject(grp.UUID, remoteClient.AgentId)) |
1888 | permissionToTake = false; | 1922 | permissionToTake = false; |
1889 | 1923 | ||
1890 | if (!Permissions.CanDeleteObject(grp.UUID, remoteClient.AgentId)) | 1924 | if (!Permissions.CanDeleteObject(grp.UUID, remoteClient.AgentId)) |
1891 | permissionToDelete = false; | 1925 | permissionToDelete = false; |
1892 | } | 1926 | } |
1893 | } | ||
1894 | 1927 | ||
1895 | // Handle god perms | 1928 | // Handle god perms |
1896 | if ((remoteClient != null) && Permissions.IsGod(remoteClient.AgentId)) | 1929 | if ((remoteClient != null) && Permissions.IsGod(remoteClient.AgentId)) |
1897 | { | 1930 | { |
1898 | permissionToTake = true; | 1931 | permissionToTake = true; |
1899 | permissionToTakeCopy = true; | 1932 | permissionToTakeCopy = true; |
1900 | permissionToDelete = true; | 1933 | permissionToDelete = true; |
1901 | } | 1934 | } |
1902 | 1935 | ||
1903 | // If we're re-saving, we don't even want to delete | 1936 | // If we're re-saving, we don't even want to delete |
1904 | if (action == DeRezAction.SaveToExistingUserInventoryItem) | 1937 | if (action == DeRezAction.SaveToExistingUserInventoryItem) |
1905 | permissionToDelete = false; | 1938 | permissionToDelete = false; |
1906 | 1939 | ||
1907 | // if we want to take a copy, we also don't want to delete | 1940 | // if we want to take a copy, we also don't want to delete |
1908 | // Note: after this point, the permissionToTakeCopy flag | 1941 | // Note: after this point, the permissionToTakeCopy flag |
1909 | // becomes irrelevant. It already includes the permissionToTake | 1942 | // becomes irrelevant. It already includes the permissionToTake |
1910 | // permission and after excluding no copy items here, we can | 1943 | // permission and after excluding no copy items here, we can |
1911 | // just use that. | 1944 | // just use that. |
1912 | if (action == DeRezAction.TakeCopy) | 1945 | if (action == DeRezAction.TakeCopy) |
1913 | { | 1946 | { |
1914 | // If we don't have permission, stop right here | 1947 | // If we don't have permission, stop right here |
1915 | if (!permissionToTakeCopy) | 1948 | if (!permissionToTakeCopy) |
1916 | return; | 1949 | return; |
1917 | 1950 | ||
1918 | permissionToTake = true; | 1951 | permissionToTake = true; |
1919 | // Don't delete | 1952 | // Don't delete |
1920 | permissionToDelete = false; | 1953 | permissionToDelete = false; |
1921 | } | 1954 | } |
1922 | 1955 | ||
1923 | if (action == DeRezAction.Return) | 1956 | if (action == DeRezAction.Return) |
1924 | { | ||
1925 | if (remoteClient != null) | ||
1926 | { | 1957 | { |
1927 | if (Permissions.CanReturnObjects( | 1958 | if (remoteClient != null) |
1928 | null, | ||
1929 | remoteClient.AgentId, | ||
1930 | deleteGroups)) | ||
1931 | { | 1959 | { |
1932 | permissionToTake = true; | 1960 | if (Permissions.CanReturnObjects( |
1933 | permissionToDelete = true; | 1961 | null, |
1934 | 1962 | remoteClient.AgentId, | |
1935 | foreach (SceneObjectGroup g in deleteGroups) | 1963 | deleteGroups)) |
1936 | { | 1964 | { |
1937 | AddReturn(g.OwnerID == g.GroupID ? g.LastOwnerID : g.OwnerID, g.Name, g.AbsolutePosition, "parcel owner return"); | 1965 | permissionToTake = true; |
1966 | permissionToDelete = true; | ||
1967 | |||
1968 | AddReturn(grp.OwnerID == grp.GroupID ? grp.LastOwnerID : grp.OwnerID, grp.Name, grp.AbsolutePosition, "parcel owner return"); | ||
1938 | } | 1969 | } |
1939 | } | 1970 | } |
1971 | else // Auto return passes through here with null agent | ||
1972 | { | ||
1973 | permissionToTake = true; | ||
1974 | permissionToDelete = true; | ||
1975 | } | ||
1940 | } | 1976 | } |
1941 | else // Auto return passes through here with null agent | 1977 | |
1978 | if (permissionToTake && (!permissionToDelete)) | ||
1979 | takeGroups.Add(grp); | ||
1980 | |||
1981 | if (permissionToDelete) | ||
1942 | { | 1982 | { |
1943 | permissionToTake = true; | 1983 | if (permissionToTake) |
1944 | permissionToDelete = true; | 1984 | deleteGroups.Add(grp); |
1985 | deleteIDs.Add(grp.LocalId); | ||
1945 | } | 1986 | } |
1946 | } | 1987 | } |
1947 | 1988 | ||
1948 | if (permissionToTake) | 1989 | SendKillObject(deleteIDs); |
1990 | |||
1991 | if (deleteGroups.Count > 0) | ||
1949 | { | 1992 | { |
1993 | foreach (SceneObjectGroup g in deleteGroups) | ||
1994 | deleteIDs.Remove(g.LocalId); | ||
1995 | |||
1950 | m_asyncSceneObjectDeleter.DeleteToInventory( | 1996 | m_asyncSceneObjectDeleter.DeleteToInventory( |
1951 | action, destinationID, deleteGroups, remoteClient, | 1997 | action, destinationID, deleteGroups, remoteClient, |
1952 | permissionToDelete); | 1998 | true); |
1953 | } | 1999 | } |
1954 | else if (permissionToDelete) | 2000 | if (takeGroups.Count > 0) |
2001 | { | ||
2002 | m_asyncSceneObjectDeleter.DeleteToInventory( | ||
2003 | action, destinationID, takeGroups, remoteClient, | ||
2004 | false); | ||
2005 | } | ||
2006 | if (deleteIDs.Count > 0) | ||
1955 | { | 2007 | { |
1956 | foreach (SceneObjectGroup g in deleteGroups) | 2008 | foreach (SceneObjectGroup g in deleteGroups) |
1957 | DeleteSceneObject(g, false); | 2009 | DeleteSceneObject(g, true); |
2010 | } | ||
2011 | } | ||
2012 | |||
2013 | public UUID attachObjectAssetStore(IClientAPI remoteClient, SceneObjectGroup grp, UUID AgentId, out UUID itemID) | ||
2014 | { | ||
2015 | itemID = UUID.Zero; | ||
2016 | if (grp != null) | ||
2017 | { | ||
2018 | Vector3 inventoryStoredPosition = new Vector3 | ||
2019 | (((grp.AbsolutePosition.X > (int)Constants.RegionSize) | ||
2020 | ? 250 | ||
2021 | : grp.AbsolutePosition.X) | ||
2022 | , | ||
2023 | (grp.AbsolutePosition.X > (int)Constants.RegionSize) | ||
2024 | ? 250 | ||
2025 | : grp.AbsolutePosition.X, | ||
2026 | grp.AbsolutePosition.Z); | ||
2027 | |||
2028 | Vector3 originalPosition = grp.AbsolutePosition; | ||
2029 | |||
2030 | grp.AbsolutePosition = inventoryStoredPosition; | ||
2031 | |||
2032 | string sceneObjectXml = SceneObjectSerializer.ToOriginalXmlFormat(grp); | ||
2033 | |||
2034 | grp.AbsolutePosition = originalPosition; | ||
2035 | |||
2036 | AssetBase asset = CreateAsset( | ||
2037 | grp.GetPartName(grp.LocalId), | ||
2038 | grp.GetPartDescription(grp.LocalId), | ||
2039 | (sbyte)AssetType.Object, | ||
2040 | Utils.StringToBytes(sceneObjectXml), | ||
2041 | remoteClient.AgentId); | ||
2042 | AssetService.Store(asset); | ||
2043 | |||
2044 | InventoryItemBase item = new InventoryItemBase(); | ||
2045 | item.CreatorId = grp.RootPart.CreatorID.ToString(); | ||
2046 | item.CreatorData = grp.RootPart.CreatorData; | ||
2047 | item.Owner = remoteClient.AgentId; | ||
2048 | item.ID = UUID.Random(); | ||
2049 | item.AssetID = asset.FullID; | ||
2050 | item.Description = asset.Description; | ||
2051 | item.Name = asset.Name; | ||
2052 | item.AssetType = asset.Type; | ||
2053 | item.InvType = (int)InventoryType.Object; | ||
2054 | |||
2055 | InventoryFolderBase folder = InventoryService.GetFolderForType(remoteClient.AgentId, AssetType.Object); | ||
2056 | if (folder != null) | ||
2057 | item.Folder = folder.ID; | ||
2058 | else // oopsies | ||
2059 | item.Folder = UUID.Zero; | ||
2060 | |||
2061 | // Set up base perms properly | ||
2062 | uint permsBase = (uint)(PermissionMask.Move | PermissionMask.Copy | PermissionMask.Transfer | PermissionMask.Modify); | ||
2063 | permsBase &= grp.RootPart.BaseMask; | ||
2064 | permsBase |= (uint)PermissionMask.Move; | ||
2065 | |||
2066 | // Make sure we don't lock it | ||
2067 | grp.RootPart.NextOwnerMask |= (uint)PermissionMask.Move; | ||
2068 | |||
2069 | if ((remoteClient.AgentId != grp.RootPart.OwnerID) && Permissions.PropagatePermissions()) | ||
2070 | { | ||
2071 | item.BasePermissions = permsBase & grp.RootPart.NextOwnerMask; | ||
2072 | item.CurrentPermissions = permsBase & grp.RootPart.NextOwnerMask; | ||
2073 | item.NextPermissions = permsBase & grp.RootPart.NextOwnerMask; | ||
2074 | item.EveryOnePermissions = permsBase & grp.RootPart.EveryoneMask & grp.RootPart.NextOwnerMask; | ||
2075 | item.GroupPermissions = permsBase & grp.RootPart.GroupMask & grp.RootPart.NextOwnerMask; | ||
2076 | } | ||
2077 | else | ||
2078 | { | ||
2079 | item.BasePermissions = permsBase; | ||
2080 | item.CurrentPermissions = permsBase & grp.RootPart.OwnerMask; | ||
2081 | item.NextPermissions = permsBase & grp.RootPart.NextOwnerMask; | ||
2082 | item.EveryOnePermissions = permsBase & grp.RootPart.EveryoneMask; | ||
2083 | item.GroupPermissions = permsBase & grp.RootPart.GroupMask; | ||
2084 | } | ||
2085 | item.CreationDate = Util.UnixTimeSinceEpoch(); | ||
2086 | |||
2087 | // sets itemID so client can show item as 'attached' in inventory | ||
2088 | grp.SetFromItemID(item.ID); | ||
2089 | |||
2090 | if (AddInventoryItem(item)) | ||
2091 | remoteClient.SendInventoryItemCreateUpdate(item, 0); | ||
2092 | else | ||
2093 | m_dialogModule.SendAlertToUser(remoteClient, "Operation failed"); | ||
2094 | |||
2095 | itemID = item.ID; | ||
2096 | return item.AssetID; | ||
1958 | } | 2097 | } |
2098 | return UUID.Zero; | ||
1959 | } | 2099 | } |
1960 | 2100 | ||
1961 | /// <summary> | 2101 | /// <summary> |
@@ -2084,6 +2224,9 @@ namespace OpenSim.Region.Framework.Scenes | |||
2084 | 2224 | ||
2085 | public void SetScriptRunning(IClientAPI controllingClient, UUID objectID, UUID itemID, bool running) | 2225 | public void SetScriptRunning(IClientAPI controllingClient, UUID objectID, UUID itemID, bool running) |
2086 | { | 2226 | { |
2227 | if (!Permissions.CanEditScript(itemID, objectID, controllingClient.AgentId)) | ||
2228 | return; | ||
2229 | |||
2087 | SceneObjectPart part = GetSceneObjectPart(objectID); | 2230 | SceneObjectPart part = GetSceneObjectPart(objectID); |
2088 | if (part == null) | 2231 | if (part == null) |
2089 | return; | 2232 | return; |