Difference between revisions of "LlGiveInventoryList"

From Second Life Wiki
Jump to navigation Jump to search
m
m (Minimal example)
 
(10 intermediate revisions by 8 users not shown)
Line 1: Line 1:
{{Issues/SVC-868}}{{LSL_Function/give|target|inventory|sim=*|uuid=false|copyok=*|insert=list of items}}{{LSL_Function
{{LSL_Function
|inject-2={{Issues/SVC-868}}
{{LSL_Function/give|target|inventory|sim=*|uuid=false|insert=list of items}}
|func_id=231|func_sleep=3.0|func_energy=10.0
|func_id=231|func_sleep=3.0|func_energy=10.0
|func=llGiveInventoryList
|func=llGiveInventoryList
Line 12: Line 14:
Depending upon the type of '''target''' this function works differently.
Depending upon the type of '''target''' this function works differently.
* Avatar
* Avatar
** Must be or recently have been within the same Region as sending object. [[#SVC-868|SVC-868]]
** Must be in or able to see into the same Region as the sending object, or recently have been so. [[#SVC-868|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).
** 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
* Prim / Object
Line 18: Line 20:
** Does ''not'' create a folder.
** Does ''not'' create a folder.
|caveats=
|caveats=
|examples=<lsl>// When any user clicks this object, this script will give a folder containing everything in the objects inventory
|examples=
// This could be used to give away multiple freebies at once.
<source lang="lsl2">
default
{
    touch_start(integer n)
    {
        key toucher = llDetectedKey(0);
        string folder = "Item Folder";
        list inventory = ["item", "another item"];
        llGiveInventoryList(toucher, folder, inventory);
    }
}
</source>
<source lang="lsl2">
// 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
default
{
{
     touch_start(integer total_number)
     touch_start(integer num_detected)
     {
     {
         list       inventory;
        string thisScript = llGetScriptName();
         integer     num = llGetInventoryNumber(INVENTORY_ALL);
         list inventoryItems;
        string      script = llGetScriptName();
         integer inventoryNumber = llGetInventoryNumber(INVENTORY_ALL);
         integer     i = 0;
 
         integer index;
         for (; i < num; ++i) {
         for ( ; index < inventoryNumber; ++index )
             string name = llGetInventoryName(INVENTORY_ALL, i);
        {
            //Don't give them the selling script.
             string itemName = llGetInventoryName(INVENTORY_ALL, index);
             if(name != script)
 
             if (itemName != thisScript)
             {
             {
                 if(llGetInventoryPermMask(name, MASK_OWNER) & PERM_COPY)
                 if (llGetInventoryPermMask(itemName, MASK_OWNER) & PERM_COPY)
                 {
                 {
                     inventory += name;
                     inventoryItems += itemName;
                 }
                 }
                 else
                 else
                 {
                 {
                     llSay(0, "Don't have permissions to give you \""+name+"\".");
                     llSay(0, "Unable to copy the item named '" + itemName + "'.");
                 }
                 }
             }
             }
         }
         }
 
         if (llGetListLength(inventory) < 1)
         if (inventoryItems == [] )
         {
         {
             llSay(0, "No items to offer.");  
             llSay(0, "No copiable items found, sorry.");
         }
         }
         else
         else
         {
         {
            // give folder to agent, use name of object as name of folder we are giving
             llGiveInventoryList(llDetectedKey(0), llGetObjectName(), inventoryItems);   // 3.0 seconds delay
             llGiveInventoryList(llDetectedKey(0), llGetObjectName(), inventory);
         }
         }
     }
     }
}</lsl>
}
This script illustrates how to use llGiveInventoryList and llGiveInventory together to unpack no-copy items from a box. Copiable items will end up in a folder. No-copy items are transferred separately.
</source>
<lsl>default
<source lang="lsl2">
//  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 total_number)
    touch_start(integer num_detected)
    {
    {
          if(llDetectedKey(0) == llGetOwner())
        key owner = llGetOwner();
          {
        if (llDetectedKey(0) != owner)
              string InvenName;
            return;
              integer InvenNumber = llGetInventoryNumber(INVENTORY_ALL);
 
              list InvenList = [];
        list inventoryItems;
              integer y;
        integer inventoryNumber = llGetInventoryNumber(INVENTORY_ALL);
              for(y = 0; y < InvenNumber; y++)
 
              {
        integer index;
                    InvenName = llGetInventoryName(INVENTORY_ALL, y);
        for ( ; index < inventoryNumber; ++index )
                    if(!llGetInventoryPermMask(InvenName,PERM_COPY))
        {
                    {
            string itemName = llGetInventoryName(INVENTORY_ALL, index);
                        llGiveInventory(llGetOwner(),InvenName);
            if (itemName != llGetScriptName() )
                    }
            {
                    else
                if (llGetInventoryPermMask(itemName, MASK_OWNER) & PERM_COPY)
                    {
                {
                        InvenList += [InvenName];
                    inventoryItems += itemName;
                    }
                }
              }
                else
              llGiveInventoryList(llGetOwner(), llGetObjectName(), InvenList);
                {
          }
                    llGiveInventory(owner, itemName);   // 2.0 seconds delay
    }
                }
            }
        }
 
        if (inventoryItems != [] )
            llGiveInventoryList(owner, llGetObjectName(), inventoryItems);   // 3.0 seconds delay
    }
}
}
</lsl>
</source>
|helpers
|helpers
|also_functions={{LSL DefineRow||[[llGiveInventory]]}}
|also_functions={{LSL DefineRow||[[llGiveInventory]]}}

Latest revision as of 15:54, 1 April 2023

Summary

Function: llGiveInventoryList( key target, string folder, list inventory );
3.0 Forced Delay
10.0 Energy

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 in or able to see into the same Region as the sending object, or recently have been so. 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.

Examples

default
{
    touch_start(integer n)
    {
        key toucher = llDetectedKey(0);
        string folder = "Item Folder";
        list inventory = ["item", "another item"];
        llGiveInventoryList(toucher, folder, inventory);
    }
}
//  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
        }
    }
}
//  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
    }
}

See Also

Events

•  changed

Functions

•  llGiveInventory

Deep Notes

Signature

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