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)