User:Susie Chaffe
<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>