Inventory Menu: Difference between revisions

From Second Life Wiki
Jump to navigation Jump to search
New page: {{LSL Header}} Introduction: Ok you want to create a dialog based menu system, you want to support more then 12 buttons so im going to give you quick overview of basic menu using [[llRezA...
 
Strife Onizuka (talk | contribs)
m fixed potential listen leak. personaly i think it is a bad design limiting it to 22 items. Sometime when i'm less annoyed i may fix it
Line 10: Line 10:
list MENU1 = [];
list MENU1 = [];
list MENU2 = [];
list MENU2 = [];
list BUFFER = [];
key id;
integer listener;
integer listener;
integer i;
integer MENU_CHANNEL = 1000;
integer MENU_CHANNEL = 1000;


Line 19: Line 16:
Dialog(key id, list menu)
Dialog(key id, list menu)
{
{
    llListenRemove(listener);
     listener = llListen(MENU_CHANNEL, "", NULL_KEY, "");
     listener = llListen(MENU_CHANNEL, "", NULL_KEY, "");
     llDialog(id, "Select one object below: ", menu, MENU_CHANNEL);
     llDialog(id, "Select one object below: ", menu, MENU_CHANNEL);
Line 32: Line 30:
     touch_start(integer total_number)
     touch_start(integer total_number)
     {
     {
        integer i = 0;
         MENU1 = [];
         MENU1 = [];
         MENU2 = [];
         MENU2 = [];
         if (llGetInventoryNumber(INVENTORY_OBJECT) <= 11)
         integer c = llGetInventoryNumber(INVENTORY_OBJECT);
         {      
        if (c <= 12)
             for (i = 0; i < llGetInventoryNumber(INVENTORY_OBJECT); i++)
         {
                 MENU1 += [llGetInventoryName(INVENTORY_OBJECT, i)];
             for (; i < c; ++i)
                 MENU1 += llGetInventoryName(INVENTORY_OBJECT, i);
         }
         }
         else
         else
         {         
         {         
             for (i = 0; i < 10; i++)
             for (; i < 11; ++i)
                 MENU1 += [llGetInventoryName(INVENTORY_OBJECT, i)];
                 MENU1 += llGetInventoryName(INVENTORY_OBJECT, i);
             for (i = 10; i < llGetInventoryNumber(INVENTORY_OBJECT); i++)
            if(c > 22)
                 MENU2 += [llGetInventoryName(INVENTORY_OBJECT, i)];  
                c = 22;
             for (; i < c; ++i)
                 MENU2 += llGetInventoryName(INVENTORY_OBJECT, i);  
             MENU1 += ">>";
             MENU1 += ">>";
             MENU2 += "<<";                           
             MENU2 += "<<";                           
         }  
         }
         id = llDetectedKey(0);
         Dialog(llDetectedKey(0), MENU1);
        Dialog(id, MENU1);
     }
     }  
      
      
     listen(integer channel, string name, key id, string message)  
     listen(integer channel, string name, key id, string message)  
Line 67: Line 68:
             else                     
             else                     
             {
             {
            // todo add offsets so box sites perfect on rezzer  
                // todo add offsets so box sites perfect on rezzer  
            llRezAtRoot(message, llGetPos(), ZERO_VECTOR, llGetRot(), 0);
                llRezAtRoot(message, llGetPos(), ZERO_VECTOR, llGetRot(), 0);
             }       
             }       
         }
         }
     }   
     }   
       
}
}
</pre>
</pre>

Revision as of 15:23, 3 September 2007

Introduction: Ok you want to create a dialog based menu system, you want to support more then 12 buttons so im going to give you quick overview of basic menu using llRezAtRoot, llGetInventoryName & llGetInventoryNumber

USAGE:just drop objects into the prim and rez them from the dialog by touching the prim.

list MENU1 = [];
list MENU2 = [];
integer listener;
integer MENU_CHANNEL = 1000;


Dialog(key id, list menu)
{
    llListenRemove(listener);
    listener = llListen(MENU_CHANNEL, "", NULL_KEY, "");
    llDialog(id, "Select one object below: ", menu, MENU_CHANNEL);
}

default
{
    on_rez(integer num)
    {
        llResetScript();
    }
    
    touch_start(integer total_number)
    {
        integer i = 0;
        MENU1 = [];
        MENU2 = [];
        integer c = llGetInventoryNumber(INVENTORY_OBJECT);
        if (c <= 12)
        {
            for (; i < c; ++i)
                MENU1 += llGetInventoryName(INVENTORY_OBJECT, i);
        }
        else
        {        
            for (; i < 11; ++i)
                MENU1 += llGetInventoryName(INVENTORY_OBJECT, i);
            if(c > 22)
                c = 22;
            for (; i < c; ++i)
                MENU2 += llGetInventoryName(INVENTORY_OBJECT, i); 
            MENU1 += ">>";
            MENU2 += "<<";                          
        }
        Dialog(llDetectedKey(0), MENU1);
    }
    
    listen(integer channel, string name, key id, string message) 
    {
        if (channel == MENU_CHANNEL)
        {
            llListenRemove(listener);  
            if (message == ">>")
            {
                Dialog(id, MENU2);
            }
            else if (message == "<<")
            {
                Dialog(id, MENU1);
            }        
            else                    
            {
                // todo add offsets so box sites perfect on rezzer 
                llRezAtRoot(message, llGetPos(), ZERO_VECTOR, llGetRot(), 0);
            }      
        }
    }  
}

For technical support, requests, etc., use the Search under the Groups Tab and search for .::Prototype::.

if you have any problems getting this script to work either contect me inworld Revolution Perenti or visit out Open Source Section at skidz partz we have many different versions of this system. Snow Crash