Difference between revisions of "LlGiveInventoryList"

From Second Life Wiki
Jump to navigation Jump to search
m
m
Line 31: Line 31:
     {
     {
         string thisScript = llGetScriptName();
         string thisScript = llGetScriptName();
         list inventoryItems;
         list inventoryItems;
         integer inventoryNumber = llGetInventoryNumber(INVENTORY_ALL);
         integer inventoryNumber = llGetInventoryNumber(INVENTORY_ALL);


         integer index;
         integer index;
         do
         for ( ; index < inventoryNumber; ++index )
         {
         {
             string itemName = llGetInventoryName(INVENTORY_ALL, index);
             string itemName = llGetInventoryName(INVENTORY_ALL, index);
Line 49: Line 47:
                 else
                 else
                 {
                 {
                     llSay(PUBLIC_CHANNEL, "Unable to copy the item named '" + itemName + "'.");
                     llSay(0, "Unable to copy the item named '" + itemName + "'.");
                 }
                 }
             }
             }
         }
         }
        while(++index < inventoryNumber);


        //  if the list is empty, the length of the list is 0 (FALSE)
         if (inventoryItems != [] )
         if (!llGetListLength(inventoryItems))
         {
         {
             llSay(PUBLIC_CHANNEL, "No copiable items found, sorry.");
             llSay(0, "No copiable items found, sorry.");
         }
         }
         else
         else
         {
         {
             llGiveInventoryList(llDetectedKey(0), llGetObjectName(), inventoryItems);// 3.0 seconds delay
             llGiveInventoryList(llDetectedKey(0), llGetObjectName(), inventoryItems);   // 3.0 seconds delay
         }
         }
     }
     }
Line 70: Line 66:
//  script gives items to owner only
//  script gives items to owner only
//  all copiable items are given within a single folder
//  all copiable items are given within a single folder
//  all no-copy items are transferred seperately (only one time, right? right!)
//  all no-copy items are transferred separately (only one time, right? right!)


default
default
Line 77: Line 73:
     {
     {
         key owner = llGetOwner();
         key owner = llGetOwner();
         key touchingAvatar = llDetectedKey(0);
         if (llDetectedKey(0) != owner)
 
    //  to reduce indentation we invert the
    //  if-owner-check to if-not-owner
 
        if(touchingAvatar != owner)
             return;
             return;


Line 89: Line 80:


         integer index;
         integer index;
         do
         for ( ; index < inventoryNumber; ++index )
         {
         {
             string itemName = llGetInventoryName(INVENTORY_ALL, index);
             string itemName = llGetInventoryName(INVENTORY_ALL, index);
 
             if (itemName != llGetScriptName() )
             if (llGetInventoryPermMask(itemName, MASK_OWNER) & PERM_COPY)
             {
             {
                 inventoryItems += itemName;
                 if (llGetInventoryPermMask(itemName, MASK_OWNER) & PERM_COPY)
            }
                {
            else
                    inventoryItems += itemName;
            {
                }
                llGiveInventory(owner, itemName);// 2.0 seconds delay
                else
                {
                    llGiveInventory(owner, itemName);   // 2.0 seconds delay
                }
             }
             }
         }
         }
        while(++index < inventoryNumber);


         llGiveInventoryList(owner, llGetObjectName(), inventoryItems);// 3.0 seconds delay
         if (inventoryItems != [] )
            llGiveInventoryList(owner, llGetObjectName(), inventoryItems);   // 3.0 seconds delay
     }
     }
}
}

Revision as of 07:26, 30 March 2014

Summary

Function: llGiveInventoryList( key target, string folder, list inventory );

Gives inventory items to target, creating a new folder to put them in.

• key target avatar or prim UUID that is in the same region
• string folder folder name to use
• list inventory a list of items in the inventory of the prim this script is in

Specification

target types

Depending upon the type of target this function works differently.

  • Avatar
    • Must be or recently have been within the same Region as sending object. SVC-868
    • Places the inventory items in a newly created folder in the avatars inventory (even if there is a folder by the same name, a new one is created).
  • Prim / Object
    • The prim must be in the same region.
    • Does not create a folder.

Caveats

  • This function causes the script to sleep for 3.0 seconds.
  • If target is not the owner nor shares the same owner, and inventory does not have transfer permissions, an error is shouted on DEBUG_CHANNEL.
  • If inventory permissions do not allow copy, the transfer fails and an error is shouted on DEBUG_CHANNEL.
  • If target is a prim that is not in the same region an error is shouted on DEBUG_CHANNEL.
  • When scripts are copied or moved between inventories, their state does not survive the transfer. Memory, event queue and execution position are all discarded.
  • If inventory is missing from the prim's inventory then an error is shouted on DEBUG_CHANNEL.
All Issues ~ Search JIRA for related Bugs

Examples

<lsl> // when the prim is touched, the script checks all other inventory items whether or not they're copiable // copiable items are added to a list, if the list is not empty when all items have been checked // the prim gives them to the touching avatar within a single folder

default {

   touch_start(integer num_detected)
   {
       string thisScript = llGetScriptName();
       list inventoryItems;
       integer inventoryNumber = llGetInventoryNumber(INVENTORY_ALL);
       integer index;
       for ( ; index < inventoryNumber; ++index )
       {
           string itemName = llGetInventoryName(INVENTORY_ALL, index);
           if (itemName != thisScript)
           {
               if (llGetInventoryPermMask(itemName, MASK_OWNER) & PERM_COPY)
               {
                   inventoryItems += itemName;
               }
               else
               {
                   llSay(0, "Unable to copy the item named '" + itemName + "'.");
               }
           }
       }
       if (inventoryItems != [] )
       {
           llSay(0, "No copiable items found, sorry.");
       }
       else
       {
           llGiveInventoryList(llDetectedKey(0), llGetObjectName(), inventoryItems);    // 3.0 seconds delay
       }
   }

} </lsl> <lsl> // script gives items to owner only // all copiable items are given within a single folder // all no-copy items are transferred separately (only one time, right? right!)

default {

   touch_start(integer num_detected)
   {
       key owner = llGetOwner();
       if (llDetectedKey(0) != owner)
           return;
       list inventoryItems;
       integer inventoryNumber = llGetInventoryNumber(INVENTORY_ALL);
       integer index;
       for ( ; index < inventoryNumber; ++index )
       {
           string itemName = llGetInventoryName(INVENTORY_ALL, index);
           if (itemName != llGetScriptName() )
           {
               if (llGetInventoryPermMask(itemName, MASK_OWNER) & PERM_COPY)
               {
                   inventoryItems += itemName;
               }
               else
               {
                   llGiveInventory(owner, itemName);    // 2.0 seconds delay
               }
           }
       }
       if (inventoryItems != [] )
           llGiveInventoryList(owner, llGetObjectName(), inventoryItems);    // 3.0 seconds delay
   }

}

</lsl>

See Also

Events

•  changed

Functions

•  llGiveInventory

Deep Notes

All Issues

~ Search JIRA for related Issues
   llGiveInventoryList should be able to work gridwide

Signature

function void llGiveInventoryList( key target, string folder, list inventory );