<?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=Omei+Qunhua</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=Omei+Qunhua"/>
	<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/wiki/Special:Contributions/Omei_Qunhua"/>
	<updated>2026-06-23T21:31:45Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Talk:LlRemoteLoadScriptPin&amp;diff=1204097</id>
		<title>Talk:LlRemoteLoadScriptPin</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Talk:LlRemoteLoadScriptPin&amp;diff=1204097"/>
		<updated>2016-07-27T18:25:03Z</updated>

		<summary type="html">&lt;p&gt;Omei Qunhua: Application script relocation request&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;What happens when &#039;target&#039; is an avatar key?  That makes no sense to me: an avatar can&#039;t run a script, only an object can. {{Unsigned}}&lt;br /&gt;
:Sorry that was an editing mistake I made a couple days ago when I changed the template (I forgot the template defaults to avatar and prim). -- &#039;&#039;&#039;[[User:Strife_Onizuka|Strife]]&#039;&#039;&#039; &amp;lt;sup&amp;gt;&amp;lt;small&amp;gt;([[User talk:Strife_Onizuka|talk]]|[[Special:Contributions/Strife_Onizuka|contribs]])&amp;lt;/small&amp;gt;&amp;lt;/sup&amp;gt; 11:50, 17 May 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
I have an object that spawns another object and then puts a script in it.  It works until I deed the object to a group.  Then I constantly get this error from the Spawner.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Unable to add item!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Anyone have a clue why this might happen?{{unsigned|Paradigm Brodsky|01:14, 18 February 2009}}&lt;br /&gt;
&lt;br /&gt;
:When you set it to group, the next owner permissions should apply. So it can be that it is no mod and therefor doesn&#039;t accept a script.&lt;br /&gt;
:[[Image:Zai_signature.png|45px]] &#039;&#039;&#039;[[User:Zai Lynch|Lynch]]&#039;&#039;&#039; &amp;lt;sup&amp;gt;&amp;lt;small&amp;gt;([[User talk:Zai Lynch|talk]]|[[Special:Contributions/Zai Lynch|contribs]])&amp;lt;/small&amp;gt;&amp;lt;/sup&amp;gt; 01:52, 18 February 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
The rezzed object has transfer, modify, and copy permissions.{{unsigned|Paradigm Brodsky|04:26, 18 February 2009}}&lt;br /&gt;
&lt;br /&gt;
:Hmm... How about the script you&#039;d like to transfer. Is it copyable? I guess I&#039;m clueless otherwise...&lt;br /&gt;
:You deeded the spawner to the group, right? Otherwise you might need modifiy permissions on group items and (maybe) your group activated... But I&#039;m just guessing here, to be honest.&lt;br /&gt;
:[[Image:Zai_signature.png|45px]] &#039;&#039;&#039;[[User:Zai Lynch|Lynch]]&#039;&#039;&#039; &amp;lt;sup&amp;gt;&amp;lt;small&amp;gt;([[User talk:Zai Lynch|talk]]|[[Special:Contributions/Zai Lynch|contribs]])&amp;lt;/small&amp;gt;&amp;lt;/sup&amp;gt; 04:57, 18 February 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
Thanks for your help.  I&#039;ve got it. The script was copyable, but not transferable.  You need copy and transfer permissions if it&#039;s deeded to a group.  Odd thing is that transfer permission isn&#039;t required for the script if you transfer the device to another ave.{{unsigned|Paradigm Brodsky|05:22, 18 February 2009}}&lt;br /&gt;
&lt;br /&gt;
:Very welcome =) I added the caveat to the article. Wouldn&#039;t have imagined that it needs this permission... Nice to know!&lt;br /&gt;
:Btw: You can sign your comments in the Wiki with four tildes (&amp;lt;nowiki&amp;gt;~~~~&amp;lt;/nowiki&amp;gt;). They will automatically be converted into your username as well as a timestamp. That helps to keep track on discussion pages.&lt;br /&gt;
:Greetz :-) [[Image:Zai_signature.png|45px]] &#039;&#039;&#039;[[User:Zai Lynch|Lynch]]&#039;&#039;&#039; &amp;lt;sup&amp;gt;&amp;lt;small&amp;gt;([[User talk:Zai Lynch|talk]]|[[Special:Contributions/Zai Lynch|contribs]])&amp;lt;/small&amp;gt;&amp;lt;/sup&amp;gt; 06:22, 18 February 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
== I was just wondering.... ==&lt;br /&gt;
&lt;br /&gt;
I couldn&#039;t think of a better place to ask this soo...&lt;br /&gt;
&lt;br /&gt;
In what way can a [[script]] [[UUID]] be useful to a scripter? Can it be used to access the script in any way? -- &#039;&#039;&#039;[[User:EddyFragment Robonaught|Eddy]]&#039;&#039;&#039;  &amp;lt;sup&amp;gt;&amp;lt;small&amp;gt;([[User talk:EddyFragment_Robonaught|talk]]|[[Special:Contributions/EddyFragment_Robonaught|contribs]])&amp;lt;/small&amp;gt;&amp;lt;/sup&amp;gt; 07:05, 8 August 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
== RE: examples section ==&lt;br /&gt;
&lt;br /&gt;
Can anyone please post a example for using actually llRemoteLoadScriptPin() ??  The current example is not for this but in fact for llSetRemoteScriptAccessPin.  I am copying this example to the proper function page and will leave this one in place for now till hopefully someone or myself can post up a example for this. &lt;br /&gt;
&lt;br /&gt;
[[User:Bato Brendel|Bato Brendel]] 19:27, 9 December 2010 (UTC)  Bato Brendel&lt;br /&gt;
&lt;br /&gt;
:It&#039;s not great but it&#039;s hard to do a good example for this IMHO. -- &#039;&#039;&#039;[[User:Strife_Onizuka|Strife]]&#039;&#039;&#039; &amp;lt;sup&amp;gt;&amp;lt;small&amp;gt;([[User talk:Strife_Onizuka|talk]]|[[Special:Contributions/Strife_Onizuka|contribs]])&amp;lt;/small&amp;gt;&amp;lt;/sup&amp;gt; 07:35, 10 December 2010 (UTC)&lt;br /&gt;
&lt;br /&gt;
== RE: examples section ==&lt;br /&gt;
&lt;br /&gt;
Please can the section headed &amp;quot;Rez and copy a file from a control object&amp;quot; be moved elsewhere. I suggest this is a demonstration of all that is worst about this Wiki. It is full of mumbo-jumbo magic numbers, has absolutely no explanations supplied in the scripts, and, I submit, 95% of it has nothing to do with explaining the function in question. And what is the point in setting the timer to zero, and then to a non-zero value later in the same UDF? If the purpose of the Wiki is to totally confuse readers, then by all means carry on :) [[User:Omei Qunhua|Omei Qunhua]] ([[User talk:Omei Qunhua|talk]]) 11:25, 27 July 2016 (PDT)&lt;/div&gt;</summary>
		<author><name>Omei Qunhua</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LSL_101/The_touch_start_Event&amp;diff=1199901</id>
		<title>LSL 101/The touch start Event</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LSL_101/The_touch_start_Event&amp;diff=1199901"/>
		<updated>2016-04-18T13:34:38Z</updated>

		<summary type="html">&lt;p&gt;Omei Qunhua: Correct some misconceptions&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:LSL 101]]&lt;br /&gt;
{{NavNextPrev|prev=Event Handler Parameters|next=Variables}} &lt;br /&gt;
{{LSL Wikibook Index}}&lt;br /&gt;
&lt;br /&gt;
===[[Touch_start | The Touch Start Event]]===&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Here&#039;s our sample program, with a second event handler added.  The touch_start event occurs whenever any avatar clicks on the object containing the script.  Note again that the name of the event must be typed touch_start, with the underscore.  (The underscore doesn&#039;t show up in the title of this page just because the Wiki software displays underscores in titles as spaces.)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
     state_entry()&lt;br /&gt;
     {&lt;br /&gt;
          // Let the object&#039;s owner know the script is working&lt;br /&gt;
          llOwnerSay( &amp;quot;Congratulations! Your script has started to execute.&amp;quot; );&lt;br /&gt;
     }&lt;br /&gt;
&lt;br /&gt;
     touch_start( integer num_detected )&lt;br /&gt;
     {&lt;br /&gt;
          // Let the object&#039;s owner know the script is working&lt;br /&gt;
          llOwnerSay( &amp;quot;I&#039;ve been touched!&amp;quot; );&lt;br /&gt;
     }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The event is called &amp;quot;touch_start&amp;quot; because it is the event that is raised at the beginning of a left mouse click on the object. If you want an event to occur when the click ends (when the mouse button is released) you would use the event &amp;quot;touch_end&amp;quot;. Also available is the event &amp;quot;touch&amp;quot; which keeps firing repeatedly during the time that the mouse button is depressed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===integer num_detected===&lt;br /&gt;
&lt;br /&gt;
By default, the script editing tools follow &amp;quot;touch_start&amp;quot; by (integer num_detected). This is telling you that the server is passing an integer value to your script as part of the touch event. This integer tells you how may avatars &amp;quot;simultaneously&amp;quot; clicked on the object during the last clock frame (22mS) - it is NOT necessarily a cumulative count of clicks since the last touch_event was raised. &lt;br /&gt;
&lt;br /&gt;
You can rename the variable to any name of your own choosing, but it must be defined as being an integer. e.g. your could write:    touch_start(integer num)&lt;br /&gt;
The major use of this integer is in determining what parameter values can be passed to any of the llDetected... functions when executing the touch event.&lt;br /&gt;
&lt;br /&gt;
Consider this script:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;integer TotalTouches = 0;  // we set the initial touch value to zero&lt;br /&gt;
// Every time the box it touched, it will count up one round number (&amp;quot;integer&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
     touch_start( integer num_detected )&lt;br /&gt;
     {&lt;br /&gt;
          TotalTouches = TotalTouches + num_detected;&lt;br /&gt;
               // Update the total number of touches&lt;br /&gt;
&lt;br /&gt;
          &lt;br /&gt;
          llOwnerSay( &amp;quot;I have been touched a total of &amp;quot; + (string)TotalTouches + &amp;quot; times.&amp;quot; );&lt;br /&gt;
              // Announce the current total&lt;br /&gt;
     }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The variable set above default (global variable) called  &#039;&#039;TotalTouches&#039;&#039; counts the total number of times our object is touched.  Each time the touch_start event handler is called, the sim server initializes &#039;&#039;num_detected&#039;&#039; to be the number of times the object was touched since the previous execution of &#039;&#039;touch_start&#039;&#039;.  If you test this by yourself, chances are that &#039;&#039;TotalTouches &#039;&#039; will always be incrementing by one.  But if you get a bunch of your friends together and have them all touch the object as rapidly as they can, sometimes you will see &#039;&#039;TotalTouches&#039;&#039; incrementing by more than one.&lt;br /&gt;
&lt;br /&gt;
If a user clicks on your object many times, the touch_start event handler code will generally get executed many times, once for each click.  But if multiple users click on your object at approximately the same time, SL may not invoke your code for each one separately.  Instead, it may combine two or more of the touches into one event.  In case your script really needs to respond separately to each touch, SL will tell you how many touches an execution of the touch_start event handler represents.  That&#039;s the purpose of the phrase &amp;quot;integer num_detected&amp;quot; between the parentheses following touch_start.  But before fully explaining how that works, we need to learn some other things, so we won&#039;t elaborate on that yet.&lt;br /&gt;
&lt;br /&gt;
== Summary ==&lt;br /&gt;
There are many events (about 38 different ones) and most of them have one or more parameters (that&#039;s those things like &amp;quot;integer num_detected&amp;quot; that follow them in the parenthesis).  The details will differ with the event, but the idea is always the same.  Each event handler handles one particular type of event and the parameters in the event handler provide the script with the specific details of the event.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Please continue this tutorial with [[LSL_101/Variables |Variables]].&#039;&#039;&#039;&lt;/div&gt;</summary>
		<author><name>Omei Qunhua</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LSL_101/LSL_in_Focus:_Integers&amp;diff=1199877</id>
		<title>LSL 101/LSL in Focus: Integers</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LSL_101/LSL_in_Focus:_Integers&amp;diff=1199877"/>
		<updated>2016-04-14T21:47:14Z</updated>

		<summary type="html">&lt;p&gt;Omei Qunhua: Further corrections.  x &amp;amp;&amp;amp;= y;  and   x ||=y;  are invalid statements. &amp;quot;For Example&amp;quot; is written e.g.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{NavNextPrev|prefix=LSL in Focus:_|prev=Types|topic=Language Topics in Focus|next=Floats}}&lt;br /&gt;
&lt;br /&gt;
__TOC__&lt;br /&gt;
&lt;br /&gt;
Integers in LSL roughly correspond to integers in mathematics.  They can be written in either the familiar decimal (e.g. 20, 0, -1) or [[#Hexadecimal Notation|hexadecimal]] (e.g. 0x14, 0x0, 0xFFFFFFFF).&lt;br /&gt;
&lt;br /&gt;
Integers in LSL are used in four distinct ways:&lt;br /&gt;
* Signed integers&lt;br /&gt;
* Truth values (Booleans)&lt;br /&gt;
* Enumerations&lt;br /&gt;
* Bit vectors&lt;br /&gt;
&lt;br /&gt;
There are a three operators, namely = (assignment), == (test for equality) and != (test for inequality) that are common to all uses of integers.  Other than those, the four different uses of integers generally involve separate sets of operators.&lt;br /&gt;
&lt;br /&gt;
== Signed Integers ==&lt;br /&gt;
This is the use of integers that corresponds to the normal use in mathematics.  The only substantive difference is that in mathematics, there are infinitely many integers, while in LSL integers are limited to the range −2,147,483,648 to 2,147,483,647.  Also, in LSL, no commas or other separators are allowed when writing integers, so these numbers would be written −2147483648 and 2147483647.&lt;br /&gt;
&lt;br /&gt;
=== Arithmetic Operators ===&lt;br /&gt;
LSL has the normal arithmetic operators +, -, * and / (for division).  The first three have the same meaning as what you used in grade school &#039;&#039;&#039;as long as the result is in the range −2147483648 to 2147483647&#039;&#039;&#039;.  If the result is outside that range, different rules apply. The typical scripter doesn&#039;t need to use numbers that are so big (or small), so there&#039;s nor reason to feel you need to learn the details of what happens when the limits are exceeded.  But there are instances where it is actually useful to allow numbers to exceed the limits. For the details of what happens in that case, see the Integer Overflow section, below.&lt;br /&gt;
&lt;br /&gt;
Division of integers in LSL is a variation on what you learned in elementary school. If the division results in a whole number, say 10/2, the answer is 5.  But 15/2 is neither 7.5 nor 7 with a remainder of 1.  Instead, it is exactly 7.  Any remainder is simply thrown away.  Alternatively, you can think of it as being rounded toward zero.  It&#039;s more accurate to say &amp;quot;rounded toward zero&amp;quot; than &amp;quot;rounded down&amp;quot;, because -15/2 is -7, not -8.  If you&#039;re scripting something where you really want 15 divided by 2 to be 7.5, don&#039;t despair.  You&#039;ll just need to use the &amp;quot;float&amp;quot; type instead of integers.&lt;br /&gt;
&lt;br /&gt;
Closely related to integer division is the remainder operator, written as %.  It gives you what would remain if you were to ask for integer division on the same numbers.  Here are some examples:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt; integer i;&lt;br /&gt;
 i = 15 % 2;     // i is assigned the value 1&lt;br /&gt;
 i = 15 % 4;     // i is assigned the value 3&lt;br /&gt;
 i = -15 % 4;    // i is assigned the value -3&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If an attempt is made to divide by 0 (using either / or %), a run-time error occurs and script execution halts.&lt;br /&gt;
&lt;br /&gt;
Each of the arithmetic operators also has a corresponding assignment type operation.  For example&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt; integer x;&lt;br /&gt;
 integer y;&lt;br /&gt;
 x += y;    // Synonymous with x = x + y;&lt;br /&gt;
 x -= y;    // Synonymous with x = x - y;&lt;br /&gt;
 x *= y;    // Synonymous with x = x * y;&lt;br /&gt;
 x /= y;    // Synonymous with x = x / y;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In addition, since incrementing or decrementing by 1 is quite common, is special unary operator for that. The operator is written ++ and is pronounced plus-plus. To increment the variable i by 1, we can write either ++i or i++.  So for example&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt; integer i = 0;&lt;br /&gt;
 i++;     // i now has the value of 1&lt;br /&gt;
 ++i;     // i now has the value of 2&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
But the two operators are not identical, because i++ and ++i are expressions that can occur as part of a larger expression.  When used as part of a larger expression, i++ contributes its value to the expression &#039;&#039;before&#039;&#039; it is incremented.  For example, the fragment&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt; integer i = 0;&lt;br /&gt;
 if (i++ == 0)&lt;br /&gt;
    llSay( 0, &amp;quot;The value of i was 0 when the comparison was done&amp;quot; )&lt;br /&gt;
 else&lt;br /&gt;
    llSay( 0, &amp;quot;The value of i was 1 when the comparison was done&amp;quot; )&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
would chat &amp;quot;The value of i was 0 when the comparison was done&amp;quot; even though i ends up with the value of 1.  On the other hand, if we switch i++ to ++i, e.g.:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt; integer i = 0;&lt;br /&gt;
 if (++i == 0)&lt;br /&gt;
    llSay( 0, &amp;quot;The value of i was 0 when the comparison was done&amp;quot; )&lt;br /&gt;
 else&lt;br /&gt;
    llSay( 0, &amp;quot;The value of i was 1 when the comparison was done&amp;quot; )&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
the chat output would be &amp;quot;The value of i was 1 when the comparison was done&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The operator minus-minus (written --) works similarly, but by decrementing (-1) rather than incrementing (+1).&lt;br /&gt;
&lt;br /&gt;
=== Comparison Operators ===&lt;br /&gt;
In addition to the arithmetic operators, there are also the normal integer comparison operators &amp;lt; (less than) and &amp;gt; (greater than).  For &amp;quot;less than or equal&amp;quot;, or &amp;quot;greater than or equal&amp;quot;, there are two-character operators &amp;lt;= and &amp;gt;=.  There can&#039;t be any space between the two characters of a two-character operator. &lt;br /&gt;
&lt;br /&gt;
The result of a comparison operator is either 0 (representing &#039;&#039;&#039;FALSE&#039;&#039;&#039;) or 1 (representing &#039;&#039;&#039;TRUE&#039;&#039;&#039;).  See [[#Truth Values (Booleans)|Truth Values (Booleans)]].&lt;br /&gt;
&lt;br /&gt;
=== Integer Overflow ===&lt;br /&gt;
* During script execution, integers wraps from 2147483647 to -2147483648 in the normal way&lt;br /&gt;
* The compiler treats integers outside the range -2147483648 to 2147483647 somewhat strangely.  No compile time warning or error is generated. (If the following explanation, doesn&#039;t make sense to you don&#039;t worry -- just know to avoid using numbers outside the valid range in your script.)  &lt;br /&gt;
** For an integer outside the range -2147483648 to 2147483647, the absolute value of the number is reduced to fall in the range 0 to 4294967295 (0xFFFFFFFF).  &lt;br /&gt;
** This number is then parsed as an unsigned 32 bit integer and cast to the corresponding signed integer.  &lt;br /&gt;
** If the value in the script had a negative sign, the sign of the internal representation is switched.&lt;br /&gt;
** The net effect is that very large positive numbers get mapped to -1 and very large negative numbers get mapped to 1.&lt;br /&gt;
&lt;br /&gt;
== Truth Values (Booleans) ==&lt;br /&gt;
There is not a special type for TRUE and FALSE in LSL.  Instead, TRUE is defined to be the integer 1 and FALSE is defined to be the integer 0.&lt;br /&gt;
&lt;br /&gt;
This has an interesting consequence in a conditional statement.  Consider the following example&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt; integer i = 3;     // 3 is neither TRUE nor FALSE&lt;br /&gt;
 if (i)&lt;br /&gt;
    llSay( 0, &amp;quot;i is treated as being true.&amp;quot; );&lt;br /&gt;
 else&lt;br /&gt;
    llSay( 0, &amp;quot;i is treated as being false.&amp;quot; );&lt;br /&gt;
 if (i == TRUE)&lt;br /&gt;
    llSay( 0, &amp;quot;i is equal to TRUE.&amp;quot; );&lt;br /&gt;
 else&lt;br /&gt;
    llSay( 0, &amp;quot;i is not equal to TRUE.&amp;quot; );&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When run, the output will be&lt;br /&gt;
&lt;br /&gt;
 i is treated as being true.&lt;br /&gt;
 i is not equal to TRUE.&lt;br /&gt;
&lt;br /&gt;
This is because the condition in the &#039;&#039;&#039;if&#039;&#039;&#039; statement can be any integer.  Any non-zero value will cause the &#039;&#039;true&#039;&#039; block or statement to be executed, while a zero value will cause the &#039;&#039;false&#039;&#039; block or statement to be executed.&lt;br /&gt;
&lt;br /&gt;
The same zero/non-zero distinction is made wherever a truth value is expected.  In what follows, we&#039;ll use the word &#039;&#039;&#039;true&#039;&#039;&#039; and &#039;&#039;&#039;false&#039;&#039;&#039; to mean non-zero versus zero, while &#039;&#039;&#039;TRUE&#039;&#039;&#039; and &#039;&#039;&#039;FALSE&#039;&#039;&#039; will mean one and zero.&lt;br /&gt;
&lt;br /&gt;
=== Truth Value Operators ===&lt;br /&gt;
&lt;br /&gt;
There are three truth value operators in LSL:&lt;br /&gt;
* ! (representing &#039;&#039;&#039;not&#039;&#039;&#039;)&lt;br /&gt;
* &amp;amp;&amp;amp; (representing &#039;&#039;&#039;and&#039;&#039;&#039;)&lt;br /&gt;
* || (representing &#039;&#039;&#039;or&#039;&#039;&#039;)&lt;br /&gt;
&lt;br /&gt;
The ! operator takes a single operand and evaluates to &#039;&#039;&#039;TRUE&#039;&#039;&#039; if the operand is false, and &#039;&#039;&#039;FALSE&#039;&#039;&#039; otherwise.  For example&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt; integer i;&lt;br /&gt;
 i = !(3 == 7);     // 3 == 7 is FALSE, so i gets the value TRUE&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The &amp;amp;&amp;amp; operator takes two operands and evaluates to &#039;&#039;&#039;TRUE&#039;&#039;&#039; if both its operands are true, and &#039;&#039;&#039;FALSE&#039;&#039;&#039; otherwise.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt; i = (3 &amp;lt; 7) &amp;amp;&amp;amp; (3 &amp;gt; 7);     // 3 &amp;lt; 7 is TRUE, but (3 &amp;gt; 7) is FALSE, so i gets the value FALSE&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The || operator takes two operands and evaluates to &#039;&#039;&#039;TRUE&#039;&#039;&#039; if either one of its operands are true, and &#039;&#039;&#039;FALSE&#039;&#039;&#039; otherwise.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt; i = (3 &amp;lt; 7) || (3 &amp;gt; 7);     // one of the operands (3 &amp;lt; 7) is TRUE, so i gets the value TRUE&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Statements Requiring Truth Values ===&lt;br /&gt;
There are four statement types that require a truth value condition:&lt;br /&gt;
* if&lt;br /&gt;
* for&lt;br /&gt;
* while&lt;br /&gt;
* do-while&lt;br /&gt;
&lt;br /&gt;
== Enumerations ==&lt;br /&gt;
Many built-in functions have a parameter or return value that takes one of a fixed number of alternatives.  For example, [[llAttachToAvatar]] has a single parameter which specifies the attachment point.  The attachment point is specified to be an integer, but the specific integer corresponding to each attachment point is arbitrary. Since the numbers themselves have no significance, LSL defines names such as [[ATTACH_HEAD]], [[ATTACH_LFOOT]] and [[ATTACH_BELLY]], which are simply meaningful names for the arbitrary integers.  Integers used in this way are called &#039;&#039;&#039;enumerations&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
Generally, no operators besides the ubiquitous =, == and != are used with enumerations because there is no expected relationship between the arbitrarily selected integer values.&lt;br /&gt;
&lt;br /&gt;
== Bit Vectors ==&lt;br /&gt;
&lt;br /&gt;
=== Bit Vector Operators ===&lt;br /&gt;
Analogous to the truth value operators, LSL defines four operators specifically for bit vectors:&lt;br /&gt;
&lt;br /&gt;
* ~ (bitwise not)&lt;br /&gt;
* &amp;amp; (bitwise and)&lt;br /&gt;
* | (bitwise or)&lt;br /&gt;
* ^ (bitwise exclusive or)&lt;br /&gt;
&lt;br /&gt;
In contrast to the truth value operators, these operate independently on each bit position.&lt;br /&gt;
&lt;br /&gt;
The corresponding assignment operators such as |= are not supported in LSL.&lt;br /&gt;
&lt;br /&gt;
== Other Uses of Integers ==&lt;br /&gt;
&lt;br /&gt;
Although the four uses described above cover all the ways that integers are used with LSL built-in functions, they are not really exhaustive of the ways integers &#039;&#039;can&#039;&#039; be used.  There are algorithms in mathematics and computer science that mix arithmetic and bit vector operations, along with bit shift operators.  LSL supports this kind of computation with the bit shift operators inherited from C:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;&amp;lt; shift bits left&lt;br /&gt;
* &amp;gt;&amp;gt; shift bits right&lt;br /&gt;
&lt;br /&gt;
Contrary to previous information on this page, bit shift assignment operators, &amp;gt;&amp;gt;= and &amp;lt;&amp;lt;=  are not permitted in LSL.&lt;br /&gt;
&lt;br /&gt;
Discussion of these algorithms is beyond the scope of this article, but see [http://graphics.stanford.edu/~seander/bithacks.html Bit Twiddling Hacks] for some examples.&lt;br /&gt;
&lt;br /&gt;
== Type conversions ==&lt;br /&gt;
=== Other types to integers ===&lt;br /&gt;
Casting a positive float to an integer has the same end effect as using the [[llFloor]] function. A negative float can produce different results from the two operations.&lt;br /&gt;
&lt;br /&gt;
=== Integers to other types ===&lt;br /&gt;
&lt;br /&gt;
== Differences between Integers in LSL and in C ==&lt;br /&gt;
Much of LSL is patterned after the C programming language, and integers are no exception.  Programmers who already know C can immediately apply most of their understanding of integers to LSL.&lt;br /&gt;
&lt;br /&gt;
Differences to note are&lt;br /&gt;
* The type must be spelled &#039;&#039;integer&#039;&#039; instead of &#039;&#039;int&#039;&#039;.&lt;br /&gt;
* There are no size modifiers (short, long, ...).  All integers are 32 bits.&lt;br /&gt;
* There is no unsigned modifier.  All integers are signed.&lt;br /&gt;
* Comparison operators evaluate to an integer (1 or 0), as they did in C prior to C99.&lt;br /&gt;
* The &amp;amp;&amp;amp; and || operators are strict, i.e. both operands are always evaluated, even if the result can be determined after evaluating the left operand.&lt;br /&gt;
&lt;br /&gt;
== Hexadecimal Notation ==&lt;br /&gt;
There&#039;s actually not much use for hexadecimal notation in LSL.  If you do feel a need to use it, you probably already know how it works.  If not, you can consult {{Wikipedia|Hexadecimal notation|Wikipedia}}.&lt;/div&gt;</summary>
		<author><name>Omei Qunhua</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Basic_Notecard_Reader&amp;diff=1199775</id>
		<title>Basic Notecard Reader</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Basic_Notecard_Reader&amp;diff=1199775"/>
		<updated>2016-03-24T20:24:20Z</updated>

		<summary type="html">&lt;p&gt;Omei Qunhua: dupl. tag&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
=Basic Notecard Reader=&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
Quite often i read in configuration settings from a notecard.  I thought i should stick up the core part of my notecard reading script.  It&#039;s not exactly rocket science but hoepfully it&#039;s useful.&lt;br /&gt;
&lt;br /&gt;
==The Script==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
string      NOTECARD = &amp;quot;notecard&amp;quot;;&lt;br /&gt;
integer     intLine1;&lt;br /&gt;
key         keyConfigQueryhandle;&lt;br /&gt;
key         keyConfigUUID;&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        if (llGetInventoryType(NOTECARD) == INVENTORY_NONE)&lt;br /&gt;
        {&lt;br /&gt;
            llSay(DEBUG_CHANNEL, &amp;quot;The notecard &#039;&amp;quot;+NOTECARD+&amp;quot;&#039;  is missing!&amp;quot;);&lt;br /&gt;
            state main;&lt;br /&gt;
        }&lt;br /&gt;
        keyConfigQueryhandle = llGetNotecardLine(NOTECARD, intLine1);&lt;br /&gt;
        keyConfigUUID = llGetInventoryKey(NOTECARD);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    dataserver(key keyQueryId, string strData)&lt;br /&gt;
    {&lt;br /&gt;
        if (keyQueryId == keyConfigQueryhandle)&lt;br /&gt;
        {&lt;br /&gt;
            if (strData == EOF)&lt;br /&gt;
                state main;&lt;br /&gt;
&lt;br /&gt;
            keyConfigQueryhandle = llGetNotecardLine(NOTECARD, ++intLine1);&lt;br /&gt;
&lt;br /&gt;
            strData = llStringTrim(strData, STRING_TRIM_HEAD);      // Trim Whitespace; (not mandatory; if you use a space as marker you must erase this line&lt;br /&gt;
            if (llGetSubString (strData, 0, 0) != &amp;quot;#&amp;quot;)              // is it a comment?&lt;br /&gt;
            {&lt;br /&gt;
                // OK .. now we do somthing in here with our notecard&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
state main&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        // rest of script execution here&lt;br /&gt;
    }&lt;br /&gt;
    changed(integer intChange)&lt;br /&gt;
    {&lt;br /&gt;
        if (intChange &amp;amp; CHANGED_INVENTORY)&lt;br /&gt;
        {   // If the notecard has changed, then reload the notecard&lt;br /&gt;
            if (keyConfigUUID != llGetInventoryKey(NOTECARD))&lt;br /&gt;
                llResetScript();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
*[[ Script_Library | Script Library ]]&lt;/div&gt;</summary>
		<author><name>Omei Qunhua</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Basic_Notecard_Reader&amp;diff=1199774</id>
		<title>Basic Notecard Reader</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Basic_Notecard_Reader&amp;diff=1199774"/>
		<updated>2016-03-24T20:22:35Z</updated>

		<summary type="html">&lt;p&gt;Omei Qunhua: Script diddn&amp;#039;t compile ... etc.  etc.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
=Basic Notecard Reader=&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
Quite often i read in configuration settings from a notecard.  I thought i should stick up the core part of my notecard reading script.  It&#039;s not exactly rocket science but hoepfully it&#039;s useful.&lt;br /&gt;
&lt;br /&gt;
==The Script==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
string      NOTECARD = &amp;quot;notecard&amp;quot;;&lt;br /&gt;
integer     intLine1;&lt;br /&gt;
key         keyConfigQueryhandle;&lt;br /&gt;
key         keyConfigUUID;&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        if (llGetInventoryType(NOTECARD) == INVENTORY_NONE)&lt;br /&gt;
        {&lt;br /&gt;
            llSay(DEBUG_CHANNEL, &amp;quot;The notecard &#039;&amp;quot;+NOTECARD+&amp;quot;&#039;  is missing!&amp;quot;);&lt;br /&gt;
            state main;&lt;br /&gt;
        }&lt;br /&gt;
        keyConfigQueryhandle = llGetNotecardLine(NOTECARD, intLine1);&lt;br /&gt;
        keyConfigUUID = llGetInventoryKey(NOTECARD);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    dataserver(key keyQueryId, string strData)&lt;br /&gt;
    {&lt;br /&gt;
        if (keyQueryId == keyConfigQueryhandle)&lt;br /&gt;
        {&lt;br /&gt;
            if (strData == EOF)&lt;br /&gt;
                state main;&lt;br /&gt;
&lt;br /&gt;
            keyConfigQueryhandle = llGetNotecardLine(NOTECARD, ++intLine1);&lt;br /&gt;
&lt;br /&gt;
            strData = llStringTrim(strData, STRING_TRIM_HEAD);      // Trim Whitespace; (not mandatory; if you use a space as marker you must erase this line&lt;br /&gt;
            if (llGetSubString (strData, 0, 0) != &amp;quot;#&amp;quot;)              // is it a comment?&lt;br /&gt;
            {&lt;br /&gt;
                // OK .. now we do somthing in here with our notecard&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
state main&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        // rest of script execution here&lt;br /&gt;
    }&lt;br /&gt;
    changed(integer intChange)&lt;br /&gt;
    {&lt;br /&gt;
        if (intChange &amp;amp; CHANGED_INVENTORY)&lt;br /&gt;
        {   // If the notecard has changed, then reload the notecard&lt;br /&gt;
            if (keyConfigUUID != llGetInventoryKey(NOTECARD))&lt;br /&gt;
                llResetScript();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==See also==&lt;br /&gt;
*[[ Script_Library | Script Library ]]&lt;/div&gt;</summary>
		<author><name>Omei Qunhua</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=At_target&amp;diff=1199210</id>
		<title>At target</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=At_target&amp;diff=1199210"/>
		<updated>2016-02-22T22:32:11Z</updated>

		<summary type="html">&lt;p&gt;Omei Qunhua: Complete the example so that the object actually moves to the target&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Event|event_id=16|event_delay|event=at_target&lt;br /&gt;
|p1_type=integer|p1_name=tnum|p1_desc=[[llTarget]] return&lt;br /&gt;
|p2_type=vector|p2_name=targetpos|p2_desc=[[llTarget]] position parameter&lt;br /&gt;
|p3_type=vector|p3_name=ourpos|p3_desc=current position (similar to [[llGetPos]])&lt;br /&gt;
|event_desc=Result of {{LSLG|llTarget}} library function call&lt;br /&gt;
|constants&lt;br /&gt;
|spec&lt;br /&gt;
|caveats&lt;br /&gt;
|examples=&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
integer target_id;&lt;br /&gt;
vector target_pos;&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        target_pos = llGetPos() + &amp;lt;5.0, 0.0, 0.0&amp;gt;;&lt;br /&gt;
        target_id = llTarget(target_pos, 0.5);&lt;br /&gt;
        llSetStatus(STATUS_PHYSICS, TRUE);&lt;br /&gt;
        llMoveToTarget(target_pos, 0.4);&lt;br /&gt;
    }&lt;br /&gt;
    at_target(integer tnum, vector targetpos, vector ourpos)&lt;br /&gt;
    {&lt;br /&gt;
        if (tnum == target_id)&lt;br /&gt;
        {&lt;br /&gt;
            llOwnerSay(&amp;quot;object is within range of target&amp;quot;);&lt;br /&gt;
            llOwnerSay(&amp;quot;target position: &amp;quot; + (string)targetpos + &amp;quot;, object is now at: &amp;quot; + (string)ourpos);&lt;br /&gt;
            llOwnerSay(&amp;quot;this is &amp;quot; + (string)llVecDist(targetpos, ourpos) + &amp;quot; meters from the target&amp;quot;);&lt;br /&gt;
            llTargetRemove(target_id);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    not_at_target()&lt;br /&gt;
    {&lt;br /&gt;
        llOwnerSay(&lt;br /&gt;
            &amp;quot;not there yet - object is at &amp;quot; + (string)llGetPos() + &lt;br /&gt;
            &amp;quot;, which is &amp;quot; + (string)llVecDist(target_pos, llGetPos()) + &lt;br /&gt;
            &amp;quot; meters from the target (&amp;quot; + (string)target_pos + &amp;quot;)&amp;quot;&lt;br /&gt;
        );&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|helpers&lt;br /&gt;
|also_header&lt;br /&gt;
|also_events={{LSL DefineRow||[[not_at_target]]|}}&lt;br /&gt;
{{LSL DefineRow||[[at_rot_target]]|}}&lt;br /&gt;
{{LSL DefineRow||[[not_at_rot_target]]|}}&lt;br /&gt;
|also_functions={{LSL DefineRow||[[llTarget]]|Setup a target position}}&lt;br /&gt;
{{LSL DefineRow||[[llTargetRemove]]|Stop a target position}}&lt;br /&gt;
{{LSL DefineRow||[[llRotTarget]]|Setup a target rotation}}&lt;br /&gt;
{{LSL DefineRow||[[llRotTargetRemove]]|Stop a target rotation}}&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=Target&lt;br /&gt;
|cat2=Physics&lt;br /&gt;
|cat3=At Target&lt;br /&gt;
|cat4&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Omei Qunhua</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Not_at_target&amp;diff=1199205</id>
		<title>Not at target</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Not_at_target&amp;diff=1199205"/>
		<updated>2016-02-21T22:20:22Z</updated>

		<summary type="html">&lt;p&gt;Omei Qunhua: Complete the example so that the object actually moves&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Event&lt;br /&gt;
|event_id=17&lt;br /&gt;
|event_delay&lt;br /&gt;
|event=not_at_target&lt;br /&gt;
|event_desc=Triggered if an object has not yet reached the target set by the call to [[llTarget]].&lt;br /&gt;
|event_footnote=This event may be triggered multiple times if the target has not been reached.&lt;br /&gt;
|constants&lt;br /&gt;
|spec&lt;br /&gt;
|caveats&lt;br /&gt;
|examples=&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
integer target_id;&lt;br /&gt;
vector target_pos;&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        target_pos = llGetPos() + &amp;lt;5.0, 0.0, 0.0&amp;gt;;&lt;br /&gt;
        target_id = llTarget(target_pos, 0.5);&lt;br /&gt;
        llSetStatus(STATUS_PHYSICS, TRUE);&lt;br /&gt;
        llMoveToTarget(target_pos, 0.4);&lt;br /&gt;
    }&lt;br /&gt;
    at_target(integer tnum, vector targetpos, vector ourpos)&lt;br /&gt;
    {&lt;br /&gt;
        if (tnum == target_id)&lt;br /&gt;
        {&lt;br /&gt;
            llOwnerSay(&amp;quot;object is within range of target&amp;quot;);&lt;br /&gt;
            llOwnerSay(&amp;quot;target position: &amp;quot; + (string)targetpos + &amp;quot;, object is now at: &amp;quot; + (string)ourpos);&lt;br /&gt;
            llOwnerSay(&amp;quot;this is &amp;quot; + (string)llVecDist(targetpos, ourpos) + &amp;quot; meters from the target&amp;quot;);&lt;br /&gt;
            llTargetRemove(target_id);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    not_at_target()&lt;br /&gt;
    {&lt;br /&gt;
        llOwnerSay(&lt;br /&gt;
            &amp;quot;not there yet - object is at &amp;quot; + (string)llGetPos() + &lt;br /&gt;
            &amp;quot;, which is &amp;quot; + (string)llVecDist(target_pos, llGetPos()) + &lt;br /&gt;
            &amp;quot; meters from the target (&amp;quot; + (string)target_pos + &amp;quot;)&amp;quot;&lt;br /&gt;
        );&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|helpers&lt;br /&gt;
|also_header&lt;br /&gt;
|also_events={{LSL DefineRow||[[at_target]]|}}&lt;br /&gt;
{{LSL DefineRow||[[at_rot_target]]|}}&lt;br /&gt;
{{LSL DefineRow||[[not_at_rot_target]]|}}&lt;br /&gt;
|also_functions={{LSL DefineRow||[[llTarget]]|Setup a target position}}&lt;br /&gt;
{{LSL DefineRow||[[llTargetRemove]]|Stop a target position}}&lt;br /&gt;
{{LSL DefineRow||[[llRotTarget]]|Setup a target rotation}}&lt;br /&gt;
{{LSL DefineRow||[[llRotTargetRemove]]|Stop a target rotation}}&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=Target&lt;br /&gt;
|cat2=Physics&lt;br /&gt;
|cat3=At Target&lt;br /&gt;
|cat4&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Omei Qunhua</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Talk:PRIM_POINT_LIGHT&amp;diff=1199103</id>
		<title>Talk:PRIM POINT LIGHT</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Talk:PRIM_POINT_LIGHT&amp;diff=1199103"/>
		<updated>2016-02-17T12:14:07Z</updated>

		<summary type="html">&lt;p&gt;Omei Qunhua: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Multiplying Colour? ==&lt;br /&gt;
&lt;br /&gt;
In the compact version example is there a reason for multiplying the colour in this line:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;PRIM_POINT_LIGHT, switch, &amp;lt;1, 0.5, 0.1&amp;gt; *  switch, 1, 10, 0.6 &amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If the light is being switched off then the colour will be multiplied down to &amp;lt;0,0,0&amp;gt; (black), but it seems that this is set when a light is disabled anyway (if you turn a light off then back on via script, it will be coloured black, with 0 for all values). -- --&#039;&#039;&#039;[[User:Haravikk_Mistral|Haravikk]]&#039;&#039;&#039; 03:10, 17 February 2016 (PST)&lt;br /&gt;
&lt;br /&gt;
You are right. I guess I was concentrating on a compact version that faithfully replicated what the original script did, and not on the minimum to achieve the desired effect! [[User:Omei Qunhua|Omei Qunhua]] ([[User talk:Omei Qunhua|talk]]) 04:14, 17 February 2016 (PST)&lt;/div&gt;</summary>
		<author><name>Omei Qunhua</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Talk:Main_Page/Archive_1&amp;diff=1199072</id>
		<title>Talk:Main Page/Archive 1</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Talk:Main_Page/Archive_1&amp;diff=1199072"/>
		<updated>2016-02-10T22:52:45Z</updated>

		<summary type="html">&lt;p&gt;Omei Qunhua: Undo revision 1199070 by Sandeepkumar2255 Resident (talk)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== request for categories to be added to the &amp;quot;About this Wiki&amp;quot; box ==&lt;br /&gt;
&lt;br /&gt;
Would it be possible to have the [[:Category:Articles in need of updating|Articles in need of updating]] and [[:Category:Articles in need of expansion|Category:Articles in need of expansion]] categories added to the About this Wiki box so as to direct people towards articles in need of some wiki-love ?&lt;br /&gt;
&lt;br /&gt;
[[User:SignpostMarv Martin|SignpostMarv Martin]] 23:14, 8 January 2007 (PST)&lt;br /&gt;
== Headline ==&lt;br /&gt;
&lt;br /&gt;
I would very strongly suggest that (a) directly under the page name (&#039;Main Page&#039; - which could do with being changed anyway) is a statement along the lines of &#039;&#039;&#039;&#039;&#039;&amp;quot;This wiki relates to the Open Source client and protocols for Second Life only. If you are looking for assistance regarding Second Life please refer to &#039;&#039;&#039;(whatever page is felt best)&amp;quot;&#039;&#039; as it is clear from the comments on the announcement thread on the SL Blog that there are an awful lot of people who do not understand what this is all about and it will probably scare some of them! If I had sysop status I&#039;d add it myself ... --[[User:Alison Wheels|Alison Wheels]] 07:31, 9 January 2007 (PST)&lt;br /&gt;
&lt;br /&gt;
:The wiki isn&#039;t just for the client though.&lt;br /&gt;
:[[User:SignpostMarv Martin|SignpostMarv Martin]] 09:19, 9 January 2007 (PST)&lt;br /&gt;
&lt;br /&gt;
::Indeed, however I do believe &#039;&#039;something&#039;&#039; is needed there to make it clear to the neophyte SL-standard-user who has no interest at all in these &#039;behind the scenes&#039; activities but clicks on the link here because it is there that there is nothing for them to get worried about. --[[User:Alison Wheels|Alison Wheels]] 13:26, 9 January 2007 (PST)&lt;br /&gt;
&lt;br /&gt;
:::Heh, yeah, it is really in need of a title and some introductory text.&lt;br /&gt;
:::[[User:SignpostMarv Martin|SignpostMarv Martin]] 14:14, 9 January 2007 (PST)&lt;br /&gt;
&lt;br /&gt;
::::Could someone mock up what they think the homepage should look like?  Sorry that the homepage has to be protected, but I figured it&#039;s such a vandalism target that I couldn&#039;t avoid that.  -- [[User:Rob Linden|Rob Linden]] 14:20, 9 January 2007 (PST)&lt;br /&gt;
&lt;br /&gt;
:::::[[User:SignpostMarv Martin/Sandbox/Main Page|Done]]&lt;br /&gt;
:::::[[User:SignpostMarv Martin|SignpostMarv Martin]] 03:25, 10 January 2007 (PST)&lt;br /&gt;
&lt;br /&gt;
=== Removed Main Page title ===&lt;br /&gt;
Since the title &amp;quot;Main Page&amp;quot; doesn&#039;t add anything, it&#039;s just deadwood.  So, I made a change to the stylesheet to make the Main Page title invisible.  This will not affect any other pages.  If anyone has an issue with this, please discuss or ping me directly.&lt;br /&gt;
&lt;br /&gt;
Thanks,&lt;br /&gt;
Rand&lt;br /&gt;
&lt;br /&gt;
--[[User:Rand Linden|Rand Linden]] 18:20, 28 January 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
== What is this wiki for ? ==&lt;br /&gt;
&lt;br /&gt;
What is this wiki for?  Is it a general purpose wiki, where information like the old support wiki had?  Would it be appropriate for someone to start a page on Groups, and Land, and Animations, etc.?  A page similar to the LSL wiki for the main page would be logical, providing a list of topics, categories, etc.  to guide people in the right path. A search box doesn&#039;t help if you don&#039;t know the right term to search for. Was this wiki&#039;s creation announced? If this is a general help wiki, might it make sense to put the F1 help in here to be used and worked on? If this is supposed to be a general help reference shouldn&#039;t it be listed on the support page: http://secondlife.com/community/support.php and have a separate item in the dropdown box to make it a simple as humanly possible for people to find this?&lt;br /&gt;
&amp;lt;br /&amp;gt;[[User:SuezanneC Baskerville|SuezanneC Baskerville]] 08:26, 11 January 2007&lt;br /&gt;
&lt;br /&gt;
:The wiki currently seems to be being used for the OSSL (Open-Source Second Life) project, and for Volunteers.&lt;br /&gt;
:However, with some of the work being done in [[:Category:Linden Lab Employees]], it&#039;s slowly expanding into other areas.&lt;br /&gt;
:With regards to improving the main page, I invite you to take a look at the wiki-code I&#039;ve used on my demo, copy it over to [[User:SuezanneC Baskerville|your user-space]], and showing off your ideas.&lt;br /&gt;
:[[User:SignpostMarv Martin|SignpostMarv Martin]] 09:57, 11 January 2007 (PST)&lt;br /&gt;
&lt;br /&gt;
I agree with SuzanneC that this wiki needs to be much more accessible to the average user/newbie, and that the link to this wiki needs to be MUCH MORE visible on www.secondlife.com.  People want to find information, and that&#039;s what a wiki is for.  Do I have permission to create a &amp;quot;General Knowledge&amp;quot; Portal?  Any &amp;quot;general knowledge&amp;quot; for the average user does not seem to fit into any current portals.  Please advise! [[User:Oryx Tempel|Oryx Tempel]] 21:51 08 August 2007&lt;br /&gt;
&lt;br /&gt;
:The [[Volunteer Portal|Volunteer wiki]] was announced on the 8th, and Pathfinder is due to make another announcement soon, in case anyone missed the first one. Below is a copy of the original announcement (modified for wikification purposes):&lt;br /&gt;
&amp;lt;blockquote style=&amp;quot;font-style:italic;font-size:120%;font-weight: bolder ;&amp;quot;&amp;gt;&lt;br /&gt;
::Greetings!  &lt;br /&gt;
&lt;br /&gt;
::I&#039;d like to announce that our [[Volunteer Portal|Volunteer Wiki]] is now open and ready to go.  It primarily contains [[:Category:Text from In-world Notecards|information collected from inworld notecards]], but this is *your* resource to contribute to and organize however you feel works best. Feel free to experiment, edit existing content, or add some completely new pages!&lt;br /&gt;
&lt;br /&gt;
::Just log into the wiki with your SL username and password, and feel free to start adding or reorganizing. [[User:Amber Linden|Amber]] and [[User:Pathfinder Linden|I]] will also continue to watch it and add whatever resources we find.  &lt;br /&gt;
&lt;br /&gt;
::I noticed that a few of you have already started editing and contributing to it, having discovered it via the new [[Open Source Portal|Open Source wiki]] (both wikis are on the same server).  Outstanding initiative, and thank you.&lt;br /&gt;
&lt;br /&gt;
::Also, please be sure to visit the new [https://lists.secondlife.com/cgi-bin/mailman/listinfo/slvolunteers Volunteers mailing list page] and subscribe yourself to it.  I will be using this list as a key way to communicate directly with Volunteers. I also think it will be a great way for all of you to communicate with each other and share ideas without being interrupted by Group IM&#039;s inworld.&lt;br /&gt;
&lt;br /&gt;
::&#039;&#039;&#039;Volunteer Wiki&#039;&#039;&#039;&lt;br /&gt;
:::http://wiki.secondlife.com/wiki/Volunteer_Portal&lt;br /&gt;
&lt;br /&gt;
::&#039;&#039;&#039;Volunteer Mailing List&#039;&#039;&#039;&lt;br /&gt;
::https://lists.secondlife.com/cgi-bin/mailman/listinfo/slvolunteers&lt;br /&gt;
&lt;br /&gt;
::Onward and upward!&lt;br /&gt;
::-[[User:Pathfinder Linden|Pathfinder]]&lt;br /&gt;
&amp;lt;/blockquote&amp;gt;&lt;br /&gt;
&lt;br /&gt;
::*--If the Volunteer Portal is supposed to be the answer to SuezanneC Baskerville &amp;amp; Oryx Tempel posts about thinking we need more general help available in this wiki, then I&#039;d have to say that the the Volunteer portal is not good as a resource for newbies, and not really even for vets either (because it&#039;s too hard to find and too sparse).  I know about the newbie side, because I&#039;m a newbie, I never thought to look in the Volunteer Portal, I doubt anyone else does either.  I&#039;ve spoken to other newbies in-world, they&#039;ve visited this wiki too, and also thought there was absolutely nothing here of any value to newbies.  Because they couldn&#039;t find it.&lt;br /&gt;
:::--And we need more stuff for newbies.  After talking with Jeremy &amp;amp; Jon Linden Friday during office hours, it&#039;s clear LL offers next to nothing in the way of documentation for newbies. There is nothing good for newbies on secondlife.com or in-world. The 1 thing LL offers, is when you first login to the Second Life Support Center there&#039;s a link titled &amp;quot;New to Second Life? Find out how to get started.&amp;quot; But the info offered there is WAY too brief!!!&lt;br /&gt;
:::--LL doesn&#039;t give a dictionary. LL doesn&#039;t give a browse-able overview of the client, so you could just poke through a table of contents and read-up about the features in the viewer. LL gives no intro for newbies (though there are some pretty good, outdated, &amp;amp; disorganized notecards kicking-around that do this...but how many newbies ever find/read those?).&lt;br /&gt;
:::--If LL, or this wiki, offered better docs for new users, Mentors might be less overwhelmed handling basic problems, Help Island would probably be less crowded, and other citizens might spend less time hand-holding newbies and more time doing more advanced, satisfying activities. I bet SL loses confused newbies in droves over the lack of docs.&lt;br /&gt;
:::--Since newbies don&#039;t know what questions to ask, the stuff at secondlife.com/support isn&#039;t too useful...because they don&#039;t know what search terms to type in. Lots of people don&#039;t even like to search. Why not a table of contents? What this wiki could offer is ONE point for ALL newbies to click...&amp;quot;Help with Second Life&amp;quot;. From that ONE click, it should be possible to browse to EVERY article of interest to newbies. Just by browsing from ONE point they should get an overview of SL, FAQs, dictionary, info on the viewer, more in-depth info, etc.  Perhaps something like this:&lt;br /&gt;
:::https://wiki.secondlife.com/wiki/User:Jaszon_Maynard/Proposed_Second_Life_Help_Portal&lt;br /&gt;
:::--Jeremy said I should look again in the wiki for docs that are good for new users.  And there are some...but they&#039;re only linked to the Volunteer portal.  If the Volunteer portal is supposed to be helpful to newbies, well, first of all, it&#039;s called the &amp;quot;Volunteer&amp;quot; portal (!!!).  I wasn&#039;t looking to be a volunteer, or to find one...I was looking for help text.  The description on the main wiki page says &amp;quot;Learn more about our Resident Volunteer program and access shared Volunteer resources. Resident Volunteers are participants in our Official Volunteer Program, providing guidance and assistance to Residents blah blah blah....&amp;quot;.  By the time any newbie reads 2 lines in, it seems pretty clear that the volunteer portal does not offer what they&#039;re looking for.  It doesn&#039;t say &amp;quot;general help in here!&amp;quot;.&lt;br /&gt;
:::--And the Volunteer portal is, for newbies, not organized well at all for them, and is missing all kinds of things it would have to have.  I&#039;ll post about that in the Volunteer portal talk page.&lt;br /&gt;
:::http://wiki.secondlife.com/wiki/Talk:Volunteer_Portal&lt;br /&gt;
:::--And what if I don&#039;t want to join any organization (I don&#039;t, yet), but I do want to add/edit articles in the Volunteer portal?  Am I allowed to?  The descriptions &amp;amp; posts I&#039;ve read implies I should not.  There needs to be a freely-editable help wiki or people aren&#039;t going to edit it.&lt;br /&gt;
:::--Also, as a computer veteran, programmer, gamer, &amp;amp; user of many products...it is WAY weird to have to login to a support system before being allowed to read basic help info (which is what you have to do at secondlife.com). I am accustomed to only logging into anything if I want to make posts (forums) or submit tickets. But not just read help!!! Probably 2 kinds of people come to SL Support...those, like me, who aren&#039;t used to logging-in just to read basic help...and those who aren&#039;t used to logging into anything at all ever. Either kind of person will be confused by SL Support. They&#039;re just looking for basic help. They&#039;re asked to login to something?!? I wonder how many of them are annoyed &amp;amp; confused.&lt;br /&gt;
:::--LL is offering nothing for newbies, and I&#039;m pretty shocked. It&#039;s probably losing them lots of potential customers. But the community could take up that slack. We can do their work for them, and maybe even do it better. We can be pretty responsive to comments from actual newbies. And we&#039;re the ones doing the most socializing, buying/selling, role-playing, setting-up businesses, etc. So we&#039;ll have a different perspective than LL. It&#039;s a user-created world, there probably should be a user-created guide to it. And hey, it&#039;s the internet, users SHOULD have a robust wiki, and LL should take advantage of that interest. I&#039;ve already got some great notecards to start with and some great ideas to add in. But this wiki needs some changes first. I would start putting some of my ideas in, but there&#039;s no point unless we either make changes to the Volunteer portal, or make a new portal. Otherwise newbies will have a hard time finding what I add-in, even if they&#039;re given the URL to this wiki. I&#039;m willing to WRITE the 1st draft of the intro for newbies, I&#039;m willing to setup the structure for the dictionary and make the first entry in it, I&#039;m willing to setup the structure so others can fill in the details about the client (menus, dialogs, etc), and I&#039;m willing to setup the structure so others can write about everything else in SL (socializing, avatar customization, sight-seeing, classes, Events, money, land, building, scripting, role-playing, businesses, etc) and it&#039;ll be find-able easily in a browse-able format to newbies. &lt;br /&gt;
:::--I really think we need either a NEW portal called &amp;quot;Second Life Help&amp;quot;, or the Volunteer portal needs a new name, new description, and new layout.&lt;br /&gt;
:::--If what people want is a new portal, I&#039;d try making one myself.  It would need a lot of helpful edits from others though.&lt;br /&gt;
:::--[[User:Jaszon Maynard|Jaszon Maynard]] 21:56, 25 February 2008 (PST)&lt;br /&gt;
::::To point this out: the Volunteer Portal is &#039;&#039;&#039;not&#039;&#039;&#039; the help resource for newbies. It is supposed to provide information for &#039;&#039;&#039;Second Life Mentors&#039;&#039;&#039;. But yes, I would like to see an official Help Category for newbies on the wiki. As far as I know, there are just articles in the users namespace such as the very helpful newbies guide by [[User:Tid_Kidd|on Tid Kidds Userspage]] or the growing subpages on [[User:Lum_Pfohl|Lum Pfohl]]s site. If newbies are searching for in-world help they can have a look at the official public orientation and help islands or the well made private ones like the [http://slurl.com/secondlife/Scholar/111/85/26 Orientation Station in Scholar] or the [http://slurl.com/secondlife/NMC%20Orientation/128/128/0 NMC Orientation Island] (to just name two of them). We could name and link them there as well. The problem might also be that there are not many people aware of the wiki. So i would like to see a &#039;&#039;Tip of the week&#039;&#039; and/or Video Tutorial ([[User_talk:Torley_Linden#VidTut_Request|like requested by Marv here]]) on it to make it public. But it would be nice to see this help category put up first so newbies can actually find help. By now, it might only be interesting for scripters or volunteers. Greetings, --[[User:Zai Lynch|Zai Lynch]] 15:17, 26 February 2008 (PST)&lt;br /&gt;
&lt;br /&gt;
:::::*--Ok, thanks for the reply.  So I gather I can create my own portal, that&#039;s allowable?  Will it automatically end up on the Main Page or would I have to request someone to put it there?&lt;br /&gt;
::::::--[[User:Jaszon Maynard|Jaszon Maynard]] 16:14, 26 February 2008 (PST)&lt;br /&gt;
&lt;br /&gt;
:::::::I &#039;&#039;think&#039;&#039; you can create your own one but it won&#039;t be added automatically nor can you add it since the main page can only be edited by wiki moderators (Lindens only?) at the moment. So I would recommend to check back with [[User:Rob_Linden|Rob]] on this. --[[User:Zai Lynch|Zai Lynch]] 20:01, 26 February 2008 (PST)&lt;br /&gt;
&lt;br /&gt;
== upload directory needs chmod ==&lt;br /&gt;
&lt;br /&gt;
DOWNTIME NOTICE: we&#039;ll be performing maintenance on wiki.secondlife.com on Thursday, May 31 at 10pm for up to two hours. The site may be unavailable during this time.&lt;br /&gt;
Upload file&lt;br /&gt;
From Second Life Wiki&lt;br /&gt;
Jump to: navigation, search&lt;br /&gt;
&lt;br /&gt;
The upload directory (/shared/mediawiki_prod/wiki.secondlife.com/w/images) is not writable by the webserver. &lt;br /&gt;
&lt;br /&gt;
will someone please chmod 777 the directory??? ([[User:Ina Centaur|Ina Centaur]] 05:11, 1 June 2007 (PDT))&lt;br /&gt;
&lt;br /&gt;
== Translation ==&lt;br /&gt;
I plan on translating this page to Dutch (Main_Page/nl) objections anyone? --[[User:Aidamina Hunt|Aidamina Hunt]] 00:03, 30 August 2007 (PDT)&lt;br /&gt;
&lt;br /&gt;
Plan on finishing the [[Main_Page/nl]] soon --[[User:Aidamina Hunt|Aidamina Hunt]] 07:06, 11 April 2008 (PDT)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== secondlife.com/support no longer links to the wiki? ==&lt;br /&gt;
&lt;br /&gt;
*--secondlife.com/support used to have a link to the wiki...not anymore?&lt;br /&gt;
:--[[User:Jaszon Maynard|Jaszon Maynard]] 16:56, 26 March 2008 (PDT)&lt;br /&gt;
&lt;br /&gt;
::There is a link in the footer but I know what you mean. :/ -- [[User:Strife Onizuka|Strife Onizuka]] 08:54, 28 March 2008 (PDT)&lt;br /&gt;
&lt;br /&gt;
== Queries ==&lt;br /&gt;
&lt;br /&gt;
*Where can I ask technical queries about Second Life?  The email address support@ secondlife.com has disappeared. I was directed to http://secondlife.com/support/ , which does not seem to have anywhere to send messages and queries. There is a Yahoo email group http://groups.yahoo.com/group/Second_Life , but it is moderated and its moderator seems to be on holiday or AWOL.&lt;br /&gt;
&lt;br /&gt;
I was given two USA phone numbers, but I am in England.&lt;br /&gt;
&lt;br /&gt;
I was told to go to https://support.secondlife.com/ics/support/security.asp , which displayed only &amp;quot;Insufficient Account Information  deptID is empty!&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
[[User:CaptainJack Grauman|CaptainJack Grauman]] 05:40, 1 April 2008 (PDT)&lt;br /&gt;
&lt;br /&gt;
:I would say it depends on what your question is related to. If it is a support question for &#039;&#039;your&#039;&#039; SL, then https://support.secondlife.com/ is the page to look at. The portal got a revision [http://blog.secondlife.com/2008/03/17/support-navigation-changes-coming-tomorrow/ lately] so that might be the reason why the link mentioned above is out-of-date. In case your problem isn&#039;t listed there, you might file a support ticket (service varies for account type basic/premium). If it is a bug report or the request of a new feature, have a look at Second Lifes public issue tracker at [http://jira.secondlife.com http://jira.secondlife.com]. If it is a question about SL in general, you might want to visit an [[Office_Hours|in-world office hour]] with a Linden who is responsible for that specific technical field where your question is related to. Greetings, --[[User:Zai Lynch|Zai Lynch]] 06:25, 1 April 2008 (PDT)&lt;br /&gt;
&lt;br /&gt;
== Where is the Teen Grid Section? ==&lt;br /&gt;
&lt;br /&gt;
Would it be possible to add the Teen Grid Wiki on the Main Page of the Second Life Wiki? {{Unsigned|Daniel Voyager|13:54, 7 May 2008}}&lt;br /&gt;
:This might be something to ask a TSL VTeam Linden. I would recommend [[User:Lexie Linden|Lexie]] since she seems to be the VTeam-Wiki Linden or [[User:Blue Linden|Blue]] as allrounder. I got the feeling that the links are missing to not make it &#039;&#039;to easy&#039;&#039; for adult Residents to contact TSL Residents (via talk pages etc.) since it&#039;s some kind of intergrid communication. But well, TSL Portal and TSL Blog aren&#039;t really hidden, just unmentioned. So if you got the O.K. for the legal stuff, you could create a [[Template:Main Page/TSL Portal]] that fits the design of the other involved templates and ask Lexie/Blue to add it to the [[Main Page]] since they should have SysOp status and would know that they gave you the previous O.K. (so you wouldn&#039;t have the same discussion with [[User:Rob Linden|Rob]] again). If you got problems by creating the template, please provide the links you&#039;d like to see displayed and poke [[User:SignpostMarv Martin|Marv]], me or one of the other [[:Category:SL Mentor Scribes|Scribes]] to this. &lt;br /&gt;
:Greetz, [[User:Zai_Lynch|Zai Lynch]]&amp;lt;sup&amp;gt;([[User_talk:Zai_Lynch|talk]]|[[Special:Contributions/Zai_Lynch|contribs]])&amp;lt;/sup&amp;gt; 09:14, 7 May 2008 (PDT)&lt;br /&gt;
&lt;br /&gt;
== Making the Main Page portal &amp;quot;boxes&amp;quot; more compact ==&lt;br /&gt;
&lt;br /&gt;
Most of the portal &amp;quot;boxes&amp;quot; (templates) on the main page have a title (with the light blue background) and then a link to the portal as the first words in the body of the box (white background).  In most cases, the text of the two is the same or very similar.  I&#039;d like to eliminate the redundancy by making the link be the title.  For example, see the &amp;quot;Web Services Portal&amp;quot; box at lower right.  I also modified the &amp;quot;Help Portal&amp;quot; box to be along these lines.  &lt;br /&gt;
&lt;br /&gt;
In general, screen real estate on the Main Page is a valuable commodity and should be used parsimoniously.&lt;br /&gt;
&lt;br /&gt;
Does anyone have an objection?&lt;br /&gt;
&lt;br /&gt;
--[[User:Rand Linden|Rand Linden]] 07:34, 1 February 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Parsimoniously&amp;quot; ? *lolz and heads for Google* -- &#039;&#039;&#039;[[User:Fred_Gandt|Fred Gandt]]&#039;&#039;&#039; &amp;lt;sup&amp;gt;&amp;lt;small&amp;gt;([[User talk:Fred_Gandt|talk]]|[[Special:Contributions/Fred_Gandt|contribs]])&amp;lt;/small&amp;gt;&amp;lt;/sup&amp;gt; 19:54, 23 April 2010 (UTC)&lt;br /&gt;
&lt;br /&gt;
== LSL Portal &amp;quot;box&amp;quot; should have links to pages that are helpful and often used ==&lt;br /&gt;
&lt;br /&gt;
* The guidelines shown is for editing the LSL portal and not about LSL script it self. Instead it should link to say [[LSL Style Guide]] or just be removed.&lt;br /&gt;
* The same thing with the to do link. I would just remove it.&lt;br /&gt;
* I most often use [[:Category:LSL Functions]]. When I first was looking for information on how to script in LSL this is what I wanted. I think it should be the first link. Looking at [[Special:Statistics]] it is the 5th most viewed page with 708,956 views.&lt;br /&gt;
* Next I think [[LSL Tutorial]] should be added as it is a great place for people who have never scripted before and even for those who work in other languages. This is also the 8th most viewed page on the wiki.&lt;br /&gt;
* The last link I would add [[:Category:LSL_Library]] which is a list of scripts that show off how LSL works or does a common task.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:* For the the two categories you may want to use [[Template:LSLGC]].&lt;br /&gt;
[[User:Master Starship|Master Starship]] 17:34, 23 April 2010 (UTC)&lt;br /&gt;
&lt;br /&gt;
:I move the conversation back. I am talking about the main page box labeled LSL Portal with the two links. Not the actual LSL Portal page. -- [[User:Master Starship|Master Starship]] 19:07, 23 April 2010 (UTC)&lt;br /&gt;
&lt;br /&gt;
All the links you could ever want are on the LSL Portal Main Page. If anything further is needed at all on the Wiki/KB Main Page (portal box) it could be a few words of explanation of what &amp;quot;LSL&amp;quot; is (EDIT TO SUGGEST: A reference guide to Linden Scripting Language. &amp;quot;LSL&amp;quot; is used to [[script]] behavior in SL objects.) so visitors are more enlightened about why they might want to visit the portal. Then the portal itself could be a little more &amp;quot;friendly&amp;quot;. The Wiki/KB Main Page shouldn&#039;t be over complicated. -- &#039;&#039;&#039;[[User:Fred_Gandt|Fred Gandt]]&#039;&#039;&#039; &amp;lt;sup&amp;gt;&amp;lt;small&amp;gt;([[User talk:Fred_Gandt|talk]]|[[Special:Contributions/Fred_Gandt|contribs]])&amp;lt;/small&amp;gt;&amp;lt;/sup&amp;gt; 19:42, 23 April 2010 (UTC)&lt;br /&gt;
&lt;br /&gt;
:I was looking at the Creation Portal box and all the links in there are also on the Creation Portal Main Page. Looking at the other boxes&#039; links it looked like none of there were to information about how to edit that portal which is what the LSL Portal box has. All the others linked to what the summery said. The two pages currently linked are not references for LSL. I can see changing Guidelines so it says Portal Guidelines and then adding the ones I suggested. -- [[User:Master Starship|Master Starship]] 16:45, 25 April 2010 (UTC)&lt;br /&gt;
&lt;br /&gt;
Ohh I see what you mean, considering what&#039;s in the other boxes, the links are inappropriate. IMO, they should be the header links. -- &#039;&#039;&#039;[[User:Strife_Onizuka|Strife]]&#039;&#039;&#039; &amp;lt;sup&amp;gt;&amp;lt;small&amp;gt;([[User talk:Strife_Onizuka|talk]]|[[Special:Contributions/Strife_Onizuka|contribs]])&amp;lt;/small&amp;gt;&amp;lt;/sup&amp;gt; 22:37, 25 April 2010 (UTC)&lt;br /&gt;
&lt;br /&gt;
If no one has a problem with that I will make the changes tomorrow. -- [[User:Master Starship|Master Starship]] 12:53, 27 April 2010 (UTC)&lt;br /&gt;
:Just to be clear I will made it so the box has the same links as the LSL header. -- [[User:Master Starship|Master Starship]] 13:08, 27 April 2010 (UTC)&lt;br /&gt;
&lt;br /&gt;
== category poisoning? ==&lt;br /&gt;
there seems to be some kind of error in the sub categorization causing the marketplace to be read as top level to a great majority of pages in the wiki, including all user pages, and even this main page... I thought maybe is was some recursion in the marketplace nav template, but that doesn&#039;t seem to be it... the category:marketplace contains itself as a sub category though, and I can&#039;t figure out where the problem is (maybe the marketplace page being in and redirecting to the category:marketplace?)... at any rate it&#039;s goin to take someone that knows this software better than I to fix it &amp;lt;br/&amp;gt;-- &#039;&#039;&#039;[[User:Void_Singer|Void]]&#039;&#039;&#039; &amp;lt;sup&amp;gt;&amp;lt;small&amp;gt;([[User_talk:Void_Singer|talk]]|[[Special:Contributions/Void_Singer|contribs]])&amp;lt;/small&amp;gt;&amp;lt;/sup&amp;gt; 02:00, 16 December 2010 (UTC)&lt;br /&gt;
: [[MediaWiki:Breadcrumbs]] was the culprit, something got confused and the bolded self-links showed it as a subpage of Marketplace. A purge half fixed it, more on [[Talk:Second Life Wiki Known Issues]]. --[[User:Cerise Resident|Cerise]] 07:26, 16 December 2010 (UTC)&lt;/div&gt;</summary>
		<author><name>Omei Qunhua</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Group_Privacy&amp;diff=1198897</id>
		<title>Group Privacy</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Group_Privacy&amp;diff=1198897"/>
		<updated>2016-01-21T18:31:37Z</updated>

		<summary type="html">&lt;p&gt;Omei Qunhua: Reduce obfuscation&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
Many landlords do not allow residents to have security devices that are continuously operating. This device is activated manually, and only operates so long as avatars are present. When avatars leave the vicinity, the device turns off. To turn on again, the device needs to be touched by an authorised person.&lt;br /&gt;
&lt;br /&gt;
Place this script into a single prim, and decorate to taste.&lt;br /&gt;
&lt;br /&gt;
Requirements:&lt;br /&gt;
&lt;br /&gt;
# Edit script range and timer frequency to suit&lt;br /&gt;
# Deed to match the land group&lt;br /&gt;
&lt;br /&gt;
Operation:&lt;br /&gt;
&lt;br /&gt;
# Insure that group members have the group tag active&lt;br /&gt;
# Touch to activate; touch to deactivate&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
//&lt;br /&gt;
//    Version 1.0 Release&lt;br /&gt;
//    Copyright (C) 2007, Chance Unknown&lt;br /&gt;
//&lt;br /&gt;
//    This library is free software; you can redistribute it and/or&lt;br /&gt;
//    modify it under the terms of the GNU Lesser General Public License&lt;br /&gt;
//    as published by the Free Software Foundation; either&lt;br /&gt;
//    version 2.1 of the License, or (at your option) any later version.&lt;br /&gt;
//&lt;br /&gt;
//    This library is distributed in the hope that it will be useful,&lt;br /&gt;
//    but WITHOUT ANY WARRANTY; without even the implied warranty of&lt;br /&gt;
//    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the&lt;br /&gt;
//    GNU Lesser General Public License for more details.&lt;br /&gt;
//&lt;br /&gt;
//    You should have received a copy of the GNU Lesser General Public License&lt;br /&gt;
//    along with this library; if not, write to the Free Software&lt;br /&gt;
//    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA&lt;br /&gt;
//&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
float duration = 60.0;          // Duration of Land Ban Following the Eject (1Hr)&lt;br /&gt;
float RANGE = 40.0;             // Scan Range (40m)&lt;br /&gt;
float RATE = 10.0;              // Scan Rate (10 Sec)&lt;br /&gt;
&lt;br /&gt;
integer status;&lt;br /&gt;
&lt;br /&gt;
off()&lt;br /&gt;
{&lt;br /&gt;
    status = FALSE;&lt;br /&gt;
    llSensorRemove();&lt;br /&gt;
    llSetColor(&amp;lt;1,1,1&amp;gt;, ALL_SIDES);&lt;br /&gt;
    llSay(0, &amp;quot;Deactivated.&amp;quot;);&lt;br /&gt;
    llSetText(&amp;quot;Group Privacy\nOff\n\nTouch to Turn On&amp;quot;, &amp;lt;1,1,1&amp;gt;, 1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
on()&lt;br /&gt;
{&lt;br /&gt;
    status = TRUE;&lt;br /&gt;
    llSensorRepeat(&amp;quot;&amp;quot;, NULL_KEY, AGENT, RANGE, PI, RATE);&lt;br /&gt;
    llSetColor(&amp;lt;1,0,0&amp;gt;, ALL_SIDES);&lt;br /&gt;
    llSay(0, &amp;quot;Activated while group memebers are present.&amp;quot;);&lt;br /&gt;
    llSetText(&amp;quot;Group Privacy\nOn\n\nTouch to Turn Off&amp;quot;, &amp;lt;1,1,1&amp;gt;, 0.5);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
boot(key id)&lt;br /&gt;
{&lt;br /&gt;
    if (llOverMyLand(id) == TRUE)&lt;br /&gt;
    {&lt;br /&gt;
        llUnSit(id);&lt;br /&gt;
        llEjectFromLand(id);&lt;br /&gt;
        llAddToLandBanList(id, duration); // Hour of Ban&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;
        off();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer num_detected)&lt;br /&gt;
    {&lt;br /&gt;
        if (llGetLandOwnerAt(llGetPos()) != llGetOwner())&lt;br /&gt;
            llSay(0, &amp;quot;Deed device to match land group.&amp;quot;);&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            if (llSameGroup(llDetectedKey(0)))&lt;br /&gt;
            {&lt;br /&gt;
                if (status)&lt;br /&gt;
                    off();&lt;br /&gt;
                else&lt;br /&gt;
                    on();&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
                llSay(0, &amp;quot;Authorized to group members only.&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    sensor(integer num_detected)&lt;br /&gt;
    {&lt;br /&gt;
        integer group_members;&lt;br /&gt;
        key id;&lt;br /&gt;
&lt;br /&gt;
        integer i;&lt;br /&gt;
        for ( ; i &amp;lt; num_detected; ++i)&lt;br /&gt;
        {&lt;br /&gt;
            id = llDetectedKey(i);&lt;br /&gt;
&lt;br /&gt;
            if (llSameGroup(id))&lt;br /&gt;
            {&lt;br /&gt;
                llRemoveFromLandBanList(id);&lt;br /&gt;
                ++group_members;&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
                boot(id);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (!group_members)&lt;br /&gt;
            off();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    no_sensor()&lt;br /&gt;
    {&lt;br /&gt;
        off();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LSLC|Library}}&lt;/div&gt;</summary>
		<author><name>Omei Qunhua</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Describe_Chatter&amp;diff=1198896</id>
		<title>Describe Chatter</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Describe_Chatter&amp;diff=1198896"/>
		<updated>2016-01-21T17:41:42Z</updated>

		<summary type="html">&lt;p&gt;Omei Qunhua: Clean up code. Avoid double click issues.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
&lt;br /&gt;
= Introduction =&lt;br /&gt;
&lt;br /&gt;
Another avatar or object can ask what your avatar&#039;s name is, what your avatar&#039;s date-of-birth is, whether payment info is on file for your avatar, etc. The Linden servers will return this information without asking you for permission and without notifying you.&lt;br /&gt;
&lt;br /&gt;
If you can see an avatar&#039;s profile, then Profile &amp;gt; 2nd Life will tell you things like Currently Online, Born mm/dd/yyyy, No Payment Info On File. If you can&#039;t, then this script can tell you those kinds of things.&lt;br /&gt;
&lt;br /&gt;
= Sample Results =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
---&lt;br /&gt;
Avatar info:&lt;br /&gt;
    Name: John Doe&lt;br /&gt;
    Birthday: 2007-09-23&lt;br /&gt;
    Payinfo: Has unused payment info on file.&lt;br /&gt;
    Online status: Offline&lt;br /&gt;
---&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Code =&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
//  Touch prim to get avatar info as shown in the profile&lt;br /&gt;
//&lt;br /&gt;
//  http://wiki.secondlife.com/wiki/Describe_Chatter&lt;br /&gt;
&lt;br /&gt;
key nameRequestId;&lt;br /&gt;
key birthdayRequestId;&lt;br /&gt;
key payinfoRequestId;&lt;br /&gt;
key onlineStatusRequestId;&lt;br /&gt;
&lt;br /&gt;
string avatarLegacyName;&lt;br /&gt;
string avatarBirthday;&lt;br /&gt;
string avatarPayinfo;&lt;br /&gt;
string avatarOnlineStatus;&lt;br /&gt;
&lt;br /&gt;
integer    gEventsReceived;               // Bit pattern of received dataserver events&lt;br /&gt;
integer    gMaskName = 1;&lt;br /&gt;
integer    gMaskBirthday = 2;&lt;br /&gt;
integer    gMaskPayinfo = 4;&lt;br /&gt;
integer    gMaskOnline  = 8;&lt;br /&gt;
&lt;br /&gt;
key        gToucher;&lt;br /&gt;
&lt;br /&gt;
clear_cache()&lt;br /&gt;
{&lt;br /&gt;
    gEventsReceived = 0;&lt;br /&gt;
    avatarLegacyName = &amp;quot;&amp;quot;;&lt;br /&gt;
    avatarBirthday = &amp;quot;&amp;quot;;&lt;br /&gt;
    avatarPayinfo = &amp;quot;&amp;quot;;&lt;br /&gt;
    avatarOnlineStatus = &amp;quot;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSetTimerEvent(0);&lt;br /&gt;
        //  yellow and opaque&lt;br /&gt;
        llSetText(&amp;quot;&amp;lt;~!~ touch to get avatar info ~!~&amp;gt;&amp;quot;, &amp;lt;1, 1, 0&amp;gt;, 1);&lt;br /&gt;
    }&lt;br /&gt;
    on_rez(integer start_param)&lt;br /&gt;
    {&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    changed(integer change)&lt;br /&gt;
    {&lt;br /&gt;
        if (change &amp;amp; (CHANGED_OWNER | CHANGED_INVENTORY))&lt;br /&gt;
            llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    touch_end(integer num_detected)&lt;br /&gt;
    {&lt;br /&gt;
        gToucher = llDetectedKey(0);&lt;br /&gt;
        state working;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
state working&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSetText(&amp;quot;=== please wait ===&amp;quot;, &amp;lt;1, 0, 0&amp;gt;, 1);&lt;br /&gt;
        clear_cache();&lt;br /&gt;
        nameRequestId = llRequestAgentData(gToucher, DATA_NAME);&lt;br /&gt;
        birthdayRequestId = llRequestAgentData(gToucher, DATA_BORN);&lt;br /&gt;
        payinfoRequestId = llRequestAgentData(gToucher, DATA_PAYINFO);&lt;br /&gt;
        onlineStatusRequestId = llRequestAgentData(gToucher, DATA_ONLINE);&lt;br /&gt;
        llSetTimerEvent(10);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    dataserver(key query_id, string data)&lt;br /&gt;
    {&lt;br /&gt;
        if (query_id == NULL_KEY)&lt;br /&gt;
            return;&lt;br /&gt;
&lt;br /&gt;
        if (query_id == nameRequestId)&lt;br /&gt;
        {&lt;br /&gt;
            gEventsReceived = gEventsReceived | gMaskName;&lt;br /&gt;
            avatarLegacyName = data;&lt;br /&gt;
        }&lt;br /&gt;
        else if (query_id == birthdayRequestId)&lt;br /&gt;
        {&lt;br /&gt;
            gEventsReceived = gEventsReceived | gMaskBirthday;&lt;br /&gt;
            avatarBirthday = data;&lt;br /&gt;
        }&lt;br /&gt;
        else if (query_id == payinfoRequestId)&lt;br /&gt;
        {&lt;br /&gt;
            gEventsReceived = gEventsReceived | gMaskPayinfo;&lt;br /&gt;
            integer payInfo = (integer)data;&lt;br /&gt;
            if (payInfo  &amp;amp; ~(PAYMENT_INFO_ON_FILE | PAYMENT_INFO_USED))&lt;br /&gt;
                avatarPayinfo = &amp;quot;- payinfo request failed -&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                integer hasPayinfo = (payInfo &amp;amp; PAYMENT_INFO_ON_FILE);&lt;br /&gt;
                integer usedPayinfo = (payInfo &amp;amp; PAYMENT_INFO_USED);&lt;br /&gt;
                avatarPayinfo = &amp;quot;Has no payment info on file.&amp;quot;;&lt;br /&gt;
                if (hasPayinfo)&lt;br /&gt;
                {&lt;br /&gt;
                    avatarPayinfo = &amp;quot;Has unused payment info on file.&amp;quot;;&lt;br /&gt;
                    if (usedPayinfo)&lt;br /&gt;
                        avatarPayinfo =  &amp;quot;Has used payment info on file.&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else if (query_id == onlineStatusRequestId)&lt;br /&gt;
        {&lt;br /&gt;
            gEventsReceived = gEventsReceived | gMaskOnline;&lt;br /&gt;
            avatarOnlineStatus = &amp;quot;Offline&amp;quot;;&lt;br /&gt;
            if ( (integer) data )&lt;br /&gt;
                avatarOnlineStatus = &amp;quot;Online&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (gEventsReceived == (gMaskName | gMaskBirthday | gMaskPayinfo | gMaskOnline ) )&lt;br /&gt;
        {&lt;br /&gt;
            llSay(0, &amp;quot;Avatar info:&amp;quot;&lt;br /&gt;
                + &amp;quot;\n\tName: &amp;quot; + avatarLegacyName&lt;br /&gt;
                + &amp;quot;\n\tBirthday: &amp;quot; + avatarBirthday&lt;br /&gt;
                + &amp;quot;\n\tPayinfo: &amp;quot; + avatarPayinfo&lt;br /&gt;
                + &amp;quot;\n\tOnline status: &amp;quot; + avatarOnlineStatus);&lt;br /&gt;
            state default;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        llSay(0, &amp;quot;Sorry, did not get a response for all requested info. Please try again!&amp;quot;);&lt;br /&gt;
        state default;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= See Also =&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Functions&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[llRequestAgentData]] - ask to receive information about of an agent, such as birth date&lt;br /&gt;
&lt;br /&gt;
[[llSetText]] - float text over a prim&lt;br /&gt;
&lt;br /&gt;
{{LSLC|Library}}{{LSLC|Examples}}&lt;/div&gt;</summary>
		<author><name>Omei Qunhua</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Teleport_HUD&amp;diff=1198892</id>
		<title>Teleport HUD</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Teleport_HUD&amp;diff=1198892"/>
		<updated>2016-01-21T14:51:02Z</updated>

		<summary type="html">&lt;p&gt;Omei Qunhua: Correct syntax error. Avoid misrepresentative (float)TRUE / (float)FALSE&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
== Gridwide Teleport HUD (works in no-script areas) ==&lt;br /&gt;
&lt;br /&gt;
# Link 9 prims.&lt;br /&gt;
# Drop this script.&lt;br /&gt;
# Add up to 8 landmarks.&lt;br /&gt;
# Attach to HUD and enjoy!&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
key owner;&lt;br /&gt;
integer gotTPperms;&lt;br /&gt;
integer isShowing;&lt;br /&gt;
&lt;br /&gt;
toggle(integer inputInteger)&lt;br /&gt;
{&lt;br /&gt;
    if (inputInteger)&lt;br /&gt;
    {&lt;br /&gt;
        integer numOfPrims = llGetNumberOfPrims();&lt;br /&gt;
        rotation currentRot = llGetRot();&lt;br /&gt;
&lt;br /&gt;
        vector white = &amp;lt;1.0, 1.0, 1.0&amp;gt;;&lt;br /&gt;
        vector orange = &amp;lt;1.0, 0.4, 0.0&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
        integer index = 1;//  root of linkset&lt;br /&gt;
        do&lt;br /&gt;
        {&lt;br /&gt;
            string linkName = llGetLinkName(index);&lt;br /&gt;
&lt;br /&gt;
            if (linkName == &amp;quot;TP HUD for landmarks&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                llSetLinkPrimitiveParamsFast(index,&lt;br /&gt;
                    [PRIM_COLOR, ALL_SIDES, ZERO_VECTOR, 1,&lt;br /&gt;
                    PRIM_COLOR, 3, &amp;lt;0.0, 1.0, 0.0&amp;gt;, 1,&lt;br /&gt;
                    //  green and opaque floattext&lt;br /&gt;
                    PRIM_TEXT, &amp;quot;click green button to close\n&amp;quot;&lt;br /&gt;
                        + &amp;quot;or select TP destination&amp;quot;, &amp;lt;0.0, 1.0, 0.0&amp;gt;, 1]);&lt;br /&gt;
            }&lt;br /&gt;
            else if (linkName == &amp;quot;tp1&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                llSetLinkPrimitiveParamsFast(index, [&lt;br /&gt;
                    PRIM_COLOR, ALL_SIDES, white, 1,&lt;br /&gt;
                    PRIM_POSITION, &amp;lt;0.0, 0.0, -0.0475&amp;gt;*currentRot,&lt;br /&gt;
                    PRIM_SIZE, &amp;lt;0.025, 0.025, 0.010&amp;gt;,&lt;br /&gt;
                    PRIM_TEXT, llGetInventoryName(INVENTORY_LANDMARK, 0), white, 1]);&lt;br /&gt;
            }&lt;br /&gt;
            else if (linkName == &amp;quot;tp2&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                llSetLinkPrimitiveParamsFast(index, [&lt;br /&gt;
                    PRIM_COLOR, ALL_SIDES, orange, 1,&lt;br /&gt;
                    PRIM_POSITION, &amp;lt;0.0, 0.0, -0.0875&amp;gt;*currentRot,&lt;br /&gt;
                    PRIM_SIZE, &amp;lt;0.025, 0.025, 0.01&amp;gt;,&lt;br /&gt;
                    PRIM_TEXT, llGetInventoryName(INVENTORY_LANDMARK, 1), orange, 1]);&lt;br /&gt;
            }&lt;br /&gt;
            else if (linkName == &amp;quot;tp3&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                llSetLinkPrimitiveParamsFast(index, [&lt;br /&gt;
                    PRIM_COLOR, ALL_SIDES, white, 1,&lt;br /&gt;
                    PRIM_POSITION, &amp;lt;0.0, 0.0, -0.1275&amp;gt;*currentRot,&lt;br /&gt;
                    PRIM_SIZE, &amp;lt;0.025, 0.025, 0.01&amp;gt;,&lt;br /&gt;
                    PRIM_TEXT, llGetInventoryName(INVENTORY_LANDMARK, 2), white, 1]);&lt;br /&gt;
            }&lt;br /&gt;
            else if (linkName == &amp;quot;tp4&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                llSetLinkPrimitiveParamsFast(index, [&lt;br /&gt;
                    PRIM_COLOR, ALL_SIDES, orange, 1,&lt;br /&gt;
                    PRIM_POSITION, &amp;lt;0.0, 0.0, -0.1675&amp;gt;*currentRot,&lt;br /&gt;
                    PRIM_SIZE, &amp;lt;0.025, 0.025, 0.01&amp;gt;,&lt;br /&gt;
                    PRIM_TEXT, llGetInventoryName(INVENTORY_LANDMARK, 3), orange, 1]);&lt;br /&gt;
            }&lt;br /&gt;
            else if (linkName == &amp;quot;tp5&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                llSetLinkPrimitiveParamsFast(index, [&lt;br /&gt;
                    PRIM_COLOR, ALL_SIDES, white, 1,&lt;br /&gt;
                    PRIM_POSITION, &amp;lt;0.0, 0.0, -0.2075&amp;gt;*currentRot,&lt;br /&gt;
                    PRIM_SIZE, &amp;lt;0.025, 0.025, 0.01&amp;gt;,&lt;br /&gt;
                    PRIM_TEXT, llGetInventoryName(INVENTORY_LANDMARK, 4), white, 1]);&lt;br /&gt;
            }&lt;br /&gt;
            else if (linkName == &amp;quot;tp6&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                llSetLinkPrimitiveParamsFast(index, [&lt;br /&gt;
                    PRIM_COLOR, ALL_SIDES, orange, 1,&lt;br /&gt;
                    PRIM_POSITION, &amp;lt;0.0, 0.0, -0.2475&amp;gt;*currentRot,&lt;br /&gt;
                    PRIM_SIZE, &amp;lt;0.025, 0.025, 0.01&amp;gt;,&lt;br /&gt;
                    PRIM_TEXT, llGetInventoryName(INVENTORY_LANDMARK, 5), orange, 1]);&lt;br /&gt;
            }&lt;br /&gt;
            else if (linkName == &amp;quot;tp7&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                llSetLinkPrimitiveParamsFast(index, [&lt;br /&gt;
                    PRIM_COLOR, ALL_SIDES, white, 1,&lt;br /&gt;
                    PRIM_POSITION, &amp;lt;0.0, 0.0, -0.2875&amp;gt;*currentRot,&lt;br /&gt;
                    PRIM_SIZE, &amp;lt;0.025, 0.025, 0.01&amp;gt;,&lt;br /&gt;
                    PRIM_TEXT, llGetInventoryName(INVENTORY_LANDMARK, 6), white, 1]);&lt;br /&gt;
            }&lt;br /&gt;
            else if (linkName == &amp;quot;tp8&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                llSetLinkPrimitiveParamsFast(index, [&lt;br /&gt;
                    PRIM_COLOR, ALL_SIDES, orange, 1,&lt;br /&gt;
                    PRIM_POSITION, &amp;lt;0.0, 0.0, -0.3275&amp;gt;*currentRot,&lt;br /&gt;
                    PRIM_SIZE,&amp;lt;0.025, 0.025, 0.01&amp;gt;,&lt;br /&gt;
                    PRIM_TEXT, llGetInventoryName(INVENTORY_LANDMARK, 7), orange, 1]);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        while (++index &amp;lt;= numOfPrims);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        rotation currentRot = llGetRot();&lt;br /&gt;
        integer numOfPrims = llGetNumberOfPrims();&lt;br /&gt;
&lt;br /&gt;
        integer index = 1;//  root of linkset&lt;br /&gt;
        do&lt;br /&gt;
        {&lt;br /&gt;
            string linkName = llGetLinkName(index);&lt;br /&gt;
&lt;br /&gt;
            if (linkName == &amp;quot;TP HUD for landmarks&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                llSetLinkPrimitiveParamsFast(index,&lt;br /&gt;
                    [PRIM_COLOR, ALL_SIDES, ZERO_VECTOR, 1,&lt;br /&gt;
                    PRIM_COLOR, 3, &amp;lt;1.0, 0.0, 0.0&amp;gt;, 1,&lt;br /&gt;
                    //  red and opaque floattext&lt;br /&gt;
                    PRIM_TEXT, &amp;quot;&amp;lt;~!~ TP HUD ~!~&amp;gt;&amp;quot;, &amp;lt;1.0, 0.0, 0.0&amp;gt;, 1]);&lt;br /&gt;
            }&lt;br /&gt;
            else if (linkName == &amp;quot;tp1&amp;quot; || linkName == &amp;quot;tp2&amp;quot;&lt;br /&gt;
                || linkName == &amp;quot;tp3&amp;quot; || linkName == &amp;quot;tp4&amp;quot;&lt;br /&gt;
                || linkName == &amp;quot;tp5&amp;quot; || linkName == &amp;quot;tp6&amp;quot;&lt;br /&gt;
                || linkName == &amp;quot;tp7&amp;quot; || linkName == &amp;quot;tp8&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                llSetLinkPrimitiveParamsFast(index, [&lt;br /&gt;
                    PRIM_COLOR, ALL_SIDES, ZERO_VECTOR, 0,&lt;br /&gt;
                    PRIM_POSITION, ZERO_VECTOR*currentRot,&lt;br /&gt;
                    PRIM_SIZE, &amp;lt;0.01, 0.01, 0.01&amp;gt;,&lt;br /&gt;
                    //  black and transparent floattext&lt;br /&gt;
                    PRIM_TEXT, &amp;quot;&amp;quot;, ZERO_VECTOR, 0]);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        while (++index &amp;lt;= numOfPrims);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    changed(integer change)&lt;br /&gt;
    {&lt;br /&gt;
        if (change &amp;amp; (CHANGED_OWNER | CHANGED_INVENTORY))&lt;br /&gt;
            llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    attach(key attached)&lt;br /&gt;
    {&lt;br /&gt;
        if (attached != NULL_KEY)&lt;br /&gt;
            llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSetLinkPrimitiveParamsFast(LINK_ROOT,&lt;br /&gt;
            [PRIM_NAME, &amp;quot;TP HUD for landmarks&amp;quot;,&lt;br /&gt;
            PRIM_LINK_TARGET, 2,&lt;br /&gt;
            PRIM_NAME, &amp;quot;tp1&amp;quot;,&lt;br /&gt;
            PRIM_LINK_TARGET, 3,&lt;br /&gt;
            PRIM_NAME, &amp;quot;tp2&amp;quot;,&lt;br /&gt;
            PRIM_LINK_TARGET, 4,&lt;br /&gt;
            PRIM_NAME, &amp;quot;tp3&amp;quot;,&lt;br /&gt;
            PRIM_LINK_TARGET, 5,&lt;br /&gt;
            PRIM_NAME, &amp;quot;tp4&amp;quot;,&lt;br /&gt;
            PRIM_LINK_TARGET, 6,&lt;br /&gt;
            PRIM_NAME, &amp;quot;tp5&amp;quot;,&lt;br /&gt;
            PRIM_LINK_TARGET, 7,&lt;br /&gt;
            PRIM_NAME, &amp;quot;tp6&amp;quot;,&lt;br /&gt;
            PRIM_LINK_TARGET, 8,&lt;br /&gt;
            PRIM_NAME, &amp;quot;tp7&amp;quot;,&lt;br /&gt;
            PRIM_LINK_TARGET, 9,&lt;br /&gt;
            PRIM_NAME, &amp;quot;tp8&amp;quot; ]);&lt;br /&gt;
&lt;br /&gt;
        owner = llGetOwner();&lt;br /&gt;
        gotTPperms = FALSE;&lt;br /&gt;
&lt;br /&gt;
        isShowing = FALSE;&lt;br /&gt;
        toggle(isShowing);&lt;br /&gt;
&lt;br /&gt;
        //  request teleport perms and controls perms for no-script area hack&lt;br /&gt;
        llRequestPermissions(owner, (PERMISSION_TELEPORT | PERMISSION_TAKE_CONTROLS));&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer num_detected)&lt;br /&gt;
    {&lt;br /&gt;
        key id = llDetectedKey(0);&lt;br /&gt;
        string linkName = llGetLinkName(llDetectedLinkNumber(0));&lt;br /&gt;
        string tpDestination;&lt;br /&gt;
&lt;br /&gt;
        if (id != owner)&lt;br /&gt;
            return;&lt;br /&gt;
&lt;br /&gt;
        if (gotTPperms &amp;amp;&amp;amp; linkName == &amp;quot;TP HUD for landmarks&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            isShowing = !isShowing;&lt;br /&gt;
            toggle(isShowing);&lt;br /&gt;
        }&lt;br /&gt;
        else if (linkName == &amp;quot;tp1&amp;quot;)&lt;br /&gt;
            tpDestination = llGetInventoryName(INVENTORY_LANDMARK, 0);&lt;br /&gt;
        else if (linkName == &amp;quot;tp2&amp;quot;)&lt;br /&gt;
            tpDestination = llGetInventoryName(INVENTORY_LANDMARK, 1);&lt;br /&gt;
        else if (linkName == &amp;quot;tp3&amp;quot;)&lt;br /&gt;
            tpDestination = llGetInventoryName(INVENTORY_LANDMARK, 2);&lt;br /&gt;
        else if (linkName == &amp;quot;tp4&amp;quot;)&lt;br /&gt;
            tpDestination = llGetInventoryName(INVENTORY_LANDMARK, 3);&lt;br /&gt;
        else if (linkName == &amp;quot;tp5&amp;quot;)&lt;br /&gt;
            tpDestination = llGetInventoryName(INVENTORY_LANDMARK, 4);&lt;br /&gt;
        else if (linkName == &amp;quot;tp6&amp;quot;)&lt;br /&gt;
            tpDestination = llGetInventoryName(INVENTORY_LANDMARK, 5);&lt;br /&gt;
        else if (linkName == &amp;quot;tp7&amp;quot;)&lt;br /&gt;
            tpDestination = llGetInventoryName(INVENTORY_LANDMARK, 6);&lt;br /&gt;
        else if (linkName == &amp;quot;tp8&amp;quot;)&lt;br /&gt;
            tpDestination = llGetInventoryName(INVENTORY_LANDMARK, 7);&lt;br /&gt;
&lt;br /&gt;
        if (tpDestination == &amp;quot;&amp;quot;)&lt;br /&gt;
            llOwnerSay(&amp;quot;Invalid destination!&amp;quot;);&lt;br /&gt;
        else&lt;br /&gt;
            llTeleportAgent(owner, tpDestination, ZERO_VECTOR, ZERO_VECTOR);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //  no-script area hack&lt;br /&gt;
    control(key id,integer held, integer change)&lt;br /&gt;
    {&lt;br /&gt;
        return;&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_TAKE_CONTROLS)&lt;br /&gt;
            llTakeControls(CONTROL_UP,TRUE,TRUE);&lt;br /&gt;
        if (perm &amp;amp; PERMISSION_TELEPORT)&lt;br /&gt;
            gotTPperms = TRUE;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
{{LSLC|Library|Teleport HUD}}&lt;/div&gt;</summary>
		<author><name>Omei Qunhua</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlDetectedVel&amp;diff=1198875</id>
		<title>LlDetectedVel</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlDetectedVel&amp;diff=1198875"/>
		<updated>2016-01-18T16:46:13Z</updated>

		<summary type="html">&lt;p&gt;Omei Qunhua: Make example match the description&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function&lt;br /&gt;
|inject-2={{Issues/SVC-5821}}{{LSL_Function/detected|number|vel|error=[[ZERO_VECTOR|&amp;lt;0.0, 0.0, 0.0&amp;gt;]]}}&lt;br /&gt;
|func_id=36|func_sleep=0.0|func_energy=10.0&lt;br /&gt;
|sort=DetectedVel|func=llDetectedVel|return_type=vector&lt;br /&gt;
|p1_type=integer|p1_name=number&lt;br /&gt;
|func_footnote=Returns {{LSLG|ZERO_VECTOR|&amp;lt;0.0, 0.0, 0.0&amp;gt;}} if {{LSLP|number}} is not valid sensed object or avatar.&lt;br /&gt;
|func_desc&lt;br /&gt;
|Return_text=velocity of {{LSLGC|Detected|detected}} object or avatar {{LSLP|number}}.&lt;br /&gt;
|spec&lt;br /&gt;
|caveats&lt;br /&gt;
|constants&lt;br /&gt;
|examples=&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
//Tells the name and velocity of all near-by avatars.&lt;br /&gt;
default &lt;br /&gt;
{&lt;br /&gt;
    state_entry() &lt;br /&gt;
    {&lt;br /&gt;
        // Scan once for avatars within a 96 metre radius sphere&lt;br /&gt;
        llSensor(&amp;quot;&amp;quot;, &amp;quot;&amp;quot;, AGENT, 96, PI);&lt;br /&gt;
    }&lt;br /&gt;
    sensor(integer num) &lt;br /&gt;
    {&lt;br /&gt;
        // num will initially be 1 or more. When num is 1, the index of the detected avatar will be zero       &lt;br /&gt;
        while(num--) &lt;br /&gt;
        {&lt;br /&gt;
            llOwnerSay(llDetectedName(num) + &amp;quot; is moving at &amp;quot; + (string)llVecMag(llDetectedVel(num)) + &amp;quot; m/s.&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|helpers&lt;br /&gt;
|also_functions&lt;br /&gt;
|also_events&lt;br /&gt;
|also_articles&lt;br /&gt;
|notes&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Omei Qunhua</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlDetectedOwner&amp;diff=1198874</id>
		<title>LlDetectedOwner</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlDetectedOwner&amp;diff=1198874"/>
		<updated>2016-01-18T12:45:47Z</updated>

		<summary type="html">&lt;p&gt;Omei Qunhua: English. Promote function in question within the example&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function&lt;br /&gt;
|inject-2={{LSL_Function/detected|number|owner}}&lt;br /&gt;
|func_id=33|func_sleep=0.0|func_energy=10.0&lt;br /&gt;
|sort=DetectedOwner&lt;br /&gt;
|func=llDetectedOwner|return_type=key|p1_type=integer|p1_name=number&lt;br /&gt;
|func_footnote=Returns an {{HoverText|empty key|{{String}}}} if {{LSLP|number}} does not relate to a valid sensed object&lt;br /&gt;
|func_desc&lt;br /&gt;
|Return_text=([[UUID]]) of the {{LSLGC|Owner|owner}} of the [[object]].&lt;br /&gt;
|spec&lt;br /&gt;
|caveats&lt;br /&gt;
|constants&lt;br /&gt;
|examples=&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    collision_start(integer num_detected)&lt;br /&gt;
    {&lt;br /&gt;
        string output =&lt;br /&gt;
            &amp;quot;\nkey of colliding object&#039;s owner ... or the colliding avatar: &amp;quot; + (string)llDetectedOwner(0)&lt;br /&gt;
            + &amp;quot;\nkey of this object&#039;s owner: &amp;quot; + (string)llGetOwner()&lt;br /&gt;
            + &amp;quot;\nname of colliding object/avatar: &amp;quot; + llDetectedName(0)&lt;br /&gt;
            + &amp;quot;\nkey of colliding object/avatar: &amp;quot; + (string)llDetectedKey(0)&lt;br /&gt;
            + &amp;quot;\nkey of the prim containing this script: &amp;quot; + (string)llGetKey()&lt;br /&gt;
            + &amp;quot;\nkey of this object&#039;s root prim: &amp;quot; + (string)llGetLinkKey(LINK_ROOT);        &lt;br /&gt;
        llSay(0, output);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|helpers&lt;br /&gt;
|also_functions=&lt;br /&gt;
{{LSL DefineRow||[[llGetOwnerKey]]|llGetOwnerKey(llDetectedKey(number)) is the same as llDetectedOwner(number) only if the detected object is in the same region.}}&lt;br /&gt;
{{LSL DefineRow||[[llGetOwner]]|}}&lt;br /&gt;
|also_events&lt;br /&gt;
|also_articles&lt;br /&gt;
|notes=If the [[llDetectedType|detected type]] is an [[AGENT_BY_LEGACY_NAME|avatar]] the key of that avatar is returned. Avatars are owned by themselves. [[llGetOwnerKey]] works the same way with regards to avatar UUIDs.&lt;br /&gt;
|cat1=Owner&lt;br /&gt;
|cat2&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Omei Qunhua</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlDetectedPos&amp;diff=1198869</id>
		<title>LlDetectedPos</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlDetectedPos&amp;diff=1198869"/>
		<updated>2016-01-17T22:50:40Z</updated>

		<summary type="html">&lt;p&gt;Omei Qunhua: Start with a simple focussed example&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function&lt;br /&gt;
|inject-2={{LSL_Function/detected|number|pos|error=[[ZERO_VECTOR|&amp;lt;0.0, 0.0, 0.0&amp;gt;]]}}&lt;br /&gt;
|func_id=35|func_sleep=0.0|func_energy=10.0&lt;br /&gt;
|sort=DetectedPos|func=llDetectedPos&lt;br /&gt;
|return_type=vector&lt;br /&gt;
|p1_type=integer|p1_name=number&lt;br /&gt;
|func_footnote=Returns {{LSLG|ZERO_VECTOR|&amp;lt;0.0, 0.0, 0.0&amp;gt;}} if number is not valid sensed object.&lt;br /&gt;
|func_desc&lt;br /&gt;
|return_text=that is the position (in [[Viewer_coordinate_frames#Region|region coordinates]]) of {{LSLGC|Detected|detected}} object number.&lt;br /&gt;
|spec&lt;br /&gt;
|caveats&lt;br /&gt;
|constants&lt;br /&gt;
|examples=&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Get position and distance of toucher&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
	// get the position of the avatar touching this prim&lt;br /&gt;
	vector pos = llDetectedPos(0);&lt;br /&gt;
		&lt;br /&gt;
	// compute how far away they are&lt;br /&gt;
	float dist = llVecDist(pos, llGetPos() );&lt;br /&gt;
		&lt;br /&gt;
	llSay(0, &amp;quot;You are &amp;quot; + (string) dist + &amp;quot; metres from me, at coordinates &amp;quot; + (string) pos);&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// get name and sim position of Avatars within &amp;quot;say&amp;quot; range&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llOwnerSay( &amp;quot;Touch me to get the positions of avatars in &#039;Say&#039; range&amp;quot; );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    touch_start( integer vIntTouchCount )&lt;br /&gt;
    {&lt;br /&gt;
        // Do a one-off sensor sweep over a 20m radius sphere for avatars&lt;br /&gt;
        llSensor( &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, AGENT, 20, PI );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    sensor( integer vIntFound )&lt;br /&gt;
    {&lt;br /&gt;
        integer vIntCounter = 0;&lt;br /&gt;
        //-- loop through all avatars found&lt;br /&gt;
        do&lt;br /&gt;
        {&lt;br /&gt;
            llOwnerSay( llDetectedName( vIntCounter )&lt;br /&gt;
                // get the position of this detected avatar&lt;br /&gt;
                + (string) llDetectedPos( vIntCounter ) );&lt;br /&gt;
        } while (++vIntCounter &amp;lt; vIntFound); &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    // sensor does not detect owner if it&#039;s attached&lt;br /&gt;
    no_sensor()&lt;br /&gt;
    {&lt;br /&gt;
        llOwnerSay( &amp;quot;I couldn&#039;t find anybody&amp;quot; );&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
|helpers&lt;br /&gt;
|also_functions&lt;br /&gt;
|also_events&lt;br /&gt;
|also_articles&lt;br /&gt;
|notes&lt;br /&gt;
|permission&lt;br /&gt;
|cat1&lt;br /&gt;
|cat2&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Omei Qunhua</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlSensorRemove&amp;diff=1198868</id>
		<title>LlSensorRemove</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlSensorRemove&amp;diff=1198868"/>
		<updated>2016-01-17T20:19:34Z</updated>

		<summary type="html">&lt;p&gt;Omei Qunhua: Focus example 1 on demonstrating the function in question. Example 2  added nothing to the understanding of llSensorRemove() and is available elsewhere.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Function&lt;br /&gt;
|func_id=30&lt;br /&gt;
|func_sleep=0.0&lt;br /&gt;
|func_energy=10.0&lt;br /&gt;
|func=llSensorRemove&lt;br /&gt;
|func_desc=Removes the sensor setup by [[llSensorRepeat]].&lt;br /&gt;
|func_footnote=There are no parameters or return value for this function, as only one [[llSensorRepeat]] can be specified per script.&lt;br /&gt;
|spec&lt;br /&gt;
|caveats=*If called within the [[sensor]] event then it also removes all of the sensor data that is accessed by the {{LSLGC|Detected|detection}} functions. &lt;br /&gt;
|constants&lt;br /&gt;
|examples=The following basic example shows an object that when touched starts scanning for avatars in 10m every 30 seconds, and stops as soon as at least one is found, and returns their name.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;default {&lt;br /&gt;
    touch_start(integer x) {&lt;br /&gt;
        llSensorRepeat(&amp;quot;&amp;quot;, NULL_KEY, AGENT, 10.0, PI, 30.0);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    sensor(integer x) {&lt;br /&gt;
        llSay(0, llDetectedName(0) + &amp;quot; was found first!&amp;quot;);&lt;br /&gt;
        llSensorRemove();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|helpers&lt;br /&gt;
|also_functions=&lt;br /&gt;
{{LSL DefineRow||[[llSensorRepeat]]|Scans for agents or objects every time period}}&lt;br /&gt;
{{LSL DefineRow||[[llSensor]]| Runs a sensor once}}&lt;br /&gt;
|also_tests&lt;br /&gt;
|also_events=&lt;br /&gt;
{{LSL DefineRow||[[sensor]]|Triggered when a sensor detects something}}&lt;br /&gt;
{{LSL DefineRow||[[no_sensor]]|Triggered when a sensor detects nothing}}&lt;br /&gt;
|also_articles&lt;br /&gt;
|notes&lt;br /&gt;
|cat1=Sensor&lt;br /&gt;
|haiku={{Haiku|Call off the hounds.|The quarry has escaped us.|Back to the stables.}}&lt;br /&gt;
|cat2&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Omei Qunhua</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlSqrt&amp;diff=1198844</id>
		<title>LlSqrt</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlSqrt&amp;diff=1198844"/>
		<updated>2016-01-13T21:35:59Z</updated>

		<summary type="html">&lt;p&gt;Omei Qunhua: NaN returned under Mono&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function&lt;br /&gt;
|func=llSqrt|sort=Sqrt&lt;br /&gt;
|func_id=4|func_sleep=0.0|func_energy=10.0&lt;br /&gt;
|func_footnote=For imaginary results (val &amp;lt; 0.0), a {{LSLGC|Error/Math|Math Error}} is triggered under LSO , or &#039;NaN&#039; (Not A Number)  is returned under Mono&lt;br /&gt;
|p1_type=float|p1_name=val|p1_desc=positive number (val &amp;amp;gt;= 0.0)&lt;br /&gt;
|return_type=float&lt;br /&gt;
|return_text=that is the square root of {{LSLP|val}}.&lt;br /&gt;
|spec&lt;br /&gt;
|caveats=* Crashes the script if passed a negative number.&lt;br /&gt;
|constants&lt;br /&gt;
|examples=&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
  state_entry()&lt;br /&gt;
  {&lt;br /&gt;
    float num1 = llFrand(100.0);&lt;br /&gt;
&lt;br /&gt;
    llOwnerSay(&amp;quot;The square root of &amp;quot; + (string)num1 + &amp;quot; is &amp;quot; + (string)llSqrt(num1));&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|helpers&lt;br /&gt;
|also_functions={{LSL DefineRow||[[llLog]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llLog10]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llPow]]|}}&lt;br /&gt;
|also_events&lt;br /&gt;
|also_articles&lt;br /&gt;
|also_tests&lt;br /&gt;
|notes=If you need the square root of two use [[SQRT2]].&lt;br /&gt;
|permission&lt;br /&gt;
|negative_index&lt;br /&gt;
|cat1=Math&lt;br /&gt;
|cat2=Error/Math&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
|haiku={{Haiku|Gleaming in the sun|the water gun lays broken.|It&#039;s SQuare RooT not SQuiRT.}}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Omei Qunhua</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlListStatistics&amp;diff=1198841</id>
		<title>LlListStatistics</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlListStatistics&amp;diff=1198841"/>
		<updated>2016-01-13T14:41:52Z</updated>

		<summary type="html">&lt;p&gt;Omei Qunhua: Add an example showing expected results for each statistical operation on a sample list&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function&lt;br /&gt;
|func_id=315|func_sleep=0.0|func_energy=10.0&lt;br /&gt;
|func=llListStatistics|return_type=float|p1_type=integer|p1_name=operation|p1_desc=a LIST_STAT_* flag&lt;br /&gt;
|p2_type=list|p2_name=src&lt;br /&gt;
|func_footnote=If a list entry type is not a float or an integer it is silently ignored. &lt;br /&gt;
|func_desc&lt;br /&gt;
|return_text=that is the result of performing statistical aggregate function {{LSLP|operation}} on {{LSLP|src}}.&lt;br /&gt;
|spec&lt;br /&gt;
|caveats&lt;br /&gt;
|constants={{{!}} class=&amp;quot;sortable&amp;quot; {{Prettytable|style=margin-top:0;}}&lt;br /&gt;
{{!}}-{{Hl2}}&lt;br /&gt;
!Constant&lt;br /&gt;
! title=&amp;quot;Value&amp;quot; {{!}}&lt;br /&gt;
! class=&amp;quot;unsortable&amp;quot; {{!}} Description&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} {{LSL Const|LIST_STAT_RANGE|integer|0|c=Calculates the range.}}&lt;br /&gt;
{{!}} {{#var:value}}&lt;br /&gt;
{{!}} {{#var:comment}}&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} {{LSL Const|LIST_STAT_MIN|integer|1|c=Calculates the smallest number.}}&lt;br /&gt;
{{!}} {{#var:value}}&lt;br /&gt;
{{!}} {{#var:comment}}&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} {{LSL Const|LIST_STAT_MAX|integer|2|c=Calculates the largest number.}}&lt;br /&gt;
{{!}} {{#var:value}}&lt;br /&gt;
{{!}} {{#var:comment}}&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} {{LSL Const|LIST_STAT_MEAN|integer|3|c=Calculates the mean (average).}}&lt;br /&gt;
{{!}} {{#var:value}}&lt;br /&gt;
{{!}} {{#var:comment}}&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} {{LSL Const|LIST_STAT_MEDIAN|integer|4|c=Calculates the median number.}}&lt;br /&gt;
{{!}} {{#var:value}}&lt;br /&gt;
{{!}} {{#var:comment}}&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} {{LSL Const|LIST_STAT_STD_DEV|integer|5|c=Calculates the standard deviation.}}&lt;br /&gt;
{{!}} {{#var:value}}&lt;br /&gt;
{{!}} {{#var:comment}}&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} {{LSL Const|LIST_STAT_SUM|integer|6|c=Calculates the sum.}}&lt;br /&gt;
{{!}} {{#var:value}}&lt;br /&gt;
{{!}} {{#var:comment}}&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} {{LSL Const|LIST_STAT_SUM_SQUARES|integer|7|c=Calculates the sum of the squares.}}&lt;br /&gt;
{{!}} {{#var:value}}&lt;br /&gt;
{{!}} {{#var:comment}}&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} {{LSL Const|LIST_STAT_NUM_COUNT|integer|8|c=Determines the number of float and integer elements.}}&lt;br /&gt;
{{!}} {{#var:value}}&lt;br /&gt;
{{!}} Determines the number of [[float]] and [[integer]] elements.&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} {{LSL Const|LIST_STAT_GEOMETRIC_MEAN|integer|9|c=Calculates the geometric mean.}}&lt;br /&gt;
{{!}} {{#var:value}}&lt;br /&gt;
{{!}} {{#var:comment}}&lt;br /&gt;
{{!}}}&lt;br /&gt;
|examples=&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Show results for each operation for a sample list&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        list LX = [-1, 3.33, 17, &amp;quot;object&amp;quot;, -4.5, 0.8675 ];&lt;br /&gt;
&lt;br /&gt;
        llSay(0, &amp;quot;G.Mean= &amp;quot; + (string) llListStatistics(LIST_STAT_GEOMETRIC_MEAN, LX) );           // 0. 000000&lt;br /&gt;
        llSay(0, &amp;quot;Max= &amp;quot; + (string) llListStatistics(LIST_STAT_MAX, LX) );                         // 17.000000&lt;br /&gt;
        llSay(0, &amp;quot;Min= &amp;quot; + (string) llListStatistics(LIST_STAT_MIN, LX) );                         // -4.500000&lt;br /&gt;
        llSay(0, &amp;quot;Mean= &amp;quot; + (string) llListStatistics(LIST_STAT_MEAN, LX) );                       // 3.139500&lt;br /&gt;
        llSay(0, &amp;quot;Median= &amp;quot; + (string) llListStatistics(LIST_STAT_MEDIAN, LX) );                   // 0.867500&lt;br /&gt;
        llSay(0, &amp;quot;Count= &amp;quot; + (string) llListStatistics(LIST_STAT_NUM_COUNT, LX) );                 // 5.000000&lt;br /&gt;
        llSay(0, &amp;quot;Range= &amp;quot; + (string) llListStatistics(LIST_STAT_RANGE, LX) );                     // 21.500000&lt;br /&gt;
        llSay(0, &amp;quot;Std.Dev= &amp;quot; + (string) llListStatistics(LIST_STAT_STD_DEV, LX) );                 // 8.258468&lt;br /&gt;
        llSay(0, &amp;quot;Sum= &amp;quot; + (string) llListStatistics(LIST_STAT_SUM, LX) );                         // 15.697500&lt;br /&gt;
        llSay(0, &amp;quot;Sum of squares= &amp;quot; + (string) llListStatistics(LIST_STAT_SUM_SQUARES, LX) );      // 322.091500&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
// Note that LSLEditor produces &amp;quot;NaN&amp;quot; (Not A Number) for the geometric mean above. Geometric mean applies only to numbers of the same sign.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// shows just how bad SL is behaving and demonstrates the use of llListStatistics()&lt;br /&gt;
list dil_s;&lt;br /&gt;
list fps_s;&lt;br /&gt;
integer ticks = 0;&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSetTimerEvent(1.0);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    on_rez (integer parm)&lt;br /&gt;
    {&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        dil_s = llList2List(dil_s + llGetRegionTimeDilation(), -60, -1);&lt;br /&gt;
        fps_s = llList2List(fps_s + llGetRegionFPS(), -60, -1);&lt;br /&gt;
        if(3 &amp;lt;= ++ticks)&lt;br /&gt;
        {&lt;br /&gt;
            llSetText(&lt;br /&gt;
                &amp;quot;Dilation: min=&amp;quot;+(string) llListStatistics(LIST_STAT_MIN, dil_s) + &amp;quot;, mean=&amp;quot; +&lt;br /&gt;
                    (string) llListStatistics(LIST_STAT_MEAN, dil_s) + &amp;quot;, max=&amp;quot; +&lt;br /&gt;
                    (string) llListStatistics(LIST_STAT_MAX, dil_s) + &amp;quot;, std.dev=&amp;quot; +&lt;br /&gt;
                    (string) llListStatistics(LIST_STAT_STD_DEV, dil_s) + &amp;quot;\n&amp;quot; + &lt;br /&gt;
                    &amp;quot;FPS: min=&amp;quot;+(string) llListStatistics(LIST_STAT_MIN, fps_s) + &amp;quot;, mean=&amp;quot; +&lt;br /&gt;
                    (string) llListStatistics(LIST_STAT_MEAN, fps_s) + &amp;quot;, max=&amp;quot; +&lt;br /&gt;
                    (string) llListStatistics(LIST_STAT_MAX, fps_s) + &amp;quot;, std.dev=&amp;quot; +&lt;br /&gt;
                    (string) llListStatistics(LIST_STAT_STD_DEV, fps_s),&lt;br /&gt;
                &amp;lt;1.0, 1.0, 0.0&amp;gt;, //yellow&lt;br /&gt;
                1.0);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    changed(integer change)&lt;br /&gt;
    {&lt;br /&gt;
        if(change &amp;amp; CHANGED_REGION)&lt;br /&gt;
        {&lt;br /&gt;
            llResetScript();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
|helpers&lt;br /&gt;
|also_functions=&lt;br /&gt;
{{LSL DefineRow||[[llGetListEntryType]]|}}&lt;br /&gt;
|also_events&lt;br /&gt;
|also_tests=&lt;br /&gt;
{{LSL DefineRow||[[llListStatistics Test]]|}}&lt;br /&gt;
|also_articles&lt;br /&gt;
|notes=Given that this operation ignores any non-numbers in a list, it can be used to tell you, in a mixed list, how many of the elements in a list are numbers (when used with the [[LIST_STAT_NUM_COUNT]] parameter.)&lt;br /&gt;
|permission&lt;br /&gt;
|negative_index&lt;br /&gt;
|sort=ListStatistics&lt;br /&gt;
|cat1=List&lt;br /&gt;
|cat2=Math&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Omei Qunhua</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlSensorRepeat&amp;diff=1198810</id>
		<title>LlSensorRepeat</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlSensorRepeat&amp;diff=1198810"/>
		<updated>2016-01-10T22:57:56Z</updated>

		<summary type="html">&lt;p&gt;Omei Qunhua: Remove unused variable, avoid redefinition of a variable, avoid un-necessary variables. Scanning for agents ten times per second is excessive.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function&lt;br /&gt;
|inject-2={{LSL_Function/uuid|id|object=*}}{{LSL Constants/Sensing|type}}&lt;br /&gt;
|inject-3={{Issues/SVC-2409}}{{Issues/SVC-4301}}{{Issues/SVC-6662}}{{Issues/BUG-2366}}&lt;br /&gt;
|func=llSensorRepeat|sort=SensorRepeat&lt;br /&gt;
|func_id=29|func_sleep=0.0|func_energy=10.0&lt;br /&gt;
|p1_type=string|p1_name=name|p1_hover=Object or avatar name|p1_desc=Object or avatar name[[#NameFormat|&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;!&amp;lt;/span&amp;gt;]]&lt;br /&gt;
|p2_type=key|p2_name=id&lt;br /&gt;
|p3_type=integer|p3_name=type|p3_desc=mask ({{#var:AGENT_BY_LEGACY_NAME}}, {{#var:AGENT_BY_USERNAME}}, {{#var:ACTIVE}}, {{#var:PASSIVE}}, and/or {{#var:SCRIPTED}})|p3_hover=mask (AGENT_BY_LEGACY_NAME, AGENT_BY_USERNAME, ACTIVE, PASSIVE, and/or SCRIPTED)&lt;br /&gt;
|p4_type=float|p4_name=range|p4_desc=range in meters, {{Interval|gte=0.0|lte=96.0|center=range}}|p4_hover=range in meters, {{Interval/Hover|gte=0.0|lte=96.0|center=range}}&lt;br /&gt;
|p5_type=float|p5_name=arc|p5_desc=the max angle between the local x-axis of the prim and detectable objects, range {{Interval|gte=0.0|lteh=PI|lte={{#var:PI}}|center=arc}}|p5_hover=the max angle between the local x-axis of the prim and detectable objects, range {{Interval/Hover|gte=0.0|lte=PI|center=arc}}&lt;br /&gt;
|p6_type=float|p6_name=rate|p6_desc=How often a [[sensor]]/[[no_sensor]] will be queued.&lt;br /&gt;
|func_footnote=If {{LSLP|name}}, {{LSLP|id}}, and/or {{LSLP|type}} are empty or 0, they are ignored.&amp;lt;br/&amp;gt;If {{LSLP|id}} is an invalid key or [[NULL_KEY]] it is treated as empty.&amp;lt;br id=&amp;quot;NameFormat&amp;quot;/&amp;gt;Depending upon which AGENT* flag is used determines the format requirements for {{LSLP|name}}&lt;br /&gt;
&lt;br /&gt;
See: [http://www.lslwiki.net/lslwiki/wakka.php?wakka=llSensor llSensor] for an excellent explanation of {{LSLP|arc}}.&lt;br /&gt;
|func_desc=Performs a single scan for {{LSLP|name}} and {{LSLP|id}} with {{LSLP|type}} within {{LSLP|range}} meters and {{LSLP|arc}} radians of forward vector and repeats every {{LSLP|rate}} seconds. It does not perform the first scan until {{LSLP|rate}} seconds have passed.&lt;br /&gt;
|return_text&lt;br /&gt;
|spec&lt;br /&gt;
|caveats=*The repeat of the sensor event is adversely affected by [[llGetRegionTimeDilation|time dilation]] (lag).&lt;br /&gt;
*Sensors placed in the root prim of attachments will use the direction the avatar is facing as their forward vector. In mouselook, this means that it will be wherever the avatar is looking, while out of mouselook, this means whichever way the avatar is pointing. This does not include where the avatar&#039;s head is pointing, or what animation the avatar is doing, just the direction the avatar would move in if you walked forward. This is the case, regardless of where the object is attached.&lt;br /&gt;
*Sensors placed in prims other than the root prim of an attachment will have their forward direction offset relative to the root prim&#039;s forward direction, e.g. a sensor in a prim whose +X direction is the reverse of the root +X will look backward.&lt;br /&gt;
* Only the most recent [[sensor]] event is queued. Previous sensor events are replaced.&lt;br /&gt;
* A repeating sensor does not persist across a state change.&lt;br /&gt;
* [[llSensorRepeat]] can occasionally detect outside of it&#039;s specified range every few cycles when used near sim borders. [[llSensor]] in a [[timer]] does not.&lt;br /&gt;
|examples=&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Written by Steamy Latte.&lt;br /&gt;
// Scans every 30 seconds for visitors within 10 meters.&lt;br /&gt;
// Reports new visitors to object owner when she is in range.&lt;br /&gt;
&lt;br /&gt;
string AllAgents;&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        // arc=PI is a sphere, you could look more narrowly in the direction object is facing with PI/2, PI/4 etc.&lt;br /&gt;
        // don&#039;t repeat this too often to avoid lag.&lt;br /&gt;
        llSensorRepeat(&amp;quot;&amp;quot;, &amp;quot;&amp;quot;, AGENT_BY_LEGACY_NAME, 10.0, PI, 30.0);&lt;br /&gt;
    }&lt;br /&gt;
    sensor(integer num_detected)&lt;br /&gt;
    {&lt;br /&gt;
        string thisAgent;&lt;br /&gt;
        integer agentNum;&lt;br /&gt;
        for (agentNum=0; agentNum&amp;lt;num_detected; agentNum++)&lt;br /&gt;
        {&lt;br /&gt;
            thisAgent = llDetectedName(agentNum);&lt;br /&gt;
            if (llDetectedKey(agentNum) == llGetOwner())&lt;br /&gt;
            {&lt;br /&gt;
                if (AllAgents != &amp;quot;&amp;quot;)&lt;br /&gt;
                {&lt;br /&gt;
                    llOwnerSay(&amp;quot;We&#039;ve had the following visitors:&amp;quot; + AllAgents);&lt;br /&gt;
                    AllAgents = &amp;quot;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            else if (llSubStringIndex(AllAgents+&amp;quot;\n&amp;quot;, &amp;quot;\n&amp;quot;+thisAgent+&amp;quot;\n&amp;quot;) &amp;lt; 0)&lt;br /&gt;
            {&lt;br /&gt;
                AllAgents = AllAgents + &amp;quot;\n&amp;quot; + thisAgent;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
// Written by Evans Love.&lt;br /&gt;
// (Limited to most recent 200 names by Void Singer to prevent eventual Stack/Heap Collision + clean up)&lt;br /&gt;
// Continuously scans for visitors within 10 meters and reports new visitors to object owner.&lt;br /&gt;
//-------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
integer RESPONSE_CHANNEL = -100;&lt;br /&gt;
float   SCAN_RANGE       = 10.0;&lt;br /&gt;
float   SCAN_INTERVAL    = 20.0;&lt;br /&gt;
list    VISITOR_LIST;&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSensorRepeat(&amp;quot;&amp;quot;, NULL_KEY, AGENT_BY_LEGACY_NAME, SCAN_RANGE, PI, SCAN_INTERVAL);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    sensor(integer number_detected)&lt;br /&gt;
    {&lt;br /&gt;
        integer agent_number;&lt;br /&gt;
&lt;br /&gt;
//      iterate through all detected agents&lt;br /&gt;
        for (; agent_number &amp;lt; number_detected; agent_number++)&lt;br /&gt;
        {&lt;br /&gt;
            string  this_agent_name = llDetectedName(agent_number);&lt;br /&gt;
            key     this_agent_key  = llDetectedKey(agent_number);&lt;br /&gt;
&lt;br /&gt;
//          if the agent is not found on the list&lt;br /&gt;
            if (llListFindList(VISITOR_LIST, [this_agent_name]) == -1)&lt;br /&gt;
            {&lt;br /&gt;
//              add her/him and make the list hold the last 200 visitors&lt;br /&gt;
                VISITOR_LIST = [this_agent_name] + llList2List(VISITOR_LIST, 0, 198);&lt;br /&gt;
&lt;br /&gt;
                llDialog(this_agent_key, &amp;quot;Welcome!&amp;quot;, [&amp;quot;Ok&amp;quot;], RESPONSE_CHANNEL);&lt;br /&gt;
&lt;br /&gt;
                llOwnerSay(this_agent_name);&lt;br /&gt;
            }&lt;br /&gt;
//          else agent is already on the list&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|helpers&lt;br /&gt;
|also_functions=&lt;br /&gt;
{{LSL DefineRow||[[llSensor]]| Runs a sensor once}}&lt;br /&gt;
{{LSL DefineRow||[[llSensorRemove]]| Stops the llSensorRepeat timer}}&lt;br /&gt;
{{LSL DefineRow||[[llOverMyLand]]| What happens over owners land}}&lt;br /&gt;
|also_events=&lt;br /&gt;
{{LSL DefineRow||[[sensor]]|Triggered when a sensor detects something}}&lt;br /&gt;
{{LSL DefineRow||[[no_sensor]]|Triggered when a sensor detects nothing}}&lt;br /&gt;
|also_articles&lt;br /&gt;
|notes=&lt;br /&gt;
{{LSL Tip|You might want to use [[llGetAgentList]] instead of using sensors to get a list of all avatars within the same parcel or region.}}&lt;br /&gt;
|cat1=Sensor&lt;br /&gt;
|cat2=Detected&lt;br /&gt;
|cat3=Username/As A Parameter&lt;br /&gt;
|cat4=Legacy Name/As A Parameter&lt;br /&gt;
|haiku={{Haiku|Binoculars raised,|All eyes scan the horizon.|Ever vigilant.}}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Omei Qunhua</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlRequestURL&amp;diff=1198259</id>
		<title>LlRequestURL</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlRequestURL&amp;diff=1198259"/>
		<updated>2015-12-14T22:22:03Z</updated>

		<summary type="html">&lt;p&gt;Omei Qunhua: Reduce the first example script to the essentials.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function&lt;br /&gt;
|inject-2={{Issues/BUG-3813}}&lt;br /&gt;
|func_id=345|func_sleep=0.0|func_energy=10.0|mode&lt;br /&gt;
|func=llRequestURL&lt;br /&gt;
|return_type=key|return_subtype=handle&lt;br /&gt;
|func_footnote=&lt;br /&gt;
|func_desc=Requests one HTTP:// url for use by this [[object]]. The [[http_request]] [[event]] is triggered with the result of the request. HTTP-in uses port 12046.&lt;br /&gt;
|return_text=used for identifying the result of the request in the [[http_request]] [[event]].&lt;br /&gt;
|spec&lt;br /&gt;
|caveats=*HTTP-in uses port 12046.&lt;br /&gt;
*Use of this function is throttled. Although it has no forced sleep time, too many requests (5 ish) in a short period will cause all further requests to be denied until the script stops requesting urls for at least 1 second. Using an [[llSleep]] of 0.6 seconds or greater between each request will prevent you from being throttled.&lt;br /&gt;
*When a region is (re)started all [[http_request|HTTP server]] URLs are automatically released and invalidated.&lt;br /&gt;
**Use [[CHANGED_REGION_START]] to detect this so new URL can be requested.&lt;br /&gt;
*The number of available URLs is a limited resource, that is to say, a script can only have so many open URLs. See [[LSL http_server#Resource Limitations]] for details.&lt;br /&gt;
*When abandoning a URL, release it with [[llReleaseURL]], to avoid leaks. Resetting the script, or deleting the prim will also suffice to release URLs.&lt;br /&gt;
&lt;br /&gt;
|constants&lt;br /&gt;
|examples=&lt;br /&gt;
This script requests a new URL after region restart.&lt;br /&gt;
&lt;br /&gt;
See the discussion page for explanations as to why this particular script never needs to use llReleaseURL().&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
string url;&lt;br /&gt;
key urlRequestId;&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
	urlRequestId = llRequestURL();&lt;br /&gt;
    }&lt;br /&gt;
    on_rez(integer start_param)&lt;br /&gt;
    {&lt;br /&gt;
	llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    changed(integer change)&lt;br /&gt;
    {&lt;br /&gt;
	if (change &amp;amp; (CHANGED_OWNER | CHANGED_INVENTORY))&lt;br /&gt;
		llResetScript();&lt;br /&gt;
&lt;br /&gt;
	if (change &amp;amp; (CHANGED_REGION | CHANGED_REGION_START | CHANGED_TELEPORT))&lt;br /&gt;
		urlRequestId = llRequestURL();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    http_request(key id, string method, string body)&lt;br /&gt;
    {&lt;br /&gt;
	if (id == urlRequestId)&lt;br /&gt;
	{&lt;br /&gt;
	    if (method == URL_REQUEST_DENIED)&lt;br /&gt;
		llOwnerSay(&amp;quot;The following error occurred while attempting to get a free URL for this device:\n \n&amp;quot; + body);&lt;br /&gt;
&lt;br /&gt;
	    else if (method == URL_REQUEST_GRANTED)&lt;br /&gt;
	    {&lt;br /&gt;
		url = body;&lt;br /&gt;
		llLoadURL(llGetOwner(), &amp;quot;Click to visit my URL!&amp;quot;, url);&lt;br /&gt;
	    }&lt;br /&gt;
	}&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
It&#039;s important to keep in mind that if you request another URL, that the old one will not be released, it will remain active. The following script drives home this point.&lt;br /&gt;
&lt;br /&gt;
Try the following code ONLY if you can use all your URLs on your land.&lt;br /&gt;
Removing the prim/script will release all URLs previous assigned.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
// WARNING:&lt;br /&gt;
//&lt;br /&gt;
//      This script is only for proof-of-concept (demo purposes).&lt;br /&gt;
//      DO NOT use it if you don&#039;t have the sim owners and/or&lt;br /&gt;
//      estate managers OK to test this script.&lt;br /&gt;
//      This script can possibly block HTTP communication from and to the sim.&lt;br /&gt;
//      ...bringing down all networked vendors and/or similar machines.&lt;br /&gt;
//&lt;br /&gt;
//      This script allocates all available URLs.&lt;br /&gt;
//      Deleting the script and/or derezzing the object containing the script,&lt;br /&gt;
//      will release all previously taken URLs.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llRequestURL();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    http_request(key id, string method, string body)&lt;br /&gt;
    {&lt;br /&gt;
        if (method == URL_REQUEST_DENIED)&lt;br /&gt;
            llSetText(&amp;quot;No free URLs!&amp;quot;, &amp;lt;1.0, 0.0, 0.0&amp;gt;, 1.0);&lt;br /&gt;
&lt;br /&gt;
        else if (method == URL_REQUEST_GRANTED)&lt;br /&gt;
        {&lt;br /&gt;
            llSetText( (string)llGetFreeURLs() + &amp;quot; URLs left\n&amp;quot; + body, &amp;lt;1.0, 1.0, 1.0&amp;gt;, 1.0);&lt;br /&gt;
&lt;br /&gt;
            llRequestURL();&lt;br /&gt;
        }&lt;br /&gt;
        else if (method == &amp;quot;GET&amp;quot;)&lt;br /&gt;
            llHTTPResponse(id, 200, &amp;quot;Hello there!&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
This script will, as you can see, use all URLs available on your land because it does not remove the old URLs before requesting a new one.&lt;br /&gt;
Just store the old URL in a global variable and release it with [[llReleaseURL]].&lt;br /&gt;
|helpers&lt;br /&gt;
|also_functions=&lt;br /&gt;
{{LSL DefineRow||[[llRequestSecureURL]]}}&lt;br /&gt;
{{LSL DefineRow||[[llGetFreeURLs]]}}&lt;br /&gt;
{{LSL DefineRow||[[llReleaseURL]]}}&lt;br /&gt;
{{LSL DefineRow||[[llHTTPResponse]]}}&lt;br /&gt;
{{LSL DefineRow||[[llGetHTTPHeader]]}}&lt;br /&gt;
|also_tests&lt;br /&gt;
|also_events&lt;br /&gt;
|also_articles=&lt;br /&gt;
{{LSL DefineRow||[[LSL http server]]}}&lt;br /&gt;
|notes=&lt;br /&gt;
{{Quote|Another comment on resilient programming: getting a global resource, an HTTP listener in this case, should always be considered an operation that can fail for transitory reasons (as well as permanent ones). In this case, LSL folds retryable and permanent errors into the same error status and there&#039;s no opportunity for a script writer to distinguish the two cases. But a reasonable way to handle this is sleeping with limited retries before failing hard in the LSL code.|2=[https://jira.secondlife.com/browse/BUG-3813?focusedCommentId=399955&amp;amp;page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-399955 Monty Linden]}}&lt;br /&gt;
|deepnotes=&lt;br /&gt;
|history=&lt;br /&gt;
*{{SVN|1836|rev=112899 |trunk=*|anchor=file22|ver=|ser=}}&lt;br /&gt;
|comments&lt;br /&gt;
|cat1=HTTP&lt;br /&gt;
|cat2=HTTP/Server&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Omei Qunhua</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Talk:LlRequestURL&amp;diff=1198258</id>
		<title>Talk:LlRequestURL</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Talk:LlRequestURL&amp;diff=1198258"/>
		<updated>2015-12-14T22:06:56Z</updated>

		<summary type="html">&lt;p&gt;Omei Qunhua: Explanation for code changes&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;One thing I couldn&#039;t help but notice - The URL generates a UUID as a specific URL, but from what I can tell, it&#039;s not a correctly formatted one - The version digit is just as random as the others. Not really an issue, but I do find it odd that they didn&#039;t even use version 4, as they did with inworld IDs.&lt;br /&gt;
&lt;br /&gt;
[[User:Hg Beeks|Hg Beeks]] 09:41, 10 August 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
== Are URLs automatically released when the script is reset? ==&lt;br /&gt;
&lt;br /&gt;
I tend to assume so, since otherwise they&#039;ll be constantly leaking when one edits and tests scripts that request URLs.  But is that a good assumption? [[User:Dale Innis|Dale Innis]] 19:38, 3 November 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
: According to my testing on Second Life Server 14.06.20.291351 yes; the URL is released upon reset. I&#039;ve also written a LOT of code that uses URLs all running in the same simulator for quite a while and I&#039;ve not run into a URL outage yet.  In fact the available count showed over 14000 left! [[User:Cron Stardust|Cron Stardust]] 18:21, 11 July 2014 (PDT)&lt;br /&gt;
&lt;br /&gt;
== Minimal example? ==&lt;br /&gt;
&lt;br /&gt;
Is the example given on this page the minimal recommended script? I don&#039;t see why I need to re-acquire a URL on CHANGED_INVENTORY.&lt;br /&gt;
&lt;br /&gt;
== Unnecessary code ==&lt;br /&gt;
&lt;br /&gt;
The first example never needs to use llReleaseURL() because the script only requests URLs under these three circumstances:&lt;br /&gt;
a) in state_entry() which in this script only happens when the script is reset, and resetting the script inherently releases URLs&lt;br /&gt;
b) after a region restart. But that process will have released all URLs&lt;br /&gt;
c) on change of Region ... but the URL will have been released from the old region by virtue of the object exiting that region, and attempting to release a URL after detecting a change of region is pointless, or down-right in error, as the URL you are trying to release belonged to the region the object is no longer in.&lt;br /&gt;
&lt;br /&gt;
The code to check for &amp;quot;dropped URLs&amp;quot; at five minute intervals seems bizarre and superfluous.  [[User:Omei Qunhua|Omei Qunhua]] ([[User talk:Omei Qunhua|talk]]) 14:06, 14 December 2015 (PST)&lt;/div&gt;</summary>
		<author><name>Omei Qunhua</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlRequestURL&amp;diff=1198141</id>
		<title>LlRequestURL</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlRequestURL&amp;diff=1198141"/>
		<updated>2015-12-12T23:14:50Z</updated>

		<summary type="html">&lt;p&gt;Omei Qunhua: Resetting a script releases URLs, so no need to formally release them before llResetScript()&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function&lt;br /&gt;
|inject-2={{Issues/BUG-3813}}&lt;br /&gt;
|func_id=345|func_sleep=0.0|func_energy=10.0|mode&lt;br /&gt;
|func=llRequestURL&lt;br /&gt;
|return_type=key|return_subtype=handle&lt;br /&gt;
|func_footnote=&lt;br /&gt;
|func_desc=Requests one HTTP:// url for use by this [[object]]. The [[http_request]] [[event]] is triggered with the result of the request. HTTP-in uses port 12046.&lt;br /&gt;
|return_text=used for identifying the result of the request in the [[http_request]] [[event]].&lt;br /&gt;
|spec&lt;br /&gt;
|caveats=*HTTP-in uses port 12046.&lt;br /&gt;
*Use of this function is throttled. Although it has no forced sleep time, too many requests (5 ish) in a short period will cause all further requests to be denied until the script stops requesting urls for at least 1 second. Using an [[llSleep]] of 0.6 seconds or greater between each request will prevent you from being throttled.&lt;br /&gt;
*When a region is (re)started all [[http_request|HTTP server]] URLs are automatically released and invalidated.&lt;br /&gt;
**Use [[CHANGED_REGION_START]] to detect this so new URL can be requested.&lt;br /&gt;
*The number of available URLs is a limited resource, that is to say, a script can only have so many open URLs. See [[LSL http_server#Resource Limitations]] for details.&lt;br /&gt;
*When abandoning a URL, release it with [[llReleaseURL]], to avoid leaks. Resetting the script, or deleting the prim will also suffice to release URLs.&lt;br /&gt;
&lt;br /&gt;
|constants&lt;br /&gt;
|examples=&lt;br /&gt;
This script requests a new URL after region restart:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
string url;&lt;br /&gt;
key urlRequestId;&lt;br /&gt;
key selfCheckRequestId;&lt;br /&gt;
&lt;br /&gt;
request_url()&lt;br /&gt;
{&lt;br /&gt;
    llReleaseURL(url);&lt;br /&gt;
    url = &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    urlRequestId = llRequestURL();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
throw_exception(string inputString)&lt;br /&gt;
{&lt;br /&gt;
    key owner = llGetOwner();&lt;br /&gt;
    llInstantMessage(owner, inputString);&lt;br /&gt;
&lt;br /&gt;
    // yeah, bad way to handle exceptions by restarting.&lt;br /&gt;
    // However this is just a demo script...&lt;br /&gt;
&lt;br /&gt;
    llResetScript();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    on_rez(integer start_param)&lt;br /&gt;
    {&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    changed(integer change)&lt;br /&gt;
    {&lt;br /&gt;
        if (change &amp;amp; (CHANGED_OWNER | CHANGED_INVENTORY))&lt;br /&gt;
            llResetScript();&lt;br /&gt;
&lt;br /&gt;
        if (change &amp;amp; (CHANGED_REGION | CHANGED_REGION_START | CHANGED_TELEPORT))&lt;br /&gt;
            request_url();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        request_url();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    http_request(key id, string method, string body)&lt;br /&gt;
    {&lt;br /&gt;
        integer responseStatus = 400;&lt;br /&gt;
        string responseBody = &amp;quot;Unsupported method&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        if (method == URL_REQUEST_DENIED)&lt;br /&gt;
            throw_exception(&amp;quot;The following error occurred while attempting to get a free URL for this device:\n \n&amp;quot; + body);&lt;br /&gt;
&lt;br /&gt;
        else if (method == URL_REQUEST_GRANTED)&lt;br /&gt;
        {&lt;br /&gt;
            url = body;&lt;br /&gt;
            key owner = llGetOwner();&lt;br /&gt;
            llLoadURL(owner, &amp;quot;Click to visit my URL!&amp;quot;, url);&lt;br /&gt;
&lt;br /&gt;
            // check every 5 mins for dropped URL&lt;br /&gt;
            llSetTimerEvent(300.0);&lt;br /&gt;
        }&lt;br /&gt;
        else if (method == &amp;quot;GET&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            responseStatus = 200;&lt;br /&gt;
            responseBody = &amp;quot;Hello world!&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        // else if (method == &amp;quot;POST&amp;quot;) ...;&lt;br /&gt;
        // else if (method == &amp;quot;PUT&amp;quot;) ...;&lt;br /&gt;
        // else if (method == &amp;quot;DELETE&amp;quot;) { responseStatus = 403; responseBody = &amp;quot;forbidden&amp;quot;; }&lt;br /&gt;
&lt;br /&gt;
        llHTTPResponse(id, responseStatus, responseBody);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    http_response(key id, integer status, list metaData, string body)&lt;br /&gt;
    {&lt;br /&gt;
        if (id == selfCheckRequestId)&lt;br /&gt;
        {&lt;br /&gt;
            // If you&#039;re not usually doing this,&lt;br /&gt;
            // now is a good time to get used to doing it!&lt;br /&gt;
            selfCheckRequestId = NULL_KEY;&lt;br /&gt;
&lt;br /&gt;
            if (status != 200)&lt;br /&gt;
                request_url();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        else if (id == NULL_KEY)&lt;br /&gt;
            throw_exception(&amp;quot;Too many HTTP requests too fast!&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        selfCheckRequestId = llHTTPRequest(url,&lt;br /&gt;
                                [HTTP_METHOD, &amp;quot;GET&amp;quot;,&lt;br /&gt;
                                    HTTP_VERBOSE_THROTTLE, FALSE,&lt;br /&gt;
                                    HTTP_BODY_MAXLENGTH, 16384],&lt;br /&gt;
                                &amp;quot;&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
It&#039;s important to keep in mind that if you request another URL, that the old one will not be released, it will remain active. The following script drives home this point.&lt;br /&gt;
&lt;br /&gt;
Try the following code ONLY if you can use all your URLs on your land.&lt;br /&gt;
Removing the prim/script will release all URLs previous assigned.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
// WARNING:&lt;br /&gt;
//&lt;br /&gt;
//      This script is only for proof-of-concept (demo purposes).&lt;br /&gt;
//      DO NOT use it if you don&#039;t have the sim owners and/or&lt;br /&gt;
//      estate managers OK to test this script.&lt;br /&gt;
//      This script can possibly block HTTP communication from and to the sim.&lt;br /&gt;
//      ...bringing down all networked vendors and/or similar machines.&lt;br /&gt;
//&lt;br /&gt;
//      This script allocates all available URLs.&lt;br /&gt;
//      Deleting the script and/or derezzing the object containing the script,&lt;br /&gt;
//      will release all previously taken URLs.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llRequestURL();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    http_request(key id, string method, string body)&lt;br /&gt;
    {&lt;br /&gt;
        if (method == URL_REQUEST_DENIED)&lt;br /&gt;
            llSetText(&amp;quot;No free URLs!&amp;quot;, &amp;lt;1.0, 0.0, 0.0&amp;gt;, 1.0);&lt;br /&gt;
&lt;br /&gt;
        else if (method == URL_REQUEST_GRANTED)&lt;br /&gt;
        {&lt;br /&gt;
            llSetText( (string)llGetFreeURLs() + &amp;quot; URLs left\n&amp;quot; + body, &amp;lt;1.0, 1.0, 1.0&amp;gt;, 1.0);&lt;br /&gt;
&lt;br /&gt;
            llRequestURL();&lt;br /&gt;
        }&lt;br /&gt;
        else if (method == &amp;quot;GET&amp;quot;)&lt;br /&gt;
            llHTTPResponse(id, 200, &amp;quot;Hello there!&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
This script will, as you can see, use all URLs available on your land because it does not remove the old URLs before requesting a new one.&lt;br /&gt;
Just store the old URL in a global variable and release it with [[llReleaseURL]].&lt;br /&gt;
|helpers&lt;br /&gt;
|also_functions=&lt;br /&gt;
{{LSL DefineRow||[[llRequestSecureURL]]}}&lt;br /&gt;
{{LSL DefineRow||[[llGetFreeURLs]]}}&lt;br /&gt;
{{LSL DefineRow||[[llReleaseURL]]}}&lt;br /&gt;
{{LSL DefineRow||[[llHTTPResponse]]}}&lt;br /&gt;
{{LSL DefineRow||[[llGetHTTPHeader]]}}&lt;br /&gt;
|also_tests&lt;br /&gt;
|also_events&lt;br /&gt;
|also_articles=&lt;br /&gt;
{{LSL DefineRow||[[LSL http server]]}}&lt;br /&gt;
|notes=&lt;br /&gt;
{{Quote|Another comment on resilient programming: getting a global resource, an HTTP listener in this case, should always be considered an operation that can fail for transitory reasons (as well as permanent ones). In this case, LSL folds retryable and permanent errors into the same error status and there&#039;s no opportunity for a script writer to distinguish the two cases. But a reasonable way to handle this is sleeping with limited retries before failing hard in the LSL code.|2=[https://jira.secondlife.com/browse/BUG-3813?focusedCommentId=399955&amp;amp;page=com.atlassian.jira.plugin.system.issuetabpanels:comment-tabpanel#comment-399955 Monty Linden]}}&lt;br /&gt;
|deepnotes=&lt;br /&gt;
|history=&lt;br /&gt;
*{{SVN|1836|rev=112899 |trunk=*|anchor=file22|ver=|ser=}}&lt;br /&gt;
|comments&lt;br /&gt;
|cat1=HTTP&lt;br /&gt;
|cat2=HTTP/Server&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Omei Qunhua</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlRemoveInventory&amp;diff=1196044</id>
		<title>LlRemoveInventory</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlRemoveInventory&amp;diff=1196044"/>
		<updated>2015-04-06T21:00:39Z</updated>

		<summary type="html">&lt;p&gt;Omei Qunhua: Added Caveat re changed event&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function&lt;br /&gt;
|inject-2={{Issues/SVC-304}}{{LSL_Function/inventory|item|uuid=false|type}}&lt;br /&gt;
|func_id=151|func_sleep=0.0|func_energy=10.0&lt;br /&gt;
|func=llRemoveInventory|p1_type=string|p1_name=item&lt;br /&gt;
|func_footnote&lt;br /&gt;
|func_desc=Remove the named inventory {{LSLP|item}}&lt;br /&gt;
|return_text&lt;br /&gt;
|spec&lt;br /&gt;
|caveats=*If the current script is removed it will continue to run for a short period of time after this call.&lt;br /&gt;
*With multiple executions an llSleep(0.1) after llRemoveInventory will allow edit window contents to refresh correctly and avoid errors on phantom contents.&lt;br /&gt;
*llRemoveInventory will not trigger a changed event.&lt;br /&gt;
|constants&lt;br /&gt;
|examples=&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
// Remove the current script from the object&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llRemoveInventory(llGetScriptName());&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
// user-function to include in your script&lt;br /&gt;
// deletes all other contents of any type except the script itself&lt;br /&gt;
delete_all_other_contents()&lt;br /&gt;
{&lt;br /&gt;
    string thisScript = llGetScriptName();&lt;br /&gt;
    string inventoryItemName;&lt;br /&gt;
&lt;br /&gt;
    integer index = llGetInventoryNumber(INVENTORY_ALL);&lt;br /&gt;
    while (index)&lt;br /&gt;
    {&lt;br /&gt;
        --index;        // (faster than index--;)&lt;br /&gt;
&lt;br /&gt;
        inventoryItemName = llGetInventoryName(INVENTORY_ALL, index);&lt;br /&gt;
&lt;br /&gt;
        if (inventoryItemName != thisScript)   &lt;br /&gt;
            llRemoveInventory(inventoryItemName);     &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;
        delete_all_other_contents();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|helpers&lt;br /&gt;
|also_functions&lt;br /&gt;
|also_events&lt;br /&gt;
|also_tests&lt;br /&gt;
|also_articles&lt;br /&gt;
|notes&lt;br /&gt;
|permission&lt;br /&gt;
|negative_index&lt;br /&gt;
|sort=RemoveInventory&lt;br /&gt;
|cat1=Inventory&lt;br /&gt;
|cat2&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Omei Qunhua</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Talk:LlSameGroup&amp;diff=1195900</id>
		<title>Talk:LlSameGroup</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Talk:LlSameGroup&amp;diff=1195900"/>
		<updated>2015-03-20T12:07:28Z</updated>

		<summary type="html">&lt;p&gt;Omei Qunhua: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;According to LSLWiki, &amp;quot;Passing NULL_KEY as id will return TRUE if the object&#039;s active group is set to &amp;quot;none&amp;quot;, FALSE otherwise&amp;quot;. If this is indeed a solid specification, it should be mentioned here. You often need to recognize this, particularly because of the &amp;quot;no group is same group&amp;quot; behavior, necessitating this extra check if you want to restrict some functionality to an actual group. -- [[User:Tali Rosca|Tali Rosca]] 14:40, 29 January 2009 (UTC)&lt;br /&gt;
:Tested and added =) --[[Image:Zai_signature.png|45px]] &#039;&#039;&#039;[[User:Zai Lynch|Lynch]]&#039;&#039;&#039; &amp;lt;sup&amp;gt;&amp;lt;small&amp;gt;([[User talk:Zai Lynch|talk]]|[[Special:Contributions/Zai Lynch|contribs]])&amp;lt;/small&amp;gt;&amp;lt;/sup&amp;gt; 15:34, 29 January 2009 (UTC)&lt;br /&gt;
&lt;br /&gt;
A small test suggests that llSameGroup tests against the prim&#039;s group, not the object&#039;s.  The main page explains that a child prim may be of a different group than the root.  If the script is in the child, the test is against the child prim&#039;s group, not the root&#039;s. [[User:Jonno Stromfield|Jonno Stromfield]] 10:31, 27 August 2010 (UTC)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
The description says &amp;quot;Returns an integer boolean, that is TRUE if uuid has the same active group, otherwise FALSE&amp;quot;.    When using the word &amp;quot;same&amp;quot; you need to say what 2 things are the same. In this case it&#039;s the group of the uuid passed to this function, and the group of the prim the script is in.  Unfortunately it appears to be totally impossible for a mere mortal make the needed change on the page. [[User:Omei Qunhua|Omei Qunhua]] ([[User talk:Omei Qunhua|talk]]) 05:07, 20 March 2015 (PDT)&lt;/div&gt;</summary>
		<author><name>Omei Qunhua</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlSameGroup&amp;diff=1195899</id>
		<title>LlSameGroup</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlSameGroup&amp;diff=1195899"/>
		<updated>2015-03-20T12:01:56Z</updated>

		<summary type="html">&lt;p&gt;Omei Qunhua: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Function&lt;br /&gt;
|inject-2={{LSL Function/uuid|uuid|sim=*}}{{LSL Function/group}}&lt;br /&gt;
|func=llSameGroup&lt;br /&gt;
|sort=SameGroup&lt;br /&gt;
|func_id=219|func_sleep=0.0|func_energy=10.0&lt;br /&gt;
|return_type=integer&lt;br /&gt;
|p1_type=key|p1_name=uuid&lt;br /&gt;
|func_desc&lt;br /&gt;
Returns &amp;quot;TRUE&amp;quot; if the detected object has the same active group as the prim the script is in.&lt;br /&gt;
|func_footnote=Also returns [[TRUE]] if the object is deeded to the same active group as &#039;&#039;&#039;uuid&#039;&#039;&#039;{{PBR}}&lt;br /&gt;
Also returns [[TRUE]] if the object is &amp;quot;set to&amp;quot; or deeded to the same group as &#039;&#039;&#039;group&#039;&#039;&#039; [[UUID]] (i.e. key [[OBJECT_GROUP]])&lt;br /&gt;
|return_text=boolean, that is [[TRUE]] if &#039;&#039;&#039;uuid&#039;&#039;&#039; has the same active group, otherwise [[FALSE]]&lt;br /&gt;
|spec&lt;br /&gt;
|caveats=*Also returns [[TRUE]] if the object is not set to a group (i.e. &amp;quot;(none)&amp;quot;) and either the AV with the given key has no group active or the function is called with a [[NULL_KEY]]&lt;br /&gt;
|constants&lt;br /&gt;
|examples=&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
// Gives inventory object only to agents with the same active group&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        key id = llDetectedKey(0);&lt;br /&gt;
&lt;br /&gt;
        integer sameGroup = llSameGroup(id);&lt;br /&gt;
//      same as llDetectedGroup(i) (with llDetectedGroup, detected does not need to be in the sim)&lt;br /&gt;
&lt;br /&gt;
        if (sameGroup)&lt;br /&gt;
        {&lt;br /&gt;
            integer numberOfObjectsInPrim = llGetInventoryNumber(INVENTORY_OBJECT);&lt;br /&gt;
&lt;br /&gt;
            if (numberOfObjectsInPrim)&lt;br /&gt;
                llGiveInventory(id, llGetInventoryName(INVENTORY_OBJECT, 0));&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            llRegionSayTo(id, 0, &amp;quot;Wrong active group!&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|helpers=&lt;br /&gt;
To determine if an avatar is an object&#039;s owner when deeded to group, you should use a function similar to that provided for [[LlGetOwner#Useful_Snippets|llGetOwner]]().&lt;br /&gt;
&lt;br /&gt;
The following uses llSameGroup() to determine if a parcel is rezzable based on the object&#039;s active group and parcel details. Useful for preventing unnecessary rez failure notices from various types of attached objects (e.g. guns, water/skywalk HUDs, etc).&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
/*&lt;br /&gt;
  By Aryn Gellner&lt;br /&gt;
  pos - position (in region coordinates) to check against.&lt;br /&gt;
*/&lt;br /&gt;
&lt;br /&gt;
integer is_rezzable(vector pos)&lt;br /&gt;
{&lt;br /&gt;
    key group_id = llList2Key(llGetParcelDetails(pos, [PARCEL_DETAILS_GROUP]), 0);&lt;br /&gt;
    &lt;br /&gt;
    integer parcel_flags = llGetParcelFlags(pos);&lt;br /&gt;
    &lt;br /&gt;
    if(parcel_flags &amp;amp; PARCEL_FLAG_ALLOW_CREATE_OBJECTS)&lt;br /&gt;
    {&lt;br /&gt;
        return TRUE;&lt;br /&gt;
    }&lt;br /&gt;
    else if((parcel_flags &amp;amp; PARCEL_FLAG_ALLOW_CREATE_GROUP_OBJECTS) &amp;amp;&amp;amp; llSameGroup(group_id))&lt;br /&gt;
    {&lt;br /&gt;
        return TRUE;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        return FALSE;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|also_functions={{LSL DefineRow||[[llDetectedGroup]]|Used in conjunction with {{LSLGC|Detected|detection}} events}}&lt;br /&gt;
|also_tests=&lt;br /&gt;
{{LSL DefineRow||[[llSameGroup Test]]}}&lt;br /&gt;
|also_events&lt;br /&gt;
|also_articles&lt;br /&gt;
|notes&lt;br /&gt;
|cat1=Avatar&lt;br /&gt;
|cat2=Group&lt;br /&gt;
|haiku={{Haiku|Do you belong or|Are you alien, unknown|To us, unwanted?}}&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Omei Qunhua</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlGetPermissionsKey&amp;diff=1195502</id>
		<title>LlGetPermissionsKey</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlGetPermissionsKey&amp;diff=1195502"/>
		<updated>2015-02-06T16:30:09Z</updated>

		<summary type="html">&lt;p&gt;Omei Qunhua: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Issues/SVC-4862}}{{LSL_Function&lt;br /&gt;
|func_id=137|func_sleep=0.0|func_energy=10.0&lt;br /&gt;
|func=llGetPermissionsKey|sort=GetPermissionsKey&lt;br /&gt;
|return_type=key&lt;br /&gt;
|func_footnote=Returns {{LSL Const|NULL_KEY|key|&amp;amp;quot;00000000-0000-0000-0000-000000000000&amp;amp;quot;|c=Evaluates to false in conditionals just like invalid keys.}} if permissions were neither granted nor declined (e.g., the permissions dialog was cancelled or otherwise ignored).&lt;br /&gt;
|func_desc&lt;br /&gt;
|Return_text=of the avatar that last granted or declined permissions to the script.&lt;br /&gt;
|spec&lt;br /&gt;
|caveats&lt;br /&gt;
|constants&lt;br /&gt;
|examples=&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
// 1. rez a cube&lt;br /&gt;
// 2. create a new script and paste this&lt;br /&gt;
// 3. save script&lt;br /&gt;
// 4. right-click the prim and choose attach&lt;br /&gt;
// 5. touch the prim&lt;br /&gt;
&lt;br /&gt;
announce_permissions_key()&lt;br /&gt;
{&lt;br /&gt;
    key permissionsKey = llGetPermissionsKey();&lt;br /&gt;
&lt;br /&gt;
    llSay(0, &amp;quot;key llGetPermissionsKey() = &#039;&amp;quot; + (string)permissionsKey + &amp;quot;&#039;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        announce_permissions_key();&lt;br /&gt;
&lt;br /&gt;
        key owner = llGetOwner();&lt;br /&gt;
        llRequestPermissions(owner, PERMISSION_ATTACH);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer num_detected)&lt;br /&gt;
    {&lt;br /&gt;
        key id = llDetectedKey(0);&lt;br /&gt;
        key owner = llGetOwner();&lt;br /&gt;
        key permissionsKey = llGetPermissionsKey();&lt;br /&gt;
&lt;br /&gt;
        if (id == owner)&lt;br /&gt;
        {&lt;br /&gt;
            if (permissionsKey == owner)&lt;br /&gt;
                llDetachFromAvatar();&lt;br /&gt;
            else&lt;br /&gt;
                llSay(0, &amp;quot;Can&#039;t detach from you, you have not granted ATTACH perms.&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
            llSay(0, &amp;quot;Sorry, you&#039;re not the owner!&amp;quot;);&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_ATTACH)&lt;br /&gt;
            announce_permissions_key();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|helpers&lt;br /&gt;
|also_functions={{LSL DefineRow||[[llGetPermissions]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llRequestPermissions]]|}}&lt;br /&gt;
|also_tests&lt;br /&gt;
|also_events={{LSL DefineRow||[[run_time_permissions]]|}}&lt;br /&gt;
|also_articles&lt;br /&gt;
|notes&lt;br /&gt;
|cat1=Permissions/Script&lt;br /&gt;
|cat2&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Omei Qunhua</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlJsonValueType&amp;diff=1193483</id>
		<title>LlJsonValueType</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlJsonValueType&amp;diff=1193483"/>
		<updated>2014-09-17T22:23:23Z</updated>

		<summary type="html">&lt;p&gt;Omei Qunhua: JSON entities count from zero, not 1. The examples are not pseudo code, but LSL code fragments&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Function&lt;br /&gt;
|inject-2={{Issues/BUG-3692}}&lt;br /&gt;
|func_id=|func_sleep=0.0|func_energy=0.0&lt;br /&gt;
|func=llJsonValueType|return_type=string&lt;br /&gt;
|p1_type=string|p1_name=json|p1_desc=A string serialization of a json object.&lt;br /&gt;
|p2_type=list|p2_name=specifiers|p2_desc=A path to a value in the json parameter.&lt;br /&gt;
|func_footnote&lt;br /&gt;
|func_desc=Gets the [http://json.org JSON] type for the value in {{LSLPT|json}} at the location {{LSLPT|specifiers}}. &lt;br /&gt;
|Return_text=specifying the type of the value at {{LSLPT|specifiers}} in {{LSLPT|json}}.&lt;br /&gt;
|spec=See [[Json_usage_in_LSL]]&lt;br /&gt;
|constants={{LSL_Constants/JSON}}&lt;br /&gt;
|examples=&amp;lt;lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//all these functions are untested functions that may have some very strange cases were they acd badly or where the comments are wrong&lt;br /&gt;
//see them as buggy PSEUDO-code and consider yourself lucky if there are less than 2 wrong counters and 4 bad pointers/names.&lt;br /&gt;
//they are more an example and a concept and unlikely fully functional AS IS.&lt;br /&gt;
 &lt;br /&gt;
string JisN(string j){if(llJsonValueType(j,[])==JSON_NUMBER  )return llJsonGetValue(j,[]);return &amp;quot;&amp;quot;;}&lt;br /&gt;
//return the JSON if &amp;quot;j&amp;quot; is a JSON_NUMBER, like j=&amp;quot;10.1234&amp;quot;  j=&amp;quot;-0.1234&amp;quot;  j=&amp;quot;3.14159&amp;quot;  j=&amp;quot;-1&amp;quot; j=&amp;quot;123456&amp;quot;   otherwise return &amp;quot;&amp;quot;;&lt;br /&gt;
//these would be sting representations of a float because j is a string.&lt;br /&gt;
//storing floats in a JSON will easily lose you a lot of accuracy. Integers stored in JSON may have a smaller range than 32-bit signed integers.&lt;br /&gt;
 &lt;br /&gt;
string JisA(string j){if(llJsonValueType(j,[])==JSON_ARRAY  )return llJsonGetValue(j,[]);return &amp;quot;&amp;quot;;}&lt;br /&gt;
//return the JSON if &amp;quot;j&amp;quot; is a JSON_ARRAY, like j=&amp;quot;[]&amp;quot;   j=&amp;quot;[1,2]&amp;quot;  j=&amp;quot;[[1],[3,4]]&amp;quot;                        otherwise return &amp;quot;&amp;quot;;&lt;br /&gt;
//these would be string representations of a (nested) list because j is a string.&lt;br /&gt;
 &lt;br /&gt;
string JisS(string j){if(llJsonValueType(j,[])==JSON_STRING )return llJsonGetValue(j,[]);return &amp;quot;&amp;quot;;}&lt;br /&gt;
//return the string that is stored in &amp;quot;j&amp;quot; if &amp;quot;j&amp;quot; is a JSON_STRING, like j=&amp;quot;\&amp;quot;PI\&amp;quot;&amp;quot;   j=&amp;quot;\&amp;quot;3.14\&amp;quot;&amp;quot;   j=&amp;quot;\&amp;quot;-1\&amp;quot;&amp;quot; otherwise return &amp;quot;&amp;quot;;&lt;br /&gt;
//these would be string representations of a string, typecast with \&amp;quot; as that within itself,&lt;br /&gt;
//because j is a string that is also able to store numbers and floats and (nested) lists ... as strings. &lt;br /&gt;
//this returns the string within &amp;quot;j&amp;quot; if &amp;quot;j&amp;quot; is &amp;quot;A string within a string&amp;quot;. &lt;br /&gt;
 &lt;br /&gt;
/*the above functions return strings to be used in simple &lt;br /&gt;
if(JisN(j)){} &lt;br /&gt;
if(JisA(j)){} &lt;br /&gt;
if(JisS(j)){} &lt;br /&gt;
//conditions as if they are booleans. //the boolean-ish condition works because &amp;quot;&amp;quot; equals FALSE within LSL.&lt;br /&gt;
The functions MAY return a JSON_STRING or JSON_ARRAY can be useful recursively as shown below:&lt;br /&gt;
*/&lt;br /&gt;
 &lt;br /&gt;
JstringPARSED(string j){&lt;br /&gt;
    //j=&amp;quot;\&amp;quot;PI\&amp;quot;&amp;quot;;&lt;br /&gt;
    //j=&amp;quot;\&amp;quot;3.14\&amp;quot;&amp;quot;;&lt;br /&gt;
    //j=&amp;quot;\&amp;quot;-1\&amp;quot;&amp;quot;;&lt;br /&gt;
    string JayWeHaveToGoDeeperS = JisS(JisS(j));&lt;br /&gt;
    llOwnerSay( JayWeHaveToGoDeeperS ); // says &amp;quot;PI&amp;quot;, or &amp;quot;&amp;quot;        , or &amp;quot;&amp;quot;         , because &amp;quot;3.14&amp;quot; is a JSON_NUMBER and &amp;quot;-1&amp;quot; is a JSON_NUMBER but not a JSON_STRING&lt;br /&gt;
    string JayWeHaveToGoDeeperN = JisN(JisS(j));&lt;br /&gt;
    llOwnerSay( JayWeHaveToGoDeeperN ); // says &amp;quot;&amp;quot;  , or &amp;quot;3.14000&amp;quot; , or &amp;quot;-1.0000&amp;quot;,   because &amp;quot;PI&amp;quot; is a JSON_STRING but &amp;quot;PI&amp;quot; is not a JSON_NUMBER &lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
    if (llJsonValueType(j,[])==JSON_INVALID){}//would be TRUE for j=&amp;quot;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
//==== End of JstringPARSED(j) ===== start of Jnested(j) for  nested/recursive lists =====&lt;br /&gt;
 &lt;br /&gt;
Jnested(string j){&lt;br /&gt;
    //j=&amp;quot;[]&amp;quot;;&lt;br /&gt;
    //j=&amp;quot;[[1],[2]]&amp;quot;;&lt;br /&gt;
    //j=&amp;quot;[-1,[2]]&amp;quot;;&lt;br /&gt;
    //j=&amp;quot;[[1],-2]&amp;quot;;&lt;br /&gt;
    //j=&amp;quot;[[-3,-4]]&amp;quot;;  //the only true case HERE for = JisA(JisA(j)); below&lt;br /&gt;
    string JayWeHaveToGoDeeperA = JisA(JisA(j));&lt;br /&gt;
 &lt;br /&gt;
    string subJ=JisA(j);&lt;br /&gt;
    if (subJ){&lt;br /&gt;
        //here you actually have to loop trough each entry of the subJ JSON_LIST to test its TYPE for each entry (if we want to go deeper recursively)&lt;br /&gt;
        //You can go deeper once you know if entry number x is a JSON_LIST (NESTED!!!) or JSON_STRING (for some reason)&lt;br /&gt;
        //first see how many list entries there are; we go trough entries of subJ starting on the left until its a JSON_INVALID&lt;br /&gt;
        list types; &lt;br /&gt;
        integer i = -1;&lt;br /&gt;
        while (++i != -1){&lt;br /&gt;
             string type=llJsonValueType(j,[i]);//stores the TYPE of &amp;quot;j&amp;quot;&#039;s entry at position i as &amp;quot;type&amp;quot;&lt;br /&gt;
             if (type==JSON_INVALID) i=-1; //this exits this the while-loop&lt;br /&gt;
             else types += type;  // the list &amp;quot;types&amp;quot; will store all the JSON types, until the first invalid one is reached. (which which should also be for &amp;quot;out of bounds&amp;quot;&lt;br /&gt;
        }&lt;br /&gt;
 &lt;br /&gt;
        //this is split in 2 loops to explain 1 task by splitting it in 2 smaller tasks. Actually the loops above and below could be merged easily. &lt;br /&gt;
 &lt;br /&gt;
        i=llGetListLength(types);//we now have a list that lists all JSON types of j; lets see how long it is; &lt;br /&gt;
        //and we loop trough all types, calling THIS function recursively if the list contains another nested list in it at position i&lt;br /&gt;
        while (i--){//I like to go reverse from right to left when ever possible, its faster (??) and costs less memory in LSL (??)&lt;br /&gt;
             if (llList2String(types,i)==JSON_ARRAY){&lt;br /&gt;
                  Jnested(llJsonGetValue(j,[i]));//the function calls itself here, recursively...&lt;br /&gt;
                  //but only sends the i#th SUB.list of itself trough an instance of itself.&lt;br /&gt;
            }&lt;br /&gt;
            else{&lt;br /&gt;
                //read from your list what json type is at this position and do something with it.&lt;br /&gt;
                //maybe you need a global counter that increases each time you go &amp;quot;one nested list deeper&amp;quot; and decreases when you go &amp;quot;one nested list back up&amp;quot;&lt;br /&gt;
                //otherwise you may not know how deep you are within nested lists.&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
}&lt;br /&gt;
//Jnested(j) should be useful to read from large matrices (as in 300x300 fields) that may even contain complex numbers at some places.&lt;br /&gt;
//I tried to read very long JSONs with llGetSubString(), but llGetSubString() too easily stack-heap collides on very long strings,&lt;br /&gt;
//so you have to go trough the nested list using Jnested(j) to read and print it per entry.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
|caveats=&lt;br /&gt;
|helpers&lt;br /&gt;
|also_functions={{LSL DefineRow||[[llList2Json]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llJson2List]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llJsonSetValue]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llJsonGetValue]]|}}&lt;br /&gt;
|also_events&lt;br /&gt;
|also_tests&lt;br /&gt;
|also_articles={{LSL DefineRow||[[Typecast]]|}}&lt;br /&gt;
|notes=&lt;br /&gt;
|permission&lt;br /&gt;
|negative_index&lt;br /&gt;
|cat1=List&lt;br /&gt;
|cat2=String&lt;br /&gt;
|cat3=Data Conversion&lt;br /&gt;
|cat4=JSON&lt;br /&gt;
|history = Date of Release  [[ Release_Notes/Second_Life_Server/13#13.05.20.276191 | 20/05/2013 ]]&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Omei Qunhua</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlList2Json&amp;diff=1193475</id>
		<title>LlList2Json</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlList2Json&amp;diff=1193475"/>
		<updated>2014-09-17T17:29:20Z</updated>

		<summary type="html">&lt;p&gt;Omei Qunhua: fix &amp;quot;typos&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Function&lt;br /&gt;
|func_id=|func_sleep=0.0|func_energy&lt;br /&gt;
|func=llList2Json|return_type=string&lt;br /&gt;
|p1_type=string|p1_name=type|p1_desc=&lt;br /&gt;
|p2_type=list|p2_name=values|p2_desc=&lt;br /&gt;
|func_footnote=&lt;br /&gt;
To convert a json formatted string into a list use [[llJson2List]].&lt;br /&gt;
|func_desc=This function takes a list and returns a [http://json.org JSON] string of that list as either a json object or json array.&lt;br /&gt;
|return_text=that is either {{LSLPT|values}} serialized as a JSON {{LSLPT|type}}, or if an error was encountered [[JSON_INVALID]].&lt;br /&gt;
|spec=See [[Json_usage_in_LSL]]&lt;br /&gt;
* If type is [[JSON_OBJECT]] the list must be a strided list of key, value pairs and a string representing a json object will be returned.&lt;br /&gt;
* If type is [[JSON_ARRAY]] then a string representing a json array will be returned.&lt;br /&gt;
* If type is any other string then [[JSON_INVALID]] will be returned.&lt;br /&gt;
* Json types from the input list are inferred from the LSL data type&lt;br /&gt;
** [[integer]] and [[float]] types are encoded as [[JSON_NUMBER]]&lt;br /&gt;
** &amp;quot;true&amp;quot; and &amp;quot;false&amp;quot; are encoded as [[JSON_TRUE]] and [[JSON_FALSE]], respectively&lt;br /&gt;
** &amp;quot;null&amp;quot; is encoded as [[JSON_NULL]]&lt;br /&gt;
** properly-formatted json strings in the input are kept as-is (will either be [[JSON_STRING]], [[JSON_OBJECT]], or [[JSON_ARRAY]]) &lt;br /&gt;
** all other strings encoded as [[JSON_STRING]]&lt;br /&gt;
** Note in particular that strings containing valid JSON numbers are converted to JSON strings, not left as JSON numbers ({{Jira|BUG-6284}}). This differs to the treatment that [[llJsonSetValue]] gives to strings that contain JSON numbers, which leaves them as numbers.&lt;br /&gt;
|constants={{LSL Constants/JSON|subset=*}}&lt;br /&gt;
|examples=&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
string CSV2Json(string csv)&lt;br /&gt;
{&lt;br /&gt;
    list li = llCSV2List(csv);&lt;br /&gt;
    return llList2Json(JSON_ARRAY, li);&lt;br /&gt;
}&lt;br /&gt;
// This function converts a comma separated values string to a Json array string. &lt;br /&gt;
// CSV strings are often used for link-messages, notecards and they are easier to type as input commands. &lt;br /&gt;
// A Json-Array can store multiple of those as a nested list within the same Json-string via JSON_APPEND.&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
* You could store multiple lists that set different particle effects in the same string. Use LlList2Json() to write the string and llJson2List() to read the particle system defining lists from it. The loss in float-accuracy (Json has BAD float-to-string-conversion) does not matter as much for particle effects.&lt;br /&gt;
&lt;br /&gt;
* You could store multiple lists, that set different llSetPrimitiveparamsFast() values for different situation (like different animation key frames), in the same Json String.&lt;br /&gt;
&lt;br /&gt;
|helpers&lt;br /&gt;
|also_functions={{LSL DefineRow||[[llJson2List]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llJsonGetValue]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llJsonSetValue]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llJsonValueType]]|}}&lt;br /&gt;
|also_constants={{LSL DefineRow||[[JSON_ARRAY]]}}&lt;br /&gt;
{{LSL DefineRow||[[JSON_OBJECT]]}}&lt;br /&gt;
{{LSL DefineRow||[[JSON_INVALID]]}}&lt;br /&gt;
|also_events&lt;br /&gt;
|also_tests&lt;br /&gt;
|also_articles={{LSL DefineRow||[[Typecast]]|}}&lt;br /&gt;
|notes=&lt;br /&gt;
|caveats=* Note that string &#039;&#039;&#039;values&#039;&#039;&#039; items are interpreted as JSON, not LSL, strings. Quotation marks, if required, must be added explicitly. For example, &amp;lt;code&amp;gt;[[llJson2List]]([[llList2Json]]([[JSON_ARRAY]], [&amp;quot;bacon&amp;quot;, &amp;quot;true&amp;quot;, &amp;quot;false&amp;quot;, &amp;quot;null&amp;quot;]))&amp;lt;/code&amp;gt; returns the LSL list &amp;lt;code&amp;gt;[&amp;quot;bacon&amp;quot;, [[JSON_TRUE]], [[JSON_FALSE]], [[JSON_NULL]]]&amp;lt;/code&amp;gt;, while &amp;lt;code&amp;gt;[[llJson2List]]([[llList2Json]]([[JSON_ARRAY]], [&amp;quot;\&amp;quot;bacon\&amp;quot;&amp;quot;, &amp;quot;\&amp;quot;true\&amp;quot;&amp;quot;, &amp;quot;\&amp;quot;false\&amp;quot;&amp;quot;, &amp;quot;\&amp;quot;null\&amp;quot;&amp;quot;]))&amp;lt;/code&amp;gt; returns the LSL list &amp;lt;code&amp;gt;[&amp;quot;bacon&amp;quot;, &amp;quot;true&amp;quot;, &amp;quot;false&amp;quot;, &amp;quot;null&amp;quot;]&amp;lt;/code&amp;gt;&lt;br /&gt;
|permission&lt;br /&gt;
|negative_index&lt;br /&gt;
|sort=List2Json&lt;br /&gt;
|cat1=List&lt;br /&gt;
|cat2=String&lt;br /&gt;
|cat3=Data Conversion&lt;br /&gt;
|cat4=JSON&lt;br /&gt;
|history = Date of Release  [[ Release_Notes/Second_Life_Server/13#13.05.20.276191 | 20/05/2013 ]]&lt;br /&gt;
|haiku={{Haiku|Their ships list to port|for what reason I know not|we list to JSON}}&lt;br /&gt;
{{Haiku|Listen to Jason|cryptically my sensei said|I must have misheard}}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Omei Qunhua</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlJson2List&amp;diff=1193469</id>
		<title>LlJson2List</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlJson2List&amp;diff=1193469"/>
		<updated>2014-09-16T22:52:13Z</updated>

		<summary type="html">&lt;p&gt;Omei Qunhua: Sundry &amp;quot;typos&amp;quot;. Personally, I can&amp;#039;t see the point in putting up un-compiled examples&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Function&lt;br /&gt;
|func_id=|func_sleep=0.0|func_energy=10.0&lt;br /&gt;
|func=llJson2List|return_type=list|p1_type=string|p1_name=src&lt;br /&gt;
|func_footnote=&lt;br /&gt;
To convert a list into a json formatted string use [[llList2Json]].&lt;br /&gt;
|func_desc=This function takes a string representing [http://json.org JSON], and returns a list of the top level.&lt;br /&gt;
|return_text=made by parsing &#039;&#039;&#039;src&#039;&#039;&#039;, a string representing json.&lt;br /&gt;
|spec=See [[Json_usage_in_LSL]]&lt;br /&gt;
* If the json represents a single item (number, string, true, false or null) then a list with 1 item will be returned.&lt;br /&gt;
* If the json represents an object then a strided list of key, value pairs is returned. All values that are objects or arrays are returned as json strings.&lt;br /&gt;
* If the json represents an array then a list of all items is returned. All values that are objects or arrays are returned as json strings.&lt;br /&gt;
|constants&lt;br /&gt;
|examples=&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
string Json2CSV(string jcsv){//Converts a Json into a string of comma separated values. == Removes the top level [ and ] and all &amp;quot; from top level JSON_STRING values.&lt;br /&gt;
    list li = llJson2List(jcsv);&lt;br /&gt;
    return llList2CSV(li);&lt;br /&gt;
}&lt;br /&gt;
//If the Json is a 1-dimensional array of strings like &amp;quot;[\&amp;quot;a\&amp;quot;,\&amp;quot;b\&amp;quot;,\&amp;quot;c\&amp;quot;]&amp;quot;, the returned CSV-string will be: &amp;quot;a,b,c&amp;quot; //This is a much shorter CSV that will save some memory.&lt;br /&gt;
//If the Json contains a nested arrays like &amp;quot;[[1,2],[\&amp;quot;PI\&amp;quot;,4]]&amp;quot;, the returned csv string will be : &amp;quot;[1,2],[\&amp;quot;Pi\&amp;quot;,4]&amp;quot; &lt;br /&gt;
//&amp;quot;[1,2],[\&amp;quot;Pi\&amp;quot;,4]&amp;quot; is not a very readable CSV-string and not shortened by much. &amp;quot;PI&amp;quot; is not a top level string value because it is nested 1 level deeper. llJson2List unescapes those.&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|helpers&lt;br /&gt;
|also_functions={{LSL DefineRow||[[llList2Json]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llJsonGetValue]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llJsonSetValue]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llJsonValueType]]|}}&lt;br /&gt;
|also_events&lt;br /&gt;
|also_tests&lt;br /&gt;
|also_articles={{LSL DefineRow||[[Typecast]]|}}&lt;br /&gt;
|notes=&lt;br /&gt;
|permission&lt;br /&gt;
|negative_index&lt;br /&gt;
|sort=Json2List&lt;br /&gt;
|cat1=List&lt;br /&gt;
|cat2=String&lt;br /&gt;
|cat3=Data Conversion&lt;br /&gt;
|cat4=JSON&lt;br /&gt;
|history = Date of Release  [[ Release_Notes/Second_Life_Server/13#13.05.20.276191 | 20/05/2013 ]]&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Omei Qunhua</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Pointing_Stick&amp;diff=1193415</id>
		<title>Pointing Stick</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Pointing_Stick&amp;diff=1193415"/>
		<updated>2014-09-14T21:19:23Z</updated>

		<summary type="html">&lt;p&gt;Omei Qunhua: Fix sundry formatting / indenting errors&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Made this to point at folk when its their turn at games lolz right. the useful tidbit is how it  goes in the direction of what ever angle its pointing in.&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;
integer switch = TRUE;&lt;br /&gt;
key user;&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        vector goal = &amp;lt;90, 0, 90&amp;gt;;&lt;br /&gt;
        llSetRot(llEuler2Rot(goal*DEG_TO_RAD));&lt;br /&gt;
        llSetText(&amp;quot;Touch to activate&amp;quot;, &amp;lt;0,1,0&amp;gt;, 1);&lt;br /&gt;
    }&lt;br /&gt;
    on_rez(integer x)&lt;br /&gt;
    {&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
    touch_start(integer y)&lt;br /&gt;
    {&lt;br /&gt;
        if (switch)&lt;br /&gt;
        {&lt;br /&gt;
            user = llDetectedKey(0);&lt;br /&gt;
            llRequestPermissions(user, PERMISSION_TAKE_CONTROLS);&lt;br /&gt;
            llSetText(&amp;quot;Touch to Release Controls&amp;quot;, &amp;lt;1,0,0&amp;gt;, 1);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            if (llDetectedKey(0) != user)     return;&lt;br /&gt;
            llReleaseControls();&lt;br /&gt;
            llRegionSayTo(user, 0, &amp;quot;Controls Released&amp;quot;);&lt;br /&gt;
            llSetText(&amp;quot;Touch to activate&amp;quot;, &amp;lt;0,1,0&amp;gt;, 1);&lt;br /&gt;
        }&lt;br /&gt;
        switch = !switch;&lt;br /&gt;
    }&lt;br /&gt;
    run_time_permissions(integer perm)&lt;br /&gt;
    {&lt;br /&gt;
        if (perm &amp;amp; PERMISSION_TAKE_CONTROLS)&lt;br /&gt;
        {&lt;br /&gt;
            llTakeControls( CONTROL_FWD|CONTROL_BACK|CONTROL_ROT_LEFT|CONTROL_ROT_RIGHT|CONTROL_UP|CONTROL_DOWN,TRUE,FALSE);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    control(key id, integer level, integer edge)&lt;br /&gt;
    {&lt;br /&gt;
        if (level &amp;amp; CONTROL_UP)&lt;br /&gt;
        {&lt;br /&gt;
            llSetLinkPrimitiveParamsFast(-4,[ PRIM_POSITION, llGetPos() +&amp;lt;0,0,0.20&amp;gt; ]);&lt;br /&gt;
        }&lt;br /&gt;
        if (level &amp;amp; CONTROL_DOWN)&lt;br /&gt;
        {&lt;br /&gt;
            llSetLinkPrimitiveParamsFast(-4,[ PRIM_POSITION, llGetPos() +&amp;lt;0,0,-0.20&amp;gt; ]);&lt;br /&gt;
        }&lt;br /&gt;
        if (level &amp;amp; CONTROL_FWD)&lt;br /&gt;
        {&lt;br /&gt;
            llSetLinkPrimitiveParamsFast(-4,[ PRIM_POSITION, llGetPos() +&amp;lt;0,0,0.20&amp;gt; * llGetLocalRot()]);&lt;br /&gt;
        }&lt;br /&gt;
        if (level &amp;amp; CONTROL_BACK)&lt;br /&gt;
        {&lt;br /&gt;
            llSetLinkPrimitiveParamsFast(-4,[ PRIM_POSITION, llGetPos() +&amp;lt;0,0,-0.20&amp;gt; * llGetLocalRot()]);&lt;br /&gt;
        }&lt;br /&gt;
        if(level &amp;amp; CONTROL_ROT_LEFT)&lt;br /&gt;
        {&lt;br /&gt;
            llSetLinkPrimitiveParamsFast(-4,[PRIM_ROT_LOCAL, llGetLocalRot() * llEuler2Rot(&amp;lt;0,0,4&amp;gt;*DEG_TO_RAD)]);&lt;br /&gt;
        }&lt;br /&gt;
        if (level&amp;amp; CONTROL_ROT_RIGHT)&lt;br /&gt;
        {&lt;br /&gt;
            llSetLinkPrimitiveParamsFast(-4,[PRIM_ROT_LOCAL, llGetLocalRot() * llEuler2Rot(&amp;lt;0,0,-4&amp;gt;*DEG_TO_RAD)]);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;/div&gt;</summary>
		<author><name>Omei Qunhua</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlJsonGetValue&amp;diff=1193298</id>
		<title>LlJsonGetValue</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlJsonGetValue&amp;diff=1193298"/>
		<updated>2014-09-11T16:05:48Z</updated>

		<summary type="html">&lt;p&gt;Omei Qunhua: Problems with JSON_TRUE in examples.  Not fully solved.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Function&lt;br /&gt;
|inject-2={{Issues/BUG-3692}}&lt;br /&gt;
|func_id=|func_sleep=0.0|func_energy=10.0&lt;br /&gt;
|func=llJsonGetValue|return_type=string|p1_type=string|p1_name=json|p2_type=list|p2_name=specifiers&lt;br /&gt;
|func_desc=Gets the value indicated by specifiers from the [http://json.org json] string.&lt;br /&gt;
|return_text=made by parsing &#039;&#039;&#039;json&#039;&#039;&#039;, a string representing json and traversing as specified by specifiers.&lt;br /&gt;
|func_footnote=When the input is invalid or no result can be found this function returns [[JSON_INVALID]]. If the result is &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; the function returns [[JSON_NULL]].&lt;br /&gt;
|spec=See [[Json_usage_in_LSL]]&lt;br /&gt;
|constants&lt;br /&gt;
|examples=&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
JGetValTest(){&lt;br /&gt;
    string j=&amp;quot;[[1,2],[4,5,6]]&amp;quot;;            //JSON may be written directly as a string like this in sl.&lt;br /&gt;
    string k;                              //this will change with each command below;&lt;br /&gt;
    k=llJsonGetValue(j,[]);                //returns the whole &amp;quot;list&amp;quot; of a JSON. It might just be one entry or a whole nested list or whole nested object.&lt;br /&gt;
    //if &amp;quot;j&amp;quot; is a single JSON_STRING, this may return what the string represents as a JSON within a string; a JSON_NUMBER , JSON_TRUE, TRUE ...&lt;br /&gt;
&lt;br /&gt;
    k=llJsonGetValue(&amp;quot;\&amp;quot;3.14\&amp;quot;&amp;quot;,[]);       //==k=&amp;quot;3,14&amp;quot; //float that was stored in a JSON_STRING within a JSON. and not as JSON_NUMBER for no good reason&lt;br /&gt;
&lt;br /&gt;
    k=llJsonGetValue(&amp;quot;\&amp;quot;TRUE\&amp;quot;&amp;quot;     ,[]);  //==k=&amp;quot;TRUE&amp;quot;            which may be important to communicate with a java application&lt;br /&gt;
&lt;br /&gt;
    k=llJsonGetValue(&amp;quot;JSON_TRUE&amp;quot;,[]);      // gives k=JSON_INVALID=&amp;quot;�&amp;quot;;   &lt;br /&gt;
    k = llEscapeURL(k) ;                   // k = &amp;quot;%EF%B7%90&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    k=llJsonGetValue(&amp;quot;\&amp;quot;JSON_TRUE\&amp;quot;&amp;quot;,[]);  // k will contain the 9-character text string &amp;quot;JSON_TRUE&amp;quot;&lt;br /&gt;
&lt;br /&gt;
    k=llJsonGetValue(j,[0]);               //returns only the first entry (at offset 0). An entry can be many things, a string, a float stored as string, &lt;br /&gt;
                                           //a [list] or {object}, each entry being separated by a comma from other entries.&lt;br /&gt;
                                           //list and object entries may contain multiple comma separated entries within them.&lt;br /&gt;
    k=llJsonGetValue(j,[1]);//returns only the second entry... (all the above still applies) k=&amp;quot;[4,5,6]&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    k=llJsonGetValue(llJsonGetValue(j,[1]),[2]);&lt;br /&gt;
                                           //instead of getting an entry from &amp;quot;j&amp;quot; we get a sub-entry from llJsonGetValue(j,[1]), &lt;br /&gt;
                                           //assuming the sub-entry is a JSON_LIST. It returns the 3rd sub-entry of the second entry, &lt;br /&gt;
                                           //that is a list with 3 entries. it would make k=&amp;quot;6&amp;quot;. &lt;br /&gt;
                                           //it will return JSON_INVALID if there is no 3rd entry in no 2nd sub-list.&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
See also [[llJsonValueType]] for examples where the value type is checked before getting the value as that type.&lt;br /&gt;
&lt;br /&gt;
|caveats&lt;br /&gt;
|helpers&lt;br /&gt;
|also_functions={{LSL DefineRow||[[llList2Json]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llJson2List]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llJsonSetValue]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llJsonValueType]]|}}&lt;br /&gt;
|also_events&lt;br /&gt;
|also_tests&lt;br /&gt;
|also_articles={{LSL DefineRow||[[Typecast]]|}}&lt;br /&gt;
|notes=&lt;br /&gt;
|permission&lt;br /&gt;
|negative_index&lt;br /&gt;
|sort=JsonGetValue&lt;br /&gt;
|cat1=List&lt;br /&gt;
|cat2=String&lt;br /&gt;
|cat3=Data Conversion&lt;br /&gt;
|cat4=JSON&lt;br /&gt;
|history = Date of Release  [[ Release_Notes/Second_Life_Server/13#13.05.20.276191 | 20/05/2013 ]]&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Omei Qunhua</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlJsonGetValue&amp;diff=1193296</id>
		<title>LlJsonGetValue</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlJsonGetValue&amp;diff=1193296"/>
		<updated>2014-09-11T15:24:58Z</updated>

		<summary type="html">&lt;p&gt;Omei Qunhua: Correct examples. JSON entries count from zero, not 1&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Function&lt;br /&gt;
|inject-2={{Issues/BUG-3692}}&lt;br /&gt;
|func_id=|func_sleep=0.0|func_energy=10.0&lt;br /&gt;
|func=llJsonGetValue|return_type=string|p1_type=string|p1_name=json|p2_type=list|p2_name=specifiers&lt;br /&gt;
|func_desc=Gets the value indicated by specifiers from the [http://json.org json] string.&lt;br /&gt;
|return_text=made by parsing &#039;&#039;&#039;json&#039;&#039;&#039;, a string representing json and traversing as specified by specifiers.&lt;br /&gt;
|func_footnote=When the input is invalid or no result can be found this function returns [[JSON_INVALID]]. If the result is &amp;lt;code&amp;gt;null&amp;lt;/code&amp;gt; the function returns [[JSON_NULL]].&lt;br /&gt;
|spec=See [[Json_usage_in_LSL]]&lt;br /&gt;
|constants&lt;br /&gt;
|examples=&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
JGetValTest(){&lt;br /&gt;
    string j=&amp;quot;[[1,2],[4,5,6]]&amp;quot;;            //JSON may be written directly as a string like this in sl.&lt;br /&gt;
    string k;                              //this will change with each command below;&lt;br /&gt;
    k=llJsonGetValue(j,[]);                //returns the whole &amp;quot;list&amp;quot; of a JSON. It might just be one entry or a whole nested list or whole nested object.&lt;br /&gt;
    //if &amp;quot;j&amp;quot; is a single JSON_STRING, this may return what the string represents as a JSON within a string; a JSON_NUMBER , JSON_TRUE, TRUE ...&lt;br /&gt;
&lt;br /&gt;
    k=llJsonGetValue(&amp;quot;\&amp;quot;3.14\&amp;quot;&amp;quot;,[]);       //==k=&amp;quot;3,14&amp;quot; //float that was stored in a JSON_STRING within a JSON. and not as JSON_NUMBER for no good reason&lt;br /&gt;
    k=llJsonGetValue(&amp;quot;\&amp;quot;TRUE\&amp;quot;&amp;quot;     ,[]);  //==k=&amp;quot;TRUE&amp;quot;            which may be important to communicate with a java application&lt;br /&gt;
    k=llJsonGetValue(&amp;quot;\&amp;quot;JSON_TRUE\&amp;quot;&amp;quot;,[]);  //==k=JSON_TRUE=&amp;quot;�&amp;quot;; //which is the reverse part for an sl scripts &amp;quot;true&amp;quot; states&lt;br /&gt;
    k=llJsonGetValue(j,[0]);               //returns only the first entry (at offset 0). An entry can be many things, a string, a float stored as string, &lt;br /&gt;
                                           //a [list] or {object}, each entry being separated by a comma from other entries.&lt;br /&gt;
                                           //list and object entries may contain multiple comma separated entries within them.&lt;br /&gt;
    k=llJsonGetValue(j,[1]);//returns only the second entry... (all the above still applies) k=&amp;quot;[4,5,6]&amp;quot;;&lt;br /&gt;
    k=llJsonGetValue(llJsonGetValue(j,[1]),[2]);&lt;br /&gt;
                                           //instead of getting an entry from &amp;quot;j&amp;quot; we get a sub-entry from llJsonGetValue(j,[1]), &lt;br /&gt;
                                           //assuming the sub-entry is a JSON_LIST. It returns the 3rd sub-entry of the second entry, &lt;br /&gt;
                                           //that is a list with 3 entries. it would make k=&amp;quot;6&amp;quot;. &lt;br /&gt;
                                           //it will return JSON_INVALID if there is no 3rd entry in no 2nd sub-list.&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
see [[LlJsonValueType]] for LlJsonGetValue()-examples, because its better to test if the LlJsonValueType() is correct before getting its value as that type.&lt;br /&gt;
&lt;br /&gt;
|caveats&lt;br /&gt;
|helpers&lt;br /&gt;
|also_functions={{LSL DefineRow||[[llList2Json]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llJson2List]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llJsonSetValue]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llJsonValueType]]|}}&lt;br /&gt;
|also_events&lt;br /&gt;
|also_tests&lt;br /&gt;
|also_articles={{LSL DefineRow||[[Typecast]]|}}&lt;br /&gt;
|notes=&lt;br /&gt;
|permission&lt;br /&gt;
|negative_index&lt;br /&gt;
|sort=JsonGetValue&lt;br /&gt;
|cat1=List&lt;br /&gt;
|cat2=String&lt;br /&gt;
|cat3=Data Conversion&lt;br /&gt;
|cat4=JSON&lt;br /&gt;
|history = Date of Release  [[ Release_Notes/Second_Life_Server/13#13.05.20.276191 | 20/05/2013 ]]&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Omei Qunhua</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlListFindList/fr&amp;diff=1193264</id>
		<title>LlListFindList/fr</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlListFindList/fr&amp;diff=1193264"/>
		<updated>2014-09-10T13:27:14Z</updated>

		<summary type="html">&lt;p&gt;Omei Qunhua: not found is not a generic error, and often not any kind of error.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function/fr&lt;br /&gt;
|func=llListFindList&lt;br /&gt;
|sort=ListFindList&lt;br /&gt;
|func_id=201|func_sleep=0.0|func_energy=10.0&lt;br /&gt;
|return_type=integer|p1_type=list|p1_name=src|p2_type=list|p2_name=test&lt;br /&gt;
|func_footnote=Si &#039;&#039;&#039;test&#039;&#039;&#039; n’est pas trouvé dans le list &#039;&#039;&#039;src&#039;&#039;&#039;, la fonction renvoie la valeur -1.&amp;lt;br/&amp;gt;&lt;br /&gt;
L’index du premier élément d’un list est l’index {{HoverText|0|zéro}}&lt;br /&gt;
|func_desc&lt;br /&gt;
|return_text=correspondant à l’index du premier élément du list &#039;&#039;&#039;test&#039;&#039;&#039; dans &#039;&#039;&#039;src&#039;&#039;&#039; &amp;lt;br&amp;gt;&#039;&#039;la fonction contrôle l&#039;existence d&#039;un list dans un autre list.&#039;&#039;&lt;br /&gt;
|spec&lt;br /&gt;
|caveats=*La fonction effectue une comparaison stricte des strings&lt;br /&gt;
|constants&lt;br /&gt;
|examples=&amp;lt;lsl&amp;gt;list numbers = [1, 2, 3, 4, 5];&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        integer index = llListFindList(numbers, [3]);&lt;br /&gt;
        if (index != -1)&lt;br /&gt;
        {&lt;br /&gt;
            list three_four = llList2List(numbers, index, index + 1);&lt;br /&gt;
            llOwnerSay(llDumpList2String(three_four, &amp;quot;,&amp;quot;));&lt;br /&gt;
            // Object: 3,4&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&amp;lt;lsl&amp;gt;// Gestion d&#039;une liste d&#039;acces by staxx Hird&lt;br /&gt;
// Complètement gratuit vous pouvez utilisez ce script comme vous le souhaitez&lt;br /&gt;
// la revente est interdite ceci à pour but de comprendre le système de liste avec un example concret.&lt;br /&gt;
// tapez le nom de l&#039;avatar qui sera autorisé&lt;br /&gt;
&lt;br /&gt;
list acces;&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        acces = []; // au chargement la liste est vide&lt;br /&gt;
        llListen(0,&amp;quot;&amp;quot;,llGetOwner(),&amp;quot;&amp;quot;); // ecoute sur le canal 0 (chat)&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    listen( integer channel, string name, key id, string message )&lt;br /&gt;
    {&lt;br /&gt;
        if(llGetOwnerKey(id) == llGetOwner())// on verifie que c&#039;est bien le owner de l&#039;objet qui ajoute l&#039;avatar&lt;br /&gt;
        {&lt;br /&gt;
            integer index = llListFindList(acces, [message]);// on cherche si l&#039;avatar est déjà présent dans le liste&lt;br /&gt;
            if (index == -1)&lt;br /&gt;
            {&lt;br /&gt;
                string av = llToUpper(message);// on enregistre le nom en majuscule &lt;br /&gt;
                acces += av;// on ajoute l&#039;avatar autorisé&lt;br /&gt;
                llOwnerSay(message+&amp;quot; à été ajouter à la liste d&#039;accès !&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                // si il est déjà dans la liste on le lui dit&lt;br /&gt;
                llOwnerSay(message+&amp;quot; se trouve déjà dans la liste d&#039;accès&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        string alt = llToUpper(llDetectedName(0)); // on passe le nom de l&#039;avatar qui à cliquer en majuscule&lt;br /&gt;
        integer index = llListFindList(acces, [alt]); // on cherche si il fait partie de la liste&lt;br /&gt;
        if (index == -1)&lt;br /&gt;
        {&lt;br /&gt;
           llSay(0,&amp;quot;Vous n&#039;avez pas l&#039;accès à cette zone&amp;quot;); // pas trouver donc pas d&#039;accès&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            llSay(0,&amp;quot;Bienvenue: &amp;quot;+llDetectedName(0));// on la trouver il peux avoir accès&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
|helpers=&lt;br /&gt;
Une façon simple de vérifier l’existence d’un élément dans un list...&lt;br /&gt;
&amp;lt;lsl&amp;gt;if(~llListFindList(myList, (list)item))&lt;br /&gt;
{//il existe&lt;br /&gt;
    //cela fonction car  ~(-1) == 0&lt;br /&gt;
    //cela permet de sauver de l’espace et c’est plus rapide que != -1&lt;br /&gt;
}&amp;lt;/lsl&amp;gt;&lt;br /&gt;
|also_functions=&lt;br /&gt;
{{LSL DefineRow||[[llSubStringIndex/fr|llSubStringIndex]]|Trouve un string dans un autre string}}&lt;br /&gt;
|also_events&lt;br /&gt;
|also_tests&lt;br /&gt;
|also_articles&lt;br /&gt;
|notes&lt;br /&gt;
|permission&lt;br /&gt;
|negative_index&lt;br /&gt;
|sort=ListFindList&lt;br /&gt;
|cat1=List/fr&lt;br /&gt;
|cat2&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Omei Qunhua</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Kephra_Nurmi/lsDialog&amp;diff=1193263</id>
		<title>User:Kephra Nurmi/lsDialog</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Kephra_Nurmi/lsDialog&amp;diff=1193263"/>
		<updated>2014-09-10T13:21:45Z</updated>

		<summary type="html">&lt;p&gt;Omei Qunhua: Undo revision 1182277 by Kireji Haiku (Talk) Mis-use of ERR_GENERIC&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
&lt;br /&gt;
== lsDialog == &lt;br /&gt;
&lt;br /&gt;
lsDialog is an universal notecard driven menu dialog system. lsDialog could be used in a HUD or rezzed objects, providing one prim dialog trees or multi prim button dialogs. You can restrict usage to owner, group, named avatars or everybody. lsDialog is using llSay or llMessageLinked to comunicate with other scripts.&lt;br /&gt;
&lt;br /&gt;
== Script: .lsDialog 09124 ==&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
// .lsDialog 09124 (c) 2007-2009 by Kephra Nurmi under Creative Commons Attribution-Share Alike 3.0 License&lt;br /&gt;
&lt;br /&gt;
string configName = &amp;quot;.lsDialog&amp;quot;;&lt;br /&gt;
string configKey = NULL_KEY;&lt;br /&gt;
integer configLine = 0;&lt;br /&gt;
key configReq = NULL_KEY;&lt;br /&gt;
integer avChannel;&lt;br /&gt;
&lt;br /&gt;
list dialogNames = [];&lt;br /&gt;
list dialogLines = [];&lt;br /&gt;
string currentName = &amp;quot;&amp;quot;;&lt;br /&gt;
string currentLines = &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
string currentMenu = &amp;quot;&amp;quot;;&lt;br /&gt;
list currentOptions = [];&lt;br /&gt;
list currentValues = [];&lt;br /&gt;
list simpleOptions = [];&lt;br /&gt;
list simpleActions = [];&lt;br /&gt;
&lt;br /&gt;
integer djChannel = 0;&lt;br /&gt;
integer djListen = 0;&lt;br /&gt;
key djKey = NULL_KEY;&lt;br /&gt;
string djName = &amp;quot;&amp;quot;;&lt;br /&gt;
list guests = [ ];&lt;br /&gt;
integer everybody = FALSE;&lt;br /&gt;
integer samegroup = FALSE;&lt;br /&gt;
integer again = TRUE;&lt;br /&gt;
integer linked = FALSE;&lt;br /&gt;
&lt;br /&gt;
integer permissions(key id) {&lt;br /&gt;
    return (everybody&lt;br /&gt;
        || (samegroup &amp;amp;&amp;amp; llSameGroup(id))&lt;br /&gt;
        || (llGetOwner() == id)&lt;br /&gt;
        || ((NULL_KEY != djKey) &amp;amp;&amp;amp; (djKey == id))&lt;br /&gt;
        || (llListFindList(guests, [ llKey2Name(id) ])&amp;gt;=0));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
configRestart() {&lt;br /&gt;
    configName = &amp;quot;.lsDialog&amp;quot;;&lt;br /&gt;
    key conf = llGetInventoryKey(configName);&lt;br /&gt;
    if ((string)conf == configKey) return;&lt;br /&gt;
    if ((NULL_KEY != configKey) &amp;amp;&amp;amp; (llGetFreeMemory() &amp;lt; 6000)) llResetScript();&lt;br /&gt;
    dialogNames = [];&lt;br /&gt;
    dialogLines = [];&lt;br /&gt;
    simpleOptions = [];&lt;br /&gt;
    simpleActions = [];&lt;br /&gt;
    currentName = &amp;quot;&amp;quot;;&lt;br /&gt;
    currentLines = &amp;quot;&amp;quot;;&lt;br /&gt;
    djChannel = 0;&lt;br /&gt;
    djKey = NULL_KEY;&lt;br /&gt;
    djName = &amp;quot;&amp;quot;;&lt;br /&gt;
    guests = [ ];&lt;br /&gt;
    everybody = FALSE;&lt;br /&gt;
    samegroup = FALSE;&lt;br /&gt;
    if (conf == NULL_KEY) return;&lt;br /&gt;
    configKey = conf;&lt;br /&gt;
    configLine = 0;&lt;br /&gt;
    configReq = llGetNotecardLine(configName,configLine);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
flushDialog() {&lt;br /&gt;
    if (&amp;quot;&amp;quot; == currentName) return;&lt;br /&gt;
    if (&amp;quot;&amp;quot; == currentLines) return;&lt;br /&gt;
    integer i = llListFindList(dialogNames,[ currentName ]);&lt;br /&gt;
    if (i&amp;gt;=0) {&lt;br /&gt;
        dialogNames = llDeleteSubList(dialogNames,i,i);&lt;br /&gt;
        dialogLines = llDeleteSubList(dialogLines,i,i);&lt;br /&gt;
    }&lt;br /&gt;
    dialogNames = dialogNames + [ currentName ];&lt;br /&gt;
    dialogLines = dialogLines + [ currentLines ];&lt;br /&gt;
    currentName = &amp;quot;&amp;quot;;&lt;br /&gt;
    currentLines = &amp;quot;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
parseDialogRC(string data) {&lt;br /&gt;
    if (llStringLength(data) == 0) return;&lt;br /&gt;
    if (llGetSubString(data,0,0) == &amp;quot;#&amp;quot;) return;&lt;br /&gt;
    if ((llGetSubString(data,0,0) == &amp;quot;[&amp;quot;) &amp;amp;&amp;amp; (llSubStringIndex(data,&amp;quot;]&amp;quot;) &amp;gt;= 0)) {&lt;br /&gt;
        flushDialog();&lt;br /&gt;
        currentName = llGetSubString(data,1,llSubStringIndex(data,&amp;quot;]&amp;quot;)-1);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    if (&amp;quot;&amp;quot; == currentName) {&lt;br /&gt;
        if (&amp;quot;Allow=Owner&amp;quot; == data) { everybody = FALSE; samegroup = FALSE; }&lt;br /&gt;
        else&lt;br /&gt;
        if (&amp;quot;Allow=Group&amp;quot; == data) { everybody = FALSE; samegroup = TRUE; }&lt;br /&gt;
        else&lt;br /&gt;
        if (&amp;quot;Allow=All&amp;quot; == data) { everybody = TRUE; samegroup = FALSE; }&lt;br /&gt;
        else&lt;br /&gt;
        if (&amp;quot;Allow=&amp;quot; == llGetSubString(data,0,5)) { guests = guests + [ llGetSubString(data,6,-1) ]; }&lt;br /&gt;
        else&lt;br /&gt;
        if (&amp;quot;LSDJ=&amp;quot; == llGetSubString(data,0,4)) { djChannel = (integer)llGetSubString(data,5,-1); }&lt;br /&gt;
        else&lt;br /&gt;
        if (&amp;quot;Dialog=Again&amp;quot; == data) { again = TRUE; }&lt;br /&gt;
        else&lt;br /&gt;
        if (&amp;quot;Dialog=Once&amp;quot; == data) { again = FALSE; }&lt;br /&gt;
        else&lt;br /&gt;
        if (&amp;quot;Dialog=Link&amp;quot; == data) { linked = TRUE; }&lt;br /&gt;
    } else&lt;br /&gt;
    if (&amp;quot;*&amp;quot; == currentName) {&lt;br /&gt;
        integer p = llSubStringIndex(data,&amp;quot;=&amp;quot;);&lt;br /&gt;
        if (0 &amp;lt; p) {&lt;br /&gt;
            simpleOptions = simpleOptions + [ llGetSubString(data, 0, p-1) ];&lt;br /&gt;
            simpleActions = simpleActions + [ llGetSubString(data, p+1, -1) ];&lt;br /&gt;
        }&lt;br /&gt;
    } else&lt;br /&gt;
    if (llSubStringIndex(data,&amp;quot;=&amp;quot;) &amp;gt;= 0) {&lt;br /&gt;
        if (&amp;quot;&amp;quot; == currentLines)&lt;br /&gt;
            currentLines = data;&lt;br /&gt;
        else&lt;br /&gt;
            currentLines = currentLines+&amp;quot;\n&amp;quot;+data;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
parseDialogLines(string menu) {&lt;br /&gt;
    currentMenu = menu;&lt;br /&gt;
    currentOptions = [];&lt;br /&gt;
    currentValues = [];&lt;br /&gt;
    integer i = llListFindList(dialogNames, [ menu ]);&lt;br /&gt;
    if (i &amp;lt; 0) return;&lt;br /&gt;
    list l = llParseString2List(llList2String(dialogLines,i),[ &amp;quot;\n&amp;quot; ], []);&lt;br /&gt;
    integer n = llGetListLength(l);&lt;br /&gt;
    integer k;&lt;br /&gt;
    string s;&lt;br /&gt;
    for (i = 0; i&amp;lt;n; i++) {&lt;br /&gt;
        s = llList2String(l, i);&lt;br /&gt;
        k = llSubStringIndex(s,&amp;quot;=&amp;quot;);&lt;br /&gt;
        if (k&amp;gt;0) {&lt;br /&gt;
            currentOptions = currentOptions + [ llGetSubString(s,0,k-1) ];&lt;br /&gt;
            currentValues = currentValues + [ llGetSubString(s,k+1,-1) ];&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
action(string s, key id) {&lt;br /&gt;
    integer q = -1;&lt;br /&gt;
    integer r = -1;&lt;br /&gt;
    q = llSubStringIndex(s,&amp;quot; &amp;quot;);&lt;br /&gt;
    if (0 &amp;lt;  q) { r = q+llSubStringIndex(llGetSubString(s,q+1,-1),&amp;quot; &amp;quot;)+1; }&lt;br /&gt;
    if (q &amp;lt;  r) {&lt;br /&gt;
        string cmd = llGetSubString(s,0,q-1);&lt;br /&gt;
        integer ch = (integer)llGetSubString(s,q+1,r-1);&lt;br /&gt;
        string val = llGetSubString(s,r+1,-1);&lt;br /&gt;
        if (&amp;quot;say&amp;quot; == cmd) llSay(ch,val);&lt;br /&gt;
        if (&amp;quot;shout&amp;quot; == cmd) llShout(ch,val);&lt;br /&gt;
        if (&amp;quot;whisper&amp;quot; == cmd) llWhisper(ch,val);&lt;br /&gt;
        if (&amp;quot;region&amp;quot; == cmd) llRegionSay(ch,val);&lt;br /&gt;
        if (&amp;quot;root&amp;quot; == cmd) llMessageLinked(LINK_ROOT,ch,val,id);&lt;br /&gt;
        if (&amp;quot;link&amp;quot; == cmd) llMessageLinked(LINK_SET,ch,val,id);&lt;br /&gt;
        if (&amp;quot;this&amp;quot; == cmd) llMessageLinked(LINK_THIS,ch,val,id);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default {&lt;br /&gt;
    state_entry() {&lt;br /&gt;
        configRestart();&lt;br /&gt;
        avChannel = 1000+(integer)llFrand(3000.0);&lt;br /&gt;
        llListen( avChannel, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot; );&lt;br /&gt;
    }&lt;br /&gt;
    changed(integer type) {&lt;br /&gt;
        if (type &amp;amp; CHANGED_OWNER) llResetScript();&lt;br /&gt;
        if (type &amp;amp; CHANGED_INVENTORY) configRestart();&lt;br /&gt;
    }&lt;br /&gt;
    dataserver(key queryId, string data) {&lt;br /&gt;
        if (queryId != configReq) return;&lt;br /&gt;
        if (data != EOF) {&lt;br /&gt;
            llSetText(&amp;quot;parsing line &amp;quot;+(string)configLine,&amp;lt;1,0,0&amp;gt;,1);&lt;br /&gt;
            parseDialogRC(data);&lt;br /&gt;
            configReq = llGetNotecardLine(configName,++configLine);&lt;br /&gt;
        } else {&lt;br /&gt;
            if (0 != djListen)&lt;br /&gt;
                llListenRemove(djListen);&lt;br /&gt;
            if (0 != djChannel)&lt;br /&gt;
                djListen = llListen( djChannel, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot; );&lt;br /&gt;
            llSetText(&amp;quot;&amp;quot;,&amp;lt;1,0,0&amp;gt;,1);&lt;br /&gt;
            flushDialog();&lt;br /&gt;
            llOwnerSay(&amp;quot;ready, &amp;quot;+(string)llGetFreeMemory()+&amp;quot; free memory, listen on channel: &amp;quot;+(string)avChannel);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    touch_start(integer num) {&lt;br /&gt;
        key id = llDetectedKey(0);&lt;br /&gt;
        if (!permissions(id)) return;&lt;br /&gt;
        if (linked) {&lt;br /&gt;
            integer l = llDetectedLinkNumber(0);&lt;br /&gt;
            integer p = llListFindList(simpleOptions, [ llGetLinkName(l) ]);&lt;br /&gt;
            if (0 &amp;lt;= p)&lt;br /&gt;
                action(llList2String(simpleActions, p), id);&lt;br /&gt;
            else {&lt;br /&gt;
                p = llListFindList(dialogNames, [ llGetLinkName(l) ]);&lt;br /&gt;
                if (p &amp;gt;= 0) {&lt;br /&gt;
                    parseDialogLines(llList2String(dialogNames,p));&lt;br /&gt;
                    llDialog(id,llList2String(dialogNames,p),currentOptions,avChannel);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        } else&lt;br /&gt;
        if ((llGetListLength(dialogNames) &amp;gt; 1) || (llGetListLength(simpleActions) &amp;gt; 0)) {&lt;br /&gt;
            currentMenu = &amp;quot;&amp;quot;;&lt;br /&gt;
            string s = llGetObjectDesc();&lt;br /&gt;
            if (&amp;quot;&amp;quot; == s) s = &amp;quot;your command?&amp;quot;;&lt;br /&gt;
            llDialog(id,s,dialogNames+simpleOptions,avChannel);&lt;br /&gt;
        } else&lt;br /&gt;
        if (llGetListLength(dialogNames) == 1) {&lt;br /&gt;
            parseDialogLines(llList2String(dialogNames,0));&lt;br /&gt;
            llDialog(id,llList2String(dialogNames,0),currentOptions,avChannel);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    listen(integer channel, string name, key id, string message) {&lt;br /&gt;
        if (djChannel == channel) {&lt;br /&gt;
            key k = id;&lt;br /&gt;
            if (llGetAgentInfo(id)&amp;lt;=0) k = llGetOwnerKey(k);&lt;br /&gt;
            if (k != llGetOwner()) return;&lt;br /&gt;
            list tmp = llCSV2List(message);&lt;br /&gt;
            if (&amp;quot;DJ&amp;quot; == llList2String(tmp,0))&lt;br /&gt;
                djKey = llList2String(tmp,1);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if (!permissions(id)) return;&lt;br /&gt;
        if (&amp;quot;&amp;quot; == currentMenu) {&lt;br /&gt;
            integer i = llListFindList(simpleOptions,[ message ]);&lt;br /&gt;
            if (i&amp;gt;=0) action(llList2String(simpleActions, i), id);&lt;br /&gt;
            else {&lt;br /&gt;
                parseDialogLines(message);&lt;br /&gt;
                llDialog(id,currentMenu,currentOptions + [ &amp;quot;Back&amp;quot; ],avChannel);&lt;br /&gt;
            }&lt;br /&gt;
        } else &lt;br /&gt;
        if (&amp;quot;Back&amp;quot; == message) {&lt;br /&gt;
            currentMenu = &amp;quot;&amp;quot;;&lt;br /&gt;
            string s = llGetObjectDesc();&lt;br /&gt;
            if (&amp;quot;&amp;quot; == s) s = &amp;quot;your command?&amp;quot;;&lt;br /&gt;
            llDialog(id,s,dialogNames+simpleOptions,avChannel);&lt;br /&gt;
        } else {&lt;br /&gt;
            integer i = llListFindList(currentOptions,[ message ]);&lt;br /&gt;
            if (i&amp;gt;=0) action(llList2String(currentValues, i), id);&lt;br /&gt;
            if (again) {&lt;br /&gt;
                if (llGetListLength(dialogNames) &amp;gt; 1)&lt;br /&gt;
                    llDialog(id,currentMenu,currentOptions + [ &amp;quot;Back&amp;quot; ],avChannel);&lt;br /&gt;
                else&lt;br /&gt;
                    llDialog(id,currentMenu,currentOptions,avChannel);&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;
== Notecard: .lsDialog ==&lt;br /&gt;
&lt;br /&gt;
The .lsDialog notecard defines the menu dialog tree. A typical simple notecard could look like:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;ini&amp;gt;&lt;br /&gt;
# default is to ask repeating ... remove comment if &lt;br /&gt;
#Dialog=Once&lt;br /&gt;
#Dialog=Link&lt;br /&gt;
&lt;br /&gt;
# allow only one of the following&lt;br /&gt;
#Allow=Owner&lt;br /&gt;
#Allow=Group&lt;br /&gt;
#Allow=All&lt;br /&gt;
&lt;br /&gt;
# and in addition several named avatars&lt;br /&gt;
#Allow=Kephra Nurmi&lt;br /&gt;
#Allow=Alez Ember&lt;br /&gt;
&lt;br /&gt;
[*]&lt;br /&gt;
Reset=link 0 reset&lt;br /&gt;
&lt;br /&gt;
[Size]&lt;br /&gt;
90%=link 0 *,size,90&lt;br /&gt;
95%=link 0 *,size,95&lt;br /&gt;
100%=link 0 *,size,100&lt;br /&gt;
105%=link 0 *,size,105&lt;br /&gt;
110%=link 0 *,size,110&lt;br /&gt;
&lt;br /&gt;
[Color]&lt;br /&gt;
Lime=link 0 glass,color,Lime&lt;br /&gt;
Ivory=link 0 glass,color,Ivory&lt;br /&gt;
Cyan=link 0 glass,color,Cyan&lt;br /&gt;
&amp;lt;/ini&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This notecard will define a single prim dialog system with one top menu called &#039;Reset&#039; and two sub menus called &#039;Size&#039; and &#039;Color&#039; with link action on channel 0 and default permissions. The object description defines the name for the top menu dialog. Each menu starts with a section header in brackets followed lines to define the dialog entries. Each entry has a name equal to an action, a channel and a string.&lt;br /&gt;
&lt;br /&gt;
Possible actions are:&lt;br /&gt;
&lt;br /&gt;
* say - llSay(ch,val);&lt;br /&gt;
* shout - llShout(ch,val);&lt;br /&gt;
* whisper - llWhisper(ch,val);&lt;br /&gt;
* region - llRegionSay(ch,val);&lt;br /&gt;
* root - llMessageLinked(LINK_ROOT,ch,val,id);&lt;br /&gt;
* link - llMessageLinked(LINK_SET,ch,val,id);&lt;br /&gt;
* this - llMessageLinked(LINK_THIS,ch,val,id);&lt;br /&gt;
&lt;br /&gt;
The top of the notecard, before any sections in brackets start, defines the permission and behavior. The hash marks lines as comments. Uncommenting Dialog=Once will cause to ask only one once, and not repeatingly. Dialog=Linked would need a 4 prim object, with buttons named &#039;Reset&#039;, &#039;Size&#039; and &#039;Color&#039;. The Allow= statements change the default permissions.&lt;br /&gt;
&lt;br /&gt;
{{LSLC|Library}}&lt;/div&gt;</summary>
		<author><name>Omei Qunhua</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User_talk:Omei_Qunhua&amp;diff=1193262</id>
		<title>User talk:Omei Qunhua</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User_talk:Omei_Qunhua&amp;diff=1193262"/>
		<updated>2014-09-10T13:17:11Z</updated>

		<summary type="html">&lt;p&gt;Omei Qunhua: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;An appeal:&lt;br /&gt;
&lt;br /&gt;
When submitting sample scripts (or editing existing samples) PLEASE  ensure you&#039;ve tested the resulting script.&lt;br /&gt;
There can be no excuse for blindly editing and not testing, and certainly no excuse for submitting scripts that won&#039;t even compile!&lt;br /&gt;
[[User:Omei Qunhua|Omei Qunhua]] 09:02, 9 December 2012 (PST)&lt;br /&gt;
&lt;br /&gt;
:I wholeheartedly agree. I have been guilty of the sin but I agree. lslint and lsleditor are our friends. I noticed you mentioned that some edits have been breaking examples. If that happens, please make a note of it somewhere, we need to keep track of this so we can halt any negative trends. -- &#039;&#039;&#039;[[User:Strife_Onizuka|Strife]]&#039;&#039;&#039; &amp;lt;sup&amp;gt;&amp;lt;small&amp;gt;([[User talk:Strife_Onizuka|talk]]|[[Special:Contributions/Strife_Onizuka|contribs]])&amp;lt;/small&amp;gt;&amp;lt;/sup&amp;gt; 08:34, 14 December 2012 (PST)&lt;br /&gt;
&lt;br /&gt;
::Well if you want to observe a negative trend, the following Wiki pages / examples were all corrupted by the same person :)&lt;br /&gt;
 &amp;lt;pre&amp;gt;&lt;br /&gt;
Wiki Page                 Date Corrupted         Nature of Error&lt;br /&gt;
&lt;br /&gt;
Gun Script                  18-Oct-12            Compile error&lt;br /&gt;
&lt;br /&gt;
llGetAgentList               8-Dec-12            Compile error  &lt;br /&gt;
&lt;br /&gt;
llGetAgentList               9-Dec-12            Run-time bad results &lt;br /&gt;
&lt;br /&gt;
llDialog                    24-Sept-12           Compile error&lt;br /&gt;
&lt;br /&gt;
11SetLinkAlpha              30-Sept-12           Compile error&lt;br /&gt;
&lt;br /&gt;
llGetLinkInventoryPermMask  25-Nov-12            Compile error&lt;br /&gt;
&lt;br /&gt;
llResetOtherScript          24-Sept-12           Run-time error&lt;br /&gt;
&lt;br /&gt;
llGetSimStats                8-Dec-12            Compile error&lt;br /&gt;
&lt;br /&gt;
llRequestURL                24-Sep-12            Compile error&lt;br /&gt;
&lt;br /&gt;
llSetKeyframedMotion        24-Sep-12            Run-time error&lt;br /&gt;
&lt;br /&gt;
llEvade                      4-Dec-12            Compile error&lt;br /&gt;
&lt;br /&gt;
llGetClosestNavPoint         4-Dec-12            Compile error&lt;br /&gt;
&lt;br /&gt;
llGetNotecardLine           23-Sept-12           Run-time bad results&lt;br /&gt;
&lt;br /&gt;
StringIsNum                  7-Oct-12            Compile error&lt;br /&gt;
&lt;br /&gt;
Sensor                      28-Oct-12            Compile error and Run time wrong results&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(I&#039;ve also corrected 4 other non-compilable or faulty example scripts by other editors, where the errors have existed since July 2012, March 2008, and Sept 2007)&lt;br /&gt;
&lt;br /&gt;
[[User:Omei Qunhua|Omei Qunhua]] 15:26, 18 December 2012 (PST)&lt;br /&gt;
&lt;br /&gt;
:I have take a look at all his changeings in the example scripts and do not agree with the most, Everywhere he remove inside the sub-if&#039;s the clamps and resort the events. The most of the experienced scripters do not realy read it, but for beginners i think its bad when they not see where are the clamps necessary and where not. [[User:Daemonika Nightfire|Daemonika Nightfire]] 10:19, 20 December 2012 (PST)&lt;br /&gt;
&lt;br /&gt;
:I disagree with the way you say a script is &amp;quot;faulty&amp;quot;   You do not clearly state your reasoning which is debatable because it&#039;s based on your own personal preference. --[[User:Ackley Bing|Ackley Bing]] 10:12, 14 February 2013 (PST)&lt;br /&gt;
&lt;br /&gt;
::It&#039;s not a matter of &amp;quot;personal preference&amp;quot;. If a script doesn&#039;t compile, or gives wrong results at run-time, then it&#039;s faulty. [[User:Omei Qunhua|Omei Qunhua]] 03:22, 15 February 2013 (PST)&lt;br /&gt;
&lt;br /&gt;
 &lt;br /&gt;
== More size constructs ==&lt;br /&gt;
&lt;br /&gt;
I&#039;ve confirmed your results and made a few more tests of size optimization constructs.&lt;br /&gt;
&lt;br /&gt;
 x=-~x;               6 bytes (equivalent to ++x)&lt;br /&gt;
 x=~-x;               6 bytes (equivalent to --x)&lt;br /&gt;
 y=-~x;               6 bytes (equivalent to y=x+1)&lt;br /&gt;
 if(~x);              7 bytes (equivalent to if(x!=-1))&lt;br /&gt;
 x*2;                 8 bytes (equivalent to x&amp;lt;&amp;lt;1)&lt;br /&gt;
 x=-~-~x;             8 bytes (equivalent to x+=2)&lt;br /&gt;
 x=~-~-x;             8 bytes (equivalent to x-=2)&lt;br /&gt;
 y=x+1;              10 bytes&lt;br /&gt;
 x=x*2;              10 bytes (equivalent to x=x&amp;lt;&amp;lt;1)&lt;br /&gt;
 x*=2;               10 bytes&lt;br /&gt;
 if (!~x);           10 bytes (equivalent to if(x==-1))&lt;br /&gt;
 if(x&amp;amp;0x80000000)    12 bytes (equivalent to if(x&amp;lt;0) for integers)&lt;br /&gt;
 if(x&amp;lt;0);            13 bytes&lt;br /&gt;
 x=x&amp;lt;&amp;lt;1;             14 bytes&lt;br /&gt;
 if(x!=-1);          17 bytes&lt;br /&gt;
&lt;br /&gt;
For float x:&lt;br /&gt;
&lt;br /&gt;
 x=0;                 9 bytes&lt;br /&gt;
 x=0.0;              12 bytes&lt;br /&gt;
&lt;br /&gt;
For vector x:&lt;br /&gt;
&lt;br /&gt;
 x=&amp;lt;0, 0, 0&amp;gt;;        27 bytes&lt;br /&gt;
 x=&amp;lt;0.0, 0.0, 0.0&amp;gt;;  36 bytes&lt;br /&gt;
 x=ZERO_VECTOR;      36 bytes&lt;br /&gt;
&lt;br /&gt;
for list x:&lt;br /&gt;
&lt;br /&gt;
 llGetListLength(x); 40 bytes&lt;br /&gt;
 x!=[];              13 bytes (note: only list LENGTH is compared - actually subtracted. That returns 0 for empty list.)&lt;br /&gt;
 x==[];              13 bytes&lt;br /&gt;
 if(x==[]);          17 bytes&lt;br /&gt;
 if(x!=[]);          17 bytes&lt;br /&gt;
 x!=[&amp;quot;&amp;quot;];            23 bytes (note: only list LENGTH is compared - actually subtracted. That returns -1 for empty list.)&lt;br /&gt;
 x==[&amp;quot;&amp;quot;];            23 bytes (true if x has 1 element)&lt;br /&gt;
 x!=[[]];            23 bytes (list may not contain lists but this is allowed?!?!)&lt;br /&gt;
 x==[[]];            23 bytes&lt;br /&gt;
 if(x==[&amp;quot;&amp;quot;]);        27 bytes&lt;br /&gt;
 x!=[1];             28 bytes (true if x has 1 element)&lt;br /&gt;
 if(x==[&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;]);  47 bytes&lt;br /&gt;
 if(x!=[&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;]);  47 bytes&lt;br /&gt;
 if(llGetListLengt(x)==1);  53 bytes&lt;br /&gt;
 if(llGetListLengt(x)!=1);  56 bytes&lt;br /&gt;
 if(x==[&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;]);      57 bytes&lt;br /&gt;
&lt;br /&gt;
Some of those may be worth being included in [[LSL Hacks]], which I&#039;d say is the place for code size optimization. Your list results are run time size related and thus worth being included as an update to [[LSL Script Memory]]. --[[User:Pedro Oval|Pedro Oval]] 09:35, 29 December 2012 (PST)&lt;br /&gt;
&lt;br /&gt;
:Wow some of those are really interesting. I would venture the reason float zero is so expensive is how it&#039;s being encoded (there are several ways to encode floats in IL). They haven&#039;t optimized the zero case. I&#039;m very surprised that x * 2 is less than x &amp;lt;&amp;lt; 2. -- &#039;&#039;&#039;[[User:Strife_Onizuka|Strife]]&#039;&#039;&#039; &amp;lt;sup&amp;gt;&amp;lt;small&amp;gt;([[User talk:Strife_Onizuka|talk]]|[[Special:Contributions/Strife_Onizuka|contribs]])&amp;lt;/small&amp;gt;&amp;lt;/sup&amp;gt; 13:28, 29 December 2012 (PST)&lt;br /&gt;
::Well try these for size ...   x+x; 4 bytes,  x=x+x; 6 bytes,  x=x^x; 6 bytes. Food for thought!  [[User:Omei Qunhua|Omei Qunhua]] 06:05, 30 December 2012 (PST)&lt;br /&gt;
:::VERY interesting, thank you!!! --[[User:Pedro Oval|Pedro Oval]] 12:11, 30 December 2012 (PST)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Some more interesting results (all for LOCAL variables) [WITHDRAWN - SEE BELOW]&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;strike&amp;gt;integer a;           49 bytes&lt;br /&gt;
 integer a=0;         53 bytes&lt;br /&gt;
 string a=&amp;quot;&amp;quot;;         53? 55? bytes (I&#039;m unsure if there&#039;s a preexisting instance of &amp;quot;&amp;quot; or not - my measuring method can&#039;t tell)&lt;br /&gt;
 string a;            53? 55? bytes&lt;br /&gt;
 string a=&amp;quot;a&amp;quot;;        53 bytes plus 2*(num characters+1) per each different string (equal strings are referenced just once)&lt;br /&gt;
 float a=0;           54 bytes&lt;br /&gt;
 list a;              55 bytes&lt;br /&gt;
 list a=[];           55 bytes&lt;br /&gt;
 float a;             57 bytes&lt;br /&gt;
 float a=0.0;         57 bytes&lt;br /&gt;
 key a=&amp;quot;&amp;quot;;            60? 61? 62? bytes (same problem as string)&lt;br /&gt;
 key a=&amp;quot;string&amp;quot;;      60? bytes + 2*(num_characters+1) per each different string&amp;lt;/strike&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Braces don&#039;t seem to add anything: &amp;lt;code&amp;gt;{integer a;}&amp;lt;/code&amp;gt; occupies the same size as &amp;lt;code&amp;gt;integer a;&amp;lt;/code&amp;gt; and so on. Since the string case is complex, let me put an example. &amp;lt;code&amp;gt;string a=&amp;quot;aaa&amp;quot;; string b=&amp;quot;aaa&amp;quot;;&amp;lt;/code&amp;gt; will use 53+53+2*(3+1)=114 bytes, because the string is the same in both cases and it&#039;s reused, but &amp;lt;code&amp;gt;string a=&amp;quot;aaa&amp;quot;; string b=&amp;quot;bbb&amp;quot;;&amp;lt;/code&amp;gt; will use 53+53+2*(3+1)+2*(3+1)=122 bytes because the strings are different.&lt;br /&gt;
&lt;br /&gt;
I&#039;m getting inconsistent results with the keys. Something else seems to be going on. I get 61 bytes sometimes and 60 others. Wonder if there&#039;s a byte alignment problem. If so, that could make some of the previous measurements incorrect, even if they looked consistent. --[[User:Pedro Oval|Pedro Oval]] 13:40, 29 December 2012 (PST)&lt;br /&gt;
&lt;br /&gt;
:Using the measurement method you suggested (or perhaps a variation), I have determined that an empty string uses 6 bytes always, while a 1 or 2 character string uses 10 bytes for the first appearance and 6 for the rest, and a 3 or 4 character string uses 14 bytes for the first appearance and 6 for the rest. Further testing suggests that string constants in code are allocated 4 bytes at a time.&lt;br /&gt;
&lt;br /&gt;
:The previous results for local variable declarations can&#039;t be considered reliable. With this measurement method I get many variations for keys and strings: 132 bytes for the first appearance of &amp;lt;code&amp;gt;key x=&amp;quot;&amp;quot;&amp;lt;/code&amp;gt;, 56 for the second, 66 for the third... and also crazy for strings. I just withdraw the results. With integer I also got inconsistencies.: 43 bytes when measured with this method. What seems clear is that there&#039;s one implicit assumption wrong and I don&#039;t know which one or why. I guess a better understanding of CIL would help me interpret those results. Not sure if I&#039;m willing to dive into that though. --[[User:Pedro Oval|Pedro Oval]] 14:44, 1 January 2013 (PST)&lt;br /&gt;
&lt;br /&gt;
== llGetSubString ==&lt;br /&gt;
&lt;br /&gt;
I obviously did not review that edit! wtf were they thinking? Thank you. -- &#039;&#039;&#039;[[User:Strife_Onizuka|Strife]]&#039;&#039;&#039; &amp;lt;sup&amp;gt;&amp;lt;small&amp;gt;([[User talk:Strife_Onizuka|talk]]|[[Special:Contributions/Strife_Onizuka|contribs]])&amp;lt;/small&amp;gt;&amp;lt;/sup&amp;gt; 23:08, 3 January 2013 (PST)&lt;br /&gt;
&lt;br /&gt;
== UTF-8 ==&lt;br /&gt;
&lt;br /&gt;
UTF-8 characters can be more than 2 bytes, by the original standard, used by LSO, they can by 5 bytes. UTF-8 supported by Mono supports up to 4 bytes per character. -- &#039;&#039;&#039;[[User:Strife_Onizuka|Strife]]&#039;&#039;&#039; &amp;lt;sup&amp;gt;&amp;lt;small&amp;gt;([[User talk:Strife_Onizuka|talk]]|[[Special:Contributions/Strife_Onizuka|contribs]])&amp;lt;/small&amp;gt;&amp;lt;/sup&amp;gt; 20:31, 14 January 2013 (PST)&lt;br /&gt;
&lt;br /&gt;
::Yes I know. That&#039;s why I quoted an example of a 2-byte UTF-8 when giving 512 as a UTF-8 limit. I didn&#039;t want to go into a full explanation on every page. Just wanted to give some clue that 1024 bytes doesn&#039;t necessarily give 1024 characters (and an opportunity to correct the 1023 to 1024). Maybe a link to a page on UTF-8 would be appropriate. But I think the current UTF-8 page needs overhauling. It starts by saying &amp;quot;SL uses UTF-8 for storing and transmitting strings&amp;quot;  which I think is no longer always true (i.e. storage in Mono) then the UTF-8 page gets hijacked with complex code examples concerning Unicode which maybe appeal to 0.1% of Wiki&#039;s users.  We need to sort the basics out on SO MANY Wiki pages, before leaping into hyperspace. And that&#039;s been the impetus behind my sudden burst of editing activity over 5 weeks. (IMHO, LOL) [[User:Omei Qunhua|Omei Qunhua]] 00:26, 15 January 2013 (PST)&lt;br /&gt;
&lt;br /&gt;
== Wiki editing ==&lt;br /&gt;
&lt;br /&gt;
I&#039;m not sure why you feel the need to insult other editors with every other edit summary but I wish you all the best and merry christmas. Hopefully you can find some time to loosen up during the holidays. Best regards -- [[User:Kireji Haiku|Kireji Haiku]] 14:29, 19 December 2013 (PST)&lt;br /&gt;
&lt;br /&gt;
::I just stated a fact. If you find that insulting, well ....  &lt;br /&gt;
&lt;br /&gt;
::I don&#039;t understand why you are intent on driving the Wiki further and further from reality. You&#039;re just making it an academic non-practical source of your own personal preferences, at odds with what 99.9% of coders do and I&#039;m sure will continue to do. [[User:Omei Qunhua|Omei Qunhua]] 16:00, 21 December 2013 (PST)&lt;br /&gt;
&lt;br /&gt;
I personally don&#039;t care either way with PUBLIC_CHANNEL and I didn&#039;t view the edit comments as insulting (the field encourages brevity, which can be mistaken as insult). I don&#039;t use it myself and I doubt many people do but many people don&#039;t use &amp;lt;code&amp;gt;~llSubStringIndex()&amp;lt;/code&amp;gt;, they use &amp;lt;code&amp;gt;llSubStringIndex() != -1&amp;lt;/code&amp;gt; or the new fangled &amp;lt;code&amp;gt;llSubStringIndex() != [[ERR_GENERIC]]&amp;lt;/code&amp;gt;. Just because it&#039;s &amp;quot;ugly&amp;quot; doesn&#039;t make it wrong. So that we don&#039;t fight over these trivialities we should take the viewpoint that if they are already existing in articles we should not change them unless we are replacing the entire line. I&#039;m ok with grammar and punctuation getting corrected but do keep in mind that grammar and punctuation are artificial rules created by man, and these rules can be redefined at anytime as well. What is grammatically incorrect today may be grammatically correct tomorrow, so grammatical correctness isn&#039;t the most important thing. There are however about 600 unloved articles in {{LSLGC|Needs Example}} (I&#039;m amazed it&#039;s only 600 btw). So if you get bored and feel the desire to correct something minor, consider writing an example and spread a little joy to the unloved. -- &#039;&#039;&#039;[[User:Strife_Onizuka|Strife]]&#039;&#039;&#039; &amp;lt;sup&amp;gt;&amp;lt;small&amp;gt;([[User talk:Strife_Onizuka|talk]]|[[Special:Contributions/Strife_Onizuka|contribs]])&amp;lt;/small&amp;gt;&amp;lt;/sup&amp;gt; 15:15, 19 December 2013 (PST)&lt;br /&gt;
&lt;br /&gt;
::I feel passionately that PUBLIC_CHANNEL should NOT be promoted in the Wiki - and this is NOT because that is my own personal preference, but it is the established preference of thousands of scripters as demonstrated in millions of scripts in-world and on script libraries. Kireji I am sure feels passionately that PUBLIC_CHANNEL should be promoted - but I venture to suggest that that IS due to his own individual and personal preference. I&#039;ve noticed ERR_GENERIC creeping in, and that again is at odds with practically all actual scripts, although I&#039;m less unhappy about it, in some situations. Sure I love mnemonics like CHANGED_REGION_START as most scripters would. As I say, the Wiki is in danger of becoming an academic tome, divorced from reality. :(  Also, as pointed out before, we tend to have to explain that PUBLIC_CHANNEL means 0, whereas for example one would need to explain that 0x400 means CHANGED_REGION_START. That difference highlights the problem in a nutshell. Oh, and following on from your comments, Strife, the same logic dictates that where llSay(0, ....  etc. exist in Wiki articles, they shouldn&#039;t be routinely changed to PUBLIC_CHANNEL. [[User:Omei Qunhua|Omei Qunhua]] 16:04, 19 December 2013 (PST)&lt;br /&gt;
&lt;br /&gt;
:::Yes, the logic does, my condemnation is not aimed at any one party. But we have bigger problems. Dryness is one of those problems. The small number of editors is another. I&#039;d say that Examples should be a top priority but I&#039;ve never been able to make it one of mine. I don&#039;t have solutions to these problems. At some point we should have a meeting. My current projects include: parameter/subtype categories and haiku. -- &#039;&#039;&#039;[[User:Strife_Onizuka|Strife]]&#039;&#039;&#039; &amp;lt;sup&amp;gt;&amp;lt;small&amp;gt;([[User talk:Strife_Onizuka|talk]]|[[Special:Contributions/Strife_Onizuka|contribs]])&amp;lt;/small&amp;gt;&amp;lt;/sup&amp;gt; 21:04, 19 December 2013 (PST)&lt;br /&gt;
&lt;br /&gt;
::::&amp;quot;unless we are replacing the whole line&amp;quot; - and please, only replace that line if it&#039;s faulty, not just to propagate a personal style. Unfortunately that propagation has been going on for 15 months without anyone commenting until I started squirming a bit and seemed to become the target for criticism (the current condemnatory remarks appear in my own talk page). You say you have no preference, Strife, but your consistent use of llSay(0,  in your own examples  does suggest a preference. There are so many other unnecessary edits that have taken place over the same period, where there has been no corrective aspect.  (float) FALSE is horrid, as are  inserted lines of // { or  // } ... or just adding the //. Awful. By all means, let&#039;s use our favoured styles on our own pages, or in examples that we originate ourselves. Enough. I&#039;ll go look at your list of the 600 unloved ... LOL. (But perhaps all those corrupted examples should be returned to their pristine states ^^). [[User:Omei Qunhua|Omei Qunhua]] 09:19, 20 December 2013 (PST)&lt;br /&gt;
&lt;br /&gt;
:::::Yeah the (float)FALSE thing... I have trouble seeing a good reason to use it. Oh I can understand that it might uses less bytecode but for the love of monkeys put it in the optimization article. That said, I am guilty of using (integer)&amp;quot;&amp;quot; in the past in code that was highly optimized (for LSO, yes I really did need every byte). Not really keen on whitespace changes either but I don&#039;t have a strong feeling. I wonder if we should considering protecting the diversity of programming styles in the articles. This way it gives the wiki a feel that real people actually wrote the examples and that they weren&#039;t extruded from some hideous creature&#039;s bum. It will be dangerous as it will be hard to define what is good diversity and what is bad content but it should be interesting. -- &#039;&#039;&#039;[[User:Strife_Onizuka|Strife]]&#039;&#039;&#039; &amp;lt;sup&amp;gt;&amp;lt;small&amp;gt;([[User talk:Strife_Onizuka|talk]]|[[Special:Contributions/Strife_Onizuka|contribs]])&amp;lt;/small&amp;gt;&amp;lt;/sup&amp;gt; 11:30, 20 December 2013 (PST)&lt;br /&gt;
&lt;br /&gt;
::&amp;quot;What is grammatically incorrect today may be grammatically correct tomorrow&amp;quot; - LOL. So that&#039;s an excuse to write appallingly? No thanks!  But I do think there could be a lot of merit in preserving the programming styles exhibited by example originators, as you suggest. [[User:Omei Qunhua|Omei Qunhua]] 16:00, 21 December 2013 (PST)&lt;br /&gt;
&lt;br /&gt;
:::Fixed a bug in Constants, fewer articles should be showing up now in {{LSLGC|Needs Example}}. {{LSLGC|FixMe}} if you are wondering is where all the broken articles go. Most are constants in need of descriptions (others are constants in need of syntax examples like you would see on the like [[PRIM_NAME]]). -- &#039;&#039;&#039;[[User:Strife_Onizuka|Strife]]&#039;&#039;&#039; &amp;lt;sup&amp;gt;&amp;lt;small&amp;gt;([[User talk:Strife_Onizuka|talk]]|[[Special:Contributions/Strife_Onizuka|contribs]])&amp;lt;/small&amp;gt;&amp;lt;/sup&amp;gt; 20:28, 23 December 2013 (PST)&lt;br /&gt;
:::P.S. Yeah it&#039;s a slippery slope and I don&#039;t buy it entirely either.&lt;br /&gt;
&lt;br /&gt;
Further to suggesting that editors try to stick with the coding style used by an article originator, I was going to say that first of all the original writers should abide by an overall style guide agreed for the Wiki, such as [[https://wiki.secondlife.com/w/index.php?title=LSL_Style_Guide&amp;amp;oldid=1181778 StyleGuide]]. Unfortunately I see that that page has been &#039;hijacked&#039; to promote one person&#039;s eccentric views. Proposed changes to the main style guide should FIRST be discussed in the corresponding discussion page. We can&#039;t have one person unilaterally declaring a style without discussion. So ... first we seriously need a &#039;committee&#039; approach to defining an overall style guide. It&#039;s been said elsewhere that contributors are not going to want to rewrite their programs to comply with a Wiki style different to their usual practice. Personally I don&#039;t find that onerous, and I favour a more rigorous insistence on a unified style throughout. [[User:Omei Qunhua|Omei Qunhua]] 04:04, 24 December 2013 (PST)&lt;br /&gt;
&lt;br /&gt;
: I do not know how I overlooked this but It appears I forgot to codify any syntax guidelines into the [[LSL Portal Guidelines]]. For now I&#039;ll just shove something onto [[LSL_Style_Guide#LSL_Portal_Style]]. Thoughts? -- &#039;&#039;&#039;[[User:Strife_Onizuka|Strife]]&#039;&#039;&#039; &amp;lt;sup&amp;gt;&amp;lt;small&amp;gt;([[User talk:Strife_Onizuka|talk]]|[[Special:Contributions/Strife_Onizuka|contribs]])&amp;lt;/small&amp;gt;&amp;lt;/sup&amp;gt; 02:19, 25 December 2013 (PST)&lt;br /&gt;
&lt;br /&gt;
I started tackling some of the &amp;quot;need examples&amp;quot; pages, but quickly felt that adding an example for each individual mnemonic constant was not necessary. Indeed having a separate page for each seems seriously OTT. [[User:Omei Qunhua|Omei Qunhua]] 06:01, 27 December 2013 (PST)&lt;br /&gt;
&lt;br /&gt;
:Do what you think is best, if it doesn&#039;t really need an example, skip it. I will not deny it was OCD to mandate that every constant have an article, nor that it might be a tiny bit excessive but I will argue with it being Over The Top.&lt;br /&gt;
&lt;br /&gt;
:For some constants there is no benefit to having individual articles. If we were to deny all constant articles, we would end up with all function articles being at best [[llParticleSystem]] and at worst double what [[llSetPrimitiveParams]] (because llSetPrimitiveParams would become even worse). In the beginning I pushed for articles for constants because on the LSL Wiki it was hard to find information about constants. Not only was the information buried in function articles (which had no unifying layout so it could by literally be anywhere in the article), if the constant was used by multiple overlapping functions the information might be out of sync. It made maintaining the content very annoying. Personally I&#039;d rather fill the wiki with stubs and let people flesh them out into articles if they want, than leave them digging and wishing for more. While we could come up with rules o how to decide which constants get articles and which don&#039;t, I don&#039;t think we gain anything by doing so ([[llParticleSystem]] is not one of my articles and I view it as grandfathered).&lt;br /&gt;
&lt;br /&gt;
:Trying to shoe horn information about constants into articles has always been hard and it was especially hard on the LSL Wiki. You might want to add a single sentence of information but to do so might require refactoring a significant amount of the article. Here you can just post the sentence to the dedicated article and not have to worry so much about squeezing it in. -- &#039;&#039;&#039;[[User:Strife_Onizuka|Strife]]&#039;&#039;&#039; &amp;lt;sup&amp;gt;&amp;lt;small&amp;gt;([[User talk:Strife_Onizuka|talk]]|[[Special:Contributions/Strife_Onizuka|contribs]])&amp;lt;/small&amp;gt;&amp;lt;/sup&amp;gt; 22:08, 27 December 2013 (PST)&lt;br /&gt;
&lt;br /&gt;
:Again, not sure why you feel the need to undo wiki contributions. Replacing channel 0 with [[PUBLIC_CHANNEL]] does not change the code style. If you strongly believe such edits shouldn&#039;t be done by others, same would go for your edits ... which go the other way around. The reason using constants is to enhance readability, making it easier for beginners. It&#039;s a lot easier to do a find and replace to get rid of [[PUBLIC_CHANNEL]] and to save byte-code than to look up what channel 0 is. Just my two cents. -- [[User:Kireji Haiku|Kireji Haiku]] 06:54, 31 December 2013 (PST)&lt;br /&gt;
&lt;br /&gt;
::Kireji, YOU are the one undoing Wiki contributions. I am merely agreeing that the original style (I use the word loosely) chosen by contributors should be preserved unless there is a very good reason (basically an error) that needs correction. Your use of PUBLIC_CHANNEL is nothing more than a personal fad, and the Wiki is not the place for such indulgences. [[User:Omei Qunhua|Omei Qunhua]] 07:28, 31 December 2013 (PST)&lt;br /&gt;
&lt;br /&gt;
:::I understand the point that in certain usage cases where using values instead of constant would have an advantage like when there&#039;s an [[integer]] [[Bit_field]]. However constants were created for reasons. And if you&#039;d know nothing about LSL (but you&#039;ve experienced Second Life and how scripts work) and had &amp;lt;code&amp;gt;llSay(PUBLIC_CHANNEL, &amp;quot;Hello!&amp;quot;);&amp;lt;/code&amp;gt; versus &amp;lt;code&amp;gt;llSay(0, &amp;quot;Hello!&amp;quot;);&amp;lt;/code&amp;gt;, I guess we can both agree that the first is easier to understand effect-wise. Now is there any non-personal arguement you&#039;d want to bring up against this? Or can we move on and keep the use of [[PUBLIC_CHANNEL]] for the simpler example scripts? -- &#039;&#039;&#039;[[User:Kireji_Haiku|Kireji Haiku]]&#039;&#039;&#039; &amp;lt;sup&amp;gt;&amp;lt;small&amp;gt;([[User talk:Kireji_Haiku|talk]]|[[Special:Contributions/Kireji_Haiku|contribs]])&amp;lt;/small&amp;gt;&amp;lt;/sup&amp;gt; 09:53, 2 May 2014 (PDT)&lt;br /&gt;
&lt;br /&gt;
== PUBLIC_CHANNEL vs Zero ==&lt;br /&gt;
Seeing as this topic hasn&#039;t settled down, it&#039;s time for the larger community to choose. I view their decision (even if it&#039;s Pie) as binding.&lt;br /&gt;
http://www.sluniverse.com/php/vb/scripting/91061-wiki-public_channel-vs-zero.html&lt;br /&gt;
-- &#039;&#039;&#039;[[User:Strife_Onizuka|Strife]]&#039;&#039;&#039; &amp;lt;sup&amp;gt;&amp;lt;small&amp;gt;([[User talk:Strife_Onizuka|talk]]|[[Special:Contributions/Strife_Onizuka|contribs]])&amp;lt;/small&amp;gt;&amp;lt;/sup&amp;gt; 00:15, 1 January 2014 (PST)&lt;br /&gt;
&lt;br /&gt;
:It isn&#039;t just about PUBLIC_CHANNEL. It is about one individual tampering with hundreds of perfectly valid existing scripts, purely to impose exceptional ideas they originated, regardless of the demonstrated preferences of hundreds of contributors, many of whom are probably no longer here to defend themselves. I thought you and I had agreed, Strife, that edits should not unnecessarily change script examples unless to correct definite errors. So, if I vote in your survey, it will be for zero, but the survey misses the important point. The survey should be &amp;quot;Should one individual be allowed to edit script examples purely to impose personal preferences, and not in order to fix problems?&amp;quot; A Wiki is supposed to be a collaborative project. When one person rampages through it, insisting on their own views on every conceivable page, it ceases to be collaborative. [[User:Omei Qunhua|Omei Qunhua]] 02:19, 1 January 2014 (PST)&lt;br /&gt;
&lt;br /&gt;
::My goal is to start small and work our way up. If this gets things moving in a positive direction, good. If things degrade, the stage is set for the next act. Look at what Void said, we&#039;ve got the community thinking. -- &#039;&#039;&#039;[[User:Strife_Onizuka|Strife]]&#039;&#039;&#039; &amp;lt;sup&amp;gt;&amp;lt;small&amp;gt;([[User talk:Strife_Onizuka|talk]]|[[Special:Contributions/Strife_Onizuka|contribs]])&amp;lt;/small&amp;gt;&amp;lt;/sup&amp;gt; 23:50, 1 January 2014 (PST)&lt;br /&gt;
&lt;br /&gt;
== llRezAtRoot ==&lt;br /&gt;
&lt;br /&gt;
I think you missed the context, which is &amp;quot;offline building rights&amp;quot;, you can&#039;t be offline and on the land at the same time. -- &#039;&#039;&#039;[[User:Strife_Onizuka|Strife]]&#039;&#039;&#039; &amp;lt;sup&amp;gt;&amp;lt;small&amp;gt;([[User talk:Strife_Onizuka|talk]]|[[Special:Contributions/Strife_Onizuka|contribs]])&amp;lt;/small&amp;gt;&amp;lt;/sup&amp;gt; 01:42, 4 January 2014 (PST)&lt;br /&gt;
&lt;br /&gt;
:hummm. Well then, what is the correct wording for the note that effectively says &amp;quot;To have offline building rights, you need to allow everyone to build&amp;quot; ? And &amp;quot;Be&amp;quot; doesn&#039;t necessarily have to apply to an avatar, it can apply to the script doing the rezzing. No? [[User:Omei Qunhua|Omei Qunhua]] 03:46, 4 January 2014 (PST)&lt;br /&gt;
&lt;br /&gt;
::Ahhh. I see my issue. I focused on the wrong part. It&#039;s still screwed up. I&#039;ll fix it. -- &#039;&#039;&#039;[[User:Strife_Onizuka|Strife]]&#039;&#039;&#039; &amp;lt;sup&amp;gt;&amp;lt;small&amp;gt;([[User talk:Strife_Onizuka|talk]]|[[Special:Contributions/Strife_Onizuka|contribs]])&amp;lt;/small&amp;gt;&amp;lt;/sup&amp;gt; 21:07, 4 January 2014 (PST)&lt;br /&gt;
&lt;br /&gt;
:That does look better. But i still don&#039;t fully understand (excuse me for being a bit thick). Why do I need OFFLINE building rights to run a script with llRezAtRoot?  Only if I&#039;m actually offline surely. Not while I&#039;m scripting and testing while online? [[User:Omei Qunhua|Omei Qunhua]] 08:27, 5 January 2014 (PST)&lt;br /&gt;
&lt;br /&gt;
::I can&#039;t think of a situation where you would have build rights online and not offline but there may be one. There may be a gray goo restriction. -- &#039;&#039;&#039;[[User:Strife_Onizuka|Strife]]&#039;&#039;&#039; &amp;lt;sup&amp;gt;&amp;lt;small&amp;gt;([[User talk:Strife_Onizuka|talk]]|[[Special:Contributions/Strife_Onizuka|contribs]])&amp;lt;/small&amp;gt;&amp;lt;/sup&amp;gt; 11:16, 5 January 2014 (PST)&lt;br /&gt;
&lt;br /&gt;
:Oh dear :(  Then what is the significance of calling it &amp;quot;offline&amp;quot;? I had started to think this related to the observed situation where a script of mine can&#039;t rezz a prim unless I&#039;m online. If there&#039;s no difference between online and offline building rights, then just call it building rights, as it is usually known. No? [[User:Omei Qunhua|Omei Qunhua]] 11:54, 5 January 2014 (PST)&lt;br /&gt;
&lt;br /&gt;
Thank you. Yes, English is not my native language. I know about my ortographic problems, but I don&#039;t know how to activate a corrector or something similar. How do I make errors to be highlighted? Please tell me, that will be a great help.&lt;br /&gt;
&lt;br /&gt;
--[[User:Anaimfinity Resident|Rays of green light. Bright and proud to be a Circassian]] 10:44, 3 February 2014 (PST)&lt;br /&gt;
&lt;br /&gt;
== Memory Module ==&lt;br /&gt;
I&#039;m afraid your characterization of sim and viewer events as &#039;rare&#039; is inaccurate. It happens to thousands on a daily basis. Not to mention, the statement &amp;quot;such an event is likely to be more catastrophic than just the loss of variables would imply, it may not be worth trying guard against it.&amp;quot; is extremely misleading, bad practice, and really amounts to nothing more than an opinion. Script state rollbacks are not catastrophic. They only result in a lack of data.  Data which could be safeguarded against with the techniques described on the page. They certainly aren&#039;t the *only* way such safeguards can be implemented, but they are a valid way. If you think you know a better way, it would be more constructive to make a page about that, instead of vandalizing someone else&#039;s page.&lt;br /&gt;
&lt;br /&gt;
I had many problems with your original statements, but I had enough respect for you that I did not change any of your wording. I only added on balance. I expect the same respect from you. But if you touch it again, Gloves off.&lt;br /&gt;
&lt;br /&gt;
{{Unsigned|Darien Caldwell|2014-02-05 13:30:31 SLT}}&lt;br /&gt;
&lt;br /&gt;
::Please yourself. Care to sign your remarks here? And I certainly have problems with your wild assertions. You cannot possibly say categorically that &amp;quot;Script state rollbacks are not catastrophic.&amp;quot; That&#039;s just ridiculous. &amp;quot;vandalizing someone else&#039;s page.&amp;quot; A trifle over emotive? If you look at the page before I added the &amp;quot;tip&amp;quot; you&#039;ll see that seriously wrong impressions were given, i.e. that globals would always get reset on rezzing / logout-in. That needed addressing.  &amp;quot;It happens to thousands on a daily basis. &amp;quot;  That again sounds rather wild. Care to substantiate that? Fortunately never to me, nor to my clients that they have queried with me. [[User:Omei Qunhua|Omei Qunhua]] 15:54, 5 February 2014 (PST)&lt;br /&gt;
&lt;br /&gt;
== re my script you corrected ==&lt;br /&gt;
&lt;br /&gt;
I use scripts in that user space for teaching purposes.  Thank you for posting the answers to what I expect the students to do to it in  my user space, however I am taking that down so when I teach next week the page is waiting for them to fix it.  Sorry if you misunderstood the use of teaching scripts in personal user space.  [[User:Toady Nakamura|Toady Nakamura]] 14:14, 11 March 2014 (PDT)&lt;br /&gt;
&lt;br /&gt;
::Could you point me to what you mean by &amp;quot;that user space&amp;quot;, Toady? I would be most most surprised if I&#039;ve edited any example within personal user space, as I&#039;ve always taken great care not to do that on the Wiki. Your recent edits don&#039;t seem to be involved in undoing any edit of mine. Thanks. [[User:Omei Qunhua|Omei Qunhua]] 08:30, 12 March 2014 (PDT)&lt;br /&gt;
&lt;br /&gt;
== Checking that a Notecard exists in object inventory  ==&lt;br /&gt;
&lt;br /&gt;
What if the notecard isn&#039;t full perms, will llGetInventoryKey return a non-null value? -- &#039;&#039;&#039;[[User:Strife_Onizuka|Strife]]&#039;&#039;&#039; &amp;lt;sup&amp;gt;&amp;lt;small&amp;gt;([[User talk:Strife_Onizuka|talk]]|[[Special:Contributions/Strife_Onizuka|contribs]])&amp;lt;/small&amp;gt;&amp;lt;/sup&amp;gt; 20:19, 1 May 2014 (PDT)&lt;br /&gt;
&lt;br /&gt;
::Hummm, no, a no-mod NC returns a null key. So what is the best way of guarding against a never-saved nc? [[User:Omei Qunhua|Omei Qunhua]] 02:29, 2 May 2014 (PDT)&lt;br /&gt;
&lt;br /&gt;
:::An asset is not created until a notecard is saved. -- &#039;&#039;&#039;[[User:Kireji_Haiku|Kireji Haiku]]&#039;&#039;&#039; &amp;lt;sup&amp;gt;&amp;lt;small&amp;gt;([[User talk:Kireji_Haiku|talk]]|[[Special:Contributions/Kireji_Haiku|contribs]])&amp;lt;/small&amp;gt;&amp;lt;/sup&amp;gt; 09:53, 2 May 2014 (PDT)&lt;br /&gt;
&lt;br /&gt;
::LOL [[User:Omei Qunhua|Omei Qunhua]] 10:12, 2 May 2014 (PDT)&lt;br /&gt;
&lt;br /&gt;
== ERR_GENERIC ==&lt;br /&gt;
&lt;br /&gt;
Thanks for going through and cleaning that up. It fell off my todo list. -- &#039;&#039;&#039;[[User:Strife_Onizuka|Strife]]&#039;&#039;&#039; &amp;lt;sup&amp;gt;&amp;lt;small&amp;gt;([[User talk:Strife_Onizuka|talk]]|[[Special:Contributions/Strife_Onizuka|contribs]])&amp;lt;/small&amp;gt;&amp;lt;/sup&amp;gt; 17:38, 9 September 2014 (PDT)&lt;br /&gt;
&lt;br /&gt;
:Applying the same kind of logic to channel &amp;lt;code&amp;gt;0&amp;lt;/code&amp;gt; having to be explained as being [[PUBLIC_CHANNEL]] would make sense, too. But of course, you can&#039;t acknowledge that and I&#039;m not going to edit stuff again to fix your rage. Cheers. -- &#039;&#039;&#039;[[User:Kireji_Haiku|Kireji Haiku]]&#039;&#039;&#039; &amp;lt;sup&amp;gt;&amp;lt;small&amp;gt;([[User talk:Kireji_Haiku|talk]]|[[Special:Contributions/Kireji_Haiku|contribs]])&amp;lt;/small&amp;gt;&amp;lt;/sup&amp;gt; 00:32, 10 September 2014 (PDT)&lt;br /&gt;
&lt;br /&gt;
::Thanks Strife, no problem.&lt;/div&gt;</summary>
		<author><name>Omei Qunhua</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlSensorRepeat&amp;diff=1193261</id>
		<title>LlSensorRepeat</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlSensorRepeat&amp;diff=1193261"/>
		<updated>2014-09-10T13:15:06Z</updated>

		<summary type="html">&lt;p&gt;Omei Qunhua: Determining that an agent has not been added to a visitor list is not any kind of error&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function&lt;br /&gt;
|inject-2={{LSL_Function/uuid|id|object=*}}{{LSL Constants/Sensing|type}}&lt;br /&gt;
|inject-3={{Issues/SVC-2409}}{{Issues/SVC-4301}}{{Issues/SVC-6662}}{{Issues/BUG-2366}}&lt;br /&gt;
|func=llSensorRepeat|sort=SensorRepeat&lt;br /&gt;
|func_id=29|func_sleep=0.0|func_energy=10.0&lt;br /&gt;
|p1_type=string|p1_name=name|p1_hover=Object or avatar name|p1_desc=Object or avatar name[[#NameFormat|&amp;lt;span style=&amp;quot;color:red;&amp;quot;&amp;gt;!&amp;lt;/span&amp;gt;]]&lt;br /&gt;
|p2_type=key|p2_name=id&lt;br /&gt;
|p3_type=integer|p3_name=type|p3_desc=mask ({{#var:AGENT_BY_LEGACY_NAME}}, {{#var:AGENT_BY_USERNAME}}, {{#var:ACTIVE}}, {{#var:PASSIVE}}, and/or {{#var:SCRIPTED}})|p3_hover=mask (AGENT_BY_LEGACY_NAME, AGENT_BY_USERNAME, ACTIVE, PASSIVE, and/or SCRIPTED)&lt;br /&gt;
|p4_type=float|p4_name=range|p4_desc=range in meters, {{Interval|gte=0.0|lte=96.0|center=range}}|p4_hover=range in meters, {{Interval/Hover|gte=0.0|lte=96.0|center=range}}&lt;br /&gt;
|p5_type=float|p5_name=arc|p5_desc=the max angle between the local x-axis of the prim and detectable objects, range {{Interval|gte=0.0|lteh=PI|lte={{#var:PI}}|center=arc}}|p5_hover=the max angle between the local x-axis of the prim and detectable objects, range {{Interval/Hover|gte=0.0|lte=PI|center=arc}}&lt;br /&gt;
|p6_type=float|p6_name=rate|p6_desc=How often a [[sensor]]/[[no_sensor]] will be queued.&lt;br /&gt;
|func_footnote=If {{LSLP|name}}, {{LSLP|id}}, and/or {{LSLP|type}} are empty or 0, they are ignored.&amp;lt;br/&amp;gt;If {{LSLP|id}} is an invalid key or [[NULL_KEY]] it is treated as empty.&amp;lt;br id=&amp;quot;NameFormat&amp;quot;/&amp;gt;Depending upon which AGENT* flag is used determines the format requirements for {{LSLP|name}}&lt;br /&gt;
&lt;br /&gt;
See: [http://www.lslwiki.net/lslwiki/wakka.php?wakka=llSensor llSensor] for an excellent explanation of {{LSLP|arc}}.&lt;br /&gt;
|func_desc=Performs a single scan for {{LSLP|name}} and {{LSLP|id}} with {{LSLP|type}} within {{LSLP|range}} meters and {{LSLP|arc}} radians of forward vector and repeats every {{LSLP|rate}} seconds. It does not perform the first scan until {{LSLP|rate}} seconds have passed.&lt;br /&gt;
|return_text&lt;br /&gt;
|spec&lt;br /&gt;
|caveats=*The repeat of the sensor event is adversely affected by [[llGetRegionTimeDilation|time dilation]] (lag).&lt;br /&gt;
*Sensors placed in attachments will use the direction the avatar is facing as their forward vector. In mouselook, this means that it will be wherever the avatar is looking, while out of mouselook, this means whichever way the avatar is pointing. This does not include where the avatar&#039;s head is pointing, or what animation the avatar is doing, just the direction the avatar would move in if you walked forward. This is the case, regardless of where the object is attached. &lt;br /&gt;
* Only the most recent [[sensor]] event is queued. Previous sensor events are replaced.&lt;br /&gt;
* A repeating sensor does not persist across a state change.&lt;br /&gt;
* [[llSensorRepeat]] can occasionally detect outside of it&#039;s specified range every few cycles when used near sim borders. [[llSensor]] in a [[timer]] does not.&lt;br /&gt;
|examples=&lt;br /&gt;
&amp;lt;lsl&amp;gt;// Written by Steamy Latte.&lt;br /&gt;
// Scans every 30 seconds for visitors within 10 meters.&lt;br /&gt;
// Reports new visitors to object owner when she is in range.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
string AllAgents;&lt;br /&gt;
string OwnerName;&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        // arc=PI is a sphere, you could look more narrowly in the direction object is facing with PI/2, PI/4 etc.&lt;br /&gt;
        // don&#039;t repeat this too often to avoid lag.&lt;br /&gt;
        llSensorRepeat(&amp;quot;&amp;quot;, &amp;quot;&amp;quot;, AGENT_BY_LEGACY_NAME, 10.0, PI, 30.0);&lt;br /&gt;
    }&lt;br /&gt;
    sensor(integer num_detected)&lt;br /&gt;
    {&lt;br /&gt;
        string thisAgent = &amp;quot;&amp;quot;;&lt;br /&gt;
        integer agentNum;&lt;br /&gt;
        for (agentNum=0; agentNum&amp;lt;num_detected; agentNum++)&lt;br /&gt;
        {&lt;br /&gt;
            key thisKey = llDetectedKey(agentNum);&lt;br /&gt;
            string thisAgent = llDetectedName(agentNum);&lt;br /&gt;
            if (thisKey == llGetOwner())&lt;br /&gt;
            {&lt;br /&gt;
                if (AllAgents != &amp;quot;&amp;quot;)&lt;br /&gt;
                {&lt;br /&gt;
                    llOwnerSay(&amp;quot;We&#039;ve had the following visitors:&amp;quot; + AllAgents);&lt;br /&gt;
                    AllAgents = &amp;quot;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            else if (llSubStringIndex(AllAgents+&amp;quot;\n&amp;quot;, &amp;quot;\n&amp;quot;+thisAgent+&amp;quot;\n&amp;quot;) &amp;lt; 0)&lt;br /&gt;
            {&lt;br /&gt;
                AllAgents = AllAgents + &amp;quot;\n&amp;quot; + thisAgent;&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;
// Written by Evans Love.&lt;br /&gt;
// (Limited to most recent 200 names by Void Singer to prevent eventual Stack/Heap Collision + clean up)&lt;br /&gt;
// Continuously scans for visitors within 10 meters and reports new visitors to object owner.&lt;br /&gt;
//-------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
integer RESPONSE_CHANNEL = -100;&lt;br /&gt;
float   SCAN_RANGE       = 10.0;&lt;br /&gt;
float   SCAN_INTERVAL    = 0.1;&lt;br /&gt;
list    VISITOR_LIST;&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSensorRepeat(&amp;quot;&amp;quot;, NULL_KEY, AGENT_BY_LEGACY_NAME, SCAN_RANGE, PI, SCAN_INTERVAL);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    sensor(integer number_detected)&lt;br /&gt;
    {&lt;br /&gt;
        integer agent_number;&lt;br /&gt;
&lt;br /&gt;
//      iterate through all detected agents&lt;br /&gt;
        for (; agent_number &amp;lt; number_detected; agent_number++)&lt;br /&gt;
        {&lt;br /&gt;
            string  this_agent_name = llDetectedName(agent_number);&lt;br /&gt;
            key     this_agent_key  = llDetectedKey(agent_number);&lt;br /&gt;
            integer index           = llListFindList(VISITOR_LIST, [this_agent_name]);&lt;br /&gt;
&lt;br /&gt;
//          if the agent is not found on the list&lt;br /&gt;
            if (index == -1)&lt;br /&gt;
            {&lt;br /&gt;
//              add her/him and make the list hold the last 200 visitors&lt;br /&gt;
                VISITOR_LIST = [this_agent_name] + llList2List(VISITOR_LIST, 0, 198);&lt;br /&gt;
&lt;br /&gt;
                llDialog(this_agent_key, &amp;quot;Welcome!&amp;quot;, [&amp;quot;Ok&amp;quot;], RESPONSE_CHANNEL);&lt;br /&gt;
&lt;br /&gt;
                llOwnerSay(this_agent_name);&lt;br /&gt;
            }&lt;br /&gt;
//          else agent is already on the list&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=&lt;br /&gt;
{{LSL DefineRow||[[llSensor]]| Runs a sensor once}}&lt;br /&gt;
{{LSL DefineRow||[[llSensorRemove]]| Stops the llSensorRepeat timer}}&lt;br /&gt;
{{LSL DefineRow||[[llOverMyLand]]| What happens over owners land}}&lt;br /&gt;
|also_events=&lt;br /&gt;
{{LSL DefineRow||[[sensor]]|Triggered when a sensor detects something}}&lt;br /&gt;
{{LSL DefineRow||[[no_sensor]]|Triggered when a sensor detects nothing}}&lt;br /&gt;
|also_articles&lt;br /&gt;
|notes=&lt;br /&gt;
{{LSL Tip|You might want to use [[llGetAgentList]] instead of using sensors to get a list of all avatars within the same parcel or region.}}&lt;br /&gt;
|cat1=Sensor&lt;br /&gt;
|cat2=Detected&lt;br /&gt;
|cat3=Username/As A Parameter&lt;br /&gt;
|cat4=Legacy Name/As A Parameter&lt;br /&gt;
|haiku={{Haiku|Binoculars raised,|All eyes scan the horizon.|Ever vigilant.}}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Omei Qunhua</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Category:LSL_Key&amp;diff=1193258</id>
		<title>Category:LSL Key</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Category:LSL_Key&amp;diff=1193258"/>
		<updated>2014-09-09T21:26:49Z</updated>

		<summary type="html">&lt;p&gt;Omei Qunhua: -1 meaning NOT FOUND is not a generic error. Having to explain that ERR_GENERIC has the value -1 demonstrates the futility of its use.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header|ml=*}}{{LSLC|}}{{LSLC|Types}}&lt;br /&gt;
&lt;br /&gt;
== Intro: ==&lt;br /&gt;
&lt;br /&gt;
A key is a &#039;&#039;&#039;universal unique identifier&#039;&#039;&#039; in Second Life for anything mostly, be it a [[prim]], [[avatar]], [[:Category:LSL_Texture|texture]], etc.&lt;br /&gt;
&lt;br /&gt;
You may see key referred to as [[UUID]], UID, &amp;quot;Asset UUID&amp;quot;, or &amp;quot;asset-ID&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The key itself is formed of {{Wikipedia|Hexidecimal|hexadecimal}} characters &amp;lt;code&amp;gt;[0-9a-f]&amp;lt;/code&amp;gt; and each section of the key is broken up by dashes (for a total amount of 36 characters).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
    key whatever = &amp;quot;01234567-89ab-cdef-0123-456789abcdef&amp;quot;;&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Some keys&#039;&#039;&#039; in Second Life are a [http://en.wikipedia.org/wiki/UUID#Version_4_.28random.29 UUID-4] as defined in {{RFC|4122|target=section-4.1.3}}.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
    key uuid = &amp;quot;xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
//  where:&lt;br /&gt;
//      4 is 4&lt;br /&gt;
//      x is [0-9a-f]&lt;br /&gt;
//      y is [8-9a-b]&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Receiving keys: ==&lt;br /&gt;
&lt;br /&gt;
There are several ways to acquire the key of something:&lt;br /&gt;
&lt;br /&gt;
# Having someone supply it to you;&lt;br /&gt;
# Using a built-in [[LSL_Portal|LSL]] [[:Category:LSL_Functions|function]] such as [[llGetKey]], [[llGetLinkKey]] etc.&lt;br /&gt;
# In your inventory, right-clicking over something and choosing &amp;lt;code&amp;gt;Copy Asset UUID&amp;lt;/code&amp;gt;. Note this will only work on items that you have full permissions to.&lt;br /&gt;
&lt;br /&gt;
== Generating keys: ==&lt;br /&gt;
&lt;br /&gt;
Built-in [[LSL_Portal|LSL]] [[:Category:LSL_Functions|functions]]:&lt;br /&gt;
&lt;br /&gt;
{|{{Prettytable}}&lt;br /&gt;
|+&lt;br /&gt;
|-{{Hl2}}&lt;br /&gt;
!function&lt;br /&gt;
!purpose&lt;br /&gt;
|-&lt;br /&gt;
|| [[llGenerateKey]] || Generates a key using [http://en.wikipedia.org/wiki/UUID#Version_5_.28SHA-1_hash.29 Version 5 (SHA-1 hash)] [[UUID]] generation to create a unique key.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
User-defined functions:&lt;br /&gt;
{|{{Prettytable}}&lt;br /&gt;
|+&lt;br /&gt;
|-{{Hl2}}&lt;br /&gt;
!function&lt;br /&gt;
!purpose&lt;br /&gt;
|-&lt;br /&gt;
|| [[GenerateKey]] || Generates an MD5-based (version 3) type UUID. Useful for identifying link-messages and for other purposes.&lt;br /&gt;
|-&lt;br /&gt;
|| [[GenUUID]] || Generates a UUID based on PHP com_create_guid.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Converting Keys: ==&lt;br /&gt;
&lt;br /&gt;
When a key is supplied to you as a text [[string]], you convert it to the key data-type like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;key whatever = (key)&amp;quot;01234567-89ab-cdef-0123-456789abcdef&amp;quot;;&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Implicit conversion will happen automatically when supplying a string where a key is required.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;key uuid = &amp;quot;01234567-89ab-cdef-0123-456789abcdef&amp;quot;;&lt;br /&gt;
llKey2Name(&amp;quot;01234567-89ab-cdef-0123-456789abcdef&amp;quot;);&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
However there is no implicit conversion with [[llListFindList]]. [[llListFindList]] requires not only the values to match but also the types. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;llListFindList([&amp;quot;01234567-89ab-cdef-0123-456789abcdef&amp;quot;], [(key)&amp;quot;01234567-89ab-cdef-0123-456789abcdef&amp;quot;]) == -1;&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Displaying avatar or group information: ==&lt;br /&gt;
&lt;br /&gt;
If you know an avatar&#039;s key, you can display the avatar&#039;s name in the viewer window and chat history by using the following special URL:&lt;br /&gt;
&amp;lt;lsl&amp;gt;llOwnerSay(&amp;quot;secondlife:///app/agent/&amp;quot; + (string)owner_key + &amp;quot;/about&amp;quot;);&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This displays both [[Display names|display name]] and [[Usernames|username]] as a clickable link that brings up an avatar profile window when clicked.  It is easier than using [[llRequestAgentData]] or [[llRequestUsername]] or [[llRequestDisplayName]], since there is no need to use a [[dataserver]] event.&lt;br /&gt;
&lt;br /&gt;
If you know a group key (as a result of calling &amp;lt;code&amp;gt;[[llGetObjectDetails]]([[key]] id, &amp;lt;nowiki&amp;gt;[&amp;lt;/nowiki&amp;gt;[[OBJECT_GROUP]]&amp;lt;nowiki&amp;gt;]&amp;lt;/nowiki&amp;gt;)&amp;lt;/code&amp;gt;, or calling &amp;lt;code&amp;gt;[[llGetParcelDetails]]([[vector]] pos, &amp;lt;nowiki&amp;gt;[&amp;lt;/nowiki&amp;gt;[[PARCEL_DETAILS_GROUP]]&amp;lt;nowiki&amp;gt;]&amp;lt;/nowiki&amp;gt;)&amp;lt;/code&amp;gt;), you can display the group&#039;s name with the following special URL:&lt;br /&gt;
&amp;lt;lsl&amp;gt;llOwnerSay(&amp;quot;secondlife:///app/group/&amp;quot; + (string)group_key + &amp;quot;/about&amp;quot;);&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This displays the group name as a clickable link that brings up a group profile window when clicked.  This is especially useful since there is no other way to do this; there is no LSL function to print out a group&#039;s name.&lt;br /&gt;
&lt;br /&gt;
Finally, if you know a [[Land#Parcel|parcel]] key (as a result of calling &amp;lt;code&amp;gt;[[llGetParcelDetails]]([[vector]] pos, &amp;lt;nowiki&amp;gt;[&amp;lt;/nowiki&amp;gt;[[PARCEL_DETAILS_ID]]&amp;lt;nowiki&amp;gt;]&amp;lt;/nowiki&amp;gt;)&amp;lt;/code&amp;gt;), you can create a clickable link that brings up a place profile window when clicked, using the following special URL:&lt;br /&gt;
&amp;lt;lsl&amp;gt;llOwnerSay(&amp;quot;secondlife:///app/parcel/&amp;quot; + (string)parcel_key + &amp;quot;/about&amp;quot;);&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Testing for a valid key: ==&lt;br /&gt;
&lt;br /&gt;
To test for a valid key, just do this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;if(uuid){&lt;br /&gt;
     //do something&lt;br /&gt;
}&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;if(uuid)&amp;lt;/code&amp;gt; will only return true if it is supplied a key that is both (A) valid, and (B) NOT a [[NULL_KEY]].&lt;br /&gt;
&lt;br /&gt;
Tip! In techy talk, this method is called &amp;quot;passing it as the parameter for a {{LSLGC|Conditional|conditional}}&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Note! It is important for the above example that &amp;lt;code&amp;gt;uuid&amp;lt;/code&amp;gt; be defined as a key. It can of course be typecast to be a key as well: &amp;lt;code&amp;gt;if((key)uuid)&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Here is an example of how to build a function around this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
// 2:         valid key, not NULL_KEY&lt;br /&gt;
// 1 (TRUE):  NULL_KEY&lt;br /&gt;
// 0 (FALSE): not a key&lt;br /&gt;
&lt;br /&gt;
integer isKey(key in)&lt;br /&gt;
{&lt;br /&gt;
    if (in)&lt;br /&gt;
        return 2;&lt;br /&gt;
    return (in == NULL_KEY);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Caveats: ==&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;lsl&amp;gt;if (uuid)&amp;lt;/lsl&amp;gt; is a special case. Keys cannot be converted to [[Integer|integers]], so logical [[LSL_Operators|operators]] such as &amp;lt;code&amp;gt;!&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;||&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;&amp;amp;&amp;amp;&amp;lt;/code&amp;gt; cannot be used with keys. If you wish to do &amp;lt;lsl&amp;gt;if (!uuid) { /* wont work */ }&amp;lt;/lsl&amp;gt; then you can use a simple workaround like so: &amp;lt;lsl&amp;gt;if (uuid) { } else { /* will work */ }&amp;lt;/lsl&amp;gt; This is particularly useful if we wish to discard invalid string content (i.e - ensure that a key is actually a key) like so:&amp;lt;lsl&amp;gt;if (uuid) ; else uuid = NULL_KEY;&amp;lt;/lsl&amp;gt;&lt;br /&gt;
* Be careful when adding key literals to lists, no implicit typecasting will take place. Failing to ensure that key literals are keys will cause problems with [[llListFindList]].&lt;br /&gt;
* Further more LSO and Mono do not work the same when it comes to typecasting strings to keys.&lt;br /&gt;
** There is a bug in LSO that LL has declined to fix, the reason given is that fixing it would break existing content.&lt;/div&gt;</summary>
		<author><name>Omei Qunhua</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Give_InvItem_every_n_hours&amp;diff=1193257</id>
		<title>Give InvItem every n hours</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Give_InvItem_every_n_hours&amp;diff=1193257"/>
		<updated>2014-09-09T21:20:34Z</updated>

		<summary type="html">&lt;p&gt;Omei Qunhua: -1 meaning not found, is not a generic error&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
This script will give an inventory item on touch only every n hours, even if somebody touches the object more than once.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
// Idea and written by Criz Collins&lt;br /&gt;
// Don&#039;t sell this FREE script!!!&lt;br /&gt;
&lt;br /&gt;
string  giveitem    =   &amp;quot;name of item in objects inventory&amp;quot;;&lt;br /&gt;
float   giveevery   =   24;  // hours!&lt;br /&gt;
&lt;br /&gt;
/////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
list  visitors;&lt;br /&gt;
list lastsent;&lt;br /&gt;
integer n;&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    on_rez( integer param )&lt;br /&gt;
    {&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    changed(integer change) &lt;br /&gt;
    {&lt;br /&gt;
        if (change &amp;amp; CHANGED_INVENTORY) &lt;br /&gt;
        {&lt;br /&gt;
            llResetScript();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        for (n=0; n&amp;lt;total_number; n++)&lt;br /&gt;
        {&lt;br /&gt;
            integer giveallowed = FALSE;&lt;br /&gt;
            integer index = llListFindList( visitors, [ llDetectedKey(n) ] );&lt;br /&gt;
            if (index == -1)&lt;br /&gt;
            {&lt;br /&gt;
                visitors = visitors + [ llDetectedKey(n) ];&lt;br /&gt;
                lastsent = lastsent + [(integer)llGetUnixTime()];&lt;br /&gt;
                giveallowed = TRUE;&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                if (llList2Integer(lastsent, index) &amp;lt;= ((integer)llGetUnixTime() - (giveevery * 60 * 60)))&lt;br /&gt;
                {&lt;br /&gt;
                    list replacer = [(integer)llGetUnixTime()];&lt;br /&gt;
                    list newlastsent = llListReplaceList(lastsent, replacer, index, index);&lt;br /&gt;
                    lastsent = [];&lt;br /&gt;
                    lastsent = newlastsent;&lt;br /&gt;
                    giveallowed = TRUE;&lt;br /&gt;
                }&lt;br /&gt;
//              else giveallowed = FALSE;&lt;br /&gt;
            }&lt;br /&gt;
            if (giveallowed)// == TRUE&lt;br /&gt;
            {&lt;br /&gt;
                llGiveInventory(llDetectedKey(n), giveitem);&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;
[[User:Criz Collins|Criz Collins]] 11:14, 11 June 2008 (PDT)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
{{LSLC|Library|Give InvItem every n hours}}&lt;/div&gt;</summary>
		<author><name>Omei Qunhua</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=One_Script,_many_doors&amp;diff=1193256</id>
		<title>One Script, many doors</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=One_Script,_many_doors&amp;diff=1193256"/>
		<updated>2014-09-09T21:17:05Z</updated>

		<summary type="html">&lt;p&gt;Omei Qunhua: -1 returned by llListFindList etc. is not a generic error. It has a specific known meaning.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This script is my attempt at solving the massive amount of simple door scripts one can have in a sim (I removed about 110 door scripts in my sim using this system)&lt;br /&gt;
&lt;br /&gt;
It handles clockwise and counter clockwise door direction, a name-based access control list, play sounds, and the root prim reports memory free (useful for REALLY big door sets).&lt;br /&gt;
&lt;br /&gt;
HOW TO USE IT&lt;br /&gt;
-------------&lt;br /&gt;
&lt;br /&gt;
All your doors have to be one prim, typical cube with a path cut of 0.125 0.625 .&lt;br /&gt;
&lt;br /&gt;
* All your doors must be linked to a root prim which won&#039;t be a door.&lt;br /&gt;
* All the doors must be uniquely named.&lt;br /&gt;
* All the doors must have &amp;quot;left&amp;quot; or &amp;quot;right&amp;quot; in their description depending on the direction you want them to swing to.&lt;br /&gt;
&lt;br /&gt;
* In the root prim you will need 3 rezzable objects (simple cubes will do) named &amp;quot;open&amp;quot; , &amp;quot;close&amp;quot; and &amp;quot;lock&amp;quot; with, in them, the corresponding scripts (see at the bottom of the page) in order to play sounds at the right place.&lt;br /&gt;
&lt;br /&gt;
* You need a configuration notecard called &amp;quot;config&amp;quot;&lt;br /&gt;
&lt;br /&gt;
main door script: must be in the root prim of the door link set.&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
/*******************************************&lt;br /&gt;
Single script, linked, lockable, door system&lt;br /&gt;
by Kyrah Abattoir&lt;br /&gt;
&lt;br /&gt;
allow you to control many doors from a single&lt;br /&gt;
core script, complete with sound projectors&lt;br /&gt;
and name based access control!&lt;br /&gt;
*******************************************/&lt;br /&gt;
&lt;br /&gt;
float autoclose_time = 30.0;//define how long the script will wait before closing a door.&lt;br /&gt;
float activation_distance = 2.0;//define how long the script will wait before closing a door.&lt;br /&gt;
&lt;br /&gt;
//This functions is from Nomad Padar, pretty awesome!&lt;br /&gt;
//encode from vector to integer&lt;br /&gt;
integer vec2int(vector v)&lt;br /&gt;
{&lt;br /&gt;
    integer x = (integer)(v.x);&lt;br /&gt;
    integer y = (integer)(v.y);&lt;br /&gt;
    integer z = (integer)(v.z);&lt;br /&gt;
    integer out;&lt;br /&gt;
&lt;br /&gt;
    //Rounds to 0, .5, or 1.0&lt;br /&gt;
    float delta = v.x-x;&lt;br /&gt;
&lt;br /&gt;
    if((delta&amp;gt;.25) &amp;amp;&amp;amp; (delta&amp;lt;.75))&lt;br /&gt;
        out += 0x10000000;&lt;br /&gt;
    else if(delta&amp;gt;.75)&lt;br /&gt;
        out += 0x1;&lt;br /&gt;
&lt;br /&gt;
    delta = v.y-y;&lt;br /&gt;
&lt;br /&gt;
    if((delta&amp;gt;.25) &amp;amp;&amp;amp; (delta&amp;lt;.75))&lt;br /&gt;
        out += 0x20000000;&lt;br /&gt;
    else if(delta&amp;gt;.75)&lt;br /&gt;
        out += 0x100;&lt;br /&gt;
&lt;br /&gt;
    delta = v.z-z;&lt;br /&gt;
&lt;br /&gt;
    if((delta&amp;gt;.25) &amp;amp;&amp;amp; (delta&amp;lt;.75))&lt;br /&gt;
        out += 0x40000000;&lt;br /&gt;
    else if(delta&amp;gt;.75)&lt;br /&gt;
        out += 0x10000;&lt;br /&gt;
&lt;br /&gt;
    out += x+(y&amp;lt;&amp;lt;8)+(z&amp;lt;&amp;lt;16);&lt;br /&gt;
    return out;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
list door_names         = [];//door list&lt;br /&gt;
list door_num           = [];//corresponding link numbers&lt;br /&gt;
list door_closed_rot    = [];//corresponding closed state rotation&lt;br /&gt;
list door_direction     = [];//which direction the door spin open&lt;br /&gt;
list door_open          = [];//is the door open?&lt;br /&gt;
list door_open_time     = [];//when was it open?&lt;br /&gt;
list door_acl           = [];//who can open the door (by user id)&lt;br /&gt;
list door_pos           = [];//the position of the door&lt;br /&gt;
&lt;br /&gt;
list user_indexes       = [];//list of users (user ids)&lt;br /&gt;
&lt;br /&gt;
integer is_active = FALSE;//if this is false the script ignore touches&lt;br /&gt;
&lt;br /&gt;
recount_doors()&lt;br /&gt;
{&lt;br /&gt;
    //this function recount the doors and record all the different door characteristics&lt;br /&gt;
    //only ran after script reset/when an object is linked/unlinked&lt;br /&gt;
    is_active = FALSE;&lt;br /&gt;
    llSetText(&amp;quot;recounting doors...&amp;quot;,&amp;lt;1.0,1.0,1.0&amp;gt;,1.0);&lt;br /&gt;
    integer prims = llGetNumberOfPrims();&lt;br /&gt;
&lt;br /&gt;
    integer i;&lt;br /&gt;
    for(i=2;i&amp;lt;=prims;i++)&lt;br /&gt;
    {&lt;br /&gt;
        key prim = llGetLinkKey(i);&lt;br /&gt;
        list tmp = llGetObjectDetails(prim,[OBJECT_NAME,OBJECT_DESC,OBJECT_ROT,OBJECT_POS]);&lt;br /&gt;
        string prim_name = llList2String(tmp,0);&lt;br /&gt;
        string prim_descr = llList2String(tmp,1);&lt;br /&gt;
        rotation prim_rot = (rotation)llList2String(tmp,2);&lt;br /&gt;
        vector prim_pos = (vector)llList2String(tmp,3);&lt;br /&gt;
&lt;br /&gt;
        door_num += [i];&lt;br /&gt;
        door_names += [prim_name];&lt;br /&gt;
        door_closed_rot += [prim_rot];&lt;br /&gt;
        door_open += [FALSE];&lt;br /&gt;
        door_open_time += [0];&lt;br /&gt;
        if(prim_descr == &amp;quot;right&amp;quot;)&lt;br /&gt;
            door_direction += [TRUE];&lt;br /&gt;
        else&lt;br /&gt;
            door_direction += [FALSE];&lt;br /&gt;
        door_acl += [&amp;quot;&amp;quot;];&lt;br /&gt;
        door_pos += [prim_pos];&lt;br /&gt;
    }&lt;br /&gt;
    llSetText(&amp;quot;...done!&amp;quot;,&amp;lt;1,1,1&amp;gt;,1.0);&lt;br /&gt;
    reload_acl();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string config = &amp;quot;config&amp;quot;;//name of the configuration file&lt;br /&gt;
integer nLine = 0;//current line we are reading&lt;br /&gt;
&lt;br /&gt;
//this function re read the config notecard and populate the&lt;br /&gt;
//user list and acl table&lt;br /&gt;
reload_acl()&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    llSetText(&amp;quot;reloading access controls...&amp;quot;,&amp;lt;1,1,1&amp;gt;,1.0);&lt;br /&gt;
    is_active = FALSE;&lt;br /&gt;
    nLine = 0;&lt;br /&gt;
    //remove all acl&lt;br /&gt;
    integer i;&lt;br /&gt;
    for(i=0;i&amp;lt;llGetListLength(door_num);i++)&lt;br /&gt;
        door_acl = llListReplaceList(door_acl,[&amp;quot;&amp;quot;],i,i);&lt;br /&gt;
&lt;br /&gt;
    user_indexes = [];&lt;br /&gt;
    llGetNotecardLine(config,nLine);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//close a door (by index) using the stored rotation&lt;br /&gt;
close(integer index)&lt;br /&gt;
{&lt;br /&gt;
    integer linknum = llList2Integer(door_num,index);&lt;br /&gt;
&lt;br /&gt;
    rotation closed = llList2Rot(door_closed_rot,index);&lt;br /&gt;
    llSetLinkPrimitiveParams(linknum,[PRIM_ROTATION,closed]);&lt;br /&gt;
&lt;br /&gt;
    door_open = llListReplaceList(door_open,[FALSE],index,index);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//close a door (by index) using the stored rotation and adding or substracting 90 degrees&lt;br /&gt;
//on the Z world axis depending of the direction recorded for the door.&lt;br /&gt;
//also record it&#039;s opening time (unix timestamp)&lt;br /&gt;
open(integer index)&lt;br /&gt;
{&lt;br /&gt;
    integer linknum = llList2Integer(door_num,index);&lt;br /&gt;
    rotation closed = llList2Rot(door_closed_rot,index);&lt;br /&gt;
    rotation open;&lt;br /&gt;
    if( llList2Integer(door_direction,index) )&lt;br /&gt;
        open = llEuler2Rot(llRot2Euler(closed)+ (&amp;lt;0,0,90&amp;gt; *DEG_TO_RAD));&lt;br /&gt;
    else&lt;br /&gt;
        open = llEuler2Rot(llRot2Euler(closed)+ (&amp;lt;0,0,-90&amp;gt; *DEG_TO_RAD));&lt;br /&gt;
    llSetLinkPrimitiveParams(linknum,[PRIM_ROTATION,open]);&lt;br /&gt;
&lt;br /&gt;
    door_open_time = llListReplaceList(door_open_time,[llGetUnixTime()],index,index);&lt;br /&gt;
    door_open = llListReplaceList(door_open,[TRUE],index,index);&lt;br /&gt;
&lt;br /&gt;
    llSetTimerEvent(1.0);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//those 3 functions rez a sound emitter with it&#039;s destination position encoded in integer&lt;br /&gt;
play_open(vector pos)&lt;br /&gt;
{&lt;br /&gt;
    llRezObject(&amp;quot;open&amp;quot;,llGetPos(),ZERO_VECTOR,ZERO_ROTATION,vec2int(pos));&lt;br /&gt;
}&lt;br /&gt;
play_close(vector pos)&lt;br /&gt;
{&lt;br /&gt;
    llRezObject(&amp;quot;close&amp;quot;,llGetPos(),ZERO_VECTOR,ZERO_ROTATION,vec2int(pos));&lt;br /&gt;
}&lt;br /&gt;
play_lock(vector pos)&lt;br /&gt;
{&lt;br /&gt;
    llRezObject(&amp;quot;lock&amp;quot;,llGetPos(),ZERO_VECTOR,ZERO_ROTATION,vec2int(pos));&lt;br /&gt;
}&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;
        integer userid;&lt;br /&gt;
&lt;br /&gt;
        if(!is_active)&lt;br /&gt;
            return;&lt;br /&gt;
&lt;br /&gt;
        //considering we MAY receive more than one touch at the same time since&lt;br /&gt;
        //we can manage many doors.&lt;br /&gt;
        for(userid=0;userid&amp;lt;total_number;userid++)&lt;br /&gt;
        {&lt;br /&gt;
            integer door_id = llDetectedLinkNumber(userid);&lt;br /&gt;
            string clicker_name = llDetectedName(userid);&lt;br /&gt;
&lt;br /&gt;
            integer door_index = llListFindList(door_num,[door_id]);&lt;br /&gt;
            if(door_index == -1)&lt;br /&gt;
                return;//unknown door? do nothing&lt;br /&gt;
&lt;br /&gt;
            integer is_open = llList2Integer(door_open,door_index);&lt;br /&gt;
            vector door_vec = llList2Vector(door_pos,door_index);&lt;br /&gt;
&lt;br /&gt;
            //we do not accept touches that are further away from activation_distance&lt;br /&gt;
            if( llVecDist(door_vec,llDetectedPos(userid) )&amp;gt; activation_distance )&lt;br /&gt;
                llInstantMessage(llDetectedKey(userid),&amp;quot;You can&#039;t use this from this distance.&amp;quot;);&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                if(is_open)&lt;br /&gt;
                {   //if the door is open, simply play sound and close it.&lt;br /&gt;
                    play_close(door_vec);&lt;br /&gt;
                    close(door_index);&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    string acl_string = llList2String(door_acl,door_index);&lt;br /&gt;
&lt;br /&gt;
                    //if the acl string is empty for this door we simply open it&lt;br /&gt;
                    if(acl_string == &amp;quot;&amp;quot;) //no specific locking&lt;br /&gt;
                    {&lt;br /&gt;
                        play_open(door_vec);&lt;br /&gt;
                        open(door_index);&lt;br /&gt;
                    }&lt;br /&gt;
                    else&lt;br /&gt;
                    {&lt;br /&gt;
                        //otherwise we lookup if the userid that correspond to the person who touched&lt;br /&gt;
                        //the door match any of the ones in the ACL string&lt;br /&gt;
                        integer user_index = llListFindList(user_indexes,[clicker_name]);&lt;br /&gt;
&lt;br /&gt;
                        if(user_index == -1)  //we don&#039;t even know this user? sure as hell there is no acl about him&lt;br /&gt;
                            play_lock(door_vec);&lt;br /&gt;
                        else&lt;br /&gt;
                        {&lt;br /&gt;
                            list acl_list =  llParseString2List(acl_string,[&amp;quot;,&amp;quot;],[]);&lt;br /&gt;
&lt;br /&gt;
                            if(llListFindList(acl_list,[(string)user_index]) != -1)&lt;br /&gt;
                            {&lt;br /&gt;
                                play_open(door_vec);&lt;br /&gt;
                                open(door_index);&lt;br /&gt;
                            }&lt;br /&gt;
                            else&lt;br /&gt;
                                play_lock(door_vec);&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    dataserver(key id,string data)&lt;br /&gt;
    {&lt;br /&gt;
        //notecard reading stuff&lt;br /&gt;
        if(data != EOF)&lt;br /&gt;
        {&lt;br /&gt;
            if(data != &amp;quot;&amp;quot; &amp;amp;&amp;amp; data != &amp;quot; &amp;quot; &amp;amp;&amp;amp; llGetSubString(data,0,1) != &amp;quot;//&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                list command_and_data = llParseString2List(data,[&amp;quot;=&amp;quot;],[]);&lt;br /&gt;
                string door_name = llList2String(command_and_data,0);&lt;br /&gt;
                string user_names_string = llList2String(command_and_data,1);&lt;br /&gt;
&lt;br /&gt;
                integer index = llListFindList(door_names,[door_name]);&lt;br /&gt;
                if(index != -1)&lt;br /&gt;
                {&lt;br /&gt;
                    list user_names_list = llParseString2List(user_names_string,[&amp;quot;,&amp;quot;],[]);&lt;br /&gt;
                    integer j;&lt;br /&gt;
&lt;br /&gt;
                    list pre_acl_list;&lt;br /&gt;
                    for(j=0;j&amp;lt;llGetListLength(user_names_list);j++)&lt;br /&gt;
                    {&lt;br /&gt;
                        string user_name = llList2String(user_names_list,j);&lt;br /&gt;
                        integer index2 = llListFindList(user_indexes,[user_name]);&lt;br /&gt;
                        if( index2 == -1)&lt;br /&gt;
                        {&lt;br /&gt;
                            pre_acl_list += llGetListLength(user_indexes);&lt;br /&gt;
                            user_indexes += [user_name];&lt;br /&gt;
                        }&lt;br /&gt;
                        else&lt;br /&gt;
                            pre_acl_list += [index2];&lt;br /&gt;
&lt;br /&gt;
                    }&lt;br /&gt;
                    string pre_acl_string = llDumpList2String(pre_acl_list,&amp;quot;,&amp;quot;);&lt;br /&gt;
                    door_acl = llListReplaceList(door_acl,[pre_acl_string],index,index);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
            nLine++;&lt;br /&gt;
            llGetNotecardLine(config,nLine);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            is_active = TRUE;&lt;br /&gt;
            llOwnerSay(&amp;quot;config reloaded&amp;quot;);&lt;br /&gt;
            llSetText((string)llGetFreeMemory()+&amp;quot;bits free&amp;quot;,&amp;lt;.5,.5,.5&amp;gt;,.5);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        recount_doors();&lt;br /&gt;
    }&lt;br /&gt;
    changed(integer change)&lt;br /&gt;
    {&lt;br /&gt;
        //if we detect an inventory change we reread the notecard&lt;br /&gt;
        //if we detect a linkchange we reset the script and recount doors first&lt;br /&gt;
        if( (change &amp;amp; CHANGED_INVENTORY) == CHANGED_INVENTORY)&lt;br /&gt;
            reload_acl();&lt;br /&gt;
        if( (change &amp;amp; CHANGED_LINK) == CHANGED_LINK)&lt;br /&gt;
            llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        //timer will run once a second as long as at least one door is open.&lt;br /&gt;
        if(llListFindList(door_open,[TRUE]) == -1)&lt;br /&gt;
        {&lt;br /&gt;
            llSetTimerEvent(0.0);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        integer i;&lt;br /&gt;
&lt;br /&gt;
        //each run of the timer we loop through the timestamps to check if one of them is too old&lt;br /&gt;
        //(which means we can force close the associated door&lt;br /&gt;
        for(i=0;i&amp;lt;llGetListLength(door_open_time);i++)&lt;br /&gt;
        {&lt;br /&gt;
            integer is_open = llList2Integer(door_open,i);&lt;br /&gt;
            integer time = llList2Integer(door_open_time,i);&lt;br /&gt;
            if( is_open &amp;amp;&amp;amp; ((time + autoclose_time) &amp;lt;  llGetUnixTime()))&lt;br /&gt;
            {&lt;br /&gt;
                vector door_vec = llList2Vector(door_pos,i);&lt;br /&gt;
                llRezObject(&amp;quot;close&amp;quot;,llGetPos(),ZERO_VECTOR,ZERO_ROTATION,vec2int(door_vec));&lt;br /&gt;
                close(i);&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;
Sound emitter script&lt;br /&gt;
--------------------&lt;br /&gt;
You need this script in the 3 rezzable objects &amp;quot;open&amp;quot; &amp;quot;close&amp;quot; and &amp;quot;lock&amp;quot; in order to play your door sounds at the right place (At the time i wrote this , lsl doesn&#039;t allow yet to play sounds from an unscripted prim in a link set)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
string sound_to_play = &amp;quot;my door sound&amp;quot;;// put your sound name/key here&lt;br /&gt;
&lt;br /&gt;
//This functions is from Nomad Padar, pretty awesome!&lt;br /&gt;
//decode from integer to vector&lt;br /&gt;
vector int2vec(integer n)&lt;br /&gt;
{&lt;br /&gt;
    //0zyx ZZZZ ZZZZ ZZZZ YYYY YYYY XXXX XXXX&lt;br /&gt;
    return &amp;lt;n&amp;amp;0xFF, (n&amp;gt;&amp;gt;8)&amp;amp;0xFF, ((n&amp;gt;&amp;gt;16)&amp;amp;0xFF)&amp;gt; + &amp;lt;((n&amp;amp;0x10000000)!=0)*.5,((n&amp;amp;0x20000000)!=0)*.5,((n&amp;amp;0x40000000)!=0)*.5&amp;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;
        llSetStatus(STATUS_PHANTOM, TRUE);&lt;br /&gt;
        llSetPrimitiveParams([PRIM_TEMP_ON_REZ, TRUE]);&lt;br /&gt;
        llSetTexture(TEXTURE_TRANSPARENT,ALL_SIDES);&lt;br /&gt;
    }&lt;br /&gt;
    on_rez(integer a)&lt;br /&gt;
    {&lt;br /&gt;
        if(a == 0)&lt;br /&gt;
            return;&lt;br /&gt;
&lt;br /&gt;
        vector destination = int2vec(a);&lt;br /&gt;
&lt;br /&gt;
        integer i;&lt;br /&gt;
        for(i=0 ; i&amp;lt;50 &amp;amp;&amp;amp; (llGetPos() != destination) ; i++)&lt;br /&gt;
            llSetPos(destination);&lt;br /&gt;
&lt;br /&gt;
        if(llGetPos() == destination)&lt;br /&gt;
            llTriggerSound(sound_to_play,1.0);&lt;br /&gt;
        llDie();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
Example &amp;quot;config&amp;quot; notecard:&lt;br /&gt;
 //lines starting with &amp;quot;//&amp;quot; are ignored&lt;br /&gt;
 //Syntax: one line per door in the format door_name=user name,user name&lt;br /&gt;
&lt;br /&gt;
 My fancy front door=Kyrah Abattoir&lt;br /&gt;
 My secret playroom door=Kyrah Abattoir,Timeless Prototype&lt;br /&gt;
&lt;br /&gt;
 //of course if you want to lock a door from anybody you can set it to something like this:&lt;br /&gt;
&lt;br /&gt;
 Mine entrance=condemned until further notice&lt;br /&gt;
--[[User:Kyrah Abattoir|Kyrah Abattoir]] 18:46, 7 March 2010 (UTC)&lt;/div&gt;</summary>
		<author><name>Omei Qunhua</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Name2Key_in_LSL&amp;diff=1193255</id>
		<title>Name2Key in LSL</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Name2Key_in_LSL&amp;diff=1193255"/>
		<updated>2014-09-09T21:00:56Z</updated>

		<summary type="html">&lt;p&gt;Omei Qunhua: Undo revision 1182279 usual reasons&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}__NOTOC__&lt;br /&gt;
&lt;br /&gt;
== Name2Key ==&lt;br /&gt;
Still missing Name2Key functions in your code? Still relying on external databases that are not always up to date with latest SL subscribers? &lt;br /&gt;
&lt;br /&gt;
Well now you can solve this by yourself, within your LSL script! All you have to do is to rely on LL Search engine! &lt;br /&gt;
&lt;br /&gt;
I put a kind of &amp;quot;library&amp;quot; and a sample of usage for your convenience&lt;br /&gt;
&lt;br /&gt;
Takat Su: I placed an alternate implementation up that does not depend on the babelfish proxy nor having your own proxy here: [[User:Takat Su/Name2Key]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Library ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
integer SERVICE_NAME2KEY     = 19790;&lt;br /&gt;
integer SERVICE_NAME2KEY_RET = 19791;&lt;br /&gt;
&lt;br /&gt;
string proxy     = &amp;quot;http://66.196.80.202/babelfish/translate_url_content?&amp;amp;intl=us&amp;amp;lp=ko_en&amp;amp;trurl=&amp;quot;;&lt;br /&gt;
string search    = &amp;quot;http://vwrsearch.secondlife.com/client_search.php?session=00000000-0000-0000-0000-000000000000&amp;amp;q=&amp;quot;;&lt;br /&gt;
string result    = &amp;quot;secondlife:///app/agent/&amp;quot;;&lt;br /&gt;
string profile   = &amp;quot;Resident profile&amp;quot;;&lt;br /&gt;
string notfound  = &amp;quot;There were no matches for &amp;quot;;&lt;br /&gt;
&lt;br /&gt;
list    requests;&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    on_rez(integer i) { llResetScript(); }&lt;br /&gt;
&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        requests = [];&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    link_message(integer s, integer n, string m, key i)&lt;br /&gt;
    {&lt;br /&gt;
        if (n == SERVICE_NAME2KEY) {&lt;br /&gt;
            if(llListFindList(requests,[m]) == -1) {&lt;br /&gt;
                list Args=llParseString2List(m, [&amp;quot; &amp;quot;], []);&lt;br /&gt;
&lt;br /&gt;
                string FirstName = llList2String(Args, 0);&lt;br /&gt;
                string LastName = llList2String(Args, 1);&lt;br /&gt;
&lt;br /&gt;
                string url = proxy+llEscapeURL(search)+FirstName+&amp;quot;%2520&amp;quot;+LastName;;&lt;br /&gt;
                key id = llHTTPRequest(url, [], &amp;quot;&amp;quot;);&lt;br /&gt;
                requests += [id,m];&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    http_response(key request_id, integer status, list metadata, string body)&lt;br /&gt;
    {&lt;br /&gt;
        integer p = llListFindList(requests,[request_id]);&lt;br /&gt;
        if (p != -1) {&lt;br /&gt;
            string name = llList2String(requests,p+1);&lt;br /&gt;
            integer find = llSubStringIndex(body,result);&lt;br /&gt;
            if(find == -1) {&lt;br /&gt;
                find = llSubStringIndex(body,notfound);&lt;br /&gt;
                if(find == -1)&lt;br /&gt;
                    llMessageLinked(LINK_SET,SERVICE_NAME2KEY_RET,&amp;quot;Error with lookup!&amp;quot;,NULL_KEY);&lt;br /&gt;
                else&lt;br /&gt;
                    llMessageLinked(LINK_SET,SERVICE_NAME2KEY_RET,name+&amp;quot; not found.&amp;quot;,NULL_KEY);&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                find += llStringLength(result);&lt;br /&gt;
                string avKey = llGetSubString(body,find,find+35);&lt;br /&gt;
                integer namePos = llSubStringIndex(body,profile)+17;&lt;br /&gt;
                string foundName = llGetSubString(body, namePos+1,&lt;br /&gt;
                    namePos + llSubStringIndex(llGetSubString(body,namePos+1, llStringLength(body)-1),&amp;quot;&amp;lt;&amp;quot;));&lt;br /&gt;
                if(llToLower(name) == llToLower(foundName))&lt;br /&gt;
                    llMessageLinked(LINK_SET,SERVICE_NAME2KEY_RET,foundName,(key)avKey);&lt;br /&gt;
                else&lt;br /&gt;
                    llMessageLinked(LINK_SET,SERVICE_NAME2KEY_RET,name+&amp;quot; failed: Wrong found.&amp;quot;,NULL_KEY);&lt;br /&gt;
            }&lt;br /&gt;
            requests = llDeleteSubList(requests,p,p+1);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt; &lt;br /&gt;
== Usage sample ==&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
integer SERVICE_NAME2KEY        =   19790;&lt;br /&gt;
integer SERVICE_NAME2KEY_RET    =   19791;&lt;br /&gt;
 &lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    on_rez(integer i) { llResetScript(); }&lt;br /&gt;
 &lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llListen(1, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    listen(integer c, string n, key i, string m)&lt;br /&gt;
    {&lt;br /&gt;
        llSay(0,&amp;quot;Requesting key for &amp;quot;+m);&lt;br /&gt;
        llMessageLinked(LINK_THIS, SERVICE_NAME2KEY, m, &amp;quot;&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    link_message(integer f, integer n, string s, key i)&lt;br /&gt;
    {&lt;br /&gt;
        if(n == SERVICE_NAME2KEY_RET) {&lt;br /&gt;
            if(i == NULL_KEY)&lt;br /&gt;
                llSay(0,&amp;quot;Lookup failed.  Returned: &amp;quot;+s);&lt;br /&gt;
            else&lt;br /&gt;
                llSay(0,s+&amp;quot;: &amp;quot;+(string)i);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt; &lt;br /&gt;
== Comments ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em;&amp;quot;&amp;gt;&lt;br /&gt;
Hope this helps !&lt;br /&gt;
[[User:Maeva Anatine|Maeva Anatine]]&lt;br /&gt;
&lt;br /&gt;
EDIT : Looks like the Lindens have either broken or blocked this function. It works from my browser, however from LSL I get an error page containing this message &amp;quot;Access control configuration prevents your request from&lt;br /&gt;
being allowed at this time.  Please contact your service provider if&lt;br /&gt;
you feel this is incorrect.&amp;quot; - Darling Brody.&lt;br /&gt;
&lt;br /&gt;
EDIT : Yes you&#039;re right Darling. It seems they&#039;ve blocked this access from within the world... I still wonder why, especially as there are some workarounds to this...&lt;br /&gt;
Anyway I discovered there is a JIRA issue for this. Please vote for the unblock !&lt;br /&gt;
https://jira.secondlife.com/browse/SVC-3122&lt;br /&gt;
- Mae&lt;br /&gt;
&lt;br /&gt;
EDIT : OK after having read this article from LL: [[SearchAPI]], it seems proxy usage is allowed. So I modified the upper code in order to go through a proxy machine and it works again :)&lt;br /&gt;
- Mae&lt;br /&gt;
&lt;br /&gt;
EDIT: After review, it appears the Yahoo Babelfish proxy you are using above does not return the results expected.  I rewrote this to allow different proxies by a simple configuration.  This now uses Google instead of Babelfish by default.  This does not, however, work for any avatars that do not have a Profile filled out (this is due to a limitation of the Googly proxy we&#039;re using here).  I&#039;m researching this and trying to see if there is a better proxy to use.&lt;br /&gt;
&lt;br /&gt;
This version can handle multiple requests at once.  Replies have changed slightly, as the found key is returned in the &amp;quot;key&amp;quot; field instead of the message field.  In addition, failure of any kind results in a NULL_KEY being returned, and status information is returned in the message field. - [[User:Sensei Schism|Sensei Schism]]&lt;br /&gt;
&lt;br /&gt;
EDIT 2009-Mar-08: Sensei, I reused your version here above and took back BabelFish as Google one is unable to retrieve all links (doesn&#039;t recognized correctly the secondlife:/// link). In addition, I made some slight changes as LL recently changed their search engine. This version now works properly.&lt;br /&gt;
&lt;br /&gt;
EDIT 2009-Aug-27: LL changed the search URL from &#039;&#039;&#039;search&#039;&#039;&#039;.secondlife.com/client_search.php to &#039;&#039;&#039;vwrsearch&#039;&#039;&#039;.secondlife.com/client_search.php&lt;br /&gt;
[[User:ab Vanmoer|ab Vanmoer]]&lt;br /&gt;
&lt;br /&gt;
EDIT 2009-Sep-04: The problem with the proxy you have there is that it translates the name as a french name, and if it happens to be a real french word, then the name gets changed to that.  for example the last name of Vella got changed to Calved, so no match was made.  PS. I also found some names had been surrounded by bold tags.  So, since i have a few websites i can run PHP on i got [http://sourceforge.net/projects/php-proxy/ PHP Web Proxy] and point to it.  Also, I used: body = llDumpList2String(llParseStringKeepNulls(body, [&amp;quot;&amp;lt;b&amp;gt;&amp;quot;, &amp;quot;&amp;lt;/b&amp;gt;&amp;quot;], []), &amp;quot;&amp;quot;); to remove the bold tags.&lt;br /&gt;
-Spritely Pixel&lt;br /&gt;
&lt;br /&gt;
EDIT 2009-Sep-19: Changed the translation from French to Korean on the theory that there are very few names that contain valid Korean characters, thus the translation should just pass straight through.  Changes were: 1. Change the proxy URL to use ko_en instead of fr_en.  2. Change the profile search string from &amp;quot;Resident profiles&amp;quot; to &amp;quot;Resident profile&amp;quot; (note change from plural to singular) and changed the name offset to account for the (now missing) &#039;s&#039;. Also note that Babel will sometimes return an advertising page instead of the translation.  Thus, you should be prepared to retry the search a few times if you get a page that doesn&#039;t make sense.[[User:Takat Su|Takat Su]]&lt;br /&gt;
&lt;br /&gt;
EDIT 2009-Sep-20: Got fed up with the babel translation thing.  Apparently, if you make too many requests, Yahoo throttles you for between 2 and 24 hours.  So I made a relay for the Google appspot engine and replicated this page with the new code here: [[User:Takat Su/Name2Key]] [[Takat Su|Takat Su]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
[[User:Maeva Anatine|Maeva Anatine]]&lt;br /&gt;
&lt;br /&gt;
{{LSLC|Library}}{{LSLC|Examples|Name2Key}}&lt;/div&gt;</summary>
		<author><name>Omei Qunhua</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LSL_Style_Guide&amp;diff=1193253</id>
		<title>LSL Style Guide</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LSL_Style_Guide&amp;diff=1193253"/>
		<updated>2014-09-09T14:54:49Z</updated>

		<summary type="html">&lt;p&gt;Omei Qunhua: -1 returned from llListFindList has a specific known meaning It is not a &amp;quot;generic error&amp;quot; covering a multitude of sins. PUBLIC_CHANNEL has been voted out&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header|ml=*}}{{RightToc}}&lt;br /&gt;
&lt;br /&gt;
Every major open-source project has its own style guide: a &#039;&#039;&#039;set of conventions&#039;&#039;&#039; (sometimes arbitrary) about how to write code for that project. It is much easier to understand a large codebase when all the code in it is in a &#039;&#039;&#039;consistent style&#039;&#039;&#039;. These guidelines, referred to collectively as a Style Guide, are not as rigid as the rules required by the language compiler but nonetheless are critical to creating maintainable code. The most critical aspect of a style is that you apply it consistently to the code you write.&lt;br /&gt;
&lt;br /&gt;
Effective programming in [[LSL Portal|LSL]] requires that developers use a disciplined approach towards formatting and other conventions in their scripts.&lt;br /&gt;
&lt;br /&gt;
{{LSL Tip| Applying a style guide to your code does not only help others read your code. &#039;&#039;&#039;It helps you as well&#039;&#039;&#039;, because in future when you return to the code you wrote before, you&#039;ll appreciate reading formatted and annotated code.}}&lt;br /&gt;
&lt;br /&gt;
== Use third party editors: ==&lt;br /&gt;
&lt;br /&gt;
There are many [[LSL Alternate Editors|third party editors]] with [[LSL Portal|LSL]] syntax files available. See an example below of what your workflow would look like using an editor that has syntax highlighting and autocomplete and also applies an indent style to your code.&lt;br /&gt;
&lt;br /&gt;
Using [[LSL Alternate Editors|third party editors]] has a few advantages over using the editor in the viewers:&lt;br /&gt;
* Autocompletion helps you avoid typos.&lt;br /&gt;
* Autocompletion sometimes not only does a linear autocompletion as in autocompleting &amp;lt;code&amp;gt;llS&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;llSay&amp;lt;/code&amp;gt; but sometimes works even with fuzzy search by autocompleting &amp;lt;code&amp;gt;llslppf&amp;lt;/code&amp;gt; to &amp;lt;code&amp;gt;llSetLinkPrimitiveParamsFast&amp;lt;/code&amp;gt;.&lt;br /&gt;
* The syntax highlighting file colors the code exactly like the code you see in the official Linden Lab viewer making you not having to learn or adapt to a different coloring scheme.&lt;br /&gt;
* Autocompletion might also preformat code with indent styles when autocompleting states, events, conditional clauses etc.&lt;br /&gt;
&lt;br /&gt;
== [http://en.wikipedia.org/wiki/Indent_style Indent styles]: ==&lt;br /&gt;
&lt;br /&gt;
Most people, when they start programming on their own, will have programs that are UGLY to look at - to put it nicely, sometimes mistakenly thinking that such scripts occupy less space when compiled. Such scripts typically look like the following:&lt;br /&gt;
&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot; {{Prettytable}}&lt;br /&gt;
|- {{Hl2}}&lt;br /&gt;
! &#039;&#039;&#039;unstyled source code&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||&lt;br /&gt;
&amp;lt;lsl&amp;gt;default {state_entry(){llSay(0,&amp;quot;Hello World.&amp;quot;);}}&amp;lt;/lsl&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
However, that code is difficult to read (or at least to &#039;&#039;&#039;follow&#039;&#039;&#039;) - even more so when one is writing a couple hundred lines program. There are several [http://en.wikipedia.org/wiki/Indent_style indent styles] with the two most common styles being:&lt;br /&gt;
&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot; {{Prettytable}}&lt;br /&gt;
|- {{Hl2}}&lt;br /&gt;
! &#039;&#039;&#039;[http://en.wikipedia.org/wiki/Indent_style#K.26R_style K&amp;amp;R style] (used in Javascript based languages)&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;[http://en.wikipedia.org/wiki/Indent_style#Allman_style Allman style] (used in C based languages)&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||&amp;lt;lsl&amp;gt;&lt;br /&gt;
default {&lt;br /&gt;
    state_entry() {&lt;br /&gt;
        llSay(0, &amp;quot;Hello World.&amp;quot;);&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;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSay(0, &amp;quot;Hello World.&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;K&amp;amp;R style&#039;&#039;&#039; conserves space - IN THE SOURCE CODE ONLY, however the &#039;&#039;&#039;Allman style&#039;&#039;&#039; is easier to read and easier to visually bracket-match. Once a scripter is in the practice of using a particular style, reading code in that style will become easier.&lt;br /&gt;
&lt;br /&gt;
Consistent indenting makes reading both styles easier that&#039;s why it &#039;&#039;&#039;really comes down to whatever works for you&#039;&#039;&#039;. In both methods, indenting is the key indicating factor of levels of scope.&lt;br /&gt;
&lt;br /&gt;
== Naming conventions: ==&lt;br /&gt;
&lt;br /&gt;
There are many naming conventions in Second Life. Only the most used ones will be listed below.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Global Variables (variables used through out the entire program) should be lowercase. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
integer index = 0;&lt;br /&gt;
string  name  = &amp;quot;Please set one&amp;quot;;&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Others prefer to distinguish between global and local variables by prefixing variable names with a character, defining globals in the following manner:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
integer gIndex;&lt;br /&gt;
string  gName  = &amp;quot;Please set one&amp;quot;;&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Constant variables should be in ALL CAPS following the style guide used by Linden Labs. For example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
integer DIALOG_CHANNEL = -517265;&lt;br /&gt;
vector  RED            = &amp;lt;1.0, 0.0, 0.0&amp;gt;;&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Arguments used within a [[Category:LSL User-Defined Functions|user defined function]] or one of the standard [[Event|events]] should be named with &#039;&#039;&#039;easily readable and meaningful&#039;&#039;&#039; names. When using [[Event|events]], please use the standard names as listed here on the official wiki. An [[Event|overview of all events can be found here]]. Below is an example as can be found for the [[Listen|listen event]]:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;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;
        key OwnerKey = llGetOwner();&lt;br /&gt;
    &lt;br /&gt;
        if (channel == 1 &amp;amp;&amp;amp; id == OwnerKey)&lt;br /&gt;
            llOwnerSay(&amp;quot;Hello Avatar&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
//  ...&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Separating code: ==&lt;br /&gt;
Some people put too many function calls on one line. As shown in this example, too many function calls on a single line makes the code hard to read and almost impossible to debug.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
list    lst;&lt;br /&gt;
integer numDigits = 10;&lt;br /&gt;
&lt;br /&gt;
default {&lt;br /&gt;
    touch_start(integer n) {&lt;br /&gt;
        integer i;&lt;br /&gt;
        integer index = llListFindList(lst, [llToLower(llGetSubString(llList2String(llParseString2List(llKey2Name(llDetectedKey(i)), [&amp;quot; &amp;quot;], []), 0), 0, numDigits - 1))]);&lt;br /&gt;
        if (!~llListFindList(lst, [llToLower(llGetSubString(llList2String(llParseString2List(llKey2Name(llDetectedKey(i)), [&amp;quot; &amp;quot;], []), 0), 0, numDigits - 1))]))&lt;br /&gt;
            lst += llToLower(llGetSubString(llList2String(llParseString2List(llKey2Name(llDetectedKey(i)), [&amp;quot; &amp;quot;], []), 0), 0, numDigits - 1));&lt;br /&gt;
        llOwnerSay(llList2CSV(lst));&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Now here is the code, with the exact same features, in a simpler way. While hardly anyone could tell you what the above code did, almost everyone can figure out what the below code does.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
list    listOfStrings;&lt;br /&gt;
integer numDigits = 10;&lt;br /&gt;
&lt;br /&gt;
default &lt;br /&gt;
{&lt;br /&gt;
    touch_start(integer n) &lt;br /&gt;
    {&lt;br /&gt;
        key     owner      = llGetOwner();&lt;br /&gt;
        key     id         = llDetectedKey(0);&lt;br /&gt;
        string  name       = llDetectedName(0);// or llKey2Name(id)&lt;br /&gt;
&lt;br /&gt;
        list    nameAsList = llParseString2List(name, [&amp;quot; &amp;quot;], []);&lt;br /&gt;
        string  firstName  = llList2String(nameAsList, 0);&lt;br /&gt;
        string  startPart  = llToLower(llGetSubString(firstName, 0, numDigits - 1));&lt;br /&gt;
        integer index      = llListFindList(listOfStrings, [startPart]);&lt;br /&gt;
&lt;br /&gt;
        if (index == -1)&lt;br /&gt;
            listOfStrings += startPart;&lt;br /&gt;
&lt;br /&gt;
//      send a message to the owner, only reaches owner if online and within the same sim&lt;br /&gt;
        llRegionSayTo(owner, 0, llList2CSV(listOfStrings));&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
LSL lacks an optimizing compiler. For this reason it may be necessary to balance the two style to get faster, more compact executable code. Line combination optimization should only be done after the code is working &amp;amp; bug free. Improper optimization can lead to wrong results. Always test optimized code thoroughly.&lt;br /&gt;
&lt;br /&gt;
==Script Structure==&lt;br /&gt;
LSL scripts are comprised of expressions, functions, statements, event handlers and states. The LSL compiler mandates a certain structure to scripts:&lt;br /&gt;
&lt;br /&gt;
#User Defined Variables  (see [[LSL_Variables]])&lt;br /&gt;
#User Defined Functions (see [[User-defined_functions]])&lt;br /&gt;
#[[default]] State  (see [[State]])&lt;br /&gt;
#User Defined States&lt;br /&gt;
&lt;br /&gt;
==LSL Portal Style==&lt;br /&gt;
&lt;br /&gt;
Here in the [[LSL Portal]] we expect consistent white-spacing and it should look similar to either &#039;&#039;&#039;K&amp;amp;R&#039;&#039;&#039; or &#039;&#039;&#039;Allman&#039;&#039;&#039;. We do not require strict adherence to either. We do not use tabs (as they take up an exorbitant amount of screen space) but some number of spaces, usually between 2 and 6, 4 being the most popular value and the value you will see almost everywhere. Generally speaking it&#039;s taboo to edit an article just to fix the white-spacing, unless it&#039;s inconsistent (the edit should make it consistent, it should not change the style). Generally speaking it&#039;s taboo to edit an article to change the style. Exceptions do exist, if you are making substantial changes to the majority of code in the article, and it makes sense to change the style of the rest of the code (such that it all matches), you may do so. The purpose of this restriction is to keep the peace, some people are really quite attached to their style. Considering that style is a personal preference of little consequence, nothing is gained by forcing one style onto the community, especially when they will go ahead and use whatever style they want disregarding what we mandate. When in doubt or conflict please use the discussion page, a majority are monitored and will be responded to.&lt;br /&gt;
&lt;br /&gt;
If you find yourself desiring to make small changes to white-space despite it being frowned upon, we would ask you first consider adding an example to one of the articles that [[:Category:LSL_Needs_Example|needs an example]] or is missing some [[:Category:LSL FixMe|key content]].&lt;/div&gt;</summary>
		<author><name>Omei Qunhua</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=3D_Radar&amp;diff=1193242</id>
		<title>3D Radar</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=3D_Radar&amp;diff=1193242"/>
		<updated>2014-09-08T10:57:50Z</updated>

		<summary type="html">&lt;p&gt;Omei Qunhua: Re-instate the object re-name. This does have a purpose. It obviates manually renaming &amp;quot;object&amp;quot; to &amp;quot;scan ball&amp;quot;, as the comments said.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
&lt;br /&gt;
*[[User:Jesse_Barnett|Click Here]]  To see my page and more of my scripts&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Scripts have been corrected and working properly now==&lt;br /&gt;
&lt;br /&gt;
Rezzes a ball for each avatar in range. Each ball tracks it&#039;s on AV and displays distance.&lt;br /&gt;
&lt;br /&gt;
==Scanner/Rezzer Script==&lt;br /&gt;
Place this script in a prim along with the scan ball. When touched it will scan the surrounding area and rezz a ball for each avatar.&lt;br /&gt;
&lt;br /&gt;
Suggestion: Create a sphere with a diameter of  2 meters. Set transparency about 60. Create another sphere about 0.05 diameter, color a dark color and put it in the center of the large prim. Select small prim 1st and then large prim and link them. This will give you a center point to reference. The scan ball script is set to scan for it&#039;s avatar to a range of 96 meters.&lt;br /&gt;
&lt;br /&gt;
This formula: vector avDivPos = (avPos - rPos) * 0.010417; Takes the (avatars position - position of scanner) &amp;amp; multiplies by (radius of the distance you want the balls to go(2 meter sphere = 1 meter radius)/scan range(96meters)):&lt;br /&gt;
&lt;br /&gt;
1/96 = approximately 0.010417.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
//                3D Radar 2.5&lt;br /&gt;
//                 &amp;quot;Oct 15 2008&amp;quot;, &amp;quot;18:43:28&amp;quot;&lt;br /&gt;
//                 Creator: Jesse Barnett&lt;br /&gt;
//                Released into the Public Domain&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
 &lt;br /&gt;
integer Scan = TRUE;&lt;br /&gt;
string avKey;&lt;br /&gt;
integer list_pos;&lt;br /&gt;
list key_list;&lt;br /&gt;
integer key_chan;    //Key channel is generated randomly and passed to the scan ball&lt;br /&gt;
integer die_chan = -9423753;    //Hey pick your own channels and be sure to paste them into the scan balls too!&lt;br /&gt;
integer key_rem_chan = -49222879;&lt;br /&gt;
 &lt;br /&gt;
default &lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
    touch_start(integer total_number) &lt;br /&gt;
    {&lt;br /&gt;
        if (Scan) &lt;br /&gt;
        {&lt;br /&gt;
            llSensorRepeat(&amp;quot;&amp;quot;, &amp;quot;&amp;quot;, AGENT, 96, PI, 1);&lt;br /&gt;
            key_list =[];&lt;br /&gt;
            llListen(key_rem_chan, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
            llOwnerSay(&amp;quot;on&amp;quot;);&lt;br /&gt;
            Scan = FALSE;&lt;br /&gt;
        }&lt;br /&gt;
        else &lt;br /&gt;
        {&lt;br /&gt;
            llSensorRemove();&lt;br /&gt;
            llRegionSay(die_chan, &amp;quot;die&amp;quot;);&lt;br /&gt;
            llOwnerSay(&amp;quot;off&amp;quot;);&lt;br /&gt;
            Scan = TRUE;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    sensor(integer iNum) &lt;br /&gt;
    {&lt;br /&gt;
        integer p = 0;&lt;br /&gt;
        for (p = 0; p &amp;lt; iNum; ++p) &lt;br /&gt;
        {&lt;br /&gt;
            avKey = llDetectedKey(p);&lt;br /&gt;
            list_pos = llListFindList(key_list, (list)avKey);&lt;br /&gt;
            if (list_pos == -1) &lt;br /&gt;
            {&lt;br /&gt;
                key_list += (list) avKey;&lt;br /&gt;
                key_chan = (integer) llFrand(-1000000) - 1000000;&lt;br /&gt;
                llRezObject(&amp;quot;scan ball&amp;quot;, llGetPos(), ZERO_VECTOR, ZERO_ROTATION, key_chan);&lt;br /&gt;
                llSleep(.25);&lt;br /&gt;
                llRegionSay(key_chan, avKey);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    listen(integer c, string name, key id, string msg) &lt;br /&gt;
    {&lt;br /&gt;
        integer r = llListFindList(key_list,[(key)msg]);&lt;br /&gt;
        key_list = llDeleteSubList(key_list, r, r);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Scan Ball Script==&lt;br /&gt;
Place this script in a prim and then place the prim into the inventory of the Scanner/Rezzer. It will automatically name itself.&lt;br /&gt;
&lt;br /&gt;
Suggestion; Create a sphere prim of 0.05 diameter with glow set about .80.&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
//                3D Radar 2.5&lt;br /&gt;
//                 &amp;quot;Oct 15 2008&amp;quot;, &amp;quot;18:44:36&amp;quot;&lt;br /&gt;
//                 Creator: Jesse Barnett&lt;br /&gt;
//                Released into the Public Domain&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
string avName;&lt;br /&gt;
integer avDistance;&lt;br /&gt;
key avKey;&lt;br /&gt;
integer avListen;&lt;br /&gt;
integer key_chan;&lt;br /&gt;
integer die_chan = -9423753;&lt;br /&gt;
integer key_rem_chan = -49222879;&lt;br /&gt;
vector avPos;&lt;br /&gt;
vector rPos;&lt;br /&gt;
key owner;&lt;br /&gt;
 &lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSetObjectName(&amp;quot;scan ball&amp;quot;); //Renames the object to &amp;quot;scan ball&amp;quot;&lt;br /&gt;
        owner = llGetOwner(); // Lets check to see what the key of the owner of the object is and save it for later&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    on_rez(integer start_param)&lt;br /&gt;
    {&lt;br /&gt;
        rPos = llGetPos();&lt;br /&gt;
        key_chan = start_param;&lt;br /&gt;
        llListen(die_chan, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
        avListen = llListen(key_chan, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    listen(integer c, string n, key id, string msg)&lt;br /&gt;
    {&lt;br /&gt;
        if (c == die_chan &amp;amp;&amp;amp; msg == &amp;quot;die&amp;quot; &amp;amp;&amp;amp; owner == llDetectedOwner(0)) //Lets check to see if the message we heard matches all the criteria for the kill command&lt;br /&gt;
        {                                                                 //(Right channel, right message and from radar owned by same owner)&lt;br /&gt;
            llDie();&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            avKey = (key) msg;&lt;br /&gt;
            avName = llKey2Name(avKey);&lt;br /&gt;
            llSensorRepeat(&amp;quot;&amp;quot;, avKey, AGENT, 96, PI, 1.0);&lt;br /&gt;
            llListenRemove(avListen);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    sensor(integer n)&lt;br /&gt;
    {&lt;br /&gt;
        avPos = llDetectedPos(0);&lt;br /&gt;
        vector avDivPos = (avPos - rPos) / (96 / 1);    //Scan range/Radius of large sphere&lt;br /&gt;
        avDistance = (integer) llVecDist(rPos, llDetectedPos(0));&lt;br /&gt;
        llSetPos(rPos + avDivPos);&lt;br /&gt;
        llSetText(avName + &amp;quot;[&amp;quot; + (string) avDistance + &amp;quot;]&amp;quot;, &amp;lt;1, 1, 1 &amp;gt;, 1);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    no_sensor()&lt;br /&gt;
    {&lt;br /&gt;
        llRegionSay(key_rem_chan, avKey);&lt;br /&gt;
        llDie();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
{{LSLC|Library|3D Radar}}&lt;/div&gt;</summary>
		<author><name>Omei Qunhua</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=3D_Radar&amp;diff=1193241</id>
		<title>3D Radar</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=3D_Radar&amp;diff=1193241"/>
		<updated>2014-09-08T10:44:39Z</updated>

		<summary type="html">&lt;p&gt;Omei Qunhua: Correct indenting tab size&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
&lt;br /&gt;
*[[User:Jesse_Barnett|Click Here]]  To see my page and more of my scripts&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Scripts have been corrected and working properly now==&lt;br /&gt;
&lt;br /&gt;
Rezzes a ball for each avatar in range. Each ball tracks it&#039;s on AV and displays distance.&lt;br /&gt;
&lt;br /&gt;
==Scanner/Rezzer Script==&lt;br /&gt;
Place this script in a prim along with the scan ball. When touched it will scan the surrounding area and rezz a ball for each avatar.&lt;br /&gt;
&lt;br /&gt;
Suggestion: Create a sphere with a diameter of  2 meters. Set transparency about 60. Create another sphere about 0.05 diameter, color a dark color and put it in the center of the large prim. Select small prim 1st and then large prim and link them. This will give you a center point to reference. The scan ball script is set to scan for it&#039;s avatar to a range of 96 meters.&lt;br /&gt;
&lt;br /&gt;
This formula: vector avDivPos = (avPos - rPos) * 0.010417; Takes the (avatars position - position of scanner) &amp;amp; multiplies by (radius of the distance you want the balls to go(2 meter sphere = 1 meter radius)/scan range(96meters)):&lt;br /&gt;
&lt;br /&gt;
1/96 = approximately 0.010417.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
//                3D Radar 2.5&lt;br /&gt;
//                 &amp;quot;Oct 15 2008&amp;quot;, &amp;quot;18:43:28&amp;quot;&lt;br /&gt;
//                 Creator: Jesse Barnett&lt;br /&gt;
//                Released into the Public Domain&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
 &lt;br /&gt;
integer Scan = TRUE;&lt;br /&gt;
string avKey;&lt;br /&gt;
integer list_pos;&lt;br /&gt;
list key_list;&lt;br /&gt;
integer key_chan;    //Key channel is generated randomly and passed to the scan ball&lt;br /&gt;
integer die_chan = -9423753;    //Hey pick your own channels and be sure to paste them into the scan balls too!&lt;br /&gt;
integer key_rem_chan = -49222879;&lt;br /&gt;
 &lt;br /&gt;
default &lt;br /&gt;
{&lt;br /&gt;
 &lt;br /&gt;
    touch_start(integer total_number) &lt;br /&gt;
    {&lt;br /&gt;
        if (Scan) &lt;br /&gt;
        {&lt;br /&gt;
            llSensorRepeat(&amp;quot;&amp;quot;, &amp;quot;&amp;quot;, AGENT, 96, PI, 1);&lt;br /&gt;
            key_list =[];&lt;br /&gt;
            llListen(key_rem_chan, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
            llOwnerSay(&amp;quot;on&amp;quot;);&lt;br /&gt;
            Scan = FALSE;&lt;br /&gt;
        }&lt;br /&gt;
        else &lt;br /&gt;
        {&lt;br /&gt;
            llSensorRemove();&lt;br /&gt;
            llRegionSay(die_chan, &amp;quot;die&amp;quot;);&lt;br /&gt;
            llOwnerSay(&amp;quot;off&amp;quot;);&lt;br /&gt;
            Scan = TRUE;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    sensor(integer iNum) &lt;br /&gt;
    {&lt;br /&gt;
        integer p = 0;&lt;br /&gt;
        for (p = 0; p &amp;lt; iNum; ++p) &lt;br /&gt;
        {&lt;br /&gt;
            avKey = llDetectedKey(p);&lt;br /&gt;
            list_pos = llListFindList(key_list, (list)avKey);&lt;br /&gt;
            if (list_pos == -1) &lt;br /&gt;
            {&lt;br /&gt;
                key_list += (list) avKey;&lt;br /&gt;
                key_chan = (integer) llFrand(-1000000) - 1000000;&lt;br /&gt;
                llRezObject(&amp;quot;scan ball&amp;quot;, llGetPos(), ZERO_VECTOR, ZERO_ROTATION, key_chan);&lt;br /&gt;
                llSleep(.25);&lt;br /&gt;
                llRegionSay(key_chan, avKey);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    listen(integer c, string name, key id, string msg) &lt;br /&gt;
    {&lt;br /&gt;
        integer r = llListFindList(key_list,[(key)msg]);&lt;br /&gt;
        key_list = llDeleteSubList(key_list, r, r);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Scan Ball Script==&lt;br /&gt;
Place this script in a prim and make sure to name it &amp;quot;scan ball&amp;quot;. Then place the prim into the inventory of the Scanner/Rezzer. &lt;br /&gt;
&lt;br /&gt;
Suggestion; Create a sphere prim of 0.05 diameter with glow set about .80.&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
//                3D Radar 2.5&lt;br /&gt;
//                 &amp;quot;Oct 15 2008&amp;quot;, &amp;quot;18:44:36&amp;quot;&lt;br /&gt;
//                 Creator: Jesse Barnett&lt;br /&gt;
//                Released into the Public Domain&lt;br /&gt;
//////////////////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
string avName;&lt;br /&gt;
integer avDistance;&lt;br /&gt;
key avKey;&lt;br /&gt;
integer avListen;&lt;br /&gt;
integer key_chan;&lt;br /&gt;
integer die_chan = -9423753;&lt;br /&gt;
integer key_rem_chan = -49222879;&lt;br /&gt;
vector avPos;&lt;br /&gt;
vector rPos;&lt;br /&gt;
key owner;&lt;br /&gt;
 &lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        owner = llGetOwner(); // Lets check to see what the key of the owner of the object is and save it for later&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    on_rez(integer start_param)&lt;br /&gt;
    {&lt;br /&gt;
        rPos = llGetPos();&lt;br /&gt;
        key_chan = start_param;&lt;br /&gt;
        llListen(die_chan, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
        avListen = llListen(key_chan, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    listen(integer c, string n, key id, string msg)&lt;br /&gt;
    {&lt;br /&gt;
        if (c == die_chan &amp;amp;&amp;amp; msg == &amp;quot;die&amp;quot; &amp;amp;&amp;amp; owner == llDetectedOwner(0)) //Lets check to see if the message we heard matches all the criteria for the kill command&lt;br /&gt;
        {                                                                 //(Right channel, right message and from radar owned by same owner)&lt;br /&gt;
            llDie();&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            avKey = (key) msg;&lt;br /&gt;
            avName = llKey2Name(avKey);&lt;br /&gt;
            llSensorRepeat(&amp;quot;&amp;quot;, avKey, AGENT, 96, PI, 1.0);&lt;br /&gt;
            llListenRemove(avListen);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    sensor(integer n)&lt;br /&gt;
    {&lt;br /&gt;
        avPos = llDetectedPos(0);&lt;br /&gt;
        vector avDivPos = (avPos - rPos) / (96 / 1);    //Scan range/Radius of large sphere&lt;br /&gt;
        avDistance = (integer) llVecDist(rPos, llDetectedPos(0));&lt;br /&gt;
        llSetPos(rPos + avDivPos);&lt;br /&gt;
        llSetText(avName + &amp;quot;[&amp;quot; + (string) avDistance + &amp;quot;]&amp;quot;, &amp;lt;1, 1, 1 &amp;gt;, 1);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    no_sensor()&lt;br /&gt;
    {&lt;br /&gt;
        llRegionSay(key_rem_chan, avKey);&lt;br /&gt;
        llDie();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
{{LSLC|Library|3D Radar}}&lt;/div&gt;</summary>
		<author><name>Omei Qunhua</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=How_to_Earn_Linden_Dollars_in_Second_Life&amp;diff=1191747</id>
		<title>How to Earn Linden Dollars in Second Life</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=How_to_Earn_Linden_Dollars_in_Second_Life&amp;diff=1191747"/>
		<updated>2014-07-06T13:19:23Z</updated>

		<summary type="html">&lt;p&gt;Omei Qunhua: /* Lotteries */  It&amp;#039;s not a violation of a game, it&amp;#039; a violation of LL&amp;#039;s wagering policies.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{KBcaution|The majority of this wiki&#039;s content (like SL itself) is Resident-created and while it may be helpful, Linden Labs won&#039;t vouch for its accuracy. For official documentation, see the &#039;&#039;&#039;[http://community.secondlife.com/t5/English-Knowledge-Base/tkb-p/English_KB%40tkb Second Life Knowledge Base]&#039;&#039;&#039;.}}&lt;br /&gt;
&lt;br /&gt;
[[File:lindenrealms.png|frame|alt=linden realms|The [http://secondlife.com/destinations/realms Linden Realms] are a great way to earn linden while having fun exploring some beautiful fantasy sims.]]&lt;br /&gt;
&lt;br /&gt;
[[File:goldhunt.png|frame|alt=gold hunt|The [http://www.goldtokens.net/games/gold-hunt Gold Hunt] game allows you to earn linden by searching for coins around the grid. It&#039;s a great way to explore the grid and take you to new places.]]&lt;br /&gt;
[[File:fishhunt.png|frame|alt=fish hunt|The [http://www.goldtokens.net/games/fish-hunt Fish Hunt] game is a great way to meet other players and compete. It&#039;s also really popular with players with disabilities as its very easy to play.]]&lt;br /&gt;
[[File:moneytrees.png|frame|alt=money trees|[http://moneytree.wolfhavenproductions.com Money Trees] are a great way for new players to earn linden by picking linden from trees around the grid. Older players aren&#039;t allowed to use Money Trees.]]&lt;br /&gt;
[[File:capexhq.png|frame|alt=capital exchange|The [http://www.slcapex.com/ Capital Exchange] allows you to invest and speculate on virtual companies in Second Life.]]&lt;br /&gt;
[[File:sploders.png|frame|alt=sploders|Sploders are a way of earning small amounts of linden when out at a club or party. They are a good way to meet other players and get chatting.]]&lt;br /&gt;
&lt;br /&gt;
Second Life is full of opportunities to earn Linden Dollars, but it is also important to [https://wiki.secondlife.com/wiki/How_to_Have_Fun_in_Second_Life have fun] while earning. Some players make the mistake of thinking that they have to do something they don&#039;t enjoy to make money in Second Life. That&#039;s simply is not the case.&lt;br /&gt;
&lt;br /&gt;
Sometimes it can feel overwhelmingly challenging to earn linden in Second Life, but with the right information to hand and some ample determination you can make money. &lt;br /&gt;
&lt;br /&gt;
= Get Paid a Weekly Stipend =&lt;br /&gt;
&lt;br /&gt;
Players who upgrade their account to be a [http://secondlife.com/premium/ Premium Account] are paid a stipend to their account on a weekly basis.&lt;br /&gt;
&lt;br /&gt;
= Buy Linden on the LindeX =&lt;br /&gt;
&lt;br /&gt;
You can buy linden whenever you want on the [https://secondlife.com/my/lindex/market.php LindeX] exchange. However, there are [https://secondlife.com/my/lindex/describe-limits.php billing and trading] limits.&lt;br /&gt;
&lt;br /&gt;
= Earn Linden Playing Fun Games =&lt;br /&gt;
&lt;br /&gt;
== ADS Goldtokens Gaming Network ==&lt;br /&gt;
&lt;br /&gt;
The following games are run by ADS, the leader in earning linden games. The [http://www.goldtokens.net Goldtokens.net] Gaming Network was a community created by [http://www.secondads.com/ SecondAds] company with the goal of helping new players earn their first linden dollars. It&#039;s not just for new players though. Thousands of experienced players enjoy competing for leaderboard positions and earning large sums of linden in the process.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Gold Hunt&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The [http://www.goldtokens.net/games/gold-hunt Gold Hunt] allows players to earn linden and win random gifts by hunting for coins and gems that are hidden by landowners. There are literally 1,000s of lands with coins available right across the grid, which can be discovered by using the player HUD. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Regulatory warning.&#039;&#039;&#039; For an active participation in this activity, it is necessary to make an upfront investment of Linden on a continued basis into virtual items, specifically worms bait. It is also possible to invest into virtual items that can enhance your performance in this activity either temporarily (e.g. premium worms bait, potions, etc.) or permanently (e.g. premium fishing rods; so called &amp;quot;Snubbies&amp;quot; etc.). You may get back less than what you invested.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Fish Hunt&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The [http://www.goldtokens.net/games/fish-hunt Fish Hunt] allows players to earn Linden and win Random Gifts by fishing. There are literally 1,000s of lands with fish buoys available right across the grid, which can be discovered by using the player HUD. You&#039;ll also need to get a free beginner fishing rod too.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Farm Frenzy&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[http://www.goldtokens.net/games/farm-frenzy Farm Frenzy] gives land owners the opportunity to earn linden by farming worms for use in the [http://www.goldtokens.net/games/fish-hunt Fish Hunt]. It takes time to develop your Farming Experience, but eventually you&#039;ll be able to dominate the farming industry and sell your produce to the masses. Fortunes have been made in the farming industry!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Regulatory warning.&#039;&#039;&#039; It is mandatory to make an upfront investment of Linden into virtual items, specifically worm farms, worm packs and clean water to participate in this activity, and you may get back less than what you invested.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Noob Hunt&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The [http://www.goldtokens.net Noob Hunt] is an affiliate recruitment scheme for the Goldtokens.net gaming network which allows players to become masters and recruit apprentices for the various games hosted on the network. In return they earn a percentage of each of their apprentices&#039; winnings. You can also sell your apprentices to other masters on the exchange.&lt;br /&gt;
&lt;br /&gt;
== Bletaverse ==&lt;br /&gt;
&lt;br /&gt;
[http://bletaverse.com/ Bletaverse] company have a number of ways of earning linden such as waiting at traffic cones and they also run a social network that players can get involved in.&lt;br /&gt;
&lt;br /&gt;
== Dragons &amp;amp; Princesses ==&lt;br /&gt;
&lt;br /&gt;
The [http://www.dragons.sl/docs/Index Dragons &amp;amp; Princesses] is a cool game developed by [http://www.e2l-net.com/ Earn2Life] company that allows you to earn linden by hunting for voids on different lands around Second Life.&lt;br /&gt;
&lt;br /&gt;
== Linden Realms ==&lt;br /&gt;
&lt;br /&gt;
The [http://secondlife.com/destinations/realms Linden Realms] were created by Linden Lab and are designed with a beautiful environment that has trees, cliffs, and lots of fun places to explore. You can use a teleporter to visit different areas of the Linden Realms. Each place has different quests and other activities that are fun and exciting to do. There are rock monsters that you will have to run away from and pools of toxic water to avoid.&lt;br /&gt;
&lt;br /&gt;
== Money Trees ==&lt;br /&gt;
&lt;br /&gt;
[http://moneytree.wolfhavenproductions.com Money Trees] were created by [http://wolfhavenproductions.com Wolfhaven Productions] and allow players to earn linden by plucking dollar bills and other game items from trees that are planted in sims all around the grid. There is a HUD you can wear to tell you where to find new trees. However, many trees are age-limited, so only very new players can use them.&lt;br /&gt;
&lt;br /&gt;
== The Second Farm ==&lt;br /&gt;
&lt;br /&gt;
The [http://thesecondfarm.com/ The Second Farm] is a campany that created Magic Crystal and Magic Fishing Games. &lt;br /&gt;
It is a great way to helping new Second Life Residents to earn linden dollars.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Magic Crystals&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
This is a very fun game, you meet wonderful places and can still make magic stars. With these stars you earn more money and even more points for the [http://www.thesecondfarm.com/rank/mctop.php Magic Crystal Rankings]. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Magic Fishing&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Magic fishing is a new way to earn lidens by fishing.&lt;br /&gt;
You need only a free rod to start and one HUD to find locations to fish.&lt;br /&gt;
&lt;br /&gt;
= Earn Linden Working a Job =&lt;br /&gt;
&lt;br /&gt;
A large proportion of players have some form of [https://wiki.secondlife.com/wiki/Guide_to_Jobs_in_Second_Life Second Life Job] as a means to earn linden. This can be a rewarding way to earn linden and if you have the right ideas you can even become an entrepreneur and start your own business.&lt;br /&gt;
&lt;br /&gt;
= Activity Devices =&lt;br /&gt;
&lt;br /&gt;
There are a wide range of devices that allow you to make money via certain activities. In the order of decreasing interactivity these are:&lt;br /&gt;
&lt;br /&gt;
== Skill Games ==&lt;br /&gt;
&lt;br /&gt;
There are a wide range of skill game machines where Linden can be earned. While these games may resemble real-world casino game machines, they should all comply with {{LLOlink|Policy Regarding Wagering in Second Life|Wagering policy}} and {{LLOlink|Skill Game Compliance}}.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Regulatory warning.&#039;&#039;&#039; It is mandatory to make an upfront investment of Linden into many of these game machines to play the skill game, and you may get back less than what you invested. The only exception is machines in &#039;free-play&#039; mode, where an investment is either not required, or is guaranteed to be paid back to you, however no earnings can be achieved from machines operating in this mode.&lt;br /&gt;
&lt;br /&gt;
== Chatting ==&lt;br /&gt;
&lt;br /&gt;
There are a wide range of Chat Sploders such as the ever popular [http://www.secondads.com/chatsploder.php Chatsploder Network] available in various clubs and other areas. These allow you to earn linden by waiting for the &#039;explosion&#039; which may take quite some time. In the mean time you can chat and make new friends.&lt;br /&gt;
&lt;br /&gt;
== Lotteries ==&lt;br /&gt;
&lt;br /&gt;
These are devices where players first make contributions to an aggregated pot. Once the pot exceeds a threshold, a countdown to an &#039;explosion&#039; begins (such as 3 mins) during which further contributions are typically still accepted. At the &#039;explosion&#039; the pot is randomly distributed between contributors. &lt;br /&gt;
UPDATE: Be aware of LL&#039;s wagering policies as paying to win on a game of chance such as a sploder or lottery can be interpreted as a violation. &lt;br /&gt;
There are free sploders which are used to generate traffic that cost nothing to play which are legal. {{LLOlink|Policy Regarding Wagering in Second Life|Wagering policy}} and {{LLOlink|Skill Game Compliance}}.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Regulatory warning.&#039;&#039;&#039; It is mandatory to make an upfront investment of Linden into the aggregated pot to participate in this activity, and generally you may get back less than what you invested. However there are some devices that guarantee a minimum payout that is equal to the minimum contribution, please check device-generated chat messages.&lt;br /&gt;
&lt;br /&gt;
== Camping  ==&lt;br /&gt;
&lt;br /&gt;
These allow you to earn Linden or prizes for camping, e.g. sitting chairs or touch Sploders, which you have to touch to begin a countdown to an &#039;explosion&#039; at the end of which a landowner&#039;s pot of money is randomly distributed between touchers. Some of these devices have you earn Linden, others have you earning other things such as new skins, clothes or other virtual game items. All you have to do touch them or sit on them, then continue camping on them (or reasonably close to some others) for the required amount of time to earn your prize. While some opine it is the least fun way to earn Linden ever invented due to lack of interaction with these devices during the camping time, others argue that it is just as much fun as any other activity, because while camping you are still free to chat and make new friends. A further advantage is that it is a relatively simpler way that does not require much time or physical input, and is therefore quite suitable for people with disabilities.&lt;br /&gt;
&lt;br /&gt;
== Area Camping ==&lt;br /&gt;
&lt;br /&gt;
These are similar to camping devices above, except that you simply need to be present on the land within a certain proximity of the device for the required amount of time to earn your prize, which is typically awarded to a resident chosen at random. These include Random Money Givers, and sometimes require that you become a member of the group owning the land, or add the land to the list of your SL Picks in order to be considered for an award.&lt;br /&gt;
&lt;br /&gt;
= Completing Surveys, Surfing Sites &amp;amp; Web Offers =&lt;br /&gt;
&lt;br /&gt;
It is possible to earn linden by completing surveys, surfing websites or filling web offers. Unfortunately this can be very haphazard and you may not receive payment if you don&#039;t fit the demographic that the company is looking for.&lt;br /&gt;
&lt;br /&gt;
= Investing =&lt;br /&gt;
&lt;br /&gt;
If you have some capital to invest you can simply invest in one of the companies listed on the [http://www.slcapex.com/ Capital Exchange] and then hope to earn dividends over time. You can either try to earn Linden by making a long term investment, or you can speculate on daily market movements.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Regulatory warning.&#039;&#039;&#039; The value of investments and the income from them can fall as well as rise, and you may get back less than what you invested.&lt;br /&gt;
&lt;br /&gt;
= External Articles &amp;amp; Sites=&lt;br /&gt;
&lt;br /&gt;
Please share your external sites and articles here with information on how to earn linden dollars in Second Life here:&lt;br /&gt;
&lt;br /&gt;
== Sites ==&lt;br /&gt;
* [http://bletaverse.com/ Bletaverse] - Earn linden while exploring SL without having to make an investment.&lt;br /&gt;
* [http://www.e2l-net.com/ Earn2life] - Earn linden on earning programs&lt;br /&gt;
* [http://www.goldtokens.net Goldtokens] - Earn linden playing fun games (some games require an upfront investment).&lt;br /&gt;
* [http://www.thesecondfarm.com/ The Second Farm] - Earn linden Hunting Magic Crystals.&lt;br /&gt;
* [http://wolfhavenproductions.com Wolfhaven Productions] - The creators of money trees&lt;br /&gt;
&lt;br /&gt;
== Articles ==&lt;br /&gt;
&lt;br /&gt;
* [http://www.goldtokens.net/blogs/110/10-ways-to-earn-linden-in-second-life 10 Ways to Earn Linden in Second Life] - 10 ways to Earn Linden in Second Life&lt;br /&gt;
* [http://www.chickjunk.com/make-money-in-second-life/ How to Make Money In Second Life] - How to get started and earn linden in Second Life&lt;br /&gt;
* [http://personalweb.about.com/od/virtualworlds/a/sl_makemoney.htm Make Money in Second Life] - A good list of methods to earn money&lt;/div&gt;</summary>
		<author><name>Omei Qunhua</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlUnSit&amp;diff=1191736</id>
		<title>LlUnSit</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlUnSit&amp;diff=1191736"/>
		<updated>2014-07-04T22:50:53Z</updated>

		<summary type="html">&lt;p&gt;Omei Qunhua: Clarify function description&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function&lt;br /&gt;
|inject-2={{Issues/SVC-924}}{{LSL_Function/avatar|id|sim=*}}&lt;br /&gt;
|func_id=220|func_sleep=0.0|func_energy=10.0&lt;br /&gt;
|sort=UnSit|func=llUnSit&lt;br /&gt;
|p1_type=key|p1_name=id&lt;br /&gt;
|func_footnote&lt;br /&gt;
|func_desc=The agent identified by {{LSLP|id}} is forced to stand up if any of the following apply:-&lt;br /&gt;
:1. The agent is sitting on the scripted object&lt;br /&gt;
:2. The agent is wearing the scripted object&lt;br /&gt;
:3. The agent is over land owned by the scripted object&#039;s owner&lt;br /&gt;
|return_text&lt;br /&gt;
|spec&lt;br /&gt;
|caveats&lt;br /&gt;
|constants&lt;br /&gt;
|examples=&lt;br /&gt;
&amp;lt;lsl&amp;gt;// UnSit on Sit, Using a sit target&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSitTarget(&amp;lt;0.0, 0.0, 0.1&amp;gt;, ZERO_ROTATION); // Needed for llAvatarOnSitTarget to work. The vectors components must not all be set to 0.0&lt;br /&gt;
    }&lt;br /&gt;
    changed(integer change) // Triggered when various changes are sensed.&lt;br /&gt;
    {&lt;br /&gt;
        if(change &amp;amp; CHANGED_LINK) // When an agent sits on an object they become a new link.&lt;br /&gt;
        {&lt;br /&gt;
            key user = llAvatarOnSitTarget(); // Store the UUID of any agent sitting on the sit target.&lt;br /&gt;
            if(user) // An avatar is on the sit target.&lt;br /&gt;
                llUnSit(user); // Un-Sit the avatar.&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&amp;lt;lsl&amp;gt;// UnSit on Sit, NOT using a sit target&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    changed(integer change) // Triggered when various changes are sensed.&lt;br /&gt;
    {&lt;br /&gt;
        if(change &amp;amp; CHANGED_LINK) // When an agent sits on an object they become a new link.&lt;br /&gt;
        {&lt;br /&gt;
            integer links = 0; // Create an integer type variable.&lt;br /&gt;
            if(llGetObjectPrimCount(llGetKey()) &amp;lt; (links = llGetNumberOfPrims())) // During the check store the number of links.&lt;br /&gt;
            // If the number of prims is fewer than the number of links, the last must be an avatar.&lt;br /&gt;
                llUnSit(llGetLinkKey(links)); // Use the key of the last link to be added (the avatar) to call llUnSit().&lt;br /&gt;
            else&lt;br /&gt;
                llOwnerSay(&amp;quot;Some kind of linking or unlinking has changed me but, I am not being sat on.&amp;quot;);&lt;br /&gt;
            // llUnSit() triggers the changed event too (the number of links is reduced by 1).&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
unsit_all_avatars()&lt;br /&gt;
{&lt;br /&gt;
    integer objectPrimCount = llGetObjectPrimCount(llGetKey());&lt;br /&gt;
    integer currentLinkNumber = llGetNumberOfPrims();&lt;br /&gt;
&lt;br /&gt;
    for (; objectPrimCount &amp;lt; currentLinkNumber; --currentLinkNumber)&lt;br /&gt;
        llUnSit(llGetLinkKey(currentLinkNumber));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    touch_start(integer num_detected)&lt;br /&gt;
    {&lt;br /&gt;
        unsit_all_avatars();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// Unsit the attached Avatar&lt;br /&gt;
// Note this method is preferable to the RLV Command @unsit=force, due to it&#039;s success rate at actually completing&lt;br /&gt;
&lt;br /&gt;
default {&lt;br /&gt;
  touch_start(integer num_detected)&lt;br /&gt;
  {&lt;br /&gt;
     if(llGetAttached()!=0) llUnSit(llGetOwner());&lt;br /&gt;
  }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|helpers&lt;br /&gt;
|also_functions={{LSL DefineRow||[[llAvatarOnSitTarget]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llSitTarget]]|}}&lt;br /&gt;
|also_events={{LSL DefineRow||[[changed]]|}}&lt;br /&gt;
|also_articles&lt;br /&gt;
|also_tests&lt;br /&gt;
|notes&lt;br /&gt;
|permission&lt;br /&gt;
|negative_index&lt;br /&gt;
|cat1=Parcel&lt;br /&gt;
|cat2=Sit&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
|haiku={{Haiku|Beauty at the bar|Not an empty seat in sight.|Owner clears me one.}}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Omei Qunhua</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Talk:LlUnSit&amp;diff=1191728</id>
		<title>Talk:LlUnSit</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Talk:LlUnSit&amp;diff=1191728"/>
		<updated>2014-07-04T09:24:44Z</updated>

		<summary type="html">&lt;p&gt;Omei Qunhua: suggestion&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Not having the conditionals indented is confusing to new scripters. [[User:Strife Onizuka|Strife Onizuka]] 00:47, 26 February 2007 (PST)&lt;br /&gt;
&lt;br /&gt;
I am a &#039;&#039;somewhat&#039;&#039; novice scripter and I was wondering if there is any particular reason for adding the key rather just leaving it to identify llAvatarOnSitTarget the way it was before you edited it. --[[User:Carigorp Matzerath|Carigorp Matzerath]] 11:14, 26 February 2007 (PST)&lt;br /&gt;
&lt;br /&gt;
The LSL compiler does not optimize code. It should make the code run faster. Keep up the good work writing examples, we need lots of them. [[User:Strife Onizuka|Strife Onizuka]] 11:39, 26 February 2007 (PST)&lt;br /&gt;
&lt;br /&gt;
==Function description/caveat==&lt;br /&gt;
Would this be better wording for the description, and remove the caveat?&lt;br /&gt;
&lt;br /&gt;
:The agent id is unseated if any of the following apply:-&lt;br /&gt;
::1. The agent is sitting on the scripted object&lt;br /&gt;
::2. The agent is wearing the scripted object&lt;br /&gt;
::3. The agent is over land owned by the scripted object&#039;s owner&lt;br /&gt;
:[[User:Omei Qunhua|Omei Qunhua]] 02:24, 4 July 2014 (PDT)&lt;/div&gt;</summary>
		<author><name>Omei Qunhua</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Talk:Jump_Teleport&amp;diff=1191685</id>
		<title>Talk:Jump Teleport</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Talk:Jump_Teleport&amp;diff=1191685"/>
		<updated>2014-06-30T15:06:06Z</updated>

		<summary type="html">&lt;p&gt;Omei Qunhua: comments&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Just happened by this page browsing for something else for someone and thought I should comment.&lt;br /&gt;
&lt;br /&gt;
 Teleporters in Second Life have been plagued with the use of warpPos function which, although it is supposed&lt;br /&gt;
 to accomplish a simple task, the implementation is obfuscated with magic numbers, the design is very poor and&lt;br /&gt;
 funny effects are acheived. Here is a rundown of the problems with warpPos:&lt;br /&gt;
&lt;br /&gt;
First off, at the time it was written, &amp;quot;teleporting&amp;quot; was accomplished by sitting on a prim, and having it cycle through [[llSetPos]] 10m hops in a loop until [[llGetPos]] was very close to the destination, like so:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;OLD_teleport(vector dest) {&lt;br /&gt;
   while (llVecDist(llGetPos(),dest) &amp;gt; 0.1)&lt;br /&gt;
     llSetPos(dest);&lt;br /&gt;
 }&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The movement was slow and jerky, and could take many seconds to complete long jumps, due to the enforced 0.2s delay on [[llSetPos]]. Then, [[llSetPrimitiveParams]] was introduced, and [[User:Keknehv Psaltery|Keknehv Psaltery]] discovered a rather amazing side-effect of it: when you put multiple [[PRIM_POSITION]] rules in a list, it would accumulate them and move the prim in one go. Each rule still had the 10m limit check, but it didn&#039;t apply the prim position move until it finished parsing the rule list, so it got around that issue. It was a fantastically useful and positive change, despite it essentially being a hack -- an endrun around LL&#039;s imposed limitations on prim movement.&lt;br /&gt;
&lt;br /&gt;
After he published the discovery, other folks ([[User:Strife Onizuka|Strife]], [[User:Talarus Luan|myself]], and others) found ways to optimize the script for speed and to make sure to keep the number of generated rules to a minimum. Optimizing code has the unfortunate side-effect of making it more difficult to understand, but the goal was to make something that people could use with some degree of confidence that it was using the least resources possible.&lt;br /&gt;
&lt;br /&gt;
When you say the &amp;quot;design is very poor&amp;quot;, I think you may be judging it a) without knowing its history, and b) by comparing it to a more modern standard (6 years later, in fact). Also, pointing out obfuscation in highly-optimized code is a priori -- that&#039;s fairly typical. There have been a number of dissections and explanations of the code posted in various forums over the years for neophyte scripters, although there is little in it which should be opaque to scripters of intermediate skill. However, I am happy to address it here, once again, for the reader&#039;s satisfaction. :)&lt;br /&gt;
&lt;br /&gt;
 The code mentions: &lt;br /&gt;
&lt;br /&gt;
    // Try and avoid stack/heap collisions&lt;br /&gt;
     if (jumps &amp;gt; 411)&lt;br /&gt;
         jumps = 411&lt;br /&gt;
&lt;br /&gt;
 with no explanation whatsoever about what that means and why an overflow occurs. &lt;br /&gt;
&lt;br /&gt;
Again, the goal of the optimized version of the code wasn&#039;t to educate, but to provide a useful, efficient, and effective drop-in function for people to use. Even still, it isn&#039;t difficult to discern why an overflow might occur from looking at the code, hence:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&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;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
It is building a list of rules, pretty much by doubling the size of the list every iteration through that loop. When it was written, Mono didn&#039;t exist yet, so each script had only 16k of memory. Building big lists like this was hazardous, and could easily cause out-of-memory errors for even a moderately long teleport. Thus, limiting the size of the list was pretty important, so that check was added in an attempt to curb the occurrence of such errors. The original limit was much lower, but once Mono came out, it allowed for longer jumps. The &amp;quot;magic number&amp;quot; originally was based on keeping the script within the 16k limit, but with Mono&#039;s quadrupling of available memory, it became more of an &amp;quot;oops&amp;quot; check. You see, non-physical movement is only possible up to 4096m in the Z. Thus, the largest non-physical teleport length is from &amp;lt;0.0, 0.0, 0.0&amp;gt; to &amp;lt;256.0, 256.0, 4096.0&amp;gt;, or approximately 4112m, which means that, with 10m jumps, the maximum would be ~411 jumps. So even though 411 jumps won&#039;t necessarily cause Mono to run out of memory (with a simple TP script, anyway), it prevents someone who might accidentally specify a far larger teleport distance from causing their script to crash in this function. Out of memory errors are notoriously difficult to debug, so reducing one avenue of cause was a worthwhile endeavor.&lt;br /&gt;
&lt;br /&gt;
 warpPos calculates the number of jumps necessary and then proceeds to jump 10 meters in the calculated direction without even accounting for affinity.&lt;br /&gt;
&lt;br /&gt;
Unfortunately, I have no idea what &amp;quot;affinity&amp;quot; refers to in this context, so I can&#039;t really address this issue. However, WarpPos doesn&#039;t jump 10m at a time, it actually jumps the entire distance in a single jump -- in a single [[llSetPrimitiveParams]] call.&lt;br /&gt;
&lt;br /&gt;
 warpPos is based on a function that executes llSetPos calls which has the effect of timing out on OpenSim due to the timeout&lt;br /&gt;
 imposed on event handlers: an event handler just goes away after some time and warpPos will fail for long distances. &lt;br /&gt;
&lt;br /&gt;
While I can&#039;t address issues related to using WarpPos on OpenSim (as it wasn&#039;t written or intended for use on OpenSim), I can state that it does not (originally) use [[llSetPos]]. In more recent iterations of it, someone added a &amp;quot;fallback&amp;quot; to the OLD_Teleport method, which uses [[llSetPos]], mainly to get around the Lindens repeatedly &amp;quot;breaking&amp;quot; the [[llSetPrimitiveParams]] hack over the years, so they don&#039;t have to field lots of angry customer issues every time. Since WarpPos was an exploit of an unintended edge-case, Linden Lab had no responsibility to &amp;quot;fix&amp;quot; it if they &amp;quot;broke&amp;quot; it (except to quell massive resident backlash every time they did), it was conceivable that, at some point, they would leave it &amp;quot;broken&amp;quot;, which meant that a very large number of items all over the grid would stop working. So, for some people, a fallback to the &amp;quot;old tried and true&amp;quot; method was prudent to add afterwards, just in case.&lt;br /&gt;
&lt;br /&gt;
Lastly, I would like to point out that, as of the writing of your original article, WarpPos was already functionally obsolete. Linden Lab added llSetRegionPos(), which pretty much completely deprecated WarpPos. Even still, WarpPos is a [http://en.wikipedia.org/wiki/Lava_flow_%28programming%29 lavaflow] -- LL has broken it a number of times, but has &amp;quot;fixed&amp;quot; it, effectively making it a de facto supported feature. As one of the original scripters who worked on WarpPos, I tell everyone that it is obsolete and not to use it anymore (and have since [[llSetRegionPos]] hit the grid), so any issues with it in SL are effectively moot. Issues with OpenSim I can&#039;t speak to, but I would imagine that [[llSetRegionPos]] functionality has been implemented in the last two years, so even Jump Teleport may also be effectively obsolete as well.&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
Now, to be fair, I would like to offer a critique of your method. :)&lt;br /&gt;
&lt;br /&gt;
 The following code should solve those problems&lt;br /&gt;
&lt;br /&gt;
OK, so to be clear, these are the problems you are addressing with your version:&lt;br /&gt;
&lt;br /&gt;
# Use of undocumented &amp;quot;magic numbers&amp;quot;&lt;br /&gt;
# Jumping without accounting for &amp;quot;affinity&amp;quot;&lt;br /&gt;
# OpenSim event handler timeout issue&lt;br /&gt;
&lt;br /&gt;
 by using vector calculus&lt;br /&gt;
&lt;br /&gt;
Really? O.o&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Vector calculus (or vector analysis) is a branch of mathematics concerned with differentiation and integration of vector fields, primarily in 3-dimensional Euclidean space {R}^3.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
OK, so you probably didn&#039;t use the right word there, but no matter. I&#039;ll let you off the hook for that one. ;)&lt;br /&gt;
&lt;br /&gt;
 and calculating 10 meters in the direction towards the final destination&lt;br /&gt;
&lt;br /&gt;
That sounds familiar. :)&lt;br /&gt;
&lt;br /&gt;
 (the math is explained in the Second Life category). &lt;br /&gt;
&lt;br /&gt;
&amp;lt;nowiki&amp;gt;*chuckles*&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
 The function doing that is jumpGates which recursively computes hops towards the final destination and returns them in a list&lt;br /&gt;
&lt;br /&gt;
Oh dear. :-/ Recursive functions are an interesting CompSci source code &amp;quot;trick&amp;quot;, but they are rarely efficient, and are often fraught with causing more frequent out-of-memory issues than using contextual looping.&lt;br /&gt;
&lt;br /&gt;
 which we process later using a timer. By using a timer we make sure that the handler does not time out and&lt;br /&gt;
 we call that timer using the minimal float value (1.175494351E-38) since there are no limitations on the minimal timer interval.&lt;br /&gt;
&lt;br /&gt;
Now, this part is a rather ingenious solution to the OpenSim event timeout issue, if I understand it correctly.&lt;br /&gt;
&lt;br /&gt;
 When jumping to the next gate, we additionally use the list as a stack in order to pop off the first coordinates and&lt;br /&gt;
 discard them from the list entirely. This makes the script start with an initial memory pool and, as it runs, it frees&lt;br /&gt;
 up memory instead of consuming more and more memory.&lt;br /&gt;
&lt;br /&gt;
Well, while the function is in operation, it shouldn&#039;t use &#039;&#039;more&#039;&#039; memory; once you&#039;ve built the jump list, it shouldn&#039;t grow beyond that. Also, repeated list manipulation is very heavy in terms of overhead -- LSL list manipulation functions do a lot of copying (which can cause out of memory conditions as well), which makes them quite slow. In a time- (as well as resource-)constrained environment, it might have been better to just use a &amp;quot;stack pointer&amp;quot; during the jumps, and then just free the list all at once at the end of the move.&lt;br /&gt;
&lt;br /&gt;
Now, with regards to the actual code, you seem to have addressed the first issue (&amp;quot;magic numbers&amp;quot;) adequately. You code would definitely qualify as an educational tool (in more ways than one, to be sure ;) ). I would argue that using the &amp;quot;smallest float&amp;quot; is a bit unnecessary in a practical sense; 0.001 (1 millisecond) is probably fast enough for practical use in either SL or OpenSim, for the life of those virtual worlds. If you really wanted to be &amp;quot;sure&amp;quot;, using 1.0E-6 or 0.000001 would have been more than sufficient for any possible practical use in the lifetime of any virtual world for the next decade or two.&lt;br /&gt;
&lt;br /&gt;
Regarding the second issue, since I don&#039;t understand the reference (&amp;quot;affinity&amp;quot;), I can&#039;t determine if your code meets that criterion or not.&lt;br /&gt;
&lt;br /&gt;
Regarding the third issue, as I observed above, it appears to be an ingenious solution to that particular problem, so kudos for that, if it worked out. :)&lt;br /&gt;
&lt;br /&gt;
The remaining misgivings I have are to the (unnecessary and expensive) use of recursion, and not addressing LSL&#039;s typically poor list management issues. More often than not, I would expect this code to crash with stack/heap issues, especially for long jumps (in fact, testing it under mono, in a script with just the jumpGates() recursive function and a basic call to it tends to fail on jumps above 3600m). Also, it appears the function always leaves you 1 meter short of your destination.&lt;br /&gt;
&lt;br /&gt;
Using multiple states, beyond unnecessarily using up more memory, also requires a second expensive call to jumpGates(), when you could simply use a stack pointer/index and go in the reverse direction -- from the end of the list back to the beginning. Granted, WarpPos would also require a second list calculation/construction, but if the goal was to make a better WarpPos, might as well go with your strengths, no? (though, technically, WarpPos &#039;&#039;could&#039;&#039; be made to do the same thing with some minimal changes, but that&#039;s outside the scope of this critique).&lt;br /&gt;
&lt;br /&gt;
That&#039;s pretty much all I see in terms of issues in your design and code. The only other issue I would point out is that you need to review your licenses -- the only people who can use your code are people who are also making and releasing open-source products, also under GPL v3.0. I think a more appropriate license would either be LGPL or MIT. However, that&#039;s entirely your call; just something to think about.&lt;br /&gt;
&lt;br /&gt;
In closing, I would recommend to all who come after to consider using [[llSetRegionPos]] and &#039;&#039;&#039;NOT&#039;&#039;&#039; use WarpPos or similar kinds of functions (like this one), as they have been functionally obsoleted by it.&lt;br /&gt;
----&lt;br /&gt;
Now that I have had time to think about it, to solve the OpenSim issue really doesn&#039;t require a jump list at all. This script should effectively do the same thing on OpenSim:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
// This code is an example -- no license is implied or claimed, treat as public domain by me, the author, Talarus Luan&lt;br /&gt;
vector  vStartPos;&lt;br /&gt;
vector  vEndPos;&lt;br /&gt;
integer bReverse;&lt;br /&gt;
float   fDelay = 0.001; // Very fast timer - not normally recommended&lt;br /&gt;
float   fDestEpsilon = 0.1; // &amp;quot;Fuzzy&amp;quot; destination distance to determine if we&#039;ve arrived&lt;br /&gt;
                            // llSetPos and its ilk are not guaranteed to get to exact positions, so a fuzzy comparison is necessary&lt;br /&gt;
float   fJumpDistance = 10.0; // Max SetPos jump distance per hop&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry() {&lt;br /&gt;
        llSitTarget(&amp;lt;0,0.0,1&amp;gt;, ZERO_ROTATION);&lt;br /&gt;
    }&lt;br /&gt;
    changed(integer change) {&lt;br /&gt;
        if (change &amp;amp; CHANGED_LINK) {&lt;br /&gt;
            if(llAvatarOnSitTarget()) {&lt;br /&gt;
                vStartPos = llGetPos();&lt;br /&gt;
                vEndPos = (vector)llGetObjectDesc();&lt;br /&gt;
                bReverse = false;&lt;br /&gt;
                llSetTimerEvent(fDelay);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    timer() {&lt;br /&gt;
        key    kAvatar;&lt;br /&gt;
        float  fRemainingDist;&lt;br /&gt;
        vector vNextPos = ZERO_VECTOR;&lt;br /&gt;
&lt;br /&gt;
        if (bReverse) {&lt;br /&gt;
            fRemainingDist = llVecDist(llGetPos(),vStartPos);&lt;br /&gt;
            if (fRemainingDist &amp;lt; fDestEpsilon) {&lt;br /&gt;
                bReverse = !bReverse;&lt;br /&gt;
                llSetTimerEvent(0.0);&lt;br /&gt;
            } else {&lt;br /&gt;
                if (fRemainingDist &amp;gt; fJumpDistance)&lt;br /&gt;
                    vNextPos = llVecNorm(vStartPos-vEndPos) * fJumpDistance&lt;br /&gt;
                else&lt;br /&gt;
                    vNextPos = vStartPos;&lt;br /&gt;
            }&lt;br /&gt;
        } else {&lt;br /&gt;
            fRemainingDist = llVecDist(llGetPos(),vEndPos);&lt;br /&gt;
            if (fRemainingDist &amp;lt; fDestEpsilon) {&lt;br /&gt;
                bReverse = !bReverse;&lt;br /&gt;
                kAvatar = llAvatarOnSitTarget();&lt;br /&gt;
                if (kAvatar) llUnSit(kAvatar);&lt;br /&gt;
            } else {&lt;br /&gt;
                if (fRemainingDist &amp;gt; fJumpDistance)&lt;br /&gt;
                    vNextPos = llVecNorm(vEndPos-vStartPos) * fJumpDistance&lt;br /&gt;
                else&lt;br /&gt;
                    vNextPos = vEndPos;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        if (llVecMag(vNextPos) != 0.0)&lt;br /&gt;
          llSetLinkPrimitiveParamsFast(LINK_THIS, [PRIM_POSITION, vNextPos]);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note: Untested, so there may be a bug or two in it. Will revise as needed. :)&lt;br /&gt;
&lt;br /&gt;
[[User:Talarus Luan|Talarus Luan]] 12:43, 29 June 2014 (PDT)&lt;br /&gt;
&lt;br /&gt;
:a good response, Talarus. However Kira Komarov got kicked out of slWiki some time ago (tho&#039; probably lurking as some Alt). Unfortunately some people decided to resurrect some of her pages that she had attempted to erase, many of which are not worth the paper they are written on IMHO. &lt;br /&gt;
&lt;br /&gt;
:A couple of comments:-&lt;br /&gt;
::1) In SL at least, the minimum effective timer interval using llSetTimerEvent() is 2 frames, or about 44 mS.&lt;br /&gt;
&lt;br /&gt;
::2) WarpPos always had a little buglet in that the line   &lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
    llSetPrimitiveParams( rules + llList2List( rules, (count - jumps) &amp;lt;&amp;lt; 1, count) );&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
::tries to access an element off the end of the list, fortuitously without mishap. The line could be better coded as&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
    llSetPrimitiveParams( rules + llList2List( rules, (count - jumps) &amp;lt;&amp;lt; 1, -1) );&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
[[User:Omei Qunhua|Omei Qunhua]] 08:06, 30 June 2014 (PDT)&lt;/div&gt;</summary>
		<author><name>Omei Qunhua</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Second_Life_bot_software_comparison&amp;diff=1191385</id>
		<title>Second Life bot software comparison</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Second_Life_bot_software_comparison&amp;diff=1191385"/>
		<updated>2014-06-18T16:57:44Z</updated>

		<summary type="html">&lt;p&gt;Omei Qunhua: pricing correction&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Second Life bots can perform the various operations (not available by LSL):&lt;br /&gt;
* Send direct group invitations (including closed groups)&lt;br /&gt;
* Automatically monitor the group chats, kick spammers, perform antispam checks&lt;br /&gt;
* Send automatic group notices and IMs&lt;br /&gt;
* Act as mannequin or model bot&lt;br /&gt;
* Serve as a secretary or support robot by using autoresponder AI or remote chat assistant.&lt;br /&gt;
* Be a non-personal character (NPC) in a roleplaying game.&lt;br /&gt;
&lt;br /&gt;
== Classification ==&lt;br /&gt;
&lt;br /&gt;
Every Second Life bot requires a special software running. This software can be run either on user&#039;s PC or hosted with Second Life bot hosting provider.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float: left; width: 49%&amp;quot;&amp;gt;&lt;br /&gt;
== A. Hosting bot with provider ==&lt;br /&gt;
&lt;br /&gt;
Pros:&lt;br /&gt;
* You don&#039;t care about PC consuming power around the clock.&lt;br /&gt;
* You don&#039;t have to choose, probably buy and update the bot software.&lt;br /&gt;
* Bot does not depends on your internet connection.&lt;br /&gt;
&lt;br /&gt;
Cons:&lt;br /&gt;
* You have to pay a subscription fee (usually weekly)&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;float: right; width: 49%&amp;quot;&amp;gt;&lt;br /&gt;
== B. Running bot on your own PC ==&lt;br /&gt;
&lt;br /&gt;
Pros:&lt;br /&gt;
* You can launch the bot when you need it&lt;br /&gt;
* Usually no subscription fee (however, you may need to buy the software)&lt;br /&gt;
&lt;br /&gt;
Cons:&lt;br /&gt;
* You have to keep your PC running all the time&lt;br /&gt;
* Bot hosting providers usually offer more features than standalone programs&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear: both&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Comparison ==&lt;br /&gt;
&lt;br /&gt;
(Sorted naturally, new records are appended at the end)&lt;br /&gt;
&lt;br /&gt;
{| width=100% border=1 cellspacing=0 cellpadding=4&lt;br /&gt;
|- bgcolor=&amp;quot;#DDDDDD&amp;quot;&lt;br /&gt;
! width=20% | &lt;br /&gt;
! width=20% | SmartBots&lt;br /&gt;
! width=20% | PikkuBot&lt;br /&gt;
! width=20% | Corrade&lt;br /&gt;
! width=20% | SecondBot&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| colspan=5 | &#039;&#039;&#039;Hosting type&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#DDDDDD&amp;quot; | Server hosting&lt;br /&gt;
| &#039;&#039;&#039;yes&#039;&#039;&#039; || &#039;&#039;&#039;yes&#039;&#039;&#039; || no || no&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#DDDDDD&amp;quot; | Downloadable program&lt;br /&gt;
| no || &#039;&#039;&#039;yes&#039;&#039;&#039; || &#039;&#039;&#039;yes&#039;&#039;&#039; || &#039;&#039;&#039;yes&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#DDDDDD&amp;quot; | Source-Code Available&lt;br /&gt;
| no || no || &#039;&#039;&#039;yes&#039;&#039;&#039; || no &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| colspan=5 | &#039;&#039;&#039;Purpose&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#DDDDDD&amp;quot; | Used as:&lt;br /&gt;
| &#039;&#039;&#039;Multi-functional Bot&#039;&#039;&#039; || &#039;&#039;&#039;Multi-functional Bot&#039;&#039;&#039; || &#039;&#039;&#039;Multi-functional Bot&#039;&#039;&#039;   || &#039;&#039;&#039;Multi-functional Bot&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| colspan=5 | &#039;&#039;&#039;Features&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#DDDDDD&amp;quot; | Bot controlling approach&lt;br /&gt;
| web pages&amp;lt;br&amp;gt;in-world HUD&amp;lt;br&amp;gt;http API || chat commands || &amp;lt;br&amp;gt;in-world primitives&amp;lt;br&amp;gt;instant-messaging&amp;lt;br&amp;gt;http API || instant-messaging&amp;lt;br/&amp;gt;http AI&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#DDDDDD&amp;quot; | Group Inviter &amp;lt;ref&amp;gt;See [[Group inviters comparison]] for more info&amp;lt;/ref&amp;gt;&lt;br /&gt;
| &#039;&#039;&#039;yes&#039;&#039;&#039; || &#039;&#039;&#039;yes&#039;&#039;&#039; || &#039;&#039;&#039;yes&#039;&#039;&#039; || &#039;&#039;&#039;yes&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#DDDDDD&amp;quot; | Chat moderator&lt;br /&gt;
| &#039;&#039;&#039;yes, web interface&#039;&#039;&#039; || &#039;&#039;&#039;yes, bot commands&#039;&#039;&#039; || &#039;&#039;&#039;yes, bot commands&#039;&#039;&#039; || no&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#DDDDDD&amp;quot; | Automatic chat antispam&lt;br /&gt;
| &#039;&#039;&#039;yes, using free device&#039;&#039;&#039; || no || no || no&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#DDDDDD&amp;quot; | Group notices and IMs&lt;br /&gt;
| &#039;&#039;&#039;yes&#039;&#039;&#039; || &#039;&#039;&#039;yes&#039;&#039;&#039; || &#039;&#039;&#039;yes&#039;&#039;&#039;  || &#039;&#039;&#039;yes&#039;&#039;&#039; &lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#DDDDDD&amp;quot; | Scheduled notices and IMs&lt;br /&gt;
| &#039;&#039;&#039;yes, web interface&#039;&#039;&#039; || no || &#039;&#039;&#039;yes, bot commands&#039;&#039;&#039; || &#039;&#039;&#039;yes groups only&#039;&#039;&#039; &lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| colspan=5 | &#039;&#039;&#039;Add-ons&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#DDDDDD&amp;quot; | Add-ons for other services&lt;br /&gt;
| LOW Industries devices&amp;lt;br&amp;gt;SHX devices&amp;lt;br&amp;gt;HippoRent&amp;lt;br&amp;gt;Casper (Vend and others)&amp;lt;br&amp;gt;AlikaRent&amp;lt;br&amp;gt;IntelliAd || not announced || developers welcome :-) || StreamAdmin&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#DDDDDD&amp;quot; | Devices and tools&lt;br /&gt;
| [https://marketplace.secondlife.com/stores/11457 Available at SL Marketplace] || [http://www.pikkubot.de/dokuwiki/doku.php?id=pikkushop Pikku-Shop] || [http://was.fm/secondlife:scripted_agents:corrade Wizardry and Steamworks - Corrade] || None yet&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| colspan=5 | &#039;&#039;&#039;Prices&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#DDDDDD&amp;quot; | Setup fee&lt;br /&gt;
| &#039;&#039;&#039;free&#039;&#039;&#039; || L$6,000 (premium license)&amp;lt;br&amp;gt;L$1,500 (light license) || &#039;&#039;&#039;free&#039;&#039;&#039; || &#039;&#039;&#039;free&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#DDDDDD&amp;quot; | Bot hosting subscription&lt;br /&gt;
| L$479/week - fully-functional bot&amp;lt;br&amp;gt;L$179/week - model bot || L$504/week || N/A || &#039;&#039;&#039;Not supported yet&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| colspan=5 | &#039;&#039;&#039;Programming&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#DDDDDD&amp;quot; | LSL API&amp;lt;ref&amp;gt;The LSL library which allows to utilize bot&#039;s functionality from your LSL scripts&amp;lt;/ref&amp;gt;&lt;br /&gt;
| &#039;&#039;&#039;[http://www.smartbots2life.com/docs/AdminBot AdminBot LSL Library]&#039;&#039;&#039;:&amp;lt;br&amp;gt;invite to group&amp;lt;br&amp;gt;group chat talk&amp;lt;br&amp;gt;group chat listen&amp;lt;br&amp;gt;eject group members || no || invite to group&amp;lt;br&amp;gt;eject from group&amp;lt;br&amp;gt;leave group&amp;lt;br&amp;gt;add members to roles&amp;lt;br&amp;gt;remove members from roles&amp;lt;br&amp;gt;update group profile  || &#039;&#039;&#039;[http://secondbot.net/index.php?module=docs Full command control via scripts]&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#DDDDDD&amp;quot; | Bot chat API&lt;br /&gt;
| no || &#039;&#039;&#039;yes&#039;&#039;&#039; || &#039;&#039;&#039;yes&#039;&#039;&#039;  || &#039;&#039;&#039;yes&#039;&#039;&#039; &lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#DDDDDD&amp;quot; | HTTP API&lt;br /&gt;
| &#039;&#039;&#039;yes&#039;&#039;&#039; || no || &#039;&#039;&#039;yes&#039;&#039;&#039; || &#039;&#039;&#039;yes&#039;&#039;&#039; &lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#DDDDDD&amp;quot; | Other languages&lt;br /&gt;
| [http://www.smartbots2life.com/docs/SBSL Simple Bot Scripting Language] || no || &#039;&#039;&#039;possible&#039;&#039;&#039;  || no&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| colspan=5 | &#039;&#039;&#039;Links&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#DDDDDD&amp;quot; | URL&lt;br /&gt;
| [http://www.smartbots2life.com/ SmartBots: Second Life bot hosting] || [http://www.pikkubots.de/ PikkuBots website] || [http://was.fm/secondlife:scripted_agents:corrade Wizardry and Steamworks - Corrade] || [http://secondbot.net/ SecondBot website]&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#DDDDDD&amp;quot; | SLURL&lt;br /&gt;
| [http://slurl.com/secondlife/DuoLife/200/99/32] || [http://slurl.com/secondlife/San/198/140/58] || --- || ---&lt;br /&gt;
|-&lt;br /&gt;
| bgcolor=&amp;quot;#DDDDDD&amp;quot; | Other&lt;br /&gt;
| SmartBost is a publicly trading company, listed as [http://slcapex.com/symbol/BOTS BOTS] at SLCAPEX || --- || The source-code is released under the GNU GPLv3 license. For hosting, please contact [[Kira Komarov]] in-world. Free hosting may be available (within reason and at the mercy of resources). || --- &lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;references/&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
For more info on bots, visit the following pages:&lt;br /&gt;
* [[Group inviters comparison]] - the comparison table of the group inviter services&lt;br /&gt;
* [http://www.smartbots2life.com/docs/SmartBots_Documentation SmartBots services] - the general information about Second life bots and related services: group inviter, chat managing and group notices&lt;br /&gt;
&lt;br /&gt;
[[Category: SL Bots]]&lt;/div&gt;</summary>
		<author><name>Omei Qunhua</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Talk:LlRound&amp;diff=1191309</id>
		<title>Talk:LlRound</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Talk:LlRound&amp;diff=1191309"/>
		<updated>2014-06-15T07:22:53Z</updated>

		<summary type="html">&lt;p&gt;Omei Qunhua: /* Rounding direction */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In all seriousness, how does a &amp;quot;pretty table&amp;quot;, which doubled the page width,&lt;br /&gt;
https://wiki.secondlife.com/w/index.php?title=LlRound&amp;amp;diff=next&amp;amp;oldid=1187121&lt;br /&gt;
fit in with the edit of https://wiki.secondlife.com/w/index.php?title=LlJsonSetValue&amp;amp;diff=prev&amp;amp;oldid=1181771 made for &amp;quot;...better readability on mobile screens...&amp;quot;??? [[User:LepreKhaun Resident|LepreKhaun Resident]] 20:47, 20 January 2014 (PST)&lt;br /&gt;
&lt;br /&gt;
==Rounding direction==&lt;br /&gt;
I can see in retrospect of course that there&#039;s no problem in accurately holding -4.5 or -5 in a float. But as for rounding towards positive infinity, is the lslWiki page wrong too? http://lslwiki.net/lslwiki/wakka.php?wakka=llRound [[User:Omei Qunhua|Omei Qunhua]] 13:26, 14 June 2014 (PDT)&lt;br /&gt;
:Check what LSO does, this may be a difference between LSO and Mono that was never caught... or nobody noticed that llRound is not [http://www.cplusplus.com/reference/cmath/round/ cmath roundf] -- &#039;&#039;&#039;[[User:Strife_Onizuka|Strife]]&#039;&#039;&#039; &amp;lt;sup&amp;gt;&amp;lt;small&amp;gt;([[User talk:Strife_Onizuka|talk]]|[[Special:Contributions/Strife_Onizuka|contribs]])&amp;lt;/small&amp;gt;&amp;lt;/sup&amp;gt; 18:54, 14 June 2014 (PDT)&lt;br /&gt;
&lt;br /&gt;
Just checked ... LSO behaves the same as Mono.  And the Mozilla Java Script page says math.round behaves like LSL.  http://tinyurl.com/phsk5zy  [[User:Omei Qunhua|Omei Qunhua]] 00:22, 15 June 2014 (PDT)&lt;/div&gt;</summary>
		<author><name>Omei Qunhua</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Talk:LlRound&amp;diff=1191307</id>
		<title>Talk:LlRound</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Talk:LlRound&amp;diff=1191307"/>
		<updated>2014-06-14T20:26:06Z</updated>

		<summary type="html">&lt;p&gt;Omei Qunhua: Rounding query&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;In all seriousness, how does a &amp;quot;pretty table&amp;quot;, which doubled the page width,&lt;br /&gt;
https://wiki.secondlife.com/w/index.php?title=LlRound&amp;amp;diff=next&amp;amp;oldid=1187121&lt;br /&gt;
fit in with the edit of https://wiki.secondlife.com/w/index.php?title=LlJsonSetValue&amp;amp;diff=prev&amp;amp;oldid=1181771 made for &amp;quot;...better readability on mobile screens...&amp;quot;??? [[User:LepreKhaun Resident|LepreKhaun Resident]] 20:47, 20 January 2014 (PST)&lt;br /&gt;
&lt;br /&gt;
==Rounding direction==&lt;br /&gt;
I can see in retrospect of course that there&#039;s no problem in accurately holding -4.5 or -5 in a float. But as for rounding towards positive infinity, is the lslWiki page wrong too? http://lslwiki.net/lslwiki/wakka.php?wakka=llRound [[User:Omei Qunhua|Omei Qunhua]] 13:26, 14 June 2014 (PDT)&lt;/div&gt;</summary>
		<author><name>Omei Qunhua</name></author>
	</entry>
</feed>