diff options
Diffstat (limited to 'OpenSim/Region/Framework/Scenes/Scene.Inventory.cs')
-rw-r--r-- | OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | 142 |
1 files changed, 69 insertions, 73 deletions
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs index 3e87578..ac73abd 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | |||
@@ -1876,87 +1876,83 @@ namespace OpenSim.Region.Framework.Scenes | |||
1876 | // m_log.DebugFormat("[SCENE]: Called attachObjectAssetStore for object {0} {1} for {2} {3} {4}", grp.Name, grp.LocalId, remoteClient.Name, remoteClient.AgentId, AgentId); | 1876 | // m_log.DebugFormat("[SCENE]: Called attachObjectAssetStore for object {0} {1} for {2} {3} {4}", grp.Name, grp.LocalId, remoteClient.Name, remoteClient.AgentId, AgentId); |
1877 | 1877 | ||
1878 | itemID = UUID.Zero; | 1878 | itemID = UUID.Zero; |
1879 | if (grp != null) | ||
1880 | { | ||
1881 | Vector3 inventoryStoredPosition = new Vector3 | ||
1882 | (((grp.AbsolutePosition.X > (int)Constants.RegionSize) | ||
1883 | ? Constants.RegionSize - 6 | ||
1884 | : grp.AbsolutePosition.X) | ||
1885 | , | ||
1886 | (grp.AbsolutePosition.Y > (int)Constants.RegionSize) | ||
1887 | ? Constants.RegionSize - 6 | ||
1888 | : grp.AbsolutePosition.Y, | ||
1889 | grp.AbsolutePosition.Z); | ||
1890 | |||
1891 | Vector3 originalPosition = grp.AbsolutePosition; | ||
1892 | |||
1893 | grp.AbsolutePosition = inventoryStoredPosition; | ||
1894 | |||
1895 | // If we're being called from a script, then trying to serialize that same script's state will not complete | ||
1896 | // in any reasonable time period. Therefore, we'll avoid it. The worst that can happen is that if | ||
1897 | // the client/server crashes rather than logging out normally, the attachment's scripts will resume | ||
1898 | // without state on relog. Arguably, this is what we want anyway. | ||
1899 | string sceneObjectXml = SceneObjectSerializer.ToOriginalXmlFormat(grp, false); | ||
1900 | |||
1901 | grp.AbsolutePosition = originalPosition; | ||
1902 | |||
1903 | AssetBase asset = CreateAsset( | ||
1904 | grp.GetPartName(grp.LocalId), | ||
1905 | grp.GetPartDescription(grp.LocalId), | ||
1906 | (sbyte)AssetType.Object, | ||
1907 | Utils.StringToBytes(sceneObjectXml), | ||
1908 | remoteClient.AgentId); | ||
1909 | 1879 | ||
1910 | AssetService.Store(asset); | 1880 | Vector3 inventoryStoredPosition = new Vector3 |
1881 | (((grp.AbsolutePosition.X > (int)Constants.RegionSize) | ||
1882 | ? Constants.RegionSize - 6 | ||
1883 | : grp.AbsolutePosition.X) | ||
1884 | , | ||
1885 | (grp.AbsolutePosition.Y > (int)Constants.RegionSize) | ||
1886 | ? Constants.RegionSize - 6 | ||
1887 | : grp.AbsolutePosition.Y, | ||
1888 | grp.AbsolutePosition.Z); | ||
1911 | 1889 | ||
1912 | InventoryItemBase item = new InventoryItemBase(); | 1890 | Vector3 originalPosition = grp.AbsolutePosition; |
1913 | item.CreatorId = grp.RootPart.CreatorID.ToString(); | ||
1914 | item.CreatorData = grp.RootPart.CreatorData; | ||
1915 | item.Owner = remoteClient.AgentId; | ||
1916 | item.ID = UUID.Random(); | ||
1917 | item.AssetID = asset.FullID; | ||
1918 | item.Description = asset.Description; | ||
1919 | item.Name = asset.Name; | ||
1920 | item.AssetType = asset.Type; | ||
1921 | item.InvType = (int)InventoryType.Object; | ||
1922 | |||
1923 | InventoryFolderBase folder = InventoryService.GetFolderForType(remoteClient.AgentId, AssetType.Object); | ||
1924 | if (folder != null) | ||
1925 | item.Folder = folder.ID; | ||
1926 | else // oopsies | ||
1927 | item.Folder = UUID.Zero; | ||
1928 | 1891 | ||
1929 | if ((remoteClient.AgentId != grp.RootPart.OwnerID) && Permissions.PropagatePermissions()) | 1892 | grp.AbsolutePosition = inventoryStoredPosition; |
1930 | { | ||
1931 | item.BasePermissions = grp.RootPart.NextOwnerMask; | ||
1932 | item.CurrentPermissions = grp.RootPart.NextOwnerMask; | ||
1933 | item.NextPermissions = grp.RootPart.NextOwnerMask; | ||
1934 | item.EveryOnePermissions = grp.RootPart.EveryoneMask & grp.RootPart.NextOwnerMask; | ||
1935 | item.GroupPermissions = grp.RootPart.GroupMask & grp.RootPart.NextOwnerMask; | ||
1936 | } | ||
1937 | else | ||
1938 | { | ||
1939 | item.BasePermissions = grp.RootPart.BaseMask; | ||
1940 | item.CurrentPermissions = grp.RootPart.OwnerMask; | ||
1941 | item.NextPermissions = grp.RootPart.NextOwnerMask; | ||
1942 | item.EveryOnePermissions = grp.RootPart.EveryoneMask; | ||
1943 | item.GroupPermissions = grp.RootPart.GroupMask; | ||
1944 | } | ||
1945 | item.CreationDate = Util.UnixTimeSinceEpoch(); | ||
1946 | 1893 | ||
1947 | // sets itemID so client can show item as 'attached' in inventory | 1894 | // If we're being called from a script, then trying to serialize that same script's state will not complete |
1948 | grp.SetFromItemID(item.ID); | 1895 | // in any reasonable time period. Therefore, we'll avoid it. The worst that can happen is that if |
1896 | // the client/server crashes rather than logging out normally, the attachment's scripts will resume | ||
1897 | // without state on relog. Arguably, this is what we want anyway. | ||
1898 | string sceneObjectXml = SceneObjectSerializer.ToOriginalXmlFormat(grp, false); | ||
1949 | 1899 | ||
1950 | if (AddInventoryItem(item)) | 1900 | grp.AbsolutePosition = originalPosition; |
1951 | remoteClient.SendInventoryItemCreateUpdate(item, 0); | 1901 | |
1952 | else | 1902 | AssetBase asset = CreateAsset( |
1953 | m_dialogModule.SendAlertToUser(remoteClient, "Operation failed"); | 1903 | grp.GetPartName(grp.LocalId), |
1904 | grp.GetPartDescription(grp.LocalId), | ||
1905 | (sbyte)AssetType.Object, | ||
1906 | Utils.StringToBytes(sceneObjectXml), | ||
1907 | remoteClient.AgentId); | ||
1908 | |||
1909 | AssetService.Store(asset); | ||
1954 | 1910 | ||
1955 | itemID = item.ID; | 1911 | InventoryItemBase item = new InventoryItemBase(); |
1956 | return item.AssetID; | 1912 | item.CreatorId = grp.RootPart.CreatorID.ToString(); |
1913 | item.CreatorData = grp.RootPart.CreatorData; | ||
1914 | item.Owner = remoteClient.AgentId; | ||
1915 | item.ID = UUID.Random(); | ||
1916 | item.AssetID = asset.FullID; | ||
1917 | item.Description = asset.Description; | ||
1918 | item.Name = asset.Name; | ||
1919 | item.AssetType = asset.Type; | ||
1920 | item.InvType = (int)InventoryType.Object; | ||
1921 | |||
1922 | InventoryFolderBase folder = InventoryService.GetFolderForType(remoteClient.AgentId, AssetType.Object); | ||
1923 | if (folder != null) | ||
1924 | item.Folder = folder.ID; | ||
1925 | else // oopsies | ||
1926 | item.Folder = UUID.Zero; | ||
1927 | |||
1928 | if ((remoteClient.AgentId != grp.RootPart.OwnerID) && Permissions.PropagatePermissions()) | ||
1929 | { | ||
1930 | item.BasePermissions = grp.RootPart.NextOwnerMask; | ||
1931 | item.CurrentPermissions = grp.RootPart.NextOwnerMask; | ||
1932 | item.NextPermissions = grp.RootPart.NextOwnerMask; | ||
1933 | item.EveryOnePermissions = grp.RootPart.EveryoneMask & grp.RootPart.NextOwnerMask; | ||
1934 | item.GroupPermissions = grp.RootPart.GroupMask & grp.RootPart.NextOwnerMask; | ||
1935 | } | ||
1936 | else | ||
1937 | { | ||
1938 | item.BasePermissions = grp.RootPart.BaseMask; | ||
1939 | item.CurrentPermissions = grp.RootPart.OwnerMask; | ||
1940 | item.NextPermissions = grp.RootPart.NextOwnerMask; | ||
1941 | item.EveryOnePermissions = grp.RootPart.EveryoneMask; | ||
1942 | item.GroupPermissions = grp.RootPart.GroupMask; | ||
1957 | } | 1943 | } |
1944 | item.CreationDate = Util.UnixTimeSinceEpoch(); | ||
1958 | 1945 | ||
1959 | return UUID.Zero; | 1946 | // sets itemID so client can show item as 'attached' in inventory |
1947 | grp.SetFromItemID(item.ID); | ||
1948 | |||
1949 | if (AddInventoryItem(item)) | ||
1950 | remoteClient.SendInventoryItemCreateUpdate(item, 0); | ||
1951 | else | ||
1952 | m_dialogModule.SendAlertToUser(remoteClient, "Operation failed"); | ||
1953 | |||
1954 | itemID = item.ID; | ||
1955 | return item.AssetID; | ||
1960 | } | 1956 | } |
1961 | 1957 | ||
1962 | /// <summary> | 1958 | /// <summary> |