diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs index 5812c60438..48b9ae412b 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs @@ -2283,7 +2283,7 @@ namespace OpenSim.Region.Framework.Scenes return; // only Return can be called without a client // this is not as 0.8x code - // 0.8x did refuse all operation is not allowed on all objects + // 0.8x did refuse all operation if not allowed on all objects // this will do it on allowed objects // current viewers only ask if all allowed @@ -2626,42 +2626,50 @@ namespace OpenSim.Region.Framework.Scenes if (fromTaskID == UUID.Zero) { + // rez from user inventory IInventoryAccessModule invAccess = RequestModuleInterface(); if (invAccess != null) invAccess.RezObject( remoteClient, itemID, rezGroupID, RayEnd, RayStart, RayTargetID, BypassRayCast, RayEndIsIntersection, RezSelected, RemoveItem, fromTaskID, false); + return; } - else + + // rez from a prim inventory + SceneObjectPart part = GetSceneObjectPart(fromTaskID); + if (part == null) { - SceneObjectPart part = GetSceneObjectPart(fromTaskID); - if (part == null) - { - m_log.ErrorFormat( - "[TASK INVENTORY]: {0} tried to rez item id {1} from object id {2} but there is no such scene object", - remoteClient.Name, itemID, fromTaskID); + m_log.ErrorFormat( + "[TASK INVENTORY]: {0} tried to rez item id {1} from object id {2} but there is no such scene object", + remoteClient.Name, itemID, fromTaskID); - return; - } - - TaskInventoryItem item = part.Inventory.GetInventoryItem(itemID); - if (item == null) - { - m_log.ErrorFormat( - "[TASK INVENTORY]: {0} tried to rez item id {1} from object id {2} but there is no such item", - remoteClient.Name, itemID, fromTaskID); - - return; - } - - byte bRayEndIsIntersection = (byte)(RayEndIsIntersection ? 1 : 0); - Vector3 scale = new Vector3(0.5f, 0.5f, 0.5f); - Vector3 pos = GetNewRezLocation( - RayStart, RayEnd, RayTargetID, Quaternion.Identity, - BypassRayCast, bRayEndIsIntersection, true, scale, false); - - RezObject(part, item, pos, null, Vector3.Zero, 0, false); + return; } + + TaskInventoryItem item = part.Inventory.GetInventoryItem(itemID); + if (item == null) + { + m_log.ErrorFormat( + "[TASK INVENTORY]: {0} tried to rez item id {1} from object id {2} but there is no such item", + remoteClient.Name, itemID, fromTaskID); + return; + } + + if(item.InvType != (int)InventoryType.Object) + { + m_log.ErrorFormat( + "[TASK INVENTORY]: {0} tried to rez item id {1} from object id {2} but item is not a object", + remoteClient.Name, itemID, fromTaskID); + return; + } + + byte bRayEndIsIntersection = (byte)(RayEndIsIntersection ? 1 : 0); + Vector3 scale = new Vector3(0.5f, 0.5f, 0.5f); + Vector3 pos = GetNewRezLocation( + RayStart, RayEnd, RayTargetID, Quaternion.Identity, + BypassRayCast, bRayEndIsIntersection, true, scale, false); + + RezObject(part, item, remoteClient.AgentId, rezGroupID, pos, null, Vector3.Zero, 0, false, true, true); } /// @@ -2677,6 +2685,14 @@ namespace OpenSim.Region.Framework.Scenes /// The SceneObjectGroup(s) rezzed, or null if rez was unsuccessful public virtual List RezObject(SceneObjectPart sourcePart, TaskInventoryItem item, Vector3 pos, Quaternion? rot, Vector3 vel, int param, bool atRoot, bool rezSelected = false) + { + return RezObject(sourcePart, item, item.OwnerID, sourcePart.GroupID, + pos, rot, vel, param, atRoot, rezSelected, false); + } + + public virtual List RezObject(SceneObjectPart sourcePart, TaskInventoryItem item, + UUID newowner, UUID newgroup, + Vector3 pos, Quaternion? rot, Vector3 vel, int param, bool atRoot, bool rezSelected, bool humanRez) { if (null == item) return null; @@ -2686,7 +2702,7 @@ namespace OpenSim.Region.Framework.Scenes Vector3 bbox; float offsetHeight; - bool success = sourcePart.Inventory.GetRezReadySceneObjects(item, out objlist, out veclist,out bbox, out offsetHeight); + bool success = sourcePart.Inventory.GetRezReadySceneObjects(item, newowner, newgroup, out objlist, out veclist,out bbox, out offsetHeight); if (!success) return null; @@ -2695,7 +2711,7 @@ namespace OpenSim.Region.Framework.Scenes foreach (SceneObjectGroup group in objlist) totalPrims += group.PrimCount; - if (!Permissions.CanRezObject(totalPrims, item.OwnerID, pos)) + if (!Permissions.CanRezObject(totalPrims, newowner, pos)) return null; if (!Permissions.BypassPermissions()) @@ -2759,6 +2775,12 @@ namespace OpenSim.Region.Framework.Scenes } } + UUID rezzerID; + if(humanRez) + rezzerID = newowner; + else + rezzerID = sourcePart.UUID; + for (int i = 0; i < objlist.Count; i++) { SceneObjectGroup group = objlist[i]; @@ -2774,7 +2796,7 @@ namespace OpenSim.Region.Framework.Scenes group.RootPart.Shape.LastAttachPoint = (byte)group.AttachmentPoint; } - group.RezzerID = sourcePart.UUID; + group.RezzerID = rezzerID; if (rezSelected) { diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs index 734d7e45be..d91f84afe1 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs @@ -1115,6 +1115,11 @@ namespace OpenSim.Region.Framework.Scenes } public bool GetRezReadySceneObjects(TaskInventoryItem item, out List objlist, out List veclist, out Vector3 bbox, out float offsetHeight) + { + return GetRezReadySceneObjects(item, item.OwnerID, m_part.GroupID, out objlist, out veclist, out bbox, out offsetHeight); + } + + public bool GetRezReadySceneObjects(TaskInventoryItem item, UUID NewOwner, UUID NewGroup, out List objlist, out List veclist, out Vector3 bbox, out float offsetHeight) { AssetBase rezAsset = m_part.ParentGroup.Scene.AssetService.Get(item.AssetID.ToString()); @@ -1130,7 +1135,7 @@ namespace OpenSim.Region.Framework.Scenes return false; } - bool single = m_part.ParentGroup.Scene.GetObjectsToRez(rezAsset.Data, false, out objlist, out veclist, out bbox, out offsetHeight); + m_part.ParentGroup.Scene.GetObjectsToRez(rezAsset.Data, false, out objlist, out veclist, out bbox, out offsetHeight); for (int i = 0; i < objlist.Count; i++) { @@ -1155,29 +1160,12 @@ namespace OpenSim.Region.Framework.Scenes rootPart.Name = item.Name; rootPart.Description = item.Description; } -/* reverted to old code till part.ApplyPermissionsOnRez is better reviewed/fixed - group.SetGroup(m_part.GroupID, null); - foreach (SceneObjectPart part in group.Parts) - { - // Convert between InventoryItem classes. You can never have too many similar but slightly different classes :) - InventoryItemBase dest = new InventoryItemBase(item.ItemID, item.OwnerID); - dest.BasePermissions = item.BasePermissions; - dest.CurrentPermissions = item.CurrentPermissions; - dest.EveryOnePermissions = item.EveryonePermissions; - dest.GroupPermissions = item.GroupPermissions; - dest.NextPermissions = item.NextPermissions; - dest.Flags = item.Flags; - - part.ApplyPermissionsOnRez(dest, false, m_part.ParentGroup.Scene); - } -*/ -// old code start + group.SetGroup(NewGroup, null); SceneObjectPart[] partList = group.Parts; - group.SetGroup(m_part.GroupID, null); - - if ((rootPart.OwnerID != item.OwnerID) || (item.CurrentPermissions & (uint)PermissionMask.Slam) != 0 || (item.Flags & (uint)InventoryItemFlags.ObjectSlamPerm) != 0) + bool slamThings = (item.CurrentPermissions & (uint)PermissionMask.Slam) != 0 || (item.Flags & (uint)InventoryItemFlags.ObjectSlamPerm) != 0; + if ((rootPart.OwnerID != NewOwner) || slamThings) { if (m_part.ParentGroup.Scene.Permissions.PropagatePermissions()) { @@ -1197,12 +1185,12 @@ namespace OpenSim.Region.Framework.Scenes foreach (SceneObjectPart part in partList) { - if ((part.OwnerID != item.OwnerID) || (item.CurrentPermissions & (uint)PermissionMask.Slam) != 0 || (item.Flags & (uint)InventoryItemFlags.ObjectSlamPerm) != 0) + if ((part.OwnerID != NewOwner)) { if(part.GroupID != part.OwnerID) part.LastOwnerID = part.OwnerID; - part.OwnerID = item.OwnerID; - part.Inventory.ChangeInventoryOwner(item.OwnerID); + part.OwnerID = NewOwner; + part.Inventory.ChangeInventoryOwner(NewOwner); } if ((item.Flags & (uint)InventoryItemFlags.ObjectOverwriteEveryone) != 0) @@ -1212,7 +1200,7 @@ namespace OpenSim.Region.Framework.Scenes if ((item.Flags & (uint)InventoryItemFlags.ObjectOverwriteGroup) != 0) part.GroupMask = item.GroupPermissions; } -// old code end + rootPart.TrimPermissions(); group.InvalidateDeepEffectivePerms(); }