<?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=Arda+Xi</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=Arda+Xi"/>
	<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/wiki/Special:Contributions/Arda_Xi"/>
	<updated>2026-06-17T09:46:13Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Chat_Logger_(GPL)&amp;diff=58752</id>
		<title>Chat Logger (GPL)</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Chat_Logger_(GPL)&amp;diff=58752"/>
		<updated>2008-03-15T11:47:24Z</updated>

		<summary type="html">&lt;p&gt;Arda Xi: replace pre tags with lsl for readability&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
This code demonstrates several functions in combination. Listens, dialogs, Lists, states, arrays, etc.   &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Preamble&#039;&#039;&#039;: Code adapted from: http://www.simteach.com/wiki/index.php?title=SL_Chat_Logger (by Patch Lamington) which is covered by GNU Free Documentation License (http://www.gnu.org/copyleft/fdl.html) in the spirit of which this script is GPL&#039;d. Copyright (C) 2007  Nobody Fugazi/T. Rampersad &lt;br /&gt;
&lt;br /&gt;
(This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License for more details. The GPL license: [http://www.gnu.org/copyleft/gpl.html]&lt;br /&gt;
&lt;br /&gt;
(You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA. &lt;br /&gt;
&lt;br /&gt;
Change Log:&lt;br /&gt;
January 12, 2007: Text output in HTML, Requests permissions from user before logging chat. (NF/TR)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
list names;&lt;br /&gt;
list speech;&lt;br /&gt;
list colours=[&amp;quot;002EB8&amp;quot;,&amp;quot;FF6633&amp;quot;,&amp;quot;006600&amp;quot;,&amp;quot;660066&amp;quot;,&amp;quot;660033&amp;quot;,&amp;quot;663300&amp;quot;,&amp;quot;1A9900&amp;quot;,&amp;quot;FF14B1&amp;quot;,&amp;quot;001A99&amp;quot;,&amp;quot;#B88A00&amp;quot;];&lt;br /&gt;
list unique_names;&lt;br /&gt;
list ignore_names;&lt;br /&gt;
list buffer_await;&lt;br /&gt;
integer BUFFERSTRIDE = 2;&lt;br /&gt;
&lt;br /&gt;
list ALLOW_MENU = [&amp;quot;sure&amp;quot;, &amp;quot;no way&amp;quot;]; // the main menu&lt;br /&gt;
integer CHANNEL = 42; // Life, the Universe, and Everything.&lt;br /&gt;
integer HandleDialogListen;&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSetText(&amp;quot;This is a GPL Chat Logger.\n We request permission before recording.&amp;quot;,&amp;lt;0,0,0&amp;gt;,1.0);&lt;br /&gt;
        integer i;&lt;br /&gt;
        integer c;&lt;br /&gt;
        for (i=0;i&amp;lt;llGetListLength(names);i++)&lt;br /&gt;
        {&lt;br /&gt;
            c = llListFindList(unique_names,llList2List(names,i,i)  );&lt;br /&gt;
            while (c &amp;gt;= llGetListLength(colours)) // dont crash if I run out of colours&lt;br /&gt;
                c -= llGetListLength(colours);&lt;br /&gt;
            llSetObjectName(&amp;quot;&amp;lt;font color=#&amp;quot; + llList2String(colours,c)&lt;br /&gt;
                + &amp;quot;&amp;gt;&amp;quot; + llList2String(names,i) );&lt;br /&gt;
            llOwnerSay( llList2String(speech,i) + &amp;quot;&amp;lt;/font&amp;gt;&amp;quot; );&lt;br /&gt;
        }&lt;br /&gt;
        names = [];&lt;br /&gt;
        speech = [];&lt;br /&gt;
        unique_names = [];&lt;br /&gt;
        llSetObjectName(&amp;quot;GPL ChatLogger 0.1&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    on_rez(integer i)&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;
        if (llDetectedKey(0) == llGetOwner() )&lt;br /&gt;
        {&lt;br /&gt;
            llSay(0, &amp;quot;Beginning Chat Logging.&amp;quot;);&lt;br /&gt;
            state chat_logging;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
state chat_logging&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llListen(0,&amp;quot;&amp;quot;,NULL_KEY,&amp;quot;&amp;quot;);&lt;br /&gt;
        buffer_await = [];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    on_rez(integer i)&lt;br /&gt;
    {&lt;br /&gt;
        llOwnerSay(&amp;quot;Logging still active! Touch to get playback&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        // If the dialog is hanging out doing nothing too long, kill the llListen&lt;br /&gt;
        llListenRemove(HandleDialogListen);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        if (llDetectedKey(0) == llGetOwner() )&lt;br /&gt;
        {&lt;br /&gt;
            llSay(0, &amp;quot;chat logging now off - replaying log!.&amp;quot;);&lt;br /&gt;
            state default;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    listen(integer channel, string name, key id, string message)&lt;br /&gt;
    {&lt;br /&gt;
           // Is this a message from the permissions dialog?&lt;br /&gt;
            if ((llListFindList(ALLOW_MENU, [message]) != -1) &amp;amp;&amp;amp; (channel==CHANNEL))&lt;br /&gt;
            {&lt;br /&gt;
                string buffer_temp;&lt;br /&gt;
                // we&#039;ll need this from the strided list.&lt;br /&gt;
                integer buffer_loc;&lt;br /&gt;
                list temp_name;&lt;br /&gt;
                temp_name +=name;&lt;br /&gt;
                buffer_loc = llListFindList(buffer_await, temp_name);&lt;br /&gt;
                if (message==&amp;quot;sure&amp;quot;)&lt;br /&gt;
                    {&lt;br /&gt;
                        unique_names += name;&lt;br /&gt;
                        llListenRemove(HandleDialogListen);&lt;br /&gt;
                        // buffered message is worthwhile, so add it:&lt;br /&gt;
                        buffer_temp = llList2String(buffer_await, buffer_loc);&lt;br /&gt;
                        names += buffer_temp;&lt;br /&gt;
                        buffer_loc++;&lt;br /&gt;
                        buffer_temp = llList2String(buffer_await, buffer_loc);&lt;br /&gt;
                        speech += buffer_temp;&lt;br /&gt;
                        buffer_loc--;&lt;br /&gt;
                        llDeleteSubList(buffer_await, buffer_loc, BUFFERSTRIDE);&lt;br /&gt;
                        return;&lt;br /&gt;
                    }&lt;br /&gt;
                else &lt;br /&gt;
                    {&lt;br /&gt;
                        // To Be Safe, even if someone hits ignore &lt;br /&gt;
                        ignore_names += name;&lt;br /&gt;
                        llListenRemove(HandleDialogListen);&lt;br /&gt;
                        // We can delete the buffer without adding stuff.&lt;br /&gt;
                        llDeleteSubList(buffer_await, buffer_loc, BUFFERSTRIDE);&lt;br /&gt;
                        return;&lt;br /&gt;
                    }&lt;br /&gt;
            }&lt;br /&gt;
          &lt;br /&gt;
          if(llListFindList(ignore_names,[name]) != -1)&lt;br /&gt;
          {&lt;br /&gt;
              return;&lt;br /&gt;
            }&lt;br /&gt;
            if(llListFindList(unique_names,[name]) == -1)&lt;br /&gt;
            {&lt;br /&gt;
                //Check if avatar will give permissions&lt;br /&gt;
                HandleDialogListen = llListen(CHANNEL, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
                llDialog(id, &amp;quot;Hello. This is a chat logger. If you give us permission, your participation will be recorded. May we have your permission?&amp;quot;, ALLOW_MENU, CHANNEL);&lt;br /&gt;
                // Give people 1.5 minutes to respond, &lt;br /&gt;
                // else kill the llListen in timer()&lt;br /&gt;
                llSetTimerEvent(90);&lt;br /&gt;
                //store in strided buffer in case last message is to be permed.&lt;br /&gt;
                buffer_await +=[name,message]; &lt;br /&gt;
                //we&#039;re done here (until the user responds to the dialog).&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
        names += name;&lt;br /&gt;
        speech += message;&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;
[[Category:LSL Library|Chat Logger (GPL)]]&lt;/div&gt;</summary>
		<author><name>Arda Xi</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=WarpPos&amp;diff=57331</id>
		<title>WarpPos</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=WarpPos&amp;diff=57331"/>
		<updated>2008-03-05T18:54:31Z</updated>

		<summary type="html">&lt;p&gt;Arda Xi: Added &amp;lt;lsl&amp;gt; tags&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The corresponding forum thread for this can be found [[http://forums.secondlife.com/showthread.php?t=109523 here]].&lt;br /&gt;
&lt;br /&gt;
WarpPos is simply a method by which the 10m limit on non-physical movement can be avoided, by exploiting a glitch in [[llSetPrimitiveParams]] in which multiple parameters are executed in a single server frame.&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
 warpPos( vector destpos ) &lt;br /&gt;
 {   //R&amp;amp;D by Keknehv Psaltery, 05/25/2006&lt;br /&gt;
     //with a little pokeing by Strife, and a bit more&lt;br /&gt;
     //some more munging by Talarus Luan&lt;br /&gt;
     //Final cleanup by Keknehv Psaltery&lt;br /&gt;
     // Compute the number of jumps necessary&lt;br /&gt;
     integer jumps = (integer)(llVecDist(destpos, llGetPos()) / 10.0) + 1;&lt;br /&gt;
     // Try and avoid stack/heap collisions&lt;br /&gt;
     if (jumps &amp;gt; 100 )&lt;br /&gt;
         jumps = 100;    //  1km should be plenty&lt;br /&gt;
     list rules = [ PRIM_POSITION, destpos ];  //The start for the rules list&lt;br /&gt;
     integer count = 1;&lt;br /&gt;
     while ( ( count = count &amp;lt;&amp;lt; 1 ) &amp;lt; jumps)&lt;br /&gt;
         rules = (rules=[]) + rules + rules;   //should tighten memory use.&lt;br /&gt;
     llSetPrimitiveParams( rules + llList2List( rules, (count - jumps) &amp;lt;&amp;lt; 1, count) );&lt;br /&gt;
     if ( llVecDist( llGetPos(), destpos ) &amp;gt; .001 ) //Failsafe&lt;br /&gt;
         while ( --jumps ) &lt;br /&gt;
             llSetPos( destpos );&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
A few observations:&lt;br /&gt;
Sim crossings are perilous for AVs. Depending on connection speed and whether or not you are connected to the sim (can see it on the mini-map), it may screw up your client. However, it seems like objects, by themselves, can cross great distances. I managed to send an object 4 sims away diagonally. Further testing would help us to understand these things.&lt;br /&gt;
&lt;br /&gt;
The script limits the maximum distance to 1km, in order to prevent stack/heap collisions. Still, this is 100 times what llSetPos was limited to-- and you can, of course, modify it to allow larger distances, but beware.&lt;br /&gt;
&lt;br /&gt;
The average time this function takes to execute is under .2 seconds, which is barely noticeable at all, and can easily be attributed to general lag. A simple optimization for an object with a known destination might be to calculate the list beforehand, and then call llSetPrimitiveParams with that list.&lt;br /&gt;
&lt;br /&gt;
{{LSLC|Library}}&lt;/div&gt;</summary>
		<author><name>Arda Xi</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Dialog_Control&amp;diff=55700</id>
		<title>Dialog Control</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Dialog_Control&amp;diff=55700"/>
		<updated>2008-02-24T20:54:21Z</updated>

		<summary type="html">&lt;p&gt;Arda Xi: Added lsl tags&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
This is example of usage and function library needed in each scripts to use this dialog module.&lt;br /&gt;
&lt;br /&gt;
;Functions List:&lt;br /&gt;
# Standard dialog with buttons. There can be more than 12 buttons.&lt;br /&gt;
#* dialog(key id, string message, list buttons, list returns);&lt;br /&gt;
&lt;br /&gt;
# Normal notification dialog, ie: dialog which requires no response from user.&lt;br /&gt;
#* dialogNotify(key id, string message);&lt;br /&gt;
&lt;br /&gt;
# To display current dialog again:&lt;br /&gt;
#* dialogReshow();&lt;br /&gt;
&lt;br /&gt;
# To cancel current dialog; Currently displayed dialog will give no response when clicked.&lt;br /&gt;
#* dialogCancel();&lt;br /&gt;
&lt;br /&gt;
If anyone uses this module, please IM &#039;&#039;Nargus Asturias&#039;&#039;, I&#039;d love to hear what you think.&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
// Dialog constants&lt;br /&gt;
 integer lnkDialog = 14001;&lt;br /&gt;
 integer lnkDialogNotify = 14004;&lt;br /&gt;
 integer lnkDialogResponse = 14002;&lt;br /&gt;
 integer lnkDialogTimeOut = 14003;&lt;br /&gt;
 &lt;br /&gt;
 integer lnkDialogReshow = 14011;&lt;br /&gt;
 integer lnkDialogCancel = 14012;&lt;br /&gt;
 &lt;br /&gt;
 string seperator = &amp;quot;||&amp;quot;;&lt;br /&gt;
 integer dialogTimeOut = 0;&lt;br /&gt;
 &lt;br /&gt;
 // ********** DIALOG FUNCTIONS **********&lt;br /&gt;
 string packDialogMessage(string message, list buttons, list returns){&lt;br /&gt;
     string packed_message = message + seperator + (string)dialogTimeOut;&lt;br /&gt;
     &lt;br /&gt;
     integer i;&lt;br /&gt;
     integer count = llGetListLength(buttons);&lt;br /&gt;
     for(i=0; i&amp;lt;count; i++){&lt;br /&gt;
         string button = llList2String(buttons, i);&lt;br /&gt;
         if(llStringLength(button) &amp;gt; 24) button = llGetSubString(button, 0, 23);&lt;br /&gt;
         packed_message += seperator + button + seperator + llList2String(returns, i);&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     return packed_message;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 dialogReshow(){llMessageLinked(LINK_THIS, lnkDialogReshow, &amp;quot;&amp;quot;, NULL_KEY);}&lt;br /&gt;
 dialogCancel(){&lt;br /&gt;
     llMessageLinked(LINK_THIS, lnkDialogCancel, &amp;quot;&amp;quot;, NULL_KEY);&lt;br /&gt;
     llSleep(1);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 dialog(key id, string message, list buttons, list returns){&lt;br /&gt;
     llMessageLinked(LINK_THIS, lnkDialog, packDialogMessage(message, buttons, returns), id);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 dialogNotify(key id, string message){&lt;br /&gt;
     list rows;&lt;br /&gt;
    &lt;br /&gt;
     llMessageLinked(LINK_THIS, lnkDialogNotify,&lt;br /&gt;
         message + seperator + (string)dialogTimeOut + seperator,&lt;br /&gt;
         id);&lt;br /&gt;
 }&lt;br /&gt;
 // ********** END DIALOG FUNCTIONS **********&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 default{&lt;br /&gt;
    state_entry(){&lt;br /&gt;
        llSetText(&amp;quot;Touch me to show dialog&amp;quot;, &amp;lt;1,1,1&amp;gt;, 1);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    link_message(integer sender_num, integer num, string str, key id){&lt;br /&gt;
        if(num == lnkDialogTimeOut){&lt;br /&gt;
            dialogNotify(llGetOwner(), &amp;quot;Menu time-out. Please try again.&amp;quot;);&lt;br /&gt;
            state default;&lt;br /&gt;
        }else if(num == lnkDialogResponse){&lt;br /&gt;
            llWhisper(0, str);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    touch(integer num_detected){&lt;br /&gt;
        dialog(llGetOwner(),&lt;br /&gt;
        &lt;br /&gt;
            // Dialog message here&lt;br /&gt;
            &amp;quot;Messages go here&amp;quot;,&lt;br /&gt;
            &lt;br /&gt;
            // List of dialog buttons&lt;br /&gt;
            [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, &amp;quot;Close&amp;quot; ],&lt;br /&gt;
 &lt;br /&gt;
            // List of return value from the buttons, in same order&lt;br /&gt;
            // Note that this value do not need to be the same as button texts&lt;br /&gt;
            [ 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, &amp;quot;X&amp;quot; ]&lt;br /&gt;
        );&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Nargus Dialog Control v1.58 (by Nargus Asturias)&lt;br /&gt;
&lt;br /&gt;
 // ********** SIMPLE DIALOG MODULE ********** //&lt;br /&gt;
 // By Nargus Asturias&lt;br /&gt;
 // Version 1.55&lt;br /&gt;
 //&lt;br /&gt;
 // Support only one dialog at a time. DO NOT request multiple dialog at once!&lt;br /&gt;
 // Use of provided functions are recommented. Instruction here are for hardcore programmers only!&lt;br /&gt;
 //&lt;br /&gt;
 // Request: Send MessageLinked to the script. There are 3 dialog modes:&lt;br /&gt;
 //      lnkDialog               : Normal dialog with message and buttons&lt;br /&gt;
 //      lnkDialogNumericAdjust  : A dialog with buttons can be used to adjust numeric value&lt;br /&gt;
 //      lnkDialogNotify         : Just a simple notification dialog. No return value and no buttons.&lt;br /&gt;
 //&lt;br /&gt;
 // Send MessageLinked with code lnkDialogReshow to force active dialog to reappear.&lt;br /&gt;
 // Send MessageLinked with code lnkDialogCancel to force cancel active dialog&lt;br /&gt;
 //&lt;br /&gt;
 // If a lnkDialog is requested with more than 12 buttons, multi-pages dialog is used to show the buttons.&lt;br /&gt;
 //&lt;br /&gt;
 // [ For lnkDialog ]&lt;br /&gt;
 // MessageLinked Format:&lt;br /&gt;
 //      String part: List dumped into string, each entry seperated by &#039;||&#039;&lt;br /&gt;
 //          Field 1:    Dialog message (512 bytes maximum)&lt;br /&gt;
 //          Field 2:    Time-out data (integer)&lt;br /&gt;
 //          Field 3-4:  Button#1 and return value pair&lt;br /&gt;
 //          Field 5-6:  Button#2 and return value pair&lt;br /&gt;
 //          And go on...&lt;br /&gt;
 //      Key part: Key of AV who attend this dialog&lt;br /&gt;
 //&lt;br /&gt;
 // Response: MessageLinked to the prim that requested dialog (but no where else)&lt;br /&gt;
 //      num == lnkDialogResponse:   AV click on a button. The buttons value returned as a string&lt;br /&gt;
 //      num == lnkDialogTimeOut:    Dialog timeout.&lt;br /&gt;
 //&lt;br /&gt;
 // [ For lnkDialogNumericAdjust ]&lt;br /&gt;
 // MessageLinked Format:&lt;br /&gt;
 //      String part: List dumped into string, each entry seperated by &#039;||&#039;&lt;br /&gt;
 //          Field 1:    Dialog message (512 bytes maximum)&lt;br /&gt;
 //                          Put {VALUE} where you want the current value to be displayed)&lt;br /&gt;
 //          Field 2:    Time-out data (integer)&lt;br /&gt;
 //          Field 3:    Most significant value (ie. 100, for +/-100)&lt;br /&gt;
 //          Field 4:    String-casted numeric value to be adjusted&lt;br /&gt;
 //          Field 5:    2nd most significant value (ie. 10, for +/-10)&lt;br /&gt;
 //          Field 6:    Use &#039;1&#039; to enable &amp;quot;+/-&amp;quot; button, &#039;0&#039; otherwise.&lt;br /&gt;
 //          Field 7:    3nd significant value (ie. 1, for +/-1)&lt;br /&gt;
 //          Field 8:    Use &#039;1&#039; for integer, or &#039;0&#039; for float&lt;br /&gt;
 //          Field 9:    Least significant value (ie. 0.1, for +/-0.1)&lt;br /&gt;
 //          Field 10:   Reserved. Not used.&lt;br /&gt;
 //      Key part: Key of AV who attend this dialog&lt;br /&gt;
 //&lt;br /&gt;
 // Response: MessageLinked to the prim that requested dialog (but no where else)&lt;br /&gt;
 //      num == lnkDialogResponse:   OK or Cancel button is clicked. The final value returned as string.&lt;br /&gt;
 //      num == lnkDialogTimeOut:    Dialog timeout.&lt;br /&gt;
 //&lt;br /&gt;
 // ******************************************* //&lt;br /&gt;
 &lt;br /&gt;
 // Constants&lt;br /&gt;
 integer lnkDialog = 14001;&lt;br /&gt;
 integer lnkDialogNumericAdjust = 14005;&lt;br /&gt;
 integer lnkDialogNotify = 14004;&lt;br /&gt;
 &lt;br /&gt;
 integer lnkDialogReshow = 14011;&lt;br /&gt;
 integer lnkDialogCancel = 14012;&lt;br /&gt;
 &lt;br /&gt;
 integer lnkDialogResponse = 14002;      // A button is hit, or OK is hit for lnkDialogNumericAdjust&lt;br /&gt;
 integer lnkDialogCanceled = 14006;      // Cancel is hit for lnkDialogNumericAdjust&lt;br /&gt;
 integer lnkDialogTimeOut = 14003;       // No button is hit, or Ignore is hit&lt;br /&gt;
 &lt;br /&gt;
 string seperator = &amp;quot;||&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
 // Dialog variables&lt;br /&gt;
 integer dialogChannel;      // Channel number used to spawn this dialog&lt;br /&gt;
 string message;             // Message to be shown with the dialog&lt;br /&gt;
 integer timerOut;           // Dialog time-out&lt;br /&gt;
 key keyId;                  // Key of user who attending this dialog&lt;br /&gt;
 integer requestedNum;       // Link-number of the requested prim&lt;br /&gt;
 list buttons;               // List of dialog buttons&lt;br /&gt;
 list returns;               // List of results from dialog buttons&lt;br /&gt;
 &lt;br /&gt;
 float numericValue;&lt;br /&gt;
 integer useInteger;&lt;br /&gt;
 &lt;br /&gt;
 // Other variables&lt;br /&gt;
 integer buttonsCount;&lt;br /&gt;
 integer startItemNo;&lt;br /&gt;
 integer listenId;&lt;br /&gt;
 &lt;br /&gt;
 string redirectState;&lt;br /&gt;
 &lt;br /&gt;
 integer responseInt = -1;&lt;br /&gt;
 string responseStr;&lt;br /&gt;
 key responseKey;&lt;br /&gt;
 &lt;br /&gt;
 &lt;br /&gt;
 // ********** String Functions **********&lt;br /&gt;
 string replaceString(string pattern, string replace, string source){&lt;br /&gt;
     integer index = llSubStringIndex(source, pattern);&lt;br /&gt;
     if(index &amp;lt; 0) return source;&lt;br /&gt;
     &lt;br /&gt;
     source = llDeleteSubString(source, index, (index + llStringLength(pattern) - 1));&lt;br /&gt;
     return llInsertString(source, index, replace);&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // ********** Dialog Functions **********&lt;br /&gt;
 // Function: createDialog&lt;br /&gt;
 // Create dialog with given message and buttons, direct to user with give id&lt;br /&gt;
 integer createDialog(key id, string message, list buttons){&lt;br /&gt;
     integer channel = -((integer)llFrand(8388608))*(255) - (integer)llFrand(8388608) - 11;&lt;br /&gt;
 &lt;br /&gt;
     llListenRemove(listenId);&lt;br /&gt;
     listenId = llListen(channel, &amp;quot;&amp;quot;, keyId, &amp;quot;&amp;quot;);&lt;br /&gt;
     llDialog(keyId, message, buttons, channel);&lt;br /&gt;
 &lt;br /&gt;
     return channel;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // Function: createMultiDialog&lt;br /&gt;
 // Create dialog with multiple pages. Each page has Back, Next, and a Close button. Otherwise same functionality as createDialog() function.&lt;br /&gt;
 integer createMultiDialog(key id, string message, list buttons, integer _startItemNo){&lt;br /&gt;
     integer channel = -llRound(llFrand( llFabs(llSin(llGetGMTclock())) * 1000000 )) - 11;&lt;br /&gt;
 &lt;br /&gt;
     if(_startItemNo &amp;lt; 0) _startItemNo = 0;&lt;br /&gt;
     if(_startItemNo &amp;gt;= buttonsCount - 1) _startItemNo -= 9;&lt;br /&gt;
     startItemNo = _startItemNo;&lt;br /&gt;
     &lt;br /&gt;
     integer vButtonsCount = buttonsCount - 2;&lt;br /&gt;
     &lt;br /&gt;
     // Generate list of buttons to be shown&lt;br /&gt;
     string closeButton = llList2String(buttons, buttonsCount - 1);&lt;br /&gt;
     &lt;br /&gt;
     integer stopItemNo = startItemNo + 8;&lt;br /&gt;
     if(stopItemNo &amp;gt;= buttonsCount - 1) stopItemNo = vButtonsCount;&lt;br /&gt;
 &lt;br /&gt;
     list thisButtons = llList2List(buttons, startItemNo, stopItemNo);&lt;br /&gt;
 &lt;br /&gt;
     // Generate dialog navigation buttons&lt;br /&gt;
     integer i = stopItemNo - startItemNo + 1;&lt;br /&gt;
     i = i % 3;&lt;br /&gt;
     if(i &amp;gt; 0) while(i &amp;lt; 3){&lt;br /&gt;
         thisButtons += [&amp;quot; &amp;quot;];&lt;br /&gt;
         ++i;&lt;br /&gt;
     }&lt;br /&gt;
     &lt;br /&gt;
     if(startItemNo &amp;gt; 0)&lt;br /&gt;
         thisButtons += [&amp;quot;&amp;lt;&amp;lt; BACK&amp;quot;];&lt;br /&gt;
     else thisButtons += [&amp;quot; &amp;quot;];&lt;br /&gt;
     &lt;br /&gt;
     thisButtons += [closeButton];&lt;br /&gt;
     &lt;br /&gt;
     if(stopItemNo &amp;lt; vButtonsCount)&lt;br /&gt;
         thisButtons += [&amp;quot;NEXT &amp;gt;&amp;gt;&amp;quot;];&lt;br /&gt;
     else thisButtons += [&amp;quot; &amp;quot;];&lt;br /&gt;
     &lt;br /&gt;
     // Append page number to the message&lt;br /&gt;
     integer pageNumber = (integer)(stopItemNo / 9) + 1;&lt;br /&gt;
     integer pagesCount = llCeil(vButtonsCount / 9.0);&lt;br /&gt;
     string vMessage = &amp;quot;PAGE: &amp;quot; + (string)pageNumber + &amp;quot; of &amp;quot; + (string)pagesCount + &amp;quot;\n&amp;quot; +&lt;br /&gt;
         message;&lt;br /&gt;
 &lt;br /&gt;
     // Display dialog&lt;br /&gt;
     llListenRemove(listenId);&lt;br /&gt;
     listenId = llListen(channel, &amp;quot;&amp;quot;, keyId, &amp;quot;&amp;quot;);&lt;br /&gt;
     llDialog(keyId, vMessage, thisButtons, channel);&lt;br /&gt;
 &lt;br /&gt;
     return channel;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // Function: generateNumericAdjustButtons&lt;br /&gt;
 // Generate numeric adjustment dialog which adjustment values are in given list.&lt;br /&gt;
 // If useNegative is TRUE, &amp;quot;+/-&amp;quot; button will be available.&lt;br /&gt;
 list generateNumericAdjustButtons(list adjustValues, integer useNegative){&lt;br /&gt;
     list dialogControlButtons;&lt;br /&gt;
     list positiveButtons;&lt;br /&gt;
     list negativeButtons;&lt;br /&gt;
     list additionButtons;&lt;br /&gt;
 &lt;br /&gt;
     dialogControlButtons = [&amp;quot;OK&amp;quot;, &amp;quot;Cancel&amp;quot;];&lt;br /&gt;
 &lt;br /&gt;
     // Config adjustment buttons&lt;br /&gt;
     integer count = llGetListLength(adjustValues);&lt;br /&gt;
     integer index;&lt;br /&gt;
     for(index = 0; (index &amp;lt; count) &amp;amp;&amp;amp; (index &amp;lt; 3); index++){&lt;br /&gt;
         string sValue = llList2String(adjustValues, index);&lt;br /&gt;
 &lt;br /&gt;
         if((float)sValue != 0){&lt;br /&gt;
             positiveButtons += [&amp;quot;+&amp;quot; + sValue];&lt;br /&gt;
             negativeButtons += [&amp;quot;-&amp;quot; + sValue];&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     // Check positive/negative button&lt;br /&gt;
     if(useNegative)&lt;br /&gt;
         additionButtons = [&amp;quot;+/-&amp;quot;];&lt;br /&gt;
     else additionButtons = [];&lt;br /&gt;
 &lt;br /&gt;
     // If there is fourth adjustment button&lt;br /&gt;
     if(count &amp;gt; 3){&lt;br /&gt;
         if(llGetListLength(additionButtons) == 0) additionButtons = [&amp;quot; &amp;quot;];&lt;br /&gt;
 &lt;br /&gt;
         string sValue = llList2String(adjustValues, index);&lt;br /&gt;
         additionButtons += [&amp;quot;+&amp;quot; + sValue, &amp;quot;-&amp;quot; + sValue];&lt;br /&gt;
     }else if(additionButtons != []) additionButtons += [&amp;quot; &amp;quot;, &amp;quot; &amp;quot;];&lt;br /&gt;
     &lt;br /&gt;
     // Return list dialog buttons&lt;br /&gt;
     return additionButtons + negativeButtons + positiveButtons + dialogControlButtons;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 setResponse(integer int, string str, key id){&lt;br /&gt;
     responseInt = int;&lt;br /&gt;
     responseStr = str;&lt;br /&gt;
     responseKey = id;&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 checkDialogRequest(integer sender_num, integer num, string str, key id){&lt;br /&gt;
      if((num == lnkDialogNotify) || (num == lnkDialogNumericAdjust) || (num == lnkDialog)){&lt;br /&gt;
         list data = llParseString2List(str, [seperator], []);&lt;br /&gt;
     &lt;br /&gt;
         message = llList2String(data, 0);&lt;br /&gt;
         timerOut = llList2Integer(data, 1);&lt;br /&gt;
         keyId = id;&lt;br /&gt;
         requestedNum = sender_num;&lt;br /&gt;
         buttons = [];&lt;br /&gt;
         returns = [];&lt;br /&gt;
     &lt;br /&gt;
         if(timerOut &amp;gt; 7200) timerOut = 7200;&lt;br /&gt;
     &lt;br /&gt;
         integer i;&lt;br /&gt;
         integer count = llGetListLength(data);&lt;br /&gt;
         for(i=2; i&amp;lt;count;){&lt;br /&gt;
             buttons += [llList2String(data, i++)];&lt;br /&gt;
             returns += [llList2String(data, i++)];&lt;br /&gt;
         }&lt;br /&gt;
         &lt;br /&gt;
         buttonsCount = llGetListLength(buttons);&lt;br /&gt;
     &lt;br /&gt;
         if(num == lnkDialogNotify){&lt;br /&gt;
             dialogChannel = -((integer)llFrand(8388608))*(255) - (integer)llFrand(8388608) - 11;&lt;br /&gt;
             llDialog(keyId, message, buttons, dialogChannel);&lt;br /&gt;
             return;&lt;br /&gt;
         }else if(num == lnkDialogNumericAdjust)&lt;br /&gt;
             redirectState = &amp;quot;NumericAdjustDialog&amp;quot;;&lt;br /&gt;
         else if(num == lnkDialog){&lt;br /&gt;
             if(buttonsCount &amp;gt; 12)&lt;br /&gt;
                 redirectState = &amp;quot;MultiDialog&amp;quot;;&lt;br /&gt;
             else redirectState = &amp;quot;Dialog&amp;quot;;&lt;br /&gt;
         }&lt;br /&gt;
         &lt;br /&gt;
         state StartDialog;&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 // ********** States **********&lt;br /&gt;
 default{&lt;br /&gt;
     state_entry(){&lt;br /&gt;
         if(responseInt &amp;gt; 0) llMessageLinked(requestedNum, responseInt, responseStr, responseKey);&lt;br /&gt;
     }&lt;br /&gt;
     &lt;br /&gt;
     link_message(integer sender_num, integer num, string str, key id){&lt;br /&gt;
         checkDialogRequest(sender_num, num, str, id);&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 state StartDialog{&lt;br /&gt;
     state_entry(){&lt;br /&gt;
         if(redirectState == &amp;quot;Dialog&amp;quot;)                   state Dialog;&lt;br /&gt;
         else if(redirectState == &amp;quot;MultiDialog&amp;quot;)         state MultiDialog;&lt;br /&gt;
         else if(redirectState == &amp;quot;NumericAdjustDialog&amp;quot;) state NumericAdjustDialog;&lt;br /&gt;
         else state default;&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 state Dialog{&lt;br /&gt;
     state_entry(){&lt;br /&gt;
         responseInt = -1;&lt;br /&gt;
         dialogChannel = createDialog(keyId, message, buttons);&lt;br /&gt;
         llSetTimerEvent(timerOut);&lt;br /&gt;
     }&lt;br /&gt;
     &lt;br /&gt;
     state_exit(){&lt;br /&gt;
         llSetTimerEvent(0);&lt;br /&gt;
     }&lt;br /&gt;
     &lt;br /&gt;
     on_rez(integer start_param){&lt;br /&gt;
         state default;&lt;br /&gt;
     }&lt;br /&gt;
     &lt;br /&gt;
     timer(){&lt;br /&gt;
         setResponse(lnkDialogTimeOut, &amp;quot;&amp;quot;, keyId);&lt;br /&gt;
         //llMessageLinked(requestedNum, lnkDialogTimeOut, &amp;quot;&amp;quot;, keyId);&lt;br /&gt;
         state default;&lt;br /&gt;
     }&lt;br /&gt;
     &lt;br /&gt;
     link_message(integer sender_num, integer num, string str, key id){&lt;br /&gt;
         if(num == lnkDialogReshow){&lt;br /&gt;
             dialogChannel = createDialog(keyId, message, buttons);&lt;br /&gt;
             llSetTimerEvent(timerOut);&lt;br /&gt;
         }else if(num == lnkDialogCancel) state default;&lt;br /&gt;
 &lt;br /&gt;
         else checkDialogRequest(sender_num, num, str, id);&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     listen(integer channel, string name, key id, string msg){&lt;br /&gt;
         if((channel != dialogChannel) || (id != keyId)) return;&lt;br /&gt;
         &lt;br /&gt;
         integer index = llListFindList(buttons, [msg]);&lt;br /&gt;
         setResponse(lnkDialogResponse, llList2String(returns, index), keyId);&lt;br /&gt;
         //llMessageLinked(requestedNum, lnkDialogResponse, llList2String(returns, index), keyId);&lt;br /&gt;
         state default;&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 state MultiDialog {&lt;br /&gt;
     state_entry(){&lt;br /&gt;
         responseInt = -1;&lt;br /&gt;
         startItemNo = 0;&lt;br /&gt;
         dialogChannel = createMultiDialog(keyId, message, buttons, startItemNo);&lt;br /&gt;
         llSetTimerEvent(timerOut);&lt;br /&gt;
     }&lt;br /&gt;
     &lt;br /&gt;
     state_exit(){&lt;br /&gt;
         llSetTimerEvent(0);&lt;br /&gt;
     }&lt;br /&gt;
     &lt;br /&gt;
     on_rez(integer start_param){&lt;br /&gt;
         state default;&lt;br /&gt;
     }&lt;br /&gt;
     &lt;br /&gt;
     timer(){&lt;br /&gt;
         setResponse(lnkDialogTimeOut, &amp;quot;&amp;quot;, keyId);&lt;br /&gt;
         state default;&lt;br /&gt;
     }&lt;br /&gt;
     &lt;br /&gt;
     link_message(integer sender_num, integer num, string str, key id){&lt;br /&gt;
         if(num == lnkDialogReshow){&lt;br /&gt;
             dialogChannel = createMultiDialog(keyId, message, buttons, startItemNo);&lt;br /&gt;
             llSetTimerEvent(timerOut);&lt;br /&gt;
         }else if(num == lnkDialogCancel) state default;&lt;br /&gt;
 &lt;br /&gt;
         else checkDialogRequest(sender_num, num, str, id);&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     listen(integer channel, string name, key id, string msg){&lt;br /&gt;
         if((channel != dialogChannel) || (id != keyId)) return;&lt;br /&gt;
 &lt;br /&gt;
         // Dialog control buttons&lt;br /&gt;
         if(msg == &amp;quot;&amp;lt;&amp;lt; BACK&amp;quot;){&lt;br /&gt;
             dialogChannel = createMultiDialog(keyId, message, buttons, startItemNo - 9);&lt;br /&gt;
             llSetTimerEvent(timerOut);&lt;br /&gt;
         }else if(msg == &amp;quot;NEXT &amp;gt;&amp;gt;&amp;quot;){&lt;br /&gt;
             dialogChannel = createMultiDialog(keyId, message, buttons, startItemNo + 9);&lt;br /&gt;
             llSetTimerEvent(timerOut);&lt;br /&gt;
         }else if(msg == &amp;quot; &amp;quot;){&lt;br /&gt;
             dialogChannel = createMultiDialog(keyId, message, buttons, startItemNo);&lt;br /&gt;
             llSetTimerEvent(timerOut);&lt;br /&gt;
         &lt;br /&gt;
         // Response buttons&lt;br /&gt;
         }else{&lt;br /&gt;
             integer index = llListFindList(buttons, [msg]);&lt;br /&gt;
             setResponse(lnkDialogResponse, llList2String(returns, index), keyId);&lt;br /&gt;
             //llMessageLinked(requestedNum, lnkDialogResponse, llList2String(returns, index), keyId);&lt;br /&gt;
             state default;&lt;br /&gt;
         }&lt;br /&gt;
     }&lt;br /&gt;
 }&lt;br /&gt;
 &lt;br /&gt;
 state NumericAdjustDialog {&lt;br /&gt;
     state_entry(){&lt;br /&gt;
         responseInt = -1;&lt;br /&gt;
 &lt;br /&gt;
         numericValue = llList2Float(returns, 0);&lt;br /&gt;
         useInteger = llList2Integer(returns, 2);&lt;br /&gt;
         buttons = generateNumericAdjustButtons(buttons, llList2Integer(returns, 1));&lt;br /&gt;
         &lt;br /&gt;
         string vMessage;&lt;br /&gt;
         if(useInteger)&lt;br /&gt;
             vMessage = replaceString(&amp;quot;{VALUE}&amp;quot;, (string)((integer)numericValue), message);&lt;br /&gt;
         else vMessage = replaceString(&amp;quot;{VALUE}&amp;quot;, (string)numericValue, message);&lt;br /&gt;
         &lt;br /&gt;
         dialogChannel = createDialog(keyId, vMessage, buttons);&lt;br /&gt;
         llSetTimerEvent(timerOut);&lt;br /&gt;
     }&lt;br /&gt;
     &lt;br /&gt;
     state_exit(){&lt;br /&gt;
         llSetTimerEvent(0);&lt;br /&gt;
     }&lt;br /&gt;
     &lt;br /&gt;
     on_rez(integer start_param){&lt;br /&gt;
         state default;&lt;br /&gt;
     }&lt;br /&gt;
     &lt;br /&gt;
     timer(){&lt;br /&gt;
         setResponse(lnkDialogTimeOut, &amp;quot;&amp;quot;, keyId);&lt;br /&gt;
         //llMessageLinked(requestedNum, lnkDialogTimeOut, &amp;quot;&amp;quot;, keyId);&lt;br /&gt;
         state default;&lt;br /&gt;
     }&lt;br /&gt;
     &lt;br /&gt;
     link_message(integer sender_num, integer num, string str, key id){&lt;br /&gt;
         if(num == lnkDialogReshow){&lt;br /&gt;
             dialogChannel = createDialog(keyId, message, buttons);&lt;br /&gt;
             llSetTimerEvent(timerOut);&lt;br /&gt;
         }else if(num == lnkDialogCancel) state default;&lt;br /&gt;
 &lt;br /&gt;
         else checkDialogRequest(sender_num, num, str, id);&lt;br /&gt;
     }&lt;br /&gt;
 &lt;br /&gt;
     listen(integer channel, string name, key id, string msg){&lt;br /&gt;
         if((channel != dialogChannel) || (id != keyId)) return;&lt;br /&gt;
         &lt;br /&gt;
         // Dialog control button is hit&lt;br /&gt;
         if(msg == &amp;quot;OK&amp;quot;){&lt;br /&gt;
             setResponse(lnkDialogResponse, (string)numericValue, keyId);&lt;br /&gt;
             //llMessageLinked(requestedNum, lnkDialogResponse, (string)numericValue, keyId);&lt;br /&gt;
             state default;&lt;br /&gt;
         }else if(msg == &amp;quot;Cancel&amp;quot;){&lt;br /&gt;
             setResponse(lnkDialogCanceled, (string)numericValue, keyId);&lt;br /&gt;
             llMessageLinked(requestedNum, lnkDialogCanceled, (string)numericValue, keyId);&lt;br /&gt;
             state default;&lt;br /&gt;
         &lt;br /&gt;
         // Value adjustment button is hit&lt;br /&gt;
         }else if(msg == &amp;quot;+/-&amp;quot;)&lt;br /&gt;
             numericValue = -numericValue;&lt;br /&gt;
         else if(llSubStringIndex(msg, &amp;quot;+&amp;quot;) == 0)&lt;br /&gt;
             numericValue += (float)llDeleteSubString(msg, 0, 0);&lt;br /&gt;
         else if(llSubStringIndex(msg, &amp;quot;-&amp;quot;) == 0)&lt;br /&gt;
             numericValue -= (float)llDeleteSubString(msg, 0, 0);&lt;br /&gt;
         &lt;br /&gt;
         // Spawn another dialog if no OK nor Cancel is hit&lt;br /&gt;
         string vMessage;&lt;br /&gt;
         if(useInteger)&lt;br /&gt;
             vMessage = replaceString(&amp;quot;{VALUE}&amp;quot;, (string)((integer)numericValue), message);&lt;br /&gt;
         else vMessage = replaceString(&amp;quot;{VALUE}&amp;quot;, (string)numericValue, message);&lt;br /&gt;
         dialogChannel = createDialog(keyId, vMessage, buttons);&lt;br /&gt;
         llSetTimerEvent(timerOut);&lt;br /&gt;
    }&lt;br /&gt;
 }&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
{{LSLC|Library|Dialog Control}}&lt;/div&gt;</summary>
		<author><name>Arda Xi</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlScaleTexture&amp;diff=55466</id>
		<title>LlScaleTexture</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlScaleTexture&amp;diff=55466"/>
		<updated>2008-02-23T15:23:05Z</updated>

		<summary type="html">&lt;p&gt;Arda Xi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function/face|face|}}{{LSL_Function&lt;br /&gt;
|func=llScaleTexture&lt;br /&gt;
|sort=ScaleTexture&lt;br /&gt;
|func_id=54|func_sleep=0.2|func_energy=10.0&lt;br /&gt;
|p1_type=float|p1_name=u&lt;br /&gt;
|p2_type=float|p2_name=v&lt;br /&gt;
|p3_type=integer|p3_name=face&lt;br /&gt;
|func_footnote&lt;br /&gt;
|func_desc=Sets the texture &#039;&#039;&#039;u&#039;&#039;&#039; &amp;amp; &#039;&#039;&#039;v&#039;&#039;&#039; scales for the chosen &#039;&#039;&#039;face&#039;&#039;&#039;.&lt;br /&gt;
|return_text&lt;br /&gt;
|spec=In the default texture mapping mode the scale units are in texture repeats per face. In the planar texture mapping mode the scale units are in texture repeats per half meter. This is in contrast to the in-world editing tool, in which the planar texture scaling units are repeats per meter.&lt;br /&gt;
|caveats&lt;br /&gt;
|constants&lt;br /&gt;
|examples=&amp;lt;lsl&amp;gt;&lt;br /&gt;
//Scales the textures on 6 sides&lt;br /&gt;
float scale;&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        integer i;&lt;br /&gt;
        &lt;br /&gt;
        for( i = 1; i &amp;lt; 7; i++ )&lt;br /&gt;
        {&lt;br /&gt;
            scale = scale + .1;&lt;br /&gt;
            llScaleTexture( (float)scale, (float)scale, i);&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||[[llGetTextureScale]]}}&lt;br /&gt;
|also_tests&lt;br /&gt;
|also_events&lt;br /&gt;
|also_articles&lt;br /&gt;
|notes&lt;br /&gt;
|cat1=Texture&lt;br /&gt;
|cat2&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Arda Xi</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlOffsetTexture&amp;diff=55465</id>
		<title>LlOffsetTexture</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlOffsetTexture&amp;diff=55465"/>
		<updated>2008-02-23T15:22:21Z</updated>

		<summary type="html">&lt;p&gt;Arda Xi: changed pre into lsl.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Function/face|face|}}&lt;br /&gt;
{{LSL_Function&lt;br /&gt;
|func_id=55|func_sleep=0.2|func_energy=10.0&lt;br /&gt;
|func=llOffsetTexture&lt;br /&gt;
|p1_type=float|p1_name=u&lt;br /&gt;
|p2_type=float|p2_name=v&lt;br /&gt;
|p3_type=integer|p3_name=face&lt;br /&gt;
|func_desc=Sets the texture &#039;&#039;&#039;u&#039;&#039;&#039; &amp;amp; &#039;&#039;&#039;v&#039;&#039;&#039; offsets for the chosen &#039;&#039;&#039;face&#039;&#039;&#039;&lt;br /&gt;
|return_text&lt;br /&gt;
|spec&lt;br /&gt;
|caveats&lt;br /&gt;
|constants&lt;br /&gt;
|examples=&amp;lt;lsl&amp;gt;&lt;br /&gt;
//Offsets the textures on 6 sides&lt;br /&gt;
float offset;&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        integer i;&lt;br /&gt;
        &lt;br /&gt;
        for( i = 1; i &amp;lt; 7; i++ )&lt;br /&gt;
        {&lt;br /&gt;
            offset = offset + .1;&lt;br /&gt;
            llOffsetTexture( (float)offset, (float)offset, i);&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&lt;br /&gt;
|also_tests&lt;br /&gt;
|also_events&lt;br /&gt;
|also_articles&lt;br /&gt;
|notes&lt;br /&gt;
|cat1=Face&lt;br /&gt;
|cat2=Texture&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Arda Xi</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Dataserver_API&amp;diff=55352</id>
		<title>Dataserver API</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Dataserver_API&amp;diff=55352"/>
		<updated>2008-02-22T22:28:10Z</updated>

		<summary type="html">&lt;p&gt;Arda Xi: Changed pre tags into lsl tags.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
{{RightToc}}&lt;br /&gt;
=Dataserver Framework=&lt;br /&gt;
&lt;br /&gt;
===Introduction===&lt;br /&gt;
&lt;br /&gt;
A common problem in SL is reading and parsing notecards by script. One application for this is so a script can be distributed as no-mod but still be configurable.&lt;br /&gt;
&lt;br /&gt;
The below framework demonstrates how to setup such an interface with very little work to retool.&lt;br /&gt;
&lt;br /&gt;
The default state reads the notecard and when it is done it activates the configuration state.&lt;br /&gt;
&lt;br /&gt;
===Testimonial===&lt;br /&gt;
&lt;br /&gt;
The most common problem I find is people asking about dataservers, reading from notecards to bypass variables within a notecard so you can release your script as nomod.&lt;br /&gt;
So I setup a simple system that I use time and time again that can be reused in any project.&lt;br /&gt;
The class itself is state based meaning the default state reads the notecard and then starts another state when the notecard is read and ready to use I explain this further below.&lt;br /&gt;
&lt;br /&gt;
==Main Script==&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
string notecard_name = &amp;quot;configuration&amp;quot;;  // name of notecard goes here&lt;br /&gt;
&lt;br /&gt;
// internals&lt;br /&gt;
integer DEBUG = FALSE;&lt;br /&gt;
integer line;&lt;br /&gt;
key queryhandle;                   // to separate Dataserver requests&lt;br /&gt;
key notecarduuid;&lt;br /&gt;
&lt;br /&gt;
init()&lt;br /&gt;
{&lt;br /&gt;
    queryhandle = llGetNotecardLine(notecard_name, line = 0);// request line&lt;br /&gt;
    notecarduuid = llGetInventoryKey(notecard_name);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Config data loaded from notecard, with some sane defaults&lt;br /&gt;
integer channel = 1000;&lt;br /&gt;
string email_address = &amp;quot;revolution.perenti@skidzpartz.com&amp;quot;;&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    changed(integer change)         &lt;br /&gt;
    {&lt;br /&gt;
        // We want to reload channel notecard if it changed&lt;br /&gt;
        if (change &amp;amp; CHANGED_INVENTORY)&lt;br /&gt;
            if(notecarduuid != llGetInventoryKey(notecard_name))&lt;br /&gt;
                init();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        init();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    dataserver(key query_id, string data)&lt;br /&gt;
    {&lt;br /&gt;
        if (query_id == queryhandle)&lt;br /&gt;
        {&lt;br /&gt;
            if (data != EOF)&lt;br /&gt;
            {   // not at the end of the notecard&lt;br /&gt;
                // yay!  Parsing time&lt;br /&gt;
                &lt;br /&gt;
                // pesky whitespace&lt;br /&gt;
                data = llStringTrim(data, STRING_TRIM_HEAD);&lt;br /&gt;
&lt;br /&gt;
                // is it a comment?&lt;br /&gt;
                if (llGetSubString (data, 0, 0) != &amp;quot;#&amp;quot;)&lt;br /&gt;
                {&lt;br /&gt;
                    integer s = llSubStringIndex(data, &amp;quot;=&amp;quot;);&lt;br /&gt;
                    if(~s)//does it have an &amp;quot;=&amp;quot; in it?&lt;br /&gt;
                    {&lt;br /&gt;
                        string token = llToLower(llStringTrim(llDeleteSubString(data, s, -1), STRING_TRIM));&lt;br /&gt;
                        data = llStringTrim(llDeleteSubString(data, 0, s), STRING_TRIM);&lt;br /&gt;
&lt;br /&gt;
                        //Insert your token parsers here.&lt;br /&gt;
                        if (token == &amp;quot;email_address&amp;quot;)&lt;br /&gt;
                            email_address = data;&lt;br /&gt;
                        else if (token == &amp;quot;channel&amp;quot;)&lt;br /&gt;
                            channel = (integer)data;&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                queryhandle = llGetNotecardLine(notecard_name, ++line);&lt;br /&gt;
                if(DEBUG) llOwnerSay(&amp;quot;Notecard Data: &amp;quot; + data);&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                if(DEBUG) llOwnerSay(&amp;quot;Done Reading Notecard&amp;quot;);&lt;br /&gt;
                state configuration ;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
state configuration&lt;br /&gt;
{&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;
        llShout(0, &amp;quot;Channel set to &amp;quot; + (string)channel);&lt;br /&gt;
        llShout(0, &amp;quot;Email set to &amp;quot; + (string)email_address);&lt;br /&gt;
    }   &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Notecard==&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
# This is the configuration file&lt;br /&gt;
channel = 1000&lt;br /&gt;
email_address = phoenixcms@hotmail.co.uk&lt;br /&gt;
&lt;br /&gt;
# end&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
Lines that start with &amp;quot;#&amp;quot; are comments.&lt;br /&gt;
&lt;br /&gt;
==How It Works==&lt;br /&gt;
&lt;br /&gt;
The [[default]] [[state]] reads and parses all the lines in the notecard. As it reads the notecard it overwrites the default values with the values in the notecard. More specifically after each line has been validated and tokenized, the token is checked against supported tokens. If the token is supported the specific parser for the token is called, in the above example it is just a simple convert and copy. &lt;br /&gt;
&lt;br /&gt;
For technical support, requests, etc., use the Search under the Groups Tab and search for .::Prototype::.&lt;br /&gt;
&lt;br /&gt;
if you have any problems getting this script to work either contact me inworld [https://wiki.secondlife.com/wiki/User:Revolution_Perenti Revolution Perenti]&lt;br /&gt;
or visit out Open Source Section at skidz partz we have many different versions of this system.&lt;br /&gt;
[http://slurl.com/secondlife/Snow%20Crash/128/128/23 Snow Crash]&lt;br /&gt;
&lt;br /&gt;
{{LSLC|Library}}{{LSLC|Examples}}&lt;/div&gt;</summary>
		<author><name>Arda Xi</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Talk:Money_transfer_denied&amp;diff=55348</id>
		<title>Talk:Money transfer denied</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Talk:Money_transfer_denied&amp;diff=55348"/>
		<updated>2008-02-22T22:08:34Z</updated>

		<summary type="html">&lt;p&gt;Arda Xi: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Isn&#039;t this already possible by first requesting the permission and then using&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
    run_time_permissions (integer perm)&lt;br /&gt;
    {&lt;br /&gt;
        if(perm &amp;amp; PERMISSION_DEBIT)&lt;br /&gt;
        {&lt;br /&gt;
            //normal code if it is granted.&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            //code for your transfer denied event&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
What would be the difference? [[User:Arda Xi|Arda Xi]] 14:07, 22 February 2008 (PST)&lt;/div&gt;</summary>
		<author><name>Arda Xi</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Talk:Money_transfer_denied&amp;diff=55347</id>
		<title>Talk:Money transfer denied</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Talk:Money_transfer_denied&amp;diff=55347"/>
		<updated>2008-02-22T22:07:25Z</updated>

		<summary type="html">&lt;p&gt;Arda Xi: A comment added&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Isn&#039;t this already possible by first requesting the permission and then using&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
    run_time_permissions (integer perm)&lt;br /&gt;
    {&lt;br /&gt;
        if(perm &amp;amp; PERMISSION_DEBIT)&lt;br /&gt;
        {&lt;br /&gt;
            state ready;     &lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            //code for your transfer denied event&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
What would be the difference? [[User:Arda Xi|Arda Xi]] 14:07, 22 February 2008 (PST)&lt;/div&gt;</summary>
		<author><name>Arda Xi</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Self_Upgrading_Script_Enhanced&amp;diff=55103</id>
		<title>Self Upgrading Script Enhanced</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Self_Upgrading_Script_Enhanced&amp;diff=55103"/>
		<updated>2008-02-21T14:37:45Z</updated>

		<summary type="html">&lt;p&gt;Arda Xi: changed pre tags into lsl tags.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
Thanks to [[User:Markov Brodsky|Markov Brodsky]]&#039;s Self Upgrading Script and [[User:Jippen Faddoul|Jippen Faddoul]]&#039;s update to the idea, I was inspired to add to the flexibility and usefulness of their original works.&lt;br /&gt;
&lt;br /&gt;
Markov Brodsky&#039;s original code is quite good, and I based my own implementation upon it, but it has an admitted flaw: It requires that all the scripts that use it have no spaces within the name. For me this will not do. I like my space ;D&lt;br /&gt;
&lt;br /&gt;
Jippen Faddoul&#039;s update is also pretty good, but while it is nicely shortened and optimized, it can&#039;t handle being copied into the prim more than 2 times. This makes it unusable for my coding style. (Tweak, save, copy, test, repeat...)&lt;br /&gt;
&lt;br /&gt;
So here&#039;s my edition to fix those shortcomings. (You may use this code freely and distribute it freely, but DO NOT even try to SELL it.)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
// Self Upgrading Script by Cron Stardust based upon work by Markov Brodsky and Jippen Faddoul.  &lt;br /&gt;
// If this code is used, these header lines MUST be kept.&lt;br /&gt;
upgrade() {&lt;br /&gt;
    //Get the name of the script&lt;br /&gt;
    string self = llGetScriptName();&lt;br /&gt;
    &lt;br /&gt;
    string basename = self;&lt;br /&gt;
    &lt;br /&gt;
    // If there is a space in the name, find out if it&#039;s a copy number and correct the basename.&lt;br /&gt;
    if (llSubStringIndex(self, &amp;quot; &amp;quot;) &amp;gt;= 0) {&lt;br /&gt;
        // Get the section of the string that would match this RegEx: /[ ][0-9]+$/&lt;br /&gt;
        integer start = 2; // If there IS a version tail it will have a minimum of 2 characters.&lt;br /&gt;
        string tail = llGetSubString(self, llStringLength(self) - start, -1);&lt;br /&gt;
        while (llGetSubString(tail, 0, 0) != &amp;quot; &amp;quot;) {&lt;br /&gt;
            start++;&lt;br /&gt;
            tail = llGetSubString(self, llStringLength(self) - start, -1);&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        // If the tail is a positive, non-zero number then it&#039;s a version code to be removed from the basename.&lt;br /&gt;
        if ((integer)tail &amp;gt; 0) {&lt;br /&gt;
            basename = llGetSubString(self, 0, -llStringLength(tail) - 1);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    // Remove all other like named scripts.&lt;br /&gt;
    integer n = llGetInventoryNumber(INVENTORY_SCRIPT);&lt;br /&gt;
    while (n-- &amp;gt; 0) {&lt;br /&gt;
        string item = llGetInventoryName(INVENTORY_SCRIPT, n);&lt;br /&gt;
        &lt;br /&gt;
        // Remove scripts with same name (except myself, of course)&lt;br /&gt;
        if (item != self &amp;amp;&amp;amp; 0 == llSubStringIndex(item, basename)) {&lt;br /&gt;
            llRemoveInventory(item);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *&lt;br /&gt;
// * The real start of the universe.&lt;br /&gt;
// * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
default {&lt;br /&gt;
    state_entry() {&lt;br /&gt;
        upgrade();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
As far as my testing was able to show, I was able to have spaces in my script names and I was even able to tack on a number at the end of my script for personal version tracking and had no troubles. I was able to copy the script into the same prim over and over again with only the latest ever staying.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Due to the nature of SL, your script&#039;s name will alternate between &amp;quot;scriptname&amp;quot; and &amp;quot;scriptname 1&amp;quot;, where &amp;quot;scriptname&amp;quot; is the actual name of your script.&lt;br /&gt;
&lt;br /&gt;
[[Category:LSL Library]]&lt;/div&gt;</summary>
		<author><name>Arda Xi</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlList2String&amp;diff=55102</id>
		<title>LlList2String</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlList2String&amp;diff=55102"/>
		<updated>2008-02-21T14:28:44Z</updated>

		<summary type="html">&lt;p&gt;Arda Xi: changed pre tags into lsl tags.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function/negative index|true|index}}{{LSL_Function&lt;br /&gt;
|func_id=188|func_sleep=0.0|func_energy=10.0&lt;br /&gt;
|func=llList2String|return_type=string|p1_type=list|p1_name=src|p2_type=integer|p2_name=index&lt;br /&gt;
|func_footnote=If the type of the entry at &#039;&#039;&#039;index&#039;&#039;&#039; in &#039;&#039;&#039;src&#039;&#039;&#039; is not a string it is typecast into a string.&amp;lt;br/&amp;gt;If &#039;&#039;&#039;index&#039;&#039;&#039; is out of range it returns a {{HoverText|null string|null string: &amp;quot;&amp;quot;}}.&lt;br /&gt;
|func_desc&lt;br /&gt;
|return_text=that is at &#039;&#039;&#039;index&#039;&#039;&#039; in &#039;&#039;&#039;src&#039;&#039;&#039;.&lt;br /&gt;
|spec&lt;br /&gt;
|caveats&lt;br /&gt;
|constants&lt;br /&gt;
|examples=&amp;lt;lsl&amp;gt;//This code demonstrates the differences in typecasting in LSL (and demonstrates how to use the llList2* functions).&lt;br /&gt;
// Best viewed in Chat History (ctrl-h)&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        list my_list = [&amp;quot;a&amp;quot;, &amp;quot;0xFF&amp;quot;, &amp;quot;0xFF.FF&amp;quot;, &amp;quot;1.0e3&amp;quot;, 1, 2.0, &amp;lt;1,2,3&amp;gt;, &amp;lt;1,2,3,4&amp;gt;, llGetOwner()];&lt;br /&gt;
        integer i = 0;&lt;br /&gt;
        integer end = llGetListLength(my_list);&lt;br /&gt;
        for (; i&amp;lt;end; ++i)&lt;br /&gt;
        {&lt;br /&gt;
            llOwnerSay(&amp;quot;string=&amp;quot; + llList2String(my_list,i)&lt;br /&gt;
                        + &amp;quot;\n   integer=&amp;quot; + (string)llList2Integer(my_list,i) + &amp;quot; OR &amp;quot; +(string)((integer)llList2String(my_list,i))&lt;br /&gt;
                        + &amp;quot;\n   float=&amp;quot; + (string)llList2Float(my_list,i) + &amp;quot; OR &amp;quot; +(string)((float)llList2String(my_list,i))&lt;br /&gt;
                        + &amp;quot;\n   vector=&amp;quot; + (string)llList2Vector(my_list,i) + &amp;quot; OR &amp;quot; +(string)((vector)llList2String(my_list,i))&lt;br /&gt;
                        + &amp;quot;\n   rot=&amp;quot; + (string)llList2Rot(my_list,i) + &amp;quot; OR &amp;quot; +(string)((rotation)llList2String(my_list,i))&lt;br /&gt;
                        + &amp;quot;\n   key=&amp;quot; + (string)llList2Key(my_list,i) + &amp;quot; OR &amp;quot; +(string)((key)llList2String(my_list,i)) );&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||{{LSLG|llGetListEntryType}}|}}&lt;br /&gt;
{{LSL DefineRow||{{LSLG|llList2Float}}|}}&lt;br /&gt;
{{LSL DefineRow||{{LSLG|llList2Integer}}|}}&lt;br /&gt;
{{LSL DefineRow||{{LSLG|llList2Key}}|}}&lt;br /&gt;
|also_events&lt;br /&gt;
|also_tests&lt;br /&gt;
|also_articles&lt;br /&gt;
|notes=&lt;br /&gt;
To convert a string of hex nybbles to integer, call [[llList2String]] and then type cast that string result to integer.&lt;br /&gt;
&lt;br /&gt;
To convert that integer back to a string of hex nybbles, call [[hex]].&lt;br /&gt;
|permission&lt;br /&gt;
|cat1=List&lt;br /&gt;
|cat2&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Arda Xi</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Email&amp;diff=55100</id>
		<title>Email</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Email&amp;diff=55100"/>
		<updated>2008-02-21T14:14:26Z</updated>

		<summary type="html">&lt;p&gt;Arda Xi: Put in lsl tags&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Event&lt;br /&gt;
|event_id=21|event_delay&lt;br /&gt;
|event=email&lt;br /&gt;
|p1_type=string|p1_name=time|p1_desc&lt;br /&gt;
|p2_type=string|p2_name=address|p2_desc&lt;br /&gt;
|p3_type=string|p3_name=subj|p3_desc|&lt;br /&gt;
p4_type=string|p4_name=message|p4_desc&lt;br /&gt;
|p5_type=integer|p5_name=num_left|p5_desc&lt;br /&gt;
|event_desc=Triggered when task receives email&lt;br /&gt;
|constants&lt;br /&gt;
|spec&lt;br /&gt;
|caveats=*&#039;&#039;&#039;time&#039;&#039;&#039; is in the (string)[[llGetUnixTime]] format.&lt;br /&gt;
*The email queue is limited to 100 emails, any email after that is bounced.&lt;br /&gt;
|examples=&lt;br /&gt;
This application uses email to have objects check with a central server to see if the owner has the latest version. In the objects:&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
string version = &amp;quot;1&amp;quot;; //&lt;br /&gt;
string type = &amp;quot;lolcube&amp;quot;;&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    on_rez(integer start_param)&lt;br /&gt;
    {&lt;br /&gt;
        llEmail(&amp;quot;5a634b27-f032-283f-2df2-55ead7724b23@lsl.secondlife.com&amp;quot;,&lt;br /&gt;
            version,&lt;br /&gt;
            (string)llGetOwner()+&amp;quot;,&amp;quot;+type);&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/lsl&amp;gt;&lt;br /&gt;
The server:&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSetTimerEvent(15);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        llGetNextEmail(&amp;quot;&amp;quot;,&amp;quot;&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    email( string time, string address, string version, string message, integer num_left )&lt;br /&gt;
    {    &lt;br /&gt;
        if ((integer)version &amp;lt; 2)&lt;br /&gt;
        {&lt;br /&gt;
            list info = llCSV2List(llDeleteSubString(message, 0, llSubStringIndex(message, &amp;quot;\n\n&amp;quot;) + 1));&lt;br /&gt;
            llGiveInventory(llList2Key(info,0),llList2String(info,1));&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        integer i;&lt;br /&gt;
        for (i = 0; i &amp;lt; num_left; i++)&lt;br /&gt;
        {&lt;br /&gt;
            llGetNextEmail(&amp;quot;&amp;quot;,&amp;quot;&amp;quot;);&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_header&lt;br /&gt;
|also_events&lt;br /&gt;
|also_functions={{LSL DefineRow||[[llEmail]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llGetNextEmail]]|}}&lt;br /&gt;
|also_articles&lt;br /&gt;
|also_footer&lt;br /&gt;
|notes&lt;br /&gt;
|mode&lt;br /&gt;
|deprecated&lt;br /&gt;
|cat1=Email&lt;br /&gt;
|cat2&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Arda Xi</name></author>
	</entry>
</feed>