diff --git a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs
index 9fbfc3477f..cdee53c4e2 100644
--- a/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs
+++ b/OpenSim/Region/CoreModules/Framework/InventoryAccess/InventoryAccessModule.cs
@@ -552,8 +552,10 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
///
/// Rez an object into the scene from the user's inventory
///
+ ///
/// FIXME: It would be really nice if inventory access modules didn't also actually do the work of rezzing
/// things to the scene. The caller should be doing that, I think.
+ ///
///
///
///
@@ -570,6 +572,8 @@ namespace OpenSim.Region.CoreModules.Framework.InventoryAccess
UUID RayTargetID, byte BypassRayCast, bool RayEndIsIntersection,
bool RezSelected, bool RemoveItem, UUID fromTaskID, bool attachment)
{
+// m_log.DebugFormat("[INVENTORY ACCESS MODULE]: RezObject for {0}, item {1}", remoteClient.Name, itemID);
+
// Work out position details
byte bRayEndIsIntersection = (byte)0;
diff --git a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
index 73dd531536..43708500fe 100644
--- a/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Framework/Scenes/Scene.Inventory.cs
@@ -1955,11 +1955,60 @@ namespace OpenSim.Region.Framework.Scenes
UUID RayTargetID, byte BypassRayCast, bool RayEndIsIntersection,
bool RezSelected, bool RemoveItem, UUID fromTaskID)
{
- IInventoryAccessModule invAccess = RequestModuleInterface();
- if (invAccess != null)
- invAccess.RezObject(
- remoteClient, itemID, RayEnd, RayStart, RayTargetID, BypassRayCast, RayEndIsIntersection,
- RezSelected, RemoveItem, fromTaskID, false);
+// m_log.DebugFormat(
+// "[PRIM INVENTORY]: RezObject from {0} for item {1} from task id {2}",
+// remoteClient.Name, itemID, fromTaskID);
+
+ if (fromTaskID == UUID.Zero)
+ {
+ IInventoryAccessModule invAccess = RequestModuleInterface();
+ if (invAccess != null)
+ invAccess.RezObject(
+ remoteClient, itemID, RayEnd, RayStart, RayTargetID, BypassRayCast, RayEndIsIntersection,
+ RezSelected, RemoveItem, fromTaskID, false);
+ }
+ else
+ {
+ 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;
+ }
+
+ // Work out position details
+ byte bRayEndIsIntersection = (byte)0;
+
+ if (RayEndIsIntersection)
+ {
+ bRayEndIsIntersection = (byte)1;
+ }
+ else
+ {
+ bRayEndIsIntersection = (byte)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, Quaternion.Identity, Vector3.Zero, 0);
+ }
}
///