From f6bf4c39be634bb8d1a03de5fd048edc54b7df50 Mon Sep 17 00:00:00 2001
From: Charles Krinke
Date: Tue, 24 Jun 2008 23:55:33 +0000
Subject: Mantis#1587. Thank you kindly, Melanie for a patch that: Add
 permissions magling to llGiveInventoryItem, correct some corner case
 functionality

---
 .../Shared/Api/Implementation/LSL_Api.cs           | 39 +++++++++++++++++++++-
 1 file changed, 38 insertions(+), 1 deletion(-)

(limited to 'OpenSim/Region/ScriptEngine/Shared/Api')

diff --git a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
index 7832633..7c6bcf7 100644
--- a/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
+++ b/OpenSim/Region/ScriptEngine/Shared/Api/Implementation/LSL_Api.cs
@@ -36,6 +36,7 @@ using Axiom.Math;
 using libsecondlife;
 using OpenSim;
 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;
@@ -2549,7 +2550,43 @@ namespace OpenSim.Region.ScriptEngine.Shared.Api
         public void llGiveInventory(string destination, string inventory)
         {
             m_host.AddScriptLPS(1);
-            NotImplemented("llGiveInventory");
+            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<LLUUID, TaskInventoryItem> 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.MoveTaskInventoryItem(destId, m_host, objId);
+            }
+
+            if (!found)
+                llSay(0, "Could not find object " + inventory);
         }
 
         public void llRemoveInventory(string item)
-- 
cgit v1.1