<?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=Randur+Source</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=Randur+Source"/>
	<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/wiki/Special:Contributions/Randur_Source"/>
	<updated>2026-07-28T03:49:58Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlGetNotecardLine&amp;diff=933672</id>
		<title>LlGetNotecardLine</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlGetNotecardLine&amp;diff=933672"/>
		<updated>2010-05-31T21:33:57Z</updated>

		<summary type="html">&lt;p&gt;Randur Source: Code sample snippet to read multiple notecards in sequence&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function/negative_index|false|line}}{{LSL_Function/notecard|name|uuid=true}}{{LSL_Function&lt;br /&gt;
|func_id=217|func_sleep=0.1|func_energy=10.0&lt;br /&gt;
|sort=GetNotecardLine&lt;br /&gt;
|func=llGetNotecardLine&lt;br /&gt;
|return_type=key&lt;br /&gt;
|p1_type=string|p1_name=name&lt;br /&gt;
|p2_type=integer|p2_name=line|p2_desc=Line number in a notecard (the index starts at zero).&lt;br /&gt;
|func_desc=Requests the line &#039;&#039;&#039;line&#039;&#039;&#039; of the notecard &#039;&#039;&#039;name&#039;&#039;&#039; from the dataserver.&lt;br /&gt;
|return_text=that is the handle for a [[dataserver]] event response.&lt;br /&gt;
|func_footnote=If &#039;&#039;&#039;line&#039;&#039;&#039; is past the end of the notecard [[EOF]] is returned by the [[dataserver]].&lt;br /&gt;
|spec&lt;br /&gt;
|caveats=* If notecard contains embedded inventory items (such as textures and landmarks), [[EOF]] will be returned, regardless of the line requested.&lt;br /&gt;
*If the requested line is longer then 255 bytes the [[dataserver]] will return the first 255 bytes of the line.&lt;br /&gt;
|constants&lt;br /&gt;
|examples=&amp;lt;lsl&amp;gt;&lt;br /&gt;
key kQuery;&lt;br /&gt;
integer iLine = 0;&lt;br /&gt;
default {&lt;br /&gt;
    &lt;br /&gt;
    state_entry() {&lt;br /&gt;
        llSay(0, &amp;quot;Reading notecard...&amp;quot;);&lt;br /&gt;
        kQuery = llGetNotecardLine(&amp;quot;My Notecard&amp;quot;, iLine);   // read in &amp;quot;My Notecard&amp;quot; when you can&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    dataserver(key query_id, string data) {&lt;br /&gt;
&lt;br /&gt;
        if (query_id == kQuery) {    // were we called to work on &amp;quot;My Notecard&amp;quot;?&lt;br /&gt;
            // this is a line of our notecard&lt;br /&gt;
            if (data == EOF) {    &lt;br /&gt;
&lt;br /&gt;
                llSay(0, &amp;quot;No more lines in notecard, read &amp;quot; + (string)iLine + &amp;quot; lines.&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            } else {&lt;br /&gt;
                &lt;br /&gt;
                llSay(0, &amp;quot;Line &amp;quot; + (string)iLine + &amp;quot;: &amp;quot; + data);   // data has the current line from this notecard&lt;br /&gt;
                &lt;br /&gt;
                //request next line&lt;br /&gt;
                iLine++;   // increment line count&lt;br /&gt;
                kQuery = llGetNotecardLine(&amp;quot;My Notecard&amp;quot;, iLine);   // read another line when you can&lt;br /&gt;
&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
|helpers=&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
/////&lt;br /&gt;
//  Generic Multi Notecard reader by Brangus Weir&lt;br /&gt;
//  Given freely and published on wiki.secondlife.com&lt;br /&gt;
//&lt;br /&gt;
//  This script will read three note cards and store the results into three lists.&lt;br /&gt;
//  It can be modified and extended to as many (or few) cards as you&#039;d like to read. &lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
list gOneCard;    // All the lines from from the first card&lt;br /&gt;
list gTwoCard;    // All the lines from from the second card&lt;br /&gt;
list gThreeCard;  // All the lines from from the third card&lt;br /&gt;
&lt;br /&gt;
string gsCardOneName = &amp;quot;One&amp;quot;;  //Set these to the name of the invetory item.&lt;br /&gt;
string gsCardTwoName = &amp;quot;Two&amp;quot;;&lt;br /&gt;
string gsCardThreeName = &amp;quot;Three&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
//Temporary variables for processing&lt;br /&gt;
string g_sNoteCardName; // Name of the card to be read.&lt;br /&gt;
list g_lTempLines;      // The resulting data pushed into a list&lt;br /&gt;
integer g_iLine;        // The line count for the card reader&lt;br /&gt;
key g_kQuery;           // The key of the card being read&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
initialize(string _action) {&lt;br /&gt;
    // Due to the execution order when using dataserver, this function sets the first card to &lt;br /&gt;
    // be read, and the excetuion finishes when called again with the _action set to &amp;quot;finish&amp;quot;.&lt;br /&gt;
    if (_action == &amp;quot;&amp;quot;) {&lt;br /&gt;
        loadNoteCard(gsCardOneName);&lt;br /&gt;
    } else if (_action == &amp;quot;finish&amp;quot;) {&lt;br /&gt;
        // All cards have been read into the lists... now you can do any kind of string&lt;br /&gt;
        // manipulations to get the data you need to set your script.&lt;br /&gt;
        // But here we will prove that the cards have been read with a loop&lt;br /&gt;
&lt;br /&gt;
        g_lTempLines = []; // lets not forget to delete this global, or it will be dead weight.&lt;br /&gt;
&lt;br /&gt;
        integer len = llGetListLength(gOneCard);  //Always evaluate this once, don&#039;t do it&lt;br /&gt;
                                                  //INSIDE the for loop like noob programers will.&lt;br /&gt;
                                                  //Reduce lag, THINK ABOUT MACHINE CYCLES!&lt;br /&gt;
        integer i = 0;&lt;br /&gt;
        for (; i&amp;lt; len; ++i)&lt;br /&gt;
            llSay(0, llList2String(gOneCard,i));&lt;br /&gt;
&lt;br /&gt;
        len = llGetListLength(gTwoCard);&lt;br /&gt;
        for (i = 0; i&amp;lt; len; ++i)&lt;br /&gt;
            llSay(0, llList2String(gTwoCard,i));&lt;br /&gt;
&lt;br /&gt;
        len = llGetListLength(gThreeCard);&lt;br /&gt;
        for (i = 0; i&amp;lt; len; ++i)&lt;br /&gt;
            llSay(0, llList2String(gThreeCard,i));&lt;br /&gt;
    }                &lt;br /&gt;
                              &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
loadNoteCard( string _notecard ) {&lt;br /&gt;
    g_lTempLines = []; //clear the temp lines&lt;br /&gt;
    g_sNoteCardName = _notecard;&lt;br /&gt;
    g_iLine = 0;&lt;br /&gt;
    g_kQuery = llGetNotecardLine(g_sNoteCardName, g_iLine);  &lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
notecardFinished(string _notecard){&lt;br /&gt;
    // Called at the end of each notecard as it is read. The temp results are stored&lt;br /&gt;
    // and the next card is commanded to be read.&lt;br /&gt;
    if (_notecard == gsCardOneName) {&lt;br /&gt;
        gOneCard = g_lTempLines;&lt;br /&gt;
        loadNoteCard(gsCardTwoName);&lt;br /&gt;
    } else if (_notecard == gsCardTwoName) {&lt;br /&gt;
        gTwoCard = g_lTempLines;&lt;br /&gt;
        loadNoteCard(gsCardThreeName);&lt;br /&gt;
    } else if (_notecard == gsCardThreeName) {&lt;br /&gt;
        gThreeCard = g_lTempLines;&lt;br /&gt;
        initialize(&amp;quot;finish&amp;quot;);  // Finally pass execution to finish the initialization.   &lt;br /&gt;
    }    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    touch_start(integer _num_det){&lt;br /&gt;
        initialize(&amp;quot;&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
     &lt;br /&gt;
    dataserver(key _query_id, string _data) &lt;br /&gt;
    {&lt;br /&gt;
        if (_query_id == g_kQuery) {&lt;br /&gt;
            // this is a line of our notecard&lt;br /&gt;
            if (_data != EOF) {    &lt;br /&gt;
                g_lTempLines += _data;&lt;br /&gt;
                //request a next line&lt;br /&gt;
                ++g_iLine;   // increment line count&lt;br /&gt;
                g_kQuery = llGetNotecardLine(g_sNoteCardName, g_iLine);&lt;br /&gt;
            } else {&lt;br /&gt;
                //The notecard has been read &lt;br /&gt;
                //notify end of read&lt;br /&gt;
                notecardFinished(g_sNoteCardName);&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;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
/////&lt;br /&gt;
//  Generic Multi Notecard reader by Randur Source&lt;br /&gt;
//  Given freely and published on wiki.secondlife.com&lt;br /&gt;
//&lt;br /&gt;
//  This script will read all note cards in sequence and dump the results into chat as an example.&lt;br /&gt;
//  It can be modified and extended to do other things to the data. &lt;br /&gt;
//&lt;br /&gt;
&lt;br /&gt;
integer inventorycnt;&lt;br /&gt;
integer notecardlinecnt;&lt;br /&gt;
integer notecardlinenumber;&lt;br /&gt;
string notecardname;&lt;br /&gt;
key linenumberid;&lt;br /&gt;
key lineid;&lt;br /&gt;
&lt;br /&gt;
getnextnotecardlinenumber()&lt;br /&gt;
{&lt;br /&gt;
    // first get the number of lines from the notecard&lt;br /&gt;
    inventorycnt++;&lt;br /&gt;
    if (inventorycnt &amp;lt; llGetInventoryNumber(INVENTORY_NOTECARD))&lt;br /&gt;
    {&lt;br /&gt;
        notecardname = llGetInventoryName(INVENTORY_NOTECARD,inventorycnt);&lt;br /&gt;
        linenumberid = llGetNumberOfNotecardLines(notecardname);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
        llOwnerSay(&amp;quot;Done.&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
getnextnotecardline()&lt;br /&gt;
{&lt;br /&gt;
     // get the next line from the notecard or skip to the next notecard&lt;br /&gt;
    notecardlinecnt++;&lt;br /&gt;
    if (notecardlinecnt &amp;lt; notecardlinenumber)&lt;br /&gt;
        lineid = llGetNotecardLine(notecardname,notecardlinecnt);&lt;br /&gt;
    else&lt;br /&gt;
        getnextnotecardlinenumber();&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;
        if (llDetectedKey(0) != llGetOwner()) return; // allow owner only&lt;br /&gt;
&lt;br /&gt;
        inventorycnt = -1;&lt;br /&gt;
        getnextnotecardlinenumber();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    dataserver(key queryid,string data)&lt;br /&gt;
    {&lt;br /&gt;
        if (queryid == linenumberid) // this was a line number lookup&lt;br /&gt;
        {&lt;br /&gt;
            linenumberid = NULL_KEY;&lt;br /&gt;
            notecardlinenumber = (integer)data;&lt;br /&gt;
            if (notecardlinenumber == 0)&lt;br /&gt;
                getnextnotecardlinenumber();&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                notecardlinecnt = -1;&lt;br /&gt;
                getnextnotecardline();&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else if (queryid == lineid) // this was a data line lookup&lt;br /&gt;
        {&lt;br /&gt;
            lineid = NULL_KEY;&lt;br /&gt;
&lt;br /&gt;
            // Example of what to do with the data:&lt;br /&gt;
            // Test for valid avatar names, possibly multiple names on each line, separated by ,&lt;br /&gt;
            // and say them in chat to the owner&lt;br /&gt;
            list names = llParseString2List(data,[&amp;quot;,&amp;quot;],[]); // split lines on ,&lt;br /&gt;
            integer len = llGetListLength(names); // I wouldn&#039;t dare to put this inside the for loop&lt;br /&gt;
            integer cnt;&lt;br /&gt;
            for (cnt = 0; cnt &amp;lt; len; cnt++)&lt;br /&gt;
            {&lt;br /&gt;
                string name = llDumpList2String(llParseString2List(llList2String(names,cnt),[&amp;quot; &amp;quot;],[]),&amp;quot; &amp;quot;); // remove extra spaces&lt;br /&gt;
                if (llGetListLength(llParseString2List(name,[&amp;quot; &amp;quot;],[])) == 2) // check for first + lastname&lt;br /&gt;
                    llOwnerSay(notecardname + &amp;quot;: &amp;quot; + name);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            getnextnotecardline();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
|also_functions={{LSL DefineRow||[[llGetNumberOfNotecardLines]]|}}&lt;br /&gt;
|also_events={{LSL DefineRow||[[dataserver]]|}}&lt;br /&gt;
|also_articles&lt;br /&gt;
|also_tests&lt;br /&gt;
|notes=The notecard read can be no modify, or no modify/no copy.&lt;br /&gt;
|permission&lt;br /&gt;
|cat1=Notecard&lt;br /&gt;
|cat2=Dataserver&lt;br /&gt;
|cat3=&lt;br /&gt;
|cat4=&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Randur Source</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlStartAnimation&amp;diff=459723</id>
		<title>LlStartAnimation</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlStartAnimation&amp;diff=459723"/>
		<updated>2009-08-14T12:02:25Z</updated>

		<summary type="html">&lt;p&gt;Randur Source: added sit animate example&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function/permission|PERMISSION_TRIGGER_ANIMATION}}{{LSL_Function/inventory|anim|uuid=false|type}}{{LSL_Function&lt;br /&gt;
|func_id=129|func_sleep=0.0|func_energy=10.0&lt;br /&gt;
|func=llStartAnimation|sort=StartAnimation&lt;br /&gt;
|p1_type=string|p1_name=anim&lt;br /&gt;
|func_footnote&lt;br /&gt;
|func_desc=Start animation &#039;&#039;&#039;anim&#039;&#039;&#039; for agent that granted [[PERMISSION_TRIGGER_ANIMATION]] if the permission has not been revoked.&lt;br /&gt;
|return_text&lt;br /&gt;
|spec&lt;br /&gt;
|caveats=* Prior to 1.25.3 of the server code, an essentially unlimited number of animations could be played at once.  In 1.25.3, a limit of 15 simultaneous animations was imposed; in 1.25.4, that limit was (will be) raised to 30.&lt;br /&gt;
|constants&lt;br /&gt;
|examples=&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    touch_start(integer detected)&lt;br /&gt;
    {&lt;br /&gt;
        llRequestPermissions(llDetectedKey(0), PERMISSION_TRIGGER_ANIMATION);&lt;br /&gt;
    }&lt;br /&gt;
    run_time_permissions(integer perm)&lt;br /&gt;
    {&lt;br /&gt;
        if (perm &amp;amp; PERMISSION_TRIGGER_ANIMATION)&lt;br /&gt;
        {&lt;br /&gt;
            llStartAnimation(&amp;quot;sit&amp;quot;);&lt;br /&gt;
            llOwnerSay(&amp;quot;animation will end in 5 seconds&amp;quot;);&lt;br /&gt;
            llSetTimerEvent(5.0);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        llSetTimerEvent(0.0);&lt;br /&gt;
        llStopAnimation(&amp;quot;sit&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
Add an animation or pose inside the same object as this script:&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
string animation; // the first animation in inventory will automatically be used&lt;br /&gt;
  // the animation name must be stored globally to be able to stop the animation when standing up&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        // set sit target, otherwise this will not work &lt;br /&gt;
        llSitTarget(&amp;lt;0.0, 0.0, 0.1&amp;gt;, ZERO_ROTATION);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    changed(integer change)&lt;br /&gt;
    {&lt;br /&gt;
        if (change &amp;amp; CHANGED_LINK)&lt;br /&gt;
        {&lt;br /&gt;
            key av = llAvatarOnSitTarget();&lt;br /&gt;
            if (av) //evaluated as true if not NULL_KEY or invalid&lt;br /&gt;
                llRequestPermissions(av, PERMISSION_TRIGGER_ANIMATION);&lt;br /&gt;
            else // avatar is standing up&lt;br /&gt;
            {&lt;br /&gt;
                if (animation)&lt;br /&gt;
                    llStopAnimation(animation); // stop the started animation&lt;br /&gt;
                llResetScript(); // release the avatar animation permissions&lt;br /&gt;
            }&lt;br /&gt;
        }&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_TRIGGER_ANIMATION)&lt;br /&gt;
        {&lt;br /&gt;
            animation = llGetInventoryName(INVENTORY_ANIMATION,0); // get the first animation from inventory&lt;br /&gt;
            if (animation)&lt;br /&gt;
            {&lt;br /&gt;
                llStopAnimation(&amp;quot;sit&amp;quot;); // stop the default sit animation&lt;br /&gt;
                llStartAnimation(animation);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
|helpers&lt;br /&gt;
|also_functions={{LSL DefineRow||[[llStopAnimation]]|}}&lt;br /&gt;
|also_tests&lt;br /&gt;
|also_events&lt;br /&gt;
|also_articles={{LSL DefineRow||[[Internal_Animations]]|lists internal Animations always available}}&lt;br /&gt;
|notes&lt;br /&gt;
|cat1=Animation&lt;br /&gt;
|cat2&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Randur Source</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlGetObjectDetails&amp;diff=421442</id>
		<title>LlGetObjectDetails</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlGetObjectDetails&amp;diff=421442"/>
		<updated>2009-07-03T09:26:47Z</updated>

		<summary type="html">&lt;p&gt;Randur Source: Added a script example: Group join inviter&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function/limits}}{{LSL_Function/uuid|id|sim=*}}&lt;br /&gt;
{{LSL_Function&lt;br /&gt;
|func_id=332|func_sleep=0.0|func_energy=10.0&lt;br /&gt;
|func=llGetObjectDetails&lt;br /&gt;
|p1_type=key|p1_name=id&lt;br /&gt;
|p2_type=list|p2_name=params|p2_desc=OBJECT_* flags&lt;br /&gt;
|return_type=list|return_text=of the details specified in &#039;&#039;&#039;params&#039;&#039;&#039; for the object with key &#039;&#039;&#039;id&#039;&#039;&#039;.&lt;br /&gt;
|func_footnote={{LSL Const|OBJECT_UNKNOWN_DETAIL|integer|-1|c=}} is returned when passed an invalid integer parameter.&lt;br /&gt;
|caveats=&lt;br /&gt;
*Items in &#039;&#039;&#039;params&#039;&#039;&#039; that are not integers are silently ignored, {{LSL Const|OBJECT_UNKNOWN_DETAIL|integer|-1|c=}} is not returned.&lt;br /&gt;
*If an object represented by &#039;&#039;&#039;id&#039;&#039;&#039; is not in the sim an empty list is returned. &lt;br /&gt;
*An empty list is also returned if the key given was an item in inventory (object or agent).&lt;br /&gt;
*If &#039;&#039;&#039;id&#039;&#039;&#039; represents an agent, this function will continue to return information for approximately 45 seconds after they have left the sim (but the information is not updated).&lt;br /&gt;
*[[llTargetOmega]] will only effect the return of [[OBJECT_ROT]] if the object is [[STATUS_PHYSICS|physical]]. If the object is not physical then the original start rotation is returned, [[llTargetOmega]] is a {{LSLGC|Effects|client side effect}}.&lt;br /&gt;
|examples=&lt;br /&gt;
&amp;lt;lsl&amp;gt;default&lt;br /&gt;
{&lt;br /&gt;
    collision_start(integer i)&lt;br /&gt;
    {&lt;br /&gt;
        list a = llGetObjectDetails(llDetectedKey(0), ([OBJECT_NAME, &lt;br /&gt;
                    OBJECT_DESC, OBJECT_POS, OBJECT_ROT, OBJECT_VELOCITY,&lt;br /&gt;
                    OBJECT_OWNER, OBJECT_GROUP, OBJECT_CREATOR]));&lt;br /&gt;
        llWhisper(0,&amp;quot;UUID: &amp;quot;         + (string)llDetectedKey(0) +&lt;br /&gt;
                  &amp;quot;\nName: \&amp;quot;&amp;quot;       + llList2String(a,0) + &amp;quot;\&amp;quot;&amp;quot; +&lt;br /&gt;
                  &amp;quot;\nDescription: \&amp;quot;&amp;quot; + llList2String(a,1) + &amp;quot;\&amp;quot;&amp;quot; +&lt;br /&gt;
                  &amp;quot;\nPosition: &amp;quot;     + llList2String(a,2) +&lt;br /&gt;
                  &amp;quot;\nRotation: &amp;quot;     + llList2String(a,3) +&lt;br /&gt;
                  &amp;quot;\nVelocity: &amp;quot;     + llList2String(a,4) +&lt;br /&gt;
                  &amp;quot;\nOwner: &amp;quot;        + llList2String(a,5) +&lt;br /&gt;
                  &amp;quot;\nGroup: &amp;quot;        + llList2String(a,6) +&lt;br /&gt;
                  &amp;quot;\nCreator: &amp;quot;      + llList2String(a,7));&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&amp;lt;lsl&amp;gt;// Group join inviter&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    touch_start(integer num_detected)&lt;br /&gt;
    {&lt;br /&gt;
        llInstantMessage(llDetectedKey(0),&amp;quot;Click on Join in my group profile:\n&amp;quot; +&lt;br /&gt;
            &amp;quot; secondlife:///app/group/&amp;quot; + llList2String(llGetObjectDetails(llGetKey(), [OBJECT_GROUP]), 0) + &amp;quot;/about &amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|spec&lt;br /&gt;
|constants={{LSL Constants/Object Details}}&lt;br /&gt;
|helpers=See {{LSLGC|Link/Get}} for some {{LSLGC|Link|link}} related helper functions. Since there is no function to get linked prim parameters, this can be useful if you need to get the position and rotation of a linked prim.&lt;br /&gt;
|also_functions={{LSL DefineRow||[[llKey2Name]]}}&lt;br /&gt;
{{LSL DefineRow||[[llGetPrimitiveParams]]}}&lt;br /&gt;
{{LSL DefineRow||[[llSetLinkPrimitiveParams]]}}&lt;br /&gt;
{{LSL DefineRow||[[llSetPrimitiveParams]]}}&lt;br /&gt;
{{LSL DefineRow||[[llGetParcelDetails]]}}&lt;br /&gt;
|also_tests&lt;br /&gt;
|also_events&lt;br /&gt;
|also_articles={{LSL DefineRow||{{LSLGC|Detected}}}}&lt;br /&gt;
{{LSL DefineRow||[[Prim Attribute Overloading]]}}&lt;br /&gt;
|notes&lt;br /&gt;
|history=Introduced in SL 1.18.3(2)&lt;br /&gt;
|cat1=Object&lt;br /&gt;
|cat2=Prim&lt;br /&gt;
|cat3=Avatar&lt;br /&gt;
|cat4=Owner&lt;br /&gt;
|cat5=Creator&lt;br /&gt;
|cat6=Group&lt;br /&gt;
|cat7=Link&lt;br /&gt;
|cat8&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Randur Source</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlDialog&amp;diff=421432</id>
		<title>LlDialog</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlDialog&amp;diff=421432"/>
		<updated>2009-07-03T08:49:18Z</updated>

		<summary type="html">&lt;p&gt;Randur Source: Self defined Ignore button will not give a chat result either&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function/avatar|avatar|sim=*}}{{LSL_Function/chat|chat_channel}}{{LSL_Function|sort=Dialog|func_id=247|func_sleep=1.0|func_energy=10.0|func=llDialog&lt;br /&gt;
|p1_type=key|p1_name=avatar|p1_desc&lt;br /&gt;
|p2_type=string|p2_name=message|p2_desc=message to be displayed&lt;br /&gt;
|p3_type=list|p3_name=buttons|p3_desc=button labels&lt;br /&gt;
|p4_type=integer|p4_name=chat_channel|p4_desc&lt;br /&gt;
|func_desc=Shows a blue dialog box in the upper right corner of the &#039;&#039;&#039;avatar&#039;s&#039;&#039;&#039; screen with a &#039;&#039;&#039;message&#039;&#039;&#039; and choice &#039;&#039;&#039;buttons&#039;&#039;&#039;, 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 &#039;&#039;&#039;avatar&#039;&#039;&#039; says the text of the button label on &#039;&#039;&#039;chat_channel&#039;&#039;&#039;.&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;
*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;quot;Ignore&amp;quot; button (no chat is generated as a result of pressing this button).&lt;br /&gt;
*If you create a button yourself with the name &amp;quot;Ignore&amp;quot; (case sensitive) there is also no chat 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;
*If the distance between the root prim of the [[listen]]ing object and the dialog generating prim 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;
&lt;br /&gt;
===&amp;lt;tt&amp;gt;message&amp;lt;/tt&amp;gt; limits===&lt;br /&gt;
*&#039;&#039;&#039;message&#039;&#039;&#039; must be fewer than 512 bytes in length and be not empty. If it is empty, llDialog will shout &amp;quot;llDialog: must supply a message&amp;quot; on the [[DEBUG_CHANNEL]]. If it is greater than or equal to 512 bytes, it shouts (again on the [[DEBUG_CHANNEL|debug channel]]): &amp;quot;llDialog: message too long, must be less than 512 characters&amp;quot;; in both instances, the dialog box will not be created for &#039;&#039;&#039;avatar&#039;&#039;&#039;.&lt;br /&gt;
*The client only displays 8 lines of &#039;&#039;&#039;message&#039;&#039;&#039; if it is longer the dialog has a scroll bar. See [[#Appearance]].&lt;br /&gt;
&lt;br /&gt;
===&amp;lt;tt&amp;gt;buttons&amp;lt;/tt&amp;gt; limits===&lt;br /&gt;
*If &#039;&#039;&#039;buttons&#039;&#039;&#039; is an empty list, it will default to as if it were [&amp;quot;OK&amp;quot;]&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 (in bytes) is zero or greater than 24.&lt;br /&gt;
***In other words, a button&#039;s text cannot be longer than 24 bytes or a empty string.&lt;br /&gt;
*The client will not display all the characters of a button if the text is wider then the text space of the button. See [[#Appearance]].&lt;br /&gt;
|examples=&amp;lt;lsl&amp;gt;integer channel = 1000;&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&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 count)&lt;br /&gt;
    {&lt;br /&gt;
        llDialog(llDetectedKey(0), &amp;quot;This is a test dialog.\n\nPlease 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);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    listen(integer chan, string name, key id, string mes)&lt;br /&gt;
    {&lt;br /&gt;
        if(id == llGetOwnerKey(id))//won&#039;t listen to objects unless they aren&#039;t in the region.&lt;br /&gt;
            llSay(0,name + &amp;quot; (&amp;quot; + (string)llGetObjectDetails(id, (list)OBJECT_POS) + &amp;quot;) chose option &amp;quot; + mes);&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/lsl&amp;gt;&lt;br /&gt;
|helpers=&amp;lt;lsl&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; chose option &amp;quot; + _option);&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/lsl&amp;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;
|helpers&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;lsl&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;/lsl&amp;gt;&lt;br /&gt;
Negative channels are popular for script communications because the client is unable to chat directly on those channels (&amp;quot;/-xxxx message&amp;quot; won&#039;t chat &amp;quot;message&amp;quot; on channel &amp;quot;-xxxx&amp;quot;, it will chat &amp;quot;/-xxxx message&amp;quot; on channel zero). The only way to do so 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;lsl&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;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===Appearance===&lt;br /&gt;
&lt;br /&gt;
If &#039;&#039;&#039;message&#039;&#039;&#039; requires more than 8 lines, a vertical scroll bar will appear in the dialog.&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). 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 number of characters that can be displayed in a button depends upon the width of the characters.&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;
|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;
|issues=&lt;br /&gt;
{{Issue|SVC-1815|llDialog menus can fail when an object is deeded to a group|type=bug}}&lt;br /&gt;
|cat1=Chat&lt;br /&gt;
|cat2=Communications&lt;br /&gt;
|cat3=Dialog&lt;br /&gt;
|cat4}}&lt;/div&gt;</summary>
		<author><name>Randur Source</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Category:LSL_Color&amp;diff=420323</id>
		<title>Category:LSL Color</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Category:LSL_Color&amp;diff=420323"/>
		<updated>2009-07-02T12:33:22Z</updated>

		<summary type="html">&lt;p&gt;Randur Source: fixed typo reasone&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header|ml=*}}&lt;br /&gt;
{{#if:&lt;br /&gt;
&lt;br /&gt;
{{#vardefine:header_title|Color in LSL}}&lt;br /&gt;
{{#vardefine:header_text|LSL has its own special format for color. LSL uses a [[vector]] to store color. Unlike traditional RGB where each channel is 0 -&amp;amp;gt; 255, LSL&#039;s color channels are 0 -&amp;amp;gt; 1.&amp;lt;br/&amp;gt;&lt;br /&gt;
===Format: {{LSL VR|&#039;&#039;&#039;R&#039;&#039;&#039;|&#039;&#039;&#039;G&#039;&#039;&#039;|&#039;&#039;&#039;B&#039;&#039;&#039;}}===&lt;br /&gt;
{{{!}}&lt;br /&gt;
{{LSL DefineRow|float|x|Red value|[0, 1]}}&lt;br /&gt;
{{LSL DefineRow|float|y|Green value|[0, 1]}}&lt;br /&gt;
{{LSL DefineRow|float|z|Blue value|[0, 1]}}&lt;br /&gt;
{{!}}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{#vardefine:helpers|&lt;br /&gt;
===Useful functions for storing/retrieving color and alpha values to/from integers===&lt;br /&gt;
&amp;lt;lsl&amp;gt;integer ColorAlphatoRGBA(vector color, float alpha) {&lt;br /&gt;
	return (((integer)(alpha * 255.0) &amp;amp; 0xFF) &amp;lt;&amp;lt; 24) |&lt;br /&gt;
		(((integer)(color.x * 255.0) &amp;amp; 0xFF) &amp;lt;&amp;lt; 16) |&lt;br /&gt;
		(((integer)(color.y * 255.0) &amp;amp; 0xFF) &amp;lt;&amp;lt; 8) |&lt;br /&gt;
		((integer)(color.z * 255.0) &amp;amp; 0xFF);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
vector RGBAtoColor(integer rgba) {&lt;br /&gt;
	return &amp;lt; (rgba &amp;gt;&amp;gt; 16) &amp;amp; 0xFF, (rgba &amp;gt;&amp;gt; 8) &amp;amp; 0xFF, (rgba &amp;amp; 0xFF) &amp;gt; / 255.0; // for some reason parentheses are needed around the Z part&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float RGBAtoAlpha(integer rgba) {&lt;br /&gt;
	return ((rgba &amp;gt;&amp;gt; 24) &amp;amp; 0xFF) / 255.0;&lt;br /&gt;
}&amp;lt;/lsl&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{#vardefine:examples|&lt;br /&gt;
&amp;lt;lsl&amp;gt;vector white = &amp;lt;1.0, 1.0, 1.0&amp;gt;;&lt;br /&gt;
vector grey = &amp;lt;0.5, 0.5, 0.5&amp;gt;;&lt;br /&gt;
vector black = &amp;lt;0.0, 0.0, 0.0&amp;gt;;&lt;br /&gt;
vector red = &amp;lt;1.0, 0.0, 0.0&amp;gt;;&lt;br /&gt;
vector green = &amp;lt;0.0, 1.0, 0.0&amp;gt;;&lt;br /&gt;
vector blue = &amp;lt;0.0, 0.0, 1.0&amp;gt;;&lt;br /&gt;
vector yellow = &amp;lt;1.0, 1.0, 0.0&amp;gt;;&lt;br /&gt;
vector cyan = &amp;lt;0.0, 1.0, 1.0&amp;gt;;&lt;br /&gt;
vector magenta = &amp;lt;1.0, 0.0, 1.0&amp;gt;;&amp;lt;/lsl&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
}}{{LSL Generic}}{{LSLC|Face|Color}}&lt;br /&gt;
{{LSLC|}}{{LSLC|FixMe}}&lt;/div&gt;</summary>
		<author><name>Randur Source</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Category:LSL_Color&amp;diff=420313</id>
		<title>Category:LSL Color</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Category:LSL_Color&amp;diff=420313"/>
		<updated>2009-07-02T12:32:52Z</updated>

		<summary type="html">&lt;p&gt;Randur Source: parentheses needed are around the Z part of the RGBAtoColor return value&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header|ml=*}}&lt;br /&gt;
{{#if:&lt;br /&gt;
&lt;br /&gt;
{{#vardefine:header_title|Color in LSL}}&lt;br /&gt;
{{#vardefine:header_text|LSL has its own special format for color. LSL uses a [[vector]] to store color. Unlike traditional RGB where each channel is 0 -&amp;amp;gt; 255, LSL&#039;s color channels are 0 -&amp;amp;gt; 1.&amp;lt;br/&amp;gt;&lt;br /&gt;
===Format: {{LSL VR|&#039;&#039;&#039;R&#039;&#039;&#039;|&#039;&#039;&#039;G&#039;&#039;&#039;|&#039;&#039;&#039;B&#039;&#039;&#039;}}===&lt;br /&gt;
{{{!}}&lt;br /&gt;
{{LSL DefineRow|float|x|Red value|[0, 1]}}&lt;br /&gt;
{{LSL DefineRow|float|y|Green value|[0, 1]}}&lt;br /&gt;
{{LSL DefineRow|float|z|Blue value|[0, 1]}}&lt;br /&gt;
{{!}}}&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{#vardefine:helpers|&lt;br /&gt;
===Useful functions for storing/retrieving color and alpha values to/from integers===&lt;br /&gt;
&amp;lt;lsl&amp;gt;integer ColorAlphatoRGBA(vector color, float alpha) {&lt;br /&gt;
	return (((integer)(alpha * 255.0) &amp;amp; 0xFF) &amp;lt;&amp;lt; 24) |&lt;br /&gt;
		(((integer)(color.x * 255.0) &amp;amp; 0xFF) &amp;lt;&amp;lt; 16) |&lt;br /&gt;
		(((integer)(color.y * 255.0) &amp;amp; 0xFF) &amp;lt;&amp;lt; 8) |&lt;br /&gt;
		((integer)(color.z * 255.0) &amp;amp; 0xFF);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
vector RGBAtoColor(integer rgba) {&lt;br /&gt;
	return &amp;lt; (rgba &amp;gt;&amp;gt; 16) &amp;amp; 0xFF, (rgba &amp;gt;&amp;gt; 8) &amp;amp; 0xFF, (rgba &amp;amp; 0xFF) &amp;gt; / 255.0; // for some reasone parentheses are needed around the Z part&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float RGBAtoAlpha(integer rgba) {&lt;br /&gt;
	return ((rgba &amp;gt;&amp;gt; 24) &amp;amp; 0xFF) / 255.0;&lt;br /&gt;
}&amp;lt;/lsl&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{#vardefine:examples|&lt;br /&gt;
&amp;lt;lsl&amp;gt;vector white = &amp;lt;1.0, 1.0, 1.0&amp;gt;;&lt;br /&gt;
vector grey = &amp;lt;0.5, 0.5, 0.5&amp;gt;;&lt;br /&gt;
vector black = &amp;lt;0.0, 0.0, 0.0&amp;gt;;&lt;br /&gt;
vector red = &amp;lt;1.0, 0.0, 0.0&amp;gt;;&lt;br /&gt;
vector green = &amp;lt;0.0, 1.0, 0.0&amp;gt;;&lt;br /&gt;
vector blue = &amp;lt;0.0, 0.0, 1.0&amp;gt;;&lt;br /&gt;
vector yellow = &amp;lt;1.0, 1.0, 0.0&amp;gt;;&lt;br /&gt;
vector cyan = &amp;lt;0.0, 1.0, 1.0&amp;gt;;&lt;br /&gt;
vector magenta = &amp;lt;1.0, 0.0, 1.0&amp;gt;;&amp;lt;/lsl&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
}}{{LSL Generic}}{{LSLC|Face|Color}}&lt;br /&gt;
{{LSLC|}}{{LSLC|FixMe}}&lt;/div&gt;</summary>
		<author><name>Randur Source</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlDie&amp;diff=308902</id>
		<title>LlDie</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlDie&amp;diff=308902"/>
		<updated>2009-04-08T13:37:57Z</updated>

		<summary type="html">&lt;p&gt;Randur Source: Added some handy Q&amp;amp;A from http://lslwiki.net/lslwiki/wakka.php?wakka=lldie&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function&lt;br /&gt;
|func=llDie&lt;br /&gt;
|sort=Die&lt;br /&gt;
|func_id=41|func_sleep=0.0|func_energy=0.0&lt;br /&gt;
|func_footnote=If called in any prim in the {{LSLG|link set}} the result will be the deletion of the entire object.&amp;lt;br/&amp;gt;To remove a single prim from an object use [[llBreakLink]] first.&lt;br /&gt;
|func_desc=Deletes the object. The object does not go to the owners Inventory:Trash.&lt;br /&gt;
|return_text&lt;br /&gt;
|spec&lt;br /&gt;
|caveats=*After this function is called there is no way to undo the deletion of the object.&lt;br /&gt;
*Has no effect if called from within an {{LSLGC|Attachment|attachment}}; there is no way to delete an attachment.&lt;br /&gt;
**To detach an object from the avatar call [[llDetachFromAvatar]]&lt;br /&gt;
|constants&lt;br /&gt;
|examples=&lt;br /&gt;
&amp;lt;lsl&amp;gt;//Counts down from 5 to 1, then dies&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        integer olf;&lt;br /&gt;
        for(olf = 5; olf &amp;gt; 0; --olf)&lt;br /&gt;
            llSay(0, (string)olf);&lt;br /&gt;
        llDie();&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/lsl&amp;gt;&lt;br /&gt;
|helpers=&lt;br /&gt;
[[llRemoveInventory]] of [[llGetScriptName]] deletes just the calling script, rather than all of the object that the calling script contains. For instance, you can write a script that chats a little when dragged on to an object from inventory and then politely disappears itself, such as:&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
// http://wiki.secondlife.com/wiki/llDie&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llOwnerSay(&amp;quot;llGetRegionTimeDilation()&amp;quot;);&lt;br /&gt;
        llOwnerSay((string) llGetRegionTimeDilation());&lt;br /&gt;
        llRemoveInventory(llGetScriptName());&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;b&amp;gt;Q:&amp;lt;/b&amp;gt; How do I delete another object?&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;A:&amp;lt;/b&amp;gt; You can&#039;t. Your best option is to place a script inside the object you wish to delete and then use chat to tell it when to do so.&amp;lt;br/&amp;gt;&lt;br /&gt;
Alternatively, llGiveInventory can be used to give a copy of a script to another object, but the script will always be turned off within the recipient object. Scripts can only be turned on by manually activating them.&amp;lt;br/&amp;gt;&lt;br /&gt;
[[llRemoteLoadScriptPin]] may be useful, but if you can already get into the object that way, you can likely put a script containing [[llDie]] in it already.&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Q:&amp;lt;/b&amp;gt; How do I make my object delete itself if it goes off my land?&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;A:&amp;lt;/b&amp;gt; Use a [[timer]] and [[llGetLandOwnerAt]]([[llGetPos]]()).&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;Q:&amp;lt;/b&amp;gt; How do I make my object delete or return itself when it leaves the sim?&amp;lt;br/&amp;gt;&lt;br /&gt;
&amp;lt;b&amp;gt;A:&amp;lt;/b&amp;gt; See [[llSetStatus]] and the [[STATUS_DIE_AT_EDGE]] and [[STATUS_RETURN_AT_EDGE]] constants.&lt;br /&gt;
|also_functions={{LSL DefineRow||[[llDetachFromAvatar]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llBreakLink]]|}}&lt;br /&gt;
|also_events&lt;br /&gt;
|also_tests&lt;br /&gt;
|also_articles={{LSL DefineRow||{{LSLGC|Attachment}}|}}&lt;br /&gt;
|notes&lt;br /&gt;
|permission&lt;br /&gt;
|negative_index&lt;br /&gt;
|cat1=Object&lt;br /&gt;
|cat2&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Randur Source</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Randur_Source&amp;diff=83831</id>
		<title>User:Randur Source</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Randur_Source&amp;diff=83831"/>
		<updated>2008-08-08T10:36:04Z</updated>

		<summary type="html">&lt;p&gt;Randur Source: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Randur&#039;s SL reSource&lt;br /&gt;
&lt;br /&gt;
I can offer you any kind of scripted solution for SecondLife. I create HUD gadgets and also inworld rezzable objects. You can also use some of my SL scripts to apply to your own builds. I can make custom solutions by request.&lt;br /&gt;
&lt;br /&gt;
I also make new sound samples and gestures, as well as new textures for clothing and tattoes. I create new animations and some sculpted objects as well.&lt;br /&gt;
&lt;br /&gt;
Use my vending machines and look at slexchange.com&lt;br /&gt;
I even give away some full perm scripts.&lt;br /&gt;
&lt;br /&gt;
Join my group in SL: Randur&#039;s SL reSource (secondlife:///app/group/f975bd4c-f126-b6b6-4063-aa351a4d1bf3/about)&lt;/div&gt;</summary>
		<author><name>Randur Source</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Randur_Source&amp;diff=83830</id>
		<title>User:Randur Source</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Randur_Source&amp;diff=83830"/>
		<updated>2008-08-08T10:17:01Z</updated>

		<summary type="html">&lt;p&gt;Randur Source: New page: Randur&amp;#039;s SL reSource  I can offer you any kind of scripted solution for SecondLife. I create HUD gadgets and also inworld rezzable objects. You can also use some of my SL scripts to apply ...&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Randur&#039;s SL reSource&lt;br /&gt;
&lt;br /&gt;
I can offer you any kind of scripted solution for SecondLife. I create HUD gadgets and also inworld rezzable objects. You can also use some of my SL scripts to apply to your own builds. I can make custom solutions by request.&lt;br /&gt;
&lt;br /&gt;
I also make new sound samples and gestures, as well as new textures for clothing and tattoes. I create new animations and some sculpted objects as well.&lt;br /&gt;
&lt;br /&gt;
Use my vending machines and look at slexchange.com&lt;br /&gt;
I even give away some full perm scripts.&lt;/div&gt;</summary>
		<author><name>Randur Source</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlSetText&amp;diff=83828</id>
		<title>LlSetText</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlSetText&amp;diff=83828"/>
		<updated>2008-08-08T10:13:18Z</updated>

		<summary type="html">&lt;p&gt;Randur Source: Multiple linebreaks with empty lines solution&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Function/color|color}} {{LSL Function/alpha|alpha}}{{LSL_Function&lt;br /&gt;
|func_id=152&lt;br /&gt;
|func_sleep=0.0&lt;br /&gt;
|func_energy=10.0&lt;br /&gt;
|func=llSetText&lt;br /&gt;
|sort=SetText&lt;br /&gt;
|p1_type=string|p1_name=text|p1_desc=text to display&lt;br /&gt;
|p2_type=vector|p2_name=color&lt;br /&gt;
|p3_type=float|p3_name=alpha&lt;br /&gt;
|func_desc=Displays &#039;&#039;&#039;text&#039;&#039;&#039; that hovers over the prim with specific &#039;&#039;&#039;color&#039;&#039;&#039; and translucency (specified with &#039;&#039;&#039;alpha&#039;&#039;&#039;). &lt;br /&gt;
|return_text&lt;br /&gt;
|spec=&lt;br /&gt;
|caveats=&lt;br /&gt;
*&#039;&#039;&#039;text&#039;&#039;&#039; is limited to 254 bytes, if the string is longer it will be truncated to 254 bytes, even if that means the truncation will chop a character in half.&lt;br /&gt;
*Floating text can be seen through walls and other object. Be considerate of neighbors in malls and apartment buildings.&lt;br /&gt;
*There is no way for a script to determine the prims current floating text or detect when it is changed.&lt;br /&gt;
**There is no [[llGetText]] function or [[CHANGED_TEXT]] [[changed]] event flag.&lt;br /&gt;
*Removing the script or deactivating it will not remove the prims floating text.&lt;br /&gt;
**Floating text is a prim property and not dependent or changed to a script to continue to exist.&lt;br /&gt;
*To remove floating text, use the following:&lt;br /&gt;
&amp;lt;lsl&amp;gt;llSetText(&amp;quot;&amp;quot;, &amp;lt;1.0, 1.0, 1.0&amp;gt;, 1.0);&amp;lt;/lsl&amp;gt;&lt;br /&gt;
*Vertical whitespace is removed from the end of the text string, so if you want vertical whitespace put any character (like a space) on the last line.&lt;br /&gt;
*Multiple linebreaks with empty lines are converted to a single linebreak, so add a whitespace character on every line you want to skip [[User:Randur Source]]:&lt;br /&gt;
&amp;lt;lsl&amp;gt;llSetText(&amp;quot;Monkeys\n\n\n\n\n&amp;quot;, &amp;lt;1.0, 1.0, 1.0&amp;gt;, 1.0);//Bad&lt;br /&gt;
llSetText(&amp;quot;Monkeys\n\n\n\n\n &amp;quot;, &amp;lt;1.0, 1.0, 1.0&amp;gt;, 1.0);//Good - no, bad, see next line:&lt;br /&gt;
llSetText(&amp;quot;Monkeys\n \n \n \n \n &amp;quot;, &amp;lt;1.0, 1.0, 1.0&amp;gt;, 1.0);//Good&amp;lt;/lsl&amp;gt;&lt;br /&gt;
|examples=&lt;br /&gt;
Example of how llSetText could be included in default code to show object&#039;s name in green text:&lt;br /&gt;
&amp;lt;lsl&amp;gt;default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
         llSay(0, &amp;quot;Hello, Avatar!&amp;quot;);&lt;br /&gt;
         llSetText(llGetObjectName(), &amp;lt;0.0, 1.0, 0.0&amp;gt;, 1.0); // Display the object&#039;s current name in green&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
         llSay(0, &amp;quot;Touched.&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/lsl&amp;gt;&lt;br /&gt;
By default the floating text will appear on a single line. However, the floating text can be spread over multiple lines by using a line break &amp;quot;\n&amp;quot; (read [[SplitLine]] in section &#039;See Also&#039;).&lt;br /&gt;
===Color &amp;amp; Alpha===&lt;br /&gt;
{{{!}} class=&amp;quot;sortable&amp;quot; {{Prettytable|style=float:right; margin-top:0;}}&lt;br /&gt;
{{!}}- {{Hl2}}&lt;br /&gt;
! Color&lt;br /&gt;
! Code&lt;br /&gt;
{{!}}- style=&amp;quot;background:white&amp;quot;&lt;br /&gt;
{{!}}White &lt;br /&gt;
{{!}}&amp;lt;1.0, 1.0, 1.0&amp;gt;&lt;br /&gt;
{{!}}- style=&amp;quot;background:grey&amp;quot;&lt;br /&gt;
{{!}}Grey &lt;br /&gt;
{{!}}&amp;lt;0.5, 0.5, 0.5&amp;gt;&lt;br /&gt;
{{!}}- style=&amp;quot;background:black; color:white;&amp;quot;&lt;br /&gt;
{{!}}{{!}}Black &lt;br /&gt;
{{!}}&amp;lt;0.0, 0.0, 0.0&amp;gt;&lt;br /&gt;
{{!}}- style=&amp;quot;background:red; color:white;&amp;quot;&lt;br /&gt;
{{!}}Red&lt;br /&gt;
{{!}}&amp;lt;1.0, 0.0, 0.0&amp;gt;&lt;br /&gt;
{{!}}- style=&amp;quot;background:green; color:white;&amp;quot;&lt;br /&gt;
{{!}}Green&lt;br /&gt;
{{!}}&amp;lt;0.0, 1.0, 0.0&amp;gt;&lt;br /&gt;
{{!}}- style=&amp;quot;background:blue; color:white;&amp;quot;&lt;br /&gt;
{{!}}Blue&lt;br /&gt;
{{!}}&amp;lt;0.0, 0.0, 1.0&amp;gt;&lt;br /&gt;
{{!}}}&lt;br /&gt;
The x, y &amp;amp; z components of the vector are used to represent red, green, and blue respectively. The range is different then traditional RGB, instead of being 0 -&amp;gt; 255, LSL uses 0 -&amp;gt; 1. &amp;lt;1.0, 1.0, 1.0&amp;gt;, means &amp;quot;white&amp;quot; and &amp;lt;0.0, 0.0, 0.0&amp;gt; means &amp;quot;black&amp;quot;:&lt;br /&gt;
&amp;lt;lsl&amp;gt;llSetText(&amp;quot;I am on&amp;quot;, &amp;lt;1.0, 1.0, 1.0&amp;gt;, 1.0);//white text&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&amp;lt;lsl&amp;gt;llSetText(&amp;quot;I am off&amp;quot;, &amp;lt;0.0, 0.0, 0.0&amp;gt;, 1.0);//black text&amp;lt;/lsl&amp;gt;&lt;br /&gt;
The 1.0 is the alpha setting. 1.0 means fully opaque, and 0.0 would be completely transparent (invisible):&lt;br /&gt;
&amp;lt;lsl&amp;gt;llSetText(&amp;quot;alpha&amp;quot;, &amp;lt;0.0, 1.0, 0.0&amp;gt;, 0.5);//50% translucent green text&amp;lt;/lsl&amp;gt;&lt;br /&gt;
===Multiple lines===&lt;br /&gt;
&amp;lt;lsl&amp;gt;llSetText(&amp;quot;I am \n on two lines!&amp;quot;, &amp;lt;0.0, 1.0, 0.0&amp;gt;, 1.0);//two lines of green text&amp;lt;/lsl&amp;gt;&lt;br /&gt;
|helpers=&lt;br /&gt;
Drag this script out of inventory onto an object to erase its set text:&lt;br /&gt;
&amp;lt;lsl&amp;gt;// http://wiki.secondlife.com/wiki/llSetText&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSetText(&amp;quot;&amp;quot;, &amp;lt;1.0, 1.0, 1.0&amp;gt;, 1.0);&lt;br /&gt;
        llRemoveInventory(llGetScriptName());&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/lsl&amp;gt;&lt;br /&gt;
|also&lt;br /&gt;
|also_functions&lt;br /&gt;
|also_articles=&lt;br /&gt;
{{LSL DefineRow||[[:Category:LSL Examples|Examples]]: [[SplitLine]]|Insert &#039;new line&#039; escape codes at certain positions of a string}}&lt;br /&gt;
{{LSL DefineRow||Useful snippet: [[llGetObjectPermMask]]|Label an object with text and newlines to give away or sell}}&lt;br /&gt;
|notes=To actually display text on a prim, see [[XyzzyText]], or consider using parcel prim [[:Category:LSL_Media|Media]] options (useful only you have control over the land&#039;s media settings.)&lt;br /&gt;
|cat1=Effects&lt;br /&gt;
|cat2=Prim&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Randur Source</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Talk:LlSitTarget&amp;diff=81951</id>
		<title>Talk:LlSitTarget</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Talk:LlSitTarget&amp;diff=81951"/>
		<updated>2008-08-01T13:45:39Z</updated>

		<summary type="html">&lt;p&gt;Randur Source: Using llSetLinkPrimitiveParams for skydiving: why limited to 5m in a linked set?&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Unsitting on wrong side or camera rotation ==&lt;br /&gt;
&lt;br /&gt;
Hi, i am getting frustrated with this. I create a board and set the sit target with&lt;br /&gt;
 llSitTarget(&amp;lt;0.4, 0.0, 0.0&amp;gt;, ZERO_ROTATION);&lt;br /&gt;
and an animation which for &amp;quot;standing&amp;quot;. So while the person technical sits, she stands in front of the board. &lt;br /&gt;
But I have a problem with that: If the board stand freely, the person unsits right through it towards the other side. I can put the board with the back  facing a large wall. In the case the unsitting is correctly in front of it. But on sit down the camera rotates, so that it is behind the avatar again; on the other side of the wall.&lt;br /&gt;
&lt;br /&gt;
If anyone has an idea how to fix, please tell me (even if it is just an idea where to look for more information). --[[User:Maike Short|Maike Short]] 12:41, 24 February 2008 (PST)&lt;br /&gt;
&lt;br /&gt;
:You could position the camera with the {{LSLGC|Camera}} functions.  -- [[User:Strife Onizuka|Strife Onizuka]] 04:46, 25 February 2008 (PST)&lt;br /&gt;
&lt;br /&gt;
==Optimization==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
list GetSitTarget(integer prim, key av)&lt;br /&gt;
{//WARNING: llGetObjectDetails can introduce an error that goes as far as the 5th decimal place.&lt;br /&gt;
    vector tp = llGetAgentSize(av);&lt;br /&gt;
    if(tp)&lt;br /&gt;
    {&lt;br /&gt;
        if(prim == LINK_THIS)//llGetLinkKey doesn&#039;t like LINK_THIS&lt;br /&gt;
            prim = llGetLinkNumber();&lt;br /&gt;
    &lt;br /&gt;
        list details = OBJECT_POS + (list)OBJECT_ROT;&lt;br /&gt;
        rotation f = llList2Rot(details = (llGetObjectDetails(llGetLinkKey(prim), details) + llGetObjectDetails(av, details)), 1);&lt;br /&gt;
    &lt;br /&gt;
        return [(llRot2Up(f = (llList2Rot(details, 3) / f)) * tp.z * 0.02638) + ((llList2Vector(details, 2) - llList2Vector(details, 0)) / f) - &amp;lt;0.0, 0.0, 0.4&amp;gt;, f];&lt;br /&gt;
    }&lt;br /&gt;
    return [];&lt;br /&gt;
}//Written by Strife Onizuka&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Using llSetLinkPrimitiveParams for skydiving: why limited to 5m in a linked set?==&lt;br /&gt;
llSetLinkPrimitiveParams can be used as a handy tool to adjust an avatar&#039;s position and rotation.&lt;br /&gt;
This works perfectly when the object consists of 1 prim, with a range for setting the avatar position away to 500m easily!&lt;br /&gt;
When there are more prims linked, this offset seems to be limited to 5m (measured with llVecDist). This is an awfull sideeffect!&lt;br /&gt;
&lt;br /&gt;
Put this next script inside a prim and sit on the prim, it will bring you to 1000.0 higher then the prim.&lt;br /&gt;
Next link this prim to another prim and try again. You will notice you are limited to 5m. My Question: why is this limited?&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
// by Randur Source&lt;br /&gt;
&lt;br /&gt;
integer heightcnt = 0;&lt;br /&gt;
list heights = [0.0, 1.0, 5.0, 6.0, 10.0, 100.0, 300.0, 500.0, 800.0, 1000.0];&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSitTarget(ZERO_VECTOR,ZERO_ROTATION); // Clear the current sittarget for a clear test&lt;br /&gt;
        llSetRot(ZERO_ROTATION); // set the prim to no rotation, for simple z axis movement&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    changed(integer change)&lt;br /&gt;
    {&lt;br /&gt;
        if (change &amp;amp; CHANGED_LINK) // detect linked prims and avatars&lt;br /&gt;
        {&lt;br /&gt;
            integer primnum = llGetNumberOfPrims(); // the avatar is the last linked prim&lt;br /&gt;
            if (primnum &amp;lt;= 1) // stop if there is only 1 prim&lt;br /&gt;
                return;&lt;br /&gt;
        &lt;br /&gt;
            key avatar = llGetLinkKey(primnum);&lt;br /&gt;
            if (llGetAgentSize(avatar) == ZERO_VECTOR) // stop if this is not an avatar&lt;br /&gt;
                return;&lt;br /&gt;
                &lt;br /&gt;
            // loop through the list of test heights:&lt;br /&gt;
            for (heightcnt = 0; heightcnt &amp;lt; llGetListLength(heights); heightcnt++)&lt;br /&gt;
            {&lt;br /&gt;
                float height = llList2Float(heights,heightcnt);&lt;br /&gt;
                llSetLinkPrimitiveParams(primnum,[PRIM_POSITION,&amp;lt;0.0,0.0,height&amp;gt;]); // set this to the wanted height using a vector z axis&lt;br /&gt;
                &lt;br /&gt;
                vector avatarpos = llList2Vector(llGetObjectDetails(avatar,[OBJECT_POS]),0); // detect the avatar position within the sim&lt;br /&gt;
                float distance = llVecDist(llGetPos(),avatarpos);&lt;br /&gt;
                llOwnerSay(&amp;quot;Attempt to move &amp;quot; + llKey2Name(llGetLinkKey(primnum)) + &amp;quot; to &amp;quot; + (string)height + &amp;quot;m high resulting to &amp;quot; + (string)distance + &amp;quot;m&amp;quot;);&lt;br /&gt;
                &lt;br /&gt;
                llSleep(1.0);&lt;br /&gt;
            }&lt;br /&gt;
            llUnSit(avatar);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Randur Source</name></author>
	</entry>
</feed>