diff --git a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs
index e6bae4c876..3580b99256 100644
--- a/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs
+++ b/OpenSim/Region/Environment/Scenes/Scene.Inventory.cs
@@ -869,21 +869,10 @@ namespace OpenSim.Region.Environment.Scenes
///
///
///
- ///
+ ///
///
- public void MoveTaskInventoryItem(IClientAPI remoteClient, LLUUID folderId, uint primLocalId, LLUUID itemId)
+ public void MoveTaskInventoryItem(IClientAPI remoteClient, LLUUID folderId, SceneObjectPart part, LLUUID itemId)
{
- SceneObjectPart part = GetSceneObjectPart(primLocalId);
-
- if (null == part)
- {
- m_log.WarnFormat(
- "[PRIM INVENTORY]: " +
- "Move of inventory item {0} from prim with local id {1} failed because the prim could not be found",
- itemId, primLocalId);
-
- return;
- }
TaskInventoryItem taskItem = part.GetInventoryItem(itemId);
@@ -934,7 +923,106 @@ namespace OpenSim.Region.Environment.Scenes
}
}
+
+ ///
+ /// MoveTaskInventoryItem
+ ///
+ ///
+ ///
+ ///
+ ///
+ public void MoveTaskInventoryItem(IClientAPI remoteClient, LLUUID folderId, uint primLocalId, LLUUID itemId)
+ {
+ SceneObjectPart part = GetSceneObjectPart(primLocalId);
+ if (null == part)
+ {
+ m_log.WarnFormat(
+ "[PRIM INVENTORY]: " +
+ "Move of inventory item {0} from prim with local id {1} failed because the prim could not be found",
+ itemId, primLocalId);
+
+ return;
+ }
+ MoveTaskInventoryItem(remoteClient, folderId, part, itemId);
+ }
+
+ ///
+ /// MoveTaskInventoryItem
+ ///
+ ///
+ ///
+ ///
+ ///
+ public void MoveTaskInventoryItem(LLUUID avatarId, LLUUID folderId, SceneObjectPart part, LLUUID itemId)
+ {
+ ScenePresence avatar;
+
+ if (TryGetAvatar(avatarId, out avatar))
+ {
+ MoveTaskInventoryItem(avatar.ControllingClient, folderId, part, itemId);
+ }
+ else
+ {
+ m_log.ErrorFormat(
+ "[PRIM INVENTORY]: " +
+ "Avatar {0} cannot be found to update its prim item asset",
+ avatarId);
+ }
+ }
+
+ ///
+ /// Copy a task (prim) inventory item to another task (prim)
+ ///
+ ///
+ ///
+ ///
+ public void CopyTaskInventoryItem(LLUUID destId, SceneObjectPart part, LLUUID itemId)
+ {
+ TaskInventoryItem srcTaskItem = part.GetInventoryItem(itemId);
+
+ if(srcTaskItem == null)
+ {
+ // error was already logged
+ return;
+ }
+
+ SceneObjectPart destPart = GetSceneObjectPart(destId);
+
+ if(destPart == null)
+ {
+ m_log.ErrorFormat(
+ "[PRIM INVENTORY]: " +
+ "Could not find prim for ID {0}",
+ destId);
+ return;
+ }
+
+ TaskInventoryItem destTaskItem = new TaskInventoryItem();
+
+ destTaskItem.ItemID = LLUUID.Random();
+ destTaskItem.CreatorID = srcTaskItem.CreatorID;
+ destTaskItem.AssetID = srcTaskItem.AssetID;
+ destTaskItem.GroupID = srcTaskItem.GroupID;
+ destTaskItem.OwnerID = srcTaskItem.OwnerID;
+ destTaskItem.ParentID = srcTaskItem.ParentID;
+ destTaskItem.ParentPartID = srcTaskItem.ParentPartID;
+
+ destTaskItem.BaseMask = srcTaskItem.BaseMask;
+ destTaskItem.EveryoneMask = srcTaskItem.EveryoneMask;
+ destTaskItem.GroupMask = srcTaskItem.GroupMask;
+ destTaskItem.OwnerMask = srcTaskItem.OwnerMask;
+ destTaskItem.Flags = srcTaskItem.Flags;
+
+ destTaskItem.Description = srcTaskItem.Description;
+ destTaskItem.Name = srcTaskItem.Name;
+ destTaskItem.InvType = srcTaskItem.InvType;
+ destTaskItem.Type = srcTaskItem.Type;
+
+ destPart.AddInventoryItem(destTaskItem);
+
+ }
+
///
/// Update an item in a prim (task) inventory.
/// This method does not handle scripts, RezScript(IClientAPI, LLUUID, unit)
diff --git a/OpenSim/Region/ScriptEngine/Common/LSL_BuiltIn_Commands.cs b/OpenSim/Region/ScriptEngine/Common/LSL_BuiltIn_Commands.cs
index 6f4e48167e..a4e473d80b 100644
--- a/OpenSim/Region/ScriptEngine/Common/LSL_BuiltIn_Commands.cs
+++ b/OpenSim/Region/ScriptEngine/Common/LSL_BuiltIn_Commands.cs
@@ -35,6 +35,7 @@ using Nini.Config;
using Axiom.Math;
using libsecondlife;
using OpenSim.Framework;
+using OpenSim.Framework.Communications.Cache;
using OpenSim.Region.Environment;
using OpenSim.Region.Environment.Interfaces;
using OpenSim.Region.Environment.Modules.Avatar.Currency.SampleMoney;
@@ -2696,7 +2697,43 @@ namespace OpenSim.Region.ScriptEngine.Common
public void llGiveInventory(string destination, string inventory)
{
m_host.AddScriptLPS(1);
- NotImplemented("llGiveInventory not yet oh no!");
+ bool found = false;
+ LLUUID destId = LLUUID.Zero;
+ LLUUID objId = LLUUID.Zero;
+
+ if(!LLUUID.TryParse(destination, out destId))
+ {
+ llSay(0, "Could not parse key " + destination);
+ return;
+ }
+
+ // move the first object found with this inventory name
+ foreach (KeyValuePair inv in m_host.TaskInventory)
+ {
+ if (inv.Value.Name == inventory)
+ {
+ found = true;
+ objId = inv.Key;
+ break;
+ }
+ }
+
+ // check if destination is an avatar
+ if (World.GetScenePresence(destId) != null)
+ {
+ // destination is an avatar
+ CachedUserInfo userInfo =
+ World.CommsManager.UserProfileCacheService.GetUserDetails(destId);
+ World.MoveTaskInventoryItem(destId,userInfo.RootFolder.ID, m_host, objId);
+ }
+ else
+ {
+ // destination is an object
+ World.CopyTaskInventoryItem(destId, m_host, objId);
+ }
+
+ if (!found)
+ llSay(0, "Could not find object " + inventory);
}
public void llRemoveInventory(string item)