mirror of
https://github.com/opensim/opensim.git
synced 2026-06-02 16:45:35 +08:00
fix owner on user rez from a prim inventory to ground
This commit is contained in:
@@ -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<IInventoryAccessModule>();
|
||||
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);
|
||||
}
|
||||
|
||||
/// <summary>
|
||||
@@ -2677,6 +2685,14 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
/// <returns>The SceneObjectGroup(s) rezzed, or null if rez was unsuccessful</returns>
|
||||
public virtual List<SceneObjectGroup> 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<SceneObjectGroup> 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)
|
||||
{
|
||||
|
||||
@@ -1115,6 +1115,11 @@ namespace OpenSim.Region.Framework.Scenes
|
||||
}
|
||||
|
||||
public bool GetRezReadySceneObjects(TaskInventoryItem item, out List<SceneObjectGroup> objlist, out List<Vector3> 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<SceneObjectGroup> objlist, out List<Vector3> 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();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user