LlDialog - Second Life Wiki

LlDialog

From Second Life Wiki

Jump to: navigation, search

Function: llDialog( key avatar, string message, list buttons, integer chat_channel );

247 Function ID
1.0 Delay
10.0 Energy

Shows a dialog box on the avatar screen with message and buttons.

• key avatar avatar UUID
• string message message to be displayed
• list buttons button labels
• integer chat_channel output channel


When a button is pressed, the avatar chats the text of the button label on chat_channel.
The position of the chat is where the prim was when the dialog button is pressed.

Button Order
9   10 11
6 7 8  
3 4 5
0 1 2
Channel Constant Description
DEBUG_CHANNEL 0x7FFFFFFF Chat channel reserved for debug and error messages from scripts
PUBLIC_CHANNEL 0x0 Chat channel that broadcasts to all nearby users

Caveats

  • This function causes the script to sleep for 1.0 seconds.
  • There is no way by script to kill a dialog box.
  • There is no way for the script to detect if the user clicked the small "ignore" button (no chat is generated as a result of pressing this button).
  • There is no way to distinguish the input from a dialog box and regular chat made by the same user.
    • It is important to expect that the response may not be one of the buttons.
  • If the listening prim is out of the 20 meter range of the sending prim when a button is pressed, it will not be able to hear the response.
    • This limitation affects attachments too if the wearer moves more than 20 meters from where the listener is located.

message limits

  • If it exceeds 8 lines a scroll bar will appear.
  • message must be less than 512 bytes and not empty. Otherwise it will shout an error on DEBUG_CHANNEL.

buttons limits

  • If buttons is an empty list, it will default to as if it were ["OK"]
  • An error will be shouted on DEBUG_CHANNEL, if...
    • there are more than 12 buttons.
    • any list item is not a string.
    • any list item string length (in bytes) is zero or greater than 24.

Examples

integer channel = 1000;
 
default
{
    state_entry()
    {
        llListen(channel,"", "","");
    }
 
    touch_start(integer count)
    {
        llDialog(llDetectedKey(0), "This is a test dialog.\n\nPlease choose one of the below options.",
                 ["Yes", "No", "0", "1"], channel);
    }
 
    listen(integer chan, string name, key id, string mes)
    {
        if(id == llGetOwnerKey(id))//won't listen to objects unless they aren't in the region.
            llSay(0,name + " (" + (string)llGetObjectDetails(id, (list)OBJECT_POS) + ") chose option " + mes);
    }
}

Useful Snippets

//Compact function to put buttons in "correct" human-readable order
integer channel;
 
list order_buttons(list buttons)
{
    return llList2List(buttons, -3, -1) + llList2List(buttons, -6, -4)
        + llList2List(buttons, -9, -7) + llList2List(buttons, -12, -10);
}
 
default
{
    state_entry()
    {   // Create random channel within range [-1000000000,-2000000000]
	channel = (integer)(llFrand(-1000000000.0) - 1000000000.0);
 
	llListen(channel,"", "","");
    }
 
    touch_start(integer total_number)
    {
        llDialog(llDetectedKey(0),"\nPlease choose an option:\n",
	    order_buttons(["1", "2", "3", "4", "5", "6", "7", "8", "9", "10"]),channel);
    }
 
    listen(integer _chan, string _name, key _id, string _option)
    {
        llSay(0, _name + " chose option " + _option);
    }
}

Notes

It is a good idea to use a very negative channel (if never more negative than the most negative 32-bit integer that is -2,147,483,648), e.g.,

// Create random channel within range [-1000000000,-2000000000]
integer channel = (integer)(llFrand(-1000000000.0) - 1000000000.0);
 
llDialog(llDetectedKey(0), "Please choose one of the below options:",
    ["Yes", "No", "0", "1"], channel);

It is impossible for an avatar to chat on a negative channel, and extremely unlikely that some other object would accidently say something on such a channel. (Of course, the intended target of the message must be set to 'listen' on this channel.)