From 0f008d5f7d4a34d4f7529036f5dd83742423c42f Mon Sep 17 00:00:00 2001
From: Justin Clark-Casey (justincc)
Date: Sat, 6 Apr 2013 01:44:06 +0100
Subject: When rezzing a coalesced object, check adjust position of all
components.
---
.../InventoryAccess/InventoryAccessModule.cs | 47 +++++++++++++---------
1 file changed, 27 insertions(+), 20 deletions(-)
diff --git a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs
index eaf4ce2..ebada5a 100644
--- a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs
@@ -807,7 +807,7 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
}
}
- if (item != null && !DoPreRezWhenFromItem(remoteClient, item, objlist, pos, attachment))
+ if (item != null && !DoPreRezWhenFromItem(remoteClient, item, objlist, pos, veclist, attachment))
return null;
for (int i = 0; i < objlist.Count; i++)
@@ -905,10 +905,15 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
///
///
///
+ ///
+ /// List of vector position adjustments for a coalesced objects. For ordinary objects
+ /// this list will contain just Vector3.Zero. The order of adjustments must match the order of objlist
+ ///
///
/// true if we can processed with rezzing, false if we need to abort
private bool DoPreRezWhenFromItem(
- IClientAPI remoteClient, InventoryItemBase item, List objlist, Vector3 pos, bool isAttachment)
+ IClientAPI remoteClient, InventoryItemBase item, List objlist,
+ Vector3 pos, List veclist, bool isAttachment)
{
UUID fromUserInventoryItemId = UUID.Zero;
@@ -932,27 +937,29 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
}
int primcount = 0;
- foreach (SceneObjectGroup g in objlist)
- primcount += g.PrimCount;
-
- if (!m_Scene.Permissions.CanRezObject(
- primcount, remoteClient.AgentId, pos)
- && !isAttachment)
+ for(int i = 0; i < objlist.Count; i++)
{
- // The client operates in no fail mode. It will
- // have already removed the item from the folder
- // if it's no copy.
- // Put it back if it's not an attachment
- //
- if (((item.CurrentPermissions & (uint)PermissionMask.Copy) == 0) && (!isAttachment))
- remoteClient.SendBulkUpdateInventory(item);
+ SceneObjectGroup g = objlist[i];
+
+ if (!m_Scene.Permissions.CanRezObject(
+ g.PrimCount, remoteClient.AgentId, pos + veclist[i])
+ && !isAttachment)
+ {
+ // The client operates in no fail mode. It will
+ // have already removed the item from the folder
+ // if it's no copy.
+ // Put it back if it's not an attachment
+ //
+ if (((item.CurrentPermissions & (uint)PermissionMask.Copy) == 0) && (!isAttachment))
+ remoteClient.SendBulkUpdateInventory(item);
- ILandObject land = m_Scene.LandChannel.GetLandObject(pos.X, pos.Y);
- remoteClient.SendAlertMessage(string.Format(
- "Can't rez object '{0}' at <{1:F3}, {2:F3}, {3:F3}> on parcel '{4}' in region {5}.",
- item.Name, pos.X, pos.Y, pos.Z, land != null ? land.LandData.Name : "Unknown", m_Scene.RegionInfo.RegionName));
+ ILandObject land = m_Scene.LandChannel.GetLandObject(pos.X, pos.Y);
+ remoteClient.SendAlertMessage(string.Format(
+ "Can't rez object '{0}' at <{1:F3}, {2:F3}, {3:F3}> on parcel '{4}' in region {5}.",
+ item.Name, pos.X, pos.Y, pos.Z, land != null ? land.LandData.Name : "Unknown", m_Scene.Name));
- return false;
+ return false;
+ }
}
for (int i = 0; i < objlist.Count; i++)
--
cgit v1.1