Jump to content

LlDialog

From OSgrid Wiki
Revision as of 18:02, 30 December 2017 by Osgridadmin (talk | contribs) (Created page with "==Function: llDialog( key avatar, string message, list buttons, integer chat_channel );== Shows a blue dialog box in the upper right corner of the avatar's screen with a messa...")
(diff) ← Older revision | Latest revision (diff) | Newer revision → (diff)

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

Shows a blue dialog box in the upper right corner of the avatar's screen with a message and choice buttons, as well as an ignore button. This has many uses ranging from simple message delivery to complex menu systems.
• key avatar – avatar UUID that is in the same region
• string message – message to be displayed
• list buttons – button labels
• integer chat_channel – output channel, any integer value

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

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.


Button Order
9 10 11
6 7 8
3 4 5
1 2 3

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 distance between the root prim of the listening object and the dialog generating prim is greater than 20 meters when a button is pressed, the response will not be heard.
-• This limitation affects attachments too if the wearer moves more than 20 meters from where the listener is located.

message limits

• message must be fewer than 512 bytes in length and be not empty. If it is empty, llDialog will shout "llDialog: must supply a message" on the DEBUG_CHANNEL. If it is greater than or equal to 512 bytes, it shouts (again on the debug channel): "llDialog: message too long, must be less than 512 characters"; in both instances, the dialog box will not be created for avatar.
• The client only displays 8 lines of message if it is longer the dialog has a scroll bar. See #Appearance.

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

<source lang="lsl">

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);
   }

} </source>


Useful Snippets

<source lang="lsl">

//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);
   }

} </source>


Notes
To use dialog boxes to make menu systems, see Dialog Menus: A step by step guide (aimed at learners).

Tips
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.,

<source lang="lsl">

// 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);

</source>


Negative channels are popular for script communications because the client is unable to chat directly on those channels ("/-xxxx message" won't chat "message" on channel "-xxxx", it will chat "/-xxxx message" on channel zero). The only way to do so prior to llTextBox was to use llDialog which was limited to 24 bytes.

You can be reasonably confident that all of your scripted objects have a unique chat channel with this small function:

<source lang="lsl">

integer dialog_channel; // top of script in variables

integer channel() { // top of script in functions

   return (integer)("0x"+llGetSubString((string)llGetKey(),-8,-1));

}

dialog_channel = channel(); // somewhere in actual script execution, such as state_entry() </source>


Appearance

If message requires more than 8 lines, a vertical scroll bar will appear in the dialog.

The message text can be formatted somewhat using "\n" (for newline) and "\t" (for tab). You can do nothing though to influence the font face, size or weight.

There is no way to change the actual size of the dialog, nor change its color.

See Also
Events
• listen
Functions
• llListen
• llTextBox
• llRegionSay
• llWhisper – Sends chat limited to 10 meters
• llSay – Sends chat limited to 20 meters
• llShout – Sends chat limited to 100 meters
• llInstantMessage – Sends chat to the specified user
• llOwnerSay – Sends chat to the owner only