Difference between revisions of "EasyDialog"

From Second Life Wiki
Jump to navigation Jump to search
(Created page with "= EasyDialog = Free to use in any context for any reason. Provided by Pazako Karu Easy to use system for taking on secure dialogs. Simplifies listens and contextual informati...")
 
Line 1: Line 1:
= EasyDialog =
Free to use in any context for any reason. Provided by Pazako Karu
Free to use in any context for any reason. Provided by Pazako Karu


Line 33: Line 32:
}
}
</source>
</source>
= Example use =
= Example use =
Context is useful for creating sub-menus without complicating the listen logic. As you can have a precheck of context, you can keep simple "Yes" and "No" answers, rather than the often-used trope of including special characters with each menu option. No additional variables or flags are necessary.  
Context is useful for creating sub-menus without complicating the listen logic. As you can have a precheck of context, you can keep simple "Yes" and "No" answers, rather than the often-used trope of including special characters with each menu option. No additional variables or flags are necessary.  

Revision as of 20:22, 26 January 2020

Free to use in any context for any reason. Provided by Pazako Karu

Easy to use system for taking on secure dialogs. Simplifies listens and contextual information greatly into gets and sets.

Any use of a dialog will trigger self-clean garbage collection of old listens and values.

Example use case below.

list DIALOG_DATA;
setDialog(key id, string caption, list buttons, integer context) // Creates a listen and a dialog
{   getDialog(id); // Clean up beforehand
    if (llList2Integer(DIALOG_DATA, -3) > llGetTime()) // Clear old
    {   integer i;
        for (i = 0; i < llGetListLength(DIALOG_DATA); i++)
            llListenRemove((integer)DIALOG_DATA[i+2]);
        DIALOG_DATA = []; // If the last timed out, all are invalid
    }
    integer channel = -(integer)llFrand(DEBUG_CHANNEL);
    DIALOG_DATA += [llGetTime()+60, id, llListen(channel, llKey2Name(id), id, ""), context]; // Time, ID, Listen Handle, context
    llDialog(id, caption, buttons, channel);
}
integer getDialog(key id)
{   integer index = llListFindList(DIALOG_DATA, [id]); // Finds the dialog, if it exists
    integer context = (integer)DIALOG_DATA[index+2]; // Context that the dialog was sent in, integer
    if (~index) // If it does...
    {   llListenRemove(llList2Integer(DIALOG_DATA, index+1)); // Remove the listen
        DIALOG_DATA = llDeleteSubList(DIALOG_DATA, index-1, index+1); // Free the memory
    }
    else context = -1; // If it doesn't exist, return nothing
    return context; // Return the context
}

Example use

Context is useful for creating sub-menus without complicating the listen logic. As you can have a precheck of context, you can keep simple "Yes" and "No" answers, rather than the often-used trope of including special characters with each menu option. No additional variables or flags are necessary.

integer context_pancake = 1;
integer context_pie = 2;
default
{
    state_entry()
    {
        setDialog(llGetOwner(), "Do you like pancakes?", ["Yes", "No"], context_pancake);
    }
    listen(integer channel, key id, string message)
    {
        integer context = getDialog(id);
        if(context == context_pancake) // They like pancakes!
        {
            if (message == "Yes")
                llRegionSayTo(llGetOwner(), 0, "Glad to hear it!");
            else if (message == "No")
                setDialog(llGetOwner(), "Sorry, how about pie?", ["Yes", "No"], context_pie);
        }
        else if (context == context_pie) // They like pie!
        {
            if (message == "Yes")
                llRegionSayTo(llGetOwner(), 0, "Pie is my second favorite!");
            else if (message == "No")
                llRegionSayTo(llGetOwner(), 0, "I guess we dont have much in common :(");
        }
    }
}