diff options
Diffstat (limited to 'OpenSim/Region/CoreModules/Framework/InventoryAccess')
-rw-r--r-- | OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs | 211 |
1 files changed, 141 insertions, 70 deletions
diff --git a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs index 831922e..6251266 100644 --- a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs +++ b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs | |||
@@ -183,44 +183,49 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
183 | if (!m_Scene.Permissions.CanCreateUserInventory(invType, remoteClient.AgentId)) | 183 | if (!m_Scene.Permissions.CanCreateUserInventory(invType, remoteClient.AgentId)) |
184 | return; | 184 | return; |
185 | 185 | ||
186 | if (transactionID == UUID.Zero) | 186 | InventoryFolderBase f = new InventoryFolderBase(folderID, remoteClient.AgentId); |
187 | InventoryFolderBase folder = m_Scene.InventoryService.GetFolder(f); | ||
188 | |||
189 | if (folder == null || folder.Owner != remoteClient.AgentId) | ||
190 | return; | ||
191 | |||
192 | if (transactionID != UUID.Zero) | ||
187 | { | 193 | { |
188 | ScenePresence presence; | 194 | IAgentAssetTransactions agentTransactions = m_Scene.AgentTransactionsModule; |
189 | if (m_Scene.TryGetScenePresence(remoteClient.AgentId, out presence)) | 195 | if (agentTransactions != null) |
190 | { | 196 | { |
191 | byte[] data = null; | 197 | if (agentTransactions.HandleItemCreationFromTransaction( |
198 | remoteClient, transactionID, folderID, callbackID, description, | ||
199 | name, invType, assetType, wearableType, nextOwnerMask)) | ||
200 | return; | ||
201 | } | ||
202 | } | ||
192 | 203 | ||
193 | if (invType == (sbyte)InventoryType.Landmark && presence != null) | 204 | ScenePresence presence; |
194 | { | 205 | if (m_Scene.TryGetScenePresence(remoteClient.AgentId, out presence)) |
195 | string suffix = string.Empty, prefix = string.Empty; | 206 | { |
196 | string strdata = GenerateLandmark(presence, out prefix, out suffix); | 207 | byte[] data = null; |
197 | data = Encoding.ASCII.GetBytes(strdata); | ||
198 | name = prefix + name; | ||
199 | description += suffix; | ||
200 | } | ||
201 | 208 | ||
202 | AssetBase asset = m_Scene.CreateAsset(name, description, assetType, data, remoteClient.AgentId); | 209 | if (invType == (sbyte)InventoryType.Landmark && presence != null) |
203 | m_Scene.AssetService.Store(asset); | ||
204 | m_Scene.CreateNewInventoryItem( | ||
205 | remoteClient, remoteClient.AgentId.ToString(), string.Empty, folderID, | ||
206 | name, description, 0, callbackID, asset, invType, nextOwnerMask, creationDate); | ||
207 | } | ||
208 | else | ||
209 | { | 210 | { |
210 | m_log.ErrorFormat( | 211 | string suffix = string.Empty, prefix = string.Empty; |
211 | "[INVENTORY ACCESS MODULE]: ScenePresence for agent uuid {0} unexpectedly not found in CreateNewInventoryItem", | 212 | string strdata = GenerateLandmark(presence, out prefix, out suffix); |
212 | remoteClient.AgentId); | 213 | data = Encoding.ASCII.GetBytes(strdata); |
214 | name = prefix + name; | ||
215 | description += suffix; | ||
213 | } | 216 | } |
217 | |||
218 | AssetBase asset = m_Scene.CreateAsset(name, description, assetType, data, remoteClient.AgentId); | ||
219 | m_Scene.AssetService.Store(asset); | ||
220 | m_Scene.CreateNewInventoryItem( | ||
221 | remoteClient, remoteClient.AgentId.ToString(), string.Empty, folderID, | ||
222 | name, description, 0, callbackID, asset, invType, nextOwnerMask, creationDate,transactionID); | ||
214 | } | 223 | } |
215 | else | 224 | else |
216 | { | 225 | { |
217 | IAgentAssetTransactions agentTransactions = m_Scene.AgentTransactionsModule; | 226 | m_log.ErrorFormat( |
218 | if (agentTransactions != null) | 227 | "[INVENTORY ACCESS MODULE]: ScenePresence for agent uuid {0} unexpectedly not found in CreateNewInventoryItem", |
219 | { | 228 | remoteClient.AgentId); |
220 | agentTransactions.HandleItemCreationFromTransaction( | ||
221 | remoteClient, transactionID, folderID, callbackID, description, | ||
222 | name, invType, assetType, wearableType, nextOwnerMask); | ||
223 | } | ||
224 | } | 229 | } |
225 | } | 230 | } |
226 | 231 | ||
@@ -359,20 +364,42 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
359 | { | 364 | { |
360 | if (objectGroup.RootPart.KeyframeMotion != null) | 365 | if (objectGroup.RootPart.KeyframeMotion != null) |
361 | objectGroup.RootPart.KeyframeMotion.Stop(); | 366 | objectGroup.RootPart.KeyframeMotion.Stop(); |
367 | objectGroup.RootPart.SetForce(Vector3.Zero); | ||
368 | objectGroup.RootPart.SetAngularImpulse(Vector3.Zero, false); | ||
362 | objectGroup.RootPart.KeyframeMotion = null; | 369 | objectGroup.RootPart.KeyframeMotion = null; |
363 | // Vector3 inventoryStoredPosition = new Vector3 | 370 | |
364 | // (((objectGroup.AbsolutePosition.X > (int)Constants.RegionSize) | 371 | Vector3 inventoryStoredPosition = new Vector3 |
365 | // ? 250 | 372 | (((objectGroup.AbsolutePosition.X > (int)Constants.RegionSize) |
366 | // : objectGroup.AbsolutePosition.X) | 373 | ? 250 |
367 | // , | 374 | : objectGroup.AbsolutePosition.X) |
368 | // (objectGroup.AbsolutePosition.Y > (int)Constants.RegionSize) | 375 | , |
369 | // ? 250 | 376 | (objectGroup.AbsolutePosition.Y > (int)Constants.RegionSize) |
370 | // : objectGroup.AbsolutePosition.Y, | 377 | ? 250 |
371 | // objectGroup.AbsolutePosition.Z); | 378 | : objectGroup.AbsolutePosition.Y, |
372 | // | 379 | objectGroup.AbsolutePosition.Z); |
373 | // originalPositions[objectGroup.UUID] = objectGroup.AbsolutePosition; | 380 | |
374 | // | 381 | Quaternion inventoryStoredRotation = objectGroup.GroupRotation; |
375 | // objectGroup.AbsolutePosition = inventoryStoredPosition; | 382 | //originalPositions[objectGroup.UUID] = objectGroup.AbsolutePosition; |
383 | |||
384 | // Restore attachment data after trip through the sim | ||
385 | if (objectGroup.RootPart.AttachPoint > 0) | ||
386 | { | ||
387 | inventoryStoredPosition = objectGroup.RootPart.AttachOffset; | ||
388 | inventoryStoredRotation = objectGroup.RootPart.AttachRotation; | ||
389 | } | ||
390 | |||
391 | // Trees could be attached and it's been done, but it makes | ||
392 | // no sense. State must be preserved because it's the tree type | ||
393 | if (objectGroup.RootPart.Shape.PCode != (byte) PCode.Tree && | ||
394 | objectGroup.RootPart.Shape.PCode != (byte) PCode.NewTree) | ||
395 | { | ||
396 | objectGroup.RootPart.Shape.State = objectGroup.RootPart.AttachPoint; | ||
397 | if (objectGroup.RootPart.AttachPoint > 0) | ||
398 | objectGroup.RootPart.Shape.LastAttachPoint = objectGroup.RootPart.AttachPoint; | ||
399 | } | ||
400 | |||
401 | objectGroup.AbsolutePosition = inventoryStoredPosition; | ||
402 | objectGroup.RootPart.RotationOffset = inventoryStoredRotation; | ||
376 | 403 | ||
377 | // Make sure all bits but the ones we want are clear | 404 | // Make sure all bits but the ones we want are clear |
378 | // on take. | 405 | // on take. |
@@ -491,8 +518,17 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
491 | IClientAPI remoteClient) | 518 | IClientAPI remoteClient) |
492 | { | 519 | { |
493 | uint effectivePerms = (uint)(PermissionMask.Copy | PermissionMask.Transfer | PermissionMask.Modify | PermissionMask.Move | PermissionMask.Export) | 7; | 520 | uint effectivePerms = (uint)(PermissionMask.Copy | PermissionMask.Transfer | PermissionMask.Modify | PermissionMask.Move | PermissionMask.Export) | 7; |
521 | // For the porposes of inventory, an object is modify if the prims | ||
522 | // are modify. This allows renaming an object that contains no | ||
523 | // mod items. | ||
494 | foreach (SceneObjectGroup grp in objsForEffectivePermissions) | 524 | foreach (SceneObjectGroup grp in objsForEffectivePermissions) |
495 | effectivePerms &= grp.GetEffectivePermissions(); | 525 | { |
526 | uint groupPerms = grp.GetEffectivePermissions(true); | ||
527 | if ((grp.RootPart.BaseMask & (uint)PermissionMask.Modify) != 0) | ||
528 | groupPerms |= (uint)PermissionMask.Modify; | ||
529 | |||
530 | effectivePerms &= groupPerms; | ||
531 | } | ||
496 | effectivePerms |= (uint)PermissionMask.Move; | 532 | effectivePerms |= (uint)PermissionMask.Move; |
497 | 533 | ||
498 | if (remoteClient != null && (remoteClient.AgentId != so.RootPart.OwnerID) && m_Scene.Permissions.PropagatePermissions()) | 534 | if (remoteClient != null && (remoteClient.AgentId != so.RootPart.OwnerID) && m_Scene.Permissions.PropagatePermissions()) |
@@ -673,7 +709,8 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
673 | if (so.FromFolderID != UUID.Zero && so.RootPart.OwnerID == remoteClient.AgentId) | 709 | if (so.FromFolderID != UUID.Zero && so.RootPart.OwnerID == remoteClient.AgentId) |
674 | { | 710 | { |
675 | InventoryFolderBase f = new InventoryFolderBase(so.FromFolderID, userID); | 711 | InventoryFolderBase f = new InventoryFolderBase(so.FromFolderID, userID); |
676 | folder = m_Scene.InventoryService.GetFolder(f); | 712 | if (f != null) |
713 | folder = m_Scene.InventoryService.GetFolder(f); | ||
677 | 714 | ||
678 | if(folder.Type == 14 || folder.Type == 16) | 715 | if(folder.Type == 14 || folder.Type == 16) |
679 | { | 716 | { |
@@ -709,16 +746,11 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
709 | bool RezSelected, bool RemoveItem, UUID fromTaskID, bool attachment) | 746 | bool RezSelected, bool RemoveItem, UUID fromTaskID, bool attachment) |
710 | { | 747 | { |
711 | // m_log.DebugFormat("[INVENTORY ACCESS MODULE]: RezObject for {0}, item {1}", remoteClient.Name, itemID); | 748 | // m_log.DebugFormat("[INVENTORY ACCESS MODULE]: RezObject for {0}, item {1}", remoteClient.Name, itemID); |
712 | |||
713 | InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId); | 749 | InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId); |
714 | item = m_Scene.InventoryService.GetItem(item); | 750 | item = m_Scene.InventoryService.GetItem(item); |
715 | 751 | ||
716 | if (item == null) | 752 | if (item == null) |
717 | { | 753 | { |
718 | m_log.WarnFormat( | ||
719 | "[INVENTORY ACCESS MODULE]: Could not find item {0} for {1} in RezObject()", | ||
720 | itemID, remoteClient.Name); | ||
721 | |||
722 | return null; | 754 | return null; |
723 | } | 755 | } |
724 | 756 | ||
@@ -782,12 +814,35 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
782 | pos -= bbox / 2; | 814 | pos -= bbox / 2; |
783 | } | 815 | } |
784 | 816 | ||
817 | int primcount = 0; | ||
818 | foreach (SceneObjectGroup g in objlist) | ||
819 | primcount += g.PrimCount; | ||
820 | |||
821 | if (!m_Scene.Permissions.CanRezObject( | ||
822 | primcount, remoteClient.AgentId, pos) | ||
823 | && !attachment) | ||
824 | { | ||
825 | // The client operates in no fail mode. It will | ||
826 | // have already removed the item from the folder | ||
827 | // if it's no copy. | ||
828 | // Put it back if it's not an attachment | ||
829 | // | ||
830 | if (item != null) | ||
831 | { | ||
832 | if (((item.CurrentPermissions & (uint)PermissionMask.Copy) == 0) && (!attachment)) | ||
833 | remoteClient.SendBulkUpdateInventory(item); | ||
834 | } | ||
835 | |||
836 | return null; | ||
837 | } | ||
838 | |||
785 | if (item != null && !DoPreRezWhenFromItem(remoteClient, item, objlist, pos, veclist, attachment)) | 839 | if (item != null && !DoPreRezWhenFromItem(remoteClient, item, objlist, pos, veclist, attachment)) |
786 | return null; | 840 | return null; |
787 | 841 | ||
788 | for (int i = 0; i < objlist.Count; i++) | 842 | for (int i = 0; i < objlist.Count; i++) |
789 | { | 843 | { |
790 | group = objlist[i]; | 844 | group = objlist[i]; |
845 | SceneObjectPart rootPart = group.RootPart; | ||
791 | 846 | ||
792 | // m_log.DebugFormat( | 847 | // m_log.DebugFormat( |
793 | // "[INVENTORY ACCESS MODULE]: Preparing to rez {0} {1} {2} ownermask={3:X} nextownermask={4:X} groupmask={5:X} everyonemask={6:X} for {7}", | 848 | // "[INVENTORY ACCESS MODULE]: Preparing to rez {0} {1} {2} ownermask={3:X} nextownermask={4:X} groupmask={5:X} everyonemask={6:X} for {7}", |
@@ -856,8 +911,6 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
856 | 911 | ||
857 | if (!attachment) | 912 | if (!attachment) |
858 | { | 913 | { |
859 | SceneObjectPart rootPart = group.RootPart; | ||
860 | |||
861 | if (rootPart.Shape.PCode == (byte)PCode.Prim) | 914 | if (rootPart.Shape.PCode == (byte)PCode.Prim) |
862 | group.ClearPartAttachmentData(); | 915 | group.ClearPartAttachmentData(); |
863 | 916 | ||
@@ -875,6 +928,8 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
875 | // remoteClient.Name); | 928 | // remoteClient.Name); |
876 | } | 929 | } |
877 | 930 | ||
931 | group.SetGroup(remoteClient.ActiveGroupId, remoteClient); | ||
932 | |||
878 | if (item != null) | 933 | if (item != null) |
879 | DoPostRezWhenFromItem(item, attachment); | 934 | DoPostRezWhenFromItem(item, attachment); |
880 | 935 | ||
@@ -959,8 +1014,11 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
959 | { | 1014 | { |
960 | rootPart.Name = item.Name; | 1015 | rootPart.Name = item.Name; |
961 | rootPart.Description = item.Description; | 1016 | rootPart.Description = item.Description; |
962 | rootPart.ObjectSaleType = item.SaleType; | 1017 | if ((item.Flags & (uint)InventoryItemFlags.ObjectSlamSale) != 0) |
963 | rootPart.SalePrice = item.SalePrice; | 1018 | { |
1019 | rootPart.ObjectSaleType = item.SaleType; | ||
1020 | rootPart.SalePrice = item.SalePrice; | ||
1021 | } | ||
964 | } | 1022 | } |
965 | 1023 | ||
966 | so.FromFolderID = item.Folder; | 1024 | so.FromFolderID = item.Folder; |
@@ -970,7 +1028,8 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
970 | // rootPart.OwnerID, item.Owner, item.CurrentPermissions); | 1028 | // rootPart.OwnerID, item.Owner, item.CurrentPermissions); |
971 | 1029 | ||
972 | if ((rootPart.OwnerID != item.Owner) || | 1030 | if ((rootPart.OwnerID != item.Owner) || |
973 | (item.CurrentPermissions & 16) != 0) | 1031 | (item.CurrentPermissions & 16) != 0 || |
1032 | (item.Flags & (uint)InventoryItemFlags.ObjectSlamPerm) != 0) | ||
974 | { | 1033 | { |
975 | //Need to kill the for sale here | 1034 | //Need to kill the for sale here |
976 | rootPart.ObjectSaleType = 0; | 1035 | rootPart.ObjectSaleType = 0; |
@@ -980,31 +1039,43 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
980 | { | 1039 | { |
981 | foreach (SceneObjectPart part in so.Parts) | 1040 | foreach (SceneObjectPart part in so.Parts) |
982 | { | 1041 | { |
983 | if ((item.Flags & (uint)InventoryItemFlags.ObjectHasMultipleItems) == 0) | ||
984 | { | ||
985 | part.EveryoneMask = item.EveryOnePermissions; | ||
986 | part.NextOwnerMask = item.NextPermissions; | ||
987 | } | ||
988 | part.GroupMask = 0; // DO NOT propagate here | 1042 | part.GroupMask = 0; // DO NOT propagate here |
1043 | |||
1044 | part.LastOwnerID = part.OwnerID; | ||
1045 | part.OwnerID = item.Owner; | ||
1046 | part.Inventory.ChangeInventoryOwner(item.Owner); | ||
989 | } | 1047 | } |
990 | 1048 | ||
991 | so.ApplyNextOwnerPermissions(); | 1049 | so.ApplyNextOwnerPermissions(); |
1050 | |||
1051 | // In case the user has changed flags on a received item | ||
1052 | // we have to apply those changes after the slam. Else we | ||
1053 | // get a net loss of permissions | ||
1054 | foreach (SceneObjectPart part in so.Parts) | ||
1055 | { | ||
1056 | if ((item.Flags & (uint)InventoryItemFlags.ObjectHasMultipleItems) == 0) | ||
1057 | { | ||
1058 | if ((item.Flags & (uint)InventoryItemFlags.ObjectOverwriteEveryone) != 0) | ||
1059 | part.EveryoneMask = item.EveryOnePermissions & part.BaseMask; | ||
1060 | if ((item.Flags & (uint)InventoryItemFlags.ObjectOverwriteNextOwner) != 0) | ||
1061 | part.NextOwnerMask = item.NextPermissions & part.BaseMask; | ||
1062 | } | ||
1063 | } | ||
992 | } | 1064 | } |
993 | } | 1065 | } |
994 | 1066 | else | |
995 | foreach (SceneObjectPart part in so.Parts) | ||
996 | { | 1067 | { |
997 | part.FromUserInventoryItemID = fromUserInventoryItemId; | 1068 | foreach (SceneObjectPart part in so.Parts) |
998 | |||
999 | if ((part.OwnerID != item.Owner) || | ||
1000 | (item.CurrentPermissions & 16) != 0) | ||
1001 | { | 1069 | { |
1002 | part.Inventory.ChangeInventoryOwner(item.Owner); | 1070 | part.FromUserInventoryItemID = fromUserInventoryItemId; |
1003 | part.GroupMask = 0; // DO NOT propagate here | 1071 | |
1072 | if ((item.Flags & (uint)InventoryItemFlags.ObjectOverwriteEveryone) != 0) | ||
1073 | part.EveryoneMask = item.EveryOnePermissions; | ||
1074 | if ((item.Flags & (uint)InventoryItemFlags.ObjectOverwriteNextOwner) != 0) | ||
1075 | part.NextOwnerMask = item.NextPermissions; | ||
1076 | if ((item.Flags & (uint)InventoryItemFlags.ObjectOverwriteGroup) != 0) | ||
1077 | part.GroupMask = item.GroupPermissions; | ||
1004 | } | 1078 | } |
1005 | |||
1006 | part.EveryoneMask = item.EveryOnePermissions; | ||
1007 | part.NextOwnerMask = item.NextPermissions; | ||
1008 | } | 1079 | } |
1009 | 1080 | ||
1010 | rootPart.TrimPermissions(); | 1081 | rootPart.TrimPermissions(); |