From cc14055e06e9b594e2db3a0d367bd7a86a171ca6 Mon Sep 17 00:00:00 2001 From: onefang Date: Tue, 3 Aug 2021 14:03:27 +1000 Subject: Backported from 0.9.2 fix owner on user rez from a prim inventory to ground With some minor fixes. --- OpenSim/Region/Framework/Scenes/Scene.Inventory.cs | 77 ++++++++++++++-------- .../Framework/Scenes/SceneObjectPartInventory.cs | 19 ++++-- 2 files changed, 60 insertions(+), 36 deletions(-) (limited to 'OpenSim') diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs index c9df488..a0e6fb9 100644 --- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs +++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs @@ -2463,42 +2463,47 @@ 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); - - 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; - } + 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; + } - 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); + 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; + } - RezObject(part, item, pos, null, Vector3.Zero, 0, false); + 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); } /// @@ -2515,6 +2520,14 @@ namespace OpenSim.Region.Framework.Scenes public virtual List RezObject( SceneObjectPart sourcePart, TaskInventoryItem item, Vector3 pos, Quaternion? rot, Vector3 vel, int param, bool atRoot) { + return RezObject(sourcePart, item, item.OwnerID, sourcePart.GroupID, + pos, rot, vel, param, atRoot, false); + } + + public virtual List RezObject(SceneObjectPart sourcePart, TaskInventoryItem item, + UUID newowner, UUID newgroup, + Vector3 pos, Quaternion? rot, Vector3 vel, int param, bool atRoot, bool humanRez) + { if (null == item) return null; @@ -2523,7 +2536,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; @@ -2532,7 +2545,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()) @@ -2596,6 +2609,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]; @@ -2611,7 +2630,7 @@ namespace OpenSim.Region.Framework.Scenes group.RootPart.Shape.LastAttachPoint = (byte)group.AttachmentPoint; } - group.RezzerID = sourcePart.UUID; + group.RezzerID = rezzerID; if( i == 0) AddNewSceneObject(group, true, curpos, rot, vel); diff --git a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs index 8c880fc..dca22ea 100644 --- a/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs +++ b/OpenSim/Region/Framework/Scenes/SceneObjectPartInventory.cs @@ -895,6 +895,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()); if (null == rezAsset) @@ -909,7 +914,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++) { @@ -952,11 +957,11 @@ namespace OpenSim.Region.Framework.Scenes } */ // 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()) { @@ -976,12 +981,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) -- cgit v1.1