Difference between revisions of "User:Susie Chaffe"

From Second Life Wiki
Jump to navigation Jump to search
(Blanked the page)
 
Line 1: Line 1:
<lsl>
// Dialog Based Object Rezzer Script
// Susie Chaffe 2013
// Free to use modify and mangle as you see fit


// No Limit on Number of Object Names
// Handles 24 character limit by creating alised object names
// Has the option to create custom buttons / submenus if required
// Is a little long winded for the sake of clarity
//======================= SYSTEM VARIABLES ==========================//
vector  vRezPos = <0.00, 0.00, 1.00>;
integer dialogChannel;
integer dialogHandle;
integer iInvType = INVENTORY_OBJECT;
integer iPageIdx = 0;
list    lstShortName;
//======================= CUSTOM FUNCTIONS ==========================//
// Create Short name for Long Object Names and add to a look up list
// Note that only the first 12 characters will normally show on the menu button
// You can use a shorter substring if you prefer
string AliasName(string sLongName)
{
    string sShortName = (llGetSubString(sLongName,0,23));
    lstShortName += [sShortName,sLongName];
    return sShortName;
}
// Reorder Buttons as shown in list
list order(list buttons)
{
    return llList2List(buttons, -3, -1) + llList2List(buttons, -6, -4) + llList2List(buttons, -9, -7) + llList2List(buttons, -12, -10);
}
// Dynamic menu dialog function
doDialog(key av)
{
    // Standard Buttons that will appear on every page - normally navigation buttons
    list lstStatic = ["<< PREV","< MAIN >","NEXT >>"];
    integer iBtnSlots = 12-llGetListLength(lstStatic);
    // Optional extra buttons that will only appear on the first page
    // Can be used to create sub-menus if required
    // list lstExtraBtn = []; // **Use this if you no extra buttons
    list lstExtraBtn = ["-CONTENTS-"];  // ** This is just an example
    integer iAdjSlots = llGetListLength(lstExtraBtn);
    // Dynamic buttons - read from inventory object names
    integer iTotalNames = llGetInventoryNumber(iInvType);
    // Calculate menu last page index
    integer iMaxPageIdx = (llFloor((float) (iTotalNames + iAdjSlots) / (float) iBtnSlots));
    // First & Last Page Navigation Toggle
    if (iPageIdx < 0 ) iPageIdx = iMaxPageIdx;
    else if (iPageIdx > iMaxPageIdx) iPageIdx = 0;
    // Build the button list
    list lstDialog = [];
    lstShortName = [];
    integer idxSlot = iPageIdx*iBtnSlots;
    integer i;
    // First menu page that has extra buttons
    if((0 == iPageIdx) && ([] != lstExtraBtn))
    {
        for(i = idxSlot; (i < idxSlot+iBtnSlots-iAdjSlots) && (i <= iTotalNames-1 ); i++)
        {
            string sItemName = llGetInventoryName(iInvType,i);
            if(24 < llStringLength(sItemName)) sItemName = AliasName(sItemName);
            lstDialog += [sItemName];
        }
        //Add the Extra button(s)
        lstDialog += lstExtraBtn;
    }
    // Other Pages or First Page if no extra buttons
    else
    {
        for(i = idxSlot; (i < idxSlot+iBtnSlots) && (i <= iTotalNames-1 + iAdjSlots); i++)
        {
            string sItemName = llGetInventoryName(iInvType,i-iAdjSlots);
            if(24 < llStringLength(sItemName)) sItemName = AliasName(sItemName);
            lstDialog += [sItemName];
        }
    }
    // Add Static Btns to the end of the Dyanamic List
    lstDialog += lstStatic;
    // Menu message
    string msg = " \n Choose an Option: "  + "Page " + (string) (iPageIdx+1) + " of " + (string) (iMaxPageIdx + 1);
    //Open a Listen
    dialogChannel = (integer)llFrand(DEBUG_CHANNEL)*-1;
    dialogHandle = llListen(dialogChannel, "", "", "");
    // Call Function and set a time out for the listen
    llDialog(av, msg , order(lstDialog), dialogChannel);
    llSetTimerEvent(30.0);
}
close_menu()
{
    llSetTimerEvent(0);
    llListenRemove(dialogHandle);
}
//=============================== RUN TIME =========================================//
default
{
    touch_start(integer total_number)
    {
        key id = llDetectedKey(0);
        close_menu();
        doDialog(id);
    }
    listen( integer channel, string name, key id, string msg )
    {
        close_menu();
        if(msg == "< MAIN >")
        {
            iPageIdx=0;
            doDialog(id);
            return;
        }
        else if(msg == "<< PREV")
        {
            iPageIdx--;
            doDialog(id);
        }
        else if(msg == "NEXT >>")
        {
            iPageIdx++;
            doDialog(id);
        }
        else if(llGetInventoryType(msg) == 6)
        {
            llRezObject(msg, llGetPos() + vRezPos, ZERO_VECTOR, llGetRot(), 0);
        }
        else if(~llListFindList(lstShortName, [msg]))
        {
            integer idx = llListFindList(lstShortName, [msg]);
            llRezObject(llList2String(lstShortName,idx+1), llGetPos() + vRezPos, ZERO_VECTOR, llGetRot(), 0);
        }
        // Example of Extra Button
        else if(msg == "-CONTENTS-") llSay(0, "There are " + (string) llGetInventoryNumber(iInvType) + " items in this container");
    }
    timer()
    {
        close_menu();
    }
}
//=============================================================================================//
</lsl>

Latest revision as of 04:14, 23 July 2013

<lsl> // Dialog Based Object Rezzer Script // Susie Chaffe 2013 // Free to use modify and mangle as you see fit

// No Limit on Number of Object Names // Handles 24 character limit by creating alised object names // Has the option to create custom buttons / submenus if required // Is a little long winded for the sake of clarity

//======================= SYSTEM VARIABLES ==========================//

vector vRezPos = <0.00, 0.00, 1.00>; integer dialogChannel; integer dialogHandle; integer iInvType = INVENTORY_OBJECT; integer iPageIdx = 0; list lstShortName;

//======================= CUSTOM FUNCTIONS ==========================//

// Create Short name for Long Object Names and add to a look up list // Note that only the first 12 characters will normally show on the menu button // You can use a shorter substring if you prefer string AliasName(string sLongName) {

   string sShortName = (llGetSubString(sLongName,0,23));
   lstShortName += [sShortName,sLongName];
   return sShortName;

}

// Reorder Buttons as shown in list list order(list buttons) {

   return llList2List(buttons, -3, -1) + llList2List(buttons, -6, -4) + llList2List(buttons, -9, -7) + llList2List(buttons, -12, -10);

}

// Dynamic menu dialog function doDialog(key av) {

   // Standard Buttons that will appear on every page - normally navigation buttons
   list lstStatic = ["<< PREV","< MAIN >","NEXT >>"];
   integer iBtnSlots = 12-llGetListLength(lstStatic);
   // Optional extra buttons that will only appear on the first page
   // Can be used to create sub-menus if required
   // list lstExtraBtn = []; // **Use this if you no extra buttons
   list lstExtraBtn = ["-CONTENTS-"];  // ** This is just an example
   integer iAdjSlots = llGetListLength(lstExtraBtn);
   // Dynamic buttons - read from inventory object names
   integer iTotalNames = llGetInventoryNumber(iInvType);
   // Calculate menu last page index
   integer iMaxPageIdx = (llFloor((float) (iTotalNames + iAdjSlots) / (float) iBtnSlots));
   // First & Last Page Navigation Toggle
   if (iPageIdx < 0 ) iPageIdx = iMaxPageIdx;
   else if (iPageIdx > iMaxPageIdx) iPageIdx = 0;
   // Build the button list
   list lstDialog = [];
   lstShortName = [];
   integer idxSlot = iPageIdx*iBtnSlots;
   integer i;
   // First menu page that has extra buttons
   if((0 == iPageIdx) && ([] != lstExtraBtn))
   {
       for(i = idxSlot; (i < idxSlot+iBtnSlots-iAdjSlots) && (i <= iTotalNames-1 ); i++)
       {
           string sItemName = llGetInventoryName(iInvType,i);
           if(24 < llStringLength(sItemName)) sItemName = AliasName(sItemName);
           lstDialog += [sItemName];
       }
       //Add the Extra button(s)
       lstDialog += lstExtraBtn;
   }
   // Other Pages or First Page if no extra buttons
   else
   {
       for(i = idxSlot; (i < idxSlot+iBtnSlots) && (i <= iTotalNames-1 + iAdjSlots); i++)
       {
           string sItemName = llGetInventoryName(iInvType,i-iAdjSlots);
           if(24 < llStringLength(sItemName)) sItemName = AliasName(sItemName);
           lstDialog += [sItemName];
       }
   }
   // Add Static Btns to the end of the Dyanamic List
   lstDialog += lstStatic;
   // Menu message
   string msg = " \n Choose an Option: "  + "Page " + (string) (iPageIdx+1) + " of " + (string) (iMaxPageIdx + 1);
   //Open a Listen
   dialogChannel = (integer)llFrand(DEBUG_CHANNEL)*-1;
   dialogHandle = llListen(dialogChannel, "", "", "");
   // Call Function and set a time out for the listen
   llDialog(av, msg , order(lstDialog), dialogChannel);
   llSetTimerEvent(30.0);

}

close_menu() {

   llSetTimerEvent(0);
   llListenRemove(dialogHandle);

}

//=============================== RUN TIME =========================================//

default {

   touch_start(integer total_number)
   {
       key id = llDetectedKey(0);
       close_menu();
       doDialog(id);
   }
   listen( integer channel, string name, key id, string msg )
   {
       close_menu();
       if(msg == "< MAIN >")
       {
           iPageIdx=0;
           doDialog(id);
           return;
       }
       else if(msg == "<< PREV")
       {
           iPageIdx--;
           doDialog(id);
       }
       else if(msg == "NEXT >>")
       {
           iPageIdx++;
           doDialog(id);
       }
       else if(llGetInventoryType(msg) == 6)
       {
           llRezObject(msg, llGetPos() + vRezPos, ZERO_VECTOR, llGetRot(), 0);
       }
       else if(~llListFindList(lstShortName, [msg]))
       {
           integer idx = llListFindList(lstShortName, [msg]);
           llRezObject(llList2String(lstShortName,idx+1), llGetPos() + vRezPos, ZERO_VECTOR, llGetRot(), 0);
       }
       // Example of Extra Button
       else if(msg == "-CONTENTS-") llSay(0, "There are " + (string) llGetInventoryNumber(iInvType) + " items in this container");
   }
   timer()
   {
       close_menu();
   }

}

//=============================================================================================// </lsl>