LlDialog
From Second Life Wiki
| LSL Portal | | | Functions | | | Events | | | Types | | | Operators | | | Constants | | | Flow Control | | | Script Library | | | Tutorials |
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.
|
| |||||||||||||||||||||||||
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.)

