<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://wiki.secondlife.com/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Darling+Brody</id>
	<title>Second Life Wiki - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://wiki.secondlife.com/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Darling+Brody"/>
	<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/wiki/Special:Contributions/Darling_Brody"/>
	<updated>2026-06-17T03:04:45Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlDialog&amp;diff=1210094</id>
		<title>LlDialog</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlDialog&amp;diff=1210094"/>
		<updated>2021-06-11T20:27:02Z</updated>

		<summary type="html">&lt;p&gt;Darling Brody: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function&lt;br /&gt;
|func=llDialog&lt;br /&gt;
|sort=Dialog&lt;br /&gt;
|func_id=247|func_sleep=1.0|func_energy=10.0&lt;br /&gt;
|inject-2=&lt;br /&gt;
{{Issues/VWR-17064}}&lt;br /&gt;
{{Issues/VWR-14537}}&lt;br /&gt;
{{Issues/SVC-1815}}&lt;br /&gt;
{{Issues/SCR-43}}&lt;br /&gt;
{{Issues/STORM-1718}}&lt;br /&gt;
{{LSL_Function/avatar|avatar|sim=*}}&lt;br /&gt;
{{LSL_Function/chat|channel|message|dialog=dialog box}}&lt;br /&gt;
|p1_type=key|p1_name=avatar|p1_desc&lt;br /&gt;
|p2_type=string|p2_name=message|p2_desc&lt;br /&gt;
|p3_type=list|p3_name=buttons|p3_desc=button labels&lt;br /&gt;
|p4_type=integer|p4_name=channel|p4_desc&lt;br /&gt;
|func_desc=Shows a dialog box in the lower right corner of the {{LSLP|avatar}}&#039;s screen (upper right in Viewer 1.x) with a {{LSLP|message}} and choice {{LSLP|buttons}}, as well as an ignore button. This has many uses ranging from simple message delivery to complex menu systems.&lt;br /&gt;
|func_footnote=When a button is pressed, the {{LSLP|avatar}} says the text of the button label on {{LSLP|channel}}.&amp;lt;br/&amp;gt;The position where the chat is generated is where the root prim of the dialog generating object was when the dialog button was pressed.&lt;br /&gt;
|spec&lt;br /&gt;
|caveats=&lt;br /&gt;
*This function &#039;&#039;&#039;only&#039;&#039;&#039; opens a dialog box. The script must then also register a listener on the same &#039;&#039;channel&#039;&#039; using [[llListen]] and have a [[listen]] event handler to receive the response.&lt;br /&gt;
*There is no way by script to kill a dialog box.&lt;br /&gt;
*There is no way for the script to detect if the user clicked the small &amp;lt;code&amp;gt;[&amp;quot;Ignore&amp;quot;]&amp;lt;/code&amp;gt; button (no chat is generated as a result of pressing this button).&lt;br /&gt;
*There is no way to distinguish the input from a dialog box and regular chat made by the same user.&lt;br /&gt;
**It is important to expect that the response may not be one of the buttons.&lt;br /&gt;
*In most cases, the listener will be in the same script as the llDialog, however if not, the distance between the root prim of the [[listen]]ing object and the dialog generating prim becomes a factor. If this distance is greater than 20 meters when a button is pressed, the response will not be heard. See [[#Limits]].&lt;br /&gt;
**This limitation affects attachments too if the wearer moves more than 20 meters from where the listener is located. See [[#Limits]].&lt;br /&gt;
**If the [[listen]]er resides in the same script that created the dialog, then the dialog button is heard sim-wide.&lt;br /&gt;
*By default, only one dialog can be displayed per object in the Second Life Viewer.  This can be overridden by the [[Debug_Settings|ScriptDialogLimitations debug setting]] in the Viewer.&lt;br /&gt;
----&lt;br /&gt;
*The &#039;&#039;&#039;dialog response&#039;&#039;&#039; (the generated chat) has its in world location at the &#039;&#039;&#039;root prim&#039;s global position&#039;&#039;&#039;.&lt;br /&gt;
: It can generate a listen event within 20 meters from that position.&lt;br /&gt;
*The listening location for a child prim in the object is either at the child prim&#039;s location or at the root prim&#039;s location&lt;br /&gt;
: see bugtrace JIRA [https://jira.secondlife.com/browse/SCR-43 SCR-43]&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;tt&amp;gt;message&amp;lt;/tt&amp;gt; limits===&lt;br /&gt;
*{{LSLP|message}} must be fewer than 512 bytes in length and be not empty. If it is empty, [[llDialog]] will shout &amp;lt;code&amp;gt;&amp;quot;[[llDialog]]: must supply a message&amp;quot;&amp;lt;/code&amp;gt; on the [[DEBUG_CHANNEL]]. If you want to create an empty message, however, you can do it legally by using a line feed as your message, as in  &amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;llDialog(avatar_key,&amp;quot; \n&amp;quot;,button_list,dialog_channel);&amp;lt;/source&amp;gt; If the message length is greater than or equal to 512 bytes, it shouts (again on the [[DEBUG_CHANNEL|debug channel]]): &amp;lt;code&amp;gt;&amp;quot;[[llDialog]]: message too long, must be less than 512 characters&amp;quot;&amp;lt;/code&amp;gt;; in both instances, the dialog box will not be created for {{LSLP|avatar}}.&lt;br /&gt;
*The client only displays 20 lines of {{LSLP|message}} at a time, not counting the top line containing the owner and name of the object. If there are more than 20 lines the dialog displays a scroll bar. See [[#Appearance]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;tt&amp;gt;buttons&amp;lt;/tt&amp;gt; limits===&lt;br /&gt;
*If {{LSLP|buttons}} is an empty list, it will default to as if it were &amp;lt;code&amp;gt;[&amp;quot;OK&amp;quot;]&amp;lt;/code&amp;gt;&lt;br /&gt;
*Buttons named &amp;quot;Client_Side_Mute&amp;quot; or &amp;quot;Client_Side_Ignore&amp;quot; will be interpreted by the viewer as if the user click the special &amp;quot;Mute&amp;quot; or &amp;quot;Ignore&amp;quot; buttons, respectively.&lt;br /&gt;
**Prior to [[Release_Notes/Second_Life_Release/3.3.1|SL viewer 3.3.1]] (released in 2012) the viewer treated the buttons with values of &amp;quot;Mute&amp;quot; and &amp;quot;Ignore&amp;quot; as being equivalent to the dialogs special buttons &amp;quot;Mute&amp;quot; and &amp;quot;Ignore&amp;quot;. This was changed as a result of {{JIRA|STORM-1718}}. Some very old versions of some viewer, especially those with a V1-style interface, could still have this old behavior and should be tested.&lt;br /&gt;
**If you need a button in your menu that will collide with one of these special values, please consider adding spaces in the button name (e.g. &amp;lt;code&amp;gt;[&amp;quot; Ignore &amp;quot;]&amp;lt;/code&amp;gt;).&lt;br /&gt;
*An error will be shouted on [[DEBUG_CHANNEL]], if...&lt;br /&gt;
**there are more than 12 buttons.&lt;br /&gt;
**any list item is not a string.&lt;br /&gt;
**any list item string length (measured in bytes, using UTF-8 encoding) is zero or greater than 24.&lt;br /&gt;
***In other words, a button&#039;s text when encoded as UTF-8 cannot be longer than 24 bytes or a empty string.&lt;br /&gt;
***This snippet can be used to truncate the string without giving an error: &amp;lt;code&amp;gt;[[llBase64ToString]]([[llGetSubString]]([[llStringToBase64]](theString), 0, 31))&amp;lt;/code&amp;gt;&lt;br /&gt;
*The client will not display all the characters of a button if the text is wider than the text space of the button. See [[#Appearance]].&lt;br /&gt;
*If the script generates button labels from outside sources like inventory or object names, take care to avoid the special string &amp;lt;code&amp;gt;&amp;quot;!!llTextBox!!&amp;quot;&amp;lt;/code&amp;gt;. This text, used as any button label, will cause [[llDialog]] to behave as [[llTextBox]] instead.&lt;br /&gt;
|examples=&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
// When the prim is touched, give the toucher the option of killing the prim.&lt;br /&gt;
&lt;br /&gt;
integer gListener;     // Identity of the listener associated with the dialog, so we can clean up when not needed&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        // Kill off any outstanding listener, to avoid any chance of multiple listeners being active&lt;br /&gt;
        llListenRemove(gListener);&lt;br /&gt;
        // get the UUID of the person touching this prim&lt;br /&gt;
        key user = llDetectedKey(0);&lt;br /&gt;
        // Listen to any reply from that user only, and only on the same channel to be used by llDialog&lt;br /&gt;
        // It&#039;s best to set up the listener before issuing the dialog&lt;br /&gt;
        gListener = llListen(-99, &amp;quot;&amp;quot;, user, &amp;quot;&amp;quot;);&lt;br /&gt;
        // Send a dialog to that person. We&#039;ll use a fixed negative channel number for simplicity&lt;br /&gt;
        llDialog(user, &amp;quot;\nDo you wish this prim to die?&amp;quot;, [&amp;quot;Yes&amp;quot;, &amp;quot;No&amp;quot; ] , -99);&lt;br /&gt;
        // Start a one-minute timer, after which we will stop listening for responses&lt;br /&gt;
        llSetTimerEvent(60.0);&lt;br /&gt;
    }&lt;br /&gt;
    listen(integer chan, string name, key id, string msg)&lt;br /&gt;
    {&lt;br /&gt;
        // If the user clicked the &amp;quot;Yes&amp;quot; button, kill this prim.&lt;br /&gt;
        if (msg == &amp;quot;Yes&amp;quot;)&lt;br /&gt;
            llDie();&lt;br /&gt;
        // The user did not click &amp;quot;Yes&amp;quot; ...&lt;br /&gt;
        // Make the timer fire immediately, to do clean-up actions&lt;br /&gt;
        llSetTimerEvent(0.1);        &lt;br /&gt;
    }&lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        // Stop listening. It&#039;s wise to do this to reduce lag&lt;br /&gt;
        llListenRemove(gListener);&lt;br /&gt;
        // Stop the timer now that its job is done&lt;br /&gt;
        llSetTimerEvent(0.0);// you can use 0 as well to save memory&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{LSL Tip|Please make sure that you close open listeners where possible. You&#039;ll make the Second Life experience so much better when paying attention to details here.}}&lt;br /&gt;
{{LSL Tip|There are no built-in submenus nor pagination (like in a list with &amp;quot;previous&amp;quot; and &amp;quot;next&amp;quot;) when using [[llDialog]]. You simply get one page with a max of 12 buttons, that&#039;s it. If you want a different dialog menu layout (other info and/or other buttons), you&#039;ll have to build that functionality into your script as the example below demonstrates. }}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
string mainMenuDialog = &amp;quot;\nWhich settings would you like to access?\nClick \&amp;quot;Close\&amp;quot; to close the menu.\n\nYou are here:\nMainmenu&amp;quot;;&lt;br /&gt;
list mainMenuButtons = [&amp;quot;sub 01&amp;quot;, &amp;quot;sub 02&amp;quot;, &amp;quot;Close&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
string subMenu_01_Dialog = &amp;quot;\nClick \&amp;quot;Close\&amp;quot; to close the menu.\nClick \&amp;quot;-Main-\&amp;quot; to return to the main menu.\n\nYou are here:\nMainmenu &amp;gt; sub 01&amp;quot;;&lt;br /&gt;
list subMenu_01_Buttons = [&amp;quot;action 01a&amp;quot;, &amp;quot;action 01b&amp;quot;, &amp;quot;Close&amp;quot;, &amp;quot;-Main-&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
string subMenu_02_Dialog = &amp;quot;\nClick \&amp;quot;Close\&amp;quot; to close the menu.\nClick \&amp;quot;-Main-\&amp;quot; to return to the main menu.\n\nYou are here:\nMainmenu &amp;gt; sub 02&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
list subMenu_02_Buttons = [&amp;quot;action 02a&amp;quot;, &amp;quot;action 02b&amp;quot;, &amp;quot;Close&amp;quot;, &amp;quot;-Main-&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
integer dialogChannel;&lt;br /&gt;
integer dialogHandle;&lt;br /&gt;
&lt;br /&gt;
open_menu(key inputKey, string inputString, list inputList)&lt;br /&gt;
{&lt;br /&gt;
    dialogChannel = (integer)llFrand(DEBUG_CHANNEL)*-1;&lt;br /&gt;
    dialogHandle = llListen(dialogChannel, &amp;quot;&amp;quot;, inputKey, &amp;quot;&amp;quot;);&lt;br /&gt;
    llDialog(inputKey, inputString, inputList, dialogChannel);&lt;br /&gt;
    llSetTimerEvent(30.0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
close_menu()&lt;br /&gt;
{&lt;br /&gt;
    llSetTimerEvent(0.0);// you can use 0 as well to save memory&lt;br /&gt;
    llListenRemove(dialogHandle);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    on_rez(integer start_param)&lt;br /&gt;
    {&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        key id = llDetectedKey(0);&lt;br /&gt;
        // Ensure any outstanding listener is removed before creating a new one&lt;br /&gt;
        close_menu();&lt;br /&gt;
        open_menu(id, mainMenuDialog, mainMenuButtons);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    listen(integer channel, string name, key id, string message)&lt;br /&gt;
    {&lt;br /&gt;
        if(channel != dialogChannel)&lt;br /&gt;
            return;&lt;br /&gt;
&lt;br /&gt;
        close_menu();&lt;br /&gt;
&lt;br /&gt;
        if(message == &amp;quot;-Main-&amp;quot;)&lt;br /&gt;
            open_menu(id, mainMenuDialog, mainMenuButtons);&lt;br /&gt;
&lt;br /&gt;
        else if(message == &amp;quot;sub 01&amp;quot;)&lt;br /&gt;
            open_menu(id, subMenu_01_Dialog, subMenu_01_Buttons);&lt;br /&gt;
&lt;br /&gt;
        else if(message == &amp;quot;sub 02&amp;quot;)&lt;br /&gt;
            open_menu(id, subMenu_02_Dialog, subMenu_02_Buttons);&lt;br /&gt;
&lt;br /&gt;
        else if (message == &amp;quot;action 01a&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            //do something&lt;br /&gt;
            open_menu(id, subMenu_01_Dialog, subMenu_01_Buttons);&lt;br /&gt;
        }&lt;br /&gt;
        else if (message == &amp;quot;action 01b&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            //do something else&lt;br /&gt;
&lt;br /&gt;
            //maybe not re-open the menu for this option?&lt;br /&gt;
            //open_menu(id, subMenu_01_Dialog, subMenu_01_Buttons);&lt;br /&gt;
        }&lt;br /&gt;
        else if (message == &amp;quot;action 02a&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            //do something&lt;br /&gt;
            open_menu(id, subMenu_02_Dialog, subMenu_02_Buttons);&lt;br /&gt;
        }&lt;br /&gt;
        else if (message == &amp;quot;action 02b&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            //do something else&lt;br /&gt;
            open_menu(id, subMenu_02_Dialog, subMenu_02_Buttons);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        close_menu();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|helpers=&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;//Compact function to put buttons in &amp;quot;correct&amp;quot; human-readable order&lt;br /&gt;
integer channel;&lt;br /&gt;
&lt;br /&gt;
list order_buttons(list buttons)&lt;br /&gt;
{&lt;br /&gt;
    return llList2List(buttons, -3, -1) + llList2List(buttons, -6, -4)&lt;br /&gt;
         + llList2List(buttons, -9, -7) + llList2List(buttons, -12, -10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {   // Create random channel within range [-1000000000,-2000000000]&lt;br /&gt;
	channel = (integer)(llFrand(-1000000000.0) - 1000000000.0);&lt;br /&gt;
&lt;br /&gt;
	llListen(channel,&amp;quot;&amp;quot;, &amp;quot;&amp;quot;,&amp;quot;&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
	&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        llDialog(llDetectedKey(0),&amp;quot;\nPlease choose an option:\n&amp;quot;,&lt;br /&gt;
	    order_buttons([&amp;quot;1&amp;quot;, &amp;quot;2&amp;quot;, &amp;quot;3&amp;quot;, &amp;quot;4&amp;quot;, &amp;quot;5&amp;quot;, &amp;quot;6&amp;quot;, &amp;quot;7&amp;quot;, &amp;quot;8&amp;quot;, &amp;quot;9&amp;quot;, &amp;quot;10&amp;quot;]),channel);&lt;br /&gt;
    }&lt;br /&gt;
	&lt;br /&gt;
    listen(integer _chan, string _name, key _id, string _option)&lt;br /&gt;
    {&lt;br /&gt;
        llSay(0, _name + &amp;quot; selected option &amp;quot; + _option);&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
list make_ordered_buttons(integer input)&lt;br /&gt;
{&lt;br /&gt;
    string output;&lt;br /&gt;
&lt;br /&gt;
    if      (input == 12) output = &amp;quot;10, 11, 12, 7, 8, 9, 4, 5, 6, 1, 2, 3&amp;quot;;&lt;br /&gt;
    else if (input == 11) output = &amp;quot;10, 11, 7, 8, 9, 4, 5, 6, 1, 2, 3&amp;quot;;&lt;br /&gt;
    else if (input == 10) output = &amp;quot;10, 7, 8, 9, 4, 5, 6, 1, 2, 3&amp;quot;;&lt;br /&gt;
    else if (input == 9)  output = &amp;quot;7, 8, 9, 4, 5, 6, 1, 2, 3&amp;quot;;&lt;br /&gt;
    else if (input == 8)  output = &amp;quot;7, 8, 4, 5, 6, 1, 2, 3&amp;quot;;&lt;br /&gt;
    else if (input == 7)  output = &amp;quot;7, 4, 5, 6, 1, 2, 3&amp;quot;;&lt;br /&gt;
    else if (input == 6)  output = &amp;quot;4, 5, 6, 1, 2, 3&amp;quot;;&lt;br /&gt;
    else if (input == 5)  output = &amp;quot;4, 5, 1, 2, 3&amp;quot;;&lt;br /&gt;
    else if (input == 4)  output = &amp;quot;4, 1, 2, 3&amp;quot;;&lt;br /&gt;
    else if (input == 3)  output = &amp;quot;1, 2, 3&amp;quot;;&lt;br /&gt;
    else if (input == 2)  output = &amp;quot;1, 2&amp;quot;;&lt;br /&gt;
    else if (input == 1)  output = &amp;quot;1&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
//  when we want to return [] avoid returning [&amp;quot;&amp;quot;] here&lt;br /&gt;
&lt;br /&gt;
    if (output == &amp;quot;&amp;quot;) return [];&lt;br /&gt;
/*  else convert output */      return llCSV2List(output);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//  Usage:&lt;br /&gt;
&lt;br /&gt;
llDialog(id, &amp;quot;dialog message&amp;quot;, make_ordered_buttons(5), -37812);&lt;br /&gt;
&lt;br /&gt;
//  Output:&lt;br /&gt;
&lt;br /&gt;
//    -     -     -&lt;br /&gt;
//    -     -     -&lt;br /&gt;
//    -   [ 4 ] [ 5 ]&lt;br /&gt;
//  [ 1 ] [ 2 ] [ 3 ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
=== Helper Functions ===&lt;br /&gt;
{{{!}}&lt;br /&gt;
{{LSL DefineRow||[[User:Void_Singer/Functions#uDlgBtnPagList|uDlgBtnPagList]]|Compact Pagination for [[llDialog]] lists, remenu, and multi-user support}}&lt;br /&gt;
{{!}}}&lt;br /&gt;
|constants={{#vardefine:constants_nb}}&lt;br /&gt;
{{{!}}&lt;br /&gt;
{{!}}- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
{{!}}&lt;br /&gt;
{{{!}}{{Prettytable|style=margin-top:0;}}&lt;br /&gt;
{{!}}-{{Hl2}}&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot; {{!}} Button Order&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}}9&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
{{!}}10&lt;br /&gt;
{{!}}11&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}}6&lt;br /&gt;
{{!}}7&lt;br /&gt;
{{!}}8&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}}3&lt;br /&gt;
{{!}}4&lt;br /&gt;
{{!}}5&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}}0&lt;br /&gt;
{{!}}1&lt;br /&gt;
{{!}}2&lt;br /&gt;
{{!}}}&lt;br /&gt;
{{!}}&lt;br /&gt;
{{!}}}&lt;br /&gt;
|related&lt;br /&gt;
|notes=&lt;br /&gt;
To use dialog boxes to make menu systems, see [[Dialog Menus|Dialog Menus: A step by step guide]] (aimed at learners).&lt;br /&gt;
&lt;br /&gt;
===Tips===&lt;br /&gt;
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), &#039;&#039;e.g.&#039;&#039;,&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Create random channel within range [-1000000000,-2000000000]&lt;br /&gt;
integer channel = (integer)(llFrand(-1000000000.0) - 1000000000.0);&lt;br /&gt;
&lt;br /&gt;
llDialog(llDetectedKey(0), &amp;quot;Please choose one of the below options:&amp;quot;,&lt;br /&gt;
    [&amp;quot;Yes&amp;quot;, &amp;quot;No&amp;quot;, &amp;quot;0&amp;quot;, &amp;quot;1&amp;quot;], channel);&amp;lt;/source&amp;gt;&lt;br /&gt;
Negative channels are popular for script communications because for years the standard SL client was unable to chat directly on those channels. However, since late 2016 both third party and the Linden Lab viewer can use negative channels from the chat bar. Previously, the only way for viewers to use negative channels prior to [[llTextBox]] was to use [[llDialog]], which was limited to 24 bytes. &lt;br /&gt;
&lt;br /&gt;
You can be reasonably confident that all of your scripted objects have a unique chat channel with this small function:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;integer dialog_channel; // top of script in variables&lt;br /&gt;
&lt;br /&gt;
integer channel() { // top of script in functions&lt;br /&gt;
    return (integer)(&amp;quot;0x&amp;quot;+llGetSubString((string)llGetKey(),-8,-1));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
dialog_channel = channel(); // somewhere in actual script execution, such as state_entry()&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Since this function uses public information to generate the channel number it should by no means considered secret.&lt;br /&gt;
&lt;br /&gt;
The preceding code can produce both positive and negative channels, depending on the 8th to last character of the key.&lt;br /&gt;
The following examples will always produce negative channels:-&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
    gChannel = 0x80000000 | (integer)(&amp;quot;0x&amp;quot;+(string)llGetKey());&lt;br /&gt;
    gChannel = 0x80000000 | (integer)(&amp;quot;0x&amp;quot;+(string)llGetOwner());&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
This next version returns a channel number between -1073741823 (0xBFFFFFFF) and -2147483648 (0x80000000).  It is also only one line of code.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;privchan = ((integer)(&amp;quot;0x&amp;quot;+llGetSubString((string)llGetKey(),-8,-1)) &amp;amp; 0x3FFFFFFF) ^ 0xBFFFFFFF;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Appearance===&lt;br /&gt;
&lt;br /&gt;
If {{LSLP|message}} requires more than 8 lines, a vertical scroll bar will appear in the dialog.&lt;br /&gt;
: In viewer 3 there is no scroll bar, only the 512 chars message limit is effective, so you may show more than 40 short lines in the message&lt;br /&gt;
: Too many lines will hide some of the buttons or all of them outside the window though&lt;br /&gt;
&lt;br /&gt;
The message text can be formatted somewhat using &amp;quot;\n&amp;quot; (for newline) and &amp;quot;\t&amp;quot; (for tab). If URLs are in the text, they will appear as clickable links, and some [[Viewer URI Name Space|viewer application URLs]] will receive special formatting. (Clickable links were not available before Viewer 2.) You can do nothing though to influence the font face, size or weight.&lt;br /&gt;
&lt;br /&gt;
There is no way to change the actual size of the dialog, nor change its color.&lt;br /&gt;
&lt;br /&gt;
The average number of characters that can be displayed on a dialog line is about 35 characters per line in ASCII7 characters. It depends upon the width of the characters, the viewer version, and font settings.&lt;br /&gt;
&lt;br /&gt;
The number of characters that can be displayed in a button depends upon the width of the characters. You should expect around 10 chars, give or take, not the full 24 in the button definition. The full button definition IS said, up to 24 chars, into the chat channel even though fewer characters may be displayed in the button itself.&lt;br /&gt;
&lt;br /&gt;
===Limits===&lt;br /&gt;
&lt;br /&gt;
My testing shows the a Dialog box now works anywhere in the same Region as the object OR any region it hands you off to (e.g. the region you teleport to). It will not work for any subsequent hand offs. I have tested this with teleport only, I haven&#039;t tested it walking between regions.  &lt;br /&gt;
&lt;br /&gt;
I&#039;ve tested from the next SIM with an Alt, and from 2 SIMs away myself. Both worked without restriction apart from some lag on the messages. (OQ).&lt;br /&gt;
&lt;br /&gt;
|also_events=&lt;br /&gt;
{{LSL DefineRow||[[listen]]|}}&lt;br /&gt;
|also_functions=&lt;br /&gt;
{{LSL DefineRow||[[llListen]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llTextBox]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llRegionSay]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llWhisper]]|Sends chat limited to 10 meters}}&lt;br /&gt;
{{LSL DefineRow||[[llSay]]|Sends chat limited to 20 meters}}&lt;br /&gt;
{{LSL DefineRow||[[llShout]]|Sends chat limited to 100 meters}}&lt;br /&gt;
{{LSL DefineRow||[[llInstantMessage]]|Sends chat to the specified user}}&lt;br /&gt;
{{LSL DefineRow||[[llOwnerSay]]|Sends chat to the owner only}}&lt;br /&gt;
|also_tests&lt;br /&gt;
|also_articles=&lt;br /&gt;
{{LSL DefineRow||[[Dialog Menus|Dialog Menus: A step by step guide]]|A walk through of the entire dialog menu process (aimed at learners).}}&lt;br /&gt;
|cat1=Chat&lt;br /&gt;
|cat2=Communications&lt;br /&gt;
|cat3=Dialog&lt;br /&gt;
|cat4&lt;br /&gt;
|haiku={{Haiku|click here click there. But,|read the options carefully|you might get a shock.}}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Darling Brody</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlDialog&amp;diff=1210093</id>
		<title>LlDialog</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlDialog&amp;diff=1210093"/>
		<updated>2021-06-11T20:21:33Z</updated>

		<summary type="html">&lt;p&gt;Darling Brody: Undo revision 1210092 by Darling Brody (talk)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function&lt;br /&gt;
|func=llDialog&lt;br /&gt;
|sort=Dialog&lt;br /&gt;
|func_id=247|func_sleep=1.0|func_energy=10.0&lt;br /&gt;
|inject-2=&lt;br /&gt;
{{Issues/VWR-17064}}&lt;br /&gt;
{{Issues/VWR-14537}}&lt;br /&gt;
{{Issues/SVC-1815}}&lt;br /&gt;
{{Issues/SCR-43}}&lt;br /&gt;
{{Issues/STORM-1718}}&lt;br /&gt;
{{LSL_Function/avatar|avatar|sim=*}}&lt;br /&gt;
{{LSL_Function/chat|channel|message|dialog=dialog box}}&lt;br /&gt;
|p1_type=key|p1_name=avatar|p1_desc&lt;br /&gt;
|p2_type=string|p2_name=message|p2_desc&lt;br /&gt;
|p3_type=list|p3_name=buttons|p3_desc=button labels&lt;br /&gt;
|p4_type=integer|p4_name=channel|p4_desc&lt;br /&gt;
|func_desc=Shows a dialog box in the lower right corner of the {{LSLP|avatar}}&#039;s screen (upper right in Viewer 1.x) with a {{LSLP|message}} and choice {{LSLP|buttons}}, as well as an ignore button. This has many uses ranging from simple message delivery to complex menu systems.&lt;br /&gt;
|func_footnote=When a button is pressed, the {{LSLP|avatar}} says the text of the button label on {{LSLP|channel}}.&amp;lt;br/&amp;gt;The position where the chat is generated is where the root prim of the dialog generating object was when the dialog button was pressed.&lt;br /&gt;
|spec&lt;br /&gt;
|caveats=&lt;br /&gt;
*This function &#039;&#039;&#039;only&#039;&#039;&#039; opens a dialog box. The script must then also register a listener on the same &#039;&#039;channel&#039;&#039; using [[llListen]] and have a [[listen]] event handler to receive the response.&lt;br /&gt;
*There is no way by script to kill a dialog box.&lt;br /&gt;
*There is no way for the script to detect if the user clicked the small &amp;lt;code&amp;gt;[&amp;quot;Ignore&amp;quot;]&amp;lt;/code&amp;gt; button (no chat is generated as a result of pressing this button).&lt;br /&gt;
*There is no way to distinguish the input from a dialog box and regular chat made by the same user.&lt;br /&gt;
**It is important to expect that the response may not be one of the buttons.&lt;br /&gt;
*In most cases, the listener will be in the same script as the llDialog, however if not, the distance between the root prim of the [[listen]]ing object and the dialog generating prim becomes a factor. If this distance is greater than 20 meters when a button is pressed, the response will not be heard. See [[#Limits]].&lt;br /&gt;
**This limitation affects attachments too if the wearer moves more than 20 meters from where the listener is located. See [[#Limits]].&lt;br /&gt;
**If the [[listen]]er resides in the same script that created the dialog, then the dialog button is heard sim-wide.&lt;br /&gt;
*By default, only one dialog can be displayed per object in the Second Life Viewer.  This can be overridden by the [[Debug_Settings|ScriptDialogLimitations debug setting]] in the Viewer.&lt;br /&gt;
----&lt;br /&gt;
*The &#039;&#039;&#039;dialog response&#039;&#039;&#039; (the generated chat) has its in world location at the &#039;&#039;&#039;root prim&#039;s global position&#039;&#039;&#039;.&lt;br /&gt;
: It can generate a listen event within 20 meters from that position.&lt;br /&gt;
*The listening location for a child prim in the object is either at the child prim&#039;s location or at the root prim&#039;s location&lt;br /&gt;
: see bugtrace JIRA [https://jira.secondlife.com/browse/SCR-43 SCR-43]&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;tt&amp;gt;message&amp;lt;/tt&amp;gt; limits===&lt;br /&gt;
*{{LSLP|message}} must be fewer than 512 bytes in length and be not empty. If it is empty, [[llDialog]] will shout &amp;lt;code&amp;gt;&amp;quot;[[llDialog]]: must supply a message&amp;quot;&amp;lt;/code&amp;gt; on the [[DEBUG_CHANNEL]]. If you want to create an empty message, however, you can do it legally by using a line feed as your message, as in  &amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;llDialog(avatar_key,&amp;quot; \n&amp;quot;,button_list,dialog_channel);&amp;lt;/source&amp;gt; If the message length is greater than or equal to 512 bytes, it shouts (again on the [[DEBUG_CHANNEL|debug channel]]): &amp;lt;code&amp;gt;&amp;quot;[[llDialog]]: message too long, must be less than 512 characters&amp;quot;&amp;lt;/code&amp;gt;; in both instances, the dialog box will not be created for {{LSLP|avatar}}.&lt;br /&gt;
*The client only displays 8 lines of {{LSLP|message}}. If it is longer, the dialog has a scroll bar. See [[#Appearance]].&lt;br /&gt;
Note: This should be 14 lines of message, not counting the extra (15th) line used for the owner and name of the object. The scroll bar does not appear beyond 14 lines in the official viewer. (tested June 2021)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;tt&amp;gt;buttons&amp;lt;/tt&amp;gt; limits===&lt;br /&gt;
*If {{LSLP|buttons}} is an empty list, it will default to as if it were &amp;lt;code&amp;gt;[&amp;quot;OK&amp;quot;]&amp;lt;/code&amp;gt;&lt;br /&gt;
*Buttons named &amp;quot;Client_Side_Mute&amp;quot; or &amp;quot;Client_Side_Ignore&amp;quot; will be interpreted by the viewer as if the user click the special &amp;quot;Mute&amp;quot; or &amp;quot;Ignore&amp;quot; buttons, respectively.&lt;br /&gt;
**Prior to [[Release_Notes/Second_Life_Release/3.3.1|SL viewer 3.3.1]] (released in 2012) the viewer treated the buttons with values of &amp;quot;Mute&amp;quot; and &amp;quot;Ignore&amp;quot; as being equivalent to the dialogs special buttons &amp;quot;Mute&amp;quot; and &amp;quot;Ignore&amp;quot;. This was changed as a result of {{JIRA|STORM-1718}}. Some very old versions of some viewer, especially those with a V1-style interface, could still have this old behavior and should be tested.&lt;br /&gt;
**If you need a button in your menu that will collide with one of these special values, please consider adding spaces in the button name (e.g. &amp;lt;code&amp;gt;[&amp;quot; Ignore &amp;quot;]&amp;lt;/code&amp;gt;).&lt;br /&gt;
*An error will be shouted on [[DEBUG_CHANNEL]], if...&lt;br /&gt;
**there are more than 12 buttons.&lt;br /&gt;
**any list item is not a string.&lt;br /&gt;
**any list item string length (measured in bytes, using UTF-8 encoding) is zero or greater than 24.&lt;br /&gt;
***In other words, a button&#039;s text when encoded as UTF-8 cannot be longer than 24 bytes or a empty string.&lt;br /&gt;
***This snippet can be used to truncate the string without giving an error: &amp;lt;code&amp;gt;[[llBase64ToString]]([[llGetSubString]]([[llStringToBase64]](theString), 0, 31))&amp;lt;/code&amp;gt;&lt;br /&gt;
*The client will not display all the characters of a button if the text is wider than the text space of the button. See [[#Appearance]].&lt;br /&gt;
*If the script generates button labels from outside sources like inventory or object names, take care to avoid the special string &amp;lt;code&amp;gt;&amp;quot;!!llTextBox!!&amp;quot;&amp;lt;/code&amp;gt;. This text, used as any button label, will cause [[llDialog]] to behave as [[llTextBox]] instead.&lt;br /&gt;
|examples=&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
// When the prim is touched, give the toucher the option of killing the prim.&lt;br /&gt;
&lt;br /&gt;
integer gListener;     // Identity of the listener associated with the dialog, so we can clean up when not needed&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        // Kill off any outstanding listener, to avoid any chance of multiple listeners being active&lt;br /&gt;
        llListenRemove(gListener);&lt;br /&gt;
        // get the UUID of the person touching this prim&lt;br /&gt;
        key user = llDetectedKey(0);&lt;br /&gt;
        // Listen to any reply from that user only, and only on the same channel to be used by llDialog&lt;br /&gt;
        // It&#039;s best to set up the listener before issuing the dialog&lt;br /&gt;
        gListener = llListen(-99, &amp;quot;&amp;quot;, user, &amp;quot;&amp;quot;);&lt;br /&gt;
        // Send a dialog to that person. We&#039;ll use a fixed negative channel number for simplicity&lt;br /&gt;
        llDialog(user, &amp;quot;\nDo you wish this prim to die?&amp;quot;, [&amp;quot;Yes&amp;quot;, &amp;quot;No&amp;quot; ] , -99);&lt;br /&gt;
        // Start a one-minute timer, after which we will stop listening for responses&lt;br /&gt;
        llSetTimerEvent(60.0);&lt;br /&gt;
    }&lt;br /&gt;
    listen(integer chan, string name, key id, string msg)&lt;br /&gt;
    {&lt;br /&gt;
        // If the user clicked the &amp;quot;Yes&amp;quot; button, kill this prim.&lt;br /&gt;
        if (msg == &amp;quot;Yes&amp;quot;)&lt;br /&gt;
            llDie();&lt;br /&gt;
        // The user did not click &amp;quot;Yes&amp;quot; ...&lt;br /&gt;
        // Make the timer fire immediately, to do clean-up actions&lt;br /&gt;
        llSetTimerEvent(0.1);        &lt;br /&gt;
    }&lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        // Stop listening. It&#039;s wise to do this to reduce lag&lt;br /&gt;
        llListenRemove(gListener);&lt;br /&gt;
        // Stop the timer now that its job is done&lt;br /&gt;
        llSetTimerEvent(0.0);// you can use 0 as well to save memory&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{LSL Tip|Please make sure that you close open listeners where possible. You&#039;ll make the Second Life experience so much better when paying attention to details here.}}&lt;br /&gt;
{{LSL Tip|There are no built-in submenus nor pagination (like in a list with &amp;quot;previous&amp;quot; and &amp;quot;next&amp;quot;) when using [[llDialog]]. You simply get one page with a max of 12 buttons, that&#039;s it. If you want a different dialog menu layout (other info and/or other buttons), you&#039;ll have to build that functionality into your script as the example below demonstrates. }}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
string mainMenuDialog = &amp;quot;\nWhich settings would you like to access?\nClick \&amp;quot;Close\&amp;quot; to close the menu.\n\nYou are here:\nMainmenu&amp;quot;;&lt;br /&gt;
list mainMenuButtons = [&amp;quot;sub 01&amp;quot;, &amp;quot;sub 02&amp;quot;, &amp;quot;Close&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
string subMenu_01_Dialog = &amp;quot;\nClick \&amp;quot;Close\&amp;quot; to close the menu.\nClick \&amp;quot;-Main-\&amp;quot; to return to the main menu.\n\nYou are here:\nMainmenu &amp;gt; sub 01&amp;quot;;&lt;br /&gt;
list subMenu_01_Buttons = [&amp;quot;action 01a&amp;quot;, &amp;quot;action 01b&amp;quot;, &amp;quot;Close&amp;quot;, &amp;quot;-Main-&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
string subMenu_02_Dialog = &amp;quot;\nClick \&amp;quot;Close\&amp;quot; to close the menu.\nClick \&amp;quot;-Main-\&amp;quot; to return to the main menu.\n\nYou are here:\nMainmenu &amp;gt; sub 02&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
list subMenu_02_Buttons = [&amp;quot;action 02a&amp;quot;, &amp;quot;action 02b&amp;quot;, &amp;quot;Close&amp;quot;, &amp;quot;-Main-&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
integer dialogChannel;&lt;br /&gt;
integer dialogHandle;&lt;br /&gt;
&lt;br /&gt;
open_menu(key inputKey, string inputString, list inputList)&lt;br /&gt;
{&lt;br /&gt;
    dialogChannel = (integer)llFrand(DEBUG_CHANNEL)*-1;&lt;br /&gt;
    dialogHandle = llListen(dialogChannel, &amp;quot;&amp;quot;, inputKey, &amp;quot;&amp;quot;);&lt;br /&gt;
    llDialog(inputKey, inputString, inputList, dialogChannel);&lt;br /&gt;
    llSetTimerEvent(30.0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
close_menu()&lt;br /&gt;
{&lt;br /&gt;
    llSetTimerEvent(0.0);// you can use 0 as well to save memory&lt;br /&gt;
    llListenRemove(dialogHandle);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    on_rez(integer start_param)&lt;br /&gt;
    {&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        key id = llDetectedKey(0);&lt;br /&gt;
        // Ensure any outstanding listener is removed before creating a new one&lt;br /&gt;
        close_menu();&lt;br /&gt;
        open_menu(id, mainMenuDialog, mainMenuButtons);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    listen(integer channel, string name, key id, string message)&lt;br /&gt;
    {&lt;br /&gt;
        if(channel != dialogChannel)&lt;br /&gt;
            return;&lt;br /&gt;
&lt;br /&gt;
        close_menu();&lt;br /&gt;
&lt;br /&gt;
        if(message == &amp;quot;-Main-&amp;quot;)&lt;br /&gt;
            open_menu(id, mainMenuDialog, mainMenuButtons);&lt;br /&gt;
&lt;br /&gt;
        else if(message == &amp;quot;sub 01&amp;quot;)&lt;br /&gt;
            open_menu(id, subMenu_01_Dialog, subMenu_01_Buttons);&lt;br /&gt;
&lt;br /&gt;
        else if(message == &amp;quot;sub 02&amp;quot;)&lt;br /&gt;
            open_menu(id, subMenu_02_Dialog, subMenu_02_Buttons);&lt;br /&gt;
&lt;br /&gt;
        else if (message == &amp;quot;action 01a&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            //do something&lt;br /&gt;
            open_menu(id, subMenu_01_Dialog, subMenu_01_Buttons);&lt;br /&gt;
        }&lt;br /&gt;
        else if (message == &amp;quot;action 01b&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            //do something else&lt;br /&gt;
&lt;br /&gt;
            //maybe not re-open the menu for this option?&lt;br /&gt;
            //open_menu(id, subMenu_01_Dialog, subMenu_01_Buttons);&lt;br /&gt;
        }&lt;br /&gt;
        else if (message == &amp;quot;action 02a&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            //do something&lt;br /&gt;
            open_menu(id, subMenu_02_Dialog, subMenu_02_Buttons);&lt;br /&gt;
        }&lt;br /&gt;
        else if (message == &amp;quot;action 02b&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            //do something else&lt;br /&gt;
            open_menu(id, subMenu_02_Dialog, subMenu_02_Buttons);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        close_menu();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|helpers=&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;//Compact function to put buttons in &amp;quot;correct&amp;quot; human-readable order&lt;br /&gt;
integer channel;&lt;br /&gt;
&lt;br /&gt;
list order_buttons(list buttons)&lt;br /&gt;
{&lt;br /&gt;
    return llList2List(buttons, -3, -1) + llList2List(buttons, -6, -4)&lt;br /&gt;
         + llList2List(buttons, -9, -7) + llList2List(buttons, -12, -10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {   // Create random channel within range [-1000000000,-2000000000]&lt;br /&gt;
	channel = (integer)(llFrand(-1000000000.0) - 1000000000.0);&lt;br /&gt;
&lt;br /&gt;
	llListen(channel,&amp;quot;&amp;quot;, &amp;quot;&amp;quot;,&amp;quot;&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
	&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        llDialog(llDetectedKey(0),&amp;quot;\nPlease choose an option:\n&amp;quot;,&lt;br /&gt;
	    order_buttons([&amp;quot;1&amp;quot;, &amp;quot;2&amp;quot;, &amp;quot;3&amp;quot;, &amp;quot;4&amp;quot;, &amp;quot;5&amp;quot;, &amp;quot;6&amp;quot;, &amp;quot;7&amp;quot;, &amp;quot;8&amp;quot;, &amp;quot;9&amp;quot;, &amp;quot;10&amp;quot;]),channel);&lt;br /&gt;
    }&lt;br /&gt;
	&lt;br /&gt;
    listen(integer _chan, string _name, key _id, string _option)&lt;br /&gt;
    {&lt;br /&gt;
        llSay(0, _name + &amp;quot; selected option &amp;quot; + _option);&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
list make_ordered_buttons(integer input)&lt;br /&gt;
{&lt;br /&gt;
    string output;&lt;br /&gt;
&lt;br /&gt;
    if      (input == 12) output = &amp;quot;10, 11, 12, 7, 8, 9, 4, 5, 6, 1, 2, 3&amp;quot;;&lt;br /&gt;
    else if (input == 11) output = &amp;quot;10, 11, 7, 8, 9, 4, 5, 6, 1, 2, 3&amp;quot;;&lt;br /&gt;
    else if (input == 10) output = &amp;quot;10, 7, 8, 9, 4, 5, 6, 1, 2, 3&amp;quot;;&lt;br /&gt;
    else if (input == 9)  output = &amp;quot;7, 8, 9, 4, 5, 6, 1, 2, 3&amp;quot;;&lt;br /&gt;
    else if (input == 8)  output = &amp;quot;7, 8, 4, 5, 6, 1, 2, 3&amp;quot;;&lt;br /&gt;
    else if (input == 7)  output = &amp;quot;7, 4, 5, 6, 1, 2, 3&amp;quot;;&lt;br /&gt;
    else if (input == 6)  output = &amp;quot;4, 5, 6, 1, 2, 3&amp;quot;;&lt;br /&gt;
    else if (input == 5)  output = &amp;quot;4, 5, 1, 2, 3&amp;quot;;&lt;br /&gt;
    else if (input == 4)  output = &amp;quot;4, 1, 2, 3&amp;quot;;&lt;br /&gt;
    else if (input == 3)  output = &amp;quot;1, 2, 3&amp;quot;;&lt;br /&gt;
    else if (input == 2)  output = &amp;quot;1, 2&amp;quot;;&lt;br /&gt;
    else if (input == 1)  output = &amp;quot;1&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
//  when we want to return [] avoid returning [&amp;quot;&amp;quot;] here&lt;br /&gt;
&lt;br /&gt;
    if (output == &amp;quot;&amp;quot;) return [];&lt;br /&gt;
/*  else convert output */      return llCSV2List(output);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//  Usage:&lt;br /&gt;
&lt;br /&gt;
llDialog(id, &amp;quot;dialog message&amp;quot;, make_ordered_buttons(5), -37812);&lt;br /&gt;
&lt;br /&gt;
//  Output:&lt;br /&gt;
&lt;br /&gt;
//    -     -     -&lt;br /&gt;
//    -     -     -&lt;br /&gt;
//    -   [ 4 ] [ 5 ]&lt;br /&gt;
//  [ 1 ] [ 2 ] [ 3 ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
=== Helper Functions ===&lt;br /&gt;
{{{!}}&lt;br /&gt;
{{LSL DefineRow||[[User:Void_Singer/Functions#uDlgBtnPagList|uDlgBtnPagList]]|Compact Pagination for [[llDialog]] lists, remenu, and multi-user support}}&lt;br /&gt;
{{!}}}&lt;br /&gt;
|constants={{#vardefine:constants_nb}}&lt;br /&gt;
{{{!}}&lt;br /&gt;
{{!}}- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
{{!}}&lt;br /&gt;
{{{!}}{{Prettytable|style=margin-top:0;}}&lt;br /&gt;
{{!}}-{{Hl2}}&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot; {{!}} Button Order&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}}9&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
{{!}}10&lt;br /&gt;
{{!}}11&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}}6&lt;br /&gt;
{{!}}7&lt;br /&gt;
{{!}}8&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}}3&lt;br /&gt;
{{!}}4&lt;br /&gt;
{{!}}5&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}}0&lt;br /&gt;
{{!}}1&lt;br /&gt;
{{!}}2&lt;br /&gt;
{{!}}}&lt;br /&gt;
{{!}}&lt;br /&gt;
{{!}}}&lt;br /&gt;
|related&lt;br /&gt;
|notes=&lt;br /&gt;
To use dialog boxes to make menu systems, see [[Dialog Menus|Dialog Menus: A step by step guide]] (aimed at learners).&lt;br /&gt;
&lt;br /&gt;
===Tips===&lt;br /&gt;
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), &#039;&#039;e.g.&#039;&#039;,&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Create random channel within range [-1000000000,-2000000000]&lt;br /&gt;
integer channel = (integer)(llFrand(-1000000000.0) - 1000000000.0);&lt;br /&gt;
&lt;br /&gt;
llDialog(llDetectedKey(0), &amp;quot;Please choose one of the below options:&amp;quot;,&lt;br /&gt;
    [&amp;quot;Yes&amp;quot;, &amp;quot;No&amp;quot;, &amp;quot;0&amp;quot;, &amp;quot;1&amp;quot;], channel);&amp;lt;/source&amp;gt;&lt;br /&gt;
Negative channels are popular for script communications because for years the standard SL client was unable to chat directly on those channels. However, since late 2016 both third party and the Linden Lab viewer can use negative channels from the chat bar. Previously, the only way for viewers to use negative channels prior to [[llTextBox]] was to use [[llDialog]], which was limited to 24 bytes. &lt;br /&gt;
&lt;br /&gt;
You can be reasonably confident that all of your scripted objects have a unique chat channel with this small function:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;integer dialog_channel; // top of script in variables&lt;br /&gt;
&lt;br /&gt;
integer channel() { // top of script in functions&lt;br /&gt;
    return (integer)(&amp;quot;0x&amp;quot;+llGetSubString((string)llGetKey(),-8,-1));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
dialog_channel = channel(); // somewhere in actual script execution, such as state_entry()&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Since this function uses public information to generate the channel number it should by no means considered secret.&lt;br /&gt;
&lt;br /&gt;
The preceding code can produce both positive and negative channels, depending on the 8th to last character of the key.&lt;br /&gt;
The following examples will always produce negative channels:-&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
    gChannel = 0x80000000 | (integer)(&amp;quot;0x&amp;quot;+(string)llGetKey());&lt;br /&gt;
    gChannel = 0x80000000 | (integer)(&amp;quot;0x&amp;quot;+(string)llGetOwner());&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
This next version returns a channel number between -1073741823 (0xBFFFFFFF) and -2147483648 (0x80000000).  It is also only one line of code.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;privchan = ((integer)(&amp;quot;0x&amp;quot;+llGetSubString((string)llGetKey(),-8,-1)) &amp;amp; 0x3FFFFFFF) ^ 0xBFFFFFFF;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Appearance===&lt;br /&gt;
&lt;br /&gt;
If {{LSLP|message}} requires more than 8 lines, a vertical scroll bar will appear in the dialog.&lt;br /&gt;
: In viewer 3 there is no scroll bar, only the 512 chars message limit is effective, so you may show more than 40 short lines in the message&lt;br /&gt;
: Too many lines will hide some of the buttons or all of them outside the window though&lt;br /&gt;
&lt;br /&gt;
The message text can be formatted somewhat using &amp;quot;\n&amp;quot; (for newline) and &amp;quot;\t&amp;quot; (for tab). If URLs are in the text, they will appear as clickable links, and some [[Viewer URI Name Space|viewer application URLs]] will receive special formatting. (Clickable links were not available before Viewer 2.) You can do nothing though to influence the font face, size or weight.&lt;br /&gt;
&lt;br /&gt;
There is no way to change the actual size of the dialog, nor change its color.&lt;br /&gt;
&lt;br /&gt;
The average number of characters that can be displayed on a dialog line is about 35 characters per line in ASCII7 characters. It depends upon the width of the characters, the viewer version, and font settings.&lt;br /&gt;
&lt;br /&gt;
The number of characters that can be displayed in a button depends upon the width of the characters. You should expect around 10 chars, give or take, not the full 24 in the button definition. The full button definition IS said, up to 24 chars, into the chat channel even though fewer characters may be displayed in the button itself.&lt;br /&gt;
&lt;br /&gt;
===Limits===&lt;br /&gt;
&lt;br /&gt;
My testing shows the a Dialog box now works anywhere in the same Region as the object OR any region it hands you off to (e.g. the region you teleport to). It will not work for any subsequent hand offs. I have tested this with teleport only, I haven&#039;t tested it walking between regions.  &lt;br /&gt;
&lt;br /&gt;
I&#039;ve tested from the next SIM with an Alt, and from 2 SIMs away myself. Both worked without restriction apart from some lag on the messages. (OQ).&lt;br /&gt;
&lt;br /&gt;
|also_events=&lt;br /&gt;
{{LSL DefineRow||[[listen]]|}}&lt;br /&gt;
|also_functions=&lt;br /&gt;
{{LSL DefineRow||[[llListen]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llTextBox]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llRegionSay]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llWhisper]]|Sends chat limited to 10 meters}}&lt;br /&gt;
{{LSL DefineRow||[[llSay]]|Sends chat limited to 20 meters}}&lt;br /&gt;
{{LSL DefineRow||[[llShout]]|Sends chat limited to 100 meters}}&lt;br /&gt;
{{LSL DefineRow||[[llInstantMessage]]|Sends chat to the specified user}}&lt;br /&gt;
{{LSL DefineRow||[[llOwnerSay]]|Sends chat to the owner only}}&lt;br /&gt;
|also_tests&lt;br /&gt;
|also_articles=&lt;br /&gt;
{{LSL DefineRow||[[Dialog Menus|Dialog Menus: A step by step guide]]|A walk through of the entire dialog menu process (aimed at learners).}}&lt;br /&gt;
|cat1=Chat&lt;br /&gt;
|cat2=Communications&lt;br /&gt;
|cat3=Dialog&lt;br /&gt;
|cat4&lt;br /&gt;
|haiku={{Haiku|click here click there. But,|read the options carefully|you might get a shock.}}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Darling Brody</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlDialog&amp;diff=1210092</id>
		<title>LlDialog</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlDialog&amp;diff=1210092"/>
		<updated>2021-06-11T20:09:40Z</updated>

		<summary type="html">&lt;p&gt;Darling Brody: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function&lt;br /&gt;
|func=llDialog&lt;br /&gt;
|sort=Dialog&lt;br /&gt;
|func_id=247|func_sleep=1.0|func_energy=10.0&lt;br /&gt;
|inject-2=&lt;br /&gt;
{{Issues/VWR-17064}}&lt;br /&gt;
{{Issues/VWR-14537}}&lt;br /&gt;
{{Issues/SVC-1815}}&lt;br /&gt;
{{Issues/SCR-43}}&lt;br /&gt;
{{Issues/STORM-1718}}&lt;br /&gt;
{{LSL_Function/avatar|avatar|sim=*}}&lt;br /&gt;
{{LSL_Function/chat|channel|message|dialog=dialog box}}&lt;br /&gt;
|p1_type=key|p1_name=avatar|p1_desc&lt;br /&gt;
|p2_type=string|p2_name=message|p2_desc&lt;br /&gt;
|p3_type=list|p3_name=buttons|p3_desc=button labels&lt;br /&gt;
|p4_type=integer|p4_name=channel|p4_desc&lt;br /&gt;
|func_desc=Shows a dialog box in the lower right corner of the {{LSLP|avatar}}&#039;s screen (upper right in Viewer 1.x) with a {{LSLP|message}} and choice {{LSLP|buttons}}, as well as an ignore button. This has many uses ranging from simple message delivery to complex menu systems.&lt;br /&gt;
|func_footnote=When a button is pressed, the {{LSLP|avatar}} says the text of the button label on {{LSLP|channel}}.&amp;lt;br/&amp;gt;The position where the chat is generated is where the root prim of the dialog generating object was when the dialog button was pressed.&lt;br /&gt;
|spec&lt;br /&gt;
|caveats=&lt;br /&gt;
*This function &#039;&#039;&#039;only&#039;&#039;&#039; opens a dialog box. The script must then also register a listener on the same &#039;&#039;channel&#039;&#039; using [[llListen]] and have a [[listen]] event handler to receive the response.&lt;br /&gt;
*There is no way by script to kill a dialog box.&lt;br /&gt;
*There is no way for the script to detect if the user clicked the small &amp;lt;code&amp;gt;[&amp;quot;Ignore&amp;quot;]&amp;lt;/code&amp;gt; button (no chat is generated as a result of pressing this button).&lt;br /&gt;
*There is no way to distinguish the input from a dialog box and regular chat made by the same user.&lt;br /&gt;
**It is important to expect that the response may not be one of the buttons.&lt;br /&gt;
*In most cases, the listener will be in the same script as the llDialog, however if not, the distance between the root prim of the [[listen]]ing object and the dialog generating prim becomes a factor. If this distance is greater than 20 meters when a button is pressed, the response will not be heard. See [[#Limits]].&lt;br /&gt;
**This limitation affects attachments too if the wearer moves more than 20 meters from where the listener is located. See [[#Limits]].&lt;br /&gt;
**If the [[listen]]er resides in the same script that created the dialog, then the dialog button is heard sim-wide.&lt;br /&gt;
*By default, only one dialog can be displayed per object in the Second Life Viewer.  This can be overridden by the [[Debug_Settings|ScriptDialogLimitations debug setting]] in the Viewer.&lt;br /&gt;
----&lt;br /&gt;
*The &#039;&#039;&#039;dialog response&#039;&#039;&#039; (the generated chat) has its in world location at the &#039;&#039;&#039;root prim&#039;s global position&#039;&#039;&#039;.&lt;br /&gt;
: It can generate a listen event within 20 meters from that position.&lt;br /&gt;
*The listening location for a child prim in the object is either at the child prim&#039;s location or at the root prim&#039;s location&lt;br /&gt;
: see bugtrace JIRA [https://jira.secondlife.com/browse/SCR-43 SCR-43]&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;tt&amp;gt;message&amp;lt;/tt&amp;gt; limits===&lt;br /&gt;
*{{LSLP|message}} must be fewer than 512 bytes in length and be not empty. If it is empty, [[llDialog]] will shout &amp;lt;code&amp;gt;&amp;quot;[[llDialog]]: must supply a message&amp;quot;&amp;lt;/code&amp;gt; on the [[DEBUG_CHANNEL]]. If you want to create an empty message, however, you can do it legally by using a line feed as your message, as in  &amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;llDialog(avatar_key,&amp;quot; \n&amp;quot;,button_list,dialog_channel);&amp;lt;/source&amp;gt; If the message length is greater than or equal to 512 bytes, it shouts (again on the [[DEBUG_CHANNEL|debug channel]]): &amp;lt;code&amp;gt;&amp;quot;[[llDialog]]: message too long, must be less than 512 characters&amp;quot;&amp;lt;/code&amp;gt;; in both instances, the dialog box will not be created for {{LSLP|avatar}}.&lt;br /&gt;
*The client displays 20 lines of {{LSLP|message}} not counting the extra line at the top which is used for the owner and name of the object. If there are more than 20 lines the scroll bar will be used. See [[#Appearance]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;tt&amp;gt;buttons&amp;lt;/tt&amp;gt; limits===&lt;br /&gt;
*If {{LSLP|buttons}} is an empty list, it will default to as if it were &amp;lt;code&amp;gt;[&amp;quot;OK&amp;quot;]&amp;lt;/code&amp;gt;&lt;br /&gt;
*Buttons named &amp;quot;Client_Side_Mute&amp;quot; or &amp;quot;Client_Side_Ignore&amp;quot; will be interpreted by the viewer as if the user click the special &amp;quot;Mute&amp;quot; or &amp;quot;Ignore&amp;quot; buttons, respectively.&lt;br /&gt;
**Prior to [[Release_Notes/Second_Life_Release/3.3.1|SL viewer 3.3.1]] (released in 2012) the viewer treated the buttons with values of &amp;quot;Mute&amp;quot; and &amp;quot;Ignore&amp;quot; as being equivalent to the dialogs special buttons &amp;quot;Mute&amp;quot; and &amp;quot;Ignore&amp;quot;. This was changed as a result of {{JIRA|STORM-1718}}. Some very old versions of some viewer, especially those with a V1-style interface, could still have this old behavior and should be tested.&lt;br /&gt;
**If you need a button in your menu that will collide with one of these special values, please consider adding spaces in the button name (e.g. &amp;lt;code&amp;gt;[&amp;quot; Ignore &amp;quot;]&amp;lt;/code&amp;gt;).&lt;br /&gt;
*An error will be shouted on [[DEBUG_CHANNEL]], if...&lt;br /&gt;
**there are more than 12 buttons.&lt;br /&gt;
**any list item is not a string.&lt;br /&gt;
**any list item string length (measured in bytes, using UTF-8 encoding) is zero or greater than 24.&lt;br /&gt;
***In other words, a button&#039;s text when encoded as UTF-8 cannot be longer than 24 bytes or a empty string.&lt;br /&gt;
***This snippet can be used to truncate the string without giving an error: &amp;lt;code&amp;gt;[[llBase64ToString]]([[llGetSubString]]([[llStringToBase64]](theString), 0, 31))&amp;lt;/code&amp;gt;&lt;br /&gt;
*The client will not display all the characters of a button if the text is wider than the text space of the button. See [[#Appearance]].&lt;br /&gt;
*If the script generates button labels from outside sources like inventory or object names, take care to avoid the special string &amp;lt;code&amp;gt;&amp;quot;!!llTextBox!!&amp;quot;&amp;lt;/code&amp;gt;. This text, used as any button label, will cause [[llDialog]] to behave as [[llTextBox]] instead.&lt;br /&gt;
|examples=&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
// When the prim is touched, give the toucher the option of killing the prim.&lt;br /&gt;
&lt;br /&gt;
integer gListener;     // Identity of the listener associated with the dialog, so we can clean up when not needed&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        // Kill off any outstanding listener, to avoid any chance of multiple listeners being active&lt;br /&gt;
        llListenRemove(gListener);&lt;br /&gt;
        // get the UUID of the person touching this prim&lt;br /&gt;
        key user = llDetectedKey(0);&lt;br /&gt;
        // Listen to any reply from that user only, and only on the same channel to be used by llDialog&lt;br /&gt;
        // It&#039;s best to set up the listener before issuing the dialog&lt;br /&gt;
        gListener = llListen(-99, &amp;quot;&amp;quot;, user, &amp;quot;&amp;quot;);&lt;br /&gt;
        // Send a dialog to that person. We&#039;ll use a fixed negative channel number for simplicity&lt;br /&gt;
        llDialog(user, &amp;quot;\nDo you wish this prim to die?&amp;quot;, [&amp;quot;Yes&amp;quot;, &amp;quot;No&amp;quot; ] , -99);&lt;br /&gt;
        // Start a one-minute timer, after which we will stop listening for responses&lt;br /&gt;
        llSetTimerEvent(60.0);&lt;br /&gt;
    }&lt;br /&gt;
    listen(integer chan, string name, key id, string msg)&lt;br /&gt;
    {&lt;br /&gt;
        // If the user clicked the &amp;quot;Yes&amp;quot; button, kill this prim.&lt;br /&gt;
        if (msg == &amp;quot;Yes&amp;quot;)&lt;br /&gt;
            llDie();&lt;br /&gt;
        // The user did not click &amp;quot;Yes&amp;quot; ...&lt;br /&gt;
        // Make the timer fire immediately, to do clean-up actions&lt;br /&gt;
        llSetTimerEvent(0.1);        &lt;br /&gt;
    }&lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        // Stop listening. It&#039;s wise to do this to reduce lag&lt;br /&gt;
        llListenRemove(gListener);&lt;br /&gt;
        // Stop the timer now that its job is done&lt;br /&gt;
        llSetTimerEvent(0.0);// you can use 0 as well to save memory&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{LSL Tip|Please make sure that you close open listeners where possible. You&#039;ll make the Second Life experience so much better when paying attention to details here.}}&lt;br /&gt;
{{LSL Tip|There are no built-in submenus nor pagination (like in a list with &amp;quot;previous&amp;quot; and &amp;quot;next&amp;quot;) when using [[llDialog]]. You simply get one page with a max of 12 buttons, that&#039;s it. If you want a different dialog menu layout (other info and/or other buttons), you&#039;ll have to build that functionality into your script as the example below demonstrates. }}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
string mainMenuDialog = &amp;quot;\nWhich settings would you like to access?\nClick \&amp;quot;Close\&amp;quot; to close the menu.\n\nYou are here:\nMainmenu&amp;quot;;&lt;br /&gt;
list mainMenuButtons = [&amp;quot;sub 01&amp;quot;, &amp;quot;sub 02&amp;quot;, &amp;quot;Close&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
string subMenu_01_Dialog = &amp;quot;\nClick \&amp;quot;Close\&amp;quot; to close the menu.\nClick \&amp;quot;-Main-\&amp;quot; to return to the main menu.\n\nYou are here:\nMainmenu &amp;gt; sub 01&amp;quot;;&lt;br /&gt;
list subMenu_01_Buttons = [&amp;quot;action 01a&amp;quot;, &amp;quot;action 01b&amp;quot;, &amp;quot;Close&amp;quot;, &amp;quot;-Main-&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
string subMenu_02_Dialog = &amp;quot;\nClick \&amp;quot;Close\&amp;quot; to close the menu.\nClick \&amp;quot;-Main-\&amp;quot; to return to the main menu.\n\nYou are here:\nMainmenu &amp;gt; sub 02&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
list subMenu_02_Buttons = [&amp;quot;action 02a&amp;quot;, &amp;quot;action 02b&amp;quot;, &amp;quot;Close&amp;quot;, &amp;quot;-Main-&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
integer dialogChannel;&lt;br /&gt;
integer dialogHandle;&lt;br /&gt;
&lt;br /&gt;
open_menu(key inputKey, string inputString, list inputList)&lt;br /&gt;
{&lt;br /&gt;
    dialogChannel = (integer)llFrand(DEBUG_CHANNEL)*-1;&lt;br /&gt;
    dialogHandle = llListen(dialogChannel, &amp;quot;&amp;quot;, inputKey, &amp;quot;&amp;quot;);&lt;br /&gt;
    llDialog(inputKey, inputString, inputList, dialogChannel);&lt;br /&gt;
    llSetTimerEvent(30.0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
close_menu()&lt;br /&gt;
{&lt;br /&gt;
    llSetTimerEvent(0.0);// you can use 0 as well to save memory&lt;br /&gt;
    llListenRemove(dialogHandle);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    on_rez(integer start_param)&lt;br /&gt;
    {&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        key id = llDetectedKey(0);&lt;br /&gt;
        // Ensure any outstanding listener is removed before creating a new one&lt;br /&gt;
        close_menu();&lt;br /&gt;
        open_menu(id, mainMenuDialog, mainMenuButtons);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    listen(integer channel, string name, key id, string message)&lt;br /&gt;
    {&lt;br /&gt;
        if(channel != dialogChannel)&lt;br /&gt;
            return;&lt;br /&gt;
&lt;br /&gt;
        close_menu();&lt;br /&gt;
&lt;br /&gt;
        if(message == &amp;quot;-Main-&amp;quot;)&lt;br /&gt;
            open_menu(id, mainMenuDialog, mainMenuButtons);&lt;br /&gt;
&lt;br /&gt;
        else if(message == &amp;quot;sub 01&amp;quot;)&lt;br /&gt;
            open_menu(id, subMenu_01_Dialog, subMenu_01_Buttons);&lt;br /&gt;
&lt;br /&gt;
        else if(message == &amp;quot;sub 02&amp;quot;)&lt;br /&gt;
            open_menu(id, subMenu_02_Dialog, subMenu_02_Buttons);&lt;br /&gt;
&lt;br /&gt;
        else if (message == &amp;quot;action 01a&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            //do something&lt;br /&gt;
            open_menu(id, subMenu_01_Dialog, subMenu_01_Buttons);&lt;br /&gt;
        }&lt;br /&gt;
        else if (message == &amp;quot;action 01b&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            //do something else&lt;br /&gt;
&lt;br /&gt;
            //maybe not re-open the menu for this option?&lt;br /&gt;
            //open_menu(id, subMenu_01_Dialog, subMenu_01_Buttons);&lt;br /&gt;
        }&lt;br /&gt;
        else if (message == &amp;quot;action 02a&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            //do something&lt;br /&gt;
            open_menu(id, subMenu_02_Dialog, subMenu_02_Buttons);&lt;br /&gt;
        }&lt;br /&gt;
        else if (message == &amp;quot;action 02b&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            //do something else&lt;br /&gt;
            open_menu(id, subMenu_02_Dialog, subMenu_02_Buttons);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        close_menu();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|helpers=&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;//Compact function to put buttons in &amp;quot;correct&amp;quot; human-readable order&lt;br /&gt;
integer channel;&lt;br /&gt;
&lt;br /&gt;
list order_buttons(list buttons)&lt;br /&gt;
{&lt;br /&gt;
    return llList2List(buttons, -3, -1) + llList2List(buttons, -6, -4)&lt;br /&gt;
         + llList2List(buttons, -9, -7) + llList2List(buttons, -12, -10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {   // Create random channel within range [-1000000000,-2000000000]&lt;br /&gt;
	channel = (integer)(llFrand(-1000000000.0) - 1000000000.0);&lt;br /&gt;
&lt;br /&gt;
	llListen(channel,&amp;quot;&amp;quot;, &amp;quot;&amp;quot;,&amp;quot;&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
	&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        llDialog(llDetectedKey(0),&amp;quot;\nPlease choose an option:\n&amp;quot;,&lt;br /&gt;
	    order_buttons([&amp;quot;1&amp;quot;, &amp;quot;2&amp;quot;, &amp;quot;3&amp;quot;, &amp;quot;4&amp;quot;, &amp;quot;5&amp;quot;, &amp;quot;6&amp;quot;, &amp;quot;7&amp;quot;, &amp;quot;8&amp;quot;, &amp;quot;9&amp;quot;, &amp;quot;10&amp;quot;]),channel);&lt;br /&gt;
    }&lt;br /&gt;
	&lt;br /&gt;
    listen(integer _chan, string _name, key _id, string _option)&lt;br /&gt;
    {&lt;br /&gt;
        llSay(0, _name + &amp;quot; selected option &amp;quot; + _option);&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
list make_ordered_buttons(integer input)&lt;br /&gt;
{&lt;br /&gt;
    string output;&lt;br /&gt;
&lt;br /&gt;
    if      (input == 12) output = &amp;quot;10, 11, 12, 7, 8, 9, 4, 5, 6, 1, 2, 3&amp;quot;;&lt;br /&gt;
    else if (input == 11) output = &amp;quot;10, 11, 7, 8, 9, 4, 5, 6, 1, 2, 3&amp;quot;;&lt;br /&gt;
    else if (input == 10) output = &amp;quot;10, 7, 8, 9, 4, 5, 6, 1, 2, 3&amp;quot;;&lt;br /&gt;
    else if (input == 9)  output = &amp;quot;7, 8, 9, 4, 5, 6, 1, 2, 3&amp;quot;;&lt;br /&gt;
    else if (input == 8)  output = &amp;quot;7, 8, 4, 5, 6, 1, 2, 3&amp;quot;;&lt;br /&gt;
    else if (input == 7)  output = &amp;quot;7, 4, 5, 6, 1, 2, 3&amp;quot;;&lt;br /&gt;
    else if (input == 6)  output = &amp;quot;4, 5, 6, 1, 2, 3&amp;quot;;&lt;br /&gt;
    else if (input == 5)  output = &amp;quot;4, 5, 1, 2, 3&amp;quot;;&lt;br /&gt;
    else if (input == 4)  output = &amp;quot;4, 1, 2, 3&amp;quot;;&lt;br /&gt;
    else if (input == 3)  output = &amp;quot;1, 2, 3&amp;quot;;&lt;br /&gt;
    else if (input == 2)  output = &amp;quot;1, 2&amp;quot;;&lt;br /&gt;
    else if (input == 1)  output = &amp;quot;1&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
//  when we want to return [] avoid returning [&amp;quot;&amp;quot;] here&lt;br /&gt;
&lt;br /&gt;
    if (output == &amp;quot;&amp;quot;) return [];&lt;br /&gt;
/*  else convert output */      return llCSV2List(output);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//  Usage:&lt;br /&gt;
&lt;br /&gt;
llDialog(id, &amp;quot;dialog message&amp;quot;, make_ordered_buttons(5), -37812);&lt;br /&gt;
&lt;br /&gt;
//  Output:&lt;br /&gt;
&lt;br /&gt;
//    -     -     -&lt;br /&gt;
//    -     -     -&lt;br /&gt;
//    -   [ 4 ] [ 5 ]&lt;br /&gt;
//  [ 1 ] [ 2 ] [ 3 ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
=== Helper Functions ===&lt;br /&gt;
{{{!}}&lt;br /&gt;
{{LSL DefineRow||[[User:Void_Singer/Functions#uDlgBtnPagList|uDlgBtnPagList]]|Compact Pagination for [[llDialog]] lists, remenu, and multi-user support}}&lt;br /&gt;
{{!}}}&lt;br /&gt;
|constants={{#vardefine:constants_nb}}&lt;br /&gt;
{{{!}}&lt;br /&gt;
{{!}}- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
{{!}}&lt;br /&gt;
{{{!}}{{Prettytable|style=margin-top:0;}}&lt;br /&gt;
{{!}}-{{Hl2}}&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot; {{!}} Button Order&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}}9&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
{{!}}10&lt;br /&gt;
{{!}}11&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}}6&lt;br /&gt;
{{!}}7&lt;br /&gt;
{{!}}8&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}}3&lt;br /&gt;
{{!}}4&lt;br /&gt;
{{!}}5&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}}0&lt;br /&gt;
{{!}}1&lt;br /&gt;
{{!}}2&lt;br /&gt;
{{!}}}&lt;br /&gt;
{{!}}&lt;br /&gt;
{{!}}}&lt;br /&gt;
|related&lt;br /&gt;
|notes=&lt;br /&gt;
To use dialog boxes to make menu systems, see [[Dialog Menus|Dialog Menus: A step by step guide]] (aimed at learners).&lt;br /&gt;
&lt;br /&gt;
===Tips===&lt;br /&gt;
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), &#039;&#039;e.g.&#039;&#039;,&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Create random channel within range [-1000000000,-2000000000]&lt;br /&gt;
integer channel = (integer)(llFrand(-1000000000.0) - 1000000000.0);&lt;br /&gt;
&lt;br /&gt;
llDialog(llDetectedKey(0), &amp;quot;Please choose one of the below options:&amp;quot;,&lt;br /&gt;
    [&amp;quot;Yes&amp;quot;, &amp;quot;No&amp;quot;, &amp;quot;0&amp;quot;, &amp;quot;1&amp;quot;], channel);&amp;lt;/source&amp;gt;&lt;br /&gt;
Negative channels are popular for script communications because for years the standard SL client was unable to chat directly on those channels. However, since late 2016 both third party and the Linden Lab viewer can use negative channels from the chat bar. Previously, the only way for viewers to use negative channels prior to [[llTextBox]] was to use [[llDialog]], which was limited to 24 bytes. &lt;br /&gt;
&lt;br /&gt;
You can be reasonably confident that all of your scripted objects have a unique chat channel with this small function:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;integer dialog_channel; // top of script in variables&lt;br /&gt;
&lt;br /&gt;
integer channel() { // top of script in functions&lt;br /&gt;
    return (integer)(&amp;quot;0x&amp;quot;+llGetSubString((string)llGetKey(),-8,-1));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
dialog_channel = channel(); // somewhere in actual script execution, such as state_entry()&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Since this function uses public information to generate the channel number it should by no means considered secret.&lt;br /&gt;
&lt;br /&gt;
The preceding code can produce both positive and negative channels, depending on the 8th to last character of the key.&lt;br /&gt;
The following examples will always produce negative channels:-&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
    gChannel = 0x80000000 | (integer)(&amp;quot;0x&amp;quot;+(string)llGetKey());&lt;br /&gt;
    gChannel = 0x80000000 | (integer)(&amp;quot;0x&amp;quot;+(string)llGetOwner());&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
This next version returns a channel number between -1073741823 (0xBFFFFFFF) and -2147483648 (0x80000000).  It is also only one line of code.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;privchan = ((integer)(&amp;quot;0x&amp;quot;+llGetSubString((string)llGetKey(),-8,-1)) &amp;amp; 0x3FFFFFFF) ^ 0xBFFFFFFF;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Appearance===&lt;br /&gt;
&lt;br /&gt;
If {{LSLP|message}} requires more than 20 lines, a vertical scroll bar will appear in the dialog.&lt;br /&gt;
: In viewer 3 there is no scroll bar, only the 512 chars message limit is effective, so you may show more than 40 short lines in the message&lt;br /&gt;
: In current 2021 viewer &amp;amp; Firestorm 20 lines can be displayed before the scroll bar appears with no limit other than the 512 memory to the number of lines. &lt;br /&gt;
&lt;br /&gt;
The message text can be formatted somewhat using &amp;quot;\n&amp;quot; (for newline) and &amp;quot;\t&amp;quot; (for tab). If URLs are in the text, they will appear as clickable links, and some [[Viewer URI Name Space|viewer application URLs]] will receive special formatting. (Clickable links were not available before Viewer 2.) You can do nothing though to influence the font face, size or weight.&lt;br /&gt;
&lt;br /&gt;
There is no way to change the actual size of the dialog, nor change its color.&lt;br /&gt;
&lt;br /&gt;
The average number of characters that can be displayed on a dialog line is about 35 characters per line in ASCII7 characters. It depends upon the width of the characters, the viewer version, and font settings.&lt;br /&gt;
&lt;br /&gt;
The number of characters that can be displayed in a button depends upon the width of the characters. You should expect around 10 chars, give or take, not the full 24 in the button definition. The full button definition IS said, up to 24 chars, into the chat channel even though fewer characters may be displayed in the button itself.&lt;br /&gt;
&lt;br /&gt;
===Limits===&lt;br /&gt;
&lt;br /&gt;
My testing shows the a Dialog box now works anywhere in the same Region as the object OR any region it hands you off to (e.g. the region you teleport to). It will not work for any subsequent hand offs. I have tested this with teleport only, I haven&#039;t tested it walking between regions.  &lt;br /&gt;
&lt;br /&gt;
I&#039;ve tested from the next SIM with an Alt, and from 2 SIMs away myself. Both worked without restriction apart from some lag on the messages. (OQ).&lt;br /&gt;
&lt;br /&gt;
|also_events=&lt;br /&gt;
{{LSL DefineRow||[[listen]]|}}&lt;br /&gt;
|also_functions=&lt;br /&gt;
{{LSL DefineRow||[[llListen]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llTextBox]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llRegionSay]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llWhisper]]|Sends chat limited to 10 meters}}&lt;br /&gt;
{{LSL DefineRow||[[llSay]]|Sends chat limited to 20 meters}}&lt;br /&gt;
{{LSL DefineRow||[[llShout]]|Sends chat limited to 100 meters}}&lt;br /&gt;
{{LSL DefineRow||[[llInstantMessage]]|Sends chat to the specified user}}&lt;br /&gt;
{{LSL DefineRow||[[llOwnerSay]]|Sends chat to the owner only}}&lt;br /&gt;
|also_tests&lt;br /&gt;
|also_articles=&lt;br /&gt;
{{LSL DefineRow||[[Dialog Menus|Dialog Menus: A step by step guide]]|A walk through of the entire dialog menu process (aimed at learners).}}&lt;br /&gt;
|cat1=Chat&lt;br /&gt;
|cat2=Communications&lt;br /&gt;
|cat3=Dialog&lt;br /&gt;
|cat4&lt;br /&gt;
|haiku={{Haiku|click here click there. But,|read the options carefully|you might get a shock.}}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Darling Brody</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlDialog&amp;diff=1210091</id>
		<title>LlDialog</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlDialog&amp;diff=1210091"/>
		<updated>2021-06-11T19:33:01Z</updated>

		<summary type="html">&lt;p&gt;Darling Brody: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function&lt;br /&gt;
|func=llDialog&lt;br /&gt;
|sort=Dialog&lt;br /&gt;
|func_id=247|func_sleep=1.0|func_energy=10.0&lt;br /&gt;
|inject-2=&lt;br /&gt;
{{Issues/VWR-17064}}&lt;br /&gt;
{{Issues/VWR-14537}}&lt;br /&gt;
{{Issues/SVC-1815}}&lt;br /&gt;
{{Issues/SCR-43}}&lt;br /&gt;
{{Issues/STORM-1718}}&lt;br /&gt;
{{LSL_Function/avatar|avatar|sim=*}}&lt;br /&gt;
{{LSL_Function/chat|channel|message|dialog=dialog box}}&lt;br /&gt;
|p1_type=key|p1_name=avatar|p1_desc&lt;br /&gt;
|p2_type=string|p2_name=message|p2_desc&lt;br /&gt;
|p3_type=list|p3_name=buttons|p3_desc=button labels&lt;br /&gt;
|p4_type=integer|p4_name=channel|p4_desc&lt;br /&gt;
|func_desc=Shows a dialog box in the lower right corner of the {{LSLP|avatar}}&#039;s screen (upper right in Viewer 1.x) with a {{LSLP|message}} and choice {{LSLP|buttons}}, as well as an ignore button. This has many uses ranging from simple message delivery to complex menu systems.&lt;br /&gt;
|func_footnote=When a button is pressed, the {{LSLP|avatar}} says the text of the button label on {{LSLP|channel}}.&amp;lt;br/&amp;gt;The position where the chat is generated is where the root prim of the dialog generating object was when the dialog button was pressed.&lt;br /&gt;
|spec&lt;br /&gt;
|caveats=&lt;br /&gt;
*This function &#039;&#039;&#039;only&#039;&#039;&#039; opens a dialog box. The script must then also register a listener on the same &#039;&#039;channel&#039;&#039; using [[llListen]] and have a [[listen]] event handler to receive the response.&lt;br /&gt;
*There is no way by script to kill a dialog box.&lt;br /&gt;
*There is no way for the script to detect if the user clicked the small &amp;lt;code&amp;gt;[&amp;quot;Ignore&amp;quot;]&amp;lt;/code&amp;gt; button (no chat is generated as a result of pressing this button).&lt;br /&gt;
*There is no way to distinguish the input from a dialog box and regular chat made by the same user.&lt;br /&gt;
**It is important to expect that the response may not be one of the buttons.&lt;br /&gt;
*In most cases, the listener will be in the same script as the llDialog, however if not, the distance between the root prim of the [[listen]]ing object and the dialog generating prim becomes a factor. If this distance is greater than 20 meters when a button is pressed, the response will not be heard. See [[#Limits]].&lt;br /&gt;
**This limitation affects attachments too if the wearer moves more than 20 meters from where the listener is located. See [[#Limits]].&lt;br /&gt;
**If the [[listen]]er resides in the same script that created the dialog, then the dialog button is heard sim-wide.&lt;br /&gt;
*By default, only one dialog can be displayed per object in the Second Life Viewer.  This can be overridden by the [[Debug_Settings|ScriptDialogLimitations debug setting]] in the Viewer.&lt;br /&gt;
----&lt;br /&gt;
*The &#039;&#039;&#039;dialog response&#039;&#039;&#039; (the generated chat) has its in world location at the &#039;&#039;&#039;root prim&#039;s global position&#039;&#039;&#039;.&lt;br /&gt;
: It can generate a listen event within 20 meters from that position.&lt;br /&gt;
*The listening location for a child prim in the object is either at the child prim&#039;s location or at the root prim&#039;s location&lt;br /&gt;
: see bugtrace JIRA [https://jira.secondlife.com/browse/SCR-43 SCR-43]&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;tt&amp;gt;message&amp;lt;/tt&amp;gt; limits===&lt;br /&gt;
*{{LSLP|message}} must be fewer than 512 bytes in length and be not empty. If it is empty, [[llDialog]] will shout &amp;lt;code&amp;gt;&amp;quot;[[llDialog]]: must supply a message&amp;quot;&amp;lt;/code&amp;gt; on the [[DEBUG_CHANNEL]]. If you want to create an empty message, however, you can do it legally by using a line feed as your message, as in  &amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;llDialog(avatar_key,&amp;quot; \n&amp;quot;,button_list,dialog_channel);&amp;lt;/source&amp;gt; If the message length is greater than or equal to 512 bytes, it shouts (again on the [[DEBUG_CHANNEL|debug channel]]): &amp;lt;code&amp;gt;&amp;quot;[[llDialog]]: message too long, must be less than 512 characters&amp;quot;&amp;lt;/code&amp;gt;; in both instances, the dialog box will not be created for {{LSLP|avatar}}.&lt;br /&gt;
*The client only displays 8 lines of {{LSLP|message}}. If it is longer, the dialog has a scroll bar. See [[#Appearance]].&lt;br /&gt;
Note: This should be 14 lines of message, not counting the extra (15th) line used for the owner and name of the object. The scroll bar does not appear beyond 14 lines in the official viewer. (tested June 2021)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;tt&amp;gt;buttons&amp;lt;/tt&amp;gt; limits===&lt;br /&gt;
*If {{LSLP|buttons}} is an empty list, it will default to as if it were &amp;lt;code&amp;gt;[&amp;quot;OK&amp;quot;]&amp;lt;/code&amp;gt;&lt;br /&gt;
*Buttons named &amp;quot;Client_Side_Mute&amp;quot; or &amp;quot;Client_Side_Ignore&amp;quot; will be interpreted by the viewer as if the user click the special &amp;quot;Mute&amp;quot; or &amp;quot;Ignore&amp;quot; buttons, respectively.&lt;br /&gt;
**Prior to [[Release_Notes/Second_Life_Release/3.3.1|SL viewer 3.3.1]] (released in 2012) the viewer treated the buttons with values of &amp;quot;Mute&amp;quot; and &amp;quot;Ignore&amp;quot; as being equivalent to the dialogs special buttons &amp;quot;Mute&amp;quot; and &amp;quot;Ignore&amp;quot;. This was changed as a result of {{JIRA|STORM-1718}}. Some very old versions of some viewer, especially those with a V1-style interface, could still have this old behavior and should be tested.&lt;br /&gt;
**If you need a button in your menu that will collide with one of these special values, please consider adding spaces in the button name (e.g. &amp;lt;code&amp;gt;[&amp;quot; Ignore &amp;quot;]&amp;lt;/code&amp;gt;).&lt;br /&gt;
*An error will be shouted on [[DEBUG_CHANNEL]], if...&lt;br /&gt;
**there are more than 12 buttons.&lt;br /&gt;
**any list item is not a string.&lt;br /&gt;
**any list item string length (measured in bytes, using UTF-8 encoding) is zero or greater than 24.&lt;br /&gt;
***In other words, a button&#039;s text when encoded as UTF-8 cannot be longer than 24 bytes or a empty string.&lt;br /&gt;
***This snippet can be used to truncate the string without giving an error: &amp;lt;code&amp;gt;[[llBase64ToString]]([[llGetSubString]]([[llStringToBase64]](theString), 0, 31))&amp;lt;/code&amp;gt;&lt;br /&gt;
*The client will not display all the characters of a button if the text is wider than the text space of the button. See [[#Appearance]].&lt;br /&gt;
*If the script generates button labels from outside sources like inventory or object names, take care to avoid the special string &amp;lt;code&amp;gt;&amp;quot;!!llTextBox!!&amp;quot;&amp;lt;/code&amp;gt;. This text, used as any button label, will cause [[llDialog]] to behave as [[llTextBox]] instead.&lt;br /&gt;
|examples=&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
// When the prim is touched, give the toucher the option of killing the prim.&lt;br /&gt;
&lt;br /&gt;
integer gListener;     // Identity of the listener associated with the dialog, so we can clean up when not needed&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        // Kill off any outstanding listener, to avoid any chance of multiple listeners being active&lt;br /&gt;
        llListenRemove(gListener);&lt;br /&gt;
        // get the UUID of the person touching this prim&lt;br /&gt;
        key user = llDetectedKey(0);&lt;br /&gt;
        // Listen to any reply from that user only, and only on the same channel to be used by llDialog&lt;br /&gt;
        // It&#039;s best to set up the listener before issuing the dialog&lt;br /&gt;
        gListener = llListen(-99, &amp;quot;&amp;quot;, user, &amp;quot;&amp;quot;);&lt;br /&gt;
        // Send a dialog to that person. We&#039;ll use a fixed negative channel number for simplicity&lt;br /&gt;
        llDialog(user, &amp;quot;\nDo you wish this prim to die?&amp;quot;, [&amp;quot;Yes&amp;quot;, &amp;quot;No&amp;quot; ] , -99);&lt;br /&gt;
        // Start a one-minute timer, after which we will stop listening for responses&lt;br /&gt;
        llSetTimerEvent(60.0);&lt;br /&gt;
    }&lt;br /&gt;
    listen(integer chan, string name, key id, string msg)&lt;br /&gt;
    {&lt;br /&gt;
        // If the user clicked the &amp;quot;Yes&amp;quot; button, kill this prim.&lt;br /&gt;
        if (msg == &amp;quot;Yes&amp;quot;)&lt;br /&gt;
            llDie();&lt;br /&gt;
        // The user did not click &amp;quot;Yes&amp;quot; ...&lt;br /&gt;
        // Make the timer fire immediately, to do clean-up actions&lt;br /&gt;
        llSetTimerEvent(0.1);        &lt;br /&gt;
    }&lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        // Stop listening. It&#039;s wise to do this to reduce lag&lt;br /&gt;
        llListenRemove(gListener);&lt;br /&gt;
        // Stop the timer now that its job is done&lt;br /&gt;
        llSetTimerEvent(0.0);// you can use 0 as well to save memory&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{LSL Tip|Please make sure that you close open listeners where possible. You&#039;ll make the Second Life experience so much better when paying attention to details here.}}&lt;br /&gt;
{{LSL Tip|There are no built-in submenus nor pagination (like in a list with &amp;quot;previous&amp;quot; and &amp;quot;next&amp;quot;) when using [[llDialog]]. You simply get one page with a max of 12 buttons, that&#039;s it. If you want a different dialog menu layout (other info and/or other buttons), you&#039;ll have to build that functionality into your script as the example below demonstrates. }}&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
string mainMenuDialog = &amp;quot;\nWhich settings would you like to access?\nClick \&amp;quot;Close\&amp;quot; to close the menu.\n\nYou are here:\nMainmenu&amp;quot;;&lt;br /&gt;
list mainMenuButtons = [&amp;quot;sub 01&amp;quot;, &amp;quot;sub 02&amp;quot;, &amp;quot;Close&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
string subMenu_01_Dialog = &amp;quot;\nClick \&amp;quot;Close\&amp;quot; to close the menu.\nClick \&amp;quot;-Main-\&amp;quot; to return to the main menu.\n\nYou are here:\nMainmenu &amp;gt; sub 01&amp;quot;;&lt;br /&gt;
list subMenu_01_Buttons = [&amp;quot;action 01a&amp;quot;, &amp;quot;action 01b&amp;quot;, &amp;quot;Close&amp;quot;, &amp;quot;-Main-&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
string subMenu_02_Dialog = &amp;quot;\nClick \&amp;quot;Close\&amp;quot; to close the menu.\nClick \&amp;quot;-Main-\&amp;quot; to return to the main menu.\n\nYou are here:\nMainmenu &amp;gt; sub 02&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
list subMenu_02_Buttons = [&amp;quot;action 02a&amp;quot;, &amp;quot;action 02b&amp;quot;, &amp;quot;Close&amp;quot;, &amp;quot;-Main-&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
integer dialogChannel;&lt;br /&gt;
integer dialogHandle;&lt;br /&gt;
&lt;br /&gt;
open_menu(key inputKey, string inputString, list inputList)&lt;br /&gt;
{&lt;br /&gt;
    dialogChannel = (integer)llFrand(DEBUG_CHANNEL)*-1;&lt;br /&gt;
    dialogHandle = llListen(dialogChannel, &amp;quot;&amp;quot;, inputKey, &amp;quot;&amp;quot;);&lt;br /&gt;
    llDialog(inputKey, inputString, inputList, dialogChannel);&lt;br /&gt;
    llSetTimerEvent(30.0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
close_menu()&lt;br /&gt;
{&lt;br /&gt;
    llSetTimerEvent(0.0);// you can use 0 as well to save memory&lt;br /&gt;
    llListenRemove(dialogHandle);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    on_rez(integer start_param)&lt;br /&gt;
    {&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        key id = llDetectedKey(0);&lt;br /&gt;
        // Ensure any outstanding listener is removed before creating a new one&lt;br /&gt;
        close_menu();&lt;br /&gt;
        open_menu(id, mainMenuDialog, mainMenuButtons);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    listen(integer channel, string name, key id, string message)&lt;br /&gt;
    {&lt;br /&gt;
        if(channel != dialogChannel)&lt;br /&gt;
            return;&lt;br /&gt;
&lt;br /&gt;
        close_menu();&lt;br /&gt;
&lt;br /&gt;
        if(message == &amp;quot;-Main-&amp;quot;)&lt;br /&gt;
            open_menu(id, mainMenuDialog, mainMenuButtons);&lt;br /&gt;
&lt;br /&gt;
        else if(message == &amp;quot;sub 01&amp;quot;)&lt;br /&gt;
            open_menu(id, subMenu_01_Dialog, subMenu_01_Buttons);&lt;br /&gt;
&lt;br /&gt;
        else if(message == &amp;quot;sub 02&amp;quot;)&lt;br /&gt;
            open_menu(id, subMenu_02_Dialog, subMenu_02_Buttons);&lt;br /&gt;
&lt;br /&gt;
        else if (message == &amp;quot;action 01a&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            //do something&lt;br /&gt;
            open_menu(id, subMenu_01_Dialog, subMenu_01_Buttons);&lt;br /&gt;
        }&lt;br /&gt;
        else if (message == &amp;quot;action 01b&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            //do something else&lt;br /&gt;
&lt;br /&gt;
            //maybe not re-open the menu for this option?&lt;br /&gt;
            //open_menu(id, subMenu_01_Dialog, subMenu_01_Buttons);&lt;br /&gt;
        }&lt;br /&gt;
        else if (message == &amp;quot;action 02a&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            //do something&lt;br /&gt;
            open_menu(id, subMenu_02_Dialog, subMenu_02_Buttons);&lt;br /&gt;
        }&lt;br /&gt;
        else if (message == &amp;quot;action 02b&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            //do something else&lt;br /&gt;
            open_menu(id, subMenu_02_Dialog, subMenu_02_Buttons);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        close_menu();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|helpers=&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;//Compact function to put buttons in &amp;quot;correct&amp;quot; human-readable order&lt;br /&gt;
integer channel;&lt;br /&gt;
&lt;br /&gt;
list order_buttons(list buttons)&lt;br /&gt;
{&lt;br /&gt;
    return llList2List(buttons, -3, -1) + llList2List(buttons, -6, -4)&lt;br /&gt;
         + llList2List(buttons, -9, -7) + llList2List(buttons, -12, -10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {   // Create random channel within range [-1000000000,-2000000000]&lt;br /&gt;
	channel = (integer)(llFrand(-1000000000.0) - 1000000000.0);&lt;br /&gt;
&lt;br /&gt;
	llListen(channel,&amp;quot;&amp;quot;, &amp;quot;&amp;quot;,&amp;quot;&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
	&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        llDialog(llDetectedKey(0),&amp;quot;\nPlease choose an option:\n&amp;quot;,&lt;br /&gt;
	    order_buttons([&amp;quot;1&amp;quot;, &amp;quot;2&amp;quot;, &amp;quot;3&amp;quot;, &amp;quot;4&amp;quot;, &amp;quot;5&amp;quot;, &amp;quot;6&amp;quot;, &amp;quot;7&amp;quot;, &amp;quot;8&amp;quot;, &amp;quot;9&amp;quot;, &amp;quot;10&amp;quot;]),channel);&lt;br /&gt;
    }&lt;br /&gt;
	&lt;br /&gt;
    listen(integer _chan, string _name, key _id, string _option)&lt;br /&gt;
    {&lt;br /&gt;
        llSay(0, _name + &amp;quot; selected option &amp;quot; + _option);&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
list make_ordered_buttons(integer input)&lt;br /&gt;
{&lt;br /&gt;
    string output;&lt;br /&gt;
&lt;br /&gt;
    if      (input == 12) output = &amp;quot;10, 11, 12, 7, 8, 9, 4, 5, 6, 1, 2, 3&amp;quot;;&lt;br /&gt;
    else if (input == 11) output = &amp;quot;10, 11, 7, 8, 9, 4, 5, 6, 1, 2, 3&amp;quot;;&lt;br /&gt;
    else if (input == 10) output = &amp;quot;10, 7, 8, 9, 4, 5, 6, 1, 2, 3&amp;quot;;&lt;br /&gt;
    else if (input == 9)  output = &amp;quot;7, 8, 9, 4, 5, 6, 1, 2, 3&amp;quot;;&lt;br /&gt;
    else if (input == 8)  output = &amp;quot;7, 8, 4, 5, 6, 1, 2, 3&amp;quot;;&lt;br /&gt;
    else if (input == 7)  output = &amp;quot;7, 4, 5, 6, 1, 2, 3&amp;quot;;&lt;br /&gt;
    else if (input == 6)  output = &amp;quot;4, 5, 6, 1, 2, 3&amp;quot;;&lt;br /&gt;
    else if (input == 5)  output = &amp;quot;4, 5, 1, 2, 3&amp;quot;;&lt;br /&gt;
    else if (input == 4)  output = &amp;quot;4, 1, 2, 3&amp;quot;;&lt;br /&gt;
    else if (input == 3)  output = &amp;quot;1, 2, 3&amp;quot;;&lt;br /&gt;
    else if (input == 2)  output = &amp;quot;1, 2&amp;quot;;&lt;br /&gt;
    else if (input == 1)  output = &amp;quot;1&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
//  when we want to return [] avoid returning [&amp;quot;&amp;quot;] here&lt;br /&gt;
&lt;br /&gt;
    if (output == &amp;quot;&amp;quot;) return [];&lt;br /&gt;
/*  else convert output */      return llCSV2List(output);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//  Usage:&lt;br /&gt;
&lt;br /&gt;
llDialog(id, &amp;quot;dialog message&amp;quot;, make_ordered_buttons(5), -37812);&lt;br /&gt;
&lt;br /&gt;
//  Output:&lt;br /&gt;
&lt;br /&gt;
//    -     -     -&lt;br /&gt;
//    -     -     -&lt;br /&gt;
//    -   [ 4 ] [ 5 ]&lt;br /&gt;
//  [ 1 ] [ 2 ] [ 3 ]&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
=== Helper Functions ===&lt;br /&gt;
{{{!}}&lt;br /&gt;
{{LSL DefineRow||[[User:Void_Singer/Functions#uDlgBtnPagList|uDlgBtnPagList]]|Compact Pagination for [[llDialog]] lists, remenu, and multi-user support}}&lt;br /&gt;
{{!}}}&lt;br /&gt;
|constants={{#vardefine:constants_nb}}&lt;br /&gt;
{{{!}}&lt;br /&gt;
{{!}}- valign=&amp;quot;top&amp;quot;&lt;br /&gt;
{{!}}&lt;br /&gt;
{{{!}}{{Prettytable|style=margin-top:0;}}&lt;br /&gt;
{{!}}-{{Hl2}}&lt;br /&gt;
! colspan=&amp;quot;4&amp;quot; {{!}} Button Order&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}}9&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
{{!}}10&lt;br /&gt;
{{!}}11&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}}6&lt;br /&gt;
{{!}}7&lt;br /&gt;
{{!}}8&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}}3&lt;br /&gt;
{{!}}4&lt;br /&gt;
{{!}}5&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}}0&lt;br /&gt;
{{!}}1&lt;br /&gt;
{{!}}2&lt;br /&gt;
{{!}}}&lt;br /&gt;
{{!}}&lt;br /&gt;
{{!}}}&lt;br /&gt;
|related&lt;br /&gt;
|notes=&lt;br /&gt;
To use dialog boxes to make menu systems, see [[Dialog Menus|Dialog Menus: A step by step guide]] (aimed at learners).&lt;br /&gt;
&lt;br /&gt;
===Tips===&lt;br /&gt;
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), &#039;&#039;e.g.&#039;&#039;,&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Create random channel within range [-1000000000,-2000000000]&lt;br /&gt;
integer channel = (integer)(llFrand(-1000000000.0) - 1000000000.0);&lt;br /&gt;
&lt;br /&gt;
llDialog(llDetectedKey(0), &amp;quot;Please choose one of the below options:&amp;quot;,&lt;br /&gt;
    [&amp;quot;Yes&amp;quot;, &amp;quot;No&amp;quot;, &amp;quot;0&amp;quot;, &amp;quot;1&amp;quot;], channel);&amp;lt;/source&amp;gt;&lt;br /&gt;
Negative channels are popular for script communications because for years the standard SL client was unable to chat directly on those channels. However, since late 2016 both third party and the Linden Lab viewer can use negative channels from the chat bar. Previously, the only way for viewers to use negative channels prior to [[llTextBox]] was to use [[llDialog]], which was limited to 24 bytes. &lt;br /&gt;
&lt;br /&gt;
You can be reasonably confident that all of your scripted objects have a unique chat channel with this small function:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;integer dialog_channel; // top of script in variables&lt;br /&gt;
&lt;br /&gt;
integer channel() { // top of script in functions&lt;br /&gt;
    return (integer)(&amp;quot;0x&amp;quot;+llGetSubString((string)llGetKey(),-8,-1));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
dialog_channel = channel(); // somewhere in actual script execution, such as state_entry()&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Since this function uses public information to generate the channel number it should by no means considered secret.&lt;br /&gt;
&lt;br /&gt;
The preceding code can produce both positive and negative channels, depending on the 8th to last character of the key.&lt;br /&gt;
The following examples will always produce negative channels:-&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
    gChannel = 0x80000000 | (integer)(&amp;quot;0x&amp;quot;+(string)llGetKey());&lt;br /&gt;
    gChannel = 0x80000000 | (integer)(&amp;quot;0x&amp;quot;+(string)llGetOwner());&lt;br /&gt;
&amp;lt;/source&amp;gt; &lt;br /&gt;
&lt;br /&gt;
This next version returns a channel number between -1073741823 (0xBFFFFFFF) and -2147483648 (0x80000000).  It is also only one line of code.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;privchan = ((integer)(&amp;quot;0x&amp;quot;+llGetSubString((string)llGetKey(),-8,-1)) &amp;amp; 0x3FFFFFFF) ^ 0xBFFFFFFF;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Appearance===&lt;br /&gt;
&lt;br /&gt;
If {{LSLP|message}} requires more than 8 lines, a vertical scroll bar will appear in the dialog.&lt;br /&gt;
: In viewer 3 there is no scroll bar, only the 512 chars message limit is effective, so you may show more than 40 short lines in the message&lt;br /&gt;
: Too many lines will hide some of the buttons or all of them outside the window though&lt;br /&gt;
&lt;br /&gt;
The message text can be formatted somewhat using &amp;quot;\n&amp;quot; (for newline) and &amp;quot;\t&amp;quot; (for tab). If URLs are in the text, they will appear as clickable links, and some [[Viewer URI Name Space|viewer application URLs]] will receive special formatting. (Clickable links were not available before Viewer 2.) You can do nothing though to influence the font face, size or weight.&lt;br /&gt;
&lt;br /&gt;
There is no way to change the actual size of the dialog, nor change its color.&lt;br /&gt;
&lt;br /&gt;
The average number of characters that can be displayed on a dialog line is about 35 characters per line in ASCII7 characters. It depends upon the width of the characters, the viewer version, and font settings.&lt;br /&gt;
&lt;br /&gt;
The number of characters that can be displayed in a button depends upon the width of the characters. You should expect around 10 chars, give or take, not the full 24 in the button definition. The full button definition IS said, up to 24 chars, into the chat channel even though fewer characters may be displayed in the button itself.&lt;br /&gt;
&lt;br /&gt;
===Limits===&lt;br /&gt;
&lt;br /&gt;
My testing shows the a Dialog box now works anywhere in the same Region as the object OR any region it hands you off to (e.g. the region you teleport to). It will not work for any subsequent hand offs. I have tested this with teleport only, I haven&#039;t tested it walking between regions.  &lt;br /&gt;
&lt;br /&gt;
I&#039;ve tested from the next SIM with an Alt, and from 2 SIMs away myself. Both worked without restriction apart from some lag on the messages. (OQ).&lt;br /&gt;
&lt;br /&gt;
|also_events=&lt;br /&gt;
{{LSL DefineRow||[[listen]]|}}&lt;br /&gt;
|also_functions=&lt;br /&gt;
{{LSL DefineRow||[[llListen]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llTextBox]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llRegionSay]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llWhisper]]|Sends chat limited to 10 meters}}&lt;br /&gt;
{{LSL DefineRow||[[llSay]]|Sends chat limited to 20 meters}}&lt;br /&gt;
{{LSL DefineRow||[[llShout]]|Sends chat limited to 100 meters}}&lt;br /&gt;
{{LSL DefineRow||[[llInstantMessage]]|Sends chat to the specified user}}&lt;br /&gt;
{{LSL DefineRow||[[llOwnerSay]]|Sends chat to the owner only}}&lt;br /&gt;
|also_tests&lt;br /&gt;
|also_articles=&lt;br /&gt;
{{LSL DefineRow||[[Dialog Menus|Dialog Menus: A step by step guide]]|A walk through of the entire dialog menu process (aimed at learners).}}&lt;br /&gt;
|cat1=Chat&lt;br /&gt;
|cat2=Communications&lt;br /&gt;
|cat3=Dialog&lt;br /&gt;
|cat4&lt;br /&gt;
|haiku={{Haiku|click here click there. But,|read the options carefully|you might get a shock.}}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Darling Brody</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Control&amp;diff=1209688</id>
		<title>Control</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Control&amp;diff=1209688"/>
		<updated>2020-10-21T15:49:29Z</updated>

		<summary type="html">&lt;p&gt;Darling Brody: Added information about CONTROL_FWD and CONTROL_BACK being triggered together after a teleport, and how to fix the bug.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Event&lt;br /&gt;
|inject-2={{Issues/SCR-97}}{{Issues/SVC-3187}}{{LSL Function/avatar|id|}}&lt;br /&gt;
|event_id=15|event_delay=0.05|event=control&lt;br /&gt;
|p1_type=key|p1_name=id|p1_desc&lt;br /&gt;
|p2_type=integer|p2_subtype=bit_field|p2_name=level|p2_desc=bitfield of CONTROL_* flags, non-zero while one or more keys is being held down.&lt;br /&gt;
|p3_type=integer|p3_subtype=bit_field|p3_name=edge|p3_desc=bitfield of CONTROL_* flags, non-zero when one or more keys have been just pressed or released.&lt;br /&gt;
|event_desc=Result of [[llTakeControls]] library function call and user input.&lt;br /&gt;
|constants={{LSL Constants/Controls}}&lt;br /&gt;
|spec&lt;br /&gt;
|caveats=*[[CONTROL_ROT_LEFT]] and [[CONTROL_ROT_RIGHT]] can be triggered when an object is selected or edited. If the user is running Viewer 2.0 and later, [[llGetAgentInfo]] will have [[AGENT_AUTOPILOT]] set in this case.  &lt;br /&gt;
**Autopilot control events can continue for a short time after AGENT_AUTOPILOT drops.&lt;br /&gt;
*The &#039;levels&#039; and &#039;edges&#039; of the control() event both receive ([[CONTROL_FWD]] + [[CONTROL_BACK]]) (value 3) after teleport, effecting scripts that use this combination for faster movement. Calling llTakeControls() again after a llSleep(3) will filter this out.&lt;br /&gt;
&lt;br /&gt;
|examples=&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llRequestPermissions(llGetOwner(), PERMISSION_TAKE_CONTROLS);&lt;br /&gt;
    }&lt;br /&gt;
    run_time_permissions(integer perm)&lt;br /&gt;
    {&lt;br /&gt;
        if(PERMISSION_TAKE_CONTROLS &amp;amp; perm)&lt;br /&gt;
        {&lt;br /&gt;
            llTakeControls(&lt;br /&gt;
                            CONTROL_FWD |&lt;br /&gt;
                            CONTROL_BACK |&lt;br /&gt;
                            CONTROL_LEFT |&lt;br /&gt;
                            CONTROL_RIGHT |&lt;br /&gt;
                            CONTROL_ROT_LEFT |&lt;br /&gt;
                            CONTROL_ROT_RIGHT |&lt;br /&gt;
                            CONTROL_UP |&lt;br /&gt;
                            CONTROL_DOWN |&lt;br /&gt;
                            CONTROL_LBUTTON |&lt;br /&gt;
                            CONTROL_ML_LBUTTON |&lt;br /&gt;
                            0, TRUE, FALSE);&lt;br /&gt;
                            // | 0 is for edit convenience,&lt;br /&gt;
                            // it does not change the mask.&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    control(key id, integer level, integer edge)&lt;br /&gt;
    {&lt;br /&gt;
        integer start = level &amp;amp; edge;&lt;br /&gt;
        integer end = ~level &amp;amp; edge;&lt;br /&gt;
        integer held = level &amp;amp; ~edge;&lt;br /&gt;
        integer untouched = ~(level | edge);&lt;br /&gt;
        llOwnerSay(llList2CSV([level, edge, start, end, held, untouched]));&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
|helpers&lt;br /&gt;
|also_header&lt;br /&gt;
|also_events={{LSL DefineRow||[[run_time_permissions]]}}&lt;br /&gt;
|also_functions={{LSL DefineRow||[[llTakeControls]]}}&lt;br /&gt;
{{LSL DefineRow||[[llReleaseControls]]}}&lt;br /&gt;
{{LSL DefineRow||[[llRequestPermissions]]}}&lt;br /&gt;
|also_tests&lt;br /&gt;
|also_articles&lt;br /&gt;
|also_footer&lt;br /&gt;
|notes=[[llGetRot]] in [[mouselook]] for an attachment returns the angle the avatar is looking in.&lt;br /&gt;
&lt;br /&gt;
There are some bugs when you put two scripts in the same prim and call LlTakeControls(), the &#039;&#039;&#039;id&#039;&#039;&#039; may not be the intended one. See [http://jira.secondlife.com/browse/SVC-3187 SVC-3187].&lt;br /&gt;
|mode&lt;br /&gt;
|issues&lt;br /&gt;
|cat1=Controls&lt;br /&gt;
|cat2&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Darling Brody</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Darling_Brody&amp;diff=1183699</id>
		<title>User:Darling Brody</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Darling_Brody&amp;diff=1183699"/>
		<updated>2013-11-19T23:02:03Z</updated>

		<summary type="html">&lt;p&gt;Darling Brody: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;&lt;br /&gt;
== Darling Brody ==&lt;br /&gt;
&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Either an annoying griefer or a programmer with a passion for creating.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Darling Brody founded Quantum Products in 2006 when she made her first teleporters. The following year she branched out into weapons because there wasn&#039;t any money in selling teleporters.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Darling Brody is best known for her Quantum Core and QHUD, but still prefers to work on teleporters because &amp;quot;the special effects are so sparkly&amp;quot;.  To date there are dozens of different teleporters, terraforming tools, etc created by her on sale in the region QUANTUM as well as a selection of weapons too.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Most people have very strong opinions of Darling Brody.  They either love her or hate her.  This love/hate relationship seems to be closely linked to &amp;quot;who owns her weapons, and who gets owned by her weapons&amp;quot;.  Either way Darling Brody has never been punished for griefing, so her reputation as a grifer is probably just cleaver marketing ;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
While she is known to be very friendly and helpful to her customers and strangers alike, she is also known to be completely uncooperative when people are rude to her. Of course none of us would ever be silly enough to be rude to a weapons maker, right?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Darling Brody is well known by many Lindens as someone who helps to fix bugs and plug content theft methods.  She is also active in the JIRA opposing changes that break content. She has often fought to have useful bugs retained as a feature, such as the longer avatar Link Distance when sitting on a prim, and retaining the JumpPos bug until the llSetRegionPos() function was completed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
She has been a long time advocate of protecting content from theft. Ironical she has fallen victim to content theft several times, having her scripts used as the base to create competing products.  Most notably the Quantum Core v3 scripts were stolen, resulting in a number of copycat products hitting the market.  Darling responded by tossing out the old Quantum Core v3 scripts and starting a new product line from scratch called QHUD which included script theft protection.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In 2009 darling Brody had a Real Life mental breakdown that left her homeless for several years.  Her products were not updated as often while she was homeless, however they stood the test of time and remained relevant despite the infrequent updates.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Today Darling is busy writing new updates and creating new products.  &lt;br /&gt;
&lt;br /&gt;
As Darling says &amp;quot;&#039;&#039;&#039;When life gets you down, orbit yourself.&#039;&#039;&#039;&amp;quot;&lt;/div&gt;</summary>
		<author><name>Darling Brody</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LSL_Protocol/Teleport_Helper_Protocol&amp;diff=1183698</id>
		<title>LSL Protocol/Teleport Helper Protocol</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LSL_Protocol/Teleport_Helper_Protocol&amp;diff=1183698"/>
		<updated>2013-11-19T23:01:08Z</updated>

		<summary type="html">&lt;p&gt;Darling Brody: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Teleport Helper Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A protocol that fixes the limitations in the llTeleportAgent* functions, avoids broken content, and blocks any possible abuse.&lt;br /&gt;
&lt;br /&gt;
    Useful for : Star Gates, Quantum Portals, Teleporter Platforms, Tours, etc...&lt;br /&gt;
&lt;br /&gt;
The purpose of this protocol is to allow land owners to teleport visitors without the visitors needing to sit on objects.&lt;br /&gt;
&lt;br /&gt;
The new Linden teleport functions are fantastic but they only work on the script&#039;s owner.  &lt;br /&gt;
&lt;br /&gt;
To make the new teleport functions useful they need to work on people who are visiting your land, while blocking any possibility for abuse.&lt;br /&gt;
&lt;br /&gt;
The way to do this is to wear a script which will teleport you on request, while still asking you before doing so.&lt;br /&gt;
&lt;br /&gt;
If enough people include this script into their HUDs, hair, shoes, etc the Linden teleport commands will become useful everywhere.&lt;br /&gt;
&lt;br /&gt;
Details:-&lt;br /&gt;
&lt;br /&gt;
    This script will listen on channel 86400000 for the teleport command. (and other commands as the protocol is expanded)&lt;br /&gt;
&lt;br /&gt;
    command format &amp;quot;teleport[region_name~region_position~look_at_position]&amp;quot;&lt;br /&gt;
            region_name : is the plain text name of the target region&lt;br /&gt;
            region_position : is a vector for the local position in the region, &amp;lt;0-255, 0-255, 0-4096&amp;gt;&lt;br /&gt;
            look_at_position : is a vector for the position the avatar should be turned to face, &amp;lt;0-255, 0-255, 0&amp;gt;. &lt;br /&gt;
            eg:  llRegionSayTo(AvatarUUID,86400000,&amp;quot;teleport[quantum~&amp;lt;128, 128, 500&amp;gt;~&amp;lt;0, 128, 0&amp;gt;]&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
Note: &lt;br /&gt;
&lt;br /&gt;
The ~ character is used as a field delimiter because it is not used by any variables, such as the comma in a vector, or the pipe in some chat commands.&lt;br /&gt;
&lt;br /&gt;
Commands are a single word with their parameters enclosed in the [] brackets. Additional parameters may be added so long as they are added to the end of the existing parameters. eg: delete[object name] or teleport[quantum~&amp;lt;128, 128, 500&amp;gt;~&amp;lt;0, 128, 0&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
llWhisper(), llSay(), llShout(), and llRegionSay() can all be used to deliver the teleport[] command to groups of people. While llRegionSayTo() is proffered for sending the command to one person only. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Features:-&lt;br /&gt;
&lt;br /&gt;
    Only works if the request comes from an object owned by the land owner. Group owned land requires group owned objects.&lt;br /&gt;
    Limit of one teleport per minute to avoid spamming.&lt;br /&gt;
    Permissions are dropped after use.&lt;br /&gt;
    Only one teleport is offered, regardless of how many copies of the script is worn.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To Do:-&lt;br /&gt;
&lt;br /&gt;
    Make this page look nice with some formatting&lt;br /&gt;
&lt;br /&gt;
    Delete[object_name] Delete the script from the named object so people can remove duplicates they know they will never need. Must check that the owner send this command.&lt;br /&gt;
&lt;br /&gt;
    Expand this script to support any other protocols that are used in custom products, such as some star gates.&lt;br /&gt;
&lt;br /&gt;
---------------&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
 vector global_coordinates;&lt;br /&gt;
 vector region_coordinates;&lt;br /&gt;
 vector look_at;&lt;br /&gt;
 integer Priority;&lt;br /&gt;
 integer Active = TRUE; // Default is Active&lt;br /&gt;
 key reqID;&lt;br /&gt;
 default&lt;br /&gt;
 {&lt;br /&gt;
    on_rez(integer param)&lt;br /&gt;
    {&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
    attach(key id)&lt;br /&gt;
    {&lt;br /&gt;
        if (id == NULL_KEY) llRegionSayTo(llGetOwner(),86400000,&amp;quot;1&amp;quot;); // on detach try to re-enable other scripts that may be inActive&lt;br /&gt;
    }&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llListen(86400000,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;); // used to receive teleport commands and set controller priority&lt;br /&gt;
        Priority = (integer)((llFrand(10000)*10000)+2); // Pick a Priority&lt;br /&gt;
        llRegionSayTo(llGetOwner(),86400000,(string)Priority); // share the Priority&lt;br /&gt;
    }&lt;br /&gt;
    listen(integer channel, string name, key id, string message)&lt;br /&gt;
    {&lt;br /&gt;
        if ((integer)message &amp;gt; 0) // Priority received&lt;br /&gt;
        {&lt;br /&gt;
            if ((integer)message &amp;gt; Priority) // compare my Priority with received one&lt;br /&gt;
            {&lt;br /&gt;
                Active = FALSE; // set inActive because I have a lower priority&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            else &lt;br /&gt;
            {&lt;br /&gt;
                Active = TRUE; // set Active because I have a higher priority&lt;br /&gt;
                llRegionSayTo(llGetOwner(),86400000,(string)Priority); // share my higher priority to set other script(s) inActive&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        if ((llSubStringIndex(message,&amp;quot;teleport[&amp;quot;) == 0) &amp;amp;&amp;amp; (Active == TRUE)) // teleport command &amp;amp; Active Mode&lt;br /&gt;
        {&lt;br /&gt;
            if (llGetLandOwnerAt(llGetPos()) != llGetOwnerKey(id)) return; // must come from owner of land under avatar&lt;br /&gt;
            list command =  llParseString2List(message,[&amp;quot;teleport[&amp;quot;,&amp;quot;~&amp;quot;,&amp;quot;]&amp;quot;],[]); // extract destination details&lt;br /&gt;
            region_coordinates = (vector)llList2String(command,1); // save destination position&lt;br /&gt;
            look_at = (vector)llList2String(command,2); // save look at position&lt;br /&gt;
            reqID = llRequestSimulatorData(llList2String(command,0), DATA_SIM_POS); // request region position&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    dataserver(key query_id, string data)&lt;br /&gt;
    {&lt;br /&gt;
        if (reqID != query_id) return; // filter out irralavant queries&lt;br /&gt;
        global_coordinates = (vector)data; // save region position&lt;br /&gt;
        llRequestPermissions(llGetOwner(), PERMISSION_TELEPORT); // request permission to teleport&lt;br /&gt;
        // Active = FALSE; // Optional to avoid spamming additional permission requests when the last one wasn&#039;t answered&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    run_time_permissions(integer perm)&lt;br /&gt;
    {&lt;br /&gt;
        if (perm &amp;amp; PERMISSION_TELEPORT)&lt;br /&gt;
        {&lt;br /&gt;
            llUnSit(llGetOwner()); // sitting avatar will not teleport&lt;br /&gt;
            llTeleportAgentGlobalCoords( llGetOwner(), global_coordinates, region_coordinates, look_at); // teleport&lt;br /&gt;
            // avoid teleport spam by resetting after a pause&lt;br /&gt;
            llSleep(60); &lt;br /&gt;
            llResetScript(); &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;/div&gt;</summary>
		<author><name>Darling Brody</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Darling_Brody&amp;diff=1183689</id>
		<title>User:Darling Brody</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Darling_Brody&amp;diff=1183689"/>
		<updated>2013-11-19T21:56:40Z</updated>

		<summary type="html">&lt;p&gt;Darling Brody: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Darling Brody&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Either an annoying griefer or a programmer with a passion for creating.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Darling Brody founded Quantum Products in 2006 when she made her first teleporters. The following year she branched out into weapons because there wasn&#039;t any money in selling teleporters.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Darling Brody is best known for her Quantum Core and QHUD, but still prefers to work on teleporters because &amp;quot;the special effects are so sparkly&amp;quot;.  To date there are dozens of different teleporters, terraforming tools, etc created by her on sale in the region QUANTUM as well as a selection of weapons too.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Most people have very strong opinions of Darling Brody.  They either love her or hate her.  This love/hate relationship seems to be closely linked to &amp;quot;who owns her weapons, and who gets owned by her weapons&amp;quot;.  Either way Darling Brody has never been punished for griefing, so her reputation as a grifer is probably just cleaver marketing ;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
While she is known to be very friendly and helpful to her customers and strangers alike, she is also known to be completely uncooperative when people are rude to her. Of course none of us would ever be silly enough to be rude to a weapons maker, right?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Darling Brody is well known by many Lindens as someone who helps to fix bugs and plug content theft methods.  She is also active in the JIRA opposing changes that break content. She has often fought to have useful bugs retained as a feature, such as the longer avatar Link Distance when sitting on a prim, and retaining the JumpPos bug until the llSetRegionPos() function was completed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
She has been a long time advocate of protecting content from theft. Ironical she has fallen victim to content theft several times, having her scripts used as the base to create competing products.  Most notably the Quantum Core v3 scripts were stolen, resulting in a number of copycat products hitting the market.  Darling responded by tossing out the old Quantum Core v3 scripts and starting a new product line from scratch called QHUD which included script theft protection.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In 2009 darling Brody had a Real Life mental breakdown that left her homeless for several years.  Her products were not updated as often while she was homeless, however they stood the test of time and remained relevant despite the infrequent updates.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Today Darling is busy writing new updates and creating new products.  &lt;br /&gt;
&lt;br /&gt;
As Darling says &amp;quot;&#039;&#039;&#039;When life gets you down, orbit yourself.&#039;&#039;&#039;&amp;quot;&lt;/div&gt;</summary>
		<author><name>Darling Brody</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Darling_Brody&amp;diff=1183688</id>
		<title>User:Darling Brody</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Darling_Brody&amp;diff=1183688"/>
		<updated>2013-11-19T21:54:25Z</updated>

		<summary type="html">&lt;p&gt;Darling Brody: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Darling Brody&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Either an annoying griefer or a programmer with a passion for creating.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Darling Brody founded Quantum Products in 2006 when she made her first teleporters. The following year she branched out into weapons because there wasn&#039;t any money in selling teleporters.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Darling Brody is best known for her Quantum Core and QHUD, but still prefers to work on teleporters because &amp;quot;the special effects are so sparkly&amp;quot;.  To date there are dozens of different teleporters, terraforming tools, etc created by her on sale in the region QUANTUM as well as a selection of weapons too.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Most people have very strong opinions of Darling Brody.  They either love her or hate her.  This love/hate relationship seems to be closely linked to &amp;quot;who owns her weapons, and who gets owned by her weapons&amp;quot;.  Either way Darling Brody has never been punished for griefing, so her reputation as a grifer is probably just cleaver marketing ;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
While she is known to be very friendly and helpful to her customers and strangers alike, she is also known to be completely uncooperative when people are rude to her. Of course none of us would ever be silly enough to be rude to a weapons maker, right?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Darling Brody is well known by many Lindens as someone who helps to fix bugs and plug content theft methods.  She is also active in the JIRA opposing changes that break content. She has often fought to have useful bugs retained as a feature, such as the longer avatar Link Distance when sitting on a prim, and retaining the JumpPos bug until the llSetRegionPos() function was completed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Darling Brody has been a long time advocate of protecting content from theft. Ironical she has fallen victim to content theft several times, having her scripts used as the base to create competing products.  Most notably the Quantum Core v3 scripts were stolen, resulting in a number of copycat products hitting the market.  Darling responded by tossing out the old Quantum Core v3 scripts and starting a new product line from scratch called QHUD which included script theft protection.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In 2009 darling Brody had a Real Life mental breakdown that left her homeless for several years.  Her products were not updated as often while she was homeless, however they stood the test of time and remained relevant despite the infrequent updates.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Today Darling is busy writing new updates and creating new products.  &lt;br /&gt;
&lt;br /&gt;
As Darling says &amp;quot;&#039;&#039;&#039;When life gets you down, orbit yourself.&#039;&#039;&#039;&amp;quot;&lt;/div&gt;</summary>
		<author><name>Darling Brody</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Darling_Brody&amp;diff=1183687</id>
		<title>User:Darling Brody</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Darling_Brody&amp;diff=1183687"/>
		<updated>2013-11-19T21:47:25Z</updated>

		<summary type="html">&lt;p&gt;Darling Brody: Created page with &amp;quot;&amp;#039;&amp;#039;&amp;#039;Darling Brody&amp;#039;&amp;#039;&amp;#039;  Either an annoying griefer or a programmer with a passion for creating.   Darling Brody founded Quantum Products in 2006 when she made her first teleporters.…&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Darling Brody&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Either an annoying griefer or a programmer with a passion for creating.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Darling Brody founded Quantum Products in 2006 when she made her first teleporters. The following year she branched out into weapons because there wasn&#039;t any money in selling teleporters.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Darling Brody is best known for her Quantum Core and QHUD, but still prefers to work on teleporters because &amp;quot;the special effects are so sparkly&amp;quot;.  To date there are dozens of different teleporters, terraforming tools, etc created by her on sale in the region QUANTUM as well as a selection of weapons too.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Most people have very strong opinions of Darling Brody.  They either love her or hate her.  This love/hate relationship seems to be closely linked to &amp;quot;who owns her weapons, and who gets owned by her weapons&amp;quot;.  Either way Darling Brody has never been punished for griefing, so her reputation as a grifer is probably just cleaver marketing ;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
While she is known to be very friendly and helpful to her customers and strangers alike, she is also known to be completely uncooperative when people are rude to her. Of course none of us would ever be silly enough to be rude to a weapons maker, right?&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Darling Brody is well known by many Lindens as someone who helps to fix bugs and plug content theft methods.  She is also active in the JIRA opposing changes that break content. She has often fought to have useful bugs retained as a feature, such as the longer avatar Link Distance when sitting on a prim, and retaining the JumpPos bug until the llSetRegionPos() function was completed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Darling Brody has been a long time advocate of protecting content from theft. Ironical she has fallen victim to content theft several times, having her scripts used as the base to create competing products.  Most notably the Quantum Core v3 scripts were released full permissions, resulting in a number of copycat products hitting the market.  Darling responded by tossing out the old Quantum Core v3 scripts and starting a new product line from scratch called QHUD which included script theft protection.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
In 2009 darling Brody had a Real Life mental breakdown that left her homeless for several years.  Her products were not updated as often in this time, however they stood the test of time and remained relevant despite the infrequent updates.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Today Darling is busy writing new updates and creating new products.  &lt;br /&gt;
&lt;br /&gt;
As Darling says &amp;quot;&#039;&#039;&#039;When life gets you down, orbit yourself.&#039;&#039;&#039;&amp;quot;&lt;/div&gt;</summary>
		<author><name>Darling Brody</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LSL_Protocol/Teleport_Helper_Protocol&amp;diff=1183686</id>
		<title>LSL Protocol/Teleport Helper Protocol</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LSL_Protocol/Teleport_Helper_Protocol&amp;diff=1183686"/>
		<updated>2013-11-19T21:03:26Z</updated>

		<summary type="html">&lt;p&gt;Darling Brody: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Teleport Helper Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A protocol that fixes the limitations in the llTeleportAgent* functions, avoids broken content, and blocks any possible abuse.&lt;br /&gt;
&lt;br /&gt;
    Useful for : Star Gates, Quantum Portals, Teleporter Platforms, Tours, etc...&lt;br /&gt;
&lt;br /&gt;
The purpose of this protocol is to allow land owners to teleport visitors without the visitors needing to sit on objects.&lt;br /&gt;
&lt;br /&gt;
The new Linden teleport functions are fantastic but they only work on the script&#039;s owner.  &lt;br /&gt;
&lt;br /&gt;
To make the new teleport functions useful they need to work on people who are visiting your land, while blocking any possibility for abuse.&lt;br /&gt;
&lt;br /&gt;
The way to do this is to wear a script which will teleport you on request, while still asking you before doing so.&lt;br /&gt;
&lt;br /&gt;
If enough people include this script into their HUDs, hair, shoes, etc the Linden teleport commands will become useful everywhere.&lt;br /&gt;
&lt;br /&gt;
Details:-&lt;br /&gt;
&lt;br /&gt;
    This script will listen on channel 86400000 for the teleport command. (and other commands as the protocol is expanded)&lt;br /&gt;
&lt;br /&gt;
    command format &amp;quot;teleport[region_name~region_position~look_at_position]&amp;quot;&lt;br /&gt;
            region_name : is the plain text name of the target region&lt;br /&gt;
            region_position : is a vector for the local position in the region, &amp;lt;0-255, 0-255, 0-4096&amp;gt;&lt;br /&gt;
            look_at_position : is a vector for the position the avatar should be turned to face, &amp;lt;0-255, 0-255, 0&amp;gt;. &lt;br /&gt;
            eg:  llRegionSayTo(AvatarUUID,86400000,&amp;quot;teleport[quantum~&amp;lt;128, 128, 500&amp;gt;~&amp;lt;0, 128, 0&amp;gt;]&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
Note: &lt;br /&gt;
&lt;br /&gt;
The ~ character is used as a field delimiter because it is not used by any variables, such as the comma in a vector, or the pipe in some chat commands.&lt;br /&gt;
&lt;br /&gt;
Commands are a single word with their parameters enclosed in the [] brackets. Additional parameters may be added so long as they are added to the end of the existing parameters. eg: delete[object name] or teleport[quantum~&amp;lt;128, 128, 500&amp;gt;~&amp;lt;0, 128, 0&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
llWhisper(), llSay(), llShout(), and llRegionSay() can all be used to deliver the teleport[] command to groups of people. While llRegionSayTo() is proffered for sending the command to one person only. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Features:-&lt;br /&gt;
&lt;br /&gt;
    Only works if the request comes from an object owned by the land owner. Group owned land requires group owned objects.&lt;br /&gt;
    Limit of one teleport per minute to avoid spamming.&lt;br /&gt;
    Permissions are dropped after use.&lt;br /&gt;
    Only one teleport is offered, regardless of how many copies of the script is worn.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To Do:-&lt;br /&gt;
&lt;br /&gt;
    Make this page look nice with some formatting&lt;br /&gt;
&lt;br /&gt;
    Delete[object_name] Delete the script from the named object so people can remove duplicates they know they will never need. Must check that the owner send this command.&lt;br /&gt;
&lt;br /&gt;
    Expand this script to support any other protocols that are used in custom products, such as some star gates.&lt;br /&gt;
&lt;br /&gt;
---------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 vector global_coordinates;&lt;br /&gt;
 vector region_coordinates;&lt;br /&gt;
 vector look_at;&lt;br /&gt;
 integer Priority;&lt;br /&gt;
 integer Active = TRUE; // Default is Active&lt;br /&gt;
 key reqID;&lt;br /&gt;
 default&lt;br /&gt;
 {&lt;br /&gt;
    on_rez(integer param)&lt;br /&gt;
    {&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
    attach(key id)&lt;br /&gt;
    {&lt;br /&gt;
        if (id == NULL_KEY) llRegionSayTo(llGetOwner(),86400000,&amp;quot;1&amp;quot;); // on detach try to re-enable other scripts that may be inActive&lt;br /&gt;
    }&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llListen(86400000,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;); // used to receive teleport commands and set controller priority&lt;br /&gt;
        Priority = (integer)((llFrand(10000)*10000)+2); // Pick a Priority&lt;br /&gt;
        llRegionSayTo(llGetOwner(),86400000,(string)Priority); // share the Priority&lt;br /&gt;
    }&lt;br /&gt;
    listen(integer channel, string name, key id, string message)&lt;br /&gt;
    {&lt;br /&gt;
        if ((integer)message &amp;gt; 0) // Priority received&lt;br /&gt;
        {&lt;br /&gt;
            if ((integer)message &amp;gt; Priority) // compare my Priority with received one&lt;br /&gt;
            {&lt;br /&gt;
                Active = FALSE; // set inActive because I have a lower priority&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            else &lt;br /&gt;
            {&lt;br /&gt;
                Active = TRUE; // set Active because I have a higher priority&lt;br /&gt;
                llRegionSayTo(llGetOwner(),86400000,(string)Priority); // share my higher priority to set other script(s) inActive&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        if ((llSubStringIndex(message,&amp;quot;teleport[&amp;quot;) == 0) &amp;amp;&amp;amp; (Active == TRUE)) // teleport command &amp;amp; Active Mode&lt;br /&gt;
        {&lt;br /&gt;
            if (llGetLandOwnerAt(llGetPos()) != llGetOwnerKey(id)) return; // must come from owner of land under avatar&lt;br /&gt;
            list command =  llParseString2List(message,[&amp;quot;teleport[&amp;quot;,&amp;quot;~&amp;quot;,&amp;quot;]&amp;quot;],[]); // extract destination details&lt;br /&gt;
            region_coordinates = (vector)llList2String(command,1); // save destination position&lt;br /&gt;
            look_at = (vector)llList2String(command,2); // save look at position&lt;br /&gt;
            reqID = llRequestSimulatorData(llList2String(command,0), DATA_SIM_POS); // request region position&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    dataserver(key query_id, string data)&lt;br /&gt;
    {&lt;br /&gt;
        if (reqID != query_id) return; // filter out irralavant queries&lt;br /&gt;
        global_coordinates = (vector)data; // save region position&lt;br /&gt;
        llRequestPermissions(llGetOwner(), PERMISSION_TELEPORT); // request permission to teleport&lt;br /&gt;
        // Active = FALSE; // Optional to avoid spamming additional permission requests when the last one wasn&#039;t answered&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    run_time_permissions(integer perm)&lt;br /&gt;
    {&lt;br /&gt;
        if (perm &amp;amp; PERMISSION_TELEPORT)&lt;br /&gt;
        {&lt;br /&gt;
            llUnSit(llGetOwner()); // sitting avatar will not teleport&lt;br /&gt;
            llTeleportAgentGlobalCoords( llGetOwner(), global_coordinates, region_coordinates, look_at); // teleport&lt;br /&gt;
            // avoid teleport spam by resetting after a pause&lt;br /&gt;
            llSleep(60); &lt;br /&gt;
            llResetScript(); &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;/div&gt;</summary>
		<author><name>Darling Brody</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LSL_Protocol/Teleport_Helper_Protocol&amp;diff=1183685</id>
		<title>LSL Protocol/Teleport Helper Protocol</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LSL_Protocol/Teleport_Helper_Protocol&amp;diff=1183685"/>
		<updated>2013-11-19T20:52:19Z</updated>

		<summary type="html">&lt;p&gt;Darling Brody: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&#039;&#039;&#039;Teleport Helper Protocol&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
A protocol that fixes the limitations in the llTeleportAgent* functions, avoids broken content, and blocks any possible abuse.&lt;br /&gt;
&lt;br /&gt;
    Useful for : Star Gates, Quantum Portals, Teleporter Platforms, Tours, etc...&lt;br /&gt;
&lt;br /&gt;
The purpose of this protocol is to allow land owners to teleport visitors without the visitors needing to sit on objects.&lt;br /&gt;
&lt;br /&gt;
The new Linden teleport functions are fantastic but they only work on the script&#039;s owner.  &lt;br /&gt;
&lt;br /&gt;
To make the new teleport functions useful they need to work on people who are visiting your land, while blocking any possibility for abuse.&lt;br /&gt;
&lt;br /&gt;
The way to do this is to wear a script which will teleport you on request, while still asking you before doing so.&lt;br /&gt;
&lt;br /&gt;
If enough people include this script into their HUDs, hair, shoes, etc the Linden teleport commands will become useful everywhere.&lt;br /&gt;
&lt;br /&gt;
Details:-&lt;br /&gt;
&lt;br /&gt;
    This script will listen on channel 86400000 for the teleport command. (and other commands as the protocol is expanded)&lt;br /&gt;
&lt;br /&gt;
    command format &amp;quot;teleport[region_name~region_position~look_at_position]&amp;quot;&lt;br /&gt;
            region_name : is the plain text name of the target region&lt;br /&gt;
            region_position : is a vector for the local position in the region, &amp;lt;0-255, 0-255, 0-4096&amp;gt;&lt;br /&gt;
            look_at_position : is a vector for the position the avatar should be turned to face, &amp;lt;0-255, 0-255, 0&amp;gt;. &lt;br /&gt;
            eg:  llRegionSayTo(AvatarUUID,86400000,&amp;quot;teleport[quantum~&amp;lt;128, 128, 500&amp;gt;~&amp;lt;0, 128, 0&amp;gt;]&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
Note: &lt;br /&gt;
&lt;br /&gt;
The ~ character is used as a field delimiter because it is not used by any variables, such as the comma in a vector, or the pipe in some chat commands.&lt;br /&gt;
&lt;br /&gt;
Commands are a single word with their parameters enclosed in the [] brackets. Additional parameters may be added so long as they are added to the end of the existing parameters. eg: delete[object name] or teleport[quantum~&amp;lt;128, 128, 500&amp;gt;~&amp;lt;0, 128, 0&amp;gt;]]&lt;br /&gt;
&lt;br /&gt;
llWhisper(), llSay(), llShout(), and llRegionSay() can all be used to deliver the teleport[] command to groups of people. While llRegionSayTo() is proffered for sending the command to one person only. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Features:-&lt;br /&gt;
&lt;br /&gt;
    Only works if the request comes from an object owned by the land owner. Group owned land requires group owned objects.&lt;br /&gt;
    Limit of one teleport per minute to avoid spamming.&lt;br /&gt;
    Permissions are dropped after use.&lt;br /&gt;
    Only one teleport is offered, regardless of how many copies of the script is worn.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To Do:-&lt;br /&gt;
&lt;br /&gt;
    Make this page look nice with some formatting&lt;br /&gt;
&lt;br /&gt;
    Delete[object_name] Delete the script from the named object so people can remove duplicates they know they will never need. Must check that the owner send this command.&lt;br /&gt;
&lt;br /&gt;
    Expand this script to support any other protocols that are used in custom products, such as some star gates.&lt;br /&gt;
&lt;br /&gt;
---------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
vector global_coordinates;&lt;br /&gt;
vector region_coordinates;&lt;br /&gt;
vector look_at;&lt;br /&gt;
&lt;br /&gt;
integer Priority;&lt;br /&gt;
integer Active = TRUE; // Default is Active&lt;br /&gt;
&lt;br /&gt;
key reqID;&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    on_rez(integer param)&lt;br /&gt;
    {&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
    attach(key id)&lt;br /&gt;
    {&lt;br /&gt;
        if (id == NULL_KEY) llRegionSayTo(llGetOwner(),86400000,&amp;quot;1&amp;quot;); // on detach try to re-enable other scripts that may be inActive&lt;br /&gt;
    }&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llListen(86400000,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;); // used to receive teleport commands and set controller priority&lt;br /&gt;
        Priority = (integer)((llFrand(10000)*10000)+2); // Pick a Priority&lt;br /&gt;
        llRegionSayTo(llGetOwner(),86400000,(string)Priority); // share the Priority&lt;br /&gt;
    }&lt;br /&gt;
    listen(integer channel, string name, key id, string message)&lt;br /&gt;
    {&lt;br /&gt;
        if ((integer)message &amp;gt; 0) // Priority received&lt;br /&gt;
        {&lt;br /&gt;
            if ((integer)message &amp;gt; Priority) // compare my Priority with received one&lt;br /&gt;
            {&lt;br /&gt;
                Active = FALSE; // set inActive because it has a lower priority&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            else &lt;br /&gt;
            {&lt;br /&gt;
                Active = TRUE; // set Active because it has a higher priority&lt;br /&gt;
                llRegionSayTo(llGetOwner(),86400000,(string)Priority); // share my higher priority to set other script(s) inActive&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        if ((llSubStringIndex(message,&amp;quot;teleport[&amp;quot;) == 0) &amp;amp;&amp;amp; (Active == TRUE)) // teleport command &amp;amp; Active Mode&lt;br /&gt;
        {&lt;br /&gt;
            if (llGetLandOwnerAt(llGetPos()) != llGetOwnerKey(id)) return; // must come from owner of land under avatar&lt;br /&gt;
            list command =  llParseString2List(message,[&amp;quot;teleport[&amp;quot;,&amp;quot;~&amp;quot;,&amp;quot;]&amp;quot;],[]); // extract destination details&lt;br /&gt;
            region_coordinates = (vector)llList2String(command,1); // save destination position&lt;br /&gt;
            look_at = (vector)llList2String(command,2); // save look at position&lt;br /&gt;
            reqID = llRequestSimulatorData(llList2String(command,0), DATA_SIM_POS); // request region position&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    dataserver(key query_id, string data)&lt;br /&gt;
    {&lt;br /&gt;
        if (reqID != query_id) return; // filter out irralavant queries&lt;br /&gt;
        global_coordinates = (vector)data; // save region position&lt;br /&gt;
        llRequestPermissions(llGetOwner(), PERMISSION_TELEPORT); // request permission to teleport&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    run_time_permissions(integer perm)&lt;br /&gt;
    {&lt;br /&gt;
        if (perm &amp;amp; PERMISSION_TELEPORT)&lt;br /&gt;
        {&lt;br /&gt;
            llUnSit(llGetOwner()); // sitting avatar will not teleport&lt;br /&gt;
            llTeleportAgentGlobalCoords( llGetOwner(), global_coordinates, region_coordinates, look_at); // teleport&lt;br /&gt;
            // avoid teleport spam by resetting after a pause&lt;br /&gt;
            llSleep(60); &lt;br /&gt;
            llResetScript(); &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Darling Brody</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LSL_Protocol/Teleport_Helper_Protocol&amp;diff=1183684</id>
		<title>LSL Protocol/Teleport Helper Protocol</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LSL_Protocol/Teleport_Helper_Protocol&amp;diff=1183684"/>
		<updated>2013-11-19T20:43:24Z</updated>

		<summary type="html">&lt;p&gt;Darling Brody: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Teleport Helper Protocol &lt;br /&gt;
&lt;br /&gt;
A protocol that fixes the limitations in the llTeleportAgent* functions, avoids broken content, and blocks any possible abuse.&lt;br /&gt;
&lt;br /&gt;
Useful for : Star Gates, Quantum Portals, Teleporter Platforms, Tours, etc...&lt;br /&gt;
&lt;br /&gt;
The purpose of this protocol is to allow land owners to teleport visitors without the visitors needing to sit on objects.&lt;br /&gt;
&lt;br /&gt;
The new Linden teleport functions are fantastic but they only work on the script&#039;s owner.  &lt;br /&gt;
&lt;br /&gt;
To make the new teleport functions useful they need to work on people who are visiting your land, while blocking any possibility for abuse.&lt;br /&gt;
&lt;br /&gt;
The way to do this is to wear a script which will teleport you on request, while still asking you before doing so.&lt;br /&gt;
&lt;br /&gt;
If enough people include this script into their HUDs, hair, shoes, etc the Linden teleport commands will become useful everywhere.&lt;br /&gt;
&lt;br /&gt;
Details:-&lt;br /&gt;
&lt;br /&gt;
This script will listen on channel 86400000 for the teleport command. (and other commands as the protocol is expanded)&lt;br /&gt;
&lt;br /&gt;
command format &amp;quot;teleport[region_name~region_position~look_at_position]&amp;quot;&lt;br /&gt;
&lt;br /&gt;
            region_name : is the plain text name of the target region&lt;br /&gt;
&lt;br /&gt;
            region_position : is a vector for the local position in the region, &amp;lt;0-255, 0-255, 0-4096&amp;gt;&lt;br /&gt;
&lt;br /&gt;
            look_at_position : is a vector for the position the avatar should be turned to face, &amp;lt;0-255, 0-255, 0&amp;gt;. &lt;br /&gt;
&lt;br /&gt;
             eg:  llRegionSayTo(AvatarUUID,86400000,&amp;quot;teleport[quantum~&amp;lt;128, 128, 500&amp;gt;~&amp;lt;0, 128, 0&amp;gt;]&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
Note: &lt;br /&gt;
The ~ character is used as a field delimiter because it is not used by any variables, such as the comma in a vector, or the pipe in some chat commands. &lt;br /&gt;
Commands are a single word with their parameters enclosed in the [] brackets. Additional parameters may be added so long as they are added to the end of the existing parameters. eg: delete[object name] or teleport[quantum~&amp;lt;128, 128, 500&amp;gt;~&amp;lt;0, 128, 0&amp;gt;]]&lt;br /&gt;
llWhisper(), llSay(), llShout(), and llRegionSay() can all be used to deliver the teleport[] command to groups of people. While llRegionSayTo() is proffered for sending the command to one person only. &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Features:-&lt;br /&gt;
&lt;br /&gt;
    Only works if the request comes from an object owned by the land owner. Group owned land requires group owned objects.&lt;br /&gt;
    Limit of one teleport per minute to avoid spamming.&lt;br /&gt;
    Permissions are dropped after use.&lt;br /&gt;
    Only one teleport is offered, regardless of how many copies of the script is worn.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
To Do:-&lt;br /&gt;
&lt;br /&gt;
Make this page look nice with some formatting&lt;br /&gt;
&lt;br /&gt;
Delete[object_name] - Delete the script from the named object so people can remove duplicates they know they will never need.&lt;br /&gt;
                    - Must check that the owner send this command&lt;br /&gt;
&lt;br /&gt;
Expand this script to support any other protocols that are used in custom products, such as some star gates.&lt;br /&gt;
&lt;br /&gt;
---------------&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
vector global_coordinates;&lt;br /&gt;
vector region_coordinates;&lt;br /&gt;
vector look_at;&lt;br /&gt;
&lt;br /&gt;
integer Priority;&lt;br /&gt;
integer Active = TRUE; // Default is Active&lt;br /&gt;
&lt;br /&gt;
key reqID;&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    on_rez(integer param)&lt;br /&gt;
    {&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    attach(key id)&lt;br /&gt;
    {&lt;br /&gt;
        if (id == NULL_KEY) llRegionSayTo(llGetOwner(),86400000,&amp;quot;1&amp;quot;); // on detach try to re-enable other scripts that may be inActive&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llListen(86400000,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;); // used to receive teleport commands and set controller priority&lt;br /&gt;
        Priority = (integer)((llFrand(10000)*10000)+2); // Pick a Priority&lt;br /&gt;
        llRegionSayTo(llGetOwner(),86400000,(string)Priority); // share the Priority&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    listen(integer channel, string name, key id, string message)&lt;br /&gt;
    {&lt;br /&gt;
        if ((integer)message &amp;gt; 0) // Priority received&lt;br /&gt;
        {&lt;br /&gt;
            if ((integer)message &amp;gt; Priority) // compare my Priority with received one&lt;br /&gt;
            {&lt;br /&gt;
                Active = FALSE; // set inActive because it has a lower priority&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            else &lt;br /&gt;
            {&lt;br /&gt;
                Active = TRUE; // set Active because it has a higher priority&lt;br /&gt;
                llRegionSayTo(llGetOwner(),86400000,(string)Priority); // share my higher priority to set other script(s) inActive&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        if ((llSubStringIndex(message,&amp;quot;teleport[&amp;quot;) == 0) &amp;amp;&amp;amp; (Active == TRUE)) // teleport command &amp;amp; Active Mode&lt;br /&gt;
        {&lt;br /&gt;
            if (llGetLandOwnerAt(llGetPos()) != llGetOwnerKey(id)) return; // must come from owner of land under avatar&lt;br /&gt;
            list command =  llParseString2List(message,[&amp;quot;teleport[&amp;quot;,&amp;quot;~&amp;quot;,&amp;quot;]&amp;quot;],[]); // extract destination details&lt;br /&gt;
            region_coordinates = (vector)llList2String(command,1); // save destination position&lt;br /&gt;
            look_at = (vector)llList2String(command,2); // save look at position&lt;br /&gt;
            reqID = llRequestSimulatorData(llList2String(command,0), DATA_SIM_POS); // request region position&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    dataserver(key query_id, string data)&lt;br /&gt;
    {&lt;br /&gt;
        if (reqID != query_id) return; // filter out irralavant queries&lt;br /&gt;
        global_coordinates = (vector)data; // save region position&lt;br /&gt;
        llRequestPermissions(llGetOwner(), PERMISSION_TELEPORT); // request permission to teleport&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    run_time_permissions(integer perm)&lt;br /&gt;
    {&lt;br /&gt;
        if (perm &amp;amp; PERMISSION_TELEPORT)&lt;br /&gt;
        {&lt;br /&gt;
            llUnSit(llGetOwner()); // sitting avatar will not teleport&lt;br /&gt;
            llTeleportAgentGlobalCoords( llGetOwner(), global_coordinates, region_coordinates, look_at); // teleport&lt;br /&gt;
            // avoid teleport spam by resetting after a pause&lt;br /&gt;
            llSleep(60); &lt;br /&gt;
            llResetScript(); &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Darling Brody</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LSL_Protocol/Teleport_Helper_Protocol&amp;diff=1183682</id>
		<title>LSL Protocol/Teleport Helper Protocol</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LSL_Protocol/Teleport_Helper_Protocol&amp;diff=1183682"/>
		<updated>2013-11-19T20:20:58Z</updated>

		<summary type="html">&lt;p&gt;Darling Brody: Created page with &amp;quot;Teleport Helper Protocol   A protocol that fixes the limitations in the llTeleportAgent* functions, avoids broken content, and blocks any possible abuse.&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Teleport Helper Protocol &lt;br /&gt;
&lt;br /&gt;
A protocol that fixes the limitations in the llTeleportAgent* functions, avoids broken content, and blocks any possible abuse.&lt;/div&gt;</summary>
		<author><name>Darling Brody</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LSL_Protocol&amp;diff=1183681</id>
		<title>LSL Protocol</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LSL_Protocol&amp;diff=1183681"/>
		<updated>2013-11-19T20:16:49Z</updated>

		<summary type="html">&lt;p&gt;Darling Brody: /* Protocol list */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header|ml=*}}&lt;br /&gt;
{{RightToc}}&lt;br /&gt;
==Script protocols and known chat channels==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em 0.5em 1.5em&amp;quot;&amp;gt;&lt;br /&gt;
Some times, scripts in Second Life send messages to one another to exchange information or coordinate behavior.  The rules for that conversation are a &#039;&#039;protocol&#039;&#039;.  Being able to say &amp;quot;/1show&amp;quot; or &amp;quot;/1hug lee&amp;quot; are examples.&lt;br /&gt;
&lt;br /&gt;
Such protocols use a common [[chat channel]].  The examples above use channel 1.  They could just as easily have used any other number, but a user (and other objects) have to have some way to find the correct number.&lt;br /&gt;
&lt;br /&gt;
Some protocols, such as combat systems, are quite complicated and could be better documented.  This page can be used to help prevent conflicts and allow multiple programmers to coordinate the protocol definitions.&lt;br /&gt;
&lt;br /&gt;
Protocols can also be note card systems and systems that use object names.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Protocol list ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em&amp;quot;&amp;gt;&lt;br /&gt;
Add a protocol here if it is widely used, or might be sometime in the future.&lt;br /&gt;
&lt;br /&gt;
A protocol in this list should also have its own pages where the protocol is defined in some detail.&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; {{Prettytable}}&lt;br /&gt;
|-&lt;br /&gt;
|{{Hl2}}| &#039;&#039;&#039;Name&#039;&#039;&#039;&lt;br /&gt;
|{{Hl2}}| &#039;&#039;&#039;Creator&#039;&#039;&#039;&lt;br /&gt;
|{{Hl2}}| &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|| [[LSL Protocol/Teleport_Helper_Protocol|Teleport Helper Protocol ]]&lt;br /&gt;
|| {{User|Darling Brody}}&lt;br /&gt;
|| Teleporter Helper Protocol.&lt;br /&gt;
|-&lt;br /&gt;
|| [[LSL Protocol/Cool_Hud_Protocol|Cool Hud]]&lt;br /&gt;
|| {{User|Henri Beauchamp}}&lt;br /&gt;
|| Universal Hud protocol.&lt;br /&gt;
|-&lt;br /&gt;
|| [[LSL Protocol/DataBot|DataBot]]&lt;br /&gt;
|| {{User|Siann Beck}}&lt;br /&gt;
|| A protocol for specifying custom avatar information.&lt;br /&gt;
|-&lt;br /&gt;
|| [[LSL Protocol/EasyTalk|EasyTalk]]&lt;br /&gt;
|| Salahzar Stenvaag&lt;br /&gt;
|| |Very Easy and simple communication protocol. Use it to simply coordinate llSay/llRegionSay/llListen objects, as well as linked set&lt;br /&gt;
|-&lt;br /&gt;
|| [[LSL Protocol/ListMessage|ListMessage]]&lt;br /&gt;
|| Anonymous&lt;br /&gt;
|| Send and receive lists, non-lists, non-results, verb-not-found, and partially evaluated Polish expressions.&lt;br /&gt;
|-&lt;br /&gt;
|| [[LSL Protocol/LockMeister System|LockMeister System]]&lt;br /&gt;
|| Kyrah Abattoir&lt;br /&gt;
|| Used to coordinate different parts of bondage toys.&lt;br /&gt;
|-&lt;br /&gt;
|| [[MLPV2|Multi Love Pose v2]] &lt;br /&gt;
|| [[User:Lear_Cale|Lear Cale]]&lt;br /&gt;
|| Pose Ball Rezzing and Menuing kit (see menu to the right of linked page for indepth spec/protocol)&lt;br /&gt;
|-&lt;br /&gt;
|| [[User:Nandana_Singh/nPose|nPose]]&lt;br /&gt;
|| Nandana Singh&lt;br /&gt;
|| Furniture Posing Menuing kit (does not use pose balls)&lt;br /&gt;
|-&lt;br /&gt;
|| [[LSL Protocol/Ganymedia OpenMAIP v1.0 Specification|OpenMAIP]]&lt;br /&gt;
|| Ganymede Ceriaptrix&lt;br /&gt;
|| &#039;&#039;Note: Specification is presently incomplete.&#039;&#039; Ganymedia OpenMAIP (Metaverse Application Internetworking Protocol) provides a TCP/IP-like routing and service-oriented message exchange protocol across multiple transport methods (including cross-simulator and cross-grid); allowing scripts to advertise their available functions, and relevant commands, to external and/or third-party scripts and viewers. Controlled access to closed functions is provided via RC4 challenge-response authentication. OpenMAIP also provides an optional RC4 cryptography layer, further extensible to public-private key DHSS.&lt;br /&gt;
|-&lt;br /&gt;
|| [[LSL Protocol/P Vendor Linked Messages API &amp;amp; Environment|P Vendor Linked Messages API &amp;amp; Environment]]&lt;br /&gt;
|| Zep Palen&lt;br /&gt;
|| Allows an owner of the P Vendor system to develope custom vendors and use the API for input/output&lt;br /&gt;
|-&lt;br /&gt;
|| [[LSL Protocol/RestrainedLoveAPI|RestrainedLove viewer API]]&lt;br /&gt;
|| Marine Kelley&lt;br /&gt;
|| Use the features of the RestrainedLove viewer through llOwnerSay() calls.&lt;br /&gt;
|-&lt;br /&gt;
|| [[LSL Protocol/Restrained Love Relay Specs|RestrainedLove viewer relay spec]]&lt;br /&gt;
|| Marine Kelley&lt;br /&gt;
|| Allow your furniture or cages to issue commands to the user&#039;s RestrainedLove viewer&lt;br /&gt;
|-&lt;br /&gt;
|| [[LSL Protocol/Restrained Life Open Relay Group|RestrainedLove viewer open relay spec]]&lt;br /&gt;
|| Open Relay Group&lt;br /&gt;
|| A superset of the RestrainedLife viewer relay spec with useful extensions created and maintained by the community.&lt;br /&gt;
|-&lt;br /&gt;
|| [[User:Nexii_Malthus/Script_API|Script API]]&lt;br /&gt;
|| [[User:Nexii_Malthus|Nexii Malthus]]&lt;br /&gt;
|| A protocol to provide a useful communication layer between LSL scripts and supported clients, as well as a useful and purposeful feature set. (Vertical Life and Plywood clients currently)&lt;br /&gt;
|-&lt;br /&gt;
|| [[Teacup|Teacup (LSL HTTP Server)]]&lt;br /&gt;
|| [[User:Void_Singer|Void Singer]]&lt;br /&gt;
|| An LSL Web Page Server for serving HTML content solely from within SL using shared media (Spec, protocols, linked examples)&lt;br /&gt;
|}&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==Known chat channels==&lt;br /&gt;
This list is intended to reduce the number of scripts using the same chat channel number. &lt;br /&gt;
Please try and keep them in sequence. Note that the absence of a channel reservation in this list does not mean that channel will never be used - some scripts choose channels randomly from a very, very large range, sometimes a range of all possible channels. &#039;&#039;Always&#039;&#039; design your communication protocols such that invalid/interfering messages are disposed of.&lt;br /&gt;
{| {{Prettytable}}&lt;br /&gt;
|-&lt;br /&gt;
|{{Hl2}}| &#039;&#039;&#039;Channel&#039;&#039;&#039;&lt;br /&gt;
|{{Hl2}}| &#039;&#039;&#039;Creator&#039;&#039;&#039;&lt;br /&gt;
|{{Hl2}}| &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|{{Hl2}}| &#039;&#039;&#039;Messages&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|| 1, 4, 5, 9&lt;br /&gt;
|| Unknown&lt;br /&gt;
|| Very common in poseballs&lt;br /&gt;
|| &amp;quot;hide&amp;quot;, &amp;quot;show&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|| 3&lt;br /&gt;
|| katie.paine&lt;br /&gt;
|| rf gag - also used by Darie&#039;s gag scripts&lt;br /&gt;
|-&lt;br /&gt;
|| 4&lt;br /&gt;
|| {{User|Mo Noel}}&lt;br /&gt;
|| (Depreciated: Default channel for chat redirection like in gags or other voice manipulating tools)&lt;br /&gt;
|-&lt;br /&gt;
|| 5&lt;br /&gt;
|| Psistorm Ikura&lt;br /&gt;
|| PsiCorp Products&lt;br /&gt;
|-&lt;br /&gt;
|| 6&lt;br /&gt;
|| grumble Loudon&lt;br /&gt;
|| pre-appended text and say it.&lt;br /&gt;
|| &amp;quot;/6 hello&amp;quot; becomes &amp;quot;/me Lion says: hello&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|| 8&lt;br /&gt;
|| {{User|Henri Beauchamp}}&lt;br /&gt;
|| Cool Collar command channel&lt;br /&gt;
|-&lt;br /&gt;
|| 8&lt;br /&gt;
|| unknown&lt;br /&gt;
|| Lulu cuffs / gags ..&lt;br /&gt;
|-&lt;br /&gt;
|| 9&lt;br /&gt;
|| DCS And Most Modern SLRPG Frame Works&lt;br /&gt;
|| Command channel for user commands for Combat Systems/ SLRPG Frameworks like DCS&lt;br /&gt;
|| /9on /9 reset /9&amp;lt;power&amp;gt; etc&lt;br /&gt;
|-&lt;br /&gt;
|| 10&lt;br /&gt;
|| [[ACE BnT]]/[[IntLibber Brautigan]]&lt;br /&gt;
|| Ancapistan Capital Exchange ATM user interface channel&lt;br /&gt;
|| &amp;quot;balance&amp;quot;,&amp;quot;withdraw&amp;quot;,&amp;quot;help&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
|| 10, 11, 12&lt;br /&gt;
|| Bettie Binder&lt;br /&gt;
|| doll life renamer&lt;br /&gt;
|-&lt;br /&gt;
|| 11&lt;br /&gt;
|| Racheal Young&lt;br /&gt;
|| Default channel of chat commands for Barre &amp;amp; Rachael Rockers Products&lt;br /&gt;
|-&lt;br /&gt;
|| 11&lt;br /&gt;
|| {{User|Mo Noel}}&lt;br /&gt;
|| Default channel of chat command interface of MoDesign products&lt;br /&gt;
|-&lt;br /&gt;
|| 12&lt;br /&gt;
|| Unknown&lt;br /&gt;
|| title and status of damage meter (combat system)&lt;br /&gt;
|-&lt;br /&gt;
|| 13&lt;br /&gt;
|| Daisy Rimbaud&lt;br /&gt;
|| evil titler&lt;br /&gt;
|-&lt;br /&gt;
|| 14&lt;br /&gt;
|| {{User|Mo Noel}}&lt;br /&gt;
|| Default channel for chat redirection like in gags or other voice manipulating tools&lt;br /&gt;
|-&lt;br /&gt;
|| 15&lt;br /&gt;
|| {{User|Mo Noel}}&lt;br /&gt;
|| Default channel for emote redirection like in gags or other voice manipulating tools&lt;br /&gt;
|-&lt;br /&gt;
|| 17&lt;br /&gt;
|| Susan Daviau&lt;br /&gt;
|| Susan&#039;s relay&lt;br /&gt;
|-&lt;br /&gt;
|| 19&lt;br /&gt;
|| Cloe&lt;br /&gt;
|| DEM rename &lt;br /&gt;
|-&lt;br /&gt;
|| 20&lt;br /&gt;
|| Unknown&lt;br /&gt;
|| SafeZone interface (combat system)&lt;br /&gt;
|-&lt;br /&gt;
|| 20&lt;br /&gt;
|| Bettie Binder&lt;br /&gt;
|| doll life dollyteer&lt;br /&gt;
|-&lt;br /&gt;
|| 21&lt;br /&gt;
|| Bettie Binder&lt;br /&gt;
|| doll life&lt;br /&gt;
|-&lt;br /&gt;
|| 22&lt;br /&gt;
|| {{User|Henri Beauchamp}}&lt;br /&gt;
|| Cool Cuffs command channel&lt;br /&gt;
|-&lt;br /&gt;
|| 22&lt;br /&gt;
|| {{User|unknown}}&lt;br /&gt;
|| OOC Textiness. Says what you type.&lt;br /&gt;
|-&lt;br /&gt;
|| 22&lt;br /&gt;
|| {{User|Corvan Nansen}}&lt;br /&gt;
|| Chat Enhancer. Out Of Character speech.&lt;br /&gt;
|-&lt;br /&gt;
|| 26&lt;br /&gt;
|| {{User|Agnes Paine}}&lt;br /&gt;
|| Command channel for restraints&lt;br /&gt;
|-&lt;br /&gt;
|| 33&lt;br /&gt;
|| {{User|Henri Beauchamp}}&lt;br /&gt;
|| Cool Nipples command channel&lt;br /&gt;
|-&lt;br /&gt;
|| 33&lt;br /&gt;
|| unknown&lt;br /&gt;
|| Collar&lt;br /&gt;
|-&lt;br /&gt;
|| 35&lt;br /&gt;
|| {{User|Corvan Nansen}}&lt;br /&gt;
|| Chat Enhancer Command channel.&lt;br /&gt;
|-&lt;br /&gt;
|| 36&lt;br /&gt;
|| {{User|Corvan Nansen}}&lt;br /&gt;
|| Ultimate Titler Command channel.&lt;br /&gt;
|-&lt;br /&gt;
|| 42&lt;br /&gt;
|| unknown&lt;br /&gt;
|| Common channel used by wiki example scripts&lt;br /&gt;
|- &lt;br /&gt;
|| 42, 55, 66, 77&lt;br /&gt;
|| Psistorm Ikura&lt;br /&gt;
|| Aventity avatar scripts&lt;br /&gt;
|-&lt;br /&gt;
|| 44&lt;br /&gt;
|| {{User|Corvan Nansen}}&lt;br /&gt;
|| Chat Enhancer. In Character speech.&lt;br /&gt;
|-&lt;br /&gt;
|| 45, 54&lt;br /&gt;
|| Ilobmirt Tenk&lt;br /&gt;
|| FOSSL Vending System Client/Server default command channel&lt;br /&gt;
|-&lt;br /&gt;
|| 55&lt;br /&gt;
|| {{User|Henri Beauchamp}}&lt;br /&gt;
|| Cool Chastity Belt command channel&lt;br /&gt;
|-&lt;br /&gt;
|| 63&lt;br /&gt;
|| {{User|FlipperPA Peregrine}}&lt;br /&gt;
|| FlipTitle and &amp;quot;Flip mod&amp;quot; Franimation commands&lt;br /&gt;
|-&lt;br /&gt;
|| 66&lt;br /&gt;
|| Travis Lambert&lt;br /&gt;
|| BanLink default chat command channel&lt;br /&gt;
|-&lt;br /&gt;
|| 66&lt;br /&gt;
|| {{User|Henri Beauchamp}}&lt;br /&gt;
|| Cool Diaper command channel&lt;br /&gt;
|-&lt;br /&gt;
|| 66&lt;br /&gt;
|| {{User|Corvan Nansen}}&lt;br /&gt;
|| Chat Enhancer. In Character emotes.&lt;br /&gt;
|-&lt;br /&gt;
|| 69&lt;br /&gt;
|| {{User|Henri Beauchamp}}&lt;br /&gt;
|| Cool Penis &amp;amp; Cool Pussy command channel&lt;br /&gt;
|-&lt;br /&gt;
|| 77&lt;br /&gt;
|| {{User|Marine Kelley}}&lt;br /&gt;
|| Real Restraints and similar BDSM equipment&lt;br /&gt;
|-&lt;br /&gt;
|| 77&lt;br /&gt;
|| Xarrk Dagger&lt;br /&gt;
|| KAIIA Systems devices default chat command channel&lt;br /&gt;
|-&lt;br /&gt;
|| 77&lt;br /&gt;
|| Mars Tamale&lt;br /&gt;
|| Mars Ring&lt;br /&gt;
|-&lt;br /&gt;
|| 88&lt;br /&gt;
|| Cadroe Murphy&lt;br /&gt;
|| Used by ShapeGen and other building tools&lt;br /&gt;
|-&lt;br /&gt;
|| 88&lt;br /&gt;
|| {{User|Corvan Nansen}}&lt;br /&gt;
|| Chat Enhancer. Narration channel.&lt;br /&gt;
|-&lt;br /&gt;
|| 88&lt;br /&gt;
|| {{User|Sharie Criss}}&lt;br /&gt;
|| Owners plugin for Marine Kelley&#039;s Real Restraint equipment. Chat command channel.&lt;br /&gt;
|-&lt;br /&gt;
|| 99&lt;br /&gt;
|| unknown&lt;br /&gt;
|| Dance Bracelets&lt;br /&gt;
|-&lt;br /&gt;
|| 100&lt;br /&gt;
|| {{User|Mo Noel}}&lt;br /&gt;
|| Channel used to ask the user for chat line entries from within usual dialog sessions&lt;br /&gt;
|-&lt;br /&gt;
|| 100-999 (Randomly chosen periodically)&lt;br /&gt;
|| {{User|Corvan Nansen}}&lt;br /&gt;
|| Ultimate Titler. Title setting channel.&lt;br /&gt;
|-&lt;br /&gt;
|| 777&lt;br /&gt;
|| Hank Ramos&lt;br /&gt;
|| [[Universal Translator]]: channel to allow users to open a dialog-box using a chat command on channel #777.  Only accepted command on this channel is &amp;quot;translator&amp;quot; and all other chat is ignored.  Allows user to silently bring up dialog by hiding command as &amp;quot;/777 translator&amp;quot;.&lt;br /&gt;
|-&lt;br /&gt;
|| 888&lt;br /&gt;
|| Xarrk Dagger&lt;br /&gt;
|| KAIIA Systems device identification channel&lt;br /&gt;
|-&lt;br /&gt;
|| 2776&lt;br /&gt;
|| Tdub Dowler, Riden Blaisdale&lt;br /&gt;
|| Used for transmitting a csv list of keys for use in sim wide radars&lt;br /&gt;
|-&lt;br /&gt;
|| 4123 - 4130&lt;br /&gt;
|| {{User|Lastro Greenwood}}&lt;br /&gt;
|| Used by the Life Support System&lt;br /&gt;
|-&lt;br /&gt;
|| 9001, 908070&lt;br /&gt;
|| Mystical Cookie&lt;br /&gt;
|| MystiTool gesture commands, patch installers&lt;br /&gt;
|-&lt;br /&gt;
||10748, -10748&lt;br /&gt;
|| Lee Ponzu&lt;br /&gt;
|| Commonly used in scripts by Ponzu&lt;br /&gt;
|-&lt;br /&gt;
|| 31984&lt;br /&gt;
|| {{User|Coraa Prior}}&lt;br /&gt;
|| ACME interface (combat system)&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Known negative chat channels==&lt;br /&gt;
{| {{Prettytable}}&lt;br /&gt;
|-&lt;br /&gt;
|{{Hl2}}| &#039;&#039;&#039;Channel&#039;&#039;&#039;&lt;br /&gt;
|{{Hl2}}| &#039;&#039;&#039;Creator&#039;&#039;&#039;&lt;br /&gt;
|{{Hl2}}| &#039;&#039;&#039;Description&#039;&#039;&#039;&lt;br /&gt;
|{{Hl2}}| &#039;&#039;&#039;Messages&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|| -666 &lt;br /&gt;
|| {{User|Dimentox Travanti}}&lt;br /&gt;
|| [[DCS]]: Unit to Hud Status Update Channel&lt;br /&gt;
|-&lt;br /&gt;
||-786&lt;br /&gt;
||{{User|Sly}}&lt;br /&gt;
||Sly&#039;s Modified Gear Communications Channel&lt;br /&gt;
|-&lt;br /&gt;
||-8888&lt;br /&gt;
||{{User|Kyrah Abattoir}}&lt;br /&gt;
||LockMeister Communications Channel&lt;br /&gt;
|-&lt;br /&gt;
||-9119&lt;br /&gt;
||Lillani Lowell&lt;br /&gt;
||LockGuard Communications Channel&lt;br /&gt;
|-&lt;br /&gt;
|| -10xxx&lt;br /&gt;
|| {{User|Ayelin Ethaniel}}&lt;br /&gt;
|| Communication channel of ::Wild Pets:: systems. Commonly generated automatically between -10000 -10999.&lt;br /&gt;
|-&lt;br /&gt;
||-30000,-30001&lt;br /&gt;
||{{User|Corvan Nansen}}&lt;br /&gt;
||Update station broadcast and coordination channels&lt;br /&gt;
|-&lt;br /&gt;
||-248177&lt;br /&gt;
||{{User|Corvan Nansen}}&lt;br /&gt;
||Bane Custodian communications. Used by the Custodian to communicate with the Bane Hood.&lt;br /&gt;
|-&lt;br /&gt;
||-426956&lt;br /&gt;
||{{User|Ganymede Ceriaptrix}}&lt;br /&gt;
|| Ganymedia Open Metaverse Application Internetworking Protocol (OpenMAIP): Broadcast Communications Channel (&amp;lt;code&amp;gt;MAIP_BROADCAST&amp;lt;/code&amp;gt;). Used for public OpenMAIP service discovery queries. Region-wide. See the [[LSL Protocol/Ganymedia OpenMAIP v1.0 Specification|Ganymedia OpenMAIP v1.0 Specification]] for further information.&lt;br /&gt;
|-&lt;br /&gt;
||-504xxx&lt;br /&gt;
||Gal Canning&lt;br /&gt;
||only whispered inter-prim communication&lt;br /&gt;
|-&lt;br /&gt;
||-888888&lt;br /&gt;
||{{User|Henri Beauchamp}}&lt;br /&gt;
||Cool Hud communications channel&lt;br /&gt;
|-&lt;br /&gt;
||-1xxxxxx&lt;br /&gt;
||{{User|Corvan Nansen}}&lt;br /&gt;
||Update management channel for coordination between items to be updated and an update orb. Randomly chosen and temporary.&lt;br /&gt;
|-&lt;br /&gt;
||-2766532&lt;br /&gt;
||Hank Ramos&lt;br /&gt;
||[[Universal Translator]]: &amp;quot;back-channel&amp;quot; for inter-translator communications.  This is an encrypted channel that passes translation and command-control messages between translators that are linked together to spread the translation load and HTTP communications.&lt;br /&gt;
|-&lt;br /&gt;
||-828983023&lt;br /&gt;
||{{User|Very Keynes}}&lt;br /&gt;
||VK-NET Public Channel for Inter Network Communication and Local Network Address Acquisition.&lt;br /&gt;
|-&lt;br /&gt;
||-1812221819&lt;br /&gt;
||{{User|Marine Kelley}}&lt;br /&gt;
||RestrainedLove relay communications channel&lt;br /&gt;
|-&lt;br /&gt;
||-1192zzzxxx&lt;br /&gt;
||{{User|Asbrandt Resident}}&lt;br /&gt;
||Internal Comms range for all projects : Z = Integer Project ID - Use of X range varies : All Comms are Headered with the Project ID : Some further info on User Page.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Darling Brody</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Aditi/ThouMustNotFail&amp;diff=772962</id>
		<title>Aditi/ThouMustNotFail</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Aditi/ThouMustNotFail&amp;diff=772962"/>
		<updated>2010-02-26T05:22:44Z</updated>

		<summary type="html">&lt;p&gt;Darling Brody: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;= Thou Must Not Fail =&lt;br /&gt;
== Synopsis ==&lt;br /&gt;
This is a list of the most critical resident created objects used in Second Life that need to always work. &lt;br /&gt;
&lt;br /&gt;
== The Reasoning == &lt;br /&gt;
Second Life is very complex. There are an infinite number of ways to do things in Second Life. These methods may be right or wrong. These methods may exploit bugs or logic holes. While testing upcoming server releases it just isn&#039;t possible to test everything resident created. QA will test changed features and make sure they work as expected. Oftentimes there are edge cases that fail without QA&#039;s knowledge. This list is a list of really important items that should always work. We will test these objects early on in the QA process and use it as a sort of canary in the coal mine test.&lt;br /&gt;
&lt;br /&gt;
= Vendors =&lt;br /&gt;
* Hippo technologies products (hippo rent and hippo vend)&lt;br /&gt;
* XStreet SL Server Objects&lt;br /&gt;
* Metalife related vendors and servers objects.&lt;br /&gt;
* Quantum Products Vending and Rack Servers &lt;br /&gt;
&lt;br /&gt;
= Land Management Tools =&lt;br /&gt;
* objects which ban/kick users &lt;br /&gt;
* automated parcel rental systems&lt;br /&gt;
&lt;br /&gt;
= Physics =&lt;br /&gt;
* Posjump things&lt;br /&gt;
* Flight Feathers&lt;br /&gt;
* WarpPos. https://wiki.secondlife.com/wiki/WarpPos &lt;br /&gt;
* Dynamic avatar sit target. (llSetLinkPrimitiveParams(llGetNumberOfPrims(), [PRIM_POSITION, &amp;lt;50, 0,0&amp;gt;]);)&lt;br /&gt;
* Regular 300m sit target. llSitTarget(&amp;lt;300,300,300&amp;gt;,ZERO_ROTATION);&lt;br /&gt;
&lt;br /&gt;
= Web =&lt;br /&gt;
* Transaction History Page (used by vendors to validate payments)&lt;br /&gt;
&lt;br /&gt;
= Viewer =&lt;br /&gt;
* Alpha on HUDs to render the same as in world (broken by 1.23 VWR-13151) &lt;br /&gt;
* Content to render the same between viewer versions. eg: 1.x and 2.0&lt;br /&gt;
&lt;br /&gt;
= DEBUG =&lt;br /&gt;
* Debug Channel number and data sent to remain consistant (used for auto script repair)&lt;/div&gt;</summary>
		<author><name>Darling Brody</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlSetLinkPrimitiveParams&amp;diff=155803</id>
		<title>LlSetLinkPrimitiveParams</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlSetLinkPrimitiveParams&amp;diff=155803"/>
		<updated>2008-11-27T12:24:25Z</updated>

		<summary type="html">&lt;p&gt;Darling Brody: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Function/link|linknumber}}{{LSL Function&lt;br /&gt;
|func_id=328|func_sleep=0.2|func_energy=10.0&lt;br /&gt;
|func=llSetLinkPrimitiveParams|sort=SetLinkPrimitiveParams&lt;br /&gt;
|p1_type=integer|p1_name=linknumber&lt;br /&gt;
|p2_type=list|p2_name=rules&lt;br /&gt;
|func_desc=Set primitive parameters for &#039;&#039;&#039;linknumber&#039;&#039;&#039; based on &#039;&#039;&#039;rules&#039;&#039;&#039;.&lt;br /&gt;
|spec&lt;br /&gt;
|caveats=*Applying an operation to [[LINK_SET]] is applied first to the root prim, then to each child prim.&lt;br /&gt;
*The sim will clamp attributes before storing them.&lt;br /&gt;
*The client will clamp attributes before rendering.&lt;br /&gt;
*There is currently no corresponding [[llGetLinkPrimitiveParams]].&lt;br /&gt;
**The only way to get many parameters from linked prims is to put a separate script in each child and use [[llMessageLinked|linked messages]].&lt;br /&gt;
|constants={{LSL Constants/PrimitiveParams|set|remote=true}}&lt;br /&gt;
|examples = &lt;br /&gt;
A simple script to light up a prim in a [[linkset]] when touched, and unlight the others using llSetLinkPrimitiveParams, when script is installed in the root prim of the linkset.&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        // Turn off all prims&lt;br /&gt;
        llSetLinkPrimitiveParams(LINK_SET,[PRIM_FULLBRIGHT,ALL_SIDES,FALSE]);&lt;br /&gt;
        // Turn on the one that was touched&lt;br /&gt;
        llSetLinkPrimitiveParams(llDetectedLinkNumber(0),[PRIM_FULLBRIGHT,ALL_SIDES,TRUE]);        &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
|helpers&lt;br /&gt;
|also_functions=&lt;br /&gt;
{{LSL DefineRow||[[llSetPrimitiveParams]]|Set many primitive parameters}}&lt;br /&gt;
{{LSL DefineRow||[[llGetPrimitiveParams]]|Get many primitive parameters}}&lt;br /&gt;
{{LSL DefineRow||[[llSetLinkAlpha]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llSetLinkColor]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llSetLinkTexture]]|}}&lt;br /&gt;
|also_tests&lt;br /&gt;
|also_events&lt;br /&gt;
|also_articles&lt;br /&gt;
|notes=&lt;br /&gt;
Note that avatars sitting on the object can be moved with this function as well. See [[llSitTarget#Useful_Snippets]] for an example of this.&lt;br /&gt;
&lt;br /&gt;
The Mis-feature of using this function to move avatars 54 meters is now officialy supported according to Andrew Linden (see jira Link http://jira.secondlife.com/browse/SVC-3408?focusedCommentId=88574#action_88574 )&lt;br /&gt;
&lt;br /&gt;
The below example moves avatar to x,y,z without moving the prim they are sitting on.  If x,y,z is more than 54 meters away the function will silently fail. Remember x,y,z is in object ralative coordinates just like any other linked prim in a set.&lt;br /&gt;
&lt;br /&gt;
Agents are always the last prim in the set, so using llGetNumberOfPrims() for a single agent sitting on a vehicle is usefull.&lt;br /&gt;
&lt;br /&gt;
Example Code : llSetLinkPrimitiveParams(llGetNumberOfPrims(), [PRIM_POSITION, &amp;lt;x,y,z&amp;gt;]); &lt;br /&gt;
&lt;br /&gt;
Darling Brody (27/11/2008)&lt;br /&gt;
&lt;br /&gt;
|cat1=Prim&lt;br /&gt;
|cat2=Movement&lt;br /&gt;
|cat3=Status&lt;br /&gt;
|cat4=Texture&lt;br /&gt;
|cat5=Object&lt;br /&gt;
|cat6=Teleport&lt;br /&gt;
|cat7=Link/Set&lt;br /&gt;
|cat8&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Darling Brody</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Name2Key_in_LSL&amp;diff=89701</id>
		<title>Name2Key in LSL</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Name2Key_in_LSL&amp;diff=89701"/>
		<updated>2008-09-05T03:14:01Z</updated>

		<summary type="html">&lt;p&gt;Darling Brody: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
&lt;br /&gt;
Still missing Name2Key functions in your code ? Still relying on external databases that are not always up to date with latests SL subscribers ? &lt;br /&gt;
&lt;br /&gt;
Well now you can solve this by yourself, within your LSL script ! All you have to do is to rely on LL Search engine ! &lt;br /&gt;
&lt;br /&gt;
I put a kind of &amp;quot;library&amp;quot; and a sample of usage for your convenience&lt;br /&gt;
&lt;br /&gt;
Library:&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
integer SERVICE_NAME2KEY =	 19790;&lt;br /&gt;
integer SERVICE_NAME2KEY_RET=19791;&lt;br /&gt;
key     ONE_KEY =            &amp;quot;FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
integer gCurrentRequest=0;&lt;br /&gt;
key     gReqId=NULL_KEY;&lt;br /&gt;
string  gToSearch=&amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
ReturnService(integer Status, string message)&lt;br /&gt;
{&lt;br /&gt;
	key Key;&lt;br /&gt;
&lt;br /&gt;
	if (Status)&lt;br /&gt;
		Key=ONE_KEY;&lt;br /&gt;
	else&lt;br /&gt;
		Key=NULL_KEY;&lt;br /&gt;
&lt;br /&gt;
	llMessageLinked(LINK_THIS, gCurrentRequest+1, message, Key);&lt;br /&gt;
	&lt;br /&gt;
	gCurrentRequest=0;&lt;br /&gt;
	gReqId=NULL_KEY;&lt;br /&gt;
	gToSearch=&amp;quot;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
SvcName2Key(string message)&lt;br /&gt;
{&lt;br /&gt;
	if (gCurrentRequest) {&lt;br /&gt;
		ReturnService(FALSE, &amp;quot;BUSY&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	gCurrentRequest=SERVICE_NAME2KEY;&lt;br /&gt;
	string url=&amp;quot;http://secondlife.com/app/search/search?s=Resident&amp;amp;q=&amp;quot;+llEscapeURL(message);&lt;br /&gt;
	gToSearch=&amp;quot;secondlife:///app/agent/&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
	gReqId=llHTTPRequest(url, [HTTP_METHOD,&amp;quot;GET&amp;quot;], &amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
	link_message(integer sender_number, integer number, string message, key id)&lt;br /&gt;
	{&lt;br /&gt;
		if (number==SERVICE_NAME2KEY) {&lt;br /&gt;
			SvcName2Key(message); &lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	http_response(key request_id, integer status, list metadata, string body)&lt;br /&gt;
	{&lt;br /&gt;
		if (request_id==gReqId) {&lt;br /&gt;
			integer Pos1=llSubStringIndex(body, gToSearch);&lt;br /&gt;
			integer Pos2=0;&lt;br /&gt;
			string  Ret=&amp;quot;&amp;quot;;&lt;br /&gt;
			if (Pos1!=-1) {&lt;br /&gt;
				body=llGetSubString(body, Pos1+llStringLength(gToSearch), -1);	&lt;br /&gt;
				if (gCurrentRequest==SERVICE_NAME2KEY) {&lt;br /&gt;
					Pos2=llStringLength((string)NULL_KEY);&lt;br /&gt;
					string Dat=llGetSubString(body, 0, Pos2-1);&lt;br /&gt;
					if (llStringLength((string)((key)Dat))==llStringLength(NULL_KEY)) {&lt;br /&gt;
						// Success !&lt;br /&gt;
						Ret=llGetSubString(body, 0, Pos2-1);&lt;br /&gt;
						ReturnService(TRUE, Ret);&lt;br /&gt;
					}&lt;br /&gt;
					else&lt;br /&gt;
						ReturnService(FALSE, &amp;quot;UNKNOWN&amp;quot;);&lt;br /&gt;
				}&lt;br /&gt;
				else&lt;br /&gt;
					ReturnService(FALSE, &amp;quot;UNKNOWN SERVICE&amp;quot;);&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
				ReturnService(FALSE, &amp;quot;UNKNOWN&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
		&lt;br /&gt;
	}	&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Usage sample:&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
integer SERVICE_NAME2KEY =	 19790;&lt;br /&gt;
integer SERVICE_NAME2KEY_RET=19791;&lt;br /&gt;
key     ONE_KEY =            &amp;quot;FFFFFFFF-FFFF-FFFF-FFFF-FFFFFFFFFFFF&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
MyName2Key(string message)&lt;br /&gt;
{&lt;br /&gt;
	llMessageLinked(LINK_THIS, SERVICE_NAME2KEY, message, NULL_KEY);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
	touch_start(integer total_number)&lt;br /&gt;
	{&lt;br /&gt;
		llOwnerSay(&amp;quot;Searching key for avatar named Secret2 Linden&amp;quot;);&lt;br /&gt;
		MyName2Key(&amp;quot;Secret2 Linden&amp;quot;);&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	link_message(integer sender_number, integer number, string message, key id)&lt;br /&gt;
	{&lt;br /&gt;
		if (number==SERVICE_NAME2KEY_RET)&lt;br /&gt;
		{&lt;br /&gt;
			if (id==ONE_KEY)&lt;br /&gt;
				llOwnerSay(&amp;quot;Found ! Key is: &amp;quot;+message);&lt;br /&gt;
			else&lt;br /&gt;
				llOwnerSay(&amp;quot;Error: &amp;quot;+message);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
Hope this helps !&lt;br /&gt;
[[User:Maeva Anatine|Maeva Anatine]]&lt;br /&gt;
&lt;br /&gt;
EDIT : Looks like the Lindens have either broken or blocked this function. It works from my browser, however from LSL I get an error page containing this message &amp;quot;Access control configuration prevents your request from&lt;br /&gt;
being allowed at this time.  Please contact your service provider if&lt;br /&gt;
you feel this is incorrect.&amp;quot; - Darling Brody.&lt;br /&gt;
&lt;br /&gt;
{{LSLC|Library}}&lt;/div&gt;</summary>
		<author><name>Darling Brody</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Jana_Kamachi/Detect&amp;diff=59781</id>
		<title>User:Jana Kamachi/Detect</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Jana_Kamachi/Detect&amp;diff=59781"/>
		<updated>2008-03-22T11:13:30Z</updated>

		<summary type="html">&lt;p&gt;Darling Brody: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Jana}}&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
list dtc = [];&lt;br /&gt;
list darl = [];&lt;br /&gt;
&lt;br /&gt;
integer darl_d = FALSE;&lt;br /&gt;
integer cnt = 0;&lt;br /&gt;
&lt;br /&gt;
vector lastpos;&lt;br /&gt;
vector curpos;&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSensorRepeat(&amp;quot;&amp;quot;, &amp;quot;&amp;quot;, SCRIPTED, 1.0, PI, 0.001);   &lt;br /&gt;
        llSetTimerEvent(0.001);&lt;br /&gt;
        lastpos = llGetPos();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    sensor(integer n_m){&lt;br /&gt;
        integer i=0;&lt;br /&gt;
        dtc = [];&lt;br /&gt;
        if(n_m &amp;gt; 2) n_m = 2;//no need for a jump;&lt;br /&gt;
        for(; i&amp;lt;n_m; ++i) {&lt;br /&gt;
            dtc += (llDetectedName(1) + &amp;quot; owned by &amp;quot; + llKey2Name(llDetectedOwner(1)));&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    timer(){&lt;br /&gt;
        if(llVecDist(lastpos, curpos = llGetPos()) &amp;gt; 1000){&lt;br /&gt;
            llOwnerSay(&amp;quot;Orbit Detect.&amp;quot;);&lt;br /&gt;
            llOwnerSay(&amp;quot;Possible Orbiters\n&amp;quot; + llDumpList2String(dtc,&amp;quot;\n&amp;quot;));  &lt;br /&gt;
            cnt = 0;&lt;br /&gt;
            lastpos = curpos; &lt;br /&gt;
        }else if(500 &amp;lt; ++cnt){//will force update lastpos about every 25 to 50 seconds.&lt;br /&gt;
            cnt = 0;&lt;br /&gt;
            lastpos = curpos;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Darling Brody</name></author>
	</entry>
</feed>