diff options
Diffstat (limited to 'OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs')
-rw-r--r-- | OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs | 228 |
1 files changed, 157 insertions, 71 deletions
diff --git a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs index 68e4e26..89bb037 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,38 @@ 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 | objectGroup.RootPart.Shape.State = objectGroup.RootPart.AttachPoint; | ||
396 | |||
397 | objectGroup.AbsolutePosition = inventoryStoredPosition; | ||
398 | objectGroup.RootPart.RotationOffset = inventoryStoredRotation; | ||
376 | 399 | ||
377 | // Make sure all bits but the ones we want are clear | 400 | // Make sure all bits but the ones we want are clear |
378 | // on take. | 401 | // on take. |
@@ -491,8 +514,17 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
491 | IClientAPI remoteClient) | 514 | IClientAPI remoteClient) |
492 | { | 515 | { |
493 | uint effectivePerms = (uint)(PermissionMask.Copy | PermissionMask.Transfer | PermissionMask.Modify | PermissionMask.Move | PermissionMask.Export) | 7; | 516 | uint effectivePerms = (uint)(PermissionMask.Copy | PermissionMask.Transfer | PermissionMask.Modify | PermissionMask.Move | PermissionMask.Export) | 7; |
517 | // For the porposes of inventory, an object is modify if the prims | ||
518 | // are modify. This allows renaming an object that contains no | ||
519 | // mod items. | ||
494 | foreach (SceneObjectGroup grp in objsForEffectivePermissions) | 520 | foreach (SceneObjectGroup grp in objsForEffectivePermissions) |
495 | effectivePerms &= grp.GetEffectivePermissions(); | 521 | { |
522 | uint groupPerms = grp.GetEffectivePermissions(true); | ||
523 | if ((grp.RootPart.BaseMask & (uint)PermissionMask.Modify) != 0) | ||
524 | groupPerms |= (uint)PermissionMask.Modify; | ||
525 | |||
526 | effectivePerms &= groupPerms; | ||
527 | } | ||
496 | effectivePerms |= (uint)PermissionMask.Move; | 528 | effectivePerms |= (uint)PermissionMask.Move; |
497 | 529 | ||
498 | if (remoteClient != null && (remoteClient.AgentId != so.RootPart.OwnerID) && m_Scene.Permissions.PropagatePermissions()) | 530 | if (remoteClient != null && (remoteClient.AgentId != so.RootPart.OwnerID) && m_Scene.Permissions.PropagatePermissions()) |
@@ -673,7 +705,8 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
673 | if (so.FromFolderID != UUID.Zero && so.RootPart.OwnerID == remoteClient.AgentId) | 705 | if (so.FromFolderID != UUID.Zero && so.RootPart.OwnerID == remoteClient.AgentId) |
674 | { | 706 | { |
675 | InventoryFolderBase f = new InventoryFolderBase(so.FromFolderID, userID); | 707 | InventoryFolderBase f = new InventoryFolderBase(so.FromFolderID, userID); |
676 | folder = m_Scene.InventoryService.GetFolder(f); | 708 | if (f != null) |
709 | folder = m_Scene.InventoryService.GetFolder(f); | ||
677 | 710 | ||
678 | if(folder.Type == 14 || folder.Type == 16) | 711 | if(folder.Type == 14 || folder.Type == 16) |
679 | { | 712 | { |
@@ -709,16 +742,11 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
709 | bool RezSelected, bool RemoveItem, UUID fromTaskID, bool attachment) | 742 | bool RezSelected, bool RemoveItem, UUID fromTaskID, bool attachment) |
710 | { | 743 | { |
711 | // m_log.DebugFormat("[INVENTORY ACCESS MODULE]: RezObject for {0}, item {1}", remoteClient.Name, itemID); | 744 | // m_log.DebugFormat("[INVENTORY ACCESS MODULE]: RezObject for {0}, item {1}", remoteClient.Name, itemID); |
712 | |||
713 | InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId); | 745 | InventoryItemBase item = new InventoryItemBase(itemID, remoteClient.AgentId); |
714 | item = m_Scene.InventoryService.GetItem(item); | 746 | item = m_Scene.InventoryService.GetItem(item); |
715 | 747 | ||
716 | if (item == null) | 748 | if (item == null) |
717 | { | 749 | { |
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; | 750 | return null; |
723 | } | 751 | } |
724 | 752 | ||
@@ -766,9 +794,19 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
766 | XmlDocument doc = new XmlDocument(); | 794 | XmlDocument doc = new XmlDocument(); |
767 | doc.LoadXml(xmlData); | 795 | doc.LoadXml(xmlData); |
768 | XmlElement e = (XmlElement)doc.SelectSingleNode("/CoalescedObject"); | 796 | XmlElement e = (XmlElement)doc.SelectSingleNode("/CoalescedObject"); |
797 | Vector3 rez_pos; | ||
769 | if (e == null || attachment) // Single | 798 | if (e == null || attachment) // Single |
770 | { | 799 | { |
771 | SceneObjectGroup g = SceneObjectSerializer.FromOriginalXmlFormat(xmlData); | 800 | SceneObjectGroup g = SceneObjectSerializer.FromOriginalXmlFormat(xmlData); |
801 | if (!attachment) | ||
802 | { | ||
803 | g.RootPart.AttachPoint = g.RootPart.Shape.State; | ||
804 | g.RootPart.AttachOffset = g.AbsolutePosition; | ||
805 | g.RootPart.AttachRotation = g.GroupRotation; | ||
806 | if (g.RootPart.Shape.PCode != (byte)PCode.NewTree && | ||
807 | g.RootPart.Shape.PCode != (byte)PCode.Tree) | ||
808 | g.RootPart.Shape.State = 0; | ||
809 | } | ||
772 | 810 | ||
773 | objlist.Add(g); | 811 | objlist.Add(g); |
774 | veclist.Add(Vector3.Zero); | 812 | veclist.Add(Vector3.Zero); |
@@ -778,6 +816,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
778 | RayStart, RayEnd, RayTargetID, Quaternion.Identity, | 816 | RayStart, RayEnd, RayTargetID, Quaternion.Identity, |
779 | BypassRayCast, bRayEndIsIntersection, true, g.GetAxisAlignedBoundingBox(out offsetHeight), false); | 817 | BypassRayCast, bRayEndIsIntersection, true, g.GetAxisAlignedBoundingBox(out offsetHeight), false); |
780 | pos.Z += offsetHeight; | 818 | pos.Z += offsetHeight; |
819 | rez_pos = pos; | ||
781 | } | 820 | } |
782 | else | 821 | else |
783 | { | 822 | { |
@@ -792,12 +831,20 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
792 | BypassRayCast, bRayEndIsIntersection, true, | 831 | BypassRayCast, bRayEndIsIntersection, true, |
793 | bbox, false); | 832 | bbox, false); |
794 | 833 | ||
834 | rez_pos = pos; | ||
835 | |||
795 | pos -= bbox / 2; | 836 | pos -= bbox / 2; |
796 | 837 | ||
797 | XmlNodeList groups = e.SelectNodes("SceneObjectGroup"); | 838 | XmlNodeList groups = e.SelectNodes("SceneObjectGroup"); |
798 | foreach (XmlNode n in groups) | 839 | foreach (XmlNode n in groups) |
799 | { | 840 | { |
800 | SceneObjectGroup g = SceneObjectSerializer.FromOriginalXmlFormat(n.OuterXml); | 841 | SceneObjectGroup g = SceneObjectSerializer.FromOriginalXmlFormat(n.OuterXml); |
842 | g.RootPart.AttachPoint = g.RootPart.Shape.State; | ||
843 | g.RootPart.AttachOffset = g.AbsolutePosition; | ||
844 | g.RootPart.AttachRotation = g.GroupRotation; | ||
845 | if (g.RootPart.Shape.PCode != (byte)PCode.NewTree && | ||
846 | g.RootPart.Shape.PCode != (byte)PCode.Tree) | ||
847 | g.RootPart.Shape.State = 0; | ||
801 | 848 | ||
802 | objlist.Add(g); | 849 | objlist.Add(g); |
803 | XmlElement el = (XmlElement)n; | 850 | XmlElement el = (XmlElement)n; |
@@ -817,12 +864,35 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
817 | } | 864 | } |
818 | } | 865 | } |
819 | 866 | ||
820 | if (item != null && !DoPreRezWhenFromItem(remoteClient, item, objlist, pos, veclist, attachment)) | 867 | int primcount = 0; |
868 | foreach (SceneObjectGroup g in objlist) | ||
869 | primcount += g.PrimCount; | ||
870 | |||
871 | if (!m_Scene.Permissions.CanRezObject( | ||
872 | primcount, remoteClient.AgentId, rez_pos) | ||
873 | && !attachment) | ||
874 | { | ||
875 | // The client operates in no fail mode. It will | ||
876 | // have already removed the item from the folder | ||
877 | // if it's no copy. | ||
878 | // Put it back if it's not an attachment | ||
879 | // | ||
880 | if (item != null) | ||
881 | { | ||
882 | if (((item.CurrentPermissions & (uint)PermissionMask.Copy) == 0) && (!attachment)) | ||
883 | remoteClient.SendBulkUpdateInventory(item); | ||
884 | } | ||
885 | |||
886 | return null; | ||
887 | } | ||
888 | |||
889 | if (item != null && !DoPreRezWhenFromItem(remoteClient, item, objlist, rez_pos, veclist, attachment)) | ||
821 | return null; | 890 | return null; |
822 | 891 | ||
823 | for (int i = 0; i < objlist.Count; i++) | 892 | for (int i = 0; i < objlist.Count; i++) |
824 | { | 893 | { |
825 | group = objlist[i]; | 894 | group = objlist[i]; |
895 | SceneObjectPart rootPart = group.RootPart; | ||
826 | 896 | ||
827 | // m_log.DebugFormat( | 897 | // m_log.DebugFormat( |
828 | // "[INVENTORY ACCESS MODULE]: Preparing to rez {0} {1} {2} ownermask={3:X} nextownermask={4:X} groupmask={5:X} everyonemask={6:X} for {7}", | 898 | // "[INVENTORY ACCESS MODULE]: Preparing to rez {0} {1} {2} ownermask={3:X} nextownermask={4:X} groupmask={5:X} everyonemask={6:X} for {7}", |
@@ -883,8 +953,6 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
883 | 953 | ||
884 | if (!attachment) | 954 | if (!attachment) |
885 | { | 955 | { |
886 | SceneObjectPart rootPart = group.RootPart; | ||
887 | |||
888 | if (rootPart.Shape.PCode == (byte)PCode.Prim) | 956 | if (rootPart.Shape.PCode == (byte)PCode.Prim) |
889 | group.ClearPartAttachmentData(); | 957 | group.ClearPartAttachmentData(); |
890 | 958 | ||
@@ -902,6 +970,8 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
902 | // remoteClient.Name); | 970 | // remoteClient.Name); |
903 | } | 971 | } |
904 | 972 | ||
973 | group.SetGroup(remoteClient.ActiveGroupId, remoteClient); | ||
974 | |||
905 | if (item != null) | 975 | if (item != null) |
906 | DoPostRezWhenFromItem(item, attachment); | 976 | DoPostRezWhenFromItem(item, attachment); |
907 | 977 | ||
@@ -986,8 +1056,11 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
986 | { | 1056 | { |
987 | rootPart.Name = item.Name; | 1057 | rootPart.Name = item.Name; |
988 | rootPart.Description = item.Description; | 1058 | rootPart.Description = item.Description; |
989 | rootPart.ObjectSaleType = item.SaleType; | 1059 | if ((item.Flags & (uint)InventoryItemFlags.ObjectSlamSale) != 0) |
990 | rootPart.SalePrice = item.SalePrice; | 1060 | { |
1061 | rootPart.ObjectSaleType = item.SaleType; | ||
1062 | rootPart.SalePrice = item.SalePrice; | ||
1063 | } | ||
991 | } | 1064 | } |
992 | 1065 | ||
993 | so.FromFolderID = item.Folder; | 1066 | so.FromFolderID = item.Folder; |
@@ -997,7 +1070,8 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
997 | // rootPart.OwnerID, item.Owner, item.CurrentPermissions); | 1070 | // rootPart.OwnerID, item.Owner, item.CurrentPermissions); |
998 | 1071 | ||
999 | if ((rootPart.OwnerID != item.Owner) || | 1072 | if ((rootPart.OwnerID != item.Owner) || |
1000 | (item.CurrentPermissions & 16) != 0) | 1073 | (item.CurrentPermissions & 16) != 0 || |
1074 | (item.Flags & (uint)InventoryItemFlags.ObjectSlamPerm) != 0) | ||
1001 | { | 1075 | { |
1002 | //Need to kill the for sale here | 1076 | //Need to kill the for sale here |
1003 | rootPart.ObjectSaleType = 0; | 1077 | rootPart.ObjectSaleType = 0; |
@@ -1007,31 +1081,43 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess | |||
1007 | { | 1081 | { |
1008 | foreach (SceneObjectPart part in so.Parts) | 1082 | foreach (SceneObjectPart part in so.Parts) |
1009 | { | 1083 | { |
1010 | if ((item.Flags & (uint)InventoryItemFlags.ObjectHasMultipleItems) == 0) | ||
1011 | { | ||
1012 | part.EveryoneMask = item.EveryOnePermissions; | ||
1013 | part.NextOwnerMask = item.NextPermissions; | ||
1014 | } | ||
1015 | part.GroupMask = 0; // DO NOT propagate here | 1084 | part.GroupMask = 0; // DO NOT propagate here |
1085 | |||
1086 | part.LastOwnerID = part.OwnerID; | ||
1087 | part.OwnerID = item.Owner; | ||
1088 | part.Inventory.ChangeInventoryOwner(item.Owner); | ||
1016 | } | 1089 | } |
1017 | 1090 | ||
1018 | so.ApplyNextOwnerPermissions(); | 1091 | so.ApplyNextOwnerPermissions(); |
1092 | |||
1093 | // In case the user has changed flags on a received item | ||
1094 | // we have to apply those changes after the slam. Else we | ||
1095 | // get a net loss of permissions | ||
1096 | foreach (SceneObjectPart part in so.Parts) | ||
1097 | { | ||
1098 | if ((item.Flags & (uint)InventoryItemFlags.ObjectHasMultipleItems) == 0) | ||
1099 | { | ||
1100 | if ((item.Flags & (uint)InventoryItemFlags.ObjectOverwriteEveryone) != 0) | ||
1101 | part.EveryoneMask = item.EveryOnePermissions & part.BaseMask; | ||
1102 | if ((item.Flags & (uint)InventoryItemFlags.ObjectOverwriteNextOwner) != 0) | ||
1103 | part.NextOwnerMask = item.NextPermissions & part.BaseMask; | ||
1104 | } | ||
1105 | } | ||
1019 | } | 1106 | } |
1020 | } | 1107 | } |
1021 | 1108 | else | |
1022 | foreach (SceneObjectPart part in so.Parts) | ||
1023 | { | 1109 | { |
1024 | part.FromUserInventoryItemID = fromUserInventoryItemId; | 1110 | foreach (SceneObjectPart part in so.Parts) |
1025 | |||
1026 | if ((part.OwnerID != item.Owner) || | ||
1027 | (item.CurrentPermissions & 16) != 0) | ||
1028 | { | 1111 | { |
1029 | part.Inventory.ChangeInventoryOwner(item.Owner); | 1112 | part.FromUserInventoryItemID = fromUserInventoryItemId; |
1030 | part.GroupMask = 0; // DO NOT propagate here | 1113 | |
1114 | if ((item.Flags & (uint)InventoryItemFlags.ObjectOverwriteEveryone) != 0) | ||
1115 | part.EveryoneMask = item.EveryOnePermissions; | ||
1116 | if ((item.Flags & (uint)InventoryItemFlags.ObjectOverwriteNextOwner) != 0) | ||
1117 | part.NextOwnerMask = item.NextPermissions; | ||
1118 | if ((item.Flags & (uint)InventoryItemFlags.ObjectOverwriteGroup) != 0) | ||
1119 | part.GroupMask = item.GroupPermissions; | ||
1031 | } | 1120 | } |
1032 | |||
1033 | part.EveryoneMask = item.EveryOnePermissions; | ||
1034 | part.NextOwnerMask = item.NextPermissions; | ||
1035 | } | 1121 | } |
1036 | 1122 | ||
1037 | rootPart.TrimPermissions(); | 1123 | rootPart.TrimPermissions(); |