<?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=Lady+Sumoku</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=Lady+Sumoku"/>
	<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/wiki/Special:Contributions/Lady_Sumoku"/>
	<updated>2026-07-27T06:03:48Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User_talk:Lady_Sumoku&amp;diff=1213693</id>
		<title>User talk:Lady Sumoku</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User_talk:Lady_Sumoku&amp;diff=1213693"/>
		<updated>2023-03-07T06:51:34Z</updated>

		<summary type="html">&lt;p&gt;Lady Sumoku: More testing&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Replaced source tag with syntaxhighlight tag... And &amp;quot;lsl2&amp;quot; with &amp;quot;lsl&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lsl&amp;quot;&amp;gt;&lt;br /&gt;
float min = 1.175494351E-38;&lt;br /&gt;
float max = 3.402823466E+38;&lt;br /&gt;
float sci = 2.6E-5;&lt;br /&gt;
float sci_a = 2.6E+3;&lt;br /&gt;
float sci_b = 2.6E3;&lt;br /&gt;
float sci_c = 26000.E-1;&lt;br /&gt;
float f = 2600;//implicitly typecast to a float&lt;br /&gt;
float E = 85.34859;&lt;br /&gt;
float cast = (float)&amp;quot;42&amp;quot;;//explicit typecast to a float&lt;br /&gt;
float Infintity = (float)&amp;quot;inf&amp;quot;; //-- may be negative, will cause a math error if evaluated in LSO, see &#039;caveats&#039; below&lt;br /&gt;
float NotANumber = (float)&amp;quot;nan&amp;quot;; //-- may be negative, will cause a math error if evaluated in LSO, see &#039;caveats&#039; bleow&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lady Sumoku</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User_talk:Lady_Sumoku&amp;diff=1213692</id>
		<title>User talk:Lady Sumoku</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User_talk:Lady_Sumoku&amp;diff=1213692"/>
		<updated>2023-03-07T06:48:18Z</updated>

		<summary type="html">&lt;p&gt;Lady Sumoku: Testing new markup tags&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
float min = 1.175494351E-38;&lt;br /&gt;
float max = 3.402823466E+38;&lt;br /&gt;
float sci = 2.6E-5;&lt;br /&gt;
float sci_a = 2.6E+3;&lt;br /&gt;
float sci_b = 2.6E3;&lt;br /&gt;
float sci_c = 26000.E-1;&lt;br /&gt;
float f = 2600;//implicitly typecast to a float&lt;br /&gt;
float E = 85.34859;&lt;br /&gt;
float cast = (float)&amp;quot;42&amp;quot;;//explicit typecast to a float&lt;br /&gt;
float Infintity = (float)&amp;quot;inf&amp;quot;; //-- may be negative, will cause a math error if evaluated in LSO, see &#039;caveats&#039; below&lt;br /&gt;
float NotANumber = (float)&amp;quot;nan&amp;quot;; //-- may be negative, will cause a math error if evaluated in LSO, see &#039;caveats&#039; bleow&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
float min = 1.175494351E-38;&lt;br /&gt;
float max = 3.402823466E+38;&lt;br /&gt;
float sci = 2.6E-5;&lt;br /&gt;
float sci_a = 2.6E+3;&lt;br /&gt;
float sci_b = 2.6E3;&lt;br /&gt;
float sci_c = 26000.E-1;&lt;br /&gt;
float f = 2600;//implicitly typecast to a float&lt;br /&gt;
float E = 85.34859;&lt;br /&gt;
float cast = (float)&amp;quot;42&amp;quot;;//explicit typecast to a float&lt;br /&gt;
float Infintity = (float)&amp;quot;inf&amp;quot;; //-- may be negative, will cause a math error if evaluated in LSO, see &#039;caveats&#039; below&lt;br /&gt;
float NotANumber = (float)&amp;quot;nan&amp;quot;; //-- may be negative, will cause a math error if evaluated in LSO, see &#039;caveats&#039; bleow&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lady Sumoku</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlTargetOmega_test&amp;diff=1197848</id>
		<title>LlTargetOmega test</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlTargetOmega_test&amp;diff=1197848"/>
		<updated>2015-10-27T19:07:28Z</updated>

		<summary type="html">&lt;p&gt;Lady Sumoku: Edited for style and readability&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Test Scripts]]&lt;br /&gt;
== Tests for [[llTargetOmega]] ==&lt;br /&gt;
=== Test 1 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1) Create two boxes near each other, one above the other.&lt;br /&gt;
2) Add the following &amp;quot;TargetOmega cycling&amp;quot; script to each box.&lt;br /&gt;
3) Link the boxes together.&lt;br /&gt;
4) Click each of the boxes several times to cycle through rotating, rotating at increased speeds, and stopping.&lt;br /&gt;
5) Attach the object while it&#039;s rotating and verify it continues to rotate.&lt;br /&gt;
6) Detach to inventory, then attach it again, and verify it rotates at the same speed.&lt;br /&gt;
7) Click each of the boxes several times to cycle through rotating, rotating at increased speeds, and stopping.&lt;br /&gt;
8) Drop the object on the ground while it&#039;s rotating and verify it continues to rotate.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
//// TargetOmega cycling&lt;br /&gt;
float rate = 0.0;&lt;br /&gt;
default&lt;br /&gt;
 {&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        rate += 2.5;&lt;br /&gt;
        if (rate &amp;gt; 10.0) rate = 0.0;&lt;br /&gt;
        llOwnerSay(&amp;quot;rate = &amp;quot; + (string) rate);&lt;br /&gt;
        llTargetOmega(&amp;lt;0,0,1&amp;gt;, rate, 0.1);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
////&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Test 2 ===&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
1) Create 2 boxes&lt;br /&gt;
2) Add the following Rotate Script to one box&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
//// Rotate Script&lt;br /&gt;
default {&lt;br /&gt;
state_entry() { llTargetOmega(&amp;lt;0,0,1&amp;gt;, 1, 1); }&lt;br /&gt;
}&lt;br /&gt;
////&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
3) Make both boxes physical.&lt;br /&gt;
4) Link the rotating box as a child to the other box.&lt;br /&gt;
5) Verify the scripted box no longer rotates.&lt;br /&gt;
6) Toggle the linked set non-physical, then physical again.&lt;br /&gt;
7) Verify the scripted box is once again rotating, and that the linked set can be pushed around.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Other tests to add ===&lt;br /&gt;
&lt;br /&gt;
* Rotating around an axis of &amp;lt;0,0,0&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Physical llTargetOmega prims and objects.&lt;/div&gt;</summary>
		<author><name>Lady Sumoku</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Style_Guide&amp;diff=1197847</id>
		<title>Style Guide</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Style_Guide&amp;diff=1197847"/>
		<updated>2015-10-27T19:01:46Z</updated>

		<summary type="html">&lt;p&gt;Lady Sumoku: Corrected typo in link description&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{KBtip|While you aren&#039;t required to follow this Style Guide to make unofficial Wiki pages, it may help you be a more effective writer, so feel free to adopt these practices!}} {{TOCright}}{{otheruses4|style used in English articles}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Interested in [[Extended Knowledge Base|contributing to the Extended Knowledge Base]]? Please read this style guide to gain a better understanding of the framework we&#039;re using to craft beautiful documents which aren&#039;t just well-written, but easy-to-read.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Our style guide is inspired by successful common conventions such as [http://en.wikipedia.org/wiki/Wikipedia:Manual_of_Style Wikipedia]&#039;s, blended with specifics about the Second Life® experience. This guide is open to evolving over time, yet aims to provide consistency you can refer to when in doubt.&lt;br /&gt;
&lt;br /&gt;
Please note that these style guidelines are meant to be more strictly enforced for material that&#039;s part of the Second Life Knowledge Base, but you can feel free to apply them elsewhere on this wiki wherever it may be beneficial!  Consistency in communication helps clarity to a degree you may find startling.&lt;br /&gt;
&lt;br /&gt;
Read the main [[Editing Guidelines]] before editing KB articles. Being well-primed will help you get started smoothly. You should also have a basic understanding of [[Help:Contents|wikicode]], a combination of plain text and formatting markup.&lt;br /&gt;
&lt;br /&gt;
Furthermore, feel free to examine any established KB article in detail, such as [[How do I add someone to my Contacts list?]], for examples. Once an article&#039;s in the Wiki, of course, you can click the &#039;&#039;&#039;Edit&#039;&#039;&#039; tab near the top of the screen. You&#039;ll need to be logged in.&lt;br /&gt;
&lt;br /&gt;
It is not a replacement for industry standards such as [http://en.wikipedia.org/wiki/The_Chicago_Manual_of_Style The Chicago Manual of Style] or [http://en.wikipedia.org/wiki/The_Elements_of_Style The Elements of Style]. However, when contributing to Linden Lab&#039;s written documentation and communication, it&#039;s a good idea to read through these notes to be sure your articles are meeting the standards.&lt;br /&gt;
&lt;br /&gt;
== Knowledge Base articles ==&lt;br /&gt;
&lt;br /&gt;
This section discusses the structure of articles and their arrangement within the Knowledge Base as a whole, sort of.&lt;br /&gt;
&lt;br /&gt;
=== Knowledge Base article structure ===&lt;br /&gt;
&lt;br /&gt;
There are two basic types of Knowledge Base article:&lt;br /&gt;
&lt;br /&gt;
# The ones that answer a specific question (&amp;quot;How to save textures to your hard drive&amp;quot;)&lt;br /&gt;
# The ones that give some general knowledge about a topic (&amp;quot;Guide to Jobs in Second Life&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
In either case, the first paragraph of the article should answer an unspoken question:&lt;br /&gt;
&lt;br /&gt;
# After I read this, what should I be able to do? (Pretty self-evident.)&lt;br /&gt;
# After I read this, what should I understand better?&lt;br /&gt;
&lt;br /&gt;
This can be as simple as making the first paragraph say something like &amp;quot;This article discusses ___.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
If all the articles in the Knowledge Base start off this way, readers will become accustomed to finding out very quickly whether the information in a particular article will be useful to them without having to read the whole thing.&lt;br /&gt;
&lt;br /&gt;
=== Headers ===&lt;br /&gt;
Articles should be divided into headers, each one representing a distinct topic. For instance, in an article about different types of scripted objects, each type could have its own section with a header.&lt;br /&gt;
&lt;br /&gt;
Top-level article headers are the equivalent to a &amp;quot;h2&amp;quot; in modern blog software and other content management systems:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;== Header ==&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Furthermore, content should begin on the next line, with each paragraph separated by two line breaks (if you use a single line break, text continues on the same line).&lt;br /&gt;
&lt;br /&gt;
In a particularly extensive article, use sub-headers:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;== Header ==&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;Text goes here...&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;=== Sub-Header ===&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;Even more text...&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &lt;br /&gt;
 &amp;lt;nowiki&amp;gt;==== Sub-Header ====&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;You get the idea...&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Keep flow a foremost priority. A table of contents will automatically appear in an article with four or more headers, but if an article feels tedious to scroll through, you may want to separate sections into their own pages, and link to them instead.&lt;br /&gt;
&lt;br /&gt;
If you don&#039;t want an article to have the table of contents, insert this at the top:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;__NOTOC__&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To save space and right-align the table of contents, use this template:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;{{TOCright}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that this template doesn&#039;t work well if you are also using a navigation template that floats to the right.&lt;br /&gt;
&lt;br /&gt;
=== Knowledge Base article scope ===&lt;br /&gt;
One problem that wikis and knowledge bases frequently run into is the proliferation of pages that contain closely interrelated or even duplicate subject matter, but with little connection between them. This is due to a lack of central planning, and the nature of wiki growth.&lt;br /&gt;
&lt;br /&gt;
When it comes to Second Life documentation, we should remember that a FAQ on estate billing should be integrated with — or at the very least, closely linked to — the main article for estate billing. By linking the pages together and clearly indicating this, it provides readers with a clear path to follow to get more help, and editors with a better indicator of what they need to keep track of when editing a given subject.&lt;br /&gt;
&lt;br /&gt;
Duplicate information on multiple pages increases the odds that those pages won’t be updated as that information changes. This vastly reduces the usefulness of the Knowledge Base as a whole. Whenever possible, try to modularize things such that information on how to do something lives in one place only, and gets linked to by other articles. That way, you only have to update it once if it changes.&lt;br /&gt;
&lt;br /&gt;
=== Knowledge Base article tense ===&lt;br /&gt;
When you tell people what happens when they do things, use the present tense, for example:&lt;br /&gt;
&lt;br /&gt;
* Click &#039;&#039;&#039;IM&#039;&#039;&#039;. The IM window opens.&lt;br /&gt;
&lt;br /&gt;
As opposed to:&lt;br /&gt;
&lt;br /&gt;
* Click &#039;&#039;&#039;IM&#039;&#039;&#039;. The IM window will open.&lt;br /&gt;
&lt;br /&gt;
== Terminology ==&lt;br /&gt;
&lt;br /&gt;
{{KBcaution|The closest thing to an &amp;quot;official glossary&amp;quot; is the [[Viewer 2 Help|Viewer 2]] built-in glossary, which uses the content from [[Viewerhelp:Glossary]].}}&lt;br /&gt;
&lt;br /&gt;
=== Second Life-specific words ===&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;inworld&amp;quot; (this used to be &amp;quot;in-world,&amp;quot; but it&#039;s closing up the same way &amp;quot;e-mail&amp;quot; and &amp;quot;web site&amp;quot; went)&lt;br /&gt;
* &amp;quot;rez&amp;quot; or &amp;quot;rezzed&amp;quot; (not ressed/rezed/res).  Do not capitalize.&lt;br /&gt;
* Always capitalize &amp;quot;Second Life.&amp;quot;&lt;br /&gt;
* Spell &amp;quot;plugin&amp;quot; with no hyphen.&lt;br /&gt;
* &amp;quot;SLurl&amp;quot; instead of &amp;quot;SLURL&amp;quot;, when referring to Second Life URL&#039;s (http://www.SLurl.com).  This is a Linden Lab trademark.&lt;br /&gt;
&lt;br /&gt;
When referring to Linden Lab reflexively, we go with &amp;quot;We recommend&amp;quot; over &amp;quot;Linden Lab recommends,&amp;quot; except in the case of something really formal, like a legal communication or something. It&#039;s probably likely we won&#039;t be writing actual legal briefs anytime soon, though.&lt;br /&gt;
* You can probably write around this sort of thing 99% of the time anyway, by simply saying something along the lines of &amp;quot;Do x to achieve y.&amp;quot;&lt;br /&gt;
* You can also say things like &amp;quot;Our tests have found that x happens when y.&amp;quot;&lt;br /&gt;
&lt;br /&gt;
If you’re talking about a specific Linden program or service, always, always use the name of the program.&lt;br /&gt;
&lt;br /&gt;
=== User interface elements ===&lt;br /&gt;
&lt;br /&gt;
It would be good to have some standard terms that we use across the Knowledge Base to refer to elements of the UI. &lt;br /&gt;
* Is that thing a &amp;quot;dialog&amp;quot; or a &amp;quot;window&amp;quot;?&lt;br /&gt;
* Are those &amp;quot;forms&amp;quot; or &amp;quot;tabs&amp;quot; or what?&lt;br /&gt;
&lt;br /&gt;
Maintaining consistency makes it easier for readers to understand what we&#039;re talking about, whether they realize it or not.&lt;br /&gt;
&lt;br /&gt;
In general, capitalize and spell user interface (UI) elements exactly as they are in the interface. If there&#039;s some inconsistent capitalization in the UI, note it and we&#039;ll put it in a bucket that we&#039;ll eventually give to somebody.  If there&#039;s a misspelling or a typo in the UI, that&#039;s probably bug material!&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Menus&#039;&#039;&#039; - We all know what menus are; they appear at the top of the Second Life window.&lt;br /&gt;
** Sometimes they also appear at the top of windows &#039;&#039;inside&#039;&#039; the Second Life window, like the Inventory window. In these cases, it&#039;s probably more helpful to refer to the internal window before the name of the menu. Like:&lt;br /&gt;
*** In the Inventory window, select &#039;&#039;&#039;File &amp;gt; Open&#039;&#039;&#039;.&lt;br /&gt;
** Otherwise we risk confusing people, since there are &#039;&#039;two&#039;&#039; &amp;quot;File&amp;quot; menus available if you&#039;ve got the Inventory window open.&lt;br /&gt;
** The separator for menu item selections should be the &amp;gt; mark. For example:&lt;br /&gt;
*** Select &#039;&#039;&#039;Edit &amp;gt; Detach Object &amp;gt; Right Hand&#039;&#039;&#039; to drop the object you&#039;re holding.&lt;br /&gt;
* &#039;&#039;&#039;The Pie Menu&#039;&#039;&#039; - This is that wheel of selections that shows up whenever you right-click on something inworld.&lt;br /&gt;
** It&#039;s worth noting that it seems relatively easy to write around having to mention it by name. Just say &amp;quot;Right-click on the tree and select &#039;&#039;&#039;More &amp;gt; Wear&#039;&#039;&#039;,&amp;quot; for example.&lt;br /&gt;
* &#039;&#039;&#039;Windows&#039;&#039;&#039; - Use this term for the windows that appear internally within the Second Life window, such as the Inventory window or the Search window.&lt;br /&gt;
** Note: A window is anything that satisfies most of these conditions:&lt;br /&gt;
*** It&#039;s got the &#039;&#039;&#039;_ X&#039;&#039;&#039; deal in the top right corner.&lt;br /&gt;
*** It&#039;s got a title in the upper left corner.&lt;br /&gt;
*** It can be moved around or resized.&lt;br /&gt;
** An example of something that&#039;s not a window is the thing that appears at the bottom of the Viewer when you click the &#039;&#039;&#039;Chat&#039;&#039;&#039; button. We should standardize on calling that the &amp;quot;Chat bar&amp;quot;, since it basically satisfies none of these conditions.&lt;br /&gt;
* &#039;&#039;&#039;Dialogs&#039;&#039;&#039; - Use this term for the blue thing that pops up in the corner whenever something happens in Second Life, like when someone or something tries to give you inventory or if it turns out you can&#039;t sit on that thing you wanted to sit on.&lt;br /&gt;
** Sample usage might be something like &amp;quot;A dialog appears, telling you there&#039;s no room to sit there.&amp;quot;&lt;br /&gt;
** It&#039;s worth noting that there are multiple kinds of these, like the group notification dialog and friend-status notifications, but they always pop up in a consistent place, so you can give the reader spatial references like &amp;quot;A dialog pops up in the lower right corner telling you your pal is online&amp;quot;.&lt;br /&gt;
   {{KBnote|In Viewer 2, we&#039;re considering calling these simply &amp;quot;notifications,&amp;quot; as they really serve only to notify a Resident that something&#039;s occurred, and don&#039;t present a yes/no choice, which is what most &amp;quot;dialogs&amp;quot; typically do these days.}}&lt;br /&gt;
* &#039;&#039;&#039;Tabs&#039;&#039;&#039; - These are the tabs that live inside the windows in Second Life. Refer to these as you would windows, except bold them (see the formatting section below).&lt;br /&gt;
* &#039;&#039;&#039;Buttons&#039;&#039;&#039; - Use this term for the buttons that appear in the UI. Depending on the sentence that surrounds it, you&#039;re probably okay referring to a button any way you want.&lt;br /&gt;
** Click the &#039;&#039;&#039;Save&#039;&#039;&#039; button.&lt;br /&gt;
** or Click &#039;&#039;&#039;Save&#039;&#039;&#039;.&lt;br /&gt;
** Pet peeve: &amp;quot;Click on the &#039;&#039;&#039;Save&#039;&#039;&#039; button&amp;quot; contains a redundant word! The world won&#039;t end if you use it, but [[Jon Linden]] doesn&#039;t like it.&lt;br /&gt;
* &#039;&#039;&#039;Fields&#039;&#039;&#039; - Anything that you use to provide input to Second Life that&#039;s not a button is a field, pretty much. Notes on specific fields follow:&lt;br /&gt;
** Use &amp;quot;checkbox&amp;quot; rather than &amp;quot;check box.&amp;quot;&lt;br /&gt;
*** Use &amp;quot;select&amp;quot; as a verb for checking or unchecking one, because the redundancy of (for example) &amp;quot;Check the &#039;&#039;&#039;Rotate&#039;&#039;&#039; checkbox&amp;quot;. &amp;quot;Select the &#039;&#039;&#039;Rotate&#039;&#039;&#039; checkbox&amp;quot; feels better, because the repetition&#039;s gone.&lt;br /&gt;
** Use &amp;quot;dropdown&amp;quot; instead of &amp;quot;drop down.&amp;quot;&lt;br /&gt;
*** This is another one where &amp;quot;select&amp;quot; works well, as in &amp;quot;From the &#039;&#039;&#039;Style&#039;&#039;&#039; dropdown, select &#039;&#039;&#039;Fancy&#039;&#039;&#039;.&amp;quot; &amp;quot;Pick&amp;quot; also works, and is less formal, but there&#039;s slight potential for confusion if flower-picking ever becomes a widespread Second Life activity.&lt;br /&gt;
** &amp;quot;Radio button&amp;quot; is preferred for any field that presents you with a bunch of choices that have round circles next to them.&lt;br /&gt;
*** Somewhat unsurprisingly, &amp;quot;select&amp;quot; works really well here too, as in &amp;quot;Select the &#039;&#039;&#039;More swords&#039;&#039;&#039; radio button.&amp;quot;&lt;br /&gt;
** There&#039;s at least one orphan field that doesn&#039;t actually have a prompt or a button next to it, which is the filter field in the Inventory window. That&#039;s the sort of thing you can probably write around, as in &amp;quot;Type something into the filter field at the top of the Inventory window.&amp;quot;&lt;br /&gt;
** Any other interface item, like a text field or those number fields that are all over the prim editing one, can probably safely be referred to simply as &amp;quot;the ___ field.&amp;quot;&lt;br /&gt;
** General idea: If you&#039;ve got a long article, you can probably get away with referring to fields more directly (as in &amp;quot;Provide a &#039;&#039;&#039;Description&#039;&#039;&#039;&amp;quot; instead of &amp;quot;Provide a value for the &#039;&#039;&#039;Description&#039;&#039;&#039; field&amp;quot;) as you progress through it. Unless you think the reader&#039;s not going to be able to follow you, this is OK to do.&lt;br /&gt;
&lt;br /&gt;
=== Deprecated terminology ===&lt;br /&gt;
As Second Life has matured, Linden-favored terms have changed as well. We should take care to only use the current words for the concepts and items we describe, both to avoid confusion, as well as to avoid potential legal issues, such as the example of writing &amp;quot;money&amp;quot; rather than &amp;quot;Linden Dollars&amp;quot;. Linden Dollars aren&#039;t money!&lt;br /&gt;
&lt;br /&gt;
For example, &amp;quot;Private Islands&amp;quot; is a term we’ve deprecated in favor of &amp;quot;Estates&amp;quot; (when there&#039;s a group of Private Regions together) or &amp;quot;Private Region&amp;quot;. (As many Residents have noted, if you have two adjacent non-mainland Regions, why are they individually considered &amp;quot;islands&amp;quot;?)&lt;br /&gt;
&lt;br /&gt;
Please keep in mind that these are general guidelines; context is everything!&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;So, we use:&#039;&#039;&#039;&lt;br /&gt;
* &amp;quot;Region&amp;quot; instead of &amp;quot;sim&amp;quot; or &amp;quot;simulator&amp;quot; when referring to a single Region&lt;br /&gt;
* &amp;quot;Sim host&amp;quot; instead of &amp;quot;sim&amp;quot; or &amp;quot;simulator&amp;quot; when referring to a server hosting Regions&lt;br /&gt;
* &amp;quot;Residents&amp;quot; instead of &amp;quot;users&amp;quot;, &amp;quot;subscribers&amp;quot;, &amp;quot;customers&amp;quot;, &amp;quot;avatars&amp;quot;, etc.&lt;br /&gt;
** There are cases where &amp;quot;avatar&amp;quot; is, of course, a more appropriate term to use -- when discussing the actual inworld representation of a Resident that can be clicked upon or edited, for instance.  In that case, use &amp;quot;avatar,&amp;quot; by all means!&lt;br /&gt;
* &amp;quot;Estates&amp;quot; or &amp;quot;Private Regions&amp;quot; instead of &amp;quot;islands&amp;quot;, &amp;quot;private islands&amp;quot;, etc. (an Estate is a group of Private Regions)&lt;br /&gt;
* &amp;quot;Linden Dollars&amp;quot; instead of &amp;quot;money&amp;quot;, &amp;quot;dollars&amp;quot;, &amp;quot;cash&amp;quot;, &amp;quot;lindens&amp;quot;, etc.&lt;br /&gt;
* &amp;quot;L$&amp;quot; instead of &amp;quot;$&amp;quot;, when denoting Linden Dollars&lt;br /&gt;
* &amp;quot;US$&amp;quot; instead of &amp;quot;$&amp;quot; when denoting US dollars&lt;br /&gt;
* &amp;quot;SLurl&amp;quot; instead of &amp;quot;SLURL&amp;quot;, when referring to Second Life URL&#039;s (http://www.SLurl.com)&lt;br /&gt;
&lt;br /&gt;
These terms may be in common usage among Residents, but it’s important to maintain a consistent message.&lt;br /&gt;
&lt;br /&gt;
When it comes to search keywords, it’s important to remember that we do have to respect common usage. Thus, keywords for common terms should be placed on the appropriate pages.&lt;br /&gt;
&lt;br /&gt;
=== What to capitalize ===&lt;br /&gt;
&lt;br /&gt;
Follow standard rules for capitalization; that is, capitalize: &lt;br /&gt;
* Proper nouns&lt;br /&gt;
* The first letter of the first word in numbered or bulleted lists&lt;br /&gt;
&lt;br /&gt;
Also capitalize:&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;Second Life Viewer&amp;quot; and &amp;quot;Viewer&amp;quot; when referring to our client software.&lt;br /&gt;
* Second Life&lt;br /&gt;
* Linden Lab&lt;br /&gt;
* Internet&lt;br /&gt;
* Linden Dollar&lt;br /&gt;
* Resident or Residents, when referring to the Second Life community members.&lt;br /&gt;
* Region (when referring to a Second Life Region), Private Region, Homestead Region, Openspace Region.&lt;br /&gt;
&lt;br /&gt;
* Second Life Region names, for example:&lt;br /&gt;
** Ahern&lt;br /&gt;
** Help Island&lt;br /&gt;
** Serenity&lt;br /&gt;
&lt;br /&gt;
* The first letter of each term that identifies the name of a key on a keyboard:&lt;br /&gt;
** Ctrl-A&lt;br /&gt;
** Escape key&lt;br /&gt;
** the M key&lt;br /&gt;
** Ctrl-Shift-Q&lt;br /&gt;
&lt;br /&gt;
* The first letter of each term that identifies a particular button or menu item within the Second Life client:&lt;br /&gt;
** Inventory&lt;br /&gt;
** Fly&lt;br /&gt;
** IM button&lt;br /&gt;
** Edit menu&lt;br /&gt;
&lt;br /&gt;
* Acronyms:&lt;br /&gt;
** SL&lt;br /&gt;
** HTML&lt;br /&gt;
** WWW&lt;br /&gt;
&lt;br /&gt;
In general, capitalize any interface element (names of fields, buttons, menus, etc) exactly as it appears in the Second Life Viewer.&lt;br /&gt;
 &lt;br /&gt;
&#039;&#039;&#039;Do not capitalize the following words/phrases&#039;&#039;&#039;:&lt;br /&gt;
* Web/website (Unless in the context of &amp;quot;World Wide Web&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
=== Use of jargon ===&lt;br /&gt;
If you’re writing help docs for Second Life, you hopefully know the difference between a prim and a Class 4 server, but do the Residents reading your article? Depending on the audience your article is geared towards, they very well may not. With that in mind, we can avoid confusion in one of the following ways:&lt;br /&gt;
&lt;br /&gt;
* If there’s an actual English word or phrase for what you’re describing, use that instead of Second Life jargon.&lt;br /&gt;
* If you can&#039;t do that for some reason, link the first occurrence of each Second Life-related technical term to its appropriate page, or to its entry in the glossary. &amp;quot;Rez&amp;quot; shouldn&#039;t have its own page, but a good place to point to would be a page on building terminology. Likewise, &amp;quot;Class 5 server&amp;quot; should link to the Region Sales page, if that’s the most applicable.&lt;br /&gt;
&lt;br /&gt;
As a rule of thumb, if you’re working on something involving advanced subject matter, (such as a page on prim torturing) basic terms like &amp;quot;rez&amp;quot; or &amp;quot;IP address&amp;quot; might not need to be defined.&lt;br /&gt;
&lt;br /&gt;
If you’re writing an article titled &amp;quot;I just started. What do I do now?&amp;quot;, &#039;&#039;everything&#039;&#039; will be new to those reading. When writing for a general audience, the trick is balancing between the phrases &amp;quot;rez a prim&amp;quot; and &amp;quot;create a primitive, one of the simple building blocks that can be used to create everything you see in Second Life&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Supplementary to the [[Glossary]], let&#039;s remember jargon that might be confusing or just plain opaque to new Resis or non-English speakers. Such as:&lt;br /&gt;
&lt;br /&gt;
* rez, rezzing = appear inworld&lt;br /&gt;
* av, avi = avatar&lt;br /&gt;
* TP, teep, port = teleport&lt;br /&gt;
* cam, alt-zoom = free camera motion using Alt + mouse&lt;br /&gt;
* AO = Animation Override&lt;br /&gt;
&lt;br /&gt;
All SL-specific terms should be spelled properly based on their predominant usage. For example, it&#039;s &amp;quot;rez&amp;quot; and &amp;quot;rezzed&amp;quot;, &#039;&#039;not&#039;&#039; &amp;quot;res&amp;quot; and &amp;quot;ressed&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Certain terms should be capitalized, others should not. Others will be changed in time. &lt;br /&gt;
&lt;br /&gt;
Again, [[Glossary|refer to the glossary]] for proper contextual usage.&lt;br /&gt;
&lt;br /&gt;
==== &amp;quot;First life&amp;quot; ====&lt;br /&gt;
Avoid using the term &amp;quot;first life&amp;quot; for anything that takes place in, well, first life. You can usually write around places where this comes up by including the phrase &amp;quot;outside of Second Life,&amp;quot; which is handy.&lt;br /&gt;
&lt;br /&gt;
== Formatting ==&lt;br /&gt;
This section covers the actual formatting of text. Should that thing be bold? Do we italicize the names of fields? Fortunately, since we&#039;re sticking more or less to HTML in the Knowledge Base, this will be extremely simple.&lt;br /&gt;
&lt;br /&gt;
=== General rules ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Bold&#039;&#039;&#039; - Use &#039;&#039;&#039;bold text&#039;&#039;&#039; to refer to anything in the UI that you need to click on or interact with. This includes:&lt;br /&gt;
** Names of tabs&lt;br /&gt;
** Names of fields&lt;br /&gt;
*** Selections you would make from fields&lt;br /&gt;
** Labels of buttons&lt;br /&gt;
** Names of links&lt;br /&gt;
** Menus and menu item selections&lt;br /&gt;
** Examples:&lt;br /&gt;
*** In the Tools window, click the &#039;&#039;&#039;More&#039;&#039;&#039; button.&lt;br /&gt;
*** In the Tools window, click the &#039;&#039;&#039;Object&#039;&#039;&#039; tab.&lt;br /&gt;
*** From the &#039;&#039;&#039;Building Block Type&#039;&#039;&#039; dropdown, select &#039;&#039;&#039;Cube&#039;&#039;&#039;.&lt;br /&gt;
*** Select &#039;&#039;&#039;World&#039;&#039;&#039; &amp;gt; &#039;&#039;&#039;Force Sun&#039;&#039;&#039; &amp;gt; &#039;&#039;&#039;Sunset&#039;&#039;&#039; to make the sun set immediately.&lt;br /&gt;
* &#039;&#039;&#039;Not Bold&#039;&#039;&#039; - Do not use bold for window titles.&lt;br /&gt;
* &#039;&#039;&#039;Italics&#039;&#039;&#039; - Use italics sparingly, in cases of EXTREME EMPHASIS (which should be quite rare). On even rarer occasion, captions for images.&lt;br /&gt;
* &#039;&#039;&#039;Quotation Marks&#039;&#039;&#039; - Anytime you need to specify something that the user needs to input, put it inside quotation marks. This is usually only applicable to text fields, and it&#039;s probably rare that we would need to specify an exact string for someone to enter, but this might come in handy one day.&lt;br /&gt;
** I.e., In the &#039;&#039;&#039;About&#039;&#039;&#039; field, type &amp;quot;I am the king of this land and all that I survey.&amp;quot;&lt;br /&gt;
* &#039;&#039;&#039;Punctuation&#039;&#039;&#039; - Jon thinks it makes more sense not to apply styles to punctuation.&lt;br /&gt;
** I.e., Click &#039;&#039;&#039;OK&#039;&#039;&#039;.&lt;br /&gt;
** The period isn&#039;t bold.&lt;br /&gt;
** Jon likes this because it&#039;s consistent: The period doesn&#039;t show up on the button, so why bold it?&lt;br /&gt;
** Confession: They did the opposite of this at Jon&#039;s old company, and it always vexed him.&lt;br /&gt;
* &#039;&#039;&#039;Superscript&#039;&#039;&#039; - Use &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;sup&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; tags to properly raise text as-needed. A common example is properly showing the abbreviation for &amp;quot;square meters&amp;quot;.&lt;br /&gt;
** WRONG: m2&lt;br /&gt;
** RIGHT: m&amp;lt;sup&amp;gt;2&amp;lt;/sup&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Other typography&#039;&#039;&#039; - Use &#039;&#039;real&#039;&#039; em dashes to indicate a break in thought: &amp;quot;—&amp;quot;, not &amp;quot;--&amp;quot; or &amp;quot;-&amp;quot;.&lt;br /&gt;
** If you can&#039;t enter them on your keyboard, just copy them or use the &amp;lt;code&amp;gt;&amp;amp;amp;mdash;&amp;lt;/code&amp;gt; html entity.&lt;br /&gt;
&lt;br /&gt;
=== Titles and subtitles ===&lt;br /&gt;
Use sentence capitalization for all titles and headings. This means to capitalize the first letter in the heading (as well as other words that are normally capitalized such as proper nouns). Do not capitalize other words that would not normally be capitalized. For example:&lt;br /&gt;
&lt;br /&gt;
* INCORRECT: &#039;&#039;&#039;An Overview of Second Life Security&#039;&#039;&#039;&lt;br /&gt;
* CORRECT: &#039;&#039;&#039;An overview of Second Life security&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
* INCORRECT: &#039;&#039;&#039;How Do I Attach and Detach Objects From My Avatar?&#039;&#039;&#039;&lt;br /&gt;
* CORRECT: &#039;&#039;&#039;How do I attach and detach objects from my avatar?&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=== Lists ===&lt;br /&gt;
What follows are some guidelines surrounding lists.&lt;br /&gt;
&lt;br /&gt;
==== Numbered lists ====&lt;br /&gt;
Use numbered lists for a series of steps that &#039;&#039;must&#039;&#039; be followed in order:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;# Click the &#039;&#039;&#039;Log in&#039;&#039;&#039; button.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;# Read the Messsage of the Day.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;# Smile!&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Results in:&lt;br /&gt;
&lt;br /&gt;
# Click the &#039;&#039;&#039;Log in&#039;&#039;&#039; button.&lt;br /&gt;
# Read the Messsage of the Day.&lt;br /&gt;
# Smile!&lt;br /&gt;
&lt;br /&gt;
In general, each item or instruction in a numbered list should be a complete sentence and should be punctuated accordingly — that is, with a period, an exclamation point or (in rare cases) a question mark.&lt;br /&gt;
&lt;br /&gt;
==== Unordered lists ====&lt;br /&gt;
Use bullet points for series of brief points. They&#039;re often found in the form of mid-article &amp;quot;Quick tips&amp;quot; or &amp;quot;Related resources&amp;quot; at the end of an article:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;* Consider that!&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;* Consider this!&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;** A sub-point, but don&#039;t go overboard on these.&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If you find yourself writing bullet points with long paragraphs, consider whether a list is the best format.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Files, paths, URLs, code, and other typed user input ===&lt;br /&gt;
Use the &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;&amp;lt;code&amp;gt;&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt; tag to show a background-colored, fixed-pitch font for file names, directory paths, URLs (or portions thereof), code snippets, and other typed user input. For example:&lt;br /&gt;
&lt;br /&gt;
* Look in &amp;lt;code&amp;gt;C:\Program Files\Second Life\app_settings\&amp;lt;/code&amp;gt;.&lt;br /&gt;
* Edit the &amp;lt;code&amp;gt;settings.xml&amp;lt;/code&amp;gt; file.&lt;br /&gt;
* Retrieve your capability from &amp;lt;code&amp;gt;https://cap.secondlife.com/get_reg_capabilities&amp;lt;/code&amp;gt;&lt;br /&gt;
* Use the &amp;lt;code&amp;gt;max_results&amp;lt;/code&amp;gt; query parameter to limit the number of results returned.&lt;br /&gt;
* Use the &amp;lt;code&amp;gt;AgentLimit&amp;lt;/code&amp;gt; object to programmatically limit the number of agents present in a Region.&lt;br /&gt;
* In the top box, type &amp;lt;code&amp;gt;512&amp;lt;/code&amp;gt;.&lt;br /&gt;
* In the Region field, type &amp;lt;code&amp;gt;Sandbox Newcomb&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
Put lengthy URLs on a separate line using the &amp;lt;code&amp;gt;&amp;amp;lt;pre&amp;amp;gt;&amp;lt;/code&amp;gt; tag.&lt;br /&gt;
&lt;br /&gt;
For multi-line code samples, use the [[Syntax Highlighting Examples|syntax highlighting extension]]; for example:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;python&amp;gt; # Hello World in Python&lt;br /&gt;
&lt;br /&gt;
 def main():&lt;br /&gt;
     print &amp;quot;Hello World!&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
 if __name__ == &#039;__main__&#039;:&lt;br /&gt;
     main()&amp;lt;/python&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Tables ===&lt;br /&gt;
We use [[Template:KBtable]], to automatically style tables consistently. [[Template:KBtablehead]] is used if the table has a header row. The overall emphasis is on minimal, elegant readability without too much &amp;quot;boxiness&amp;quot;. The style is subject to future revision.&lt;br /&gt;
&lt;br /&gt;
For example, this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&amp;lt;nowiki&amp;gt;&lt;br /&gt;
{| {{KBtable}}&lt;br /&gt;
|- {{KBtablehead}}&lt;br /&gt;
!  &lt;br /&gt;
! Column A&lt;br /&gt;
! Column B&lt;br /&gt;
! Column C&lt;br /&gt;
&lt;br /&gt;
|- &lt;br /&gt;
| &#039;&#039;&#039;Row A&#039;&#039;&#039;&lt;br /&gt;
| fill&lt;br /&gt;
| in&lt;br /&gt;
| these&lt;br /&gt;
&lt;br /&gt;
|- &lt;br /&gt;
| &#039;&#039;&#039;Row B&#039;&#039;&#039;&lt;br /&gt;
| values&lt;br /&gt;
| and &lt;br /&gt;
| win&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/nowiki&amp;gt;&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
becomes:&lt;br /&gt;
&lt;br /&gt;
{| {{KBtable}}&lt;br /&gt;
|- {{KBtablehead}}&lt;br /&gt;
!  &lt;br /&gt;
! Column A&lt;br /&gt;
! Column B&lt;br /&gt;
! Column C&lt;br /&gt;
&lt;br /&gt;
|- &lt;br /&gt;
| &#039;&#039;&#039;Row A&#039;&#039;&#039;&lt;br /&gt;
| fill&lt;br /&gt;
| in&lt;br /&gt;
| these&lt;br /&gt;
&lt;br /&gt;
|- &lt;br /&gt;
| &#039;&#039;&#039;Row B&#039;&#039;&#039;&lt;br /&gt;
| values&lt;br /&gt;
| and &lt;br /&gt;
| win&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For advanced users, [http://www.mediawiki.org/wiki/Help:Tables further styling is available].&lt;br /&gt;
&lt;br /&gt;
=== Warnings, notes, tips, and other templates  ===&lt;br /&gt;
If there&#039;s something you think deserves some special emphasis in a Knowledge Base article, make a warning, a note, or a tip out of it.&lt;br /&gt;
The following table describes the main KB templates, part of a [[:Category:KB Templates|larger group of KB templates]].&lt;br /&gt;
&lt;br /&gt;
{| {{KBtable}}&lt;br /&gt;
|- {{KBtablehead}}&lt;br /&gt;
! Template&lt;br /&gt;
! Wiki code&lt;br /&gt;
! Description&lt;br /&gt;
! What it looks like&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;[[Template:KBwarning]]&#039;&#039;&#039; &lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{KBwarning|Foo}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
| A strong notice of what NOT to do, and if applicable, the consequences, including something that can cause harm or damage.&lt;br /&gt;
| {{KBwarning|Foo}}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;[[Template:KBcaution]]&#039;&#039;&#039;&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{KBcaution|Foo}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
| An important notice of what NEEDS to or SHOULD be done — basically, the opposite of KBwarning.&lt;br /&gt;
| {{KBcaution|Foo}}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;[[Template:KBtip]]&#039;&#039;&#039;&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{KBtip|Foo}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
| A helpful hint to make a process easier to do.&lt;br /&gt;
| {{KBtip|Foo}}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;[[Template:KBnote]]&#039;&#039;&#039;&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{KBnote|Foo}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Additional considerations and things that are good to know.&lt;br /&gt;
| {{KBnote|Foo}}&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| &#039;&#039;&#039;[[Template:KBtrivia]]&#039;&#039;&#039;&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{KBtrivia|Foo}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
| Optional, bonus knowledge. These are &#039;&#039;&#039;least&#039;&#039;&#039; relevant of the templates and an article should be able to be understood entirely &#039;&#039;without&#039;&#039; trivia.&lt;br /&gt;
| {{KBtrivia|Foo}}&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
For example, here is an item that deserves use of the &#039;&#039;&#039;KBCaution&#039;&#039;&#039; template:&lt;br /&gt;
&lt;br /&gt;
{{KBcaution|Be sure to click the &#039;&#039;&#039;Save&#039;&#039;&#039; button or your work will be lost!}}&lt;br /&gt;
&lt;br /&gt;
==== Troubleshooting ==== &lt;br /&gt;
If you have problems including certain styling or a link in a template, a &amp;quot;?&amp;quot; or other characters may be interfering. Use the format &amp;quot;&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{TemplateName|1=text}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&amp;quot; with the &amp;quot;&amp;lt;code&amp;gt;1=&amp;lt;/code&amp;gt;&amp;quot;. For example:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;{{KBcaution|1=[http://forums-archive.secondlife.com/327/85/252954/1.html Don&#039;t click this!]}}&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
becomes (RIGHT):&lt;br /&gt;
&lt;br /&gt;
{{KBwarning|1=[http://forums-archive.secondlife.com/327/85/252954/1.html Don&#039;t click this!]}}&lt;br /&gt;
&lt;br /&gt;
instead of (WRONG):&lt;br /&gt;
&lt;br /&gt;
{{KBwarning|http://forums-archive.secondlife.com/327/85/252954/1.html Don&#039;t click this!]}}&lt;br /&gt;
&lt;br /&gt;
=== Links ===&lt;br /&gt;
&#039;&#039;Link liberally!&#039;&#039; [http://www.mediawiki.org/wiki/Help:Links Links] make it easier to discover more info about a given topic, and save someone the trouble of searching. If faced with a choice whether to link to relevant details or not, you can safely err on the side of linking.&lt;br /&gt;
&lt;br /&gt;
Link to relevant pages where more info is provided or there are terms that benefit from further definition. For instance, in an article about performance tips:&lt;br /&gt;
&lt;br /&gt;
: If you&#039;re in a crowded area, make sure to enable [[Avatar Impostors]].&lt;br /&gt;
&lt;br /&gt;
This has a dual benefit:&lt;br /&gt;
&lt;br /&gt;
# Saves space because you don&#039;t need to explain an advanced concept in the current article, since the knowledge already exists — a primer sentence or two is fine.&lt;br /&gt;
# Makes it easier to navigate through related topics, as [http://xkcd.com/214/ famously illustrated in &#039;&#039;xkcd&#039;&#039;].&lt;br /&gt;
&lt;br /&gt;
==== Imperative sentences ====&lt;br /&gt;
Linking &amp;quot;imperative sentences&amp;quot;, as long as they&#039;re not an eyesore long, is encouraged to prompt action and tell the reader what happens if they click that link:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;RIGHT&#039;&#039;&#039; - You can [http://get.secondlife.com download Second Life]&lt;br /&gt;
* &#039;&#039;&#039;WRONG&#039;&#039;&#039; - You can download [http://get.secondlife.com Second Life]&lt;br /&gt;
&lt;br /&gt;
Also, citing articles where there may be ambiguity, whether they&#039;re in the Knowledge Base or elsewhere, should be done like this:&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;RIGHT&#039;&#039;&#039; - For more information, [http://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;amp;task=knowledge&amp;amp;questionID=4356 see &amp;quot;What are Second Life&#039;s subnets?&amp;quot;].&lt;br /&gt;
* &#039;&#039;&#039;WRONG&#039;&#039;&#039; - For more information, see [http://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;amp;task=knowledge&amp;amp;questionID=4356 What are Second Life&#039;s subnets?].&lt;br /&gt;
** The hyperlink may color the article title, but consider if this is printed, that won&#039;t be as evident. Just like non-hyperlinked print media, quotation marks should enclose titles of shorter written works.&lt;br /&gt;
* &#039;&#039;&#039;WRONG&#039;&#039;&#039; - Read [http://support.secondlife.com/ics/support/default.asp?deptID=4417&amp;amp;task=knowledge&amp;amp;questionID=4356 this article] for information on Second Life&#039;s subnets.&lt;br /&gt;
&lt;br /&gt;
=== Images ===&lt;br /&gt;
Pictures show Second Life as-is. They can be uploaded using the &amp;quot;[[Special:Upload|Upload file]]&amp;quot; form. All images must be uploaded to this Wiki, we can&#039;t link to externally-hosted files.&lt;br /&gt;
&lt;br /&gt;
Generally, upload images as PNG, since it&#039;s lossless and the Wiki will dynamically resize them to JPGs.&lt;br /&gt;
&lt;br /&gt;
Images should be inserted into articles at a width of 640 pixels (640px), or less if the original image dimensions are readable at smaller sizes. This tends to be a good balance between visibility and content balance:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;[[Image:Flying-car.jpg|640px]]&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Results in:&lt;br /&gt;
&lt;br /&gt;
: [[Image:Flying-car.jpg|640px]]&lt;br /&gt;
&lt;br /&gt;
The original flying car is 1024px wide.&lt;br /&gt;
&lt;br /&gt;
If an image has extreme dimensions, such as being very narrow and vertically long, consider cropping it selectively in an image editor, then reupload.&lt;br /&gt;
&lt;br /&gt;
Thumbnails can be used sparingly if there&#039;s a need to include multiple images:&lt;br /&gt;
&lt;br /&gt;
 &amp;lt;nowiki&amp;gt;[[Image:Flying-car.jpg|none|thumb|&#039;&#039;Oh look! A flying car!&#039;&#039;]]&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Results in:&lt;br /&gt;
&lt;br /&gt;
: [[Image:Flying-car.jpg|none|thumb|&#039;&#039;Oh look! A flying car!&#039;&#039;]]&lt;br /&gt;
&lt;br /&gt;
Also! You can [http://en.wikipedia.org/wiki/Image_markup#Link link an image to another Wiki page or external site].&lt;br /&gt;
&lt;br /&gt;
==== Styles ====&lt;br /&gt;
* There&#039;s no need to center-align images. In edge cases, they may be desired for aesthetic purposes. It&#039;s alright to leave them default, or left-aligned.&lt;br /&gt;
* Emulate the official callouts and highlights as closely as possible. We use Camtasia&#039;s SnagIt software.&lt;br /&gt;
* Only include as much as you really need; if you&#039;re talking about the Tools window, you don&#039;t have to capture the entire Second Life window.&lt;br /&gt;
* If you&#039;re going to call out something specific, like circling a button or a menu choice, use pink, and make sure the line is thick enough to stand out without obscuring anything else excessively.&lt;br /&gt;
* Use PNG format rather than GIF, unless you&#039;re taking a picture of something inworld, in which case go with a JPEG.&lt;br /&gt;
&lt;br /&gt;
Captions for screenshots! If you&#039;re going to put a sentence next to a screenshot, it should include some useful information that&#039;s not readily apparent in the actual screenshot itself.&lt;br /&gt;
&lt;br /&gt;
* A caption should be below the picture with no extra white space between.&lt;br /&gt;
* Use a complete sentence, and punctuate it as you would a sentence.&lt;br /&gt;
* Italicize the whole thing too, why not.&lt;br /&gt;
* As far as we&#039;re aware, there&#039;s no need to label it (&amp;quot;Figure 1&amp;quot; or what-have-you).&lt;br /&gt;
* Use the default skin for consistency.&lt;br /&gt;
&lt;br /&gt;
==== Revisions ====&lt;br /&gt;
Images can be automatically replaced by another with the same filename. This is useful if there&#039;s a new version of the Second Life Viewer with user interface changes and you have fresh screenshots. Simply upload, then confirm you want to replace the older version. This replaces it for all linked instances on the Wiki. If you make a mistake, you can revert.&lt;br /&gt;
&lt;br /&gt;
=== Videos ===&lt;br /&gt;
You can embed videos &amp;amp; multimedia to make articles more useful and fun. [http://secondlife.com/video Video tutorials] make it easier to understand kinetic, 3D concepts. For example, &amp;quot;&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{KBvideo|3578377}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&amp;quot; becomes:&lt;br /&gt;
&lt;br /&gt;
{{KBvideo|3578377}}&lt;br /&gt;
&lt;br /&gt;
Like images, embed videos at a width of 640px. See [[Template:KBvideo]] for more info. Also whenever appropriate: include the video in its own section with &amp;quot;Video tutorial&amp;quot; header, and a text summary of what it&#039;s about. This can be done as bullet points.&lt;br /&gt;
&lt;br /&gt;
We standardized on [http://vimeo.com/torley/videos Vimeo for Torley&#039;s official video tutorials which you can search through], or &amp;quot;vidtuts&amp;quot; for short. (We also have an alternative [http://www.mediawiki.org/wiki/Extension:Widgets Widgets] extension, but it conflicts with FlaggedRevs, so &#039;&#039;don&#039;t&#039;&#039; use it for videos on official Knowledge Base articles.)&lt;br /&gt;
&lt;br /&gt;
=== Navigation Templates ===&lt;br /&gt;
{{Navbox/Adult}}&lt;br /&gt;
&lt;br /&gt;
{{KBtodo|This spec is still being defined. COME SEE [[Torley]] if you have questions.}}&lt;br /&gt;
&lt;br /&gt;
You can use &#039;&#039;&#039;[[Template:Navbox|navigation templates]]&#039;&#039;&#039; to provide easy links to related articles, as shown in the actual example of [[Template:Navbox/Adult]] to the right. They can be any articles you choose; all you have to do is insert the template code at the top of a page. For ease of maintenance, you should create a new [[Special:PrefixIndex/Template:|template]] when designing a Navbox for a new set of related articles.&lt;br /&gt;
&lt;br /&gt;
==== Best practices ====&lt;br /&gt;
&#039;&#039;&#039;Navigation templates provide helpful&#039;&#039;&#039; &#039;&#039;&#039;&#039;&#039;navigation&#039;&#039;&#039;&#039;&#039;:&lt;br /&gt;
&lt;br /&gt;
* Choose your articles carefully. Does this navbox help the reader move effectively between related topics? Pick any two articles in the template. Would a reader really want to go from A to B? An overpopulated navigation template creates clutter and loses its effectiveness.&lt;br /&gt;
* Navigation templates should be relatively small. If you find you have too many articles in a single template, consider separating some of them out into more than one template, or remove some from your list, leaving only the most directly related and relevant articles.&lt;br /&gt;
* Navigation templates shouldn&#039;t be &#039;&#039;too&#039;&#039; small. A navbox with only two links might be better served by a normal link in the body of each article.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Navigation templates provide navigation between &#039;&#039;existing&#039;&#039; articles&#039;&#039;&#039;:&lt;br /&gt;
* Navigation templates shouldn&#039;t contain &amp;quot;red links&amp;quot;. If the article doesn&#039;t exist yet, please write it first!&lt;br /&gt;
* Try to avoid unlinked text in a navigation template.&lt;br /&gt;
* Unless deemed essential,  avoid the use of &#039;&#039;&#039;external, offsite links&#039;&#039;&#039; in navigation templates. Instead, include any external links in the main article.&lt;br /&gt;
&lt;br /&gt;
==== Style ====&lt;br /&gt;
Many style concerns with navigation templates are automatically covered by the [[Template:Navbox|Navbox template]].  However, here are a few additional style guidelines:&lt;br /&gt;
&lt;br /&gt;
* Article titles in a navigation template should always be presented as a &#039;&#039;&#039;bullet list&#039;&#039;&#039;.&lt;br /&gt;
* Always use each article&#039;s &#039;&#039;&#039;full title&#039;&#039;&#039;.  This is for the purpose of standardization and navigational clarity; an article&#039;s title is its unique identifier.  We understand that some article titles are exceptionally long, and we are currently considering options to universally shorten and standardize Knowledge Base article titles. &lt;br /&gt;
* Avoid unuseful font styles (bold, italic, etc) in article titles or the navbox title.&lt;br /&gt;
&lt;br /&gt;
== Grammar and language ==&lt;br /&gt;
This section contains tips on grammar and dialect that are useful.&lt;br /&gt;
&lt;br /&gt;
=== Thoughts on style ===&lt;br /&gt;
&#039;&#039;&amp;quot;The best way to be boring is to leave nothing out&amp;quot; -Voltaire&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Edit articles consistent with their original &amp;quot;vibe&amp;quot; as established by employees of Linden Lab. Some topics will obviously be more jovial than others. Language (English and international equivalents) should be terse enough to communicate succinctly, but not so dry that it&#039;s boring. Humor is useful to get the point across with examples, but shouldn&#039;t distract from understanding.&lt;br /&gt;
&lt;br /&gt;
Overall, since this is reference material, the Knowledge Base&#039;s tone is more formal than casual venues than the [https://blog.secondlife.com/ Official Second Life Blogs]. When in doubt, consult existing articles by the Doc Team and ask!&lt;br /&gt;
&lt;br /&gt;
=== Common grammatical errors ===&lt;br /&gt;
&#039;&#039;&#039;Semicolons&#039;&#039;&#039; are used to separate two clauses of a compound sentence while still indicating a closer relationship between the two clauses than a period would. We can think of them as somewhere between a comma and a period.&lt;br /&gt;
&lt;br /&gt;
Try to avoid using a comma where a semicolon would be more appropriate. If you&#039;re unsure, ask someone.&lt;br /&gt;
&lt;br /&gt;
For a more detailed explanation of semicolons, see [http://www.wisc.edu/writing/Handbook/Semicolons.html UW-Madison&#039;s Writer&#039;s Handbook entry on semicolon usage].&lt;br /&gt;
&lt;br /&gt;
Note: The best is to use short, concise sentences rather than longer ones.&lt;br /&gt;
&lt;br /&gt;
=== Latin abbreviations ===&lt;br /&gt;
&lt;br /&gt;
Latin abbreviations such as &amp;quot;e.g.&amp;quot; may not be universally understood, and can cause difficulty with translation. Follow the guidelines below:&lt;br /&gt;
&lt;br /&gt;
{| {{KBtable}}&lt;br /&gt;
&lt;br /&gt;
|- {{KBtablehead}}&lt;br /&gt;
! Do not use&lt;br /&gt;
! Use instead&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| i.e.&lt;br /&gt;
| that is&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| e.g.&lt;br /&gt;
| for example&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
| etc.&lt;br /&gt;
| and so on&lt;br /&gt;
&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== Mixing menus and windows ===&lt;br /&gt;
We use &amp;quot;&amp;gt;&amp;quot; to indicate hierarchy, and it&#039;s usually unnecessary to state &amp;quot;menu&amp;quot; unless there&#039;s abject confusion or the article is for newcomers.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;RIGHT&#039;&#039;&#039; - &#039;&#039;&#039;File &amp;gt; Take Snapshot&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;WRONG&#039;&#039;&#039; - &#039;&#039;&#039;File —&amp;gt; Take Snapshot&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The same applies for the pie menu, where &amp;quot;&amp;gt;&amp;quot; is explicitly shown for deeper levels.&lt;br /&gt;
&lt;br /&gt;
When UI elements are mixed, make this obvious.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;RIGHT&#039;&#039;&#039; - Open the Preferences window by selecting &#039;&#039;&#039;Edit &amp;gt; Preferences&#039;&#039;&#039;, click the &#039;&#039;&#039;Network&#039;&#039;&#039; tab, then uncheck &#039;&#039;&#039;Custom Port Connection&#039;&#039;&#039;.&lt;br /&gt;
* &#039;&#039;&#039;WRONG&#039;&#039;&#039; - &#039;&#039;&#039;Edit &amp;gt; Preferences &amp;gt; Network&#039;&#039;&#039; tab &amp;gt; uncheck &#039;&#039;&#039;Custom Port Connection&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
We&#039;re aware the latter is used by the technically-savvy and in brief [http://jira.secondlife.com Issue Tracker] reports, but for the purposes of explaining Second Life as clearly as possible to newer Residents, we do the former.&lt;br /&gt;
&lt;br /&gt;
=== Keystrokes ===&lt;br /&gt;
We&#039;re aware some conventions prefer &amp;quot;+&amp;quot; over &amp;quot;-&amp;quot; as a joiner, and some operating systems (like Mac OS X&#039;s own menus) dispense with them entirely. However, this Style Guide is about &#039;&#039;Second Life&#039;&#039;; for now, represent shortcuts as they&#039;re shown in the Viewer menus.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;RIGHT&#039;&#039;&#039; - Ctrl-Shift-W&lt;br /&gt;
* &#039;&#039;&#039;WRONG&#039;&#039;&#039; - Ctrl + Shift + W&lt;br /&gt;
&lt;br /&gt;
To visually prettify your keystrokes and make them stand out, use [[Template:K]]. For example:&lt;br /&gt;
&lt;br /&gt;
* &amp;quot;&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{K|T}} key&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&amp;quot; becomes {{K|T}} key&lt;br /&gt;
* &amp;quot;&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{K|Ctrl|Shift|W}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&amp;quot; becomes {{K|Ctrl|Shift|W}}&lt;br /&gt;
* &amp;quot;&amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;{{K|Up}} {{K|Left}} {{K|Down}} {{K|Right}}&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&amp;quot; becomes {{K|Up}} {{K|Left}} {{K|Down}} {{K|Right}}&lt;br /&gt;
** This is great for symbols like arrow keys instead of spelling out &amp;quot;up arrow&amp;quot;.&lt;br /&gt;
* See &amp;quot;[[PC and Mac shortcut key differences]]&amp;quot; for how this template looks in a live article.&lt;br /&gt;
&lt;br /&gt;
The full list of special keys is shown when editing [[Template:K/core]].&lt;br /&gt;
&lt;br /&gt;
=== Dialect ===&lt;br /&gt;
As Second Life began with a predominantly American user base, all Second Life English-language documentation should be standardized on American English.  (We may revisit this policy in the far future, but it would require such an extensive overhaul to so many documents that it seems somewhat suboptimal from a time cost/benefit standpoint, given the other things we could be working on)&lt;br /&gt;
&lt;br /&gt;
This means:&lt;br /&gt;
* We use &amp;quot;col&#039;&#039;&#039;o&#039;&#039;&#039;r&amp;quot; instead of &amp;quot;col&#039;&#039;&#039;ou&#039;&#039;&#039;r&amp;quot;.&lt;br /&gt;
* &amp;quot;Recogni&#039;&#039;&#039;z&#039;&#039;&#039;e&amp;quot; instead of &amp;quot;recogni&#039;&#039;&#039;s&#039;&#039;&#039;e&amp;quot;&lt;br /&gt;
* Acronyms are written in all-caps without periods, except when they&#039;re a brand. (DOS, TCP/IP, NASA, WiFi, D.A.R.E. — these are all correct.)&lt;br /&gt;
&lt;br /&gt;
Writing in another dialect may be a hard habit to get into. It&#039;s to be expected that some mistakes will slip through. We&#039;ll still work to correct them, but these sorts of errors should be considered low-priority, trumped first by technical inaccuracy and simply incorrect grammar and sentence structure.&lt;br /&gt;
&lt;br /&gt;
=== Trademarks ===&lt;br /&gt;
The first instance of Second Life® in an article should have a [http://en.wikipedia.org/wiki/Registered_trademark_symbol registered trademark] after it to assert our brand. Our trademarks should always be respected, and [http://secondlife.com/corporate/trademark/ you can learn more].&lt;br /&gt;
&lt;br /&gt;
=== Advanced additions ===&lt;br /&gt;
The Second Life Wiki keeps growing and we laud Resident enthusiasm to evolve styles. Be aware some styles are very useful for other sections on the Wiki but don&#039;t apply to us yet. Various issues of note are recorded on [[User:Torley/Code]].&lt;br /&gt;
&lt;br /&gt;
Please don&#039;t make any broad style changes without consulting with the [[Doc_team|Documentation Team]] first. We&#039;re here to help and would be happy to have a look.&lt;br /&gt;
&lt;br /&gt;
=== Commentary ===&lt;br /&gt;
If you want to discuss an article, &#039;&#039;don&#039;t&#039;&#039; place inline comments unless it&#039;s an article which explicitly invites them, because it leads to clutter. Instead, use the Discussion (&amp;quot;Talk&amp;quot;) tab, located at the top of every article. The same style guidelines apply here, and you should sign your commentary for clear attribution.&lt;br /&gt;
&lt;br /&gt;
[[Category:Knowledge Base Policy]]&lt;/div&gt;</summary>
		<author><name>Lady Sumoku</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LSL_Portal_Style&amp;diff=1197616</id>
		<title>LSL Portal Style</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LSL_Portal_Style&amp;diff=1197616"/>
		<updated>2015-09-26T15:37:23Z</updated>

		<summary type="html">&lt;p&gt;Lady Sumoku: Grammar: &amp;quot;its&amp;quot;, not &amp;quot;it is&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;This is a place holder for the [[Talk:LSL_Portal_Style|discussion page]].&lt;br /&gt;
&lt;br /&gt;
== FAQ ==&lt;br /&gt;
Questions about how to and why certain things are styled as they are.&lt;br /&gt;
&lt;br /&gt;
=== Constants ===&lt;br /&gt;
&lt;br /&gt;
:&#039;&#039;&#039;Q:&#039;&#039;&#039; Why are some integer constants written in hexadecimal and others in decimal notation?&lt;br /&gt;
:&#039;&#039;&#039;A:&#039;&#039;&#039; Patterns. No constant is an island, they all exists within a larger context. Some constants are intended to be OR&#039;ed, some are just simple counting numbers, sometimes the notation can give hints as to how you can manipulate the answer. Some examples:&lt;br /&gt;
:* [[PARCEL_FLAG_USE_ACCESS_LIST]] - Written in hexadecimal to show the pattern of it and its siblings. In the table they are extra wide to aid in the reading.&lt;br /&gt;
:* [[llSetCameraParams]] - Written in decimal notation, the flags are consecutively allocated.&lt;br /&gt;
:* [[llParticleSystem]] is a good example where both notations are used for constants. Different constants used within the function have different relationships.&lt;br /&gt;
&lt;br /&gt;
== Old Style Discussions ==&lt;br /&gt;
&lt;br /&gt;
# [[LSL Category Style]] - Used for categorizing groups of LSL functions and other Tables of Contents.&lt;br /&gt;
# [[LSL Function Style]] - Used for the full specification of all LSL functions.&lt;br /&gt;
# [[LSL Topic Style]] - Used for topics of interest related to using LSL (XML-RPC, quaternions, etc).&lt;br /&gt;
# [[LSL Constants Style]] - Used for documenting constants.&lt;/div&gt;</summary>
		<author><name>Lady Sumoku</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Cow_Taurog/Radio_tuner&amp;diff=1196117</id>
		<title>User:Cow Taurog/Radio tuner</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Cow_Taurog/Radio_tuner&amp;diff=1196117"/>
		<updated>2015-04-12T03:46:44Z</updated>

		<summary type="html">&lt;p&gt;Lady Sumoku: Replaced old &amp;lt;LSL&amp;gt; block with &amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;, also for &amp;lt;php&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;These scripts will allow you to change your land&#039;s [[Streaming Music|music url]] from a list of presets, or by saying the url of a &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://en.wikipedia.org/wiki/PLS_(file_format) *.pls playlist file] over chat. Place the fread.php file on a webhost, set the tuner script to use that url, and drop the tuner script into a prim. There is also a relay script for group land. You can copy the url of a playlist file from a webpage, or a &#039;Tune in&#039; link from &amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[http://shoutcast.com shoutcast.com]&amp;lt;/span&amp;gt; as well. &lt;br /&gt;
==Tuner==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
string gsBaseURL=&amp;quot;http://example.com/fread.php?url=&amp;quot;; // Set this to point to your fread.php file&lt;br /&gt;
integer giChan=8437; // This channel is used to communicate with the relay.&lt;br /&gt;
integer giDialog=8957; // This channel is used for the dialog menu.&lt;br /&gt;
float gfResetDelay=20; // This is the number of seconds the script will wait for a response.&lt;br /&gt;
integer giPrivateChan=200; // This is a private channel for saying a playlist url.&lt;br /&gt;
//These are presets for the dialog menu&lt;br /&gt;
list gl1=[&amp;quot;DI.fm&amp;quot;,&amp;quot;Somafm&amp;quot;,&amp;quot;-None-&amp;quot;,&amp;quot;XRM Alt&amp;quot;,&amp;quot;Hot 108&amp;quot;,&amp;quot;Open PLS&amp;quot;];&lt;br /&gt;
list glD1=[&amp;quot;Trance&amp;quot;,&amp;quot;Vocal&amp;quot;,&amp;quot;ElecHouse&amp;quot;,&amp;quot;Chillout&amp;quot;,&amp;quot;EuroDance&amp;quot;,&amp;quot;House&amp;quot;,&amp;quot;SoulHouse&amp;quot;,&amp;quot;FunkHouse&amp;quot;,&amp;quot;TrblHouse&amp;quot;,&amp;quot;HardDance&amp;quot;,&amp;quot;Minimal&amp;quot;,&amp;quot;2&amp;gt;&amp;quot;];&lt;br /&gt;
list glD2=[&amp;quot;&amp;lt;1&amp;quot;,&amp;quot;Techno&amp;quot;,&amp;quot;Progresve&amp;quot;,&amp;quot;GoaPsy&amp;quot;,&amp;quot;Hardstyle&amp;quot;,&amp;quot;Hardcore&amp;quot;,&amp;quot;DjMixes&amp;quot;,&amp;quot;Lounge&amp;quot;,&amp;quot;Drum&amp;amp;Bass&amp;quot;,&amp;quot;OldElectr&amp;quot;,&amp;quot;Ambient&amp;quot;,&amp;quot;3&amp;gt;&amp;quot;];&lt;br /&gt;
list glD3=[&amp;quot;&amp;lt;2&amp;quot;,&amp;quot;Breaks&amp;quot;,&amp;quot;FutureSyn&amp;quot;,&amp;quot;Gabber&amp;quot;,&amp;quot;XRM Alt&amp;quot;,&amp;quot;-None-&amp;quot;];&lt;br /&gt;
list glS1=[&amp;quot;Lush&amp;quot;,&amp;quot;Digi&amp;quot;,&amp;quot;GrvSalad&amp;quot;,&amp;quot;DrneZone&amp;quot;,&amp;quot;SpaceSta&amp;quot;,&amp;quot;BeatBlnd&amp;quot;,&amp;quot;IndiePop&amp;quot;,&amp;quot;Cliqhop&amp;quot;,&amp;quot;SncVerse&amp;quot;,&amp;quot;ILstreet&amp;quot;,&amp;quot;BootLiqr&amp;quot;,&amp;quot;2&amp;gt;&amp;quot;];&lt;br /&gt;
list glS2=[&amp;quot;&amp;lt;1&amp;quot;,&amp;quot;TagsTrip&amp;quot;,&amp;quot;ScrtAgnt&amp;quot;,&amp;quot;Doomed&amp;quot;];&lt;br /&gt;
// Declarations&lt;br /&gt;
key gkDet;&lt;br /&gt;
string gsPlaylistURL;&lt;br /&gt;
key gkRequest;&lt;br /&gt;
integer giIndex1;&lt;br /&gt;
integer giIndex2;&lt;br /&gt;
string gsStart=&amp;quot;File1=&amp;quot;;&lt;br /&gt;
string gsEnd=&amp;quot;Title1=&amp;quot;;&lt;br /&gt;
integer DEBUG=2; // 0-none, 1-minimal, 2-verbose&lt;br /&gt;
&lt;br /&gt;
default{&lt;br /&gt;
    state_entry(){&lt;br /&gt;
        llListen(giDialog,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;);&lt;br /&gt;
        llSetTimerEvent(gfResetDelay);&lt;br /&gt;
    }&lt;br /&gt;
    timer(){llResetScript();}&lt;br /&gt;
    on_rez(integer param){llResetScript();}&lt;br /&gt;
    touch_start(integer num){&lt;br /&gt;
        //if(llSameGroup(llDetectedKey(num-1))==TRUE){&lt;br /&gt;
            gkDet=llDetectedKey(num-1);&lt;br /&gt;
            llDialog(gkDet,&amp;quot;Pick a station...&amp;quot;,gl1,giDialog);&lt;br /&gt;
        //}&lt;br /&gt;
    }&lt;br /&gt;
    listen(integer chan,string name,key id,string mess){&lt;br /&gt;
        if(mess==&amp;quot;DI.fm&amp;quot;){state difm;}&lt;br /&gt;
        if(mess==&amp;quot;Somafm&amp;quot;){state somafm;}&lt;br /&gt;
        if(mess==&amp;quot;Open PLS&amp;quot;){state hearpls;}&lt;br /&gt;
        if(mess==&amp;quot;-None-&amp;quot;){llRegionSay(giChan,&amp;quot;setmusic|&amp;quot;);llResetScript();}&lt;br /&gt;
        if(mess==&amp;quot;XRM Alt&amp;quot;){llRegionSay(giChan,&amp;quot;setmusic|http://72.236.163.63:12929&amp;quot;);llResetScript();}&lt;br /&gt;
        if(mess==&amp;quot;Hot 108&amp;quot;){llRegionSay(giChan,&amp;quot;setmusic|http://scfire-dtc-aa03.stream.aol.com:80/stream/1071&amp;quot;);llResetScript();}&lt;br /&gt;
    }        &lt;br /&gt;
}&lt;br /&gt;
state hearpls{&lt;br /&gt;
    state_entry(){&lt;br /&gt;
        llSetTimerEvent(gfResetDelay);&lt;br /&gt;
        llListen(0,&amp;quot;&amp;quot;,gkDet,&amp;quot;&amp;quot;);&lt;br /&gt;
        llListen(giPrivateChan,&amp;quot;&amp;quot;,gkDet,&amp;quot;&amp;quot;);&lt;br /&gt;
        llSay(0,&amp;quot;Say the URL of a *.pls file to play over public chat or /&amp;quot;+(string)giPrivateChan+&amp;quot;.&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    timer(){llSay(0,&amp;quot;Timeout.&amp;quot;);llResetScript();}&lt;br /&gt;
    listen(integer chan,string name,key id,string mess){&lt;br /&gt;
        gsPlaylistURL=mess;&lt;br /&gt;
        state openpls;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
state openpls{&lt;br /&gt;
    state_entry(){&lt;br /&gt;
        gkRequest=llHTTPRequest(gsBaseURL+gsPlaylistURL,[],&amp;quot;&amp;quot;);&lt;br /&gt;
        llSetTimerEvent(gfResetDelay);&lt;br /&gt;
    }&lt;br /&gt;
    timer(){llSay(0,&amp;quot;Timeout.&amp;quot;);llResetScript();}&lt;br /&gt;
    http_response(key request,integer status,list meta,string body){if(gkRequest==request){if(status==200){if(body!=&amp;quot;&amp;quot;){&lt;br /&gt;
        giIndex1=(llSubStringIndex(body,gsStart)+llStringLength(gsStart));&lt;br /&gt;
        giIndex2=(llSubStringIndex(body,gsEnd)-2);&lt;br /&gt;
        body=llGetSubString(body,giIndex1,giIndex2);&lt;br /&gt;
        llSetParcelMusicURL(body);&lt;br /&gt;
        llRegionSay(giChan,&amp;quot;setmusic|&amp;quot;+body);&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    }}}}&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
state difm{&lt;br /&gt;
    state_entry(){&lt;br /&gt;
        llListen(giDialog,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;);&lt;br /&gt;
        llDialog(gkDet,&amp;quot;Pick a station...&amp;quot;,glD1,giDialog);&lt;br /&gt;
        llSetTimerEvent(gfResetDelay);&lt;br /&gt;
    }&lt;br /&gt;
    timer(){llResetScript();}&lt;br /&gt;
    on_rez(integer param){llResetScript();}&lt;br /&gt;
    listen(integer chan,string name,key id,string mess){&lt;br /&gt;
        if(mess==&amp;quot;3&amp;gt;&amp;quot;){llDialog(gkDet,&amp;quot;Pick a station...&amp;quot;,glD3,giDialog);}&lt;br /&gt;
        if(mess==&amp;quot;&amp;lt;2&amp;quot;){llDialog(gkDet,&amp;quot;Pick a station...&amp;quot;,glD2,giDialog);}&lt;br /&gt;
        if(mess==&amp;quot;2&amp;gt;&amp;quot;){llDialog(gkDet,&amp;quot;Pick a station...&amp;quot;,glD2,giDialog);}&lt;br /&gt;
        if(mess==&amp;quot;&amp;lt;1&amp;quot;){llDialog(gkDet,&amp;quot;Pick a station...&amp;quot;,glD1,giDialog);}&lt;br /&gt;
        if(mess==&amp;quot;-None-&amp;quot;){llRegionSay(giChan,&amp;quot;setmusic|&amp;quot;);llResetScript();}&lt;br /&gt;
        if(mess==&amp;quot;Trance&amp;quot;){llRegionSay(giChan,&amp;quot;setmusic|http://scfire-ntc-aa01.stream.aol.com:80/stream/1003&amp;quot;);llResetScript();}&lt;br /&gt;
        if(mess==&amp;quot;Vocal&amp;quot;){llRegionSay(giChan,&amp;quot;setmusic|http://scfire-ntc-aa02.stream.aol.com:80/stream/1065&amp;quot;);llResetScript();}&lt;br /&gt;
        if(mess==&amp;quot;ElecHouse&amp;quot;){llRegionSay(giChan,&amp;quot;setmusic|http://scfire-ntc-aa03.stream.aol.com:80/stream/1025&amp;quot;);llResetScript();}&lt;br /&gt;
        if(mess==&amp;quot;Chillout&amp;quot;){llRegionSay(giChan,&amp;quot;setmusic|http://scfire-mtc-aa02.stream.aol.com:80/stream/1035&amp;quot;);llResetScript();}&lt;br /&gt;
        if(mess==&amp;quot;EuroDance&amp;quot;){llRegionSay(giChan,&amp;quot;setmusic|http://scfire-mtc-aa02.stream.aol.com:80/stream/1024&amp;quot;);llResetScript();}&lt;br /&gt;
        if(mess==&amp;quot;House&amp;quot;){llRegionSay(giChan,&amp;quot;setmusic|http://scfire-mtc-aa01.stream.aol.com:80/stream/1007&amp;quot;);llResetScript();}&lt;br /&gt;
        if(mess==&amp;quot;SoulHouse&amp;quot;){llRegionSay(giChan,&amp;quot;setmusic|http://di-fm-01.quintex.com:8880&amp;quot;);llResetScript();}&lt;br /&gt;
        if(mess==&amp;quot;FunkHouse&amp;quot;){llRegionSay(giChan,&amp;quot;setmusic|http://91.121.228.33:8004&amp;quot;);llResetScript();}&lt;br /&gt;
        if(mess==&amp;quot;TrblHouse&amp;quot;){llRegionSay(giChan,&amp;quot;setmusic|http://di-fm-01.quintex.com:8882&amp;quot;);llResetScript();}&lt;br /&gt;
        if(mess==&amp;quot;HardDance&amp;quot;){llRegionSay(giChan,&amp;quot;setmusic|http://209.247.146.98:8000&amp;quot;);llResetScript();}&lt;br /&gt;
        if(mess==&amp;quot;Minimal&amp;quot;){llRegionSay(giChan,&amp;quot;setmusic|http://66.135.35.144:8000&amp;quot;);llResetScript();}&lt;br /&gt;
        if(mess==&amp;quot;Techno&amp;quot;){llRegionSay(giChan,&amp;quot;setmusic|http://208.122.59.30:7204&amp;quot;);llResetScript();}&lt;br /&gt;
        if(mess==&amp;quot;Progresve&amp;quot;){llRegionSay(giChan,&amp;quot;setmusic|http://scfire-ntc-aa04.stream.aol.com:80/stream/1026&amp;quot;);llResetScript();}&lt;br /&gt;
        if(mess==&amp;quot;GoaPsy&amp;quot;){llRegionSay(giChan,&amp;quot;setmusic|http://scfire-ntc-aa01.stream.aol.com:80/stream/1008&amp;quot;);llResetScript();}&lt;br /&gt;
        if(mess==&amp;quot;Hardstyle&amp;quot;){llRegionSay(giChan,&amp;quot;setmusic|http://72.51.40.90:8000&amp;quot;);llResetScript();}&lt;br /&gt;
        if(mess==&amp;quot;Hardcore&amp;quot;){llRegionSay(giChan,&amp;quot;setmusic|http://88.191.69.69:80&amp;quot;);llResetScript();}&lt;br /&gt;
        if(mess==&amp;quot;DjMixes&amp;quot;){llRegionSay(giChan,&amp;quot;setmusic|http://209.247.146.100:8000&amp;quot;);llResetScript();}&lt;br /&gt;
        if(mess==&amp;quot;Lounge&amp;quot;){llRegionSay(giChan,&amp;quot;setmusic|http://scfire-ntc-aa04.stream.aol.com:80/stream/1009&amp;quot;);llResetScript();}&lt;br /&gt;
        if(mess==&amp;quot;Drum&amp;amp;Bass&amp;quot;){llRegionSay(giChan,&amp;quot;setmusic|http://207.200.96.229:8030&amp;quot;);llResetScript();}&lt;br /&gt;
        if(mess==&amp;quot;OldElectr&amp;quot;){llRegionSay(giChan,&amp;quot;setmusic|http://205.188.215.225:8004&amp;quot;);llResetScript();}&lt;br /&gt;
        if(mess==&amp;quot;Ambient&amp;quot;){llRegionSay(giChan,&amp;quot;setmusic|http://205.188.215.228:8006&amp;quot;);llResetScript();}&lt;br /&gt;
        if(mess==&amp;quot;Breaks&amp;quot;){llRegionSay(giChan,&amp;quot;setmusic|http://205.188.215.225:8002&amp;quot;);llResetScript();}&lt;br /&gt;
        if(mess==&amp;quot;FutureSyn&amp;quot;){llRegionSay(giChan,&amp;quot;setmusic|http://208.122.59.30:7234&amp;quot;);llResetScript();}&lt;br /&gt;
        if(mess==&amp;quot;Gabber&amp;quot;){llRegionSay(giChan,&amp;quot;setmusic|http://205.188.215.226:8006&amp;quot;);llResetScript();}&lt;br /&gt;
    }        &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
state somafm{&lt;br /&gt;
    state_entry(){&lt;br /&gt;
        llListen(giDialog,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;);&lt;br /&gt;
        llDialog(gkDet,&amp;quot;Pick a station...&amp;quot;,glS1,giDialog);&lt;br /&gt;
        llSetTimerEvent(gfResetDelay);&lt;br /&gt;
    }&lt;br /&gt;
    timer(){llResetScript();}&lt;br /&gt;
    on_rez(integer param){llResetScript();}&lt;br /&gt;
    listen(integer chan,string name,key id,string mess){&lt;br /&gt;
        if(mess==&amp;quot;2&amp;gt;&amp;quot;){llDialog(gkDet,&amp;quot;Pick a station...&amp;quot;,glS2,giDialog);}&lt;br /&gt;
        if(mess==&amp;quot;&amp;lt;1&amp;quot;){llDialog(gkDet,&amp;quot;Pick a station...&amp;quot;,glS1,giDialog);}&lt;br /&gt;
        if(mess==&amp;quot;-None-&amp;quot;){llRegionSay(giChan,&amp;quot;setmusic|&amp;quot;);llResetScript();}&lt;br /&gt;
        if(mess==&amp;quot;Lush&amp;quot;){llRegionSay(giChan,&amp;quot;setmusic|http://standby.somafm.com:8802&amp;quot;);llResetScript();}&lt;br /&gt;
        if(mess==&amp;quot;Digi&amp;quot;){llRegionSay(giChan,&amp;quot;setmusic|http://standby.somafm.com:8902&amp;quot;);llResetScript();}&lt;br /&gt;
        if(mess==&amp;quot;GrvSalad&amp;quot;){llRegionSay(giChan,&amp;quot;setmusic|http://207.200.96.226:8000&amp;quot;);llResetScript();}&lt;br /&gt;
        if(mess==&amp;quot;DrneZone&amp;quot;){llRegionSay(giChan,&amp;quot;setmusic|http://207.200.96.226:8002&amp;quot;);llResetScript();}&lt;br /&gt;
        if(mess==&amp;quot;SpaceSta&amp;quot;){llRegionSay(giChan,&amp;quot;setmusic|http://steady.somafm.com:8202&amp;quot;);llResetScript();}&lt;br /&gt;
        if(mess==&amp;quot;BeatBlnd&amp;quot;){llRegionSay(giChan,&amp;quot;setmusic|http://steady.somafm.com:8386&amp;quot;);llResetScript();}&lt;br /&gt;
        if(mess==&amp;quot;IndiePop&amp;quot;){llRegionSay(giChan,&amp;quot;setmusic|http://steady.somafm.com:8076&amp;quot;);llResetScript();}&lt;br /&gt;
        if(mess==&amp;quot;Cliqhop&amp;quot;){llRegionSay(giChan,&amp;quot;setmusic|http://steady.somafm.com:8080&amp;quot;);llResetScript();}&lt;br /&gt;
        if(mess==&amp;quot;SncVerse&amp;quot;){llRegionSay(giChan,&amp;quot;setmusic|http://standby.somafm.com:8602&amp;quot;);llResetScript();}&lt;br /&gt;
        if(mess==&amp;quot;ILstreet&amp;quot;){llRegionSay(giChan,&amp;quot;setmusic|http://steady.somafm.com:8502&amp;quot;);llResetScript();}&lt;br /&gt;
        if(mess==&amp;quot;BootLiqr&amp;quot;){llRegionSay(giChan,&amp;quot;setmusic|http://steady.somafm.com:7002&amp;quot;);llResetScript();}&lt;br /&gt;
        if(mess==&amp;quot;TagsTrip&amp;quot;){llRegionSay(giChan,&amp;quot;setmusic|http://205.188.234.9:8000&amp;quot;);llResetScript();}&lt;br /&gt;
        if(mess==&amp;quot;ScrtAgnt&amp;quot;){llRegionSay(giChan,&amp;quot;setmusic|http://207.200.96.228:8000&amp;quot;);llResetScript();}&lt;br /&gt;
        if(mess==&amp;quot;Doomed&amp;quot;){llRegionSay(giChan,&amp;quot;setmusic|http://steady.somafm.com:8302&amp;quot;);llResetScript();}&lt;br /&gt;
    }        &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
==Group relay==&lt;br /&gt;
If the land you want to change the music url on is [[Groups and Land|owned by a group]], you need to use this relay script. Place it in a prim, and deed it to the group that owns the land. This script is also useful if you have more than one parcel of land in the same sim, and want to change the music in more than one place at the same time. Make sure the both the script and the prim have full permissions set before deeding so you can sell it back to yourself and make changes if needed.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
integer giChan=8437; // replace this with something random, match with the tuner script&lt;br /&gt;
string gsOriginalMusic;&lt;br /&gt;
integer listen0;&lt;br /&gt;
&lt;br /&gt;
default{&lt;br /&gt;
    on_rez(integer param){llResetScript();}&lt;br /&gt;
    state_entry(){llListen(giChan,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;);}&lt;br /&gt;
    listen(integer chan,string name,key id,string mess){&lt;br /&gt;
        list lText=llParseString2List(mess,[&amp;quot;|&amp;quot;],[]);&lt;br /&gt;
        string s1=llList2String(lText,0);&lt;br /&gt;
        string s2=llList2String(lText,1);&lt;br /&gt;
        if(s1==&amp;quot;setmusic&amp;quot;){llSetParcelMusicURL(s2);}&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
==fread.php==&lt;br /&gt;
[[llHTTPRequest]] only supports the reading of certain filetypes, and *.pls is not one of them. This script will display any URL fed to it as text.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
$file = $_GET[&#039;url&#039;];&lt;br /&gt;
$handle = fopen($file, &#039;r&#039;);&lt;br /&gt;
$contents = &#039;&#039;;&lt;br /&gt;
while (!feof($handle)) {&lt;br /&gt;
  $contents .= fread($handle, 8192);&lt;br /&gt;
}&lt;br /&gt;
fclose($handle);&lt;br /&gt;
print $contents;&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lady Sumoku</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlGetInventoryKey&amp;diff=1196116</id>
		<title>LlGetInventoryKey</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlGetInventoryKey&amp;diff=1196116"/>
		<updated>2015-04-12T03:40:44Z</updated>

		<summary type="html">&lt;p&gt;Lady Sumoku: Formatting Fix&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function&lt;br /&gt;
|inject-2={{Issues/SVC-3670}}{{Issues/SVC-4050}}{{Issues/SVC-6374}}{{LSL_Function/inventory|name|uuid=false}}&lt;br /&gt;
|func_id=175|func_sleep=0.0|func_energy=10.0&lt;br /&gt;
|func=llGetInventoryKey|return_type=key|p1_type=string|p1_name=name&lt;br /&gt;
|func_footnote=If {{LSLP|name}} is not [[llGetInventoryPermMask|copy, mod, trans]] then the return is {{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.}}.&amp;lt;br/&amp;gt;Use [[llGetInventoryType]] instead of this function to verify the existence of inventory.&lt;br /&gt;
|func_desc&lt;br /&gt;
|sort=GetInventoryKey&lt;br /&gt;
|return_text=that is the [[UUID]] of the inventory {{LSLP|name}}&lt;br /&gt;
|spec&lt;br /&gt;
|caveats=*Inventory items are records that usually &#039;&#039;point&#039;&#039; to assets, but they are not the actual assets.&lt;br /&gt;
**Multiple inventory items can point to the same asset and return the same key.&lt;br /&gt;
**Some newly created inventory entries get default keys until they are edited and saved:&lt;br /&gt;
***Newly created notecard entries use [[NULL_KEY]] at present, until they are edited and saved.&lt;br /&gt;
***Newly created script entries point to the &amp;quot;[[Hello Avatar]]&amp;quot; script (&amp;quot;d0d40b7c-e32b-3bcb-3346-2be8470093c0&amp;quot; at this writing, not a guaranteed default) until they are edited and saved.&lt;br /&gt;
***Most other inventory entries are given unique asset keys at creation time, but this relies on client cooperation and is not guaranteed.&lt;br /&gt;
**When an asset is &amp;quot;edited&amp;quot; a new asset key is assigned to the edit. The inventory item used to open the asset for editing is updated with the new asset key.&lt;br /&gt;
***No other inventory items that share the original asset are updated with the new asset 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;
// Put this script in an empty prim, and drag a full-perm texture into the prim&#039;s contents to find out its UUID&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    changed(integer change)&lt;br /&gt;
    {&lt;br /&gt;
        if (change &amp;amp; CHANGED_INVENTORY)    // if there has been a change to the prim&#039;s contents ...&lt;br /&gt;
        {&lt;br /&gt;
            string name = llGetInventoryName(INVENTORY_TEXTURE, 0);&lt;br /&gt;
            if (name)        // if a texture exists ...&lt;br /&gt;
            {&lt;br /&gt;
                key uuid = llGetInventoryKey(name);&lt;br /&gt;
                if (uuid)    // if the uuid is valid ...&lt;br /&gt;
                    llOwnerSay( &amp;quot;The UUID of &#039;&amp;quot; + name + &amp;quot;&#039; is &amp;quot; + (string) uuid);&lt;br /&gt;
                else         // texture was not full-perm&lt;br /&gt;
                    llOwnerSay( &amp;quot;The UUID of &#039;&amp;quot; + name + &amp;quot;&#039; could not be determined&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        }&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;string item = &amp;quot;Default&amp;quot;;&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 to get information about \&amp;quot;&amp;quot; + item + &amp;quot;\&amp;quot;.&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        integer type = llGetInventoryType(item);&lt;br /&gt;
        integer index = llListFindList([ INVENTORY_NONE, &lt;br /&gt;
            INVENTORY_TEXTURE, INVENTORY_SOUND, INVENTORY_LANDMARK, INVENTORY_CLOTHING, &lt;br /&gt;
            INVENTORY_OBJECT, INVENTORY_NOTECARD, INVENTORY_SCRIPT, INVENTORY_BODYPART, &lt;br /&gt;
            INVENTORY_ANIMATION, INVENTORY_GESTURE], [type]);&lt;br /&gt;
        string name = llList2String([&amp;quot;does not exist&amp;quot;, &lt;br /&gt;
            &amp;quot;texture&amp;quot;, &amp;quot;sound&amp;quot;, &amp;quot;landmark&amp;quot;, &amp;quot;clothing&amp;quot;,&lt;br /&gt;
            &amp;quot;object&amp;quot;, &amp;quot;notecard&amp;quot;, &amp;quot;script&amp;quot;, &amp;quot;body part&amp;quot;,&lt;br /&gt;
            &amp;quot;animation&amp;quot;, &amp;quot;gesture&amp;quot;], index);&lt;br /&gt;
&lt;br /&gt;
        llOwnerSay(&amp;quot;Type: &amp;quot; + name);&lt;br /&gt;
        &lt;br /&gt;
        if(type == INVENTORY_NONE)&lt;br /&gt;
            return;&lt;br /&gt;
        &lt;br /&gt;
        integer owner_perms = llGetInventoryPermMask(item, MASK_OWNER);&lt;br /&gt;
        list perms;&lt;br /&gt;
        if(owner_perms &amp;amp; PERM_COPY)&lt;br /&gt;
            perms += &amp;quot;Copy&amp;quot;;&lt;br /&gt;
        &lt;br /&gt;
        if(owner_perms &amp;amp; PERM_MODIFY)&lt;br /&gt;
            perms += &amp;quot;Modify&amp;quot;;&lt;br /&gt;
        &lt;br /&gt;
        if(owner_perms &amp;amp; PERM_TRANSFER)&lt;br /&gt;
            perms += &amp;quot;Transfer&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        if(owner_perms &amp;amp; PERM_MOVE)&lt;br /&gt;
            perms += &amp;quot;Move&amp;quot;;&lt;br /&gt;
        &lt;br /&gt;
        llOwnerSay(&amp;quot;Perms: &amp;quot; + llList2CSV(perms));&lt;br /&gt;
        &lt;br /&gt;
        integer temp = PERM_COPY | PERM_MODIFY | PERM_TRANSFER;&lt;br /&gt;
        if((owner_perms &amp;amp; temp) != temp)&lt;br /&gt;
            return;&lt;br /&gt;
&lt;br /&gt;
        llOwnerSay(&amp;quot;Key: &amp;quot; + (string)llGetInventoryKey(item));&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||[[llGetInventoryName]]|Returns the inventory item&#039;s name}}&lt;br /&gt;
{{LSL DefineRow||[[llGetInventoryType]]|Tests to see if an inventory item exists and returns its type}}&lt;br /&gt;
{{LSL DefineRow||[[llGetInventoryNumber]]|Returns the number of items of a specific type in inventory}}&lt;br /&gt;
{{LSL DefineRow||[[llGetInventoryPermMask]]|Returns the inventory item&#039;s permissions}}&lt;br /&gt;
{{LSL DefineRow||[[llGetInventoryCreator]]|Returns the inventory item&#039;s creator}}&lt;br /&gt;
|also_events&lt;br /&gt;
|also_tests&lt;br /&gt;
|also_articles&lt;br /&gt;
|notes=*The UUID returned is that of the asset to which the inventory item points, it is not the UUID of the inventory item itself. The assets themselves are immutable (they never change, they are only ever created and deleted); this allows multiple inventory handles to refer to the same asset without having to duplicate the asset. When it appears an asset is being modified, it is saved as a new asset. The consequence of this is that multiple copies of items in inventory all share the same asset UUID.&lt;br /&gt;
*It is still possible to inspect the UUID of any animation in inventory by triggering it and using [[llGetAnimationList|llGetAnimationList()]] like so:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;llStartAnimation(&amp;quot;myAnim&amp;quot;);&lt;br /&gt;
llOwnerSay(&amp;quot;myAnim&#039;s UUID is &amp;quot; + llList2String(llGetAnimationList(llGetPermissionsKey()), -1));&amp;lt;/source&amp;gt;&lt;br /&gt;
|history=&lt;br /&gt;
* 0.2 - Introduced during the closed beta period.&lt;br /&gt;
* 1.2 - Restricted to full perm inventory items only.&lt;br /&gt;
* 1.24 - Objects and scripts no longer return their actual UUID but a hash (i.e. pseudo UUID which is consistent with the object/script) instead. -- {{JIRA|SVC-3670}}&lt;br /&gt;
&amp;lt;sup&amp;gt;The preceding version numbers are approximations.&amp;lt;/sup&amp;gt;&lt;br /&gt;
|cat1=Inventory&lt;br /&gt;
|cat2=Key&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Lady Sumoku</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=WhoAddedWhat&amp;diff=1196115</id>
		<title>WhoAddedWhat</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=WhoAddedWhat&amp;diff=1196115"/>
		<updated>2015-04-12T03:17:04Z</updated>

		<summary type="html">&lt;p&gt;Lady Sumoku: Replaced old &amp;lt;LSL&amp;gt; block with &amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;To enable you to tell what has been added to a script in the event of &#039;&#039;&#039;CHANGED_ALLOWED_DROP&#039;&#039;&#039; you can use the following code:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Scripted by Laronzo Fitzgerald&lt;br /&gt;
&lt;br /&gt;
list content[]; // a list of all items already added to the object&lt;br /&gt;
&lt;br /&gt;
if (change &amp;amp; (CHANGED_ALLOWED_DROP | CHANGED_INVENTORY))&lt;br /&gt;
{&lt;br /&gt;
    integer n = llGetInventoryNumber(INVENTORY_ALL);            &lt;br /&gt;
&lt;br /&gt;
    while(n)&lt;br /&gt;
    {&lt;br /&gt;
         integer valid = llGetListLength(contents);&lt;br /&gt;
         if(valid != 0)&lt;br /&gt;
         {&lt;br /&gt;
              string added = llGetInventoryName(INVENTORY_ALL, --n);&lt;br /&gt;
              integer index = llListFindList(content, [added]);&lt;br /&gt;
              if(!(~index))&lt;br /&gt;
              {&lt;br /&gt;
                   integer type = llGetInventoryType(added);&lt;br /&gt;
&lt;br /&gt;
                   if(type != 10 &amp;amp;&amp;amp; (string)type != &amp;quot;&amp;quot;) // don&#039;t add the object&#039;s script to the list of items!&lt;br /&gt;
                   {&lt;br /&gt;
		        content += added; // add the new item to the checklist of inventory items&lt;br /&gt;
                        // Do anything else you want related to the new item here&lt;br /&gt;
                   }&lt;br /&gt;
              }&lt;br /&gt;
         }&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
(This code contains an obvious bug: if &amp;quot;content&amp;quot; is empty, then &amp;quot;if (valid != 0)&amp;quot; is not true, and the &amp;quot;n&amp;quot; in &amp;quot;while(n)&amp;quot; doesn&#039;t get changed -&amp;gt; endless loop.)&lt;br /&gt;
(Weird code: if &amp;quot;content&amp;quot; is empty (which is always the case at startup), then nothing can get added to &amp;quot;content&amp;quot;.)&lt;br /&gt;
(Also: the var is named &amp;quot;content&amp;quot;, but also 1 time &amp;quot;contents&amp;quot; is used.)&lt;br /&gt;
&lt;br /&gt;
[[llAllowInventoryDrop]]&lt;/div&gt;</summary>
		<author><name>Lady Sumoku</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Lady_Sumoku&amp;diff=1195335</id>
		<title>User:Lady Sumoku</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Lady_Sumoku&amp;diff=1195335"/>
		<updated>2015-01-26T18:01:44Z</updated>

		<summary type="html">&lt;p&gt;Lady Sumoku: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;p&amp;gt;Another pixel-person Programmer in a sea of better examples&amp;lt;/p&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lady Sumoku</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Simple_Texture_Changer_(input_list)(multiple_prims_%26_multiple_sides).lsl&amp;diff=1195041</id>
		<title>Simple Texture Changer (input list)(multiple prims &amp; multiple sides).lsl</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Simple_Texture_Changer_(input_list)(multiple_prims_%26_multiple_sides).lsl&amp;diff=1195041"/>
		<updated>2015-01-25T04:13:05Z</updated>

		<summary type="html">&lt;p&gt;Lady Sumoku: Replaced old &amp;lt;LSL&amp;gt; block with &amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
//***********************************************************************************************************&lt;br /&gt;
//                                                                                                          *&lt;br /&gt;
//              --Simple Texture Changer (input list)(multiple prims &amp;amp; multiple side)--                     *&lt;br /&gt;
//                                                                                                          *&lt;br /&gt;
//***********************************************************************************************************&lt;br /&gt;
// www.lsleditor.org  by Alphons van der Heijden (SL: Alphons Jano)&lt;br /&gt;
//Creator: Bobbyb30 Swashbuckler&lt;br /&gt;
//Attribution: None required, but it is appreciated.&lt;br /&gt;
//Created: October 6, 2009&lt;br /&gt;
//Last Modified: November 28, 2009&lt;br /&gt;
//Released: Saturday, November 28, 2009&lt;br /&gt;
//License: Public Domain&lt;br /&gt;
&lt;br /&gt;
//Status: Fully Working/Production Ready&lt;br /&gt;
//Version: 1.0.1&lt;br /&gt;
&lt;br /&gt;
//Name: Simple Texture Changer (input list)(multiple prims &amp;amp; multiple side).lsl&lt;br /&gt;
//Purpose: To change the texture on certain prims on certain sides of a linked set.&lt;br /&gt;
//Technical Overview: The script finds how many textures there are in the input list, and uses a timer to change the&lt;br /&gt;
//                    texture on a side based on randomness or order. It changes all sides of the certain prim to the&lt;br /&gt;
//                    specified texture&lt;br /&gt;
//Description: A simple texture changer script that changes the texture on certain sides of certain prims in a linked&lt;br /&gt;
// 			   set to those in the input list. It allows for a random order, or a logical &amp;quot;next up&amp;quot; order.&lt;br /&gt;
//Directions: Create a prim. Place the script in prim inventory. Modify the script parameters to suit your needs and&lt;br /&gt;
//            save.&lt;br /&gt;
&lt;br /&gt;
//Compatible: Mono &amp;amp; LSL compatible&lt;br /&gt;
//Other items required: None.&lt;br /&gt;
//Notes: Uses a timer event. Should be low lag. Commented for easier following.&lt;br /&gt;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
//Adjustable global variables...you may change these&lt;br /&gt;
//texture list...this list should have 2 or more textures&lt;br /&gt;
list textures = [&lt;br /&gt;
    &amp;quot;00000000-0000-0000-0000-0000f0000000&amp;quot;,&lt;br /&gt;
    &amp;quot;00000000-0000-0000-0000-0000d0000000&amp;quot;,&lt;br /&gt;
    &amp;quot;00000000-0000-0000-0000-0000e0000000&amp;quot;];//put your texture UUIDs/keys in here&lt;br /&gt;
&lt;br /&gt;
//Please note there is a .2 second delay between prims.&lt;br /&gt;
//&amp;quot;prim number, side number, side number...side number&amp;quot;&lt;br /&gt;
//-1 equals all sides for that prim&lt;br /&gt;
list sides = [&lt;br /&gt;
    &amp;quot;0,1,2,5&amp;quot;,&lt;br /&gt;
    &amp;quot;1,3,4,1&amp;quot;];//put in which sides you want the texture to be changed on.&lt;br /&gt;
float frequency = 2.0;//how often to change the texture in seconds. Shouldn&#039;t be below 2.0&lt;br /&gt;
&lt;br /&gt;
//please note that the last and first texture will be shown less frequently than those in between&lt;br /&gt;
integer random = TRUE;//whether to show the textures randomly, or in order&lt;br /&gt;
integer duplicatecheck = TRUE;//if random is true, this will check to make sure the random selection is a new texture&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/////////////////////////////////////////////////////////////&lt;br /&gt;
//global variables...do not change&lt;br /&gt;
integer numberoftextures;//number of textures in inventory&lt;br /&gt;
integer currenttexture;//inventory number of current texture&lt;br /&gt;
integer numberofsidestochange;//the length of the sides list&lt;br /&gt;
&lt;br /&gt;
changetexture()//user fucntion to change texture&lt;br /&gt;
{&lt;br /&gt;
    integer counter;&lt;br /&gt;
    key texture = llList2String(textures,currenttexture);//gets texture key from list&lt;br /&gt;
    do&lt;br /&gt;
    {&lt;br /&gt;
        //also with another script&lt;br /&gt;
        list primdata = llCSV2List(llList2String(sides,counter));&lt;br /&gt;
        integer prim = llList2Integer(primdata,0);&lt;br /&gt;
        integer primlistlength = llGetListLength(primdata);//speed hack could go here&lt;br /&gt;
        integer primlistcounter = 1;//start at 1 since the prim datalist&#039;s 1st entry is the prim&lt;br /&gt;
        do&lt;br /&gt;
        {&lt;br /&gt;
            //probably best to use llSetLinkPrimitiveParams&lt;br /&gt;
            //prim, texture, side&lt;br /&gt;
            llSetLinkTexture(prim,texture,llList2Integer(sides,primlistcounter));&lt;br /&gt;
        }while(++primlistcounter &amp;lt; primlistlength);&lt;br /&gt;
    }while(++counter &amp;lt;numberofsidestochange);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    on_rez(integer start_param)//on rez reset...probably not needed.&lt;br /&gt;
    {&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llOwnerSay(&amp;quot;Bobbyb&#039;s &#039;Simple Texture Changer (input list)(multiple prims &amp;amp; multiple side).lsl&#039; (Public Domain 2009)&amp;quot;);&lt;br /&gt;
        llOwnerSay(&amp;quot;Scripting made easy.&amp;quot;);&lt;br /&gt;
        numberoftextures = llGetListLength(textures);//speed hack here&lt;br /&gt;
        numberofsidestochange = llGetListLength(sides);//length of the sides list...possible speed hack goes here&lt;br /&gt;
        //assume correct&lt;br /&gt;
        llOwnerSay(&amp;quot;There are &amp;quot; + (string)numberoftextures + &amp;quot; pictures which I will change every &amp;quot;&lt;br /&gt;
            + (string)frequency + &amp;quot; seconds.&amp;quot;);&lt;br /&gt;
        llOwnerSay(&amp;quot;My current free memory is : &amp;quot; + (string)llGetFreeMemory()&lt;br /&gt;
            + &amp;quot; bytes. If it is below 2500 bytes, I may not work properly.&amp;quot;);&lt;br /&gt;
        llSetTimerEvent(frequency);&lt;br /&gt;
    }&lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        if(random)//show pics randomly&lt;br /&gt;
        {&lt;br /&gt;
            integer randomtexture;&lt;br /&gt;
            if(duplicatecheck)//whether to make sure random doesn&#039;t repeat itself&lt;br /&gt;
            {&lt;br /&gt;
                do&lt;br /&gt;
                {&lt;br /&gt;
                    randomtexture= llRound(llFrand(numberoftextures - 1));//generate random number&lt;br /&gt;
                }while(randomtexture == currenttexture);//make sure the random one isn&#039;t the same as the current one&lt;br /&gt;
            }&lt;br /&gt;
            else//no duplicate check&lt;br /&gt;
                randomtexture = llRound(llFrand(numberoftextures - 1));//generate random texture number&lt;br /&gt;
            currenttexture = randomtexture;//set the current one to the random one selected&lt;br /&gt;
            changetexture();//change the texture&lt;br /&gt;
        }&lt;br /&gt;
        else//not random, go in order&lt;br /&gt;
        {&lt;br /&gt;
            ++currenttexture;&lt;br /&gt;
            if(currenttexture == numberoftextures)//if current texture = number of textures, reset counter&lt;br /&gt;
                currenttexture = 0;&lt;br /&gt;
            changetexture();//change the texture&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lady Sumoku</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Simple_Texture_Changer_(for_inventory)(multiple_prims_%26_multiple_sides).lsl&amp;diff=1195039</id>
		<title>Simple Texture Changer (for inventory)(multiple prims &amp; multiple sides).lsl</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Simple_Texture_Changer_(for_inventory)(multiple_prims_%26_multiple_sides).lsl&amp;diff=1195039"/>
		<updated>2015-01-25T04:10:50Z</updated>

		<summary type="html">&lt;p&gt;Lady Sumoku: Replaced old &amp;lt;LSL&amp;gt; block with &amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Part of [[Bobbyb&#039;s texture changer]] collection &lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
//https://wiki.secondlife.com/wiki/Simple_Texture_Changer_(for_inventory)(multiple_prims_%26_multiple_sides).lsl&lt;br /&gt;
//***********************************************************************************************************&lt;br /&gt;
//                                                                                                          *&lt;br /&gt;
//              --Simple Texture Changer (for inventory)(multiple prims &amp;amp; multiple sides)--                 *&lt;br /&gt;
//                                                                                                          *&lt;br /&gt;
//***********************************************************************************************************&lt;br /&gt;
// www.lsleditor.org  by Alphons van der Heijden (SL: Alphons Jano)&lt;br /&gt;
//Creator: Bobbyb30 Swashbuckler&lt;br /&gt;
//Attribution: None required, but it is appreciated.&lt;br /&gt;
//Created: November 26, 2009&lt;br /&gt;
//Last Modified: November 26, 2009&lt;br /&gt;
//Released: Saturday, November 28, 2009&lt;br /&gt;
//License: Public Domain&lt;br /&gt;
&lt;br /&gt;
//Status: Fully Working/Production Ready&lt;br /&gt;
//Version: 1.0.3&lt;br /&gt;
&lt;br /&gt;
//Name: Simple Texture Changer (for inventory)(multiple prims &amp;amp; multiple sides).lsl&lt;br /&gt;
//Purpose: To change the texture on multiple prim sides(faces) of certain prims in a linked set based on the&lt;br /&gt;
//         textures in inventory.&lt;br /&gt;
//Technical Overview: The script finds how many textures there are in inventory, and uses a timer to change the&lt;br /&gt;
//                    texture on a side based on randomness or order. It takes into account inventory changes. It uses&lt;br /&gt;
//                    a user defined list to determine which sides to change.&lt;br /&gt;
//Description: A simple textre changer script that changes the texture on multiple sides of multiple linked prims to&lt;br /&gt;
//            those in inventory. It allows for a random order, or a logical &amp;quot;next up&amp;quot; order.&lt;br /&gt;
//Directions: Create a prim. Place pictures in prim inventory. Place script in prim inventory. Modify script parameters&lt;br /&gt;
//            to suit your needs. If you add pictures, and the script does not reset, manually reset the script. If you&lt;br /&gt;
//            only need to change one side (or all sides), use the&lt;br /&gt;
//            &amp;quot;Simple Texture Changer (for inventory)(for one side or all sides).lsl&amp;quot; script.&lt;br /&gt;
&lt;br /&gt;
//Compatible: Mono &amp;amp; LSL compatible&lt;br /&gt;
//Other items required: More than 1 texture in inventory.&lt;br /&gt;
//Notes: Uses a timer event. Should be low lag. Commented for easier following. This will change the various sides&lt;br /&gt;
//       of linked prims to the *same* texture.&lt;br /&gt;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
//Adjustable global variables...you may change these&lt;br /&gt;
//Please note there is a .2 second delay between sides.&lt;br /&gt;
//&amp;quot;prim number, side number, side number...side number&amp;quot;&lt;br /&gt;
//-1 equals all sides for that prim&lt;br /&gt;
list sides = [&lt;br /&gt;
    &amp;quot;0,1,2,5&amp;quot;,&lt;br /&gt;
    &amp;quot;1,3,4,1&amp;quot;];//put in which sides you want the texture to be changed on.&lt;br /&gt;
float frequency = 2.0;//how often to change the texture in seconds. Shouldn&#039;t be below 2.0&lt;br /&gt;
&lt;br /&gt;
//please note that the last and first texture will be shown less frequently than those in between&lt;br /&gt;
integer random = TRUE;//whether to show the textures randomly, or in order&lt;br /&gt;
integer duplicatecheck = TRUE;//if random is true, this will check to make sure the random selection is a new texture&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/////////////////////////////////////////////////////////////&lt;br /&gt;
//global variables...do not change&lt;br /&gt;
integer numberoftextures;//number of textures in inventory&lt;br /&gt;
integer currenttexture;//inventory number of current texture&lt;br /&gt;
integer numberofsidestochange;//the length of the sides list&lt;br /&gt;
&lt;br /&gt;
changetexture()//user fucntion to change texture;&lt;br /&gt;
{&lt;br /&gt;
    integer counter;&lt;br /&gt;
    string texture = llGetInventoryName(INVENTORY_TEXTURE,currenttexture);//gets texture name&lt;br /&gt;
    do&lt;br /&gt;
    {&lt;br /&gt;
        //also with another script&lt;br /&gt;
        list primdata = llCSV2List(llList2String(sides,counter));&lt;br /&gt;
        integer prim = llList2Integer(primdata,0);&lt;br /&gt;
        integer primlistlength = llGetListLength(primdata);//speed hack could go here&lt;br /&gt;
        integer primlistcounter = 1;//start at 1 since the prim datalist&#039;s 1st entry is the prim&lt;br /&gt;
        do&lt;br /&gt;
        {&lt;br /&gt;
            //probably best to use llSetLinkPrimitiveParams&lt;br /&gt;
            //prim, texture, side&lt;br /&gt;
            llSetLinkTexture(prim,texture,llList2Integer(sides,primlistcounter));&lt;br /&gt;
        }while(++primlistcounter &amp;lt; primlistlength);&lt;br /&gt;
    }while(++counter &amp;lt;numberofsidestochange);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    on_rez(integer start_param)//on rez reset...probably not needed.&lt;br /&gt;
    {&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llOwnerSay(&amp;quot;Bobbyb&#039;s &#039;Simple Texture Changer (for inventory)(multiple prims &amp;amp; multiple sides).lsl&#039; (Public Domain 2009)&amp;quot;);&lt;br /&gt;
        llOwnerSay(&amp;quot;Because knowledge should be free.&amp;quot;);&lt;br /&gt;
        numberoftextures = llGetInventoryNumber(INVENTORY_TEXTURE);//number of textures in inventory&lt;br /&gt;
        numberofsidestochange = llGetListLength(sides);//length of the sides list...possible speed hack goes here&lt;br /&gt;
        if(numberoftextures &amp;lt;= 0)//no textures&lt;br /&gt;
            llOwnerSay(&amp;quot;No textures were found in my inventory. Please add textures.&amp;quot;);&lt;br /&gt;
        else if(numberoftextures == 1)//only 1 texture&lt;br /&gt;
            llOwnerSay(&amp;quot;I only found 1 picture in my inventory. I need more in order to change them.&amp;quot;);&lt;br /&gt;
        //for 2 random isn&#039;t needed...but I&#039;m too lazy to add that in&lt;br /&gt;
        else//more than 1 texture found...&lt;br /&gt;
        {&lt;br /&gt;
            llOwnerSay(&amp;quot;I found &amp;quot; + (string)numberoftextures + &amp;quot; pictures which I will change every &amp;quot;&lt;br /&gt;
                + (string)frequency + &amp;quot; seconds.&amp;quot;);&lt;br /&gt;
            llSetTimerEvent(frequency);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        if(random)//show pics randomly&lt;br /&gt;
        {&lt;br /&gt;
            integer randomtexture;&lt;br /&gt;
            if(duplicatecheck)//whether to make sure random doesn&#039;t repeat itself&lt;br /&gt;
            {&lt;br /&gt;
                do&lt;br /&gt;
                {&lt;br /&gt;
                    randomtexture= llRound(llFrand(numberoftextures - 1));&lt;br /&gt;
                    //llOwnerSay(&amp;quot;r&amp;quot; + (string)randomtexture);//debug&lt;br /&gt;
                }while(randomtexture == currenttexture);//make sure the random one isn&#039;t the same as the current one&lt;br /&gt;
            }&lt;br /&gt;
            else//no duplicate check&lt;br /&gt;
                randomtexture = llRound(llFrand(numberoftextures - 1));//generate random texture number&lt;br /&gt;
            currenttexture = randomtexture;//set the current one to the random one selected&lt;br /&gt;
            changetexture();//change the texture&lt;br /&gt;
            //llOwnerSay(&amp;quot;c&amp;quot; + (string)currenttexture);//debug&lt;br /&gt;
        }&lt;br /&gt;
        else//not random, go in order&lt;br /&gt;
        {&lt;br /&gt;
            ++currenttexture;&lt;br /&gt;
            if(currenttexture == numberoftextures)//if current texture = number of textures, reset counter&lt;br /&gt;
                currenttexture = 0;&lt;br /&gt;
            changetexture();//change the texture&lt;br /&gt;
            //llOwnerSay(&amp;quot;c&amp;quot; + (string)currenttexture);//debug&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_INVENTORY)&lt;br /&gt;
        {&lt;br /&gt;
            llOwnerSay(&amp;quot;Inventory change detected.&amp;quot;);&lt;br /&gt;
            numberoftextures = llGetInventoryNumber(INVENTORY_TEXTURE);&lt;br /&gt;
            llOwnerSay(&amp;quot;I found &amp;quot; + (string)numberoftextures + &amp;quot; pictures which I will change every &amp;quot;&lt;br /&gt;
                + (string)frequency + &amp;quot; seconds.&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lady Sumoku</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Simple_Texture_Changer_(input_list)(certain_prims_%26_all_sides).lsl&amp;diff=1195038</id>
		<title>Simple Texture Changer (input list)(certain prims &amp; all sides).lsl</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Simple_Texture_Changer_(input_list)(certain_prims_%26_all_sides).lsl&amp;diff=1195038"/>
		<updated>2015-01-25T04:09:11Z</updated>

		<summary type="html">&lt;p&gt;Lady Sumoku: Replaced old &amp;lt;LSL&amp;gt; block with &amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Part of [[Bobbyb&#039;s texture changer]] collection &lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
https://wiki.secondlife.com/wiki/Simple_Texture_Changer_(input_list)(certain_prims_%26_all_sides).lsl&lt;br /&gt;
//***********************************************************************************************************&lt;br /&gt;
//                                                                                                          *&lt;br /&gt;
//              --Simple Texture Changer (input list)(certain prims &amp;amp; all sides)--                          *&lt;br /&gt;
//                                                                                                          *&lt;br /&gt;
//***********************************************************************************************************&lt;br /&gt;
// www.lsleditor.org  by Alphons van der Heijden (SL: Alphons Jano)&lt;br /&gt;
//Creator: Bobbyb30 Swashbuckler&lt;br /&gt;
//Attribution: None required, but it is appreciated.&lt;br /&gt;
//Created: November 20, 2008&lt;br /&gt;
//Last Modified: November 28, 2009&lt;br /&gt;
//Released: Saturday, November 28, 2009&lt;br /&gt;
//License: Public Domain&lt;br /&gt;
&lt;br /&gt;
//Status: Fully Working/Production Ready&lt;br /&gt;
//Version: 1.0.2&lt;br /&gt;
&lt;br /&gt;
//Name: Simple Texture Changer (input list)(certain prims &amp;amp; all sides).lsl&lt;br /&gt;
//Purpose: To change the texture of certain prims on all sides based on the textures in the input list.&lt;br /&gt;
//Technical Overview: The script finds how many textures there are in the input list, and uses a timer to change the&lt;br /&gt;
//                    texture on a side based on randomness or order. It changes all sides of the certain prim to the&lt;br /&gt;
//                    specified texture&lt;br /&gt;
//Description: A simple texture changer script that changes the texture on all the sides of a certain prims in a linked&lt;br /&gt;
// 			   set to those in the input list. It allows for a random order, or a logical &amp;quot;next up&amp;quot; order.&lt;br /&gt;
//Directions: Create a prim. Place the script in prim inventory. Modify the script parameters to suit your needs and&lt;br /&gt;
//            save.&lt;br /&gt;
&lt;br /&gt;
//Compatible: Mono &amp;amp; LSL compatible&lt;br /&gt;
//Other items required: None.&lt;br /&gt;
//Notes: Uses a timer event. Should be low lag. Commented for easier following. This will change all of the sides&lt;br /&gt;
//       of certain linked prims to the *same* texture based on the input texture list.&lt;br /&gt;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
//Adjustable global variables...you may change these&lt;br /&gt;
//texture list...this list should have 2 or more textures&lt;br /&gt;
list textures = [&lt;br /&gt;
    &amp;quot;00000000-0000-0000-0000-0000f0000000&amp;quot;,&lt;br /&gt;
    &amp;quot;00000000-0000-0000-0000-0000d0000000&amp;quot;,&lt;br /&gt;
    &amp;quot;00000000-0000-0000-0000-0000e0000000&amp;quot;];//put your texture UUIDs/keys in here&lt;br /&gt;
&lt;br /&gt;
//Please note there is a .2 second delay between prims.&lt;br /&gt;
list prims = [0,1,5,2];//which prims to change&lt;br /&gt;
float frequency = 2.0;//how often to change the texture in seconds. Shouldn&#039;t be below 2.0&lt;br /&gt;
&lt;br /&gt;
//please note that the last and first texture will be shown less frequently than those in between&lt;br /&gt;
integer random = TRUE;//whether to show the textures randomly, or in order&lt;br /&gt;
integer duplicatecheck = TRUE;//if random is true, this will check to make sure the random selection is a new texture&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/////////////////////////////////////////////////////////////&lt;br /&gt;
//global variables...do not change&lt;br /&gt;
integer numberoftextures;//number of textures in inventory&lt;br /&gt;
integer currenttexture;//inventory number of current texture&lt;br /&gt;
integer primslength;//length of the prims list&lt;br /&gt;
&lt;br /&gt;
changetexture()//user fucntion to change texture;&lt;br /&gt;
{&lt;br /&gt;
    integer counter;&lt;br /&gt;
    string texture = llList2String(textures,currenttexture);&lt;br /&gt;
    do&lt;br /&gt;
    {&lt;br /&gt;
        llSetLinkTexture(llList2Integer(primslength,counter),texture,ALL_SIDES);&lt;br /&gt;
    }while(++counter &amp;lt;primslength);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    on_rez(integer start_param)//on rez reset...probably not needed.&lt;br /&gt;
    {&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llOwnerSay(&amp;quot;Simple Texture Changer (input list)(certain prims &amp;amp; all sides).lsl&#039; (Public Domain 2009)&amp;quot;);&lt;br /&gt;
        llOwnerSay(&amp;quot;Because knowledge is power.&amp;quot;);&lt;br /&gt;
        numberoftextures = llGetListLength(textures);//speed hack here&lt;br /&gt;
        primslength = llGetListLength(prims);//speed hack here&lt;br /&gt;
        //assume correct&lt;br /&gt;
        llOwnerSay(&amp;quot;There are &amp;quot; + (string)numberoftextures + &amp;quot; pictures which I will change every &amp;quot;&lt;br /&gt;
            + (string)frequency + &amp;quot; seconds on these prims: &amp;quot; + llList2CSV(prims));&lt;br /&gt;
        llOwnerSay(&amp;quot;My current free memory is : &amp;quot; + (string)llGetFreeMemory()&lt;br /&gt;
            + &amp;quot; bytes. If it is below 2500 bytes, I may not work properly.&amp;quot;);&lt;br /&gt;
        llSetTimerEvent(frequency);&lt;br /&gt;
    }&lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        if(random)//show pics randomly&lt;br /&gt;
        {&lt;br /&gt;
            integer randomtexture;&lt;br /&gt;
            if(duplicatecheck)//whether to make sure random doesn&#039;t repeat itself&lt;br /&gt;
            {&lt;br /&gt;
                do&lt;br /&gt;
                {&lt;br /&gt;
                    randomtexture= llRound(llFrand(numberoftextures - 1));&lt;br /&gt;
                    //llOwnerSay(&amp;quot;r&amp;quot; + (string)randomtexture);//debug&lt;br /&gt;
                }while(randomtexture == currenttexture);//make sure the random one isn&#039;t the same as the current one&lt;br /&gt;
            }&lt;br /&gt;
            else//no duplicate check&lt;br /&gt;
                randomtexture = llRound(llFrand(numberoftextures - 1));//generate random texture number&lt;br /&gt;
            currenttexture = randomtexture;//set the current one to the random one selected&lt;br /&gt;
            changetexture();//change the texture&lt;br /&gt;
            //llOwnerSay(&amp;quot;c&amp;quot; + (string)currenttexture);//debug&lt;br /&gt;
        }&lt;br /&gt;
        else//not random, go in order&lt;br /&gt;
        {&lt;br /&gt;
            ++currenttexture;&lt;br /&gt;
            if(currenttexture == numberoftextures)//if current texture = number of textures, reset counter&lt;br /&gt;
                currenttexture = 0;&lt;br /&gt;
            changetexture();//change the texture&lt;br /&gt;
            //llOwnerSay(&amp;quot;c&amp;quot; + (string)currenttexture);//debug&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lady Sumoku</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Simple_Texture_Changer_(for_inventory)(certain_prims_%26_all_sides).lsl&amp;diff=1195037</id>
		<title>Simple Texture Changer (for inventory)(certain prims &amp; all sides).lsl</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Simple_Texture_Changer_(for_inventory)(certain_prims_%26_all_sides).lsl&amp;diff=1195037"/>
		<updated>2015-01-25T04:08:07Z</updated>

		<summary type="html">&lt;p&gt;Lady Sumoku: Replaced old &amp;lt;LSL&amp;gt; block with &amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Part of [[Bobbyb&#039;s texture changer]] collection &lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
//https://wiki.secondlife.com/wiki/Simple_Texture_Changer_(for_inventory)(certain_prims_%26_all_sides).lsl&lt;br /&gt;
//***********************************************************************************************************&lt;br /&gt;
//                                                                                                          *&lt;br /&gt;
//              --Simple Texture Changer (for inventory)(certain prims &amp;amp; all sides)--                       *&lt;br /&gt;
//                                                                                                          *&lt;br /&gt;
//***********************************************************************************************************&lt;br /&gt;
// www.lsleditor.org  by Alphons van der Heijden (SL: Alphons Jano)&lt;br /&gt;
//Creator: Bobbyb30 Swashbuckler&lt;br /&gt;
//Attribution: None required, but it is appreciated.&lt;br /&gt;
//Created: November 26, 2009&lt;br /&gt;
//Last Modified: November 26, 2009&lt;br /&gt;
//Released: Saturday, November 28, 2009&lt;br /&gt;
//License: Public Domain&lt;br /&gt;
&lt;br /&gt;
//Status: Fully Working/Production Ready&lt;br /&gt;
//Version: 1.0.2&lt;br /&gt;
&lt;br /&gt;
//Name: Simple Texture Changer (for inventory)(certain prims &amp;amp; all sides).lsl&lt;br /&gt;
//Purpose: To change the texture on all the sides of certain prims in a linked set.&lt;br /&gt;
//Technical Overview: The script finds how many textures there are in inventory, and uses a timer to change the&lt;br /&gt;
//                    texture on a side based on randomness or order. It takes into account inventory changes. It uses&lt;br /&gt;
//                    a user defined list to determine which sides to change.&lt;br /&gt;
//Description: A simple texture changer script that changes the texture on all the sides of a certain prims in a linked&lt;br /&gt;
// 			   set to those in inventory. It allows for a random order, or a logical &amp;quot;next up&amp;quot; order.&lt;br /&gt;
//Directions: Create a prim. Place pictures in prim inventory. Place script in prim inventory. Modify script parameters&lt;br /&gt;
//            to suit your needs. If you add pictures, and the script does not reset, manually reset the script.&lt;br /&gt;
&lt;br /&gt;
//Compatible: Mono &amp;amp; LSL compatible&lt;br /&gt;
//Other items required: More than 1 texture in inventory.&lt;br /&gt;
//Notes: Uses a timer event. Should be low lag. Commented for easier following. This will change the all of the&lt;br /&gt;
//       sides of certain linked prims to the *same* texture.&lt;br /&gt;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
//Adjustable global variables...you may change these&lt;br /&gt;
//Please note there is a .2 second delay between prims.&lt;br /&gt;
list prims = [0,1,5,2];//which prims to change&lt;br /&gt;
float frequency = 2.0;//how often to change the texture in seconds. Shouldn&#039;t be below 2.0&lt;br /&gt;
&lt;br /&gt;
//please note that the last and first texture will be shown less frequently than those in between&lt;br /&gt;
integer random = TRUE;//whether to show the textures randomly, or in order&lt;br /&gt;
integer duplicatecheck = TRUE;//if random is true, this will check to make sure the random selection is a new texture&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
/////////////////////////////////////////////////////////////&lt;br /&gt;
//global variables...do not change&lt;br /&gt;
integer numberoftextures;//number of textures in inventory&lt;br /&gt;
integer currenttexture;//inventory number of current texture&lt;br /&gt;
integer primslength;//length of the prims list&lt;br /&gt;
&lt;br /&gt;
changetexture()//user fucntion to change texture;&lt;br /&gt;
{&lt;br /&gt;
    integer counter;&lt;br /&gt;
    string texture = llGetInventoryName(INVENTORY_TEXTURE,currenttexture);//gets texture name&lt;br /&gt;
    do&lt;br /&gt;
    {&lt;br /&gt;
        llSetLinkTexture(llList2Integer(prims,counter),texture,ALL_SIDES);&lt;br /&gt;
    }while(++counter &amp;lt; primslength);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    on_rez(integer start_param)//on rez reset...probably not needed.&lt;br /&gt;
    {&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llOwnerSay(&amp;quot;Simple Texture Changer (for inventory)(certain prims &amp;amp; all sides).lsl&#039; (Public Domain 2009)&amp;quot;);&lt;br /&gt;
        llOwnerSay(&amp;quot;Because knowledge should be free.&amp;quot;);&lt;br /&gt;
        numberoftextures = llGetInventoryNumber(INVENTORY_TEXTURE);//number of textures in inventory&lt;br /&gt;
        primslength = llGetListLength(prims);//speed hack here&lt;br /&gt;
        if(numberoftextures &amp;lt;= 0)//no textures&lt;br /&gt;
            llOwnerSay(&amp;quot;No textures were found in my inventory. Please add textures.&amp;quot;);&lt;br /&gt;
        else if(numberoftextures == 1)//only 1 texture&lt;br /&gt;
            llOwnerSay(&amp;quot;I only found 1 picture in my inventory. I need more in order to change them.&amp;quot;);&lt;br /&gt;
        //for 2 random isn&#039;t needed...but I&#039;m too lazy to add that in&lt;br /&gt;
        else//more than 1 texture found...&lt;br /&gt;
        {&lt;br /&gt;
            llOwnerSay(&amp;quot;I found &amp;quot; + (string)numberoftextures + &amp;quot; pictures which I will change every &amp;quot;&lt;br /&gt;
                + (string)frequency + &amp;quot; seconds on these prims: &amp;quot; + llList2CSV(prims) + &amp;quot;.&amp;quot;);&lt;br /&gt;
            llSetTimerEvent(frequency);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        if(random)//show pics randomly&lt;br /&gt;
        {&lt;br /&gt;
            integer randomtexture;&lt;br /&gt;
            if(duplicatecheck)//whether to make sure random doesn&#039;t repeat itself&lt;br /&gt;
            {&lt;br /&gt;
                do&lt;br /&gt;
                {&lt;br /&gt;
                    randomtexture= llRound(llFrand(numberoftextures - 1));&lt;br /&gt;
                    //llOwnerSay(&amp;quot;r&amp;quot; + (string)randomtexture);//debug&lt;br /&gt;
                }while(randomtexture == currenttexture);//make sure the random one isn&#039;t the same as the current one&lt;br /&gt;
            }&lt;br /&gt;
            else//no duplicate check&lt;br /&gt;
                randomtexture = llRound(llFrand(numberoftextures - 1));//generate random texture number&lt;br /&gt;
            currenttexture = randomtexture;//set the current one to the random one selected&lt;br /&gt;
            changetexture();//change the texture&lt;br /&gt;
            //llOwnerSay(&amp;quot;c&amp;quot; + (string)currenttexture);//debug&lt;br /&gt;
        }&lt;br /&gt;
        else//not random, go in order&lt;br /&gt;
        {&lt;br /&gt;
            ++currenttexture;&lt;br /&gt;
            if(currenttexture == numberoftextures)//if current texture = number of textures, reset counter&lt;br /&gt;
                currenttexture = 0;&lt;br /&gt;
            changetexture();//change the texture&lt;br /&gt;
            //llOwnerSay(&amp;quot;c&amp;quot; + (string)currenttexture);//debug&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    changed(integer change)&lt;br /&gt;
    {&lt;br /&gt;
        if(change &amp;amp; CHANGED_INVENTORY)//new or removed inventory...update texture count&lt;br /&gt;
        {&lt;br /&gt;
            llOwnerSay(&amp;quot;Inventory change detected.&amp;quot;);&lt;br /&gt;
            numberoftextures = llGetInventoryNumber(INVENTORY_TEXTURE);&lt;br /&gt;
            llOwnerSay(&amp;quot;I found &amp;quot; + (string)numberoftextures + &amp;quot; pictures which I will change every &amp;quot;&lt;br /&gt;
                + (string)frequency + &amp;quot; seconds on these prims: &amp;quot; + llList2CSV(prims) +&amp;quot;.&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lady Sumoku</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Simple_Texture_Changer_(input_list)(all_prims_%26_all_sides).lsl&amp;diff=1195035</id>
		<title>Simple Texture Changer (input list)(all prims &amp; all sides).lsl</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Simple_Texture_Changer_(input_list)(all_prims_%26_all_sides).lsl&amp;diff=1195035"/>
		<updated>2015-01-25T04:05:32Z</updated>

		<summary type="html">&lt;p&gt;Lady Sumoku: Replaced old &amp;lt;LSL&amp;gt; block with &amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Part of [[Bobbyb&#039;s texture changer]] collection &lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
//***********************************************************************************************************&lt;br /&gt;
//                                                                                                          *&lt;br /&gt;
//              --Simple Texture Changer (input list)(all prims &amp;amp; all sides)--                              *&lt;br /&gt;
//                                                                                                          *&lt;br /&gt;
//***********************************************************************************************************&lt;br /&gt;
// www.lsleditor.org  by Alphons van der Heijden (SL: Alphons Jano)&lt;br /&gt;
//Creator: Bobbyb30 Swashbuckler&lt;br /&gt;
//Attribution: None required, but it is appreciated.&lt;br /&gt;
//Created: April 28, 2009&lt;br /&gt;
//Last Modified: November 28, 2009&lt;br /&gt;
//Released: Saturday, November 28, 2009&lt;br /&gt;
//License: Public Domain&lt;br /&gt;
&lt;br /&gt;
//Status: Fully Working/Production Ready&lt;br /&gt;
//Version: 1.0.6&lt;br /&gt;
&lt;br /&gt;
//Name: Simple Texture Changer (input list)(certain prims &amp;amp; all sides).lsl&lt;br /&gt;
//Purpose: To change the texture on all linked prims on all sides based on the textures in the input list.&lt;br /&gt;
//Technical Overview: The script finds how many textures there are in the input list, and uses a timer to change the&lt;br /&gt;
//                    texture on a side based on randomness or order. It changes all sides of the certain prim to the&lt;br /&gt;
//                    specified texture&lt;br /&gt;
//Description: A simple texture changer script that changes the texture on all the sides of all linked prims in a linked&lt;br /&gt;
// 			   set to those in the input list. It allows for a random order, or a logical &amp;quot;next up&amp;quot; order.&lt;br /&gt;
//Directions: Create a prim. Place the script in prim inventory. Modify the script parameters to suit your needs and&lt;br /&gt;
//            save. Reset script if you add/remove linked prims.&lt;br /&gt;
&lt;br /&gt;
//Compatible: Mono &amp;amp; LSL compatible&lt;br /&gt;
//Other items required: None.&lt;br /&gt;
//Notes: Uses a timer event. Should be low lag. Commented for easier following. This will change all of the sides&lt;br /&gt;
//       of certain linked prims to the *same* texture based on the input texture list.&lt;br /&gt;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
//Adjustable global variables...you may change these&lt;br /&gt;
//texture list...this list should have 2 or more textures&lt;br /&gt;
list textures = [&lt;br /&gt;
    &amp;quot;00000000-0000-0000-0000-0000f0000000&amp;quot;,&lt;br /&gt;
    &amp;quot;00000000-0000-0000-0000-0000d0000000&amp;quot;,&lt;br /&gt;
    &amp;quot;00000000-0000-0000-0000-0000e0000000&amp;quot;];//put your texture UUIDs/keys in here&lt;br /&gt;
&lt;br /&gt;
//Please note there is a .2 second delay between prims.&lt;br /&gt;
float frequency = 2.0;//how often to change the texture in seconds. Shouldn&#039;t be below 2.0&lt;br /&gt;
&lt;br /&gt;
//please note that the last and first texture will be shown less frequently than those in between&lt;br /&gt;
integer random = TRUE;//whether to show the textures randomly, or in order&lt;br /&gt;
integer duplicatecheck = TRUE;//if random is true, this will check to make sure the random selection is a new texture&lt;br /&gt;
integer atonce = FALSE;//whether to change all the prims at once, or one at a time&lt;br /&gt;
&lt;br /&gt;
/////////////////////////////////////////////////////////////&lt;br /&gt;
//global variables...do not change&lt;br /&gt;
integer numberoftextures;//number of textures in inventory&lt;br /&gt;
integer currenttexture;//inventory number of current texture&lt;br /&gt;
integer numberofprims;//number of prims&lt;br /&gt;
&lt;br /&gt;
changetexture()//user fucntion to change texture;&lt;br /&gt;
{&lt;br /&gt;
    string texture = llList2String(textures,currenttexture);&lt;br /&gt;
    if(atonce)&lt;br /&gt;
        llSetLinkTexture(LINK_SET,texture,ALL_SIDES);&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        integer counter = 1;&lt;br /&gt;
        do&lt;br /&gt;
        {&lt;br /&gt;
            llSetLinkTexture(counter,texture,ALL_SIDES);&lt;br /&gt;
        }while(++counter &amp;lt; (numberofprims + 1));&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    on_rez(integer start_param)//on rez reset...probably not needed.&lt;br /&gt;
    {&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llOwnerSay(&amp;quot;Simple Texture Changer (input list)(certain prims &amp;amp; all sides).lsl&#039; (Public Domain 2009)&amp;quot;);&lt;br /&gt;
        llOwnerSay(&amp;quot;Because knowledge should be free.&amp;quot;);&lt;br /&gt;
        numberoftextures = llGetListLength(textures);//speed hack here&lt;br /&gt;
        numberofprims = llGetNumberOfPrims();&lt;br /&gt;
        //assume correct&lt;br /&gt;
        llOwnerSay(&amp;quot;There are &amp;quot; + (string)numberoftextures + &amp;quot; pictures which I will change every &amp;quot;&lt;br /&gt;
            + (string)frequency + &amp;quot; seconds on all the sides of all the sides.&amp;quot;);&lt;br /&gt;
        llOwnerSay(&amp;quot;My current free memory is : &amp;quot; + (string)llGetFreeMemory()&lt;br /&gt;
            + &amp;quot; bytes. If it is below 2500 bytes, I may not work properly.&amp;quot;);&lt;br /&gt;
        llSetTimerEvent(frequency);&lt;br /&gt;
    }&lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        if(random)//show pics randomly&lt;br /&gt;
        {&lt;br /&gt;
            integer randomtexture;&lt;br /&gt;
            if(duplicatecheck)//whether to make sure random doesn&#039;t repeat itself&lt;br /&gt;
            {&lt;br /&gt;
                do&lt;br /&gt;
                {&lt;br /&gt;
                    randomtexture= llRound(llFrand(numberoftextures - 1));&lt;br /&gt;
                    //llOwnerSay(&amp;quot;r&amp;quot; + (string)randomtexture);//debug&lt;br /&gt;
                }while(randomtexture == currenttexture);//make sure the random one isn&#039;t the same as the current one&lt;br /&gt;
            }&lt;br /&gt;
            else//no duplicate check&lt;br /&gt;
                randomtexture = llRound(llFrand(numberoftextures - 1));//generate random texture number&lt;br /&gt;
            currenttexture = randomtexture;//set the current one to the random one selected&lt;br /&gt;
            changetexture();//change the texture&lt;br /&gt;
            //llOwnerSay(&amp;quot;c&amp;quot; + (string)currenttexture);//debug&lt;br /&gt;
        }&lt;br /&gt;
        else//not random, go in order&lt;br /&gt;
        {&lt;br /&gt;
            ++currenttexture;&lt;br /&gt;
            if(currenttexture == numberoftextures)//if current texture = number of textures, reset counter&lt;br /&gt;
                currenttexture = 0;&lt;br /&gt;
            changetexture();//change the texture&lt;br /&gt;
            //llOwnerSay(&amp;quot;c&amp;quot; + (string)currenttexture);//debug&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lady Sumoku</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Simple_Texture_Changer_(for_inventory)(all_prims_%26_all_sides).lsl&amp;diff=1195032</id>
		<title>Simple Texture Changer (for inventory)(all prims &amp; all sides).lsl</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Simple_Texture_Changer_(for_inventory)(all_prims_%26_all_sides).lsl&amp;diff=1195032"/>
		<updated>2015-01-25T04:03:19Z</updated>

		<summary type="html">&lt;p&gt;Lady Sumoku: Replaced old &amp;lt;LSL&amp;gt; block with &amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Part of [[Bobbyb&#039;s texture changer]] collection &lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
//https://wiki.secondlife.com/wiki/Simple_Texture_Changer_(input_list)(multiple_prims_%26_multiple_sides).lsl&lt;br /&gt;
//***********************************************************************************************************&lt;br /&gt;
//                                                                                                          *&lt;br /&gt;
//              --Simple Texture Changer (for inventory)(all prims &amp;amp; all sides)--                           *&lt;br /&gt;
//                                                                                                          *&lt;br /&gt;
//***********************************************************************************************************&lt;br /&gt;
// www.lsleditor.org  by Alphons van der Heijden (SL: Alphons Jano)&lt;br /&gt;
//Creator: Bobbyb30 Swashbuckler&lt;br /&gt;
//Attribution: None required, but it is appreciated.&lt;br /&gt;
//Created: November 12, 2008&lt;br /&gt;
//Last Modified: November 28, 2009&lt;br /&gt;
//Released: Saturday, November 28, 2009&lt;br /&gt;
//License: Public Domain&lt;br /&gt;
&lt;br /&gt;
//Status: Fully Working/Production Ready&lt;br /&gt;
//Version: 1.0.3&lt;br /&gt;
&lt;br /&gt;
//Name: Simple Texture Changer (for inventory)(all prims &amp;amp; all sides).lsl&lt;br /&gt;
//Purpose: To change the texture on all the prims and all of their sides based on the textures in inventory.&lt;br /&gt;
//Technical Overview: The script finds how many textures there are in inventory, and uses a timer to change the&lt;br /&gt;
//                    texture on a side based on randomness or order. It takes into account inventory changes. It uses&lt;br /&gt;
//                    a user defined list to determine which sides to change.&lt;br /&gt;
//Description: A simple texture changer script that changes the texture on all the sides of all the prims in a&lt;br /&gt;
// 			   linked prim set to those in inventory. It allows for a random order, or a logical &amp;quot;next up&amp;quot; order.&lt;br /&gt;
//Directions: Create a prim. Place pictures in prim inventory. Place script in prim inventory. Modify script parameters&lt;br /&gt;
//            to suit your needs. If you add pictures, and the script does not reset, manually reset the script.&lt;br /&gt;
&lt;br /&gt;
//Compatible: Mono &amp;amp; LSL compatible&lt;br /&gt;
//Other items required: More than 1 texture in inventory.&lt;br /&gt;
//Notes: Uses a timer event. Should be low lag. Commented for easier following. This will change the all the sides&lt;br /&gt;
//       of linked prims to the *same* texture.&lt;br /&gt;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
&lt;br /&gt;
//Adjustable global variables...you may change these&lt;br /&gt;
//Please note there is a .2 second delay between prims.&lt;br /&gt;
//all prims all sides&lt;br /&gt;
float frequency = 2.0;//how often to change the texture in seconds. Shouldn&#039;t be below 2.0&lt;br /&gt;
&lt;br /&gt;
//please note that the last and first texture will be shown less frequently than those in between&lt;br /&gt;
integer random = TRUE;//whether to show the textures randomly, or in order&lt;br /&gt;
integer duplicatecheck = TRUE;//if random is true, this will check to make sure the random selection is a new texture&lt;br /&gt;
integer atonce = FALSE;//whether to change all the prims at once, or one at a time&lt;br /&gt;
&lt;br /&gt;
/////////////////////////////////////////////////////////////&lt;br /&gt;
//global variables...do not change&lt;br /&gt;
integer numberoftextures;//number of textures in inventory&lt;br /&gt;
integer currenttexture;//inventory number of current texture&lt;br /&gt;
integer numberofprims;//the number of prims there are&lt;br /&gt;
&lt;br /&gt;
changetexture()//user fucntion to change texture;&lt;br /&gt;
{&lt;br /&gt;
&lt;br /&gt;
    string texture = llGetInventoryName(INVENTORY_TEXTURE,currenttexture);//gets texture key&lt;br /&gt;
    if(atonce)&lt;br /&gt;
        llSetLinkTexture(LINK_SET,texture,ALL_SIDES);&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        integer counter=1;&lt;br /&gt;
        do&lt;br /&gt;
        {&lt;br /&gt;
            llSetLinkTexture(counter,texture,ALL_SIDES);&lt;br /&gt;
        }while(++counter &amp;lt; (numberofprims + 1));&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    on_rez(integer start_param)//on rez reset...probably not needed.&lt;br /&gt;
    {&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llOwnerSay(&amp;quot;Simple Texture Changer (for inventory)(all prims &amp;amp; all sides).lsl&#039; (Public Domain 2009)&amp;quot;);&lt;br /&gt;
        llOwnerSay(&amp;quot;Because knowledge should be free.&amp;quot;);&lt;br /&gt;
        numberoftextures = llGetInventoryNumber(INVENTORY_TEXTURE);//number of textures in inventory&lt;br /&gt;
        numberofprims = llGetNumberOfPrims();&lt;br /&gt;
        if(numberoftextures &amp;lt;= 0)//no textures&lt;br /&gt;
            llOwnerSay(&amp;quot;No textures were found in my inventory. Please add textures.&amp;quot;);&lt;br /&gt;
        else if(numberoftextures == 1)//only 1 texture&lt;br /&gt;
            llOwnerSay(&amp;quot;I only found 1 picture in my inventory. I need more in order to change them.&amp;quot;);&lt;br /&gt;
        //for 2 random isn&#039;t needed...but I&#039;m too lazy to add that in&lt;br /&gt;
        else//more than 1 texture found...&lt;br /&gt;
        {&lt;br /&gt;
            llOwnerSay(&amp;quot;I found &amp;quot; + (string)numberoftextures + &amp;quot; pictures which I will change every &amp;quot;&lt;br /&gt;
                + (string)frequency + &amp;quot; seconds on &amp;quot; + (string)numberofprims + &amp;quot; prims.&amp;quot;);&lt;br /&gt;
            llSetTimerEvent(frequency);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        if(random)//show pics randomly&lt;br /&gt;
        {&lt;br /&gt;
            integer randomtexture;&lt;br /&gt;
            if(duplicatecheck)//whether to make sure random doesn&#039;t repeat itself&lt;br /&gt;
            {&lt;br /&gt;
                do&lt;br /&gt;
                {&lt;br /&gt;
                    randomtexture= llRound(llFrand(numberoftextures - 1));&lt;br /&gt;
                    //llOwnerSay(&amp;quot;r&amp;quot; + (string)randomtexture);//debug&lt;br /&gt;
                }while(randomtexture == currenttexture);//make sure the random one isn&#039;t the same as the current one&lt;br /&gt;
            }&lt;br /&gt;
            else//no duplicate check&lt;br /&gt;
                randomtexture = llRound(llFrand(numberoftextures - 1));//generate random texture number&lt;br /&gt;
            currenttexture = randomtexture;//set the current one to the random one selected&lt;br /&gt;
            changetexture();//change the texture&lt;br /&gt;
            //llOwnerSay(&amp;quot;c&amp;quot; + (string)currenttexture);//debug&lt;br /&gt;
        }&lt;br /&gt;
        else//not random, go in order&lt;br /&gt;
        {&lt;br /&gt;
            ++currenttexture;&lt;br /&gt;
            if(currenttexture == numberoftextures)//if current texture = number of textures, reset counter&lt;br /&gt;
                currenttexture = 0;&lt;br /&gt;
            changetexture();//change the texture&lt;br /&gt;
            //llOwnerSay(&amp;quot;c&amp;quot; + (string)currenttexture);//debug&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    changed(integer change)&lt;br /&gt;
    {&lt;br /&gt;
        if(change &amp;amp; CHANGED_INVENTORY)//new or removed inventory...update texture count&lt;br /&gt;
        {&lt;br /&gt;
            llOwnerSay(&amp;quot;Inventory change detected.&amp;quot;);&lt;br /&gt;
            numberoftextures = llGetInventoryNumber(INVENTORY_TEXTURE);&lt;br /&gt;
            llOwnerSay(&amp;quot;I found &amp;quot; + (string)numberoftextures + &amp;quot; pictures which I will change every &amp;quot;&lt;br /&gt;
                + (string)frequency + &amp;quot; seconds on &amp;quot; + (string)numberofprims + &amp;quot; prims.&amp;quot;); 		}&lt;br /&gt;
        else if(change &amp;amp; CHANGED_LINK)//new or removed prims...update prim count&lt;br /&gt;
        {&lt;br /&gt;
            llOwnerSay(&amp;quot;Object links changed.&amp;quot;);&lt;br /&gt;
            numberofprims = llGetNumberOfPrims();&lt;br /&gt;
            llOwnerSay(&amp;quot;This object has &amp;quot; + (string)numberofprims + &amp;quot; prims.&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lady Sumoku</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Xen_Lisle/Texture_Slide&amp;diff=1195028</id>
		<title>User:Xen Lisle/Texture Slide</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Xen_Lisle/Texture_Slide&amp;diff=1195028"/>
		<updated>2015-01-25T04:01:17Z</updated>

		<summary type="html">&lt;p&gt;Lady Sumoku: Replaced old &amp;lt;LSL&amp;gt; block with &amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em;&amp;quot;&amp;gt;&lt;br /&gt;
=Texture Slide=&lt;br /&gt;
&lt;br /&gt;
==General information:==&lt;br /&gt;
&lt;br /&gt;
This is a proof of concept to show how to slide a texture across a prim face with mouse movement.&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
The script will display a grid texture of 25 squares. Clicking on a grid square will return that squares value.&amp;lt;br&amp;gt;&lt;br /&gt;
Clicking and holding while moving the mouse, the texture will slide in the direction of the mouse movement.&lt;br /&gt;
&lt;br /&gt;
==Script==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
//  Touch and drag a texture across a prim face&lt;br /&gt;
//  Useful for interfaces and such&lt;br /&gt;
//  Example script gives you 25 buttons to click on&lt;br /&gt;
//  By Xen Lisle&lt;br /&gt;
//  Free to use&lt;br /&gt;
&lt;br /&gt;
//  prim face you want the script to work on&lt;br /&gt;
integer gFace = 0;&lt;br /&gt;
&lt;br /&gt;
//  the UV repeats of the texture. values smaller than one will show only part of the texture&lt;br /&gt;
vector UV_TEXTURE_REPEATS = &amp;lt;1.0, 1.0, 0.0&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
//  your menu texture&lt;br /&gt;
string MENU_TEXTURE = &amp;quot;69737f61-1fdd-6033-7ea3-a52e61a40137&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
//  strided list to define button labels and values&lt;br /&gt;
//    - vector one is top left button corner&lt;br /&gt;
//    - vector two is bottom right button corner&lt;br /&gt;
//    - next two elements hold data for the buttons&lt;br /&gt;
//  elements in this example: LABEL, DATA&lt;br /&gt;
//  assigning a label helps to filter different button actions&lt;br /&gt;
//  not very helpful in our example but included anyway&lt;br /&gt;
list BUTTONS_STRIDED_LIST = [&lt;br /&gt;
    &amp;lt;0.0, 1.0, 0.0&amp;gt;,    &amp;lt;0.2, 0.8, 0.0&amp;gt;,    &amp;quot;Button&amp;quot;,   &amp;quot;A-0&amp;quot;,&lt;br /&gt;
    &amp;lt;0.2, 1.0, 0.0&amp;gt;,    &amp;lt;0.4, 0.8, 0.0&amp;gt;,    &amp;quot;Button&amp;quot;,   &amp;quot;A-1&amp;quot;,&lt;br /&gt;
    &amp;lt;0.4, 1.0, 0.0&amp;gt;,    &amp;lt;0.6, 0.8, 0.0&amp;gt;,    &amp;quot;Button&amp;quot;,   &amp;quot;A-2&amp;quot;,&lt;br /&gt;
    &amp;lt;0.6, 1.0, 0.0&amp;gt;,    &amp;lt;0.8, 0.8, 0.0&amp;gt;,    &amp;quot;Button&amp;quot;,   &amp;quot;A-3&amp;quot;,&lt;br /&gt;
    &amp;lt;0.8, 1.0, 0.0&amp;gt;,    &amp;lt;1.0, 0.8, 0.0&amp;gt;,    &amp;quot;Button&amp;quot;,   &amp;quot;A-4&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;0.0, 0.8, 0.0&amp;gt;,    &amp;lt;0.2, 0.6, 0.0&amp;gt;,    &amp;quot;Button&amp;quot;,   &amp;quot;B-0&amp;quot;,&lt;br /&gt;
    &amp;lt;0.2, 0.8, 0.0&amp;gt;,    &amp;lt;0.4, 0.6, 0.0&amp;gt;,    &amp;quot;Button&amp;quot;,   &amp;quot;B-1&amp;quot;,&lt;br /&gt;
    &amp;lt;0.4, 0.8, 0.0&amp;gt;,    &amp;lt;0.6, 0.6, 0.0&amp;gt;,    &amp;quot;Button&amp;quot;,   &amp;quot;B-2&amp;quot;,&lt;br /&gt;
    &amp;lt;0.6, 0.8, 0.0&amp;gt;,    &amp;lt;0.8, 0.6, 0.0&amp;gt;,    &amp;quot;Button&amp;quot;,   &amp;quot;B-3&amp;quot;,&lt;br /&gt;
    &amp;lt;0.8, 0.8, 0.0&amp;gt;,    &amp;lt;1.0, 0.6, 0.0&amp;gt;,    &amp;quot;Button&amp;quot;,   &amp;quot;B-4&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;0.0, 0.6, 0.0&amp;gt;,    &amp;lt;0.2, 0.4, 0.0&amp;gt;,    &amp;quot;Button&amp;quot;,   &amp;quot;C-0&amp;quot;,&lt;br /&gt;
    &amp;lt;0.2, 0.6, 0.0&amp;gt;,    &amp;lt;0.4, 0.4, 0.0&amp;gt;,    &amp;quot;Button&amp;quot;,   &amp;quot;C-1&amp;quot;,&lt;br /&gt;
    &amp;lt;0.4, 0.6, 0.0&amp;gt;,    &amp;lt;0.6, 0.4, 0.0&amp;gt;,    &amp;quot;Button&amp;quot;,   &amp;quot;C-2&amp;quot;,&lt;br /&gt;
    &amp;lt;0.6, 0.6, 0.0&amp;gt;,    &amp;lt;0.8, 0.4, 0.0&amp;gt;,    &amp;quot;Button&amp;quot;,   &amp;quot;C-3&amp;quot;,&lt;br /&gt;
    &amp;lt;0.8, 0.6, 0.0&amp;gt;,    &amp;lt;1.0, 0.4, 0.0&amp;gt;,    &amp;quot;Button&amp;quot;,   &amp;quot;C-4&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;0.0, 0.4, 0.0&amp;gt;,    &amp;lt;0.2, 0.2, 0.0&amp;gt;,    &amp;quot;Button&amp;quot;,   &amp;quot;D-0&amp;quot;,&lt;br /&gt;
    &amp;lt;0.2, 0.4, 0.0&amp;gt;,    &amp;lt;0.4, 0.2, 0.0&amp;gt;,    &amp;quot;Button&amp;quot;,   &amp;quot;D-1&amp;quot;,&lt;br /&gt;
    &amp;lt;0.4, 0.4, 0.0&amp;gt;,    &amp;lt;0.6, 0.2, 0.0&amp;gt;,    &amp;quot;Button&amp;quot;,   &amp;quot;D-2&amp;quot;,&lt;br /&gt;
    &amp;lt;0.6, 0.4, 0.0&amp;gt;,    &amp;lt;0.8, 0.2, 0.0&amp;gt;,    &amp;quot;Button&amp;quot;,   &amp;quot;D-3&amp;quot;,&lt;br /&gt;
    &amp;lt;0.8, 0.4, 0.0&amp;gt;,    &amp;lt;1.0, 0.2, 0.0&amp;gt;,    &amp;quot;Button&amp;quot;,   &amp;quot;D-4&amp;quot;,&lt;br /&gt;
&lt;br /&gt;
    &amp;lt;0.0, 0.2, 0.0&amp;gt;,    &amp;lt;0.2, 0.0, 0.0&amp;gt;,    &amp;quot;Button&amp;quot;,   &amp;quot;E-0&amp;quot;,&lt;br /&gt;
    &amp;lt;0.2, 0.2, 0.0&amp;gt;,    &amp;lt;0.4, 0.0, 0.0&amp;gt;,    &amp;quot;Button&amp;quot;,   &amp;quot;E-1&amp;quot;,&lt;br /&gt;
    &amp;lt;0.4, 0.2, 0.0&amp;gt;,    &amp;lt;0.6, 0.0, 0.0&amp;gt;,    &amp;quot;Button&amp;quot;,   &amp;quot;E-2&amp;quot;,&lt;br /&gt;
    &amp;lt;0.6, 0.2, 0.0&amp;gt;,    &amp;lt;0.8, 0.0, 0.0&amp;gt;,    &amp;quot;Button&amp;quot;,   &amp;quot;E-3&amp;quot;,&lt;br /&gt;
    &amp;lt;0.8, 0.2, 0.0&amp;gt;,    &amp;lt;1.0, 0.0, 0.0&amp;gt;,    &amp;quot;Button&amp;quot;,   &amp;quot;E-4&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
vector gStartST;&lt;br /&gt;
vector gEndST;&lt;br /&gt;
vector gOffsetUV;&lt;br /&gt;
&lt;br /&gt;
list FindUV(vector v, list lst)&lt;br /&gt;
{&lt;br /&gt;
    vector cordA;&lt;br /&gt;
    vector cordB;&lt;br /&gt;
    integer lines = llGetListLength(lst) / 4;&lt;br /&gt;
&lt;br /&gt;
    //  roll values between 0 and 1&lt;br /&gt;
    v -= &amp;lt;llFloor(v.x), llFloor(v.y), 0.0&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
    integer i;&lt;br /&gt;
    for (i = 0; i &amp;lt; lines; i++)&lt;br /&gt;
    {&lt;br /&gt;
        cordA = llList2Vector(lst,i * 4);&lt;br /&gt;
        cordB = llList2Vector(lst, i * 4 + 1);&lt;br /&gt;
&lt;br /&gt;
        if (v.x &amp;gt; cordA.x &amp;amp;&amp;amp; v.x &amp;lt; cordB.x &amp;amp;&amp;amp;&lt;br /&gt;
            v.y &amp;lt; cordA.y &amp;amp;&amp;amp; v.y &amp;gt; cordB.y)&lt;br /&gt;
        {&lt;br /&gt;
            return llList2List(lst, i*4 + 2, i*4 + 3);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return [];&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        if (MENU_TEXTURE == &amp;quot;&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            MENU_TEXTURE = &amp;quot;69737f61-1fdd-6033-7ea3-a52e61a40137&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        llSetLinkPrimitiveParamsFast(0, [&lt;br /&gt;
            PRIM_TEXTURE, gFace, MENU_TEXTURE, UV_TEXTURE_REPEATS, ZERO_VECTOR, 0.0]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer num_detected)&lt;br /&gt;
    {&lt;br /&gt;
        integer face = llDetectedTouchFace(0);&lt;br /&gt;
&lt;br /&gt;
        if (face == gFace)&lt;br /&gt;
        {&lt;br /&gt;
            gOffsetUV = llGetTextureOffset(gFace);&lt;br /&gt;
            gStartST = llDetectedTouchST(0);&lt;br /&gt;
&lt;br /&gt;
            //  scale the touch vector to match our texture scale&lt;br /&gt;
            gStartST = &amp;lt;gStartST.x*UV_TEXTURE_REPEATS.x, gStartST.y*UV_TEXTURE_REPEATS.y, 0.0&amp;gt;;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    touch(integer num_detected)&lt;br /&gt;
    {&lt;br /&gt;
        integer face = llDetectedTouchFace(0);&lt;br /&gt;
&lt;br /&gt;
        if (face == gFace)&lt;br /&gt;
        {&lt;br /&gt;
            gEndST = llDetectedTouchST(0);&lt;br /&gt;
&lt;br /&gt;
            //  scale the touch vector to match our texture scale&lt;br /&gt;
            gEndST = &amp;lt;gEndST.x*UV_TEXTURE_REPEATS.x, gEndST.y*UV_TEXTURE_REPEATS.y, 0.0&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
            if (llVecDist(gStartST,gEndST) &amp;gt; 0.0)&lt;br /&gt;
            {&lt;br /&gt;
                 vector newUV = gOffsetUV + (gStartST - gEndST);&lt;br /&gt;
&lt;br /&gt;
                 //  roll values between 0 and 1&lt;br /&gt;
                 newUV -= &amp;lt;llFloor(newUV.x), llFloor(newUV.y), 0.0&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
                //  apply new texture offset&lt;br /&gt;
                 llSetLinkPrimitiveParamsFast(0, [&lt;br /&gt;
                    PRIM_TEXTURE, gFace, MENU_TEXTURE, UV_TEXTURE_REPEATS, newUV, 0.0]);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    touch_end(integer num_detected)&lt;br /&gt;
    {&lt;br /&gt;
        integer face = llDetectedTouchFace(0);&lt;br /&gt;
&lt;br /&gt;
        if (face == gFace)&lt;br /&gt;
        {&lt;br /&gt;
            if (llVecDist(gStartST, gEndST) &amp;gt; 0.0)&lt;br /&gt;
            {&lt;br /&gt;
                //  compare mouse movement to see if texture was moved. maybe useful to do something here&lt;br /&gt;
            }&lt;br /&gt;
            else//  did not slide the texture. was a button press&lt;br /&gt;
            {&lt;br /&gt;
                list list_data = FindUV(llDetectedTouchUV(0), BUTTONS_STRIDED_LIST);&lt;br /&gt;
&lt;br /&gt;
                //This next line is where we compare button labels&lt;br /&gt;
                if (llList2String(list_data, 0) == &amp;quot;Button&amp;quot;)&lt;br /&gt;
                {&lt;br /&gt;
                    llSay(PUBLIC_CHANNEL, llList2String(list_data, 1));&lt;br /&gt;
                }&lt;br /&gt;
            }&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;/div&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lady Sumoku</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Touring_Balloon&amp;diff=1194999</id>
		<title>Touring Balloon</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Touring_Balloon&amp;diff=1194999"/>
		<updated>2015-01-25T03:06:20Z</updated>

		<summary type="html">&lt;p&gt;Lady Sumoku: Replaced old &amp;lt;LSL&amp;gt; block with &amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;, &amp;lt;pre&amp;gt; formatting for notecard contents&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
&lt;br /&gt;
My touring hot air balloon...&lt;br /&gt;
&lt;br /&gt;
== Hot Air Balloon &amp;quot;Engine&amp;quot; ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;//Hot Air Touring Balloon&lt;br /&gt;
//by Hank Ramos&lt;br /&gt;
&lt;br /&gt;
//=========&lt;br /&gt;
//Overview&lt;br /&gt;
//=========&lt;br /&gt;
//The Hot air balloon consists of a large number of scripts, working together.  The balloon will not function properly without all of the scripts.  The scripts are broken up by function, mainly for convenience but also because of the limitations of the LSL scripting memory.&lt;br /&gt;
&lt;br /&gt;
//============================&lt;br /&gt;
//Scripts and their Function&lt;br /&gt;
//============================&lt;br /&gt;
//Hot Air Balloon: &lt;br /&gt;
//The main script and &amp;quot;engine&amp;quot; of the entire balloon.  All major functions are done here&lt;br /&gt;
&lt;br /&gt;
//Automated Tour: &lt;br /&gt;
//Handles automatic tours given by a pre-set Tour notecard.  The script reads and follows the directions given in the script, and sends commands to the Hot Air Balloon script.&lt;br /&gt;
&lt;br /&gt;
//Destination Script: &lt;br /&gt;
//Handles the file i/o of the tour notecards.  It converts the notecard information to a list of destinations for the Automated Tour script to handle.&lt;br /&gt;
&lt;br /&gt;
//Finder Script:&lt;br /&gt;
//Handles notification of the owner of the balloon in case the balloon is lost.&lt;br /&gt;
&lt;br /&gt;
//ILS Navigation: &lt;br /&gt;
//Handles reception of communications from ILS beacons. The owner manually activates the ILS beacon, which then communicates docking or nav info to this script.&lt;br /&gt;
&lt;br /&gt;
//Landmark Script: &lt;br /&gt;
//Handles drag-and-dropped landmarks. Reads the landmark information, then passes it along to the Hot Air Balloon Script  &lt;br /&gt;
&lt;br /&gt;
//Region Script:&lt;br /&gt;
//Used to be a separate script along with another script that read world coordinates of various sims from a notecard.  Very slow, and required updating.&lt;br /&gt;
//Now, this script simply provides world coordinates from the llRequestSimulatorData function.  &lt;br /&gt;
&lt;br /&gt;
//Settings Script:&lt;br /&gt;
//Reads from the settings notecard and informs various scripts of their default settings.&lt;br /&gt;
&lt;br /&gt;
//Voice Control:&lt;br /&gt;
//Provides centralized listen event to distribute voice commands to all of the scripts in the balloon.&lt;br /&gt;
&lt;br /&gt;
//Air Bag Script (found in the invisible air bags and the bain air bag at the top):&lt;br /&gt;
//This script receives buoyancy values from the Hot Air Balloon script, and help make the balloon float and sink&lt;br /&gt;
 &lt;br /&gt;
//Display Script (found in the overhead display prim, invisible prim but visible text):&lt;br /&gt;
//Handles the display and timed request of information from the Hot Air Balloon Script.  When not receiving text to display, it automatically triggers the Hot Air Balloon script to send distance, destination, and altitude info back to this script.&lt;br /&gt;
&lt;br /&gt;
//MasterFlameScript&lt;br /&gt;
//Receives Flame 911 info, and controls all other flames and sound.&lt;br /&gt;
&lt;br /&gt;
//FlameScript&lt;br /&gt;
//Works in conjunction with the MasterFlameScript to show coordinated flames.&lt;br /&gt;
&lt;br /&gt;
//==================================&lt;br /&gt;
//Constants Used with Link Messages&lt;br /&gt;
//==================================&lt;br /&gt;
//100   : Request Region World Coordinates&lt;br /&gt;
//102   : &amp;gt;&amp;gt;&amp;gt;Deprecated&amp;lt;&amp;lt;&amp;lt;&lt;br /&gt;
//110   : Request Landmark Information for a particular Tour Stop #.  &lt;br /&gt;
//200   : Receive Region World Coordinates sent by the 100 command&lt;br /&gt;
//203   : &amp;gt;&amp;gt;&amp;gt;Deprecated&amp;lt;&amp;lt;&amp;lt;&lt;br /&gt;
//210   : Send Landmark Information to the Hot Air Balloon.&lt;br /&gt;
//211   : Send number of destinations in the loaded tour to the Automated Tour Script.&lt;br /&gt;
//237   : Broadcast current TravelForce, ArriveForce, DefaultZ settings from Settings Script.&lt;br /&gt;
//238   : Broadcast current Upforce, DownForce, Precision settings from Settings Script.&lt;br /&gt;
//240   : Send &amp;quot;API&amp;quot; command to all script.  Same as a voice command.&lt;br /&gt;
//411   : Text to display on the overhead display&lt;br /&gt;
//412   : Broadcast current Display Rate setting from Settings Script.&lt;br /&gt;
//482   : Broadcast current ChatChannel setting from Settings Script.&lt;br /&gt;
//487   : Send tour notecard name to the Destination Script.  Triggers automatic loading of that card as well.&lt;br /&gt;
//501   : Air Bag Buoyancy Information.&lt;br /&gt;
//555   : Send the current &amp;quot;Distance to Destination&amp;quot; to the Automated Tour script&lt;br /&gt;
//850   : Instructs Hot Air Balloon to send &amp;quot;Destination Name&amp;quot; info to the overhead display.&lt;br /&gt;
//851   : Instructs Hot Air Balloon to send &amp;quot;Distance to Destination&amp;quot; info to the overhead display.&lt;br /&gt;
//852   : Instructs Hot Air Balloon to send &amp;quot;Altitude&amp;quot; info to the overhead display.&lt;br /&gt;
//911   : Flame control&lt;br /&gt;
//999   : Broadcast reset to all scripts&lt;br /&gt;
//2658  : Manual Mode.  Informs the Automated Tour that we are currently in manual mode, and not following a tour notecard.&lt;br /&gt;
//95562 : Voice Command string broadcast by Voice Control Script. Each script processes their own particular commands.&lt;br /&gt;
&lt;br /&gt;
vector  LPos;&lt;br /&gt;
vector  RPos;&lt;br /&gt;
vector  hovL;&lt;br /&gt;
vector  hovR;&lt;br /&gt;
string  dest;&lt;br /&gt;
string  region;&lt;br /&gt;
vector  destV;   //dock, undock, distance&lt;br /&gt;
integer hovering;&lt;br /&gt;
vector  forces;  //Upforce, DownForce, Precision&lt;br /&gt;
vector  defs;    //TravelForce, ArriveForce, DefaultZ&lt;br /&gt;
float   comp = 0;&lt;br /&gt;
float   mass;&lt;br /&gt;
vector  pos;&lt;br /&gt;
integer broadcastCounter;&lt;br /&gt;
float   currentFalseAlt;&lt;br /&gt;
&lt;br /&gt;
string cap(string v)&lt;br /&gt;
{&lt;br /&gt;
    v = llToUpper(llGetSubString(v, 0, 0)) + llGetSubString(v, 1, llStringLength(v) - 1);&lt;br /&gt;
    return v;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
disp(string message)&lt;br /&gt;
{&lt;br /&gt;
    llMessageLinked(LINK_ALL_CHILDREN, 411, message, NULL_KEY);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
vector totarget(float gx, float gy, float lx, float ly)&lt;br /&gt;
{ &lt;br /&gt;
    vector target;&lt;br /&gt;
    vector dir;&lt;br /&gt;
    vector corner = llGetRegionCorner();&lt;br /&gt;
    &lt;br /&gt;
    pos.x = pos.x + corner.x;&lt;br /&gt;
    pos.y = pos.y + corner.y; &lt;br /&gt;
    &lt;br /&gt;
    target.x = gx + lx; &lt;br /&gt;
    target.y = gy + ly;&lt;br /&gt;
    target.z = pos.z; &lt;br /&gt;
    &lt;br /&gt;
    dir = target - pos;&lt;br /&gt;
    destV.z = llVecMag(dir);&lt;br /&gt;
     &lt;br /&gt;
    dir = llVecNorm(dir);   &lt;br /&gt;
    return dir;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
turn(integer dock, float tau)&lt;br /&gt;
{&lt;br /&gt;
    return;&lt;br /&gt;
    vector vel;&lt;br /&gt;
&lt;br /&gt;
    if(dock)&lt;br /&gt;
    {&lt;br /&gt;
        vel = &amp;lt;-0.00163, -0.00020, -1.00000&amp;gt;;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        vel = llVecNorm(llGetVel());&lt;br /&gt;
    }&lt;br /&gt;
    vel.z = 0.0;&lt;br /&gt;
    vector fwd = llRot2Up(llGetRot());&lt;br /&gt;
    vector imp = fwd % vel;&lt;br /&gt;
    imp = (1/tau) * imp;&lt;br /&gt;
    vector omega = llGetOmega();&lt;br /&gt;
    imp = (mass * (imp - omega));&lt;br /&gt;
    llApplyRotationalImpulse(imp, FALSE);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
push(vector direction, float speed) &lt;br /&gt;
{&lt;br /&gt;
    vector ivel = llGetVel();&lt;br /&gt;
    vector fvel = direction * speed;&lt;br /&gt;
    vector imp = (mass * (fvel - ivel))/10; &lt;br /&gt;
    &lt;br /&gt;
    llApplyImpulse(imp, FALSE);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
alt(float tarz)&lt;br /&gt;
{&lt;br /&gt;
    float setFloatHeight;&lt;br /&gt;
    //float  zdiff = llFabs(pos.z - tarz);&lt;br /&gt;
    //&lt;br /&gt;
    //if (zdiff &amp;gt; 15)&lt;br /&gt;
    //{&lt;br /&gt;
    //    comp = 0.1 * ((zdiff - 15)/75);&lt;br /&gt;
    //    llOwnerSay(&amp;quot;Compensation is now: &amp;quot; + (string)comp);&lt;br /&gt;
    //}&lt;br /&gt;
    //else&lt;br /&gt;
    //{&lt;br /&gt;
    //    comp = 0;&lt;br /&gt;
    //}&lt;br /&gt;
    if(pos.z &amp;lt; tarz)&lt;br /&gt;
    {&lt;br /&gt;
        //llMessageLinked(LINK_ALL_CHILDREN, 501, (string)(forces.x + comp), &amp;quot;&amp;quot;);            &lt;br /&gt;
        //llMessageLinked(LINK_ALL_CHILDREN, 501, (string)(forces.x), &amp;quot;&amp;quot;);            &lt;br /&gt;
        llMessageLinked(LINK_ALL_CHILDREN, 911, (string)TRUE, NULL_KEY);&lt;br /&gt;
        if (currentFalseAlt &amp;lt; tarz - 50) currentFalseAlt = tarz - 50 - forces.x;&lt;br /&gt;
        currentFalseAlt += forces.x;&lt;br /&gt;
        if (currentFalseAlt &amp;gt; tarz + 10) currentFalseAlt = tarz + 10;&lt;br /&gt;
        //llOwnerSay(&amp;quot;Decrementing currentFalseAlt by &amp;quot; + (string)forces.x);&lt;br /&gt;
        //llSetBuoyancy(forces.x);&lt;br /&gt;
        //llOwnerSay(&amp;quot;Buoyance Set to = &amp;quot; + (string)forces.x);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        //llMessageLinked(LINK_ALL_CHILDREN, 501, (string)(forces.y - comp), &amp;quot;&amp;quot;);            &lt;br /&gt;
        //llMessageLinked(LINK_ALL_CHILDREN, 501, (string)(forces.y), &amp;quot;&amp;quot;);            &lt;br /&gt;
        llMessageLinked(LINK_ALL_CHILDREN, 911, (string)FALSE, NULL_KEY);&lt;br /&gt;
        if (currentFalseAlt &amp;gt; tarz + 50) currentFalseAlt = tarz + 50 + forces.y;&lt;br /&gt;
        currentFalseAlt -= forces.y;&lt;br /&gt;
        if (currentFalseAlt &amp;lt; tarz - 10) currentFalseAlt = tarz - 10;&lt;br /&gt;
        //llOwnerSay(&amp;quot;Decrementing currentFalseAlt by &amp;quot; + (string)forces.y);&lt;br /&gt;
        //llSetBuoyancy(forces.y);&lt;br /&gt;
        //llOwnerSay(&amp;quot;Buoyance Set to = &amp;quot; + (string)forces.y);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    setFloatHeight = currentFalseAlt - llGround( &amp;lt;0.0, 0.0, 0.0&amp;gt; );&lt;br /&gt;
    if (pos.z &amp;lt; tarz)&lt;br /&gt;
    {&lt;br /&gt;
        if (setFloatHeight &amp;gt; 100) setFloatHeight = -100;&lt;br /&gt;
    }&lt;br /&gt;
    //if (setFloatHeight &amp;gt; 100) setFloatHeight = -(2147483648 - setFloatHeight);&lt;br /&gt;
    llSetVehicleFloatParam( VEHICLE_HOVER_HEIGHT, setFloatHeight);&lt;br /&gt;
    //llOwnerSay((string)setFloatHeight);&lt;br /&gt;
    //llSetVehicleFloatParam( VEHICLE_HOVER_HEIGHT, currentFalseAlt);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
vect(integer hovering)&lt;br /&gt;
{&lt;br /&gt;
    //Update Global Info&lt;br /&gt;
    //mass = llGetMass();&lt;br /&gt;
    pos = llGetPos();&lt;br /&gt;
    &lt;br /&gt;
    //The &amp;quot;engine&amp;quot; of the balloon...&lt;br /&gt;
    vector dir = totarget(RPos.x, RPos.y, LPos.x, LPos.y); &lt;br /&gt;
    if(destV.z &amp;gt; 15)&lt;br /&gt;
    {&lt;br /&gt;
        push(dir, defs.x);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        push(dir, defs.y);&lt;br /&gt;
    }&lt;br /&gt;
    turn(0, 3.0);&lt;br /&gt;
    alt(LPos.z);&lt;br /&gt;
    broadcastCounter++;&lt;br /&gt;
    if (broadcastCounter == 10)&lt;br /&gt;
    {&lt;br /&gt;
        if (!hovering){llMessageLinked(llGetLinkNumber(), 555, (string)destV.z, NULL_KEY);};&lt;br /&gt;
        broadcastCounter = 0;&lt;br /&gt;
    }&lt;br /&gt;
    //currentFalseAlt -= 0.01;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
checkC(string m, key id)&lt;br /&gt;
{&lt;br /&gt;
    m = llToLower(m);&lt;br /&gt;
    if (m == &amp;quot;reset scripts&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        disp(&amp;quot;Resetting Scripts...&amp;quot;);&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    }   &lt;br /&gt;
    if (m == &amp;quot;startup&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        state startup;&lt;br /&gt;
    }   &lt;br /&gt;
    if (m == &amp;quot;shutdown&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        state shutdown;&lt;br /&gt;
    }   &lt;br /&gt;
    if (m == &amp;quot;hover&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        state hover;&lt;br /&gt;
    }   &lt;br /&gt;
    if ((m == &amp;quot;resume&amp;quot;) &amp;amp;&amp;amp; (hovering)) &lt;br /&gt;
    {&lt;br /&gt;
        LPos = hovL;&lt;br /&gt;
        RPos = hovR;&lt;br /&gt;
        state travel;&lt;br /&gt;
    }  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
checkTC(string msg, key id)&lt;br /&gt;
{&lt;br /&gt;
    float checkN;&lt;br /&gt;
    integer listLength;&lt;br /&gt;
    msg = llToLower(msg);&lt;br /&gt;
    if (llSubStringIndex(msg, &amp;quot;landmark &amp;quot;) == 0) &lt;br /&gt;
    {&lt;br /&gt;
        llMessageLinked(LINK_SET, 2658, &amp;quot;&amp;quot;, NULL_KEY);//Manual Mode&lt;br /&gt;
        &lt;br /&gt;
        list tempList = llCSV2List(llGetSubString(msg,9,llStringLength(msg)));&lt;br /&gt;
        listLength = llGetListLength(tempList);&lt;br /&gt;
        region = llList2String(tempList, 0);&lt;br /&gt;
        dest   = &amp;quot;Manual Landmark&amp;quot;;&lt;br /&gt;
        if (listLength &amp;gt;= 1)&lt;br /&gt;
        {&lt;br /&gt;
            if (defs.z &amp;gt;= 1)&lt;br /&gt;
            {&lt;br /&gt;
                LPos = &amp;lt;128,128,defs.z&amp;gt;;&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                LPos = &amp;lt;128,128,LPos.z&amp;gt;;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        if (listLength == 4)&lt;br /&gt;
        {&lt;br /&gt;
            LPos.z = llList2Float(tempList, 3);&lt;br /&gt;
        }&lt;br /&gt;
        if ((listLength == 4) || (listLength == 3))&lt;br /&gt;
        {&lt;br /&gt;
            LPos.x = llList2Float(tempList, 1);&lt;br /&gt;
            LPos.y = llList2Float(tempList, 2);&lt;br /&gt;
        }&lt;br /&gt;
        llMessageLinked(LINK_SET, 100, region, NULL_KEY);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    if (llSubStringIndex(msg, &amp;quot;altitude &amp;quot;) == 0)&lt;br /&gt;
    {&lt;br /&gt;
        checkN = (float)llGetSubString(msg,9,18);&lt;br /&gt;
        if (checkN &amp;gt; 0.001)&lt;br /&gt;
        {&lt;br /&gt;
            LPos.z = checkN;&lt;br /&gt;
            disp(&amp;quot;Altitude Set to &amp;quot; + (string)((integer)LPos.z) + &amp;quot; meters&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    if (llSubStringIndex(msg, &amp;quot;bump &amp;quot;) == 0)&lt;br /&gt;
    {&lt;br /&gt;
        checkN = (float)llGetSubString(msg,5,18);&lt;br /&gt;
        LPos.z += checkN;&lt;br /&gt;
        disp(&amp;quot;Altitude bumped by &amp;quot; + (string)((integer)checkN) + &amp;quot; meters to &amp;quot; + (string)((integer)LPos.z) + &amp;quot; meters&amp;quot;);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    if (msg == &amp;quot;dock&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        LPos.z = destV.x;&lt;br /&gt;
        disp(&amp;quot;Docking at &amp;quot; + (string)((integer)LPos.z) +  &amp;quot; meters&amp;quot;);&lt;br /&gt;
        return;&lt;br /&gt;
    }   &lt;br /&gt;
    if (msg == &amp;quot;undock&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        LPos.z = destV.y;&lt;br /&gt;
        disp(&amp;quot;Heading for &amp;quot; + (string)((integer)LPos.z) +  &amp;quot; meters&amp;quot;);&lt;br /&gt;
        return;&lt;br /&gt;
    }   &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
checkM(integer n, string m, key id)&lt;br /&gt;
{&lt;br /&gt;
    vector position = llGetPos();&lt;br /&gt;
    list   L;&lt;br /&gt;
&lt;br /&gt;
    //Destination Name = 850&lt;br /&gt;
    if ((n == 850) &amp;amp;&amp;amp; (dest != &amp;quot;None&amp;quot;))&lt;br /&gt;
    {&lt;br /&gt;
        disp(&amp;quot;Destination: &amp;quot; + cap(dest) + &amp;quot;, &amp;quot; + cap(region) + &amp;quot;(&amp;quot; + (string)((integer)LPos.x) + &amp;quot;,&amp;quot; + (string)((integer)LPos.y)  + &amp;quot;)&amp;quot;);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //Distance To Destination = 851&lt;br /&gt;
    if ((n == 851) &amp;amp;&amp;amp; (dest != &amp;quot;None&amp;quot;))&lt;br /&gt;
    {&lt;br /&gt;
        disp(&amp;quot;Distance To Destination: &amp;quot; + (string)((integer)destV.z) + &amp;quot; meters&amp;quot;);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    //Altitude = 852&lt;br /&gt;
    if (n == 852)&lt;br /&gt;
    {&lt;br /&gt;
        disp(&amp;quot;Altitude: &amp;quot; + (string)((integer)position.z) + &amp;quot; meters&amp;quot;);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    //Process Return of Landmark Info Retrieval&lt;br /&gt;
    if (n == 210)&lt;br /&gt;
    {&lt;br /&gt;
        L = llCSV2List(m);&lt;br /&gt;
        &lt;br /&gt;
        dest    = llList2String(L, 0);&lt;br /&gt;
        region  = llList2String(L, 1);&lt;br /&gt;
        LPos.x  = llList2Float (L, 2);&lt;br /&gt;
        LPos.y  = llList2Float (L, 3);&lt;br /&gt;
        destV.x = llList2Float (L, 4);&lt;br /&gt;
        destV.y = llList2Float (L, 5);&lt;br /&gt;
        LPos.z  = destV.y;&lt;br /&gt;
                &lt;br /&gt;
        if (region != &amp;quot;&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_SET, 100, region, NULL_KEY);&lt;br /&gt;
        }&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    //Process API Commands&lt;br /&gt;
    if (n == 240)&lt;br /&gt;
    {&lt;br /&gt;
        checkC(m, id);&lt;br /&gt;
        checkTC(m, id);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    //Process API Forces Commands&lt;br /&gt;
    if (n == 238)&lt;br /&gt;
    {&lt;br /&gt;
        forces = (vector)m;&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    //Process API Other Commands&lt;br /&gt;
    if (n == 237)&lt;br /&gt;
    {&lt;br /&gt;
        defs = (vector)m;&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //Process Return of Region Vector Determination&lt;br /&gt;
    if (n == 200)&lt;br /&gt;
    {&lt;br /&gt;
        RPos = (vector)m;&lt;br /&gt;
        state travel;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
reset()&lt;br /&gt;
{&lt;br /&gt;
    integer scriptCount = llGetInventoryNumber(INVENTORY_SCRIPT);&lt;br /&gt;
    integer x;&lt;br /&gt;
    string  scriptName;&lt;br /&gt;
    &lt;br /&gt;
    for (x=0; x &amp;lt; scriptCount ; x++)&lt;br /&gt;
    {&lt;br /&gt;
        scriptName = llGetInventoryName(INVENTORY_SCRIPT, x);&lt;br /&gt;
        if (scriptName != llGetScriptName())&lt;br /&gt;
        {&lt;br /&gt;
            llResetOtherScript(scriptName);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    llOwnerSay(&amp;quot;To use the Touring Hot Air Balloon, simply sit on the balloon and say \&amp;quot;help\&amp;quot;.&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
init()&lt;br /&gt;
{&lt;br /&gt;
    dest  = &amp;quot;None&amp;quot;;&lt;br /&gt;
    llMessageLinked(LINK_SET, 102, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
    llSetStatus(STATUS_PHYSICS, FALSE);&lt;br /&gt;
    llSetStatus(STATUS_PHANTOM, FALSE);&lt;br /&gt;
    llMessageLinked(LINK_ALL_CHILDREN, 911, (string)FALSE, NULL_KEY); //Turn off Flames&lt;br /&gt;
    llSetVehicleType(VEHICLE_TYPE_BALLOON);&lt;br /&gt;
    //llSetVehicleFlags(VEHICLE_FLAG_HOVER_GLOBAL_HEIGHT);&lt;br /&gt;
    llSetVehicleFlags(VEHICLE_FLAG_HOVER_TERRAIN_ONLY);&lt;br /&gt;
    //llSetVehicleFloatParam(VEHICLE_VERTICAL_ATTRACTION_TIMESCALE, 1.0);&lt;br /&gt;
    //llSetVehicleFloatParam(VEHICLE_VERTICAL_ATTRACTION_TIMESCALE, 3.0);&lt;br /&gt;
    //llSetVehicleFloatParam(VEHICLE_VERTICAL_ATTRACTION_EFFICIENCY, 0.8);&lt;br /&gt;
&lt;br /&gt;
    //llSetVehicleFloatParam(VEHICLE_HOVER_TIMESCALE, 1.0);&lt;br /&gt;
    //llSetVehicleFloatParam(VEHICLE_HOVER_TIMESCALE, 3.0);&lt;br /&gt;
    //llSetVehicleFloatParam(VEHICLE_HOVER_EFFICIENCY, 0.8);&lt;br /&gt;
}&lt;br /&gt;
//STATES&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        reset();&lt;br /&gt;
        init();&lt;br /&gt;
    }&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;
    link_message(integer sn, integer n, string m, key id)&lt;br /&gt;
    {&lt;br /&gt;
        //Process Listen Commands&lt;br /&gt;
        if (n == 95562)&lt;br /&gt;
        {&lt;br /&gt;
            checkC(m, id);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        checkM(n, m, id);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
state startup&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        vector cpos = llGetPos();&lt;br /&gt;
        &lt;br /&gt;
        disp(&amp;quot;Starting up...&amp;quot;);&lt;br /&gt;
        dest = &amp;quot;None&amp;quot;;&lt;br /&gt;
        llSetBuoyancy(1.0);&lt;br /&gt;
        llSetStatus(STATUS_ROTATE_X | STATUS_ROTATE_Y, FALSE);&lt;br /&gt;
        llSetStatus(STATUS_ROTATE_Z | STATUS_PHYSICS | STATUS_BLOCK_GRAB, TRUE);&lt;br /&gt;
        llSetStatus(STATUS_PHYSICS, TRUE);&lt;br /&gt;
        //llMessageLinked(LINK_ALL_CHILDREN, 501, (string)forces.y, &amp;quot;&amp;quot;);&lt;br /&gt;
            mass = llGetMass();&lt;br /&gt;
        state hover;&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;
state shutdown&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        disp(&amp;quot;Shutting Down...&amp;quot;);&lt;br /&gt;
        llMessageLinked(LINK_ALL_CHILDREN, 911, (string)FALSE, NULL_KEY); &lt;br /&gt;
        llSetStatus(STATUS_PHYSICS, FALSE);&lt;br /&gt;
        llSetTimerEvent(1);&lt;br /&gt;
    }&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;
    link_message(integer sender_num, integer n, string m, key id)&lt;br /&gt;
    {&lt;br /&gt;
        //Process Listen Commands&lt;br /&gt;
        if (n == 95562)&lt;br /&gt;
        {&lt;br /&gt;
            checkC(m, id);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        checkM(n, m, id);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        if (llGetStatus(STATUS_PHYSICS))&lt;br /&gt;
        {&lt;br /&gt;
            llSetStatus(STATUS_PHYSICS, FALSE);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            llSetTimerEvent(0);        &lt;br /&gt;
            disp(&amp;quot;Successfully Shut Down&amp;quot;);  &lt;br /&gt;
        };&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
state hover&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {            &lt;br /&gt;
        hovering = TRUE;&lt;br /&gt;
        hovL     = LPos;&lt;br /&gt;
        hovR     = RPos;&lt;br /&gt;
        LPos     = llGetPos();&lt;br /&gt;
        RPos     = llGetRegionCorner();&lt;br /&gt;
        disp(&amp;quot;Hovering at &amp;quot; + (string)((integer)LPos.z) + &amp;quot; meters&amp;quot;); &lt;br /&gt;
        currentFalseAlt = LPos.z;&lt;br /&gt;
        llSetTimerEvent(forces.z);&lt;br /&gt;
    }&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;
    link_message(integer sn, integer n, string m, key id)&lt;br /&gt;
    {&lt;br /&gt;
        //Process Listen Commands&lt;br /&gt;
        if (n == 95562)&lt;br /&gt;
        {&lt;br /&gt;
            checkTC(m, id);&lt;br /&gt;
            checkC(m, id);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        checkM(n, m, id);  &lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        vect(TRUE);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    state_exit()&lt;br /&gt;
    {&lt;br /&gt;
        hovering = FALSE;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
state travel&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        disp(&amp;quot;Heading for &amp;quot; + (string)((integer)LPos.z) + &amp;quot; meters&amp;quot;);&lt;br /&gt;
        llSetTimerEvent(forces.z);&lt;br /&gt;
    }&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;
    link_message(integer sender_number, integer number, string message, key id)&lt;br /&gt;
    {&lt;br /&gt;
        //Process Listen Commands&lt;br /&gt;
        if (number == 95562)&lt;br /&gt;
        {&lt;br /&gt;
            checkTC(message, id);&lt;br /&gt;
            checkC(message, id);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        checkM(number, message, id);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        vect(FALSE);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== MegaPrim/LargeMass Vehicles ==&lt;br /&gt;
&lt;br /&gt;
I&#039;ve found that large mass vehicles pose a problem as llApplyImpulse uses [[energy]] faster than most megaprims, even those of smaller dimensions such as &amp;lt;11,11,.5&amp;gt;, can replenish. I&#039;ve had success changing the following code.&lt;br /&gt;
&lt;br /&gt;
Change the push function in the ATB Engine from:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
push(vector direction, float speed) &lt;br /&gt;
{&lt;br /&gt;
    vector ivel = llGetVel();&lt;br /&gt;
    vector fvel = direction * speed;&lt;br /&gt;
    vector imp = (mass * (fvel - ivel))/10; &lt;br /&gt;
 &lt;br /&gt;
    llApplyImpulse(imp, FALSE);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
To the following code which applies a constant force:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
push(vector direction, float speed) &lt;br /&gt;
{&lt;br /&gt;
    vector ivel = llGetVel();&lt;br /&gt;
    vector fvel = direction * speed;&lt;br /&gt;
    vector imp = (mass * (fvel - ivel))/10; &lt;br /&gt;
 &lt;br /&gt;
    llSetForce(imp, FALSE);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
- Cydkne Chronowire&lt;br /&gt;
&lt;br /&gt;
== Automated Tour ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;//Automated Tour&lt;br /&gt;
//by Hank Ramos&lt;br /&gt;
//June 22, 2004&lt;br /&gt;
&lt;br /&gt;
integer ListenAPI = 95562;&lt;br /&gt;
string  destName = &amp;quot;None&amp;quot;;&lt;br /&gt;
string  region; //regionName&lt;br /&gt;
integer stop;&lt;br /&gt;
integer dests; //destionationsCount&lt;br /&gt;
integer regions;&lt;br /&gt;
integer wp = FALSE; //waypoint&lt;br /&gt;
integer pa; //pause&lt;br /&gt;
integer ar = TRUE; //arrived&lt;br /&gt;
vector  localP; //localPosition&lt;br /&gt;
float   distance;&lt;br /&gt;
integer distRecv; //distanceReceived&lt;br /&gt;
float   time;&lt;br /&gt;
&lt;br /&gt;
disp(string m)&lt;br /&gt;
{&lt;br /&gt;
    llMessageLinked(LINK_SET, 411, m, NULL_KEY);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string cap(string v)&lt;br /&gt;
{&lt;br /&gt;
    v = llToUpper(llGetSubString(v, 0, 0)) + llGetSubString(v, 1, llStringLength(v) - 1);&lt;br /&gt;
    return v;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
next()&lt;br /&gt;
{&lt;br /&gt;
    if (stop &amp;gt; 0)&lt;br /&gt;
    {&lt;br /&gt;
        disp(&amp;quot;Continuing to Next Stop.&amp;quot;);&lt;br /&gt;
        if(stop &amp;lt; dests)  &lt;br /&gt;
        {&lt;br /&gt;
            stop += 1;&lt;br /&gt;
        }&lt;br /&gt;
        else &lt;br /&gt;
        {&lt;br /&gt;
            stop = 1;&lt;br /&gt;
        }&lt;br /&gt;
        llMessageLinked(LINK_SET, 110, (string)((integer)stop), NULL_KEY); //Process Landmark&lt;br /&gt;
        state idle;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
checkTC(string m, key id)&lt;br /&gt;
{&lt;br /&gt;
    integer newStop;&lt;br /&gt;
    &lt;br /&gt;
    m = llToLower(m);&lt;br /&gt;
    if (llSubStringIndex(m, &amp;quot;goto &amp;quot;) == 0)&lt;br /&gt;
    {&lt;br /&gt;
        newStop = (integer)llGetSubString(m, 5,8);&lt;br /&gt;
        if ((newStop &amp;lt;= dests) &amp;amp;&amp;amp; (newStop &amp;gt; 0)) &lt;br /&gt;
        { &lt;br /&gt;
            stop = newStop;&lt;br /&gt;
            llMessageLinked(LINK_SET, 110, (string)((integer)stop), NULL_KEY); //Process Landmark&lt;br /&gt;
            state idle;&lt;br /&gt;
        }&lt;br /&gt;
        else &lt;br /&gt;
        {&lt;br /&gt;
            disp(&amp;quot;Stop #&amp;quot; +  (string)newStop + &amp;quot; is Invalid.&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    if (llSubStringIndex(m, &amp;quot;timeout &amp;quot;) == 0)&lt;br /&gt;
    {&lt;br /&gt;
        pa = (integer)llGetSubString(m, 8,12);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    if (llSubStringIndex(m, &amp;quot;extend &amp;quot;) == 0)&lt;br /&gt;
    {&lt;br /&gt;
        pa += (integer)llGetSubString(m, 7,12);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    if (m == &amp;quot;next&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        next();&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    if (m == &amp;quot;shutdown&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        stop = 0;&lt;br /&gt;
        state idle;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
checkM(integer n, string m, key id)&lt;br /&gt;
{&lt;br /&gt;
    if (n == 210)&lt;br /&gt;
    {&lt;br /&gt;
        string tempS;&lt;br /&gt;
        list L = llCSV2List(m);&lt;br /&gt;
        &lt;br /&gt;
        destName = llList2String (L, 0);&lt;br /&gt;
        region   = llList2String (L, 1);&lt;br /&gt;
        localP.x = llList2Float  (L, 2);&lt;br /&gt;
        localP.y = llList2Float  (L, 3);&lt;br /&gt;
        wp       = llList2Integer(L, 6); //Waypont&lt;br /&gt;
        pa       = llList2Integer(L, 7); //Pause&lt;br /&gt;
        &lt;br /&gt;
        //llMessageLinked(LINK_SET, 100, regionName, NULL_KEY); //This is done in the balloon script&lt;br /&gt;
        if (stop &amp;gt; 0)&lt;br /&gt;
        {&lt;br /&gt;
            tempS =&amp;quot;Destination set to Landmark #&amp;quot; + (string)stop + &amp;quot;, &amp;quot;; &lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            tempS =&amp;quot;Destination set to &amp;quot;; &lt;br /&gt;
        }&lt;br /&gt;
        disp(tempS + destName + &amp;quot;, &amp;quot; + region +  \&lt;br /&gt;
                     &amp;quot;(&amp;quot; + (string)((integer)localP.x) + &amp;quot;,&amp;quot; + (string)((integer)localP.y) + &amp;quot;).&amp;quot;);&lt;br /&gt;
        state enroute;&lt;br /&gt;
    } &lt;br /&gt;
    if (n == 555)&lt;br /&gt;
    {&lt;br /&gt;
        distance = (float)m;&lt;br /&gt;
        distRecv = TRUE;&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    if (n == 211)&lt;br /&gt;
    {&lt;br /&gt;
        dests = (integer)m;&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    if (n == 2658)&lt;br /&gt;
    {&lt;br /&gt;
        stop = 0;&lt;br /&gt;
        wp = FALSE;&lt;br /&gt;
        pa = 0;&lt;br /&gt;
        if (m == &amp;quot;reset&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            state loading;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            state idle;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//STATES&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        disp(&amp;quot;Initializing Automated Tour...&amp;quot;);&lt;br /&gt;
        state loading;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
state loading&lt;br /&gt;
{&lt;br /&gt;
    link_message(integer sn, integer n, string m, key id)&lt;br /&gt;
    {&lt;br /&gt;
        if (n == 95562)&lt;br /&gt;
        {&lt;br /&gt;
            checkTC(m, id);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if (n == 211)&lt;br /&gt;
        {&lt;br /&gt;
            dests = (integer)m;&lt;br /&gt;
            state idle;&lt;br /&gt;
        }&lt;br /&gt;
        checkM(n, m, id);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
state enroute&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {            &lt;br /&gt;
        distRecv = FALSE;&lt;br /&gt;
        distance = 999999999;&lt;br /&gt;
        disp(&amp;quot;Enroute to Destination...&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    on_rez(integer sp)&lt;br /&gt;
    {&lt;br /&gt;
        state idle;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    link_message(integer sn, integer n, string m, key id)&lt;br /&gt;
    {&lt;br /&gt;
        if (n == 95562)&lt;br /&gt;
        {&lt;br /&gt;
            checkTC(m, id);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        checkM(n, m, id);  &lt;br /&gt;
        if (distRecv)&lt;br /&gt;
        {&lt;br /&gt;
            if (distance &amp;lt; 20)&lt;br /&gt;
            {&lt;br /&gt;
                state arrive;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
state arrive&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {            &lt;br /&gt;
        string tempS;&lt;br /&gt;
        &lt;br /&gt;
        if (stop &amp;gt; 0)&lt;br /&gt;
        {&lt;br /&gt;
            tempS = &amp;quot;Arrived at Landmark #&amp;quot; + (string)stop+ &amp;quot;, &amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            tempS = &amp;quot;Arrived at &amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        disp(tempS + destName + &amp;quot;, &amp;quot; + cap(region) +  \&lt;br /&gt;
                       &amp;quot;(&amp;quot; + (string)((integer)localP.x) + &amp;quot;,&amp;quot; + (string)((integer)localP.y) + &amp;quot;).&amp;quot;);&lt;br /&gt;
        if (pa &amp;gt; 0)&lt;br /&gt;
        {&lt;br /&gt;
            llGetAndResetTime();&lt;br /&gt;
            llSetTimerEvent(5);&lt;br /&gt;
        }&lt;br /&gt;
        if (wp)         &lt;br /&gt;
        {&lt;br /&gt;
            next();&lt;br /&gt;
        }   &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    on_rez(integer sp)&lt;br /&gt;
    {&lt;br /&gt;
        state idle;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    link_message(integer sn, integer n, string m, key id)&lt;br /&gt;
    {&lt;br /&gt;
        if (n == 95562)&lt;br /&gt;
        {&lt;br /&gt;
            checkTC(m, id);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        checkM(n, m, id);  &lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        time = llGetTime();&lt;br /&gt;
        float calcTime = pa - time;&lt;br /&gt;
             &lt;br /&gt;
        if (pa &amp;gt; 0)&lt;br /&gt;
        {&lt;br /&gt;
            if (calcTime &amp;lt;= 0)       &lt;br /&gt;
            {&lt;br /&gt;
                next();&lt;br /&gt;
            }&lt;br /&gt;
            else if ((calcTime &amp;gt; 1) &amp;amp;&amp;amp; (calcTime &amp;lt; 60))&lt;br /&gt;
            {&lt;br /&gt;
                disp(&amp;quot;Leaving in &amp;quot; + (string)((integer)calcTime)  + &amp;quot; seconds.&amp;quot;);&lt;br /&gt;
            }                           &lt;br /&gt;
            else if ((calcTime &amp;gt;= 60)&amp;amp;&amp;amp; (calcTime &amp;lt; 120))&lt;br /&gt;
            {&lt;br /&gt;
                disp(&amp;quot;Leaving in approximately 1 minute.&amp;quot;);&lt;br /&gt;
            }                           &lt;br /&gt;
            else if (calcTime &amp;gt;= 120)&lt;br /&gt;
            {&lt;br /&gt;
                disp(&amp;quot;Leaving in &amp;quot; + (string)((integer)(calcTime / 60))  + &amp;quot; minutes.&amp;quot;);&lt;br /&gt;
            }                           &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
state idle&lt;br /&gt;
{&lt;br /&gt;
    link_message(integer sn, integer n, string m, key id)&lt;br /&gt;
    {&lt;br /&gt;
        if (n == 95562)&lt;br /&gt;
        {&lt;br /&gt;
            checkTC(m, id);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        checkM(n, m, id);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Destinations ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;integer count;&lt;br /&gt;
list    dests;&lt;br /&gt;
string  notecard;&lt;br /&gt;
integer lineCount;&lt;br /&gt;
key     readKey;&lt;br /&gt;
&lt;br /&gt;
displayMessage(string m)&lt;br /&gt;
{&lt;br /&gt;
    llMessageLinked(LINK_SET, 411, m, NULL_KEY);&lt;br /&gt;
}&lt;br /&gt;
loadLandmarks()&lt;br /&gt;
{&lt;br /&gt;
    displayMessage(&amp;quot;Loading &amp;quot; + notecard + &amp;quot;...&amp;quot;);&lt;br /&gt;
    dests = [];&lt;br /&gt;
    count = 0;&lt;br /&gt;
    lineCount = 0;&lt;br /&gt;
    readKey = llGetNotecardLine(notecard, lineCount); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
checkC(string m, key id)&lt;br /&gt;
{&lt;br /&gt;
    integer index;&lt;br /&gt;
    list    landmarkInfo;&lt;br /&gt;
    string  testM;&lt;br /&gt;
&lt;br /&gt;
    testM = llToLower(m);&lt;br /&gt;
&lt;br /&gt;
    if (llSubStringIndex(testM, &amp;quot;destination notecard &amp;quot;) == 0)&lt;br /&gt;
    {&lt;br /&gt;
        notecard =llGetSubString(m, 21, 100);&lt;br /&gt;
        displayMessage(&amp;quot;Destination Notecard Changed To: &amp;quot; + notecard + &amp;quot;.&amp;quot;);&lt;br /&gt;
        llMessageLinked(LINK_SET, 2658, &amp;quot;reset&amp;quot;, NULL_KEY);&lt;br /&gt;
        loadLandmarks();&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    if (llSubStringIndex(testM, &amp;quot;notecard &amp;quot;) == 0)&lt;br /&gt;
    {&lt;br /&gt;
        notecard =llGetSubString(m, 9, 100);&lt;br /&gt;
        displayMessage(&amp;quot;Destination Notecard Changed To: &amp;quot; + notecard + &amp;quot;.&amp;quot;);&lt;br /&gt;
        llMessageLinked(LINK_SET, 2658, m, NULL_KEY);&lt;br /&gt;
        loadLandmarks();&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    if ((testM == &amp;quot;reset destinations&amp;quot;) || (testM == &amp;quot;reset notecards&amp;quot;))&lt;br /&gt;
    {&lt;br /&gt;
        loadLandmarks();&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    if (testM == &amp;quot;say destinations&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        //Get Landmark Info&lt;br /&gt;
        for (index = 0;index &amp;lt; count;index += 1)&lt;br /&gt;
        {&lt;br /&gt;
            landmarkInfo = llCSV2List(llList2String(dests, index));&lt;br /&gt;
            &lt;br /&gt;
            llWhisper(0, &amp;quot;Destination #&amp;quot; + (string)(index +1) + &amp;quot;: &amp;quot; + llList2String(landmarkInfo,0));&lt;br /&gt;
        }&lt;br /&gt;
        return;      &lt;br /&gt;
    } &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string getLandmark(integer index)&lt;br /&gt;
{    &lt;br /&gt;
    index -= 1;&lt;br /&gt;
    return llList2String(dests, index);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
    }&lt;br /&gt;
    link_message(integer sn, integer n, string m, key id)&lt;br /&gt;
    {&lt;br /&gt;
        if (n == 95562)&lt;br /&gt;
        {&lt;br /&gt;
            checkC(m, id);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if (n == 487)&lt;br /&gt;
        {&lt;br /&gt;
            notecard = m;&lt;br /&gt;
            loadLandmarks();&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if (n == 110) &lt;br /&gt;
        { &lt;br /&gt;
            //Get Landmark Info&lt;br /&gt;
            llMessageLinked(LINK_SET, 210, getLandmark((integer)m), NULL_KEY);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    dataserver(key requested, string data)&lt;br /&gt;
    {&lt;br /&gt;
        list L;&lt;br /&gt;
        &lt;br /&gt;
        //Process Landmarks&lt;br /&gt;
        if (requested == readKey) &lt;br /&gt;
        {&lt;br /&gt;
            L = llCSV2List(data); &lt;br /&gt;
            if (data != EOF)&lt;br /&gt;
            {&lt;br /&gt;
                if ((llSubStringIndex(data, &amp;quot;#&amp;quot;) != 0) &amp;amp;&amp;amp; (llGetListLength(L) == 8))&lt;br /&gt;
                {&lt;br /&gt;
                    dests += data;&lt;br /&gt;
                    count += 1;&lt;br /&gt;
                }&lt;br /&gt;
                lineCount += 1;&lt;br /&gt;
                readKey = llGetNotecardLine(notecard, lineCount);&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                displayMessage(&amp;quot;There are &amp;quot; + (string)(count) + &amp;quot; destinations loaded.&amp;quot;);&lt;br /&gt;
                llMessageLinked(LINK_SET, 211, (string)count, NULL_KEY);&lt;br /&gt;
            }&lt;br /&gt;
        }    &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Finder ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;//Finder Script&lt;br /&gt;
//By Hank Ramos&lt;br /&gt;
//Portions originally by Eggy Lippmann&lt;br /&gt;
//===========================&lt;br /&gt;
//Configurable Options...&lt;br /&gt;
float sensorInterval = 1800; //Seconds between scans&lt;br /&gt;
float sensorDistance = 30.0; //Max distance owner can be from object, Max is 96 meters&lt;br /&gt;
//===========================&lt;br /&gt;
string  OwnerName;&lt;br /&gt;
integer dispOnce;&lt;br /&gt;
integer gotName;&lt;br /&gt;
&lt;br /&gt;
disp(string message)&lt;br /&gt;
{&lt;br /&gt;
    llMessageLinked(LINK_ALL_CHILDREN, 411, message, NULL_KEY);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
initialize()&lt;br /&gt;
{&lt;br /&gt;
    dispOnce = FALSE;&lt;br /&gt;
    gotName  = FALSE;&lt;br /&gt;
    llSensorRepeat(&amp;quot;&amp;quot;, llGetOwner(), AGENT, 96, TWO_PI, 1); //Get Name of Avatar, so use max diatance and min time&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
checkC(string message, key id)&lt;br /&gt;
{&lt;br /&gt;
    &lt;br /&gt;
    if ((llSameGroup(id)) || (id == llGetOwner()))&lt;br /&gt;
    {&lt;br /&gt;
        message = llToLower(message);&lt;br /&gt;
        if (llSubStringIndex(message, &amp;quot;finder rate &amp;quot;) == 0)&lt;br /&gt;
        {&lt;br /&gt;
            sensorInterval = (float)llGetSubString(message,12,18) * 60;&lt;br /&gt;
            disp(&amp;quot;Finder Sensor Rate Set To &amp;quot; + (string)((integer)(sensorInterval/60)) + &amp;quot; minutes&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
    &lt;br /&gt;
        else if (llSubStringIndex(message, &amp;quot;finder distance &amp;quot;) == 0)&lt;br /&gt;
        {&lt;br /&gt;
            sensorDistance = (float)llGetSubString(message,16,22) * 60;&lt;br /&gt;
            disp(&amp;quot;Finder Sensor Distance Set To &amp;quot; + (string)((integer)(sensorDistance/60)) + &amp;quot; meters&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
     &lt;br /&gt;
        else if ((message == &amp;quot;startup&amp;quot;) || (message == &amp;quot;finder on&amp;quot;))&lt;br /&gt;
        {&lt;br /&gt;
            dispOnce = FALSE;&lt;br /&gt;
            disp(&amp;quot;Finder is On.  If lost, will IM &amp;quot; + OwnerName);&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        else if ((message == &amp;quot;shutdown&amp;quot;) || (message == &amp;quot;finder off&amp;quot;))&lt;br /&gt;
        {&lt;br /&gt;
            disp(&amp;quot;Finder is Off. No lost notifications will be sent.&amp;quot;);&lt;br /&gt;
            llSensorRemove();&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;
        initialize();&lt;br /&gt;
    }&lt;br /&gt;
    on_rez(integer start_param)&lt;br /&gt;
    {&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
    sensor(integer num_detected)&lt;br /&gt;
    {&lt;br /&gt;
        if (!gotName)&lt;br /&gt;
        {&lt;br /&gt;
            gotName   = TRUE;&lt;br /&gt;
            OwnerName = llDetectedName(0);&lt;br /&gt;
            llSensorRepeat(&amp;quot;&amp;quot;, &amp;quot;&amp;quot;, AGENT, sensorDistance, TWO_PI, 5); //Get Name of Avatar, so use max diatance and min time&lt;br /&gt;
        }&lt;br /&gt;
        dispOnce = FALSE;&lt;br /&gt;
    }&lt;br /&gt;
    no_sensor() &lt;br /&gt;
    { &lt;br /&gt;
        if ((llGetTime() &amp;gt;= sensorInterval) || (!dispOnce))&lt;br /&gt;
        {&lt;br /&gt;
            llWhisper(0, OwnerName + &amp;quot; lost me! Tell them to come and get me at &amp;quot; + (string) llGetPos() + &amp;quot; in the &amp;quot; + llGetRegionName() + &amp;quot; region.&amp;quot;); &lt;br /&gt;
            llInstantMessage(llGetOwner(), &amp;quot;I&#039;m lost!  Come and get me at &amp;quot; + (string) llGetPos() + &amp;quot; in the &amp;quot; + llGetRegionName() + &amp;quot; region.&amp;quot;);&lt;br /&gt;
            llResetTime();&lt;br /&gt;
        } &lt;br /&gt;
        if (!dispOnce) &lt;br /&gt;
        {&lt;br /&gt;
            dispOnce = TRUE;&lt;br /&gt;
            llResetTime();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    link_message(integer sender_number, integer number, string message, key id)&lt;br /&gt;
    {&lt;br /&gt;
        if (number == 95562)&lt;br /&gt;
        {&lt;br /&gt;
            checkC(message, id);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        //Process API Commands&lt;br /&gt;
        if (number == 240)&lt;br /&gt;
        {&lt;br /&gt;
            checkC(message, id);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== ILS Navigation ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;integer channel = 36658425;&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llListen(channel, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    on_rez(integer startup_param)&lt;br /&gt;
    {&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    listen(integer channel, string name, key id, string message)&lt;br /&gt;
    {&lt;br /&gt;
        list packet;&lt;br /&gt;
        list navinfo;&lt;br /&gt;
        string owner;&lt;br /&gt;
        &lt;br /&gt;
        packet = llCSV2List(message);&lt;br /&gt;
        owner = llKey2Name(llGetOwner());&lt;br /&gt;
        &lt;br /&gt;
        if (owner == llList2String(packet, 1))&lt;br /&gt;
        {&lt;br /&gt;
            navinfo += llList2String(packet, 0);&lt;br /&gt;
            navinfo += llToLower(llList2String(packet, 2)); &lt;br /&gt;
            navinfo += llList2Float(packet, 3);&lt;br /&gt;
            navinfo += llList2Float(packet, 4);&lt;br /&gt;
            navinfo += llList2Float(packet, 5); &lt;br /&gt;
            navinfo += llList2Float(packet, 6);&lt;br /&gt;
            &lt;br /&gt;
            llMessageLinked(llGetLinkNumber(), 210, llList2CSV(navinfo), NULL_KEY); &lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
     }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Landmarks ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;//Landmark Inventory Script&lt;br /&gt;
//supports reading of drag and dropped landmarks on this vehicle&lt;br /&gt;
&lt;br /&gt;
string landmarkName;&lt;br /&gt;
key    reqID;&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    changed(integer change)&lt;br /&gt;
    {&lt;br /&gt;
        if (change == CHANGED_INVENTORY)&lt;br /&gt;
        {&lt;br /&gt;
            if (llGetInventoryNumber(INVENTORY_LANDMARK) &amp;gt; 0)&lt;br /&gt;
            {             &lt;br /&gt;
                landmarkName = llGetInventoryName(INVENTORY_LANDMARK, 0);&lt;br /&gt;
                if (llGetInventoryKey(landmarkName) != NULL_KEY)&lt;br /&gt;
                  reqID = llRequestInventoryData(landmarkName);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    dataserver(key queryid, string data)&lt;br /&gt;
    {&lt;br /&gt;
        //vector localPos;&lt;br /&gt;
        vector regionPos;&lt;br /&gt;
        list   tempList;&lt;br /&gt;
        integer x;&lt;br /&gt;
        integer test;&lt;br /&gt;
        list navinfo;&lt;br /&gt;
        vector targetPos;&lt;br /&gt;
        vector targetRegionPos;&lt;br /&gt;
&lt;br /&gt;
        if (queryid == reqID)&lt;br /&gt;
        {&lt;br /&gt;
            llRemoveInventory(landmarkName);&lt;br /&gt;
            &lt;br /&gt;
            test = llSubStringIndex(landmarkName, &amp;quot;,&amp;quot;);&lt;br /&gt;
            if (test &amp;gt;= 0)&lt;br /&gt;
            {&lt;br /&gt;
                tempList = llCSV2List(landmarkName);&lt;br /&gt;
                landmarkName = llList2String(tempList, 0);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            targetPos = (vector)data; //Get Offset to Local Position&lt;br /&gt;
            &lt;br /&gt;
            regionPos = llGetRegionCorner();&lt;br /&gt;
            &lt;br /&gt;
            targetPos = targetPos + regionPos;  //Convert targetPos to absolute world coordinates&lt;br /&gt;
            &lt;br /&gt;
            targetRegionPos = targetPos;&lt;br /&gt;
            targetRegionPos.x = ((integer)((targetRegionPos.x) / 256)) * 256;&lt;br /&gt;
            targetRegionPos.y = ((integer)((targetRegionPos.y) / 256)) * 256;&lt;br /&gt;
            &lt;br /&gt;
            vector localPos = llGetPos();&lt;br /&gt;
            navinfo += landmarkName;&lt;br /&gt;
            navinfo += &amp;quot;&amp;quot;; &lt;br /&gt;
            navinfo += targetPos.x - targetRegionPos.x;&lt;br /&gt;
            navinfo += targetPos.y - targetRegionPos.y;&lt;br /&gt;
            navinfo += localPos.z; &lt;br /&gt;
            navinfo += localPos.z;&lt;br /&gt;
            &lt;br /&gt;
            llMessageLinked(llGetLinkNumber(), 210, llList2CSV(navinfo), NULL_KEY); &lt;br /&gt;
            llMessageLinked(llGetLinkNumber(), 200, (string)targetRegionPos, NULL_KEY);&lt;br /&gt;
        }&lt;br /&gt;
     }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Region == &lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;//Region Database Script&lt;br /&gt;
//by Hank Ramos&lt;br /&gt;
&lt;br /&gt;
key     RegionReadKey;&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    link_message(integer sn, integer n, string m, key id)&lt;br /&gt;
    {&lt;br /&gt;
        string tempString;&lt;br /&gt;
        vector tempVector;&lt;br /&gt;
        list   tempList;&lt;br /&gt;
        &lt;br /&gt;
        m = llToLower(m);&lt;br /&gt;
        if (n == 100)&lt;br /&gt;
        {&lt;br /&gt;
            //Convert Name to Vector&lt;br /&gt;
            RegionReadKey = llRequestSimulatorData(m, DATA_SIM_POS);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        if (n == 999) &lt;br /&gt;
        {&lt;br /&gt;
            llResetScript();&lt;br /&gt;
        }        &lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    dataserver(key requested, string data)&lt;br /&gt;
    {&lt;br /&gt;
        if (requested == RegionReadKey)&lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(llGetLinkNumber(), 200, data, NULL_KEY);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Settings ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;integer Count;&lt;br /&gt;
string  Notecard = &amp;quot;Settings&amp;quot;;&lt;br /&gt;
integer LineCount;&lt;br /&gt;
key     ReadKey;&lt;br /&gt;
vector  forces;    //Upforce, DownForce, Precision&lt;br /&gt;
vector  defs;      //TravelForce, ArriveForce, DefaultZ&lt;br /&gt;
integer altChatCH; //Alternative Chat Channel&lt;br /&gt;
string  home;&lt;br /&gt;
integer distRecv;  //distanceReceived&lt;br /&gt;
float   distance;&lt;br /&gt;
float   dockZ;&lt;br /&gt;
integer docking;&lt;br /&gt;
float   dispRate;&lt;br /&gt;
integer chatChannel;&lt;br /&gt;
string  TourName;&lt;br /&gt;
&lt;br /&gt;
disp(string m)&lt;br /&gt;
{&lt;br /&gt;
    llMessageLinked(LINK_SET, 411, m, NULL_KEY);&lt;br /&gt;
}&lt;br /&gt;
loadSettings()&lt;br /&gt;
{&lt;br /&gt;
    disp(&amp;quot;Loading &amp;quot; + Notecard + &amp;quot;...&amp;quot;);&lt;br /&gt;
    Count = 0;&lt;br /&gt;
    LineCount = 0;&lt;br /&gt;
    ReadKey = llGetNotecardLine(Notecard, LineCount); &lt;br /&gt;
}&lt;br /&gt;
checkC(string m, key id)&lt;br /&gt;
{&lt;br /&gt;
    integer Index;&lt;br /&gt;
    list    landmarkInfo; &lt;br /&gt;
    string  tempString;&lt;br /&gt;
    &lt;br /&gt;
    m = llToLower(m);&lt;br /&gt;
    if (m == &amp;quot;help&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        llGiveInventory(id, &amp;quot;Touring Balloon Instructions&amp;quot;);&lt;br /&gt;
        return;&lt;br /&gt;
    }    &lt;br /&gt;
    if (m == &amp;quot;reset settings&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        loadSettings();&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    if (m == &amp;quot;return home&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        disp(&amp;quot;Returning home...&amp;quot;);&lt;br /&gt;
        docking = FALSE;&lt;br /&gt;
        landmarkInfo = llCSV2List(home);&lt;br /&gt;
        dockZ = llList2Float(landmarkInfo,3);&lt;br /&gt;
        tempString = &amp;quot;Home,&amp;quot; + llList2String(landmarkInfo,0) + &amp;quot;,&amp;quot; + llList2String(landmarkInfo,1) + &amp;quot;,&amp;quot; + \&lt;br /&gt;
                     llList2String(landmarkInfo,2) + &amp;quot;,&amp;quot; + llList2String(landmarkInfo,3) +&amp;quot;,&amp;quot; + llList2String(landmarkInfo,4);&lt;br /&gt;
        llMessageLinked(LINK_SET, 210, tempString, NULL_KEY);&lt;br /&gt;
        llSetTimerEvent(10.0);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    if (m == &amp;quot;say settings&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        llWhisper(0, &amp;quot;Home        = &amp;quot; + home);&lt;br /&gt;
        llWhisper(0, &amp;quot;DefaultZ    = &amp;quot; + (string)defs.z);&lt;br /&gt;
        llWhisper(0, &amp;quot;Precision   = &amp;quot; + (string)forces.z);&lt;br /&gt;
        llWhisper(0, &amp;quot;UpForce     = &amp;quot; + (string)forces.x);&lt;br /&gt;
        llWhisper(0, &amp;quot;DownForce   = &amp;quot; + (string)forces.y);&lt;br /&gt;
        llWhisper(0, &amp;quot;TravelForce = &amp;quot; + (string)defs.x);&lt;br /&gt;
        llWhisper(0, &amp;quot;ArriveForce = &amp;quot; + (string)defs.y);&lt;br /&gt;
        llWhisper(0, &amp;quot;Alt Chat CH = &amp;quot; + (string)chatChannel);&lt;br /&gt;
        return;&lt;br /&gt;
    } &lt;br /&gt;
    if (llSubStringIndex(m, &amp;quot;speed &amp;quot;) == 0)&lt;br /&gt;
    {&lt;br /&gt;
        defs.x = (float)llGetSubString(m,6,18);&lt;br /&gt;
        llMessageLinked(LINK_SET, 237, (string)defs, llGetOwner());&lt;br /&gt;
        disp(&amp;quot;Speed Set to &amp;quot; + (string)defs.x);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    if (llSubStringIndex(m, &amp;quot;precision &amp;quot;) == 0)&lt;br /&gt;
    {&lt;br /&gt;
        forces.z = (float)llGetSubString(m,10,18);&lt;br /&gt;
        llMessageLinked(LINK_SET, 238, (string)forces, llGetOwner());&lt;br /&gt;
        disp(&amp;quot;Timer Precision Set to &amp;quot; + (string)((integer)(forces.z*1000)) + &amp;quot; ms&amp;quot;);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    if (llSubStringIndex(m, &amp;quot;upforce &amp;quot;) == 0)&lt;br /&gt;
    {&lt;br /&gt;
        forces.x = forces.x + ((float)llGetSubString(m,8,18))/1000;&lt;br /&gt;
        llMessageLinked(LINK_SET, 238, (string)forces, llGetOwner());&lt;br /&gt;
        disp(&amp;quot;Up Force &amp;quot; + (string)((integer)(forces.x*1000)));&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    if (llSubStringIndex(m, &amp;quot;downforce &amp;quot;) == 0)&lt;br /&gt;
    {&lt;br /&gt;
        forces.y = forces.y + ((float)llGetSubString(m,10,18))/1000;&lt;br /&gt;
        llMessageLinked(LINK_SET, 238, (string)forces, llGetOwner());&lt;br /&gt;
        disp(&amp;quot;Down Force &amp;quot; + (string)((integer)(forces.y*1000)));&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    if (llSubStringIndex(m, &amp;quot;display rate &amp;quot;) == 0)&lt;br /&gt;
    {&lt;br /&gt;
        dispRate = (float)llGetSubString(m,13,18);&lt;br /&gt;
        llMessageLinked(LINK_SET, 412, (string)dispRate, llGetOwner());&lt;br /&gt;
        disp(&amp;quot;Display Rate Set to &amp;quot; + (string)dispRate + &amp;quot; seconds&amp;quot;);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    if (llSubStringIndex(m, &amp;quot;chat channel &amp;quot;) == 0)&lt;br /&gt;
    {&lt;br /&gt;
        chatChannel = (integer)llGetSubString(m,13,18);&lt;br /&gt;
        llMessageLinked(LINK_SET, 482, (string)chatChannel, llGetOwner());&lt;br /&gt;
        disp(&amp;quot;Chat Channel Set to &amp;quot; + (string)chatChannel);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        loadSettings();    &lt;br /&gt;
    }&lt;br /&gt;
    on_rez(integer startup_param)&lt;br /&gt;
    {&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        vector position = llGetPos();&lt;br /&gt;
        //Check to see if we have arrived, if so, dock and then shutdown&lt;br /&gt;
        if (docking)&lt;br /&gt;
        {&lt;br /&gt;
            disp(&amp;quot;Waiting to finish docking...&amp;quot;);&lt;br /&gt;
            if((position.z &amp;gt; (dockZ - 2)) &amp;amp;&amp;amp; (position.z &amp;lt; (dockZ + 2)))&lt;br /&gt;
            {&lt;br /&gt;
                disp(&amp;quot;Shutting Down...&amp;quot;);&lt;br /&gt;
                llMessageLinked(LINK_SET, 240, &amp;quot;shutdown&amp;quot;, llGetOwner());&lt;br /&gt;
                llSetTimerEvent(0);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else if (distance &amp;lt; 5)&lt;br /&gt;
        {&lt;br /&gt;
            disp(&amp;quot;Sending Docking Command...&amp;quot;);&lt;br /&gt;
            llMessageLinked(LINK_SET, 240, &amp;quot;dock&amp;quot;, llGetOwner());&lt;br /&gt;
            docking = TRUE;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
    link_message(integer sn, integer n, string m, key id)&lt;br /&gt;
    {&lt;br /&gt;
        if (n == 555)&lt;br /&gt;
        {&lt;br /&gt;
            distance = (float)m;&lt;br /&gt;
            distRecv = TRUE;&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        //Process API Commands&lt;br /&gt;
        if (n == 240)&lt;br /&gt;
        {&lt;br /&gt;
            checkC(m, id);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if (n == 95562)&lt;br /&gt;
        {&lt;br /&gt;
            checkC(m, id);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    dataserver(key requested, string data)&lt;br /&gt;
    {&lt;br /&gt;
        //Process Settings&lt;br /&gt;
        if (requested == ReadKey) &lt;br /&gt;
        {&lt;br /&gt;
            if (data != EOF)&lt;br /&gt;
            {&lt;br /&gt;
                if ((llSubStringIndex(data, &amp;quot;#&amp;quot;) != 0) &amp;amp;&amp;amp; (data != &amp;quot;&amp;quot;))&lt;br /&gt;
                {&lt;br /&gt;
                    if (Count == 0)&lt;br /&gt;
                    {&lt;br /&gt;
                         home = data;&lt;br /&gt;
                    }&lt;br /&gt;
                    if (Count == 1)&lt;br /&gt;
                    {&lt;br /&gt;
                        defs.z = (float)data;  //TravelForce, ArriveForce, DefaultZ&lt;br /&gt;
                    }&lt;br /&gt;
                    if (Count == 2)&lt;br /&gt;
                    {&lt;br /&gt;
                        forces.z = (float)data;  //Upforce, DownForce, Precision&lt;br /&gt;
                    }&lt;br /&gt;
                    if (Count == 3)&lt;br /&gt;
                    {&lt;br /&gt;
                        forces.x = ((float)data)/1000;  //Upforce, DownForce, Precision&lt;br /&gt;
                    }&lt;br /&gt;
                    if (Count == 4)&lt;br /&gt;
                    {&lt;br /&gt;
                        forces.y = ((float)data)/1000;  //Upforce, DownForce, Precision&lt;br /&gt;
                    }&lt;br /&gt;
                    if (Count == 5)&lt;br /&gt;
                    {&lt;br /&gt;
                        defs.x = (float)data;   //TravelForce, ArriveForce, DefaultZ&lt;br /&gt;
                    }&lt;br /&gt;
                    if (Count == 6)&lt;br /&gt;
                    {&lt;br /&gt;
                        defs.y = (float)data;   //TravelForce, ArriveForce, DefaultZ&lt;br /&gt;
                    }&lt;br /&gt;
                    if (Count == 7)&lt;br /&gt;
                    {&lt;br /&gt;
                        dispRate = (float)data;   //Display Rate&lt;br /&gt;
                    }&lt;br /&gt;
                    if (Count == 8)&lt;br /&gt;
                    {&lt;br /&gt;
                        chatChannel = (integer)data;   //Chat Channel&lt;br /&gt;
                    }&lt;br /&gt;
                    if (Count == 9)&lt;br /&gt;
                    {&lt;br /&gt;
                        TourName = (string)data; //Default Tour Notecard Name&lt;br /&gt;
                    }&lt;br /&gt;
                    Count += 1;&lt;br /&gt;
                }&lt;br /&gt;
                LineCount += 1;&lt;br /&gt;
                ReadKey = llGetNotecardLine(Notecard, LineCount);&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                disp(&amp;quot;Settings are loaded&amp;quot;);&lt;br /&gt;
                //Send settings&lt;br /&gt;
                llMessageLinked(LINK_SET, 238, (string)forces, llGetOwner());&lt;br /&gt;
                llMessageLinked(LINK_SET, 237, (string)defs,   llGetOwner());&lt;br /&gt;
                llMessageLinked(LINK_SET, 412, (string)dispRate,   llGetOwner());&lt;br /&gt;
                llMessageLinked(LINK_SET, 482, (string)chatChannel,   llGetOwner());&lt;br /&gt;
                llMessageLinked(LINK_SET, 487, TourName,   llGetOwner());&lt;br /&gt;
            }&lt;br /&gt;
        }    &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
...and associated notecard...&lt;br /&gt;
&amp;lt;pre&amp;gt;#Settings&lt;br /&gt;
#This file contains your default settings&lt;br /&gt;
#The order of entries in this file is important.&lt;br /&gt;
#Do not change the order!&lt;br /&gt;
#You may add comments with lines beginning with &amp;quot;#&amp;quot;&lt;br /&gt;
#&lt;br /&gt;
#Home&lt;br /&gt;
#Region,X,Y,DockZ,TravelZ&lt;br /&gt;
#The location used when you tell the balloon to go home&lt;br /&gt;
#The balloon will automatically go there at the TravelZ&lt;br /&gt;
#altitude, then goto the DockZ altitude, then shutdown&lt;br /&gt;
Grignano,98.0,98.0,30,160&lt;br /&gt;
#Default Travel Height&lt;br /&gt;
#The default travel hight used when not specified&lt;br /&gt;
#Value of 0 means to use the current travel height&lt;br /&gt;
0&lt;br /&gt;
#Precision&lt;br /&gt;
#Timer precision, lower is bettter but harder on server&lt;br /&gt;
#Range 0.1-infinite.  In seconds&lt;br /&gt;
0.15&lt;br /&gt;
#Upforce&lt;br /&gt;
#The amount of upward force applied when the flames are on&lt;br /&gt;
450&lt;br /&gt;
#DownForce&lt;br /&gt;
#The amount of downward force applied when the flames are off&lt;br /&gt;
650&lt;br /&gt;
#PushTravel&lt;br /&gt;
#The amount of push during flight&lt;br /&gt;
8.0&lt;br /&gt;
#PushArrive&lt;br /&gt;
#The amount of push when you are within 10 meters of your destination&lt;br /&gt;
1.0&lt;br /&gt;
#DisplayRate&lt;br /&gt;
#The time, in seconds, that an item will be displayed in the central display&lt;br /&gt;
2.75&lt;br /&gt;
#Alternate Command Chanel&lt;br /&gt;
#An additional chat channel that can be used to communicate with the&lt;br /&gt;
#balloon.  Use &amp;quot;/channel command&amp;quot; format to silently communicate commands&lt;br /&gt;
#to the balloon.  Use &amp;quot;//command&amp;quot; to repeat the last channel used.&lt;br /&gt;
#If value is 0, then only the public chat channel is used.&lt;br /&gt;
0&lt;br /&gt;
#Default Tour Notecard Name&lt;br /&gt;
Welcome Tour&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Voice Control ==&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;integer LISTEN_API   = 95562;&lt;br /&gt;
integer CHAT_CHANNEL = 482;&lt;br /&gt;
&lt;br /&gt;
integer chatChannel = 0;&lt;br /&gt;
integer indexChat;&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        indexChat = llListen(chatChannel, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    on_rez(integer startup_param)&lt;br /&gt;
    {&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
    listen(integer channel, string name, key id, string message)&lt;br /&gt;
    {&lt;br /&gt;
        if (name != &amp;quot;Display Panel&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            if ((llSameGroup(id)) || (id == llGetOwner()))&lt;br /&gt;
            {&lt;br /&gt;
                llMessageLinked(LINK_SET, LISTEN_API, message, id); &lt;br /&gt;
            }&lt;br /&gt;
         }&lt;br /&gt;
    }&lt;br /&gt;
    link_message(integer sender_num, integer num, string str, key id)&lt;br /&gt;
    {&lt;br /&gt;
        if (num == CHAT_CHANNEL)&lt;br /&gt;
        {&lt;br /&gt;
            chatChannel = (integer)str;&lt;br /&gt;
            llListenRemove(indexChat);&lt;br /&gt;
            indexChat = llListen(chatChannel, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Sample Tour Notecard ==&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
#Welcome Tour&lt;br /&gt;
#&lt;br /&gt;
#There are 9 Parameters for each Destination&lt;br /&gt;
#Landmarks are accessed in the order they are in this file&lt;br /&gt;
#Starting with Destination #1&lt;br /&gt;
#1 = Title&lt;br /&gt;
#2 = Simulator Name&lt;br /&gt;
#3 = Local X&lt;br /&gt;
#4 = Local Y&lt;br /&gt;
#5 = Docking Z.  The docking altitude.&lt;br /&gt;
#6 = Travel Z.  The altitude used to travel to the destination.&lt;br /&gt;
#7 = Waypoint.  0=False, Any other value is TRUE.  If TRUE the the next landmark is automatically set when you are within 10 meters of the landmark.&lt;br /&gt;
#8= TimeToStay.  0=Disabled, Any other value waits at that position for the specified number of seconds and then selects next landmark.&lt;br /&gt;
#&lt;br /&gt;
#Note: any line beginning with &amp;quot;#&amp;quot; is a comment line, and is ignored&lt;br /&gt;
#&lt;br /&gt;
Vehicle Rezzing Area,Balance,194.0,226.0,24,53,0,60&lt;br /&gt;
Wild West Town,Oak Grove,67.8,48.0,12,35,0,60&lt;br /&gt;
Oak Grove,Oak Grove,109,168,40,50.0,1,0&lt;br /&gt;
Venice,bonifacio,24.5,150.5,28.0,115.0,0,120&lt;br /&gt;
Grignano,grignano,128,128,70,70,1,0&lt;br /&gt;
Sistiana,sistiana,235,17,70,70,1,0&lt;br /&gt;
Luna Oaks Galleria,Luna,53.0,53.0,33.0,50.0,0,60&lt;br /&gt;
Sistiana,sistiana,128,128,95,95,1,0&lt;br /&gt;
Grignano,grignano,170,250,95,95,1,0&lt;br /&gt;
Shangri-La,Dore,47.0,102.0,45.0,50.0,0,60&lt;br /&gt;
Bonifacio Waypoint,Bonifacio,110,43,60,60,1,0&lt;br /&gt;
Gibson Waypoint,Gibson,110,77,60,60,1,0&lt;br /&gt;
Oak Grove,Oak Grove,109,168,40,50.0,1,0&lt;br /&gt;
Vehicle Rezzing Area,Balance,194.0,226.0,24,53,0,60&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lady Sumoku</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Google_Translator&amp;diff=1194994</id>
		<title>Google Translator</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Google_Translator&amp;diff=1194994"/>
		<updated>2015-01-25T03:00:29Z</updated>

		<summary type="html">&lt;p&gt;Lady Sumoku: Replaced old &amp;lt;LSL&amp;gt; block with &amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
Google Translator by Ugleh Ulrik&lt;br /&gt;
&lt;br /&gt;
Google Translator keeps their translated data in a Array. You can see this by looking at the HTTPRequests.&lt;br /&gt;
&lt;br /&gt;
The URL is this&lt;br /&gt;
&lt;br /&gt;
http://translate.google.com/translate_a/t?client=t&amp;amp;text=words here&amp;amp;hl=en&amp;amp;sl=es&lt;br /&gt;
&lt;br /&gt;
This will make it go from Spanish to English. Then all you need to do is do a string replacement.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
key http_request_id;&lt;br /&gt;
string transtring = &amp;quot;&amp;quot;;&lt;br /&gt;
string nothing = &amp;quot;&amp;quot;;&lt;br /&gt;
string name;&lt;br /&gt;
string somestring;&lt;br /&gt;
string strReplace(string str, string search, string replace) {&lt;br /&gt;
    return llDumpList2String(llParseStringKeepNulls((str = &amp;quot;&amp;quot;) + str, [search], []), replace);&lt;br /&gt;
}&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llListen(0, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    http_response(key request_id, integer status, list metadata, string body)&lt;br /&gt;
    {&lt;br /&gt;
        if (request_id == http_request_id)&lt;br /&gt;
        {&lt;br /&gt;
            list trans1 = llParseString2List(body, [&amp;quot;\&amp;quot;orig\&amp;quot;&amp;quot;], []);&lt;br /&gt;
            transtring = strReplace(llList2String(trans1,0), &amp;quot;{\&amp;quot;sentences\&amp;quot;:[{\&amp;quot;trans\&amp;quot;:\&amp;quot;&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
            nothing = strReplace(transtring, &amp;quot;\&amp;quot;,&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
            nothing = strReplace(nothing, &amp;quot;,&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
            nothing =  strReplace(nothing, &amp;quot;\\&amp;quot; + &amp;quot;\&amp;quot;&amp;quot;, &amp;quot;\&amp;quot;&amp;quot;);&lt;br /&gt;
            if (somestring != nothing){&lt;br /&gt;
            llSay(0, nothing);&lt;br /&gt;
        }&lt;br /&gt;
            llSetObjectName(&amp;quot;es2en Translator&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
     listen(integer channel, string name, key id, string message)&lt;br /&gt;
    {&lt;br /&gt;
        somestring = message;&lt;br /&gt;
         if (name == llKey2Name(llGetOwner())){&lt;br /&gt;
        transtring =  llEscapeURL(message);&lt;br /&gt;
         http_request_id = llHTTPRequest(&amp;quot;http://translate.google.com/translate_a/t?client=t&amp;amp;text=&amp;quot; + transtring + &amp;quot;&amp;amp;hl=en&amp;amp;sl=es&amp;amp;tl=en&amp;amp;pc=0&amp;quot;, [], &amp;quot;&amp;quot;);&lt;br /&gt;
    llSetObjectName(name);&lt;br /&gt;
    }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lady Sumoku</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LSL_languageAPI&amp;diff=1194990</id>
		<title>LSL languageAPI</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LSL_languageAPI&amp;diff=1194990"/>
		<updated>2015-01-25T02:56:23Z</updated>

		<summary type="html">&lt;p&gt;Lady Sumoku: Replaced old &amp;lt;LSL&amp;gt; block with &amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;, &amp;lt;pre&amp;gt; formatting for notecard contents&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
&lt;br /&gt;
This is an API that will handle chat messages and HUD menus in multiple languages based on language files in notecards.&lt;br /&gt;
Included are two LSL files, the API itself, a simple example usage script and two language files ( English and French )&lt;br /&gt;
&lt;br /&gt;
todo: floating text support is not yet included in this script.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
// LSL_languageAPI&lt;br /&gt;
// License: LGPL&lt;br /&gt;
// Version: 0.20&lt;br /&gt;
// Author: Gypsy Paz&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//==============&lt;br /&gt;
//    CONFIG    &lt;br /&gt;
//==============&lt;br /&gt;
integer autoLoad = FALSE;    // load the first notecard on CHANGED_INVENTORY&lt;br /&gt;
float menuTimeout = 10;     // Set the blue menu time out ( in seconds )&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//================================================================================================&lt;br /&gt;
//      LINK CODES:        &lt;br /&gt;
//================================================================================================&lt;br /&gt;
list langLinkCodes = [&lt;br /&gt;
    &amp;quot;INIT&amp;quot;,     0x88000,     //Initialize&lt;br /&gt;
    &amp;quot;INIT_R&amp;quot;,   0x88001,     //Confirm Initialized&lt;br /&gt;
    &amp;quot;LOAD&amp;quot;,     0x88002,     //Load Language            lang file name (blank loads first one)&lt;br /&gt;
    &amp;quot;LOAD_R&amp;quot;,   0x88003,     //Confirm Lanugage Loaded&lt;br /&gt;
    &amp;quot;MENU&amp;quot;,     0x88004,     //langMenu                  caption|button1|button2|etc...    avkey&lt;br /&gt;
    &amp;quot;MENU_R&amp;quot;,   0x88005,     //langMenu Response         button    uuid&lt;br /&gt;
    &amp;quot;MENU_C&amp;quot;,   0x88006,     //Close the menu (turn off the listener)&lt;br /&gt;
    &amp;quot;WHISPER&amp;quot;,  0x88007,     //langWhisper               message    uuid&lt;br /&gt;
    &amp;quot;SAY&amp;quot;,      0x88008,     //langSay                   message uuid&lt;br /&gt;
    &amp;quot;SHOUT&amp;quot;,    0x88009,     //langShout                 message uuid&lt;br /&gt;
    &amp;quot;OSAY&amp;quot;,     0x8800A,     //langOwnerSay              message uuid&lt;br /&gt;
    &amp;quot;IM&amp;quot;,       0x8800B,     //langIM                    message|avkey    uuid&lt;br /&gt;
    &amp;quot;FTEXT&amp;quot;,    0x8800C,     //floating text             message color alpha&lt;br /&gt;
    &amp;quot;DUMP&amp;quot;,     0x8800D,     //dump lang from memory to chat (for debugging)&lt;br /&gt;
    &amp;quot;ERROR&amp;quot;,    0x8800E      // return an error message ( not sure how I&#039;ll handle this yet&lt;br /&gt;
];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//================================================================================================&lt;br /&gt;
//      LANGUAGE FUNCTIONS:&lt;br /&gt;
//================================================================================================&lt;br /&gt;
integer langGetCode(string langCode){&lt;br /&gt;
    integer i = llListFindList(langLinkCodes, [langCode]);&lt;br /&gt;
    return llList2Integer(langLinkCodes, i+1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// Language Vars&lt;br /&gt;
string Language;&lt;br /&gt;
list langData;&lt;br /&gt;
list langIndex;&lt;br /&gt;
string curLangFile;&lt;br /&gt;
&lt;br /&gt;
// llDialog Vars&lt;br /&gt;
string  menuCaption;&lt;br /&gt;
list    menuButtons;&lt;br /&gt;
key     menuUser;&lt;br /&gt;
integer menuChannel;&lt;br /&gt;
integer menuListener;&lt;br /&gt;
&lt;br /&gt;
// Data Server Vars&lt;br /&gt;
integer lines;&lt;br /&gt;
integer line;&lt;br /&gt;
key request = NULL_KEY;&lt;br /&gt;
&lt;br /&gt;
string translate(string index, string id){&lt;br /&gt;
    string val;&lt;br /&gt;
    integer i = llListFindList(langIndex,[index]);&lt;br /&gt;
    if ( i != ERR_GENERIC ){&lt;br /&gt;
        return parse(llList2String(langData,i),id);&lt;br /&gt;
    }&lt;br /&gt;
    else{&lt;br /&gt;
        return &amp;quot;&amp;gt;&amp;gt;&amp;gt;error&amp;lt;&amp;lt;&amp;lt;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
        &lt;br /&gt;
&lt;br /&gt;
string parse(string val, string id){&lt;br /&gt;
    // Memory&lt;br /&gt;
    integer i;&lt;br /&gt;
    i = llSubStringIndex(val,&amp;quot;&amp;lt;&amp;lt;memory&amp;gt;&amp;gt;&amp;quot;);&lt;br /&gt;
    if ( i != ERR_GENERIC ){&lt;br /&gt;
        val = llDeleteSubString(val,i,llStringLength(&amp;quot;&amp;lt;&amp;lt;memory&amp;gt;&amp;gt;&amp;quot;)-1);&lt;br /&gt;
        val = llInsertString(val,i,(string)llGetFreeMemory());&lt;br /&gt;
    }&lt;br /&gt;
    i = llSubStringIndex(val,&amp;quot;&amp;lt;&amp;lt;key2name&amp;gt;&amp;gt;&amp;quot;);&lt;br /&gt;
    if ( i != ERR_GENERIC ){&lt;br /&gt;
        val = llDeleteSubString(val,i,i+llStringLength(&amp;quot;&amp;lt;&amp;lt;key2name&amp;gt;&amp;gt;&amp;quot;));&lt;br /&gt;
        val = llInsertString(val,i,llKey2Name((key)id));&lt;br /&gt;
    }&lt;br /&gt;
    return val;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
integer processing = FALSE;&lt;br /&gt;
processData(string data){&lt;br /&gt;
    if ( processing ){&lt;br /&gt;
        if ( data == &amp;quot;&amp;gt;&amp;gt;&amp;gt;STOP&amp;lt;&amp;lt;&amp;lt;&amp;quot; ){&lt;br /&gt;
            processing = FALSE;&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        string prefix = llGetSubString(data,0,1);&lt;br /&gt;
        if ( ( prefix == &amp;quot;//&amp;quot; ) || ( llStringLength(data) == 0 ) ){&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        list s = llParseString2List(data,[&amp;quot;|&amp;quot;],[]);&lt;br /&gt;
        string cmd = llStringTrim(llList2String(s,0),STRING_TRIM);&lt;br /&gt;
        string val = llStringTrim(llList2String(s,1),STRING_TRIM);&lt;br /&gt;
&lt;br /&gt;
        if ( cmd == &amp;quot;!PRINT&amp;quot; ){&lt;br /&gt;
            llSay(PUBLIC_CHANNEL,parse(val,&amp;quot;&amp;quot;));&lt;br /&gt;
        }&lt;br /&gt;
        else if ( cmd == &amp;quot;!SET_LANG&amp;quot; ){&lt;br /&gt;
            Language = val;&lt;br /&gt;
        }&lt;br /&gt;
        else{&lt;br /&gt;
            integer i = llListFindList(langIndex,[cmd]);&lt;br /&gt;
            if ( i == ERR_GENERIC ) return;          //&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt;&amp;lt; this will silently fail missing indexes&lt;br /&gt;
            langData = llListReplaceList(langData,[val],i,i);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
            &lt;br /&gt;
        &lt;br /&gt;
        &lt;br /&gt;
        &lt;br /&gt;
    }&lt;br /&gt;
    else if ( data == &amp;quot;&amp;gt;&amp;gt;&amp;gt;START&amp;lt;&amp;lt;&amp;lt;&amp;quot; ){&lt;br /&gt;
        processing = TRUE;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
dumpData(){&lt;br /&gt;
    integer i;&lt;br /&gt;
    for ( i=0; i&amp;lt;llGetListLength(langIndex); i++ ){&lt;br /&gt;
        llSay(PUBLIC_CHANNEL,llList2String(langIndex,i)+&amp;quot; | &amp;quot;+llList2String(langData,i));&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
default{&lt;br /&gt;
    link_message(integer sender, integer num, string msg, key id){&lt;br /&gt;
        list s;&lt;br /&gt;
        integer i;&lt;br /&gt;
        if ( num == langGetCode(&amp;quot;INIT&amp;quot;) ){        //Initialize&lt;br /&gt;
            curLangFile = &amp;quot;&amp;quot;;&lt;br /&gt;
            Language = &amp;quot;&amp;quot;;&lt;br /&gt;
            langIndex = llParseString2List(msg,[&amp;quot;|&amp;quot;],[]);&lt;br /&gt;
            langData = [];&lt;br /&gt;
            for ( i = 0; i &amp;lt; llGetListLength(langIndex); i++ ){&lt;br /&gt;
                langData += [&amp;quot;...&amp;quot;];&lt;br /&gt;
            }&lt;br /&gt;
            llMessageLinked(LINK_THIS,langGetCode(&amp;quot;INIT_R&amp;quot;),&amp;quot;ok&amp;quot;,&amp;quot; &amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        else if ( num == langGetCode(&amp;quot;LOAD&amp;quot;) ){    // Load Language&lt;br /&gt;
            if ( llStringLength(msg) == 0 ){&lt;br /&gt;
                curLangFile = llGetInventoryName(INVENTORY_NOTECARD,0);&lt;br /&gt;
            }&lt;br /&gt;
            else{&lt;br /&gt;
                curLangFile = msg;&lt;br /&gt;
            }&lt;br /&gt;
            if ( llGetInventoryType(curLangFile) != INVENTORY_NOTECARD ){&lt;br /&gt;
                llSay(PUBLIC_CHANNEL,&amp;quot;Error, Language File Doesn&#039;t Exist&amp;quot;);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            state prep;&lt;br /&gt;
        }&lt;br /&gt;
        else if ( num == langGetCode(&amp;quot;MENU&amp;quot;) ){    // llDialog&lt;br /&gt;
            s = llParseString2List(msg,[&amp;quot;|&amp;quot;],[]);&lt;br /&gt;
            menuCaption = translate(llList2String(s,0),&amp;quot;&amp;quot;);&lt;br /&gt;
            menuButtons = [];&lt;br /&gt;
            for ( i=1; i&amp;lt;llGetListLength(s); i++ ){&lt;br /&gt;
                menuButtons += translate(llList2String(s,i),&amp;quot;&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
            menuUser    = id;&lt;br /&gt;
            state menu;&lt;br /&gt;
        }&lt;br /&gt;
        else if ( num == langGetCode(&amp;quot;WHISPER&amp;quot;) ){    // Whisper&lt;br /&gt;
            llWhisper(PUBLIC_CHANNEL,translate(msg,id));&lt;br /&gt;
        }&lt;br /&gt;
        else if ( num == langGetCode(&amp;quot;SAY&amp;quot;) ){    // Say&lt;br /&gt;
            llSay(PUBLIC_CHANNEL,translate(msg,id));&lt;br /&gt;
        }&lt;br /&gt;
        else if ( num == langGetCode(&amp;quot;SHOUT&amp;quot;) ){    // Shout&lt;br /&gt;
            llShout(PUBLIC_CHANNEL,translate(msg,id));&lt;br /&gt;
        }&lt;br /&gt;
        else if ( num == langGetCode(&amp;quot;OSAY&amp;quot;) ){    // OwnerSay&lt;br /&gt;
            llOwnerSay(translate(msg,id));&lt;br /&gt;
        }&lt;br /&gt;
        else if ( num == langGetCode(&amp;quot;IM&amp;quot;) ){    // Instant Message&lt;br /&gt;
            s = llParseString2List(msg,[&amp;quot;|&amp;quot;],[]);&lt;br /&gt;
            llInstantMessage(llList2Key(s,1),translate(llList2String(s,0),id));        &lt;br /&gt;
        }&lt;br /&gt;
        else if ( num == langGetCode(&amp;quot;DUMP&amp;quot;) ){&lt;br /&gt;
            dumpData();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    changed(integer change){&lt;br /&gt;
        if ( change &amp;amp; CHANGED_INVENTORY ){&lt;br /&gt;
            &lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
                    &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
state menu{&lt;br /&gt;
    state_entry(){&lt;br /&gt;
        menuChannel = PUBLIC_CHANNEL;&lt;br /&gt;
        while(menuChannel == PUBLIC_CHANNEL ){&lt;br /&gt;
            menuChannel = (integer)llRound(llFrand(5)*10000000);&lt;br /&gt;
        }&lt;br /&gt;
        llDialog(menuUser,menuCaption,menuButtons,menuChannel);&lt;br /&gt;
        llSetTimerEvent(menuTimeout);&lt;br /&gt;
        menuListener = llListen(menuChannel, &amp;quot;&amp;quot;, menuUser, &amp;quot;&amp;quot;);       &lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    listen(integer channel, string name, key id, string msg){&lt;br /&gt;
        llSetTimerEvent(0.0);&lt;br /&gt;
        integer i = llListFindList(langData,[msg]);&lt;br /&gt;
        if ( i != ERR_GENERIC ){&lt;br /&gt;
            llMessageLinked(LINK_THIS,langGetCode(&amp;quot;MENU_R&amp;quot;),llList2String(langIndex,i),id);&lt;br /&gt;
        }&lt;br /&gt;
        else{&lt;br /&gt;
            llMessageLinked(LINK_THIS,langGetCode(&amp;quot;MENU_R&amp;quot;),&amp;quot;&amp;gt;&amp;gt;&amp;gt;error&amp;lt;&amp;lt;&amp;lt;&amp;quot;,id);&lt;br /&gt;
        }&lt;br /&gt;
        state default;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
    &lt;br /&gt;
    timer(){&lt;br /&gt;
        llSetTimerEvent(0.0);&lt;br /&gt;
        llMessageLinked(LINK_THIS,langGetCode(&amp;quot;MENU_R&amp;quot;),&amp;quot;&amp;gt;&amp;gt;&amp;gt;timeout&amp;lt;&amp;lt;&amp;lt;&amp;quot;, menuUser);&lt;br /&gt;
        state default;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    link_message(integer sender, integer num, string str, key id){&lt;br /&gt;
        if ( num == langGetCode(&amp;quot;MENU_C&amp;quot;) ){&lt;br /&gt;
            llSetTimerEvent(0.0);&lt;br /&gt;
            state default;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    state_exit(){&lt;br /&gt;
        llSetTimerEvent(0.0);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
state prep{&lt;br /&gt;
    state_entry(){&lt;br /&gt;
        if ( llGetInventoryType(curLangFile) == INVENTORY_NOTECARD ){&lt;br /&gt;
            request = llGetNumberOfNotecardLines(curLangFile);&lt;br /&gt;
            llSetTimerEvent(5.0);&lt;br /&gt;
        }&lt;br /&gt;
        else{&lt;br /&gt;
            llOwnerSay(&amp;quot;Error, Language File Does Not Exist&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    dataserver(key query_id, string data){&lt;br /&gt;
        if (query_id == request){&lt;br /&gt;
            llSetTimerEvent(0.0);&lt;br /&gt;
            lines = (integer)data;&lt;br /&gt;
            state read;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    timer(){&lt;br /&gt;
        state timeout;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
state read{&lt;br /&gt;
    state_entry(){&lt;br /&gt;
        line = 0;&lt;br /&gt;
        request = llGetNotecardLine(curLangFile, line);&lt;br /&gt;
        llSetTimerEvent(5.0);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    dataserver(key query_id, string data){&lt;br /&gt;
        if (query_id == request){&lt;br /&gt;
            llSetTimerEvent(0.0);&lt;br /&gt;
            processData(data);&lt;br /&gt;
            line++;&lt;br /&gt;
            if ( line &amp;lt;= lines ){&lt;br /&gt;
                request = llGetNotecardLine(curLangFile, line);&lt;br /&gt;
                llSetTimerEvent(5);&lt;br /&gt;
            }&lt;br /&gt;
            else{&lt;br /&gt;
                state default;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    timer(){&lt;br /&gt;
        state timeout;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
state timeout{&lt;br /&gt;
    state_entry(){&lt;br /&gt;
        llSetTimerEvent(0.0);&lt;br /&gt;
        llSay(PUBLIC_CHANNEL,&amp;quot;Error, reading the language file timed out&amp;quot;);&lt;br /&gt;
        llMessageLinked(LINK_THIS,51,&amp;quot;error&amp;quot;,&amp;quot;timeout&amp;quot;);&lt;br /&gt;
        state default;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//================================================================================================&lt;br /&gt;
//   LANGUAGE API:&lt;br /&gt;
//------------------------------------------------------------------------------------------------&lt;br /&gt;
&lt;br /&gt;
//================================================================================================&lt;br /&gt;
string langName;&lt;br /&gt;
list langIndex = [&lt;br /&gt;
    &amp;quot;HELLO_WORLD&amp;quot;,&lt;br /&gt;
    &amp;quot;HELLO_AVATAR&amp;quot;,&lt;br /&gt;
    &amp;quot;OBJECT_NAME&amp;quot;,&lt;br /&gt;
    &amp;quot;OWNED_BY&amp;quot;,&lt;br /&gt;
    &amp;quot;CAPTION&amp;quot;,&lt;br /&gt;
    &amp;quot;BUTTON_1&amp;quot;,&lt;br /&gt;
    &amp;quot;BUTTON_2&amp;quot;,&lt;br /&gt;
    &amp;quot;BUTTON_3&amp;quot;,&lt;br /&gt;
    &amp;quot;BUTTON_4&amp;quot;,&lt;br /&gt;
    &amp;quot;BUTTON_5&amp;quot;,&lt;br /&gt;
    &amp;quot;BUTTON_6&amp;quot;&lt;br /&gt;
];&lt;br /&gt;
&lt;br /&gt;
//================================================================================================&lt;br /&gt;
//      LINK CODES:        &lt;br /&gt;
//================================================================================================&lt;br /&gt;
list langLinkCodes = [&lt;br /&gt;
    &amp;quot;INIT&amp;quot;,     0x88000,     //Initialize&lt;br /&gt;
    &amp;quot;INIT_R&amp;quot;,   0x88001,     //Confirm Initialized&lt;br /&gt;
    &amp;quot;LOAD&amp;quot;,     0x88002,     //Load Language            lang file name (blank loads first one)&lt;br /&gt;
    &amp;quot;LOAD_R&amp;quot;,   0x88003,     //Confirm Lanugage Loaded&lt;br /&gt;
    &amp;quot;MENU&amp;quot;,     0x88004,     //langMenu                  caption|button1|button2|etc...    avkey&lt;br /&gt;
    &amp;quot;MENU_R&amp;quot;,   0x88005,     //langMenu Response         button    uuid&lt;br /&gt;
    &amp;quot;MENU_C&amp;quot;,   0x88006,     //Close the menu (turn off the listener)&lt;br /&gt;
    &amp;quot;WHISPER&amp;quot;,  0x88007,     //langWhisper               message    uuid&lt;br /&gt;
    &amp;quot;SAY&amp;quot;,      0x88008,     //langSay                   message uuid&lt;br /&gt;
    &amp;quot;SHOUT&amp;quot;,    0x88009,     //langShout                 message uuid&lt;br /&gt;
    &amp;quot;OSAY&amp;quot;,     0x8800A,     //langOwnerSay              message uuid&lt;br /&gt;
    &amp;quot;IM&amp;quot;,       0x8800B,     //langIM                    message|avkey    uuid&lt;br /&gt;
    &amp;quot;FTEXT&amp;quot;,    0x8800C,     //floating text             message color alpha&lt;br /&gt;
    &amp;quot;DUMP&amp;quot;,     0x8800D,     //dump lang from memory to chat (for debugging)&lt;br /&gt;
    &amp;quot;ERROR&amp;quot;,    0x8800E      // return an error message ( not sure how I&#039;ll handle this yet&lt;br /&gt;
];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//================================================================================================&lt;br /&gt;
//      LANGUAGE FUNCTIONS:&lt;br /&gt;
//================================================================================================&lt;br /&gt;
integer langGetCode(string langCode){&lt;br /&gt;
    integer i = llListFindList(langLinkCodes, [langCode]);&lt;br /&gt;
    return llList2Integer(langLinkCodes, i+1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
langInit(){&lt;br /&gt;
    llMessageLinked(LINK_THIS,langGetCode(&amp;quot;INIT&amp;quot;),llDumpList2String(langIndex,&amp;quot;|&amp;quot;),&amp;quot; &amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
langLoad(string notecard){&lt;br /&gt;
    langName = &amp;quot;&amp;quot;;&lt;br /&gt;
    llMessageLinked(LINK_THIS,langGetCode(&amp;quot;LOAD&amp;quot;),notecard, &amp;quot; &amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
langWhisper(string msg, key id){&lt;br /&gt;
    llMessageLinked(LINK_THIS,langGetCode(&amp;quot;WHISPER&amp;quot;),msg,id);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
langSay(string msg, key id){&lt;br /&gt;
    llMessageLinked(LINK_THIS,langGetCode(&amp;quot;SAY&amp;quot;),msg,id);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
langShout(string msg, key id){&lt;br /&gt;
    llMessageLinked(LINK_THIS,langGetCode(&amp;quot;SHOUT&amp;quot;),msg,id);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
langMenu(string caption, list buttons, key id){&lt;br /&gt;
    llMessageLinked(LINK_THIS,langGetCode(&amp;quot;MENU&amp;quot;),caption+&amp;quot;|&amp;quot;+llDumpList2String(buttons,&amp;quot;|&amp;quot;),id);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
default{&lt;br /&gt;
    state_entry(){&lt;br /&gt;
        langInit();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    link_message(integer sender, integer num, string msg, key id){&lt;br /&gt;
        // Language is initialized&lt;br /&gt;
        if ( num == langGetCode(&amp;quot;INIT_R&amp;quot;) ){&lt;br /&gt;
            if ( msg == &amp;quot;ok&amp;quot; ){&lt;br /&gt;
                // load the default language (first notecard)&lt;br /&gt;
                langLoad(&amp;quot;&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
            else if ( msg == &amp;quot;error&amp;quot; ){&lt;br /&gt;
                // something went wrong&lt;br /&gt;
                llOwnerSay((string)id);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        // Language is loaded&lt;br /&gt;
        else if ( num == langGetCode(&amp;quot;LOAD_R&amp;quot;) ){&lt;br /&gt;
            if ( msg == &amp;quot;ok&amp;quot; ){&lt;br /&gt;
                // load the default language (first notecard)&lt;br /&gt;
                langName = (string)id;&lt;br /&gt;
            }&lt;br /&gt;
            else if ( msg == &amp;quot;error&amp;quot; ){&lt;br /&gt;
                // something went wrong&lt;br /&gt;
                llOwnerSay((string)id);&lt;br /&gt;
            }&lt;br /&gt;
llMessageLinked(LINK_THIS,langGetCode(&amp;quot;DUMP&amp;quot;),&amp;quot;dump data&amp;quot;,&amp;quot; &amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        // Blue Menu Response&lt;br /&gt;
        else if ( num == langGetCode(&amp;quot;MENU_R&amp;quot;) ){&lt;br /&gt;
            if ( msg == &amp;quot;BUTTON_1&amp;quot; ){&lt;br /&gt;
                langSay(&amp;quot;HELLO_AVATAR&amp;quot;, id);&lt;br /&gt;
            }&lt;br /&gt;
            else if ( msg == &amp;quot;BUTTON_2&amp;quot; ){&lt;br /&gt;
                langSay(&amp;quot;OBJECT_NAME&amp;quot;, llGetKey());            &lt;br /&gt;
            }&lt;br /&gt;
            else if ( msg == &amp;quot;BUTTON_3&amp;quot; ){&lt;br /&gt;
                langSay(&amp;quot;OWNED_BY&amp;quot;, llGetOwner());            &lt;br /&gt;
            }&lt;br /&gt;
            else if ( msg == &amp;quot;BUTTON_4&amp;quot; ){&lt;br /&gt;
                llMessageLinked(LINK_THIS,langGetCode(&amp;quot;DUMP&amp;quot;),&amp;quot;dump&amp;quot;,&amp;quot; &amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
            else if ( msg == &amp;quot;BUTTON_5&amp;quot; ){&lt;br /&gt;
                langLoad(&amp;quot;language - ENGLISH&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
            else if ( msg == &amp;quot;BUTTON_6&amp;quot; ){&lt;br /&gt;
                langLoad(&amp;quot;language - FRENCH&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    touch_start(integer n){&lt;br /&gt;
        langMenu(&amp;quot;CAPTION&amp;quot;, [&amp;quot;BUTTON_1&amp;quot;, &amp;quot;BUTTON_2&amp;quot;, &amp;quot;BUTTON_3&amp;quot;, &amp;quot;BUTTON_4&amp;quot;, &amp;quot;BUTTON_5&amp;quot;, &amp;quot;BUTTON_6&amp;quot;], llDetectedKey(0)); &lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Instructions go up here&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;START&amp;lt;&amp;lt;&amp;lt;&lt;br /&gt;
// start processing the notecard&lt;br /&gt;
!SET_LANG   |  Engilish&lt;br /&gt;
!PRINT | Loading Language File...&lt;br /&gt;
&lt;br /&gt;
HELLO_WORLD | Hello, I&#039;m a multi-lingual api&lt;br /&gt;
HELLO_AVATAR | Hello &amp;lt;&amp;lt;key2name&amp;gt;&amp;gt;&lt;br /&gt;
OBJECT_NAME | I am a &amp;lt;&amp;lt;key2name&amp;gt;&amp;gt;&lt;br /&gt;
OWNED_BY | I belong to &amp;lt;&amp;lt;key2name&amp;gt;&amp;gt;&lt;br /&gt;
CAPTION | Language API Sample, choose your option&lt;br /&gt;
BUTTON_1 | Avatar&lt;br /&gt;
BUTTON_2 | Object&lt;br /&gt;
BUTTON_3 | Owner&lt;br /&gt;
BUTTON_4 | Dump&lt;br /&gt;
BUTTON_5 | ENGLISH&lt;br /&gt;
BUTTON_6 | FRENCH&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!PRINT | Language file loaded.&lt;br /&gt;
!PRINT | &amp;lt;&amp;lt;memory&amp;gt;&amp;gt; bytes free&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;STOP&amp;lt;&amp;lt;&amp;lt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Mettez vos instructions ici&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;START&amp;lt;&amp;lt;&amp;lt;&lt;br /&gt;
// commencez à traiter le notecard&lt;br /&gt;
!SET_LANG   |  Francais&lt;br /&gt;
!PRINT | Chargement du Dossier de Langue...&lt;br /&gt;
&lt;br /&gt;
HELLO_WORLD | Bonjour, je suis api multilingue&lt;br /&gt;
HELLO_AVATAR | Bonjour &amp;lt;&amp;lt;key2name&amp;gt;&amp;gt;&lt;br /&gt;
OBJECT_NAME | Je suis &amp;lt;&amp;lt;key2name&amp;gt;&amp;gt;&lt;br /&gt;
OWNED_BY | J&#039;appartiens à &amp;lt;&amp;lt;key2name&amp;gt;&amp;gt;&lt;br /&gt;
CAPTION | L&#039;Échantillon d&#039;API de langue, choisissez votre option&lt;br /&gt;
BUTTON_1 | Avatar&lt;br /&gt;
BUTTON_2 | Objet&lt;br /&gt;
BUTTON_3 | Propriétaire&lt;br /&gt;
BUTTON_4 | Décharge publique&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
!PRINT | Le dossier de langue a chargé.&lt;br /&gt;
!PRINT | octets de &amp;lt;&amp;lt;memory&amp;gt;&amp;gt; libres&lt;br /&gt;
&lt;br /&gt;
&amp;gt;&amp;gt;&amp;gt;STOP&amp;lt;&amp;lt;&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lady Sumoku</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Morse_Code&amp;diff=1194983</id>
		<title>Morse Code</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Morse_Code&amp;diff=1194983"/>
		<updated>2015-01-25T02:49:59Z</updated>

		<summary type="html">&lt;p&gt;Lady Sumoku: Replaced old &amp;lt;LSL&amp;gt; block with &amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}{{RightToc}}&lt;br /&gt;
=Description=&lt;br /&gt;
The following is a script which you can use to convert to and from morse code. In addition, the script can play morse code. The script was written in LSLEditor. The script should work fine in both mono &amp;amp; LSO.&lt;br /&gt;
&lt;br /&gt;
= Creator =&lt;br /&gt;
*{{User|Bobbyb30 Swashbuckler }}&lt;br /&gt;
&lt;br /&gt;
= Contributors =&lt;br /&gt;
* Stephen C Phillips &lt;br /&gt;
* Michael R Ditto&lt;br /&gt;
where I based my script off [http://www.omnicron.com/~ford/java/NMorse.java java source]&lt;br /&gt;
If you modify/improve upon the script, please add your name here.&lt;br /&gt;
&lt;br /&gt;
= License =&lt;br /&gt;
The following script is licensed under the GNU GPL V3 license.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
//    Bobbyb30 Swashbuckler (C) 2009&lt;br /&gt;
//    This program is free software: you can redistribute it and/or modify&lt;br /&gt;
//    it under the terms of the GNU General Public License as published by&lt;br /&gt;
//    the Free Software Foundation, either version 3 of the License, or&lt;br /&gt;
//    (at your option) any later version.&lt;br /&gt;
//&lt;br /&gt;
//    This program 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 General Public License for more details.&lt;br /&gt;
//&lt;br /&gt;
//    You should have received a copy of the GNU General Public License&lt;br /&gt;
//    along with this program.  If not, see &amp;lt;http://www.gnu.org/licenses/&amp;gt;.&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
= Disclaimer =&lt;br /&gt;
These programs are distributed in the hope that it will be useful, but &#039;&#039;&#039;WITHOUT ANY WARRANTY&#039;&#039;&#039;; without even the implied warranty of &#039;&#039;&#039;MERCHANTABILITY&#039;&#039;&#039; or &#039;&#039;&#039;FITNESS FOR A PARTICULAR PURPOSE&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
=Directions=&lt;br /&gt;
Create a prim and drop the script in. Aside from that it has 3 functions:&lt;br /&gt;
* tomorsecode which converts to morse code&lt;br /&gt;
* frommorsecode which converts morse code to english&lt;br /&gt;
* playmorsecode which plays the morse code&lt;br /&gt;
&lt;br /&gt;
The script should be fairly easy to follow...Enjoy.&lt;br /&gt;
&lt;br /&gt;
=Morse Code=&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
//***********************************************************************************************************&lt;br /&gt;
//                                                                                                          *&lt;br /&gt;
//                                            --Morse Code--                                                *&lt;br /&gt;
//                                                                                                          *&lt;br /&gt;
//***********************************************************************************************************&lt;br /&gt;
// www.lsleditor.org  by Alphons van der Heijden (SL: Alphons Jano)&lt;br /&gt;
//Creator: Bobbyb30 Swashbuckler&lt;br /&gt;
//Attribution: Original java work by Stephen C Phillips (C) 1999 and Michael R Ditto (C) 2001&lt;br /&gt;
//Created: March 9, 2007&lt;br /&gt;
//Last Modified:  December 3, 2009&lt;br /&gt;
//Released: Wed, December 2, 2009&lt;br /&gt;
//License: GNU GPL V3&lt;br /&gt;
//    Bobbyb30 Swashbuckler (C) 2009&lt;br /&gt;
//    This program is free software: you can redistribute it and/or modify&lt;br /&gt;
//    it under the terms of the GNU General Public License as published by&lt;br /&gt;
//    the Free Software Foundation, either version 3 of the License, or&lt;br /&gt;
//    (at your option) any later version.&lt;br /&gt;
//&lt;br /&gt;
//    This program 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 General Public License for more details.&lt;br /&gt;
//&lt;br /&gt;
//    You should have received a copy of the GNU General Public License&lt;br /&gt;
//    along with this program.  If not, see &amp;lt;http://www.gnu.org/licenses/&amp;gt;.&lt;br /&gt;
//Some parts taken from http://www.omnicron.com/~ford/java/NMorse.java&lt;br /&gt;
&lt;br /&gt;
//Status: Fully Working/Production Ready&lt;br /&gt;
//Version: 1.2.7&lt;br /&gt;
&lt;br /&gt;
//Name: Morse Code.lsl&lt;br /&gt;
//Purpose: To be able to convert to and from morse code and be able to play morse code in sound.&lt;br /&gt;
//Technical Overview: Uses a list and a string of characters to determine morse code. Uses 2 sounds to play.&lt;br /&gt;
//Description: This script will convert to and from morse code and can play morse code.&lt;br /&gt;
//Directions: This is meant to be used by scripters...the script has 3 functions which you can use...&lt;br /&gt;
&lt;br /&gt;
//Compatible: Mono &amp;amp; LSL compatible&lt;br /&gt;
//Other items required: Correct sound UUIDs for dit and dah.&lt;br /&gt;
//Notes: Uses more than standard characters, commented for fellow scripters. Morse code is always capital.&lt;br /&gt;
//       Sounds dit and dah made in audacity using tone generator and sin wave&lt;br /&gt;
//       dit: Tone generator-&amp;gt;frequency:800hz, amplitude:.5, length.05 @ 44.KHz&lt;br /&gt;
//       dah: Tone generator-&amp;gt;frequency:800hz, amplitude:.5, length.15 @ 44.KHz&lt;br /&gt;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////&lt;br /&gt;
//you may use a period . or a raised dot · or a bullet •&lt;br /&gt;
//you may use a dash,(hyphen, or minus) - or underscore _&lt;br /&gt;
&lt;br /&gt;
//from http://www.omnicron.com/~ford/java/NMorse.java&lt;br /&gt;
string inputcharacters = &amp;quot;ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789.!,:?\\`&#039;-/()\&amp;quot;=+;_$@&amp;amp;  &amp;quot;;&lt;br /&gt;
&lt;br /&gt;
//string characters = &amp;quot;abcdefghijklmnopqrstuvwxyz0123456789.!,?&#039;/()&amp;amp;:;=+-_\&amp;quot;$@&amp;quot;;&lt;br /&gt;
list morsecodecharacters = [&lt;br /&gt;
    &amp;quot;.-&amp;quot;,//A&lt;br /&gt;
    &amp;quot;-...&amp;quot;,//B&lt;br /&gt;
    &amp;quot;-.-.&amp;quot;,//c&lt;br /&gt;
    &amp;quot;-..&amp;quot;,//D&lt;br /&gt;
    &amp;quot;.&amp;quot;,//E&lt;br /&gt;
    &amp;quot;..-.&amp;quot;,//F&lt;br /&gt;
    &amp;quot;--.&amp;quot;,//G&lt;br /&gt;
    &amp;quot;....&amp;quot;,//H&lt;br /&gt;
    &amp;quot;..&amp;quot;,//I&lt;br /&gt;
    &amp;quot;.---&amp;quot;,//J&lt;br /&gt;
    &amp;quot;-.-&amp;quot;,//K&lt;br /&gt;
    &amp;quot;.-..&amp;quot;,//L&lt;br /&gt;
    &amp;quot;--&amp;quot;,//M&lt;br /&gt;
    &amp;quot;-.&amp;quot;,//N&lt;br /&gt;
    &amp;quot;---&amp;quot;,//O&lt;br /&gt;
    &amp;quot;.--.&amp;quot;,//P&lt;br /&gt;
    &amp;quot;--.-&amp;quot;,//Q&lt;br /&gt;
    &amp;quot;.-.&amp;quot;,//R&lt;br /&gt;
    &amp;quot;...&amp;quot;,//S&lt;br /&gt;
    &amp;quot;-&amp;quot;,//T&lt;br /&gt;
    &amp;quot;..-&amp;quot;,//U&lt;br /&gt;
    &amp;quot;...-&amp;quot;,//V&lt;br /&gt;
    &amp;quot;.--&amp;quot;,//W&lt;br /&gt;
    &amp;quot;-..-&amp;quot;,//X&lt;br /&gt;
    &amp;quot;-.--&amp;quot;,//Y&lt;br /&gt;
    &amp;quot;--..&amp;quot;,//Z&lt;br /&gt;
    &amp;quot;-----&amp;quot;,//0&lt;br /&gt;
    &amp;quot;.----&amp;quot;,//1&lt;br /&gt;
    &amp;quot;..---&amp;quot;,//2&lt;br /&gt;
    &amp;quot;...--&amp;quot;,//3&lt;br /&gt;
    &amp;quot;....-&amp;quot;,//4&lt;br /&gt;
    &amp;quot;.....&amp;quot;,//5&lt;br /&gt;
    &amp;quot;-....&amp;quot;,//6&lt;br /&gt;
    &amp;quot;--...&amp;quot;,//7&lt;br /&gt;
    &amp;quot;---..&amp;quot;,//8&lt;br /&gt;
    &amp;quot;----.&amp;quot;,//9&lt;br /&gt;
    &amp;quot;.-.-.-&amp;quot;,//. (period)&lt;br /&gt;
    &amp;quot;-.-.--&amp;quot;,//! -this may not be a standard&lt;br /&gt;
    &amp;quot;--..--&amp;quot;,//, -comma&lt;br /&gt;
    &amp;quot;---...&amp;quot;,//: -colon&lt;br /&gt;
    &amp;quot;..--..&amp;quot;,//? -question mark&lt;br /&gt;
    &amp;quot;.----.&amp;quot;,//\ -backslash&lt;br /&gt;
    &amp;quot;.----.&amp;quot;,//` treat ` as &#039;&lt;br /&gt;
    &amp;quot;.----.&amp;quot;,//&#039; apostrophe&lt;br /&gt;
    &amp;quot;-....-&amp;quot;,//-&lt;br /&gt;
    &amp;quot;-..-.&amp;quot;,// /-foward slash , fraction bar&lt;br /&gt;
    &amp;quot;-.--.-&amp;quot;,//( -Parenthesis open [(]-please note these are the same&lt;br /&gt;
    &amp;quot;-.--.-&amp;quot;,//) - Parenthesis close [)]&lt;br /&gt;
    &amp;quot;.-..-.&amp;quot;,//&amp;quot;-quotes&lt;br /&gt;
    &amp;quot;-...-&amp;quot;,//=&lt;br /&gt;
    &amp;quot;.-.-.&amp;quot;,//+&lt;br /&gt;
    &amp;quot;-.-.-.&amp;quot;,//;&lt;br /&gt;
    &amp;quot;..--.-&amp;quot;,//_&lt;br /&gt;
    &amp;quot;...-..-&amp;quot;,//$&lt;br /&gt;
    &amp;quot;.--.-.&amp;quot;,//@&lt;br /&gt;
    &amp;quot;.-...&amp;quot;,//&amp;amp; Ampersand -http://en.wikipedia.org/wiki/Morse_code&lt;br /&gt;
    &amp;quot;/ &amp;quot;,//space //you may rerange the bottom these two spaces so that your morse code does have space for /&lt;br /&gt;
    &amp;quot;/&amp;quot;//space-this second space doesn&#039;t have a space and is used for converting from morose code&lt;br /&gt;
        ];&lt;br /&gt;
&lt;br /&gt;
string tomorsecode(string input)//converts to morse code from english&lt;br /&gt;
{&lt;br /&gt;
    input = llToUpper(input);//convert to upper as Morse code is in uppper case&lt;br /&gt;
    integer counter;&lt;br /&gt;
    integer inputlength = llStringLength(input);//speed hack here&lt;br /&gt;
    string morsecode;&lt;br /&gt;
    do&lt;br /&gt;
    {&lt;br /&gt;
        integer index = llSubStringIndex(inputcharacters,llGetSubString(input,counter,counter));//get a character&lt;br /&gt;
        if(index != -1)//speed hack here&lt;br /&gt;
        {//this means the character can be converted to morse code&lt;br /&gt;
&lt;br /&gt;
            //pull out morse character from list and append a space&lt;br /&gt;
            morsecode += llList2String(morsecodecharacters,index) + &amp;quot; &amp;quot;;//mem hack here,&lt;br /&gt;
        }&lt;br /&gt;
        else//unknown character&lt;br /&gt;
        {&lt;br /&gt;
            morsecode += &amp;quot;?&amp;quot;;//add question for unknown character&lt;br /&gt;
        }&lt;br /&gt;
    }while(++counter &amp;lt;inputlength);&lt;br /&gt;
    return morsecode;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string frommorsecode(string input)//converts from morse code to english&lt;br /&gt;
{&lt;br /&gt;
    //you could do some string replaces for other characters such as dots and bullets...but I&#039;m lazy=D&lt;br /&gt;
&lt;br /&gt;
    list inputlist = llParseString2List(input,[&amp;quot; &amp;quot;],[&amp;quot;/&amp;quot;]);//parse out spaces, added &amp;quot;/&amp;quot; for / without spaces&lt;br /&gt;
    input = &amp;quot;&amp;quot;;//remove input&lt;br /&gt;
    integer counter;&lt;br /&gt;
    integer inputlength = llGetListLength(inputlist);//speed hack here&lt;br /&gt;
    string english;&lt;br /&gt;
    do&lt;br /&gt;
    {&lt;br /&gt;
        //its pretty much the same procedure in reverse&lt;br /&gt;
        integer index = llListFindList(morsecodecharacters,[llList2String(inputlist,counter)]);&lt;br /&gt;
        if(index != -1)//speed hack here&lt;br /&gt;
        {//this means the character can be converted to morse code&lt;br /&gt;
&lt;br /&gt;
            //pull out english character from inputstring&lt;br /&gt;
            english += llGetSubString(inputcharacters,index,index);//mem hack here,&lt;br /&gt;
        }&lt;br /&gt;
        else//unknown character&lt;br /&gt;
        {&lt;br /&gt;
            english += &amp;quot;?&amp;quot;;//add question for unknown character&lt;br /&gt;
        }&lt;br /&gt;
    }while(++counter &amp;lt;inputlength);&lt;br /&gt;
    return english;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//sounds..you could actually use all the sounds for all the letters...but thats more work&lt;br /&gt;
//use t and e to make sounds at 10wpm&lt;br /&gt;
&lt;br /&gt;
string ditsound = &amp;quot;98303801-d733-e49a-9bb1-34f140c35ca6&amp;quot;;//short mark, dot or &#039;dit&#039; .equals E .05 sec&lt;br /&gt;
string dahsound = &amp;quot;e2c6a9db-8bcc-d78f-7c69-732da1295542&amp;quot;;//longer mark, dash or &#039;dah&#039;-T .15 sec&lt;br /&gt;
//string ditsound = &amp;quot;bda8929e-0e34-f32d-340d-1226c1e0c5b5&amp;quot;;//short mark, dot or &#039;dit&#039; .equals E .1 sec&lt;br /&gt;
//string dahsound = &amp;quot;b35ac99d-86a5-1df1-eb8c-85966ac8b2a9&amp;quot;;//longer mark, dash or &#039;dah&#039;-T .3 sec&lt;br /&gt;
string errorsound = &amp;quot;539ae7d0-eaa3-1450-9014-316c24ea4721&amp;quot;;//an error sound&lt;br /&gt;
&lt;br /&gt;
//you may recalibrate sound times or change sounds for faster printing&lt;br /&gt;
float ditsoundwait = .05;//how long to wait after playing dit .05 seconds long&lt;br /&gt;
float dahsoundwait = .15;//how long to wait after playing dah.15 seconds long&lt;br /&gt;
float spacepause = .3;//how long to pause for spaces&lt;br /&gt;
&lt;br /&gt;
//dashes and dots&lt;br /&gt;
string dit = &amp;quot;.&amp;quot;;//the dot being used&lt;br /&gt;
string dah = &amp;quot;-&amp;quot;;//the dash being used&lt;br /&gt;
&lt;br /&gt;
//input should be given in morsecode&lt;br /&gt;
playmorsecode(string input)//plays morsecode in sound=D&lt;br /&gt;
{&lt;br /&gt;
    //similar to frommorsecode&lt;br /&gt;
    list inputlist = llParseString2List(input,[&amp;quot; &amp;quot;],[&amp;quot;/&amp;quot;]);//parse out spaces,added to parse out / without spaces&lt;br /&gt;
    input = &amp;quot;&amp;quot;;//remove input&lt;br /&gt;
    integer counter;&lt;br /&gt;
    integer inputlength = llGetListLength(inputlist);//speed hack here&lt;br /&gt;
    do&lt;br /&gt;
    {&lt;br /&gt;
        string morsecharacter = llList2String(inputlist,counter);//pull that morse character from the inputlist&lt;br /&gt;
        integer index = llListFindList(morsecodecharacters,[morsecharacter]);//check to make sure its valid morsecode&lt;br /&gt;
        if(index != -1)//speed hack here&lt;br /&gt;
        {&lt;br /&gt;
            //if its valid play the right sounds;&lt;br /&gt;
            integer morsecharacterlength = llStringLength(morsecharacter);//length of the morse character we&#039;re playing&lt;br /&gt;
            integer soundcounter;&lt;br /&gt;
            //llOwnerSay(&amp;quot;c&amp;quot; + morsecharacter + &amp;quot;|&amp;quot; + (string)morsecharacterlength + &amp;quot;soundcounter:&amp;quot; + (string)soundcounter);//debug&lt;br /&gt;
            do&lt;br /&gt;
            {&lt;br /&gt;
                string character = llGetSubString(morsecharacter,soundcounter,soundcounter);&lt;br /&gt;
                if(character == dit)&lt;br /&gt;
                {&lt;br /&gt;
                    //llSay(0,&amp;quot;dit&amp;quot; + character);//debug&lt;br /&gt;
                    llTriggerSound(ditsound,1.0);&lt;br /&gt;
                    llSleep(ditsoundwait);//how long to wait after sound&lt;br /&gt;
                }&lt;br /&gt;
                else if(character == dah)&lt;br /&gt;
                {&lt;br /&gt;
                    //llSay(0,&amp;quot;dah&amp;quot; + character);//debug&lt;br /&gt;
                    llTriggerSound(dahsound,1.0);&lt;br /&gt;
                    llSleep(dahsoundwait);//how long to wait after sound&lt;br /&gt;
                }&lt;br /&gt;
                else//must be a space /&lt;br /&gt;
                {&lt;br /&gt;
                    llSleep(spacepause);&lt;br /&gt;
                    //llSay(0,&amp;quot;other&amp;quot; + character);//debug&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
            }while(++soundcounter &amp;lt; morsecharacterlength);&lt;br /&gt;
            soundcounter = 0;//makes it work in lsleditor&lt;br /&gt;
        }&lt;br /&gt;
        else//unknown character&lt;br /&gt;
        {&lt;br /&gt;
            //llSay(0,&amp;quot;error&amp;quot;);//debug&lt;br /&gt;
            llTriggerSound(errorsound,1.0);&lt;br /&gt;
        }&lt;br /&gt;
    }while(++counter &amp;lt;inputlength);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
test()//this is a removable function that I used to make sure it ran correctly&lt;br /&gt;
{&lt;br /&gt;
    string testphrase= &amp;quot;the quick brown fox jumps right over the lazy dog&amp;quot;;&lt;br /&gt;
    llOwnerSay(testphrase + &amp;quot;|&amp;quot; + frommorsecode(tomorsecode(testphrase)));&lt;br /&gt;
    //            string test = &amp;quot;HELLO WORLD!&amp;quot;;&lt;br /&gt;
    //        string to = tomorsecode(test);&lt;br /&gt;
    //        string fro = frommorsecode(to);&lt;br /&gt;
    //        playmorsecode(to);&lt;br /&gt;
    //        llSay(0,&amp;quot;test:&amp;quot; + test);&lt;br /&gt;
    //        llSay(0,&amp;quot;t:&amp;quot; + to + &amp;quot;|&amp;quot; + fro);&lt;br /&gt;
    //        llSay(0,&amp;quot;f:&amp;quot; + tomorsecode(fro) + &amp;quot;|&amp;quot; + frommorsecode(tomorsecode(fro)));&lt;br /&gt;
    //        llSubStringIndex(&amp;quot;1 &amp;quot;,&amp;quot; &amp;quot;);&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;
        //test();&lt;br /&gt;
        llOwnerSay(&amp;quot;On the wiki at https://wiki.secondlife.com/wiki/Morse_Code&amp;quot;);&lt;br /&gt;
        llOwnerSay(&amp;quot;Morse Code.lsl&#039; released under GNU GPL V3 by Bobbyb30 Swashbuckler (C) 2009&amp;quot;);&lt;br /&gt;
        llOwnerSay(tomorsecode(&amp;quot;Because nothing speaks 1337 like morse code.&amp;quot;));&lt;br /&gt;
        playmorsecode(tomorsecode(&amp;quot;Hello World&amp;quot;));&lt;br /&gt;
        llOwnerSay(&amp;quot;Because nothing speaks 1337 like morse code.&amp;quot;);&lt;br /&gt;
        llOwnerSay(&amp;quot;I&#039;ll be listening on channel 0...use the folowing commands without &amp;lt;&amp;gt; or :\n &amp;quot;&lt;br /&gt;
            + &amp;quot;english &amp;lt;morse code goes here&amp;gt;: this will translate morse code to english\n&amp;quot;&lt;br /&gt;
            + &amp;quot;morsecode &amp;lt;english goes here&amp;gt;: this will translate english to morse code\n&amp;quot;&lt;br /&gt;
            + &amp;quot;play english &amp;lt;english goes here&amp;gt;: this will play the english in morse code\n&amp;quot;&lt;br /&gt;
            + &amp;quot;play morse &amp;lt;morse code goes here&amp;gt;: this will play the morse code.&amp;quot;);&lt;br /&gt;
        llOwnerSay(&amp;quot;Please input morse code using . (periods) and dashes as -&amp;quot;);&lt;br /&gt;
        llOwnerSay(&amp;quot;I only support the following english characters and their morse code counterparts:\n&amp;quot; + inputcharacters);&lt;br /&gt;
        llOwnerSay(&amp;quot;Enjoy!&amp;quot;);&lt;br /&gt;
        llListen(0,&amp;quot;&amp;quot;,llGetOwner(),&amp;quot;&amp;quot;);//i advise against a 0 listener...but I didn&#039;t optimize this part&lt;br /&gt;
    }&lt;br /&gt;
    listen(integer channel, string name, key id, string msg)//not optimized...for example use&lt;br /&gt;
    {&lt;br /&gt;
        string cleanmsg = llStringTrim(llToLower(msg),STRING_TRIM);//trim head and tail&lt;br /&gt;
        //english&lt;br /&gt;
        //012345678&lt;br /&gt;
        if(llSubStringIndex(cleanmsg,&amp;quot;english &amp;quot;) == 0)&lt;br /&gt;
            llOwnerSay(frommorsecode(llGetSubString(cleanmsg,8,-1)));&lt;br /&gt;
        //morsecode&lt;br /&gt;
        //01234567891&lt;br /&gt;
        else if(llSubStringIndex(cleanmsg,&amp;quot;morsecode &amp;quot;) == 0)&lt;br /&gt;
            llOwnerSay(tomorsecode(llGetSubString(cleanmsg,10,-1)));&lt;br /&gt;
        //play english&lt;br /&gt;
        //01234567891123&lt;br /&gt;
        else if(llSubStringIndex(cleanmsg,&amp;quot;play english &amp;quot;) == 0)&lt;br /&gt;
            playmorsecode(tomorsecode(llGetSubString(cleanmsg,13,-1)));&lt;br /&gt;
        //play morse&lt;br /&gt;
        //012345678911&lt;br /&gt;
        else if(llSubStringIndex(cleanmsg,&amp;quot;play morse &amp;quot;) == 0)&lt;br /&gt;
            playmorsecode(llGetSubString(cleanmsg,11,-1));&lt;br /&gt;
    }&lt;br /&gt;
    changed(integer change)&lt;br /&gt;
    {&lt;br /&gt;
        if(change &amp;amp; CHANGED_OWNER)&lt;br /&gt;
        {&lt;br /&gt;
            llOwnerSay(&amp;quot;Under new management...resetting.&amp;quot;);&lt;br /&gt;
            llResetScript();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lady Sumoku</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Universal_Translator&amp;diff=1194982</id>
		<title>Universal Translator</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Universal_Translator&amp;diff=1194982"/>
		<updated>2015-01-25T02:47:39Z</updated>

		<summary type="html">&lt;p&gt;Lady Sumoku: Replaced old &amp;lt;LSL&amp;gt; block with &amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
This is the complete source code to the widely popular and free &amp;quot;HR Universal Translator&amp;quot; by [[Hank Ramos]].  This device is a dynamic public chat listener that automatically translates between 50+ languages and delivers translations of spoken text to those nearby that don&#039;t speak the language of the original speaker.&lt;br /&gt;
&lt;br /&gt;
Please help to further development on this open-source project. &lt;br /&gt;
&lt;br /&gt;
== Future Upgrades Needed ==&lt;br /&gt;
1. Support for Google Spellcheck.  Would be great to be able to spell-check chat first, and automatically do suggested corrections before the translation.&lt;br /&gt;
&lt;br /&gt;
2. Break the engine script into two or more scripts to allow for future expansion and to be able to handle low memory situations better.&lt;br /&gt;
&lt;br /&gt;
3. Support pseudo-instant message.  This could be done with avatars wearing the device within 100m of each others, or could be done world-wide using email or some other communications mechanism. Avatars would chat on a hidden channel, and would be able to communicate with another avatar or group chat.  Would require inworld servers of prims to link translators up together and find one another.&lt;br /&gt;
&lt;br /&gt;
4. Ensure that unicode is supported correctly.  Ensure that Right-to-Left languages are input and output correctly.  May need additional options since the SL client doesn&#039;t support this correctly and sometimes people speak backwards into SL chat to get around this.&lt;br /&gt;
&lt;br /&gt;
5. Rework auto-detection of language code. Should only automatically change the avatar&#039;s language if it is reliably predicted that they have changed languages.&lt;br /&gt;
&lt;br /&gt;
6. Add in automatic &amp;quot;spam&amp;quot; detection and prevent translation.  Find way to detect gesture &amp;quot;chat spam&amp;quot; and filter that out from the translation.  Filter out bad translations that only return the same or similar input.  Support replacement of common abbreviations or slang so that the google translation system can translate correctly.  May require support of a user-definable dictionary notecard.&lt;br /&gt;
&lt;br /&gt;
7. Handle translation errors from Google and resubmit the translation, rather than just ignoring it.&lt;br /&gt;
&lt;br /&gt;
8. Can you think of other improvements?&lt;br /&gt;
&lt;br /&gt;
= The Code =&lt;br /&gt;
The device consists of 3 key scripts, with several ancillary scripts to function.  The key scripts are listed here...&lt;br /&gt;
&lt;br /&gt;
==Universal Translator Engine==&lt;br /&gt;
This is the &amp;quot;heart&amp;quot; of the translator.  It handles communications with other translators, handles listening to avatars for chat, and handles most of the HTTP traffic.&lt;br /&gt;
&lt;br /&gt;
How do multiple translators communicate?  There are two chat channels at work...&lt;br /&gt;
&lt;br /&gt;
The heartbeat channel: this channel is fixed and common amongst all Universal Translators.  This is where each translator regularly announces its presence to other translators in the area.  If another one is found, a &amp;quot;master&#039; translator is elected at random (with higher version releases of the translators getting higher values).  The master translator is in charge of listening to all chat, and sending text to be translated and IMed to the recipient to the other &amp;quot;slave&amp;quot; translators.  &lt;br /&gt;
&lt;br /&gt;
Unique translator channel: each translator will select it&#039;s own channel to listen for incoming translations.  This serves as a unique conduit for the master translator to communicate with each individual slave.  This allows the heartbeat channel to be free for command messages to be sent, since the translated text being passed around can quickly saturate it.&lt;br /&gt;
&lt;br /&gt;
This multi-translator communication might be useful in other scripting projects.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
//Universal Translator&lt;br /&gt;
//Version 1.9.0&lt;br /&gt;
//November 12, 2009&lt;br /&gt;
//LSL Script copyright 2006-2009 by Hank Ramos&lt;br /&gt;
//Web Server Services powered by Google&lt;br /&gt;
&lt;br /&gt;
//Variables&lt;br /&gt;
list agentsInTranslation;&lt;br /&gt;
list agentsInTranslationOptions;&lt;br /&gt;
list requestList;&lt;br /&gt;
integer listenID;&lt;br /&gt;
&lt;br /&gt;
integer isMaster = 1;&lt;br /&gt;
integer autoLanguage = TRUE;&lt;br /&gt;
integer enabled = FALSE;&lt;br /&gt;
integer showTranslation = FALSE;&lt;br /&gt;
integer tranObjects = TRUE;&lt;br /&gt;
&lt;br /&gt;
integer lastHeartBeat;&lt;br /&gt;
list    languageCodes = [&lt;br /&gt;
&amp;quot;zh-CN&amp;quot;, &amp;quot;zh-TW&amp;quot;, &amp;quot;hr&amp;quot;,  &lt;br /&gt;
&amp;quot;bg&amp;quot;, &amp;quot;be&amp;quot;, &amp;quot;ca&amp;quot;,&lt;br /&gt;
&amp;quot;af&amp;quot;, &amp;quot;sq&amp;quot;, &amp;quot;ar&amp;quot;,   &lt;br /&gt;
&lt;br /&gt;
&amp;quot;tl&amp;quot;, &amp;quot;fr&amp;quot;, &amp;quot;gl&amp;quot;,    &lt;br /&gt;
&amp;quot;fi&amp;quot;, &amp;quot;en&amp;quot;, &amp;quot;et&amp;quot;,     &lt;br /&gt;
&amp;quot;cs&amp;quot;, &amp;quot;da&amp;quot;, &amp;quot;nl&amp;quot;,  &lt;br /&gt;
&lt;br /&gt;
&amp;quot;id&amp;quot;, &amp;quot;ga&amp;quot;, &amp;quot;it&amp;quot;,      &lt;br /&gt;
&amp;quot;hi&amp;quot;, &amp;quot;hu&amp;quot;, &amp;quot;is&amp;quot;, &lt;br /&gt;
&amp;quot;de&amp;quot;, &amp;quot;el&amp;quot;, &amp;quot;iw&amp;quot;,    &lt;br /&gt;
 &lt;br /&gt;
&amp;quot;mt&amp;quot;, &amp;quot;no&amp;quot;, &amp;quot;fa&amp;quot;,   &lt;br /&gt;
&amp;quot;lt&amp;quot;, &amp;quot;mk&amp;quot;, &amp;quot;ms&amp;quot;,   &lt;br /&gt;
&amp;quot;ja&amp;quot;, &amp;quot;ko&amp;quot;, &amp;quot;lv&amp;quot;,   &lt;br /&gt;
&lt;br /&gt;
&amp;quot;sl&amp;quot;, &amp;quot;es&amp;quot;, &amp;quot;sw&amp;quot;, &lt;br /&gt;
&amp;quot;ru&amp;quot;, &amp;quot;sr&amp;quot;, &amp;quot;sk&amp;quot;, &lt;br /&gt;
&amp;quot;pl&amp;quot;, &amp;quot;pt-PT&amp;quot;, &amp;quot;ro&amp;quot;, &lt;br /&gt;
&lt;br /&gt;
&amp;quot;yi&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;uk&amp;quot;, &amp;quot;vi&amp;quot;, &amp;quot;cy&amp;quot;,&lt;br /&gt;
&amp;quot;sv&amp;quot;,&amp;quot;th&amp;quot;, &amp;quot;tr&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
list    translators;&lt;br /&gt;
list    sayCache;&lt;br /&gt;
list    sayCachePrivate;&lt;br /&gt;
integer priorityNumber;&lt;br /&gt;
integer priorityNumListenID;&lt;br /&gt;
integer isInitialized = FALSE;&lt;br /&gt;
string  options;&lt;br /&gt;
&lt;br /&gt;
//Options&lt;br /&gt;
//integer debug = TRUE;&lt;br /&gt;
integer broadcastChannel = -9999999; //note this is not the channel used by the HR Universal Translator&lt;br /&gt;
string  password = &amp;quot;password&amp;quot;; //note this is not the password used to encrypt comms of the HR Universal Translator&lt;br /&gt;
integer version = 190;&lt;br /&gt;
sendIM(key id, string str)&lt;br /&gt;
{&lt;br /&gt;
    if (llGetParcelFlags(llGetPos()) &amp;amp; PARCEL_FLAG_ALLOW_SCRIPTS)&lt;br /&gt;
    {&lt;br /&gt;
        llMessageLinked(LINK_ALL_CHILDREN, 85234119, str, id); &lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        llMessageLinked(LINK_THIS, 85304563, str, id);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sendTextBatch(integer channel, string sendText)&lt;br /&gt;
{&lt;br /&gt;
    sendText = llXorBase64StringsCorrect(llStringToBase64(sendText), llStringToBase64(password));;&lt;br /&gt;
    while (llStringLength(sendText) &amp;gt; 508) //If string is 509 characters or longer &lt;br /&gt;
    {&lt;br /&gt;
        llSay(channel, llGetSubString(sendText, 0, 507)); //send 508 character chunk&lt;br /&gt;
        sendText = llGetSubString(sendText, 508, -1);  //delete 508 character chunk&lt;br /&gt;
    }&lt;br /&gt;
    llSay(channel, sendText);  //send out any remainder chunk or original chunk&lt;br /&gt;
    if (llStringLength(sendText) == 508)&lt;br /&gt;
        llSay(channel, (string)(channel*4958654));&lt;br /&gt;
    llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;0.25, 0, 0.25&amp;gt;, &amp;quot;&amp;quot;); &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string receiveTextBatch(key id, string message)&lt;br /&gt;
{&lt;br /&gt;
    integer listPos;&lt;br /&gt;
    string  tempString = &amp;quot;&amp;quot;;&lt;br /&gt;
    &lt;br /&gt;
    listPos = llListFindList(sayCache, [id]);&lt;br /&gt;
    if (listPos &amp;gt;= 0)&lt;br /&gt;
    {&lt;br /&gt;
        while (listPos &amp;gt;= 0)&lt;br /&gt;
        {&lt;br /&gt;
            tempString = tempString + llList2String(sayCache, listPos + 1);&lt;br /&gt;
            sayCache = llDeleteSubList(sayCache, listPos, listPos + 1);&lt;br /&gt;
            listPos = llListFindList(sayCache, [id]);&lt;br /&gt;
        }&lt;br /&gt;
        message = tempString + message;&lt;br /&gt;
    }&lt;br /&gt;
    message = llBase64ToString(llXorBase64StringsCorrect(message, llStringToBase64(password)));&lt;br /&gt;
    return message;&lt;br /&gt;
}&lt;br /&gt;
string receiveTextBatchPrivate(key id, string message)&lt;br /&gt;
{&lt;br /&gt;
    integer listPos;&lt;br /&gt;
    string  tempString = &amp;quot;&amp;quot;;&lt;br /&gt;
    &lt;br /&gt;
    listPos = llListFindList(sayCachePrivate, [id]);&lt;br /&gt;
    if (listPos &amp;gt;= 0)&lt;br /&gt;
    {&lt;br /&gt;
        while (listPos &amp;gt;= 0)&lt;br /&gt;
        {&lt;br /&gt;
            tempString = tempString + llList2String(sayCachePrivate, listPos + 1);&lt;br /&gt;
            sayCachePrivate = llDeleteSubList(sayCachePrivate, listPos, listPos + 1);&lt;br /&gt;
            listPos = llListFindList(sayCachePrivate, [id]);&lt;br /&gt;
        }&lt;br /&gt;
        message = tempString + message;&lt;br /&gt;
    }&lt;br /&gt;
    message = llBase64ToString(llXorBase64StringsCorrect(message, llStringToBase64(password)));&lt;br /&gt;
    return message;&lt;br /&gt;
}&lt;br /&gt;
updateTranslatorList()&lt;br /&gt;
{&lt;br /&gt;
    integer x;&lt;br /&gt;
    integer listLength;&lt;br /&gt;
    list    newList;&lt;br /&gt;
    string  tempString;&lt;br /&gt;
    integer newMaster;&lt;br /&gt;
    &lt;br /&gt;
    //Scan and remove translators not in the area&lt;br /&gt;
    for (x = 0; x &amp;lt; llGetListLength(translators); x += 2)&lt;br /&gt;
    {&lt;br /&gt;
        tempString = llList2String(llGetObjectDetails(llList2Key(translators, x + 1), [OBJECT_POS]), 0);&lt;br /&gt;
        if ((llVecDist(llGetPos(), (vector)tempString) &amp;lt;= 20.0) &amp;amp;&amp;amp; (tempString != &amp;quot;&amp;quot;))&lt;br /&gt;
            newList += llList2List(translators, x, x + 1);&lt;br /&gt;
    }&lt;br /&gt;
    translators = newList;&lt;br /&gt;
&lt;br /&gt;
    listLength = llGetListLength(translators);&lt;br /&gt;
    llMessageLinked(LINK_THIS, 65635544, (string)listLength, &amp;quot;&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    if (listLength == 0)&lt;br /&gt;
    {&lt;br /&gt;
        newMaster = 1;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        if (enabled)&lt;br /&gt;
        {&lt;br /&gt;
            newMaster = 2;&lt;br /&gt;
            for (x = 0; x &amp;lt; llGetListLength(translators); x += 2)&lt;br /&gt;
            {&lt;br /&gt;
                //llOwnerSay(&amp;quot;Checking Priority Number(&amp;quot; +  (string)priorityNumber + &amp;quot;): &amp;quot; + (string)llList2Integer(translators, x));&lt;br /&gt;
                if (llList2Integer(translators, x) &amp;gt; priorityNumber)&lt;br /&gt;
                {&lt;br /&gt;
                    newMaster = 0;&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            newMaster = 0;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if ((isMaster &amp;gt; 0) &amp;amp;&amp;amp; (newMaster == 0))&lt;br /&gt;
    {&lt;br /&gt;
        //We are being demoted from master to slave&lt;br /&gt;
        //Flush agentsInTranslation to master&lt;br /&gt;
        if (llGetListLength(agentsInTranslation) &amp;gt; 0)&lt;br /&gt;
        {&lt;br /&gt;
            //Demotion Dump of agentsInTranslation to Master&lt;br /&gt;
            sendTextBatch(broadcastChannel, llList2CSV([1003, llList2CSV(agentsInTranslation)]));&lt;br /&gt;
            if (isInitialized == FALSE) return;&lt;br /&gt;
            sendTextBatch(broadcastChannel, llList2CSV([1004, options])); //error&lt;br /&gt;
        }&lt;br /&gt;
        llListenRemove(listenID);&lt;br /&gt;
    }&lt;br /&gt;
    if ((isMaster == 0) &amp;amp;&amp;amp; (newMaster &amp;gt; 0))&lt;br /&gt;
    {&lt;br /&gt;
        llListenRemove(listenID);&lt;br /&gt;
        listenID = llListen(0, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;); &lt;br /&gt;
    }&lt;br /&gt;
    isMaster = newMaster;&lt;br /&gt;
    llMessageLinked(LINK_THIS, 34829304, (string)isMaster, &amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
sendHeartbeat()&lt;br /&gt;
{&lt;br /&gt;
    updateTranslatorList();&lt;br /&gt;
    sendTextBatch(broadcastChannel, llList2CSV([1001, priorityNumber]));&lt;br /&gt;
&lt;br /&gt;
    //Broadcast agentList to Slaves&lt;br /&gt;
    if (isMaster == 2)&lt;br /&gt;
    {&lt;br /&gt;
        sendTextBatch(broadcastChannel, llList2CSV([1002, llList2CSV(agentsInTranslation)]));&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Functions&lt;br /&gt;
checkThrottle(integer num, string msg, list params)&lt;br /&gt;
{&lt;br /&gt;
    integer x;&lt;br /&gt;
    integer maxCount;&lt;br /&gt;
    float   oldTime;&lt;br /&gt;
    float   sleepTime;&lt;br /&gt;
    list    newList;&lt;br /&gt;
    key     returnValue;&lt;br /&gt;
    integer channelToSpeak;&lt;br /&gt;
    &lt;br /&gt;
    //loop though list and remove items older than 25 seconds&lt;br /&gt;
    for (x = 0; x &amp;lt; llGetListLength(requestList); x += 1)&lt;br /&gt;
    {&lt;br /&gt;
        oldTime = llList2Float(requestList, x);&lt;br /&gt;
        //Construct new list with only times less than 25 seconds&lt;br /&gt;
        if ((llGetTime() - oldTime) &amp;lt;= 25.0) &lt;br /&gt;
            newList += oldTime;&lt;br /&gt;
    }&lt;br /&gt;
    requestList = newList;&lt;br /&gt;
    &lt;br /&gt;
    x = llGetListLength(requestList);&lt;br /&gt;
    &lt;br /&gt;
    //Shunt all translations to linked translators if master&lt;br /&gt;
    if (isMaster == 2)&lt;br /&gt;
    {&lt;br /&gt;
        if (num == 0)&lt;br /&gt;
        {&lt;br /&gt;
            //Send HTTP request to other translator&lt;br /&gt;
            //Send out Request to Random Translator Channel&lt;br /&gt;
&lt;br /&gt;
            channelToSpeak = llList2Integer(llListRandomize(llList2ListStrided(translators, 0, -1, 2), 1), 0);&lt;br /&gt;
            if (channelToSpeak &amp;gt; 0) &lt;br /&gt;
            {&lt;br /&gt;
                sendTextBatch(channelToSpeak, llList2CSV([num, llList2CSV(params)]) + &amp;quot;~&amp;quot; + msg);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (x == 19)&lt;br /&gt;
    {&lt;br /&gt;
        sleepTime =  25.0 - (llGetTime() - llList2Float(requestList, 0));&lt;br /&gt;
        if (sleepTime &amp;gt; 0) &lt;br /&gt;
        {&lt;br /&gt;
            llSleep(sleepTime);&lt;br /&gt;
        }&lt;br /&gt;
        requestList = llDeleteSubList(requestList, 0, 0);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    if (num == 0)&lt;br /&gt;
    {&lt;br /&gt;
        msg = &amp;quot;translate?v=1.0&amp;amp;q=&amp;quot; + msg;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
        msg = &amp;quot;detect?v=1.0&amp;amp;q=&amp;quot; + msg;&lt;br /&gt;
&lt;br /&gt;
    requestList += llGetTime();&lt;br /&gt;
    returnValue = llHTTPRequest(&amp;quot;http://ajax.googleapis.com/ajax/services/language/&amp;quot; + msg, [HTTP_METHOD, &amp;quot;GET&amp;quot;, HTTP_MIMETYPE, &amp;quot;plain/text;charset=utf-8&amp;quot;], &amp;quot; &amp;quot;);&lt;br /&gt;
    &lt;br /&gt;
    if (returnValue != NULL_KEY)&lt;br /&gt;
    {&lt;br /&gt;
        if (num == 0)&lt;br /&gt;
            llMessageLinked(LINK_THIS, 235365342, llList2CSV(params), returnValue); &lt;br /&gt;
        else&lt;br /&gt;
            llMessageLinked(LINK_THIS, 235365343, llList2CSV(params), returnValue); &lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        llSleep(40.0); //Something has gone horribly wrong, sleep 40 seconds to clear throttle&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string checkLanguage(string tempString)&lt;br /&gt;
{&lt;br /&gt;
    if      (llGetSubString(tempString, 0, 1) == &amp;quot;zh&amp;quot;)    tempString = &amp;quot;zh-CN&amp;quot;;&lt;br /&gt;
    else if (tempString == &amp;quot;und&amp;quot;)   tempString = &amp;quot;el&amp;quot;;&lt;br /&gt;
    else if (llListFindList(languageCodes, [tempString]) &amp;lt; 0) tempString = &amp;quot;&amp;quot;;&lt;br /&gt;
    tempString = llGetSubString(tempString, 0, 1);&lt;br /&gt;
    return tempString;&lt;br /&gt;
}&lt;br /&gt;
addAgent(key id, string language, integer recheckLangauge)&lt;br /&gt;
{&lt;br /&gt;
    integer listPos;&lt;br /&gt;
    integer listPosID;&lt;br /&gt;
    integer idNum;&lt;br /&gt;
    string  tempString;&lt;br /&gt;
&lt;br /&gt;
    listPos = llListFindList(agentsInTranslation, [id]);&lt;br /&gt;
    if (listPos &amp;lt; 0)&lt;br /&gt;
    {&lt;br /&gt;
        while (listPosID &amp;gt;= 0)&lt;br /&gt;
        {&lt;br /&gt;
            idNum = llRound(llFrand(2000000)) + 1;&lt;br /&gt;
            listPosID = llListFindList(agentsInTranslation, [idNum]);&lt;br /&gt;
        }&lt;br /&gt;
        agentsInTranslation += [id, language, recheckLangauge, idNum];&lt;br /&gt;
        llMessageLinked(LINK_THIS, 64562349, language, id);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
        agentsInTranslation = llListReplaceList(agentsInTranslation, [language, recheckLangauge], listPos + 1, listPos + 2);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string addNewAgent(key id)&lt;br /&gt;
{&lt;br /&gt;
    string speakerLanguage;&lt;br /&gt;
    &lt;br /&gt;
    if (llList2Key(llGetObjectDetails(id, [OBJECT_CREATOR]), 0) == NULL_KEY)&lt;br /&gt;
    {&lt;br /&gt;
        speakerLanguage  = checkLanguage(llGetAgentLanguage(id));&lt;br /&gt;
        if (speakerLanguage == &amp;quot;&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            speakerLanguage = &amp;quot;en&amp;quot;;&lt;br /&gt;
            addAgent(id, speakerLanguage, TRUE);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            addAgent(id, speakerLanguage, FALSE);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    return speakerLanguage;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
key getAgentKey(integer agentID)&lt;br /&gt;
{&lt;br /&gt;
    integer listPos = llListFindList(agentsInTranslation, [agentID]);&lt;br /&gt;
    if (listPos &amp;lt; 0)&lt;br /&gt;
    {&lt;br /&gt;
        return &amp;quot;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        return llList2Key(agentsInTranslation, listPos - 3);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
processHTTPResponse(integer type, string body, list params)&lt;br /&gt;
{&lt;br /&gt;
    integer listPos;&lt;br /&gt;
    list    recepientList;&lt;br /&gt;
    key     recepientID;&lt;br /&gt;
    string  recepientLanguage;&lt;br /&gt;
    string  languagePair;&lt;br /&gt;
    key     speakerID;&lt;br /&gt;
    string  speakerName;&lt;br /&gt;
    string  speakerLanguage;&lt;br /&gt;
    string  translatedText;&lt;br /&gt;
    string  tempString;&lt;br /&gt;
    integer x;&lt;br /&gt;
    integer speakerLanguageReliable;&lt;br /&gt;
    float   speakerLanguageConfidence;&lt;br /&gt;
    list    tempList;&lt;br /&gt;
    &lt;br /&gt;
    //===================&lt;br /&gt;
    //Process Translation&lt;br /&gt;
    //===================&lt;br /&gt;
    if (type == 0)&lt;br /&gt;
    {&lt;br /&gt;
        speakerID  = llList2Key(params, 1);&lt;br /&gt;
        speakerName = llKey2Name(speakerID);&lt;br /&gt;
        if (speakerName == &amp;quot;&amp;quot;)&lt;br /&gt;
            speakerName = llList2String(llGetObjectDetails(speakerID, [OBJECT_NAME]), 0);&lt;br /&gt;
        &lt;br /&gt;
        recepientList = llParseString2List(llList2String(params, 2), [&amp;quot;@&amp;quot;], []);&lt;br /&gt;
        tempList = llParseStringKeepNulls(llList2String(params, 3), [&amp;quot;|&amp;quot;],[]);&lt;br /&gt;
        recepientLanguage = llList2String(tempList, 1);&lt;br /&gt;
        languagePair = llDumpList2String(tempList, &amp;quot;&amp;gt;&amp;gt;&amp;quot;); &lt;br /&gt;
        &lt;br /&gt;
        //Perform Text Cleanup&lt;br /&gt;
        x = llSubStringIndex(body, &amp;quot;\&amp;quot;,\&amp;quot;detectedSourceLanguage\&amp;quot;:\&amp;quot;&amp;quot;); &lt;br /&gt;
        if (x &amp;gt;= 0)&lt;br /&gt;
        {&lt;br /&gt;
            translatedText  = llGetSubString(body,  llSubStringIndex(body, &amp;quot;{\&amp;quot;translatedText\&amp;quot;:\&amp;quot;&amp;quot;) + 18, x);&lt;br /&gt;
            speakerLanguage = checkLanguage(llGetSubString(body, x + 28, llSubStringIndex(body, &amp;quot;\&amp;quot;}, \&amp;quot;responseDetails\&amp;quot;:&amp;quot;) - 1));&lt;br /&gt;
            &lt;br /&gt;
            listPos = llListFindList(agentsInTranslation, [speakerID]);&lt;br /&gt;
            if (listPos &amp;gt;= 0)&lt;br /&gt;
            {&lt;br /&gt;
                if (speakerLanguage != llList2String(agentsInTranslation, listPos + 1))&lt;br /&gt;
                    agentsInTranslation = llListReplaceList(agentsInTranslation, [TRUE], listPos + 2, listPos + 2);  //Mark for recheck of actual spoken language.&lt;br /&gt;
            }                   &lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            translatedText = llGetSubString(body, llSubStringIndex(body, &amp;quot;{\&amp;quot;translatedText\&amp;quot;:\&amp;quot;&amp;quot;) + 18, llSubStringIndex(body, &amp;quot;\&amp;quot;}, \&amp;quot;responseDetails\&amp;quot;&amp;quot;));&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        //Reverse order if Recepient Language is Hebrew or Arabic&lt;br /&gt;
        if ((recepientLanguage == &amp;quot;iw&amp;quot;) || (recepientLanguage == &amp;quot;ar&amp;quot;))&lt;br /&gt;
        {  &lt;br /&gt;
            tempString = &amp;quot;&amp;quot;;&lt;br /&gt;
            for(x = llStringLength(translatedText);x &amp;gt;= 0; x--)&lt;br /&gt;
            {&lt;br /&gt;
                tempString += llGetSubString(translatedText, x, x); &lt;br /&gt;
            }&lt;br /&gt;
            translatedText = tempString;&lt;br /&gt;
        }                    &lt;br /&gt;
        tempString = speakerName + &amp;quot;(&amp;quot; + languagePair + &amp;quot;): &amp;quot; + translatedText;&lt;br /&gt;
        if (showTranslation)&lt;br /&gt;
            sendIM(speakerID, tempString);  &lt;br /&gt;
        for (x = 0; x &amp;lt; llGetListLength(recepientList); x += 1)&lt;br /&gt;
        {&lt;br /&gt;
            recepientID = getAgentKey(llList2Integer(recepientList, x));&lt;br /&gt;
            &lt;br /&gt;
            if (recepientID != &amp;quot;&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                recepientLanguage = llList2String(agentsInTranslation, llListFindList(agentsInTranslation, [recepientID]) + 1);&lt;br /&gt;
                if (recepientLanguage != speakerLanguage)&lt;br /&gt;
                    sendIM(recepientID, tempString);&lt;br /&gt;
            }  &lt;br /&gt;
        }&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    //===========================&lt;br /&gt;
    //Process Language Detection&lt;br /&gt;
    //===========================&lt;br /&gt;
    if (type == 1)&lt;br /&gt;
    {&lt;br /&gt;
        speakerID = llList2Key(params, 1);&lt;br /&gt;
        &lt;br /&gt;
        speakerLanguageReliable = llToLower(llGetSubString(body, llSubStringIndex(body, &amp;quot;\&amp;quot;,\&amp;quot;isReliable\&amp;quot;:&amp;quot;) + 15, llSubStringIndex(body, &amp;quot;,\&amp;quot;confidence\&amp;quot;:&amp;quot;) - 1)) == &amp;quot;true&amp;quot;;&lt;br /&gt;
        speakerLanguageConfidence = (float)llGetSubString(body, llSubStringIndex(body, &amp;quot;,\&amp;quot;confidence\&amp;quot;:&amp;quot;) + 14, llSubStringIndex(body, &amp;quot;}, \&amp;quot;responseDetails\&amp;quot;:&amp;quot;) - 1);&lt;br /&gt;
        &lt;br /&gt;
        listPos = llListFindList(agentsInTranslation, [speakerID]);&lt;br /&gt;
&lt;br /&gt;
        if (((listPos &amp;lt; 0) &amp;amp;&amp;amp; (speakerLanguageReliable) || (speakerLanguageConfidence &amp;gt;= 0.18)))&lt;br /&gt;
        {&lt;br /&gt;
            //Analyze Data&lt;br /&gt;
            tempString = checkLanguage(llToLower(llGetSubString(body, llSubStringIndex(body, &amp;quot;{\&amp;quot;language\&amp;quot;:\&amp;quot;&amp;quot;) + 13, llSubStringIndex(body, &amp;quot;\&amp;quot;,\&amp;quot;isReliable\&amp;quot;:&amp;quot;) - 1)));&lt;br /&gt;
            if (tempString == &amp;quot;&amp;quot;) return;&lt;br /&gt;
            &lt;br /&gt;
            if (speakerLanguageConfidence &amp;lt; 0.14)&lt;br /&gt;
                addAgent(speakerID, tempString, TRUE);&lt;br /&gt;
            else&lt;br /&gt;
                addAgent(speakerID, tempString, FALSE);&lt;br /&gt;
        }&lt;br /&gt;
    }    &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;
        //Multiplexor Initialization&lt;br /&gt;
        priorityNumber = version*1000000 + llRound(llFrand(499999) + 50000);&lt;br /&gt;
        llListen(broadcastChannel, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
        priorityNumListenID = llListen(priorityNumber, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
        &lt;br /&gt;
        //Send out initial heartbeat&lt;br /&gt;
        lastHeartBeat = llGetUnixTime();&lt;br /&gt;
        sendTextBatch(broadcastChannel, llList2CSV([1001, priorityNumber]));&lt;br /&gt;
        &lt;br /&gt;
        //Wait for the network to settle down&lt;br /&gt;
        llSetTimerEvent(5); &lt;br /&gt;
        //llSetTimerEvent(10 + ((1-llGetRegionTimeDilation()) * 1));       &lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    sensor(integer num_detected)&lt;br /&gt;
    {&lt;br /&gt;
        integer x;&lt;br /&gt;
        key     id;&lt;br /&gt;
&lt;br /&gt;
        for (x = 0; x &amp;lt; num_detected; x += 1)&lt;br /&gt;
        {&lt;br /&gt;
            id = llDetectedKey(x);&lt;br /&gt;
            if (llListFindList(agentsInTranslation, [id]) &amp;lt; 0)&lt;br /&gt;
            {&lt;br /&gt;
                addNewAgent(id);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    link_message(integer sender_num, integer num, string str, key id)&lt;br /&gt;
    {&lt;br /&gt;
        integer x;&lt;br /&gt;
        integer listPos;&lt;br /&gt;
        list    tempList;&lt;br /&gt;
        integer channelToSpeak;&lt;br /&gt;
        &lt;br /&gt;
        //Old Multiplexor&lt;br /&gt;
        if (num == 8434532)&lt;br /&gt;
        {&lt;br /&gt;
            enabled = (integer)str;&lt;br /&gt;
        }&lt;br /&gt;
        else if (num == 3342976)&lt;br /&gt;
        {&lt;br /&gt;
            //Send Preferences&lt;br /&gt;
            options = str;&lt;br /&gt;
            if (isInitialized == FALSE) return;&lt;br /&gt;
            tempList = llCSV2List(options);&lt;br /&gt;
            showTranslation = llList2Integer(tempList, 0);&lt;br /&gt;
            tranObjects = llList2Integer(tempList, 1);&lt;br /&gt;
            autoLanguage = llList2Integer(tempList, 2);&lt;br /&gt;
            sendTextBatch(broadcastChannel, llList2CSV([1004, options]));&lt;br /&gt;
&lt;br /&gt;
        }&lt;br /&gt;
        else if (num == 9384610)&lt;br /&gt;
        {&lt;br /&gt;
            if (isMaster == 0) //markering&lt;br /&gt;
                //llMessageLinked(LINK_THIS, 5598321, llList2CSV([id, str, FALSE]), &amp;quot;&amp;quot;);&lt;br /&gt;
                sendTextBatch(broadcastChannel, llList2CSV([1003, id, str, FALSE]));&lt;br /&gt;
            else&lt;br /&gt;
                addAgent(id, str, TRUE);&lt;br /&gt;
        }&lt;br /&gt;
        else if (num == 345149625)&lt;br /&gt;
        {&lt;br /&gt;
            //Return Translation&lt;br /&gt;
            processHTTPResponse(0, str, llCSV2List(id));&lt;br /&gt;
        }&lt;br /&gt;
        else if (num == 345149626)&lt;br /&gt;
        {&lt;br /&gt;
            //Return Detection&lt;br /&gt;
            processHTTPResponse(1, str, llCSV2List(id));&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        integer x;&lt;br /&gt;
        string  tempString;&lt;br /&gt;
        list    newList;&lt;br /&gt;
        integer translatorCount = llGetListLength(translators)/2;&lt;br /&gt;
        &lt;br /&gt;
        if (isInitialized == FALSE)&lt;br /&gt;
        {&lt;br /&gt;
            isInitialized = TRUE;&lt;br /&gt;
            enabled = TRUE;&lt;br /&gt;
            listenID = llListen(0, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;); &lt;br /&gt;
            llListen(777, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
        &lt;br /&gt;
            llMessageLinked(LINK_THIS, 6877259, (string)enabled, NULL_KEY);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        llMessageLinked(LINK_THIS, 94558323, llList2CSV(agentsInTranslation), &amp;quot;&amp;quot;);&lt;br /&gt;
        if (isMaster &amp;gt; 0)&lt;br /&gt;
        {&lt;br /&gt;
            for (x = 0; x &amp;lt; llGetListLength(agentsInTranslation); x += 4)&lt;br /&gt;
            {&lt;br /&gt;
                tempString = llList2String(llGetObjectDetails(llList2Key(agentsInTranslation, x), [OBJECT_POS]), 0);&lt;br /&gt;
                if ((llVecDist(llGetPos(), (vector)tempString) &amp;lt;= 20.0) &amp;amp;&amp;amp; (tempString != &amp;quot;&amp;quot;))&lt;br /&gt;
                    newList += llList2List(agentsInTranslation, x, x + 3);&lt;br /&gt;
            }&lt;br /&gt;
    &lt;br /&gt;
            agentsInTranslation = newList;&lt;br /&gt;
            if ((llGetUnixTime() - lastHeartBeat) &amp;gt;= 5)&lt;br /&gt;
            {&lt;br /&gt;
                //Send heartbeat&lt;br /&gt;
                sendHeartbeat();&lt;br /&gt;
                lastHeartBeat = llGetUnixTime();&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            if ((llGetUnixTime() - lastHeartBeat) &amp;gt;= 0 + llGetListLength(agentsInTranslation)*2 + llPow(translatorCount, 1.4) + translatorCount + ((1-llGetRegionTimeDilation()) * 5))&lt;br /&gt;
            {&lt;br /&gt;
                //Send heartbeat&lt;br /&gt;
                sendHeartbeat();&lt;br /&gt;
                lastHeartBeat = llGetUnixTime();&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
                    &lt;br /&gt;
        //turn on and off scanner&lt;br /&gt;
        if ((autoLanguage) &amp;amp;&amp;amp; (isMaster &amp;gt; 0))&lt;br /&gt;
        {&lt;br /&gt;
            llSensor(&amp;quot;&amp;quot;, NULL_KEY, AGENT, 20.0, PI);&lt;br /&gt;
        }&lt;br /&gt;
        //llSetTimerEvent(4 + ((1-llGetRegionTimeDilation()) * 5));&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    listen(integer channel, string name, key id, string message)&lt;br /&gt;
    {&lt;br /&gt;
        integer x;&lt;br /&gt;
        string  speakerLanguage;&lt;br /&gt;
        string  recepientLanguage;&lt;br /&gt;
        integer recepientID;&lt;br /&gt;
        integer listPos;&lt;br /&gt;
        string  languagePair;&lt;br /&gt;
        list    translationCache;&lt;br /&gt;
        list    tempList;&lt;br /&gt;
        integer ImessageType;&lt;br /&gt;
        string  Imessage;&lt;br /&gt;
        string  tempString;&lt;br /&gt;
        string  tempString2;&lt;br /&gt;
        &lt;br /&gt;
        //Multiplexor Code&lt;br /&gt;
        if ((channel == broadcastChannel) || (channel == priorityNumber))&lt;br /&gt;
        {&lt;br /&gt;
            //==========================&lt;br /&gt;
            //Process Proxy HTTP Request&lt;br /&gt;
            //==========================&lt;br /&gt;
&lt;br /&gt;
            if (channel == priorityNumber)&lt;br /&gt;
            {&lt;br /&gt;
                if (llStringLength(message) &amp;gt;= 508)&lt;br /&gt;
                {&lt;br /&gt;
                    if (((integer)message/channel) != 4958654)&lt;br /&gt;
                    {&lt;br /&gt;
                        sayCachePrivate += [id, message];&lt;br /&gt;
                        return; &lt;br /&gt;
                    }&lt;br /&gt;
                    message = &amp;quot;&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                message = receiveTextBatchPrivate(id, message);&lt;br /&gt;
                //Received packet to translate&lt;br /&gt;
                llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;0.25, 0.05, 0.25&amp;gt;, &amp;quot;&amp;quot;);&lt;br /&gt;
                &lt;br /&gt;
                tempList = llParseString2List(message, [&amp;quot;~&amp;quot;], []);&lt;br /&gt;
                tempString = llList2String(tempList, 0);&lt;br /&gt;
                tempList = llDeleteSubList(tempList, 0, 0);&lt;br /&gt;
&lt;br /&gt;
                tempString2 = llDumpList2String(tempList, &amp;quot;|&amp;quot;);&lt;br /&gt;
                tempList = llCSV2List(tempString);&lt;br /&gt;
                listPos = llList2Integer(tempList, 0);&lt;br /&gt;
                tempList = llDeleteSubList(tempList, 0, 0);&lt;br /&gt;
&lt;br /&gt;
                checkThrottle(listPos, tempString2, tempList);&lt;br /&gt;
&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            //=======================&lt;br /&gt;
            //Process Global Messages&lt;br /&gt;
            //=======================&lt;br /&gt;
            if (llStringLength(message) &amp;gt;= 508)&lt;br /&gt;
            {&lt;br /&gt;
                if (((integer)message/channel) != 4958654)&lt;br /&gt;
                {&lt;br /&gt;
                    sayCache += [id, message];&lt;br /&gt;
                    return; &lt;br /&gt;
                }&lt;br /&gt;
                message = &amp;quot;&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
            message = receiveTextBatch(id, message);&lt;br /&gt;
            &lt;br /&gt;
            tempList = llCSV2List(message);&lt;br /&gt;
            &lt;br /&gt;
            if (llGetListLength(tempList) &amp;gt;= 2)    &lt;br /&gt;
            {&lt;br /&gt;
                ImessageType = llList2Integer(tempList, 0);&lt;br /&gt;
                tempList = llDeleteSubList(tempList, 0, 0);&lt;br /&gt;
                Imessage = llList2CSV(tempList);        &lt;br /&gt;
            &lt;br /&gt;
                llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;0.25, 0, 0.25&amp;gt;, &amp;quot;&amp;quot;);&lt;br /&gt;
                //Process Message Here&lt;br /&gt;
                if (ImessageType == 1001)&lt;br /&gt;
                {&lt;br /&gt;
                    //Incoming Heartbeat&lt;br /&gt;
                    if ((integer)Imessage == priorityNumber)&lt;br /&gt;
                    {&lt;br /&gt;
                        llOwnerSay(&amp;quot;Priority Number Conflict!  Resetting Script...&amp;quot;);&lt;br /&gt;
                        llResetScript(); //Reset if conflicting priority number&lt;br /&gt;
                    }&lt;br /&gt;
                    listPos = llListFindList(translators, [id]);&lt;br /&gt;
                    if (listPos &amp;lt; 0) &lt;br /&gt;
                    {&lt;br /&gt;
                        translators += [(integer)Imessage, id];&lt;br /&gt;
                        if ((isMaster &amp;gt; 0) &amp;amp;&amp;amp; (isInitialized))&lt;br /&gt;
                        {&lt;br /&gt;
                            sendTextBatch((integer)Imessage, llList2CSV([1002, llList2CSV(agentsInTranslation)]));&lt;br /&gt;
                            sendTextBatch((integer)Imessage, llList2CSV([1004, options]));&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                    else&lt;br /&gt;
                    {&lt;br /&gt;
                        translators = llListReplaceList(translators, [(integer)Imessage], listPos - 1, listPos - 1);&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                else if (ImessageType == 1002)&lt;br /&gt;
                {&lt;br /&gt;
                    //Incoming agentsInTranslation Master Broadcast&lt;br /&gt;
                    if (isMaster == 0)&lt;br /&gt;
                    {&lt;br /&gt;
                        //llMessageLinked(LINK_THIS, 9458021, Imessage, &amp;quot;&amp;quot;);  &lt;br /&gt;
                        tempList = llCSV2List(Imessage);&lt;br /&gt;
                        agentsInTranslation = [];&lt;br /&gt;
                        for (x = 0; x &amp;lt; llGetListLength(tempList); x += 4)&lt;br /&gt;
                        {&lt;br /&gt;
                            agentsInTranslation += [llList2Key(tempList, x), llList2String(tempList, x + 1), llList2Integer(tempList, x + 2), llList2Integer(tempList, x + 3)];&lt;br /&gt;
                        }&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                else if (ImessageType == 1003)&lt;br /&gt;
                {&lt;br /&gt;
                    //Incoming agentsInTranslation dump from Slave&lt;br /&gt;
                    tempList = llCSV2List(Imessage);&lt;br /&gt;
                    for (x = 0; x &amp;lt; llGetListLength(tempList); x += 4)&lt;br /&gt;
                    {&lt;br /&gt;
                        addAgent(llList2Key(tempList, x), llList2String(tempList, x + 1), llList2Integer(tempList, x + 2));&lt;br /&gt;
                    }&lt;br /&gt;
                }&lt;br /&gt;
                else if (ImessageType == 1004)&lt;br /&gt;
                {&lt;br /&gt;
                    //Incoming Preferences&lt;br /&gt;
                    options = Imessage;&lt;br /&gt;
                    tempList = llCSV2List(options);&lt;br /&gt;
                    showTranslation = llList2Integer(tempList, 0);&lt;br /&gt;
                    tranObjects = llList2Integer(tempList, 1);&lt;br /&gt;
                    autoLanguage = llList2Integer(tempList, 2);&lt;br /&gt;
&lt;br /&gt;
                    llMessageLinked(LINK_THIS, 3342977, Imessage, &amp;quot;&amp;quot;);  &lt;br /&gt;
                }&lt;br /&gt;
            }            &lt;br /&gt;
            &lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        //Translator Engine Code&lt;br /&gt;
        if ((llToLower(message) == &amp;quot;translator&amp;quot;) &amp;amp;&amp;amp; (isMaster &amp;gt; 0)) &lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_THIS, 2540664, message, id);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        if ((!enabled) &amp;amp;&amp;amp; (isMaster == 1)) return;&lt;br /&gt;
        &lt;br /&gt;
        if (!tranObjects)&lt;br /&gt;
        {&lt;br /&gt;
            if (llList2Key(llGetObjectDetails(id, [OBJECT_CREATOR]), 0) != NULL_KEY) return;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        listPos = llListFindList(agentsInTranslation, [id]);&lt;br /&gt;
        if (listPos &amp;gt;= 0)&lt;br /&gt;
        {            &lt;br /&gt;
            speakerLanguage = llList2String(agentsInTranslation, listPos + 1);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            speakerLanguage = addNewAgent(id);&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        if (speakerLanguage == &amp;quot;xx&amp;quot;) return;  //Agent Opt-Out&lt;br /&gt;
        &lt;br /&gt;
        llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;1, 1, 0&amp;gt;, &amp;quot;&amp;quot;);&lt;br /&gt;
        //===============================&lt;br /&gt;
        //Formulate Translation Requests&lt;br /&gt;
        //===============================&lt;br /&gt;
        for (x = 0; x &amp;lt; llGetListLength(agentsInTranslation); x += 4)&lt;br /&gt;
        {&lt;br /&gt;
            //Loop through translation group and do appropriate translations as needed&lt;br /&gt;
            recepientID = llList2Integer(agentsInTranslation, x + 3);&lt;br /&gt;
            recepientLanguage =  checkLanguage(llList2Key(agentsInTranslation, x + 1)); &lt;br /&gt;
            if ((speakerLanguage != recepientLanguage) &amp;amp;&amp;amp; (recepientLanguage != &amp;quot;&amp;quot;) &amp;amp;&amp;amp; (recepientLanguage != &amp;quot;xx&amp;quot;))&lt;br /&gt;
            {&lt;br /&gt;
                languagePair = speakerLanguage + &amp;quot;|&amp;quot; + recepientLanguage;&lt;br /&gt;
                    &lt;br /&gt;
                listPos = llListFindList(translationCache, [languagePair]);&lt;br /&gt;
                if (listPos &amp;lt; 0)&lt;br /&gt;
                  translationCache += [languagePair, recepientID];&lt;br /&gt;
                else&lt;br /&gt;
                  translationCache = llListReplaceList(translationCache, [llList2String(translationCache, listPos + 1) + &amp;quot;@&amp;quot; + (string)recepientID], listPos + 1, listPos + 1);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    &lt;br /&gt;
        //Process Requests&lt;br /&gt;
        if (llGetListLength(translationCache) &amp;gt; 0)&lt;br /&gt;
        {&lt;br /&gt;
            for (x = 0; x &amp;lt; llGetListLength(translationCache); x += 2)&lt;br /&gt;
            {&lt;br /&gt;
                //====================================&lt;br /&gt;
                //Translation&lt;br /&gt;
                //====================================&lt;br /&gt;
                //Forumulate and Send Translation Request&lt;br /&gt;
                languagePair = &amp;quot;|&amp;quot; + llList2String(llParseStringKeepNulls(llList2String(translationCache, x), [&amp;quot;|&amp;quot;],[]), 1); &lt;br /&gt;
                checkThrottle(0, llEscapeURL(message) + &amp;quot;&amp;amp;langpair=&amp;quot; + llEscapeURL(languagePair), [llGetTime(), id , llList2String(translationCache, x + 1), llList2String(translationCache, x)]);&lt;br /&gt;
            } &lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
            speakerLanguage = &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        //====================================&lt;br /&gt;
        //Language Detection&lt;br /&gt;
        //====================================&lt;br /&gt;
        if (llList2Key(llGetObjectDetails(id, [OBJECT_CREATOR]), 0) == NULL_KEY)&lt;br /&gt;
        {&lt;br /&gt;
            if (((speakerLanguage == &amp;quot;&amp;quot;) || (llList2Integer(agentsInTranslation, llListFindList(agentsInTranslation, [id]) + 2) == TRUE)) || (isMaster == 2))&lt;br /&gt;
            {&lt;br /&gt;
                //Forumulate and Send Language Detect Request&lt;br /&gt;
                checkThrottle(1, llEscapeURL(message), [llGetTime(), id]);&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;
        string  tempString;&lt;br /&gt;
&lt;br /&gt;
        if (status != 200) &lt;br /&gt;
        {&lt;br /&gt;
            //llOwnerSay(&amp;quot;WWW Error:&amp;quot; + (string)status);&lt;br /&gt;
            llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;1, 0, 0&amp;gt;, &amp;quot;&amp;quot;);&lt;br /&gt;
            //llOwnerSay(body);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        //Process Resonse Code&lt;br /&gt;
        tempString = llGetSubString(body, llSubStringIndex(body, &amp;quot;\&amp;quot;responseStatus\&amp;quot;:&amp;quot;), -1);&lt;br /&gt;
        status = (integer)llGetSubString(tempString, 17, llSubStringIndex(tempString, &amp;quot;}&amp;quot;) - 1);&lt;br /&gt;
        if (status != 200)&lt;br /&gt;
        {&lt;br /&gt;
            //llOwnerSay(&amp;quot;Language Server Returned Error Code: &amp;quot; + (string)status);&lt;br /&gt;
            //llOwnerSay(body);&lt;br /&gt;
            llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;1, 0, 0&amp;gt;, &amp;quot;&amp;quot;);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        llMessageLinked(LINK_ALL_CHILDREN, 6634934, (string)&amp;lt;0, 0, 1&amp;gt;, &amp;quot;&amp;quot;);&lt;br /&gt;
        llMessageLinked(LINK_THIS, 345149624, body, request_id);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==HTTP Handler==&lt;br /&gt;
Even though the name of this script is &amp;quot;HTTP Handler&amp;quot;, it really just stores the requested translation traffic so that we can match incoming translations from Google with what was requested.  Since this takes a lot of memory for storage, this information is kept out of the engine script.  When an incoming HTTP response comes in, we fetch the data from here.  If the requests didn&#039;t come back in a timely fashion, we remove it from the queue.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
//HTTP Handler&lt;br /&gt;
//Copyright 2006-2009 by Hank Ramos&lt;br /&gt;
&lt;br /&gt;
list requestedTranslations;&lt;br /&gt;
list requestedDetections;&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSetTimerEvent(5);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        integer x;&lt;br /&gt;
        list    newList;&lt;br /&gt;
        float timeElapsed; &lt;br /&gt;
        &lt;br /&gt;
        for (x = 0; x &amp;lt; llGetListLength(requestedDetections); x += 2)&lt;br /&gt;
        {&lt;br /&gt;
            timeElapsed = llGetTime() - llList2Float(llCSV2List(llList2String(requestedDetections, x + 1)), 0);&lt;br /&gt;
            if (timeElapsed &amp;lt; 60.0) &lt;br /&gt;
                newList += llList2List(requestedDetections, x, x + 1);&lt;br /&gt;
        }&lt;br /&gt;
        requestedDetections = newList;&lt;br /&gt;
        newList = [];&lt;br /&gt;
        for (x = 0; x &amp;lt; llGetListLength(requestedTranslations); x += 2)&lt;br /&gt;
        {&lt;br /&gt;
            timeElapsed = llGetTime() - llList2Float(llCSV2List(llList2String(requestedTranslations, x + 1)), 0);&lt;br /&gt;
            if (timeElapsed &amp;lt; 60.0) &lt;br /&gt;
            {&lt;br /&gt;
                newList += llList2List(requestedTranslations, x, x + 1);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        requestedTranslations = newList;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    link_message(integer sender_num, integer num, string str, key id)&lt;br /&gt;
    {&lt;br /&gt;
        integer listPos;&lt;br /&gt;
        &lt;br /&gt;
        if (num == 235365342)&lt;br /&gt;
        {&lt;br /&gt;
            //Translation&lt;br /&gt;
            requestedTranslations += [id, str];&lt;br /&gt;
        }&lt;br /&gt;
        else if (num == 235365343)&lt;br /&gt;
        {&lt;br /&gt;
            //Detection&lt;br /&gt;
            requestedDetections += [id, str];&lt;br /&gt;
        }&lt;br /&gt;
        else if (num == 345149624)&lt;br /&gt;
        {&lt;br /&gt;
            listPos = llListFindList(requestedTranslations, [id]);&lt;br /&gt;
            if (listPos &amp;gt;= 0)&lt;br /&gt;
            {&lt;br /&gt;
                llMessageLinked(LINK_THIS, 345149625, str, llList2String(requestedTranslations, listPos + 1));&lt;br /&gt;
                requestedTranslations = llDeleteSubList(requestedTranslations, listPos, listPos + 1);&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
            &lt;br /&gt;
            listPos = llListFindList(requestedDetections, [id]);&lt;br /&gt;
            if (listPos &amp;gt;= 0)&lt;br /&gt;
            {&lt;br /&gt;
                llMessageLinked(LINK_THIS, 345149626, str, llList2String(requestedDetections, listPos + 1));&lt;br /&gt;
                requestedDetections = llDeleteSubList(requestedDetections, listPos, listPos + 1);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Interface Handler==&lt;br /&gt;
This is the interface, or menu-system of the translator.  It handles all of the numerous dialogs, language selection, etc. of the translator.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
//Menu System&lt;br /&gt;
//Copyright 2006-2009 by Hank Ramos&lt;br /&gt;
&lt;br /&gt;
//Variables&lt;br /&gt;
integer randomDialogChannel;&lt;br /&gt;
integer lastAttachPoint;&lt;br /&gt;
list    detectedAgentKeyList;&lt;br /&gt;
list    detectedAgentNameList;&lt;br /&gt;
key     agentInDialog;&lt;br /&gt;
integer isInitialized = FALSE;&lt;br /&gt;
list    agentsInTranslation;&lt;br /&gt;
integer translatorCount;&lt;br /&gt;
&lt;br /&gt;
//Options&lt;br /&gt;
integer groupAccess    = FALSE;&lt;br /&gt;
integer autoLanguage   = TRUE;&lt;br /&gt;
integer deviceAttached;&lt;br /&gt;
integer enabled        = FALSE;&lt;br /&gt;
integer isShowTran     = FALSE;&lt;br /&gt;
integer showAgents     = TRUE;&lt;br /&gt;
string  displayStringMD5;&lt;br /&gt;
integer isMaster = 1;&lt;br /&gt;
integer tranObjects = TRUE;&lt;br /&gt;
&lt;br /&gt;
//Constants&lt;br /&gt;
list    languages= [&lt;br /&gt;
&amp;quot;Chinese-Simple&amp;quot;, &amp;quot;Chinese-Trad&amp;quot;, &amp;quot;Croatian&amp;quot;,  &lt;br /&gt;
&amp;quot;Bulgarian&amp;quot;, &amp;quot;Belarusian&amp;quot;, &amp;quot;Catlan&amp;quot;,&lt;br /&gt;
&amp;quot;Afrikaans&amp;quot;, &amp;quot;Albanian&amp;quot;, &amp;quot;Arabic&amp;quot;,   &lt;br /&gt;
&lt;br /&gt;
&amp;quot;Filipino&amp;quot;, &amp;quot;French&amp;quot;, &amp;quot;Galician&amp;quot;,    &lt;br /&gt;
&amp;quot;Finnish&amp;quot;, &amp;quot;English&amp;quot;, &amp;quot;Estonian&amp;quot;,     &lt;br /&gt;
&amp;quot;Czech&amp;quot;, &amp;quot;Danish&amp;quot;, &amp;quot;Dutch&amp;quot;,  &lt;br /&gt;
&lt;br /&gt;
&amp;quot;Indonesian&amp;quot;, &amp;quot;Irish&amp;quot;, &amp;quot;Italian&amp;quot;,      &lt;br /&gt;
&amp;quot;Hindi&amp;quot;, &amp;quot;Hungarian&amp;quot;, &amp;quot;Icelandic&amp;quot;, &lt;br /&gt;
&amp;quot;German&amp;quot;, &amp;quot;Greek&amp;quot;, &amp;quot;Hebrew&amp;quot;,    &lt;br /&gt;
 &lt;br /&gt;
&amp;quot;Maltese&amp;quot;, &amp;quot;Norwegian&amp;quot;, &amp;quot;Persian&amp;quot;,   &lt;br /&gt;
&amp;quot;Lithuanian&amp;quot;, &amp;quot;Macedonian&amp;quot;, &amp;quot;Malay&amp;quot;,   &lt;br /&gt;
&amp;quot;Japanese&amp;quot;, &amp;quot;Korean&amp;quot;, &amp;quot;Latvian&amp;quot;,   &lt;br /&gt;
&lt;br /&gt;
&amp;quot;Slovenian&amp;quot;, &amp;quot;Spanish&amp;quot;, &amp;quot;Swahili&amp;quot;, &lt;br /&gt;
&amp;quot;Russian&amp;quot;, &amp;quot;Serbian&amp;quot;, &amp;quot;Slovak&amp;quot;, &lt;br /&gt;
&amp;quot;Polish&amp;quot;, &amp;quot;Portuguese&amp;quot;, &amp;quot;Romanian&amp;quot;, &lt;br /&gt;
&lt;br /&gt;
&amp;quot;Yiddish&amp;quot;, &amp;quot;\t     &amp;quot;, &amp;quot;\t     &amp;quot;,&lt;br /&gt;
&amp;quot;Ukrainian&amp;quot;, &amp;quot;Vietnamese&amp;quot;, &amp;quot;Welsh&amp;quot;,&lt;br /&gt;
&amp;quot;Swedish&amp;quot;, &amp;quot;Thai&amp;quot;, &amp;quot;Turkish&amp;quot;];&lt;br /&gt;
&lt;br /&gt;
list    languageCodes = [&lt;br /&gt;
&amp;quot;zh-CN&amp;quot;, &amp;quot;zh-TW&amp;quot;, &amp;quot;hr&amp;quot;,  &lt;br /&gt;
&amp;quot;bg&amp;quot;, &amp;quot;be&amp;quot;, &amp;quot;ca&amp;quot;,&lt;br /&gt;
&amp;quot;af&amp;quot;, &amp;quot;sq&amp;quot;, &amp;quot;ar&amp;quot;,   &lt;br /&gt;
&lt;br /&gt;
&amp;quot;tl&amp;quot;, &amp;quot;fr&amp;quot;, &amp;quot;gl&amp;quot;,    &lt;br /&gt;
&amp;quot;fi&amp;quot;, &amp;quot;en&amp;quot;, &amp;quot;et&amp;quot;,     &lt;br /&gt;
&amp;quot;cs&amp;quot;, &amp;quot;da&amp;quot;, &amp;quot;nl&amp;quot;,  &lt;br /&gt;
&lt;br /&gt;
&amp;quot;id&amp;quot;, &amp;quot;ga&amp;quot;, &amp;quot;it&amp;quot;,      &lt;br /&gt;
&amp;quot;hi&amp;quot;, &amp;quot;hu&amp;quot;, &amp;quot;is&amp;quot;, &lt;br /&gt;
&amp;quot;de&amp;quot;, &amp;quot;el&amp;quot;, &amp;quot;iw&amp;quot;,    &lt;br /&gt;
 &lt;br /&gt;
&amp;quot;mt&amp;quot;, &amp;quot;no&amp;quot;, &amp;quot;fa&amp;quot;,   &lt;br /&gt;
&amp;quot;lt&amp;quot;, &amp;quot;mk&amp;quot;, &amp;quot;ms&amp;quot;,   &lt;br /&gt;
&amp;quot;ja&amp;quot;, &amp;quot;ko&amp;quot;, &amp;quot;lv&amp;quot;,   &lt;br /&gt;
&lt;br /&gt;
&amp;quot;sl&amp;quot;, &amp;quot;es&amp;quot;, &amp;quot;sw&amp;quot;, &lt;br /&gt;
&amp;quot;ru&amp;quot;, &amp;quot;sr&amp;quot;, &amp;quot;sk&amp;quot;, &lt;br /&gt;
&amp;quot;pl&amp;quot;, &amp;quot;pt-PT&amp;quot;, &amp;quot;ro&amp;quot;, &lt;br /&gt;
&lt;br /&gt;
&amp;quot;yi&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;,&lt;br /&gt;
&amp;quot;uk&amp;quot;, &amp;quot;vi&amp;quot;, &amp;quot;cy&amp;quot;,&lt;br /&gt;
&amp;quot;sv&amp;quot;, &amp;quot;th&amp;quot;, &amp;quot;tr&amp;quot;];&lt;br /&gt;
  &lt;br /&gt;
//Functions&lt;br /&gt;
//Takes in the offsets, and the attach point &lt;br /&gt;
vector fn_makePos(integer attach_point, vector offset) {&lt;br /&gt;
    if ((attach_point == 31) || (attach_point == 35)) { //center 2 &amp;amp; center        &lt;br /&gt;
        return &amp;lt;0,0,0&amp;gt;;&lt;br /&gt;
    } else if (attach_point == 32) { // Top right&lt;br /&gt;
        return &amp;lt;offset.x, offset.y, offset.z * -1&amp;gt;;&lt;br /&gt;
    } else if (attach_point == 33) { // Top&lt;br /&gt;
        return &amp;lt;offset.x, 0, offset.z * -1&amp;gt;;&lt;br /&gt;
    } else if (attach_point == 34) { // Top Left&lt;br /&gt;
        return &amp;lt;offset.x, offset.y * -1, offset.z * -1&amp;gt;;&lt;br /&gt;
    } else if (attach_point == 36) { // Bottom Left&lt;br /&gt;
        return &amp;lt;offset.x, offset.y * -1 , offset.z&amp;gt;;&lt;br /&gt;
    } else if (attach_point == 37) { // Bottom&lt;br /&gt;
        return &amp;lt;offset.x, 0, offset.z&amp;gt;;&lt;br /&gt;
    } else if (attach_point == 38) { // Bottom Right - Baseline&lt;br /&gt;
        return offset;&lt;br /&gt;
    } else { //Not a HUD point? Then return it&#039;s current pos&lt;br /&gt;
        return llGetLocalPos();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
updateDisplay()&lt;br /&gt;
{&lt;br /&gt;
    string  tempString;&lt;br /&gt;
    integer listLength;&lt;br /&gt;
    integer x;&lt;br /&gt;
    string  agentName;&lt;br /&gt;
    &lt;br /&gt;
    if (isInitialized == FALSE) return;&lt;br /&gt;
    tempString = &amp;quot;Universal Translator&amp;quot;;&lt;br /&gt;
    if (isMaster != 1)&lt;br /&gt;
        tempString += &amp;quot; (Link-&amp;quot; + (string)(translatorCount + 1) + &amp;quot;)&amp;quot;;&lt;br /&gt;
    tempString += &amp;quot;\n===============&amp;quot;;&lt;br /&gt;
    &lt;br /&gt;
    if (enabled) &lt;br /&gt;
    {&lt;br /&gt;
        listLength = llGetListLength(agentsInTranslation);&lt;br /&gt;
        if (((showAgents) &amp;amp;&amp;amp; (listLength &amp;lt;= 40)) &amp;amp;&amp;amp; (listLength != 0))&lt;br /&gt;
        {&lt;br /&gt;
            for (x = 0; x &amp;lt; listLength; x += 4)&lt;br /&gt;
            {&lt;br /&gt;
                agentName = llList2String(llGetObjectDetails(llList2Key(agentsInTranslation, x), [OBJECT_NAME]), 0);&lt;br /&gt;
                if (llStringLength(agentName) &amp;gt; 25)&lt;br /&gt;
                    agentName = llGetSubString(agentName, 0, 24);&lt;br /&gt;
                if (agentName != &amp;quot;&amp;quot;)&lt;br /&gt;
                    tempString += &amp;quot;\n&amp;quot; + agentName + &amp;quot;(&amp;quot; + llList2String(agentsInTranslation, x + 1) + &amp;quot;)&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            tempString += &amp;quot;\n# Agents Translated: &amp;quot; + (string)llRound(listLength/3);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        tempString += &amp;quot;\n&amp;gt;&amp;gt; Disabled &amp;lt;&amp;lt;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (llMD5String(tempString, 0) != displayStringMD5)&lt;br /&gt;
    {&lt;br /&gt;
        displayStringMD5 = llMD5String(tempString, 0);&lt;br /&gt;
        llSetText(tempString, &amp;lt;1,1,1&amp;gt;, 1);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
showMainMenu(key id)&lt;br /&gt;
{&lt;br /&gt;
    if (isInitialized == FALSE) return;&lt;br /&gt;
    integer avatarParticipating;&lt;br /&gt;
    list buttonList = [&amp;quot;Language&amp;quot;, &amp;quot;Help&amp;quot;];&lt;br /&gt;
    string dialogMsg = &amp;quot;Main Menu\nLANGUAGE: manually choose your source language. Target languages are detected automatically\nHELP: get help notecard&amp;quot;;&lt;br /&gt;
    buttonList += &amp;quot;FREE Copy&amp;quot;;&lt;br /&gt;
    dialogMsg += &amp;quot;\nFREE COPY: receive FREE copy of Universal Translator.&amp;quot;; &lt;br /&gt;
     &lt;br /&gt;
    if (llList2String(agentsInTranslation, llListFindList(agentsInTranslation, [(string)id]) + 1) != &amp;quot;xx&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        buttonList += &amp;quot;Opt-Out&amp;quot;;&lt;br /&gt;
        dialogMsg += &amp;quot;\nOPT-OUT: disable receipt of translations&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        buttonList += &amp;quot;Opt-In&amp;quot;;&lt;br /&gt;
        dialogMsg += &amp;quot;\nOPT-IN: join the translations&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (id == llGetOwner())&lt;br /&gt;
    {&lt;br /&gt;
        buttonList += &amp;quot;Donate&amp;quot;;&lt;br /&gt;
        dialogMsg += &amp;quot;\nDONATE: donate L$ to the developer of Universal Translator.&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    if ((id == llGetOwner()) || ((groupAccess) &amp;amp;&amp;amp; (llSameGroup(id))))&lt;br /&gt;
    {&lt;br /&gt;
        buttonList += &amp;quot;Reset&amp;quot;;&lt;br /&gt;
        buttonList += &amp;quot;Options&amp;quot;;&lt;br /&gt;
        buttonList += &amp;quot;Send Copy&amp;quot;;&lt;br /&gt;
        dialogMsg += &amp;quot;\nSEND COPY: send FREE copy of Universal Translator.&amp;quot;; &lt;br /&gt;
&lt;br /&gt;
        if (enabled)&lt;br /&gt;
        {&lt;br /&gt;
            buttonList += &amp;quot;Disable&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            buttonList += &amp;quot;Enable&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        dialogMsg += &amp;quot;\nRESET: reset all scripts in translator&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    llDialog(id, dialogMsg, buttonList, randomDialogChannel);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
showOptionsMenu(key id)&lt;br /&gt;
{&lt;br /&gt;
    integer avatarParticipating;&lt;br /&gt;
    list buttonList = [];&lt;br /&gt;
    string dialogMsg = &amp;quot;Options Menu.&amp;quot;;&lt;br /&gt;
    if (id == llGetOwner())&lt;br /&gt;
    {&lt;br /&gt;
        if (groupAccess)&lt;br /&gt;
        {&lt;br /&gt;
            buttonList += &amp;quot;Group OFF&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            buttonList += &amp;quot;Group ON&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        dialogMsg += &amp;quot;\nGROUP: allow group members to admin.&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    if ((id == llGetOwner()) || ((groupAccess) &amp;amp;&amp;amp; (llSameGroup(id))))&lt;br /&gt;
    {&lt;br /&gt;
        buttonList += &amp;quot;Main Menu&amp;quot;;&lt;br /&gt;
        if (!deviceAttached)&lt;br /&gt;
        {&lt;br /&gt;
            if (autoLanguage)&lt;br /&gt;
            {&lt;br /&gt;
                buttonList += &amp;quot;Scan OFF&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                buttonList += &amp;quot;Scan ON&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        dialogMsg += &amp;quot;\nSCAN: scan for Avatars and automatically add to translation matrix.&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        if (isShowTran)&lt;br /&gt;
        {&lt;br /&gt;
            buttonList += &amp;quot;Echo OFF&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            buttonList += &amp;quot;Echo ON&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        dialogMsg += &amp;quot;\nECHO: show translations of your chat sent to others.&amp;quot;; &lt;br /&gt;
&lt;br /&gt;
        &lt;br /&gt;
        if (tranObjects)&lt;br /&gt;
        {&lt;br /&gt;
            buttonList += &amp;quot;Objects OFF&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            buttonList += &amp;quot;Objects ON&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        dialogMsg += &amp;quot;\nOBJECTS: translate chat of scripted objects&amp;quot;; &lt;br /&gt;
&lt;br /&gt;
        if (showAgents)&lt;br /&gt;
        {&lt;br /&gt;
            buttonList += &amp;quot;Agents OFF&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            buttonList += &amp;quot;Agents ON&amp;quot;;&lt;br /&gt;
        }&lt;br /&gt;
        dialogMsg += &amp;quot;\nAGENTS: show list of agents translated.&amp;quot;; &lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    llDialog(id, dialogMsg, buttonList, randomDialogChannel);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
showLanguageDialog1(key id)&lt;br /&gt;
{&lt;br /&gt;
    llDialog(id, &amp;quot;Select your TARGET language...&amp;quot;, [&amp;quot;\t&amp;quot;, &amp;quot;\t&amp;quot;, &amp;quot;&amp;gt;&amp;gt; NEXT&amp;quot;] + llList2List(languages, 0, 8),  randomDialogChannel);&lt;br /&gt;
}&lt;br /&gt;
showLanguageDialog2(key id)&lt;br /&gt;
{&lt;br /&gt;
    llDialog(id, &amp;quot;Select your TARGET language..&amp;quot;, [&amp;quot;&amp;lt;&amp;lt; BACK&amp;quot;, &amp;quot;\t &amp;quot;, &amp;quot;&amp;gt;&amp;gt; NEXT &amp;quot;] + llList2List(languages, 9, 17),  randomDialogChannel);&lt;br /&gt;
}&lt;br /&gt;
showLanguageDialog3(key id)&lt;br /&gt;
{&lt;br /&gt;
    llDialog(id, &amp;quot;Select your TARGET language..&amp;quot;, [&amp;quot;&amp;lt;&amp;lt; BACK &amp;quot;, &amp;quot;\t  &amp;quot;, &amp;quot;&amp;gt;&amp;gt; NEXT  &amp;quot;] + llList2List(languages, 18, 26),  randomDialogChannel);&lt;br /&gt;
}&lt;br /&gt;
showLanguageDialog4(key id)&lt;br /&gt;
{&lt;br /&gt;
    llDialog(id, &amp;quot;Select your TARGET language..&amp;quot;, [&amp;quot;&amp;lt;&amp;lt; BACK  &amp;quot;, &amp;quot;\t   &amp;quot;, &amp;quot;&amp;gt;&amp;gt; NEXT   &amp;quot;] + llList2List(languages, 27, 35),  randomDialogChannel);&lt;br /&gt;
}&lt;br /&gt;
showLanguageDialog5(key id)&lt;br /&gt;
{&lt;br /&gt;
    llDialog(id, &amp;quot;Select your TARGET language..&amp;quot;, [&amp;quot;&amp;lt;&amp;lt; BACK   &amp;quot;, &amp;quot;\t    &amp;quot;, &amp;quot;&amp;gt;&amp;gt; NEXT    &amp;quot;] + llList2List(languages, 36, 44),  randomDialogChannel);&lt;br /&gt;
}showLanguageDialog6(key id)&lt;br /&gt;
{&lt;br /&gt;
    llDialog(id, &amp;quot;Select your TARGET language..&amp;quot;, [&amp;quot;&amp;lt;&amp;lt; BACK    &amp;quot;, &amp;quot;\t     &amp;quot;, &amp;quot;\t     &amp;quot;] + llList2List(languages, 45, 53),  randomDialogChannel);&lt;br /&gt;
}&lt;br /&gt;
processListen(string name, key id, string message)&lt;br /&gt;
{&lt;br /&gt;
    key listenKey;&lt;br /&gt;
    &lt;br /&gt;
    if (llListFindList(languages, [message]) &amp;gt; -1) //Language Selected in Dialog&lt;br /&gt;
    {&lt;br /&gt;
        if (message != &amp;quot;&amp;quot;) llMessageLinked(LINK_THIS, 9384610, llList2String(languageCodes, llListFindList(languages, [message])), id);&lt;br /&gt;
    }    &lt;br /&gt;
    else if (llToLower(message) == &amp;quot;help&amp;quot;) &lt;br /&gt;
    {&lt;br /&gt;
        llGiveInventory(id, &amp;quot;Universal Translator Help&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    else if (message == &amp;quot;Main Menu&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        showMainMenu(id);&lt;br /&gt;
    }&lt;br /&gt;
    else if (message == &amp;quot;Options&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        showOptionsMenu(id);&lt;br /&gt;
    }&lt;br /&gt;
    else if (message == &amp;quot;Language&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        showLanguageDialog1(id);&lt;br /&gt;
    }&lt;br /&gt;
    else if (message == &amp;quot;Opt-In&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        showLanguageDialog1(id);&lt;br /&gt;
    }&lt;br /&gt;
    else if (message == &amp;quot;Opt-Out&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        llMessageLinked(LINK_THIS, 9384610, &amp;quot;xx&amp;quot;, id);&lt;br /&gt;
    }&lt;br /&gt;
    else if (message == &amp;quot;FREE Copy&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        llMessageLinked(LINK_THIS, 9455209, llKey2Name(id), id);&lt;br /&gt;
    }&lt;br /&gt;
    if (id == llGetOwner())&lt;br /&gt;
    {&lt;br /&gt;
        if (message == &amp;quot;Group ON&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            groupAccess = TRUE;&lt;br /&gt;
            showMainMenu(id);&lt;br /&gt;
        }&lt;br /&gt;
        else if (message == &amp;quot;Group OFF&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            groupAccess = FALSE;&lt;br /&gt;
            showMainMenu(id);&lt;br /&gt;
        }&lt;br /&gt;
        else if (message == &amp;quot;Donate&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            llMessageLinked(LINK_THIS, 324235353254, &amp;quot;&amp;quot;, llGetOwner());&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    if ((id == llGetOwner()) || ((groupAccess) &amp;amp;&amp;amp; (llSameGroup(id))))&lt;br /&gt;
    {&lt;br /&gt;
        if (message == &amp;quot;Reset&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
           llResetScript();&lt;br /&gt;
        }&lt;br /&gt;
        else if (message == &amp;quot;Enable&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            enabled  = TRUE;&lt;br /&gt;
            llMessageLinked(LINK_THIS, 8434532, (string)enabled, id);&lt;br /&gt;
        }&lt;br /&gt;
        else if (message == &amp;quot;Disable&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            enabled  = FALSE;&lt;br /&gt;
            llMessageLinked(LINK_THIS, 8434532, (string)enabled, id);&lt;br /&gt;
        }&lt;br /&gt;
        else if (message == &amp;quot;Echo ON&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            isShowTran = TRUE;&lt;br /&gt;
            //llMessageLinked(LINK_THIS, 2734322, (string)isShowTran, id);&lt;br /&gt;
        }&lt;br /&gt;
        else if (message == &amp;quot;Echo OFF&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            isShowTran = FALSE;&lt;br /&gt;
       }&lt;br /&gt;
        else if (message == &amp;quot;Objects OFF&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            tranObjects = FALSE;&lt;br /&gt;
        }&lt;br /&gt;
        else if (message == &amp;quot;Objects ON&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            tranObjects = TRUE;&lt;br /&gt;
        }&lt;br /&gt;
        else if (message == &amp;quot;Agents OFF&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            showAgents = FALSE;&lt;br /&gt;
            llMessageLinked(LINK_THIS, 455832, (string)showAgents, id);&lt;br /&gt;
        }&lt;br /&gt;
        else if (message == &amp;quot;Agents ON&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            showAgents = TRUE;&lt;br /&gt;
            llMessageLinked(LINK_THIS, 455832, (string)showAgents, id);&lt;br /&gt;
        }&lt;br /&gt;
        else if (message == &amp;quot;Scan ON&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            autoLanguage  = TRUE;&lt;br /&gt;
            showMainMenu(id);&lt;br /&gt;
        }&lt;br /&gt;
        else if (message == &amp;quot;Scan OFF&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            autoLanguage = FALSE;&lt;br /&gt;
            showMainMenu(id);&lt;br /&gt;
        }&lt;br /&gt;
        else if ((message == &amp;quot;Send Copy&amp;quot;) || (message == &amp;quot;&amp;gt;&amp;gt;RESCAN&amp;lt;&amp;lt;&amp;quot;))&lt;br /&gt;
        {        &lt;br /&gt;
            agentInDialog = id;&lt;br /&gt;
            llSensor(&amp;quot;&amp;quot;, NULL_KEY, AGENT, 20.0, TWO_PI);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            if (llGetListLength(detectedAgentNameList) &amp;gt; 0)&lt;br /&gt;
            {&lt;br /&gt;
                listenKey = llList2Key(detectedAgentKeyList, llListFindList(detectedAgentNameList, [message]));&lt;br /&gt;
                if (listenKey != &amp;quot;&amp;quot;)&lt;br /&gt;
                {&lt;br /&gt;
                    llMessageLinked(LINK_THIS, 9455209, message, listenKey);&lt;br /&gt;
                }&lt;br /&gt;
                detectedAgentNameList = [];&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    if (message == &amp;quot;&amp;gt;&amp;gt; NEXT&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        showLanguageDialog2(id);&lt;br /&gt;
    }&lt;br /&gt;
    else if (message == &amp;quot;&amp;gt;&amp;gt; NEXT &amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        showLanguageDialog3(id);&lt;br /&gt;
    }&lt;br /&gt;
    else if (message == &amp;quot;&amp;gt;&amp;gt; NEXT  &amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        showLanguageDialog4(id);&lt;br /&gt;
    }&lt;br /&gt;
    else if (message == &amp;quot;&amp;gt;&amp;gt; NEXT   &amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        showLanguageDialog5(id);&lt;br /&gt;
    }&lt;br /&gt;
    else if (message == &amp;quot;&amp;gt;&amp;gt; NEXT    &amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        showLanguageDialog6(id);&lt;br /&gt;
    }&lt;br /&gt;
    else if (message == &amp;quot;&amp;lt;&amp;lt; BACK&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        showLanguageDialog1(id);&lt;br /&gt;
    }&lt;br /&gt;
    else if (message == &amp;quot;&amp;lt;&amp;lt; BACK &amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        showLanguageDialog2(id);&lt;br /&gt;
    }&lt;br /&gt;
    else if (message == &amp;quot;&amp;lt;&amp;lt; BACK  &amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        showLanguageDialog3(id);&lt;br /&gt;
    }&lt;br /&gt;
    else if (message == &amp;quot;&amp;lt;&amp;lt; BACK   &amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        showLanguageDialog4(id);&lt;br /&gt;
    }&lt;br /&gt;
    else if (message == &amp;quot;&amp;lt;&amp;lt; BACK    &amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        showLanguageDialog5(id);&lt;br /&gt;
    }&lt;br /&gt;
    if (message == &amp;quot;\t&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        showLanguageDialog1(id);&lt;br /&gt;
    }&lt;br /&gt;
    else if (message == &amp;quot;\t &amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        showLanguageDialog2(id);&lt;br /&gt;
    }&lt;br /&gt;
    else if (message == &amp;quot;\t  &amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        showLanguageDialog3(id);&lt;br /&gt;
    }&lt;br /&gt;
    else if (message == &amp;quot;\t   &amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        showLanguageDialog4(id);&lt;br /&gt;
    }&lt;br /&gt;
    else if (message == &amp;quot;\t    &amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        showLanguageDialog5(id);&lt;br /&gt;
    }&lt;br /&gt;
    else if (message == &amp;quot;\t     &amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        showLanguageDialog6(id);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    llMessageLinked(LINK_THIS, 3342976, llList2CSV([isShowTran, tranObjects, autoLanguage]), id);&lt;br /&gt;
}&lt;br /&gt;
checkAttach()&lt;br /&gt;
{&lt;br /&gt;
    if (llGetAttached() &amp;gt; 0)&lt;br /&gt;
    {&lt;br /&gt;
        llSetScale(&amp;lt;0.125, 0.125, 0.087&amp;gt;);&lt;br /&gt;
        if(lastAttachPoint != llGetAttached())&lt;br /&gt;
        {&lt;br /&gt;
            llSetPos(fn_makePos(llGetAttached(), &amp;lt;0.00000, 0.13500, 0.15433&amp;gt;));&lt;br /&gt;
            llSetRot(&amp;lt;0,0,0,1&amp;gt;);&lt;br /&gt;
            lastAttachPoint = llGetAttached();                &lt;br /&gt;
        }&lt;br /&gt;
        llRequestPermissions(llGetOwner(), PERMISSION_TAKE_CONTROLS);&lt;br /&gt;
        llMessageLinked(llGetLinkNumber(), 3792114, (string)TRUE, NULL_KEY);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        llSetScale(&amp;lt;0.5, 0.5, 0.750&amp;gt;);&lt;br /&gt;
        llReleaseControls();&lt;br /&gt;
        llMessageLinked(llGetLinkNumber(), 3792114, (string)FALSE, NULL_KEY);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    run_time_permissions(integer perms)&lt;br /&gt;
    {&lt;br /&gt;
        //integer hasPerms = llGetPermissions();&lt;br /&gt;
        llTakeControls( CONTROL_UP , TRUE, TRUE);&lt;br /&gt;
    }&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        //llRequestPermissions(llGetOwner(),PERMISSION_TAKE_CONTROLS );&lt;br /&gt;
        &lt;br /&gt;
        string speakerLanguage;&lt;br /&gt;
        //llOwnerSay(&amp;quot;Welcome to the Universal Translator, the best FREE translator in SL! Please consider making a L$ donation to help with maintenance and further updates. Select DONATE in the translator menu to make a donation.&amp;quot;);&lt;br /&gt;
        //llSetText(&amp;quot;Initializing...&amp;quot;, &amp;lt;1,1,1&amp;gt;, 1);&lt;br /&gt;
    &lt;br /&gt;
        llSetText(&amp;quot;Searching for\nnearby translators...&amp;quot;, &amp;lt;1,1,1&amp;gt;, 1);&lt;br /&gt;
        checkAttach();&lt;br /&gt;
        &lt;br /&gt;
        randomDialogChannel = -(integer)llFrand(2147483647);&lt;br /&gt;
&lt;br /&gt;
        llMessageLinked(LINK_SET, 20957454, &amp;quot;&amp;quot;, NULL_KEY);&lt;br /&gt;
        llResetOtherScript(&amp;quot;Universal Translator Engine&amp;quot;);&lt;br /&gt;
        llResetOtherScript(&amp;quot;HTTP Handler&amp;quot;);&lt;br /&gt;
        llResetOtherScript(&amp;quot;No-Script IM Handler&amp;quot;);&lt;br /&gt;
        llResetOtherScript(&amp;quot;Auto-Update&amp;quot;);&lt;br /&gt;
        llResetOtherScript(&amp;quot;Donation&amp;quot;);&lt;br /&gt;
        &lt;br /&gt;
        //Other Setup&lt;br /&gt;
        llSleep(5);&lt;br /&gt;
        llListen(randomDialogChannel, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);&lt;br /&gt;
        llMessageLinked(LINK_THIS, 3342976, llList2CSV([isShowTran, tranObjects, autoLanguage]), &amp;quot;&amp;quot;);        &lt;br /&gt;
&lt;br /&gt;
        //llOwnerSay(&amp;quot;Mem Free=&amp;quot; + (string)llGetFreeMemory());&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    on_rez(integer startup_param)&lt;br /&gt;
    {&lt;br /&gt;
        //checkAttach();&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    sensor(integer num_detected)&lt;br /&gt;
    {&lt;br /&gt;
        integer x;&lt;br /&gt;
        string  tempString;&lt;br /&gt;
        &lt;br /&gt;
        if (num_detected &amp;gt; 11)&lt;br /&gt;
            num_detected = 11;&lt;br /&gt;
        &lt;br /&gt;
        detectedAgentKeyList = [];&lt;br /&gt;
        detectedAgentNameList = [];&lt;br /&gt;
        for (x = 0; x &amp;lt; num_detected; x += 1)&lt;br /&gt;
        {&lt;br /&gt;
             detectedAgentKeyList += llDetectedKey(x);&lt;br /&gt;
             tempString = llDetectedName(x);&lt;br /&gt;
             if (llStringLength(tempString) &amp;gt; 24) tempString = llGetSubString(tempString, 0, 23);&lt;br /&gt;
             detectedAgentNameList += tempString;&lt;br /&gt;
        }&lt;br /&gt;
        if (llGetListLength(detectedAgentNameList) &amp;gt; 0)&lt;br /&gt;
        {&lt;br /&gt;
            llDialog(agentInDialog, &amp;quot;Select someone nearby to receive FREE a copy of the Universal Translator...&amp;quot;, [&amp;quot;&amp;gt;&amp;gt;RESCAN&amp;lt;&amp;lt;&amp;quot;] + detectedAgentNameList, randomDialogChannel);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    link_message(integer sender_num, integer num, string str, key id)&lt;br /&gt;
    {&lt;br /&gt;
        integer listPos;&lt;br /&gt;
        list    tempList;&lt;br /&gt;
        string  tempString;&lt;br /&gt;
        &lt;br /&gt;
        if (num == 2540664)&lt;br /&gt;
        {&lt;br /&gt;
            showMainMenu(id);&lt;br /&gt;
        }&lt;br /&gt;
        else if (num == 3792114)&lt;br /&gt;
        {&lt;br /&gt;
            deviceAttached = (integer)str;&lt;br /&gt;
            if (deviceAttached) autoLanguage = TRUE;&lt;br /&gt;
        }&lt;br /&gt;
        else if (num == 65635544)&lt;br /&gt;
        {&lt;br /&gt;
            translatorCount = ((integer)str)/2;&lt;br /&gt;
        }&lt;br /&gt;
        else if (num == 6877259)&lt;br /&gt;
        {&lt;br /&gt;
            if (isInitialized == FALSE)&lt;br /&gt;
            {&lt;br /&gt;
                isInitialized = TRUE;&lt;br /&gt;
                //Owner Language Detection&lt;br /&gt;
                tempString  = llGetAgentLanguage(llGetOwner());&lt;br /&gt;
                if (llGetSubString(tempString, 0, 1) == &amp;quot;en&amp;quot;) tempString = &amp;quot;en&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                if (tempString == &amp;quot;&amp;quot;) &lt;br /&gt;
                {&lt;br /&gt;
                    tempString = &amp;quot;en&amp;quot;;&lt;br /&gt;
                }&lt;br /&gt;
                llMessageLinked(LINK_THIS, 9384610, tempString, llGetOwner());&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
          enabled = (integer)str; //marker&lt;br /&gt;
          updateDisplay();&lt;br /&gt;
        }&lt;br /&gt;
        else if (num == 34829304)&lt;br /&gt;
        {&lt;br /&gt;
            isMaster = (integer)str;&lt;br /&gt;
            updateDisplay();&lt;br /&gt;
        }&lt;br /&gt;
        else if (num == 455832)&lt;br /&gt;
        {&lt;br /&gt;
            showAgents = (integer)str;&lt;br /&gt;
            updateDisplay();&lt;br /&gt;
        }&lt;br /&gt;
        else if (num == 94558323)&lt;br /&gt;
        {&lt;br /&gt;
            agentsInTranslation = llCSV2List(str);&lt;br /&gt;
            updateDisplay();&lt;br /&gt;
        }&lt;br /&gt;
        else if (num == 3342977)&lt;br /&gt;
        {&lt;br /&gt;
            //Options are Show Tran and tranObjects at this time&lt;br /&gt;
            tempList = llCSV2List(str);&lt;br /&gt;
            isShowTran = llList2Integer(tempList, 0);&lt;br /&gt;
            tranObjects = llList2Integer(tempList, 1);&lt;br /&gt;
            autoLanguage = llList2Integer(tempList, 2);&lt;br /&gt;
       }&lt;br /&gt;
        else if (num == 32364364)&lt;br /&gt;
        {&lt;br /&gt;
            //Send Options&lt;br /&gt;
            llMessageLinked(LINK_THIS, 8434532, (string)enabled, NULL_KEY);            &lt;br /&gt;
        }&lt;br /&gt;
   }&lt;br /&gt;
    &lt;br /&gt;
    touch_start(integer num_detected)&lt;br /&gt;
    {&lt;br /&gt;
        integer x;&lt;br /&gt;
        key avatarKey;&lt;br /&gt;
        &lt;br /&gt;
        for (x = 0; x &amp;lt; num_detected; x++)&lt;br /&gt;
        {&lt;br /&gt;
            avatarKey = llDetectedKey(x);&lt;br /&gt;
            showMainMenu(avatarKey);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    listen(integer channel, string name, key id, string message)&lt;br /&gt;
    {                &lt;br /&gt;
        processListen(name, id, message);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    attach(key id)&lt;br /&gt;
    {&lt;br /&gt;
        checkAttach();&lt;br /&gt;
        if (id) //tests if it is a valid key and not NULL_KEY&lt;br /&gt;
        {&lt;br /&gt;
            llRequestPermissions(llGetOwner(),PERMISSION_TAKE_CONTROLS );&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    control(key id,integer held, integer change) {&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lady Sumoku</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=BuildSlurl_(NewAge)&amp;diff=1194981</id>
		<title>BuildSlurl (NewAge)</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=BuildSlurl_(NewAge)&amp;diff=1194981"/>
		<updated>2015-01-25T02:44:57Z</updated>

		<summary type="html">&lt;p&gt;Lady Sumoku: Replaced old &amp;lt;LSL&amp;gt; block with &amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
A way of creating SLURL&#039;s by using a pre-made function;&lt;br /&gt;
 BuildSlurl(string region_name, vector pos);&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Pre-made Function&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
string BuildSlurl(string region_name, vector pos){&lt;br /&gt;
    return &amp;quot;secondlife://&amp;quot; + llEscapeURL(region_name) &lt;br /&gt;
            + &amp;quot;/&amp;quot;+ (string)((integer)pos.x) &lt;br /&gt;
            + &amp;quot;/&amp;quot;+ (string)((integer)pos.y) &lt;br /&gt;
            + &amp;quot;/&amp;quot;+ (string)(llCeil(pos.z));&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Example Script&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
string BuildSlurl(string region_name, vector pos){&lt;br /&gt;
    return &amp;quot;secondlife://&amp;quot; + llEscapeURL(region_name) &lt;br /&gt;
            + &amp;quot;/&amp;quot;+ (string)((integer)pos.x) &lt;br /&gt;
            + &amp;quot;/&amp;quot;+ (string)((integer)pos.y) &lt;br /&gt;
            + &amp;quot;/&amp;quot;+ (string)(llCeil(pos.z));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    touch_start(integer x)&lt;br /&gt;
    {&lt;br /&gt;
        llWhisper(0, BuildSlurl(llGetRegionName(), llGetPos()));&lt;br /&gt;
        //Returns slurl like this;&lt;br /&gt;
        //       secondlife://Phoenix%20Rising/214/160/24&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lady Sumoku</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=RLV_Collision_Grabber&amp;diff=1194980</id>
		<title>RLV Collision Grabber</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=RLV_Collision_Grabber&amp;diff=1194980"/>
		<updated>2015-01-25T02:43:47Z</updated>

		<summary type="html">&lt;p&gt;Lady Sumoku: Replaced old &amp;lt;LSL&amp;gt; block with &amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
==Introduction==&lt;br /&gt;
This script placed in a prim makes that prim a collision detector that tries to force sit the colliding avatar on a set target using RLV.&lt;br /&gt;
&lt;br /&gt;
The victim needs [[LSL_Protocol/RestrainedLoveAPI|RLV]] and a relay to be grabbed by the script. &lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
/* This program is free software. It comes without any warranty, to&lt;br /&gt;
 * the extent permitted by applicable law. You can redistribute it&lt;br /&gt;
 * and/or modify it under the terms of the Do What The Fuck You Want&lt;br /&gt;
 * To Public License, Version 2, as published by Sam Hocevar. See&lt;br /&gt;
 * http://sam.zoy.org/wtfpl/COPYING for more details. */ &lt;br /&gt;
 &lt;br /&gt;
/* Place the script in the prim you want to turn into the sensor.&lt;br /&gt;
 * The object will then detect collisions and tries to&lt;br /&gt;
 * force sit and lock the victim on the set target (see below).&lt;br /&gt;
 * It also tries to detect and lock people who just sit on the target&lt;br /&gt;
 * Feel free to contact me, Vala Vella, if you have questions &lt;br /&gt;
 * If you use this in your project I&#039;d like to hear about it :) */&lt;br /&gt;
&lt;br /&gt;
key     target = &amp;quot;00000000-0000-0000-0000-000000000000&amp;quot;; // UUID of the target object the victim will sit on. Must contain any sit script&lt;br /&gt;
integer sitscan = TRUE; // try to detect and lock people who sit manually (TRUE/FALSE)&lt;br /&gt;
integer lockseconds = 30; // time in seconds the victim will be locked to the target&lt;br /&gt;
integer sleeptime = 10; // time in seconds the victim has to leave the area after being freed to avoid instant regrabbing&lt;br /&gt;
// do not set sleeptime to 0!&lt;br /&gt;
&lt;br /&gt;
//=======================================================================================================================//&lt;br /&gt;
&lt;br /&gt;
key     victim = NULL_KEY; //current victim&lt;br /&gt;
integer freetime; //end of timer as unix timestamp&lt;br /&gt;
list    queue; // list for queueing victims in case more than one walk into the trap&lt;br /&gt;
&lt;br /&gt;
integer RLVchan = -1812221819; //RLV Relay channel. do NOT change!&lt;br /&gt;
integer commchan; // channel to listen for client answers&lt;br /&gt;
float   targetmass; // mass of the target to check if someone is sitting&lt;br /&gt;
string  locktime; // lock time in human readable format&lt;br /&gt;
integer locked; // TRUE if someone is locked up&lt;br /&gt;
integer sitting; // TRUE is the victim is sitting on target (checked via RLV) &lt;br /&gt;
&lt;br /&gt;
debug(string txt)&lt;br /&gt;
{&lt;br /&gt;
    // uncomment the next line to see debugging messages&lt;br /&gt;
    //llSay(DEBUG_CHANNEL, &amp;quot;DEBUG-INFO: &amp;quot;+txt);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
relay(string type,key victim,string command) //send command to relay&lt;br /&gt;
{&lt;br /&gt;
    llRegionSayTo(victim, RLVchan, type+&amp;quot;,&amp;quot;+(string)victim+&amp;quot;,&amp;quot;+command);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
next() //process next entry in queue&lt;br /&gt;
{&lt;br /&gt;
    debug(&amp;quot;next()&amp;quot;);&lt;br /&gt;
    if (llGetObjectMass(target) &amp;gt; targetmass) //stop here if someone is sitting on the object&lt;br /&gt;
    {&lt;br /&gt;
        debug(&amp;quot;Someone is sitting&amp;quot;);&lt;br /&gt;
        queue = [];&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    if (victim == NULL_KEY &amp;amp;&amp;amp; llGetListLength(queue) &amp;gt; 0)&lt;br /&gt;
    {&lt;br /&gt;
        key this = llList2Key(queue, 0);&lt;br /&gt;
        if (llVecDist(llList2Vector(llGetObjectDetails(this, [OBJECT_POS]), 0), llGetPos() ) &amp;lt; 10.0)&lt;br /&gt;
        {&lt;br /&gt;
            locked = FALSE;&lt;br /&gt;
            sitting = FALSE;&lt;br /&gt;
            relay(&amp;quot;sit&amp;quot;, llList2Key(queue, 0), &amp;quot;@sit:&amp;quot;+(string)target+&amp;quot;=force&amp;quot;);&lt;br /&gt;
            llSetTimerEvent(10);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            queue = llDeleteSubList(queue, 0, 0);&lt;br /&gt;
            next();&lt;br /&gt;
        }&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;
        list    objectinfo = llGetObjectDetails(target, [OBJECT_NAME, OBJECT_POS]);&lt;br /&gt;
        if (llList2Vector(objectinfo, 1) != &amp;lt;0,0,0&amp;gt;) //check if target exists&lt;br /&gt;
        {&lt;br /&gt;
            targetmass = llGetObjectMass(target);&lt;br /&gt;
            locktime = (string)llFloor((float)lockseconds / 60)+&amp;quot; minutes&amp;quot;;&lt;br /&gt;
            if (lockseconds%60) locktime += &amp;quot;, &amp;quot;+(string)(lockseconds%60)+&amp;quot; seconds&amp;quot;;&lt;br /&gt;
            llOwnerSay(&amp;quot;Set to target: &amp;quot;+llList2String(objectinfo, 0));&lt;br /&gt;
            llOwnerSay(&amp;quot;Locktime: &amp;quot;+locktime);&lt;br /&gt;
            commchan = (integer)(&amp;quot;0x&amp;quot;+llGetSubString((string)llGetKey(), 0, 6))+(integer)&amp;quot;0x70000000&amp;quot;;&lt;br /&gt;
            debug(&amp;quot;command channel: &amp;quot;+(string)commchan);&lt;br /&gt;
            debug(&amp;quot;object mass: &amp;quot;+(string)targetmass);&lt;br /&gt;
            llListen(RLVchan, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;);&lt;br /&gt;
            llListen(commchan, &amp;quot;&amp;quot;, victim, &amp;quot;&amp;quot;);&lt;br /&gt;
            llVolumeDetect(TRUE);&lt;br /&gt;
            llSetTimerEvent(10);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            llOwnerSay(&amp;quot;Set target not found. Please edit the script and check the settings&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    on_rez(integer num)&lt;br /&gt;
    {&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    collision_start(integer num)&lt;br /&gt;
    {&lt;br /&gt;
        debug ((string)num+&amp;quot; collisions&amp;quot;);&lt;br /&gt;
        if (!locked)&lt;br /&gt;
        {&lt;br /&gt;
            while (num)&lt;br /&gt;
            {&lt;br /&gt;
                num--;&lt;br /&gt;
                if (!~llListFindList(queue, [llDetectedKey(num)]) &amp;amp;&amp;amp; victim == NULL_KEY) //if detected agent is not queued and no victim queue them &lt;br /&gt;
                {&lt;br /&gt;
                    queue += llDetectedKey(num);&lt;br /&gt;
                    debug (llList2CSV(queue));&lt;br /&gt;
                    if (llGetListLength(queue) == 1) next(); //process queue if it has one entry&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    listen(integer chn, string name, key id, string msg)&lt;br /&gt;
    {&lt;br /&gt;
        if (chn == RLVchan) //answers from relay&lt;br /&gt;
        {&lt;br /&gt;
            list    answer = llCSV2List(msg);&lt;br /&gt;
            key     rkey = llList2Key(answer, 1);&lt;br /&gt;
            if (rkey == llGetKey())&lt;br /&gt;
            {&lt;br /&gt;
                debug(&amp;quot;RLV answer: &amp;quot;+msg);&lt;br /&gt;
                string  rhandle = llList2String(answer, 0);&lt;br /&gt;
                string  rcommand = llList2String(answer, 2);&lt;br /&gt;
                string  rok = llList2String(answer, 3);&lt;br /&gt;
                if (rhandle == &amp;quot;sit&amp;quot; &amp;amp;&amp;amp; rok == &amp;quot;ok&amp;quot;)&lt;br /&gt;
                {&lt;br /&gt;
                    llSetTimerEvent(0);&lt;br /&gt;
                    victim = llGetOwnerKey(id);&lt;br /&gt;
                    llSleep(1);&lt;br /&gt;
                    relay(&amp;quot;sitcheck&amp;quot;, victim, &amp;quot;@getsitid=&amp;quot;+(string)commchan);&lt;br /&gt;
                    llSetTimerEvent(3);&lt;br /&gt;
                }&lt;br /&gt;
                if (rhandle == &amp;quot;sitlock&amp;quot; &amp;amp;&amp;amp; rok == &amp;quot;ok&amp;quot; &amp;amp;&amp;amp; llGetOwnerKey(id) == victim)&lt;br /&gt;
                {&lt;br /&gt;
                    llRegionSayTo(victim, 0, &amp;quot;You are locked for &amp;quot;+locktime);&lt;br /&gt;
                }&lt;br /&gt;
                if (rcommand == &amp;quot;!release&amp;quot; &amp;amp;&amp;amp; rok == &amp;quot;ok&amp;quot; &amp;amp;&amp;amp; llGetOwnerKey(id) == victim)&lt;br /&gt;
                {&lt;br /&gt;
                    debug(&amp;quot;released&amp;quot;);&lt;br /&gt;
                    locked = FALSE;&lt;br /&gt;
                    victim = NULL_KEY;&lt;br /&gt;
                    next();&lt;br /&gt;
                }&lt;br /&gt;
            }                    &lt;br /&gt;
        }&lt;br /&gt;
        else if (chn == commchan) //answers from the victims client&lt;br /&gt;
        {&lt;br /&gt;
            debug(&amp;quot;Comm answer: &amp;quot;+msg);&lt;br /&gt;
            if ((key)msg == target) //when the victim is sitting on the target it will send the targets key on the comm channel&lt;br /&gt;
            {&lt;br /&gt;
                if (!locked)&lt;br /&gt;
                {&lt;br /&gt;
                    victim = id;&lt;br /&gt;
                    llSetTimerEvent(10);&lt;br /&gt;
                    freetime = llGetUnixTime()+lockseconds;&lt;br /&gt;
                    relay(&amp;quot;sitlock&amp;quot;, victim, &amp;quot;@unsit=n&amp;quot;);&lt;br /&gt;
                    locked = TRUE;&lt;br /&gt;
                }&lt;br /&gt;
                sitting = TRUE;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        if (locked)&lt;br /&gt;
        {&lt;br /&gt;
            if (llGetUnixTime() &amp;gt;= freetime)&lt;br /&gt;
            {&lt;br /&gt;
                relay(&amp;quot;release&amp;quot;, victim, &amp;quot;!release&amp;quot;);&lt;br /&gt;
                llRegionSayTo(victim, 0, &amp;quot;You are free. You have &amp;quot;+(string)sleeptime+&amp;quot; seconds to leave!&amp;quot;);&lt;br /&gt;
                locked = FALSE;&lt;br /&gt;
                llSetTimerEvent(sleeptime);&lt;br /&gt;
            }&lt;br /&gt;
            else if (sitting == TRUE)&lt;br /&gt;
            {&lt;br /&gt;
                sitting = FALSE;&lt;br /&gt;
                relay(&amp;quot;sitcheck&amp;quot;, victim, &amp;quot;@getsitid=&amp;quot;+(string)commchan);&lt;br /&gt;
            }                &lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            llSetTimerEvent(5);&lt;br /&gt;
            if (llGetObjectMass(target) &amp;gt; targetmass &amp;amp;&amp;amp; sitscan == TRUE)  //is someone sitting?&lt;br /&gt;
            {&lt;br /&gt;
                llSensor(&amp;quot;&amp;quot;, &amp;quot;&amp;quot;, AGENT, llVecDist(llGetPos(), llList2Vector(llGetObjectDetails(target, [OBJECT_POS]), 0))+2.0, PI); // find possible victims&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                queue = llDeleteSubList(queue, 0, 0);&lt;br /&gt;
                victim = NULL_KEY;&lt;br /&gt;
                locked = FALSE;&lt;br /&gt;
                next();&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    sensor(integer num)&lt;br /&gt;
    {&lt;br /&gt;
        while(num)&lt;br /&gt;
        {&lt;br /&gt;
            num--;&lt;br /&gt;
            if (llGetAgentInfo(llDetectedKey(num)) &amp;amp; AGENT_SITTING) relay(&amp;quot;sitcheck&amp;quot;, llDetectedKey(0), &amp;quot;@getsitid=&amp;quot;+(string)commchan); // check if sitting and if so ask relay for object they are sitting on&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[Category:LSL Library|RLV Collision Grabber]]&lt;/div&gt;</summary>
		<author><name>Lady Sumoku</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Linkset_resizer_with_menu&amp;diff=1194741</id>
		<title>Linkset resizer with menu</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Linkset_resizer_with_menu&amp;diff=1194741"/>
		<updated>2015-01-24T19:38:19Z</updated>

		<summary type="html">&lt;p&gt;Lady Sumoku: Instead of &amp;lt;pre&amp;gt; generic formatting, used &amp;lt;source&amp;gt; for context highlighting to match the current (in progress) wiki updates&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header}}&lt;br /&gt;
&lt;br /&gt;
==== A single script that rescales every prim in a linkset====&lt;br /&gt;
by [[User:Brilliant Scientist|Brilliant Scientist]], 25th April 2010&lt;br /&gt;
&lt;br /&gt;
This script uses the [[LlGetLinkPrimitiveParams|llGetLinkPrimitiveParams()]] and [[LlSetLinkPrimitiveParamsFast|llSetLinkPrimitiveParamsFast()]] functions introduced in server 1.38 to rescale every prim in an arbitrary linkset. Based on [[Linkset resizer]] script by [[User:Maestro Linden|Maestro Linden]]. &lt;br /&gt;
&lt;br /&gt;
The main differences between the two scripts are: &lt;br /&gt;
&lt;br /&gt;
&amp;lt;ul&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;this script is menu-controlled&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;the script&#039;s listen channel is generated dynamically&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;more comments in the code for beginner scripters&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;li&amp;gt;it&#039;s just less chatty&amp;lt;/li&amp;gt;&lt;br /&gt;
&amp;lt;/ul&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&amp;lt;b&amp;gt;Special thanks to:&amp;lt;/b&amp;gt;&amp;lt;br&amp;gt;&lt;br /&gt;
[[User:Ann Otoole|Ann Otoole]] for contributing with a script removal function. The source code on this wiki page has been modified to reflect this contribution.&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Source Code ====&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
// Linkset Resizer with Menu&lt;br /&gt;
// version 1.00 (25.04.2010)&lt;br /&gt;
// by: Brilliant Scientist&lt;br /&gt;
// --&lt;br /&gt;
// This script resizes all prims in a linkset, the process is controlled via a menu.&lt;br /&gt;
// The script works on arbitrary linksets and requires no configuration.&lt;br /&gt;
// The number of prims of the linkset it can process is limited only by the script&#039;s memory.&lt;br /&gt;
// The script is based on &amp;quot;Linkset Resizer&amp;quot; script by Maestro Linden.&lt;br /&gt;
// http://wiki.secondlife.com/wiki/Linkset_resizer&lt;br /&gt;
// This script still doesn&#039;t check prim linkability rules, which are described in:&lt;br /&gt;
// http://wiki.secondlife.com/wiki/Linkability_Rules&lt;br /&gt;
// Special thanks to:&lt;br /&gt;
// Ann Otoole&lt;br /&gt;
 &lt;br /&gt;
float MIN_DIMENSION=0.01; // the minimum scale of a prim allowed, in any dimension&lt;br /&gt;
float MAX_DIMENSION=10.0; // the maximum scale of a prim allowed, in any dimension&lt;br /&gt;
 &lt;br /&gt;
float max_scale;&lt;br /&gt;
float min_scale;&lt;br /&gt;
 &lt;br /&gt;
float   cur_scale = 1.0;&lt;br /&gt;
integer handle;&lt;br /&gt;
integer menuChan;&lt;br /&gt;
 &lt;br /&gt;
float min_original_scale=10.0; // minimum x/y/z component of the scales in the linkset&lt;br /&gt;
float max_original_scale=0.0; // minimum x/y/z component of the scales in the linkset&lt;br /&gt;
 &lt;br /&gt;
list link_scales = [];&lt;br /&gt;
list link_positions = [];&lt;br /&gt;
 &lt;br /&gt;
makeMenu()&lt;br /&gt;
{&lt;br /&gt;
	llListenRemove(handle);&lt;br /&gt;
	menuChan = 50000 + (integer)llFrand(50000.00);&lt;br /&gt;
	handle = llListen(menuChan,&amp;quot;&amp;quot;,llGetOwner(),&amp;quot;&amp;quot;);&lt;br /&gt;
 &lt;br /&gt;
	//the button values can be changed i.e. you can set a value like &amp;quot;-1.00&amp;quot; or &amp;quot;+2.00&amp;quot;&lt;br /&gt;
	//and it will work without changing anything else in the script&lt;br /&gt;
	llDialog(llGetOwner(),&amp;quot;Max scale: &amp;quot;+(string)max_scale+&amp;quot;\nMin scale: &amp;quot;+(string)min_scale+&amp;quot;\n \nCurrent scale: &amp;quot;+&lt;br /&gt;
        (string)cur_scale,[&amp;quot;-0.05&amp;quot;,&amp;quot;-0.10&amp;quot;,&amp;quot;-0.25&amp;quot;,&amp;quot;+0.05&amp;quot;,&amp;quot;+0.10&amp;quot;,&amp;quot;+0.25&amp;quot;,&amp;quot;MIN SIZE&amp;quot;,&amp;quot;RESTORE&amp;quot;,&amp;quot;MAX SIZE&amp;quot;,&amp;quot;DELETE...&amp;quot;],menuChan);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
integer scanLinkset()&lt;br /&gt;
{&lt;br /&gt;
	integer link_qty = llGetNumberOfPrims();&lt;br /&gt;
	integer link_idx;&lt;br /&gt;
	vector link_pos;&lt;br /&gt;
	vector link_scale;&lt;br /&gt;
 &lt;br /&gt;
	//script made specifically for linksets, not for single prims&lt;br /&gt;
	if (link_qty &amp;gt; 1)&lt;br /&gt;
	{&lt;br /&gt;
		//link numbering in linksets starts with 1&lt;br /&gt;
		for (link_idx=1; link_idx &amp;lt;= link_qty; ++link_idx)&lt;br /&gt;
		{&lt;br /&gt;
			link_pos=llList2Vector(llGetLinkPrimitiveParams(link_idx, [PRIM_POS_LOCAL]),0);&lt;br /&gt;
			link_scale=llList2Vector(llGetLinkPrimitiveParams(link_idx,[PRIM_SIZE]),0);&lt;br /&gt;
 &lt;br /&gt;
			// determine the minimum and maximum prim scales in the linkset,&lt;br /&gt;
			// so that rescaling doesn&#039;t fail due to prim scale limitations&lt;br /&gt;
			if(link_scale.x&amp;lt;min_original_scale) min_original_scale=link_scale.x;&lt;br /&gt;
			else if(link_scale.x&amp;gt;max_original_scale) max_original_scale=link_scale.x;&lt;br /&gt;
			if(link_scale.y&amp;lt;min_original_scale) min_original_scale=link_scale.y;&lt;br /&gt;
			else if(link_scale.y&amp;gt;max_original_scale) max_original_scale=link_scale.y;&lt;br /&gt;
			if(link_scale.z&amp;lt;min_original_scale) min_original_scale=link_scale.z;&lt;br /&gt;
			else if(link_scale.z&amp;gt;max_original_scale) max_original_scale=link_scale.z;&lt;br /&gt;
 &lt;br /&gt;
			link_scales    += [link_scale];&lt;br /&gt;
			link_positions += [link_pos];&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	else&lt;br /&gt;
	{&lt;br /&gt;
		llOwnerSay(&amp;quot;error: this script doesn&#039;t work for non-linked objects&amp;quot;);&lt;br /&gt;
		return FALSE;&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	max_scale = MAX_DIMENSION/max_original_scale;&lt;br /&gt;
	min_scale = MIN_DIMENSION/min_original_scale;&lt;br /&gt;
 &lt;br /&gt;
	return TRUE;&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
resizeObject(float scale)&lt;br /&gt;
{&lt;br /&gt;
	integer link_qty = llGetNumberOfPrims();&lt;br /&gt;
	integer link_idx;&lt;br /&gt;
	vector new_size;&lt;br /&gt;
	vector new_pos;&lt;br /&gt;
 &lt;br /&gt;
	if (link_qty &amp;gt; 1)&lt;br /&gt;
	{&lt;br /&gt;
		//link numbering in linksets starts with 1&lt;br /&gt;
		for (link_idx=1; link_idx &amp;lt;= link_qty; link_idx++)&lt;br /&gt;
		{&lt;br /&gt;
			new_size   = scale * llList2Vector(link_scales, link_idx-1);&lt;br /&gt;
 &lt;br /&gt;
			if (link_idx == 1)&lt;br /&gt;
			{&lt;br /&gt;
				//because we don&#039;t really want to move the root prim as it moves the whole object&lt;br /&gt;
				llSetLinkPrimitiveParamsFast(link_idx, [PRIM_SIZE, new_size]);&lt;br /&gt;
			}&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
				new_pos    = scale * llList2Vector(link_positions, link_idx-1);&lt;br /&gt;
				llSetLinkPrimitiveParamsFast(link_idx, [PRIM_SIZE, new_size, PRIM_POSITION, new_pos]);&lt;br /&gt;
			}&lt;br /&gt;
		}&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;
		if (scanLinkset())&lt;br /&gt;
		{&lt;br /&gt;
			//llOwnerSay(&amp;quot;resizer script ready&amp;quot;);&lt;br /&gt;
		}&lt;br /&gt;
		else&lt;br /&gt;
		{&lt;br /&gt;
			llRemoveInventory(llGetScriptName());&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	touch_start(integer total)&lt;br /&gt;
	{&lt;br /&gt;
		if (llDetectedKey(0) == llGetOwner()) makeMenu();&lt;br /&gt;
	}&lt;br /&gt;
 &lt;br /&gt;
	listen(integer channel, string name, key id, string msg)&lt;br /&gt;
	{&lt;br /&gt;
		//you can never be too secure&lt;br /&gt;
		if (id == llGetOwner())&lt;br /&gt;
		{&lt;br /&gt;
			if (msg == &amp;quot;RESTORE&amp;quot;)&lt;br /&gt;
			{&lt;br /&gt;
				cur_scale = 1.0;&lt;br /&gt;
			}&lt;br /&gt;
			else if (msg == &amp;quot;MIN SIZE&amp;quot;)&lt;br /&gt;
			{&lt;br /&gt;
				cur_scale = min_scale;&lt;br /&gt;
			}&lt;br /&gt;
			else if (msg == &amp;quot;MAX SIZE&amp;quot;)&lt;br /&gt;
			{&lt;br /&gt;
				cur_scale = max_scale;&lt;br /&gt;
			}&lt;br /&gt;
			else if (msg == &amp;quot;DELETE...&amp;quot;)&lt;br /&gt;
			{                &lt;br /&gt;
                           llDialog(llGetOwner(),&amp;quot;Are you sure you want to delete the resizer script?&amp;quot;, &lt;br /&gt;
                           [&amp;quot;DELETE&amp;quot;,&amp;quot;CANCEL&amp;quot;],menuChan);&lt;br /&gt;
                           return;				&lt;br /&gt;
			}				&lt;br /&gt;
			else if (msg == &amp;quot;DELETE&amp;quot;)&lt;br /&gt;
			{                &lt;br /&gt;
                           llOwnerSay(&amp;quot;deleting resizer script...&amp;quot;);&lt;br /&gt;
			   llRemoveInventory(llGetScriptName());				&lt;br /&gt;
			}			&lt;br /&gt;
			else&lt;br /&gt;
			{&lt;br /&gt;
			    cur_scale += (float)msg;&lt;br /&gt;
			}&lt;br /&gt;
 &lt;br /&gt;
			//check that the scale doesn&#039;t go beyond the bounds&lt;br /&gt;
			if (cur_scale &amp;gt; max_scale) { cur_scale = max_scale; }&lt;br /&gt;
			if (cur_scale &amp;lt; min_scale) { cur_scale = min_scale; }&lt;br /&gt;
 &lt;br /&gt;
			resizeObject(cur_scale);&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
----&lt;br /&gt;
&lt;br /&gt;
==== Crunching and Inflating ==== &lt;br /&gt;
&lt;br /&gt;
* This is an addition by [[User:Kira Komarov|Kira Komarov]] to the former script by [[User:Brilliant Scientist|Brilliant Scientist]].&lt;br /&gt;
&lt;br /&gt;
I have been faced with the following problem: [[User:Stephen Xootfly|Stephen Xootfly]] handed me a representation of a caffeine molecule. I wanted to scale that molecule down so that I may create a necklace out of it. This is what the molecule looks like in comparison to my avatar:&lt;br /&gt;
&lt;br /&gt;
[[File:Resize_-_Comparison.png|800px]]&lt;br /&gt;
&lt;br /&gt;
On the lower right, you can see the result after using the script above and using the minimal size option AND replacing the molecules and bindings with a set of nanoprims that I carry around. Here is a blow-up so you can see what it looks like after those operations:&lt;br /&gt;
&lt;br /&gt;
[[File:Resize_-_BadCrunch.png|800px]]&lt;br /&gt;
&lt;br /&gt;
As you can see, the distances between the bindings and the atoms are relatively larger than in the original picture. This is NOT because the script above does not function correctly. The script above functions correctly however, by replacing the atoms and bindings with their equivalent nanoprim-sized sculpt shapes, I have thereby increased the &amp;quot;visible distance&amp;quot; artificially. In other words, the primitives are still the same size but by using nanoprims only a subpart of that is visible.&lt;br /&gt;
&lt;br /&gt;
One way to solve this problem, would have been to roll-up my sleeves and start manually putting each molecule and binding in place. I went as far as doing one peripheral cluster and then I gave up. This would have wasted probably the rest of my day...&lt;br /&gt;
&lt;br /&gt;
So, I took again at the script above and wondered how the script repositions the primitives after it has scaled them. The key is to be found in the script above, at this line:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
			link_positions += [(link_pos-llGetRootPosition())/llGetRootRotation()];&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
which repositions the primitive relative to the root position.&lt;br /&gt;
&lt;br /&gt;
Since I used n_20-size nanoprims for bindings between atoms, n_10-size nanoprims for small atoms and n_5-size nanoprims for large atoms, I figured that in fact, I am just inducing an error by a factor of 5. &lt;br /&gt;
&lt;br /&gt;
To fix the problem, I used the script as it is to scale the molecule to its maximum size, after I had scaled it down and replaced the atoms and bindings with nanoprims. I then edited the script and alter it in order to take the factor out:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
			link_positions += [(link_pos/5-llGetRootPosition())/llGetRootRotation()];&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
And then I clicked the gigantic molecule and selected &amp;quot;minimum size&amp;quot; to crunch it back into place, hoping to eliminate that factor of 5. This is the result:&lt;br /&gt;
&lt;br /&gt;
[[File:Resize_-_GoodCrunch.png|800px]]&lt;br /&gt;
&lt;br /&gt;
As you see, the factor has been taken out and the molecule is now a perfect nano-replica of the original, scaled down to a n_20-size nano and respecting the relative distances between atoms and bindings.&lt;br /&gt;
&lt;br /&gt;
This spared me a lot of time. Perhaps one could take this concept to the next level and write a script that would eliminate such a factor. It would be mightily useful for builders using nanoprims.&lt;br /&gt;
&lt;br /&gt;
[[Category:LSL Examples]]&lt;/div&gt;</summary>
		<author><name>Lady Sumoku</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User_talk:ObviousAltIsObvious_Resident&amp;diff=1194740</id>
		<title>User talk:ObviousAltIsObvious Resident</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User_talk:ObviousAltIsObvious_Resident&amp;diff=1194740"/>
		<updated>2015-01-24T18:49:29Z</updated>

		<summary type="html">&lt;p&gt;Lady Sumoku: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Thank you for the many useful wiki edits. I run across yours now and again when I&#039;m using the wiki as a reference myself. --[[User:Soft Linden|Soft Linden]] 12:57, 10 December 2013 (PST)&lt;br /&gt;
&lt;br /&gt;
Shoot. I didn&#039;t realize until now that I&#039;ve been taking you for granted. I&#039;m sorry. Thank you for your hard work, I really appreciate 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:56, 10 December 2013 (PST)&lt;br /&gt;
&lt;br /&gt;
== &amp;lt;nowiki&amp;gt;&amp;lt;lsl&amp;gt;&amp;lt;/nowiki&amp;gt; tag conversion ==&lt;br /&gt;
&lt;br /&gt;
walking thru [[:Category:LSL Functions]], have got as far as [[llGetWallclock]] ... need to break for RL stuff. [[Special:Contributions/Lady Sumoku|Lady Sumoku]] has been barreling through some of the other categories this morning! --[[User:ObviousAltIsObvious Resident|ObviousAltIsObvious Resident]] ([[User talk:ObviousAltIsObvious Resident|talk]]) 02:17, 22 January 2015 (PST)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;&#039;&#039;&#039;*waves*&#039;&#039;&#039;Couldn&#039;t sleep, and the formatting change was bugging me until I saw you fixing them. I did most of the &amp;quot;LSL Reference&amp;quot; section (at least one level down) except for [[:Category:LSL Constants|Constants]] and [[LSL Errors|Errors]]. (And Functions, since you were on that!)  --[[User:Lady Sumoku|Lady Sumoku]] ([[User talk:Lady Sumoku|talk]]) 02:35, 22 January 2015 (PST)&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Trying to get to the top of the [[User:Zai_Lynch/Wiki_Spammer_Ranking|wiki spammer ranking]] I see. Thank you both for working on this. -- &#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:18, 23 January 2015 (PST)&lt;br /&gt;
&lt;br /&gt;
:I feel as if this may come across as bitchy and/or unhelpful, but: Swapping out tags can be done in no time with little effort by using [https://www.mediawiki.org/wiki/Extension:Replace_Text a MediaWiki function/extension using regex to search and replace strings] which is already part of this wiki. All this manual labour makes my head spin. Call me lazy if you like, but why waste energy doing the work of machines?&lt;br /&gt;
:P.S. [[MediaWiki:Common.js|The common JS]] is laughably bad and out of date, and I&#039;m guessing (not looked) that the CSS will be as bad. Someone really ought to clean them up.&amp;amp;nbsp;[[User:Fred_Gandt|&#039;&#039;&#039;&amp;lt;span style=&amp;quot;font-family:arial;color:#055;font-size:16px;&amp;quot;&amp;gt;f&amp;lt;i style=&amp;quot;color:#0dd;font-size:10px;&amp;quot;&amp;gt;red&amp;lt;/i&amp;gt;g&amp;lt;i style=&amp;quot;color:#0dd;font-size:10px;&amp;quot;&amp;gt;andt&amp;lt;/i&amp;gt;&amp;lt;/span&amp;gt;&#039;&#039;&#039;]] 13:40, 23 January 2015 (PST)&lt;br /&gt;
&lt;br /&gt;
::Manually reviewed changes are a deliberate choice. See the messes that were made with the use of automated tools on  http://forums-archive.secondlife.com/15/1.html and http://community.secondlife.com/t5/Scripting-Library/bd-p/2122 for why. --[[User:ObviousAltIsObvious Resident|ObviousAltIsObvious Resident]] ([[User talk:ObviousAltIsObvious Resident|talk]]) 14:15, 23 January 2015 (PST)&lt;br /&gt;
&lt;br /&gt;
::I considered suggesting changing this to use a template that specified the tag (this way it we wouldn&#039;t have to worry about doing this again). Who wants to do the &amp;lt;nowiki&amp;gt;&amp;lt;cpp&amp;gt; and &amp;lt;php&amp;gt;&amp;lt;/nowiki&amp;gt; tags? I&#039;m going to work on redoing primitive params (collapsible sections will make it rock). -- &#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; 16:58, 23 January 2015 (PST)&lt;br /&gt;
&lt;br /&gt;
:::Knew this change was going to have to come sooner or later, and did think about that. Like-for-like substitution was less likely to disturb the syntax in the existing template soup, and we&#039;re reasonably safe for a long time since we&#039;re now in sync with that Wikipedia and Wikia use. --[[User:ObviousAltIsObvious Resident|ObviousAltIsObvious Resident]] ([[User talk:ObviousAltIsObvious Resident|talk]]) 17:16, 23 January 2015 (PST)&lt;br /&gt;
&lt;br /&gt;
::I am of a simliar mindset about the &amp;quot;auto&amp;quot; fixing.  While it&#039;s nice when it works, it is usually much more trouble in the instances where it doesn&#039;t.  I was skimming over each page to make sure my changes weren&#039;t doing anything I didn&#039;t want them to.  Long and boring, sure.  But I didn&#039;t want to cause a mess later for someone else.&lt;/div&gt;</summary>
		<author><name>Lady Sumoku</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Basic_Sim_Status_Button_Indicator_HUD&amp;diff=1194616</id>
		<title>Basic Sim Status Button Indicator HUD</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Basic_Sim_Status_Button_Indicator_HUD&amp;diff=1194616"/>
		<updated>2015-01-23T02:44:45Z</updated>

		<summary type="html">&lt;p&gt;Lady Sumoku: Replaced old &amp;lt;LSL&amp;gt; block with &amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
// Generic Sim Status Button Indicator&lt;br /&gt;
// HUD / 1 prim&lt;br /&gt;
// by Ackley Bing&lt;br /&gt;
//&lt;br /&gt;
// A HUD button for remote monitoring of sims.&lt;br /&gt;
// Color indicates the sim status&lt;br /&gt;
// Green = SIM available&lt;br /&gt;
// When the sim goes down it turns red/black&lt;br /&gt;
//&lt;br /&gt;
// To use:  Put this in a prim and attach to your preferred HUD location.&lt;br /&gt;
// Go to the sim you want to monitor and and click the prim&lt;br /&gt;
// Click and HOLD the hud button (5 seconds) to choose another sim.&lt;br /&gt;
//&lt;br /&gt;
// Modify // Attach / Connect this to your HUD/Vehicle/etc any way you like.&lt;br /&gt;
&lt;br /&gt;
string homeregion;&lt;br /&gt;
SimStutusButtonColor(string data)&lt;br /&gt;
{&lt;br /&gt;
    vector simstatuscolor;&lt;br /&gt;
    if (data==&amp;quot;&amp;quot;) simstatuscolor = &amp;lt;0.0,0.0,0.0&amp;gt;;  // set color to black&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        if ( data == &amp;quot;up&amp;quot; ) simstatuscolor = &amp;lt;0.0,1.0,0.0&amp;gt;;  // set color to green&lt;br /&gt;
        else if ( data == &amp;quot;down&amp;quot; ) simstatuscolor = &amp;lt;1.0,0.0,0.0&amp;gt;;  // set color to red&lt;br /&gt;
        else if ( data == &amp;quot;starting&amp;quot; || data == &amp;quot;stopping&amp;quot; ) simstatuscolor = &amp;lt;1.0,1.0,0.0&amp;gt;;  // set color to yellow&lt;br /&gt;
        // if (homeregion!=&amp;quot;&amp;quot;) llOwnerSay(&amp;quot;: http://maps.secondlife.com/secondlife/&amp;quot;+(llEscapeURL(homeregion))+&amp;quot; is &amp;quot;+data+&amp;quot;.&amp;quot;); // uncomment if you want constant chat notifications&lt;br /&gt;
    }&lt;br /&gt;
    if (homeregion==&amp;quot;&amp;quot;) simstatuscolor = &amp;lt;0.0,0.0,0.0&amp;gt;;&lt;br /&gt;
    llSetPrimitiveParams( [ PRIM_COLOR, 4, simstatuscolor, 1.0 ] );&lt;br /&gt;
    llSetText(homeregion, simstatuscolor, 1.0*(homeregion!=&amp;quot;&amp;quot;) );&lt;br /&gt;
}&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llRequestPermissions(llGetOwner(), PERMISSION_TAKE_CONTROLS);&lt;br /&gt;
        SimStutusButtonColor(&amp;quot;&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    touch_start(integer n)&lt;br /&gt;
    {&lt;br /&gt;
        llResetTime();&lt;br /&gt;
    }&lt;br /&gt;
    touch_end(integer n)&lt;br /&gt;
    {&lt;br /&gt;
        if(llGetTime()&amp;lt;5.0 &amp;amp;&amp;amp; homeregion != &amp;quot;&amp;quot;) llRequestSimulatorData(homeregion,DATA_SIM_STATUS);&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            llSetTimerEvent(30.0);&lt;br /&gt;
            llListenRemove(1);&lt;br /&gt;
            llListen(1, &amp;quot;&amp;quot;, llGetOwner(), &amp;quot;&amp;quot;);&lt;br /&gt;
            llDialog(llGetOwner(), &amp;quot;Monitor Sim Status for &amp;quot;+llGetRegionName()+&amp;quot;?&amp;quot;, [&amp;quot;Yes&amp;quot;,&amp;quot;No&amp;quot;,&amp;quot;Reset&amp;quot;], 1);&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 (message!=&amp;quot;Yes&amp;quot; &amp;amp;&amp;amp; message!=&amp;quot;No&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            if (message==&amp;quot;Reset&amp;quot;) llResetScript();&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            if (message==&amp;quot;No&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                if (homeregion==&amp;quot;&amp;quot;) return;&lt;br /&gt;
                llSetTimerEvent(0.0);&lt;br /&gt;
                homeregion=&amp;quot;&amp;quot;;&lt;br /&gt;
            }&lt;br /&gt;
            else homeregion=llGetRegionName();&lt;br /&gt;
            llRequestSimulatorData(homeregion,DATA_SIM_STATUS);&lt;br /&gt;
            llSetPrimitiveParams( [ PRIM_NAME, homeregion+&amp;quot; Sim Status&amp;quot; ] );&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        llListenRemove(1);&lt;br /&gt;
        if (homeregion!=&amp;quot;&amp;quot;) llRequestSimulatorData(homeregion,DATA_SIM_STATUS);&lt;br /&gt;
        else llSetTimerEvent(0.0);&lt;br /&gt;
    }&lt;br /&gt;
    dataserver(key requested, string data)&lt;br /&gt;
    {&lt;br /&gt;
        SimStutusButtonColor(data);&lt;br /&gt;
    }&lt;br /&gt;
    run_time_permissions(integer perms)&lt;br /&gt;
    {&lt;br /&gt;
        llTakeControls((perms &amp;amp;&amp;amp; PERMISSION_TAKE_CONTROLS)*CONTROL_BACK, TRUE, TRUE);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
[[Category:LSL Library]]&lt;/div&gt;</summary>
		<author><name>Lady Sumoku</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlSetAnimationOverride&amp;diff=1194513</id>
		<title>LlSetAnimationOverride</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlSetAnimationOverride&amp;diff=1194513"/>
		<updated>2015-01-22T22:05:56Z</updated>

		<summary type="html">&lt;p&gt;Lady Sumoku: Replaced old &amp;lt;LSL&amp;gt; block with &amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function&lt;br /&gt;
|inject-2=&lt;br /&gt;
{{LSL_Function/permission|PERMISSION_OVERRIDE_ANIMATIONS}}&lt;br /&gt;
{{LSL_Function/inventory|anim|uuid=false|type=animation}}&lt;br /&gt;
|func_id=?|func_sleep=0.0|func_energy=?&lt;br /&gt;
|func=llSetAnimationOverride|sort=SetAnimationOverride&lt;br /&gt;
|p1_type=string|p1_name=anim_state|p1_desc=animation state to be overriden&lt;br /&gt;
|p2_type=string|p2_name=anim|p2_desc=&amp;amp;#32;or the name of a [[Internal Animations|built-in animation]]|p2_hover=&amp;amp;#32;or the name of a built-in animation&lt;br /&gt;
|func_footnote=Note: Animation overrides survive everything, except relog.&lt;br /&gt;
|func_desc=Set the animation ({{LSLPT|anim}}) that will play for the given animation state ({{LSLPT|anim_state}}). &lt;br /&gt;
|spec&lt;br /&gt;
|caveats=*Animation overrides survive script reset, script removal, attachment removal, crossing into another region and teleporting, but not relog.&lt;br /&gt;
* State &amp;quot;Sit on Ground&amp;quot; will play the default animation in addition to any override set. This is required for correct viewer behavior.&lt;br /&gt;
* Some states are transitional and have undefined behavior if set to continuously looping animations. These states are &amp;quot;PreJumping&amp;quot;, &amp;quot;Landing&amp;quot;, &amp;quot;Soft Landing&amp;quot; and &amp;quot;Standing Up&amp;quot;.&lt;br /&gt;
** Usually this means your avatar will become frozen in place unless you run &amp;quot;Stop Animating My Avatar&amp;quot; from the viewer, so avoid using looping animations for these states.&lt;br /&gt;
* Permissions aren&#039;t auto granted if you sit on an object asking for PERMISSION_OVERRIDE_ANIMATIONS.&lt;br /&gt;
* Starting a default animation (&amp;quot;sit&amp;quot; &amp;quot;walk&amp;quot; &amp;quot;fly&amp;quot;) with [[llStartAnimation]] will not start the Override Animation.&lt;br /&gt;
* When this function is used to override the Walking animation, the avatar can no longer walk backward - attempting to do so causes the avatar to turn around. Presumably this is because there&#039;s no way to specify a &amp;quot;walking backwards&amp;quot; animation, so actually moving backwards while your legs are moving forward would look wrong.&lt;br /&gt;
|constants={{LSL Animation States}}&lt;br /&gt;
|examples=&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Override the Sit, Stand and Walk animations&lt;br /&gt;
// 1. place this script and your animations in a prim&lt;br /&gt;
// 2. edit the animation names in the script to your animation&#039;s names&lt;br /&gt;
// 3. attach the prim to your avatar&lt;br /&gt;
&lt;br /&gt;
string gMySit = &amp;quot;chop_sit&amp;quot;;&lt;br /&gt;
string gMyStand = &amp;quot;FStand _02&amp;quot;;&lt;br /&gt;
string gMyWalk = &amp;quot;Kort gang F v4.1&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    attach(key id)&lt;br /&gt;
    {&lt;br /&gt;
        if ( id ) llRequestPermissions(id , PERMISSION_OVERRIDE_ANIMATIONS);&lt;br /&gt;
        else if ( llGetPermissions() &amp;amp; PERMISSION_OVERRIDE_ANIMATIONS ) llResetAnimationOverride(&amp;quot;ALL&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    run_time_permissions(integer perms)&lt;br /&gt;
    {&lt;br /&gt;
        if ( perms &amp;amp; PERMISSION_OVERRIDE_ANIMATIONS )&lt;br /&gt;
        {&lt;br /&gt;
            llSetAnimationOverride( &amp;quot;Sitting&amp;quot;, gMySit);&lt;br /&gt;
            llSetAnimationOverride( &amp;quot;Standing&amp;quot;, gMyStand);&lt;br /&gt;
            llSetAnimationOverride( &amp;quot;Walking&amp;quot;, gMyWalk);&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||[[llGetAnimationOverride]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llResetAnimationOverride]]|}}&lt;br /&gt;
|also_tests&lt;br /&gt;
|also_events&lt;br /&gt;
|also_articles={{LSL DefineRow||[[Internal_Animations]]|lists internal Animations always available}}&lt;br /&gt;
|notes&lt;br /&gt;
|cat1=Animation&lt;br /&gt;
|cat2=Animation/Override&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
|history = Date of Release  [[ Release_Notes/Second_Life_Server/13#13.04.12.273874 | 12/04/2013 ]]&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Lady Sumoku</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=FollowCam&amp;diff=1194512</id>
		<title>FollowCam</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=FollowCam&amp;diff=1194512"/>
		<updated>2015-01-22T22:04:58Z</updated>

		<summary type="html">&lt;p&gt;Lady Sumoku: Replaced old &amp;lt;LSL&amp;gt; block with &amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== FollowCam ==&lt;br /&gt;
&lt;br /&gt;
[[FollowCam]] functionality allows [[script|scripts]] to [[control]] the {{LSLGC|Camera|camera}}.&lt;br /&gt;
&lt;br /&gt;
* Scripts on {{LSLGC|Attachment|attachments}} and {{LSLGC|Vehicle|vehicles}} can now control camera behavior through a call to [[llSetCameraParams]](), once they have acquired the [[PERMISSION_CONTROL_CAMERA]] {{LSLGC|Permissions/Script|permission}}&lt;br /&gt;
* The script will control the [[user|user&#039;s]] camera as long as the resident doesn&#039;t override it (use Alt-zoom or enter [[mouselook]], for example) and the [[object]] remains attached or the {{LSLGC|Avatar|avatar}} continues to {{LSLGC|Sit|sit}} on it:&lt;br /&gt;
** When multiple scripts attempt to control the camera, the last script to set the [[CAMERA_ACTIVE]] [[bitflags|flag]] will have control&lt;br /&gt;
** Older scripts will regain control as soon as the newer one is deactivated&lt;br /&gt;
* The new [[FollowCam]] scripts enable a huge variety of vehicle-following behaviors:&lt;br /&gt;
* For instance, a loose camera setting allows sudden changes in vehicle acceleration to happen without causing dizzying jolts in the camera&lt;br /&gt;
** By turning off the &amp;quot;behindness&amp;quot; feature, the camera will be simply dragged along, but it will not try to stay exactly behind the vehicle&lt;br /&gt;
** Other parameters, like pitch (the angle at which it &amp;quot;looks down&amp;quot; at the vehicle), distance, and others, allow you to customize the cinematics of vehicular fun&lt;br /&gt;
&lt;br /&gt;
===[[FollowCam]] family of camera functions===&lt;br /&gt;
&lt;br /&gt;
* [[llRequestPermissions]](agent_key, [[PERMISSION_CONTROL_CAMERA]])&lt;br /&gt;
** Requests permissions&lt;br /&gt;
*** Note, [[PERMISSION_CONTROL_CAMERA]] permissions are only supported for attachments and vehicles at this time&lt;br /&gt;
*** Accepting permissions via a dialog is not currently implemented.&lt;br /&gt;
&lt;br /&gt;
* [[llClearCameraParams]](): Resets all camera values to their default.&lt;br /&gt;
&lt;br /&gt;
* [[llSetCameraParams]]([]): sets up the camera movement rules based on the parameter list&lt;br /&gt;
** [[CAMERA_ACTIVE]] ([[TRUE]] or [[FALSE]]) Default = [[FALSE]]&lt;br /&gt;
*** Turns on or off scripting control of Scripted Camera&lt;br /&gt;
** [[CAMERA_DISTANCE]] (0.5 to ? meters) Default = 3.0&lt;br /&gt;
*** Sets how far away the Scripted Camera wants to be from its subject&lt;br /&gt;
** [[CAMERA_PITCH]] (-45.0 to 80.0 degrees) Default = 0.0&lt;br /&gt;
*** Adjusts the angular amount that the Scripted Camera aims straight ahead vs. straight down, maintaining the same distance. Analogous to &#039;incidence&#039;&lt;br /&gt;
** [[CAMERA_FOCUS_OFFSET]] (&amp;lt;-10,-10,-10&amp;gt; to &amp;lt;10,10,10&amp;gt; meters) Default = &amp;lt;0.0, 0.0, 0.0&amp;gt;&lt;br /&gt;
*** Adjusts the position of the Scripted Camera focus position relative to the subject&lt;br /&gt;
** [[CAMERA_POSITION_LAG]] (0.0 to 3.0 seconds) Default = 0.1&lt;br /&gt;
*** How much the Scripted Camera lags as it tries to move towards its &#039;ideal&#039; position&lt;br /&gt;
** [[CAMERA_FOCUS_LAG]] (0.0 to 3.0 seconds) Default = 0.1&lt;br /&gt;
*** How much the Scripted Camera lags as it tries to aim towards the subject&lt;br /&gt;
** [[CAMERA_BEHINDNESS_ANGLE]] (0.0 to 180.0 degrees) Default = 10.0&lt;br /&gt;
*** Sets the angle in degrees within which the Scripted Camera is not constrained by changes in subject rotation. 180 effectively turns behindness off.&lt;br /&gt;
** [[CAMERA_BEHINDNESS_LAG]] (0.0 to 3.0 seconds) Default = 0.0&lt;br /&gt;
*** How much the Scripted Camera lags as it tries to stay behind the target if outside of behindness angle&lt;br /&gt;
** [[CAMERA_POSITION_THRESHOLD]] (0.0 to 4.0 meters) Default = 1.0&lt;br /&gt;
*** Sets the radius of a sphere around the Scripted Camera&#039;s ideal position within which it is not affected by subject motion&lt;br /&gt;
** [[CAMERA_FOCUS_THRESHOLD]] (0.0 to 4.0 meters) Default = 1.0&lt;br /&gt;
*** Sets the radius of a sphere around the Scripted Camera&#039;s subject position within which its focus is not affected by subject motion&lt;br /&gt;
** [[CAMERA_POSITION]] (vector position within the region)&lt;br /&gt;
*** Sets the position of the Scripted Camera&lt;br /&gt;
** [[CAMERA_FOCUS]] (vector position within the region)&lt;br /&gt;
*** Sets the focus position of the Scripted Camera&lt;br /&gt;
** [[CAMERA_POSITION_LOCKED]] ([[TRUE]] or [[FALSE]]) Default = [[FALSE]]&lt;br /&gt;
*** Locks the camera position so it will not move&lt;br /&gt;
** [[CAMERA_FOCUS_LOCKED]] ([[TRUE]] or [[FALSE]]) Default = [[FALSE]]&lt;br /&gt;
*** Locks the camera focus so it will not move&lt;br /&gt;
&lt;br /&gt;
===Known issues===&lt;br /&gt;
&lt;br /&gt;
* The camera appears to jitter back and forth. This is a problem with our avatar motion model that will be worse at lower framerate. We are continuing to investigate potential solutions.&lt;br /&gt;
* Free standing objects cannot control the user camera. This will continue to be the case until we can implement a robust mechanism for letting residents cancel scripted camera behaviors.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;//Linden Lab&lt;br /&gt;
//Dan Linden&lt;br /&gt;
integer CHANNEL; // dialog channel&lt;br /&gt;
list MENU_MAIN = [&amp;quot;Default&amp;quot;, &amp;quot;Overhead Cam&amp;quot;, &amp;quot;Spin Cam&amp;quot;, &amp;quot;Trap Toggle&amp;quot;, &amp;quot;Spaz Cam&amp;quot;, &amp;quot;Drop Cam&amp;quot;, &lt;br /&gt;
&amp;quot;Worm Cam&amp;quot;, &amp;quot;Side Cam&amp;quot;, &amp;quot;Driving Cam&amp;quot;, &amp;quot;More...&amp;quot;, &amp;quot;Cam ON&amp;quot;, &amp;quot;Cam OFF&amp;quot;]; // the main menu&lt;br /&gt;
list MENU_2 = [&amp;quot;More...&amp;quot;, &amp;quot;...Back&amp;quot;]; // menu 2&lt;br /&gt;
&lt;br /&gt;
integer on = FALSE;&lt;br /&gt;
integer flying;&lt;br /&gt;
integer falling;&lt;br /&gt;
integer spaz = 0;&lt;br /&gt;
integer trap = 0;&lt;br /&gt;
&lt;br /&gt;
take_camera_control(key agent)&lt;br /&gt;
{&lt;br /&gt;
    llOwnerSay(&amp;quot;take_camera_control&amp;quot;); // say function name for debugging&lt;br /&gt;
    llOwnerSay( (string)agent);&lt;br /&gt;
    llRequestPermissions(agent, PERMISSION_CONTROL_CAMERA);&lt;br /&gt;
    llSetCameraParams([CAMERA_ACTIVE, 1]); // 1 is active, 0 is inactive&lt;br /&gt;
    on = TRUE;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
release_camera_control(key agent)&lt;br /&gt;
{&lt;br /&gt;
    llOwnerSay(&amp;quot;release_camera_control&amp;quot;); // say function name for debugging&lt;br /&gt;
    llSetCameraParams([CAMERA_ACTIVE, 0]); // 1 is active, 0 is inactive&lt;br /&gt;
    llReleaseCamera(agent);&lt;br /&gt;
    on = FALSE;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
focus_on_me()&lt;br /&gt;
{&lt;br /&gt;
    llOwnerSay(&amp;quot;focus_on_me&amp;quot;); // say function name for debugging&lt;br /&gt;
    //    llClearCameraParams(); // reset camera to default&lt;br /&gt;
    vector here = llGetPos();&lt;br /&gt;
    llSetCameraParams([&lt;br /&gt;
        CAMERA_ACTIVE, 1, // 1 is active, 0 is inactive&lt;br /&gt;
        CAMERA_BEHINDNESS_ANGLE, 0.0, // (0 to 180) degrees&lt;br /&gt;
        CAMERA_BEHINDNESS_LAG, 0.0, // (0 to 3) seconds&lt;br /&gt;
        CAMERA_DISTANCE, 0.0, // ( 0.5 to 10) meters&lt;br /&gt;
        CAMERA_FOCUS, here, // region relative position&lt;br /&gt;
        CAMERA_FOCUS_LAG, 0.0 , // (0 to 3) seconds&lt;br /&gt;
        CAMERA_FOCUS_LOCKED, TRUE, // (TRUE or FALSE)&lt;br /&gt;
        CAMERA_FOCUS_THRESHOLD, 0.0, // (0 to 4) meters&lt;br /&gt;
//        CAMERA_PITCH, 80.0, // (-45 to 80) degrees&lt;br /&gt;
        CAMERA_POSITION, here + &amp;lt;4.0,4.0,4.0&amp;gt;, // region relative position&lt;br /&gt;
        CAMERA_POSITION_LAG, 0.0, // (0 to 3) seconds&lt;br /&gt;
        CAMERA_POSITION_LOCKED, TRUE, // (TRUE or FALSE)&lt;br /&gt;
        CAMERA_POSITION_THRESHOLD, 0.0, // (0 to 4) meters&lt;br /&gt;
        CAMERA_FOCUS_OFFSET, ZERO_VECTOR // &amp;lt;-10,-10,-10&amp;gt; to &amp;lt;10,10,10&amp;gt; meters&lt;br /&gt;
    ]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default_cam()&lt;br /&gt;
{&lt;br /&gt;
//    llOwnerSay(&amp;quot;default_cam&amp;quot;); // say function name for debugging&lt;br /&gt;
    llClearCameraParams(); // reset camera to default&lt;br /&gt;
    llSetCameraParams([CAMERA_ACTIVE, 1]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
driving_cam()&lt;br /&gt;
{&lt;br /&gt;
    llOwnerSay(&amp;quot;driving_cam&amp;quot;); // say function name for debugging&lt;br /&gt;
    default_cam();&lt;br /&gt;
    llSetCameraParams([&lt;br /&gt;
        CAMERA_ACTIVE, 1, // 1 is active, 0 is inactive&lt;br /&gt;
        CAMERA_BEHINDNESS_ANGLE, 45.0, // (0 to 180) degrees&lt;br /&gt;
        CAMERA_BEHINDNESS_LAG, 0.5, // (0 to 3) seconds&lt;br /&gt;
        CAMERA_DISTANCE, 8.0, // ( 0.5 to 10) meters&lt;br /&gt;
        //CAMERA_FOCUS, &amp;lt;0.0,0.0,5.0&amp;gt;, // region relative position&lt;br /&gt;
        CAMERA_FOCUS_LAG, 0.05 , // (0 to 3) seconds&lt;br /&gt;
        CAMERA_FOCUS_LOCKED, FALSE, // (TRUE or FALSE)&lt;br /&gt;
        CAMERA_FOCUS_THRESHOLD, 0.0, // (0 to 4) meters&lt;br /&gt;
        CAMERA_PITCH, 20.0, // (-45 to 80) degrees&lt;br /&gt;
        //CAMERA_POSITION, &amp;lt;0.0,0.0,0.0&amp;gt;, // region relative position&lt;br /&gt;
        CAMERA_POSITION_LAG, 0.1, // (0 to 3) seconds&lt;br /&gt;
        CAMERA_POSITION_LOCKED, FALSE, // (TRUE or FALSE)&lt;br /&gt;
        CAMERA_POSITION_THRESHOLD, 0.0, // (0 to 4) meters&lt;br /&gt;
        CAMERA_FOCUS_OFFSET, &amp;lt;3.0,0.0,2.0&amp;gt; // &amp;lt;-10,-10,-10&amp;gt; to &amp;lt;10,10,10&amp;gt; meters&lt;br /&gt;
    ]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
side_cam()&lt;br /&gt;
{&lt;br /&gt;
    llOwnerSay(&amp;quot;side_cam&amp;quot;); // say function name for debugging&lt;br /&gt;
    llClearCameraParams(); // reset camera to default&lt;br /&gt;
    llSetCameraParams([&lt;br /&gt;
        CAMERA_ACTIVE, 1, // 1 is active, 0 is inactive&lt;br /&gt;
        CAMERA_BEHINDNESS_ANGLE, 0.0, // (0 to 180) degrees&lt;br /&gt;
        CAMERA_BEHINDNESS_LAG, 0.0, // (0 to 3) seconds&lt;br /&gt;
        CAMERA_DISTANCE, 0.0, // ( 0.5 to 10) meters&lt;br /&gt;
        //CAMERA_FOCUS, &amp;lt;0.0,0.0,5.0&amp;gt;, // region relative position&lt;br /&gt;
        CAMERA_FOCUS_LAG, 0.0 , // (0 to 3) seconds&lt;br /&gt;
//        CAMERA_FOCUS_LOCKED, FALSE, // (TRUE or FALSE)&lt;br /&gt;
        CAMERA_FOCUS_THRESHOLD, 0.0, // (0 to 4) meters&lt;br /&gt;
//        CAMERA_PITCH, 80.0, // (-45 to 80) degrees&lt;br /&gt;
        //CAMERA_POSITION, &amp;lt;0.0,0.0,0.0&amp;gt;, // region relative position&lt;br /&gt;
        CAMERA_POSITION_LAG, 0.0, // (0 to 3) seconds&lt;br /&gt;
//        CAMERA_POSITION_LOCKED, FALSE, // (TRUE or FALSE)&lt;br /&gt;
        CAMERA_POSITION_THRESHOLD, 0.0, // (0 to 4) meters&lt;br /&gt;
        CAMERA_FOCUS_OFFSET, &amp;lt;0.0,3.0,0.0&amp;gt; // &amp;lt;-10,-10,-10&amp;gt; to &amp;lt;10,10,10&amp;gt; meters&lt;br /&gt;
    ]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
rearview_cam()&lt;br /&gt;
{&lt;br /&gt;
    llOwnerSay(&amp;quot;rearview_cam&amp;quot;); // say function name for debugging&lt;br /&gt;
    llSetCameraParams([&lt;br /&gt;
        CAMERA_ACTIVE, 1, // 1 is active, 0 is inactive&lt;br /&gt;
        CAMERA_BEHINDNESS_ANGLE, 180.0, // (0 to 180) degrees&lt;br /&gt;
        CAMERA_BEHINDNESS_LAG, 0.0, // (0 to 3) seconds&lt;br /&gt;
//        CAMERA_DISTANCE, 10.0, // ( 0.5 to 10) meters&lt;br /&gt;
        //CAMERA_FOCUS, &amp;lt;0.0,0.0,5.0&amp;gt;, // region relative position&lt;br /&gt;
        CAMERA_FOCUS_LAG, 3.0 , // (0 to 3) seconds&lt;br /&gt;
//        CAMERA_FOCUS_LOCKED, FALSE, // (TRUE or FALSE)&lt;br /&gt;
        CAMERA_FOCUS_THRESHOLD, 0.0, // (0 to 4) meters&lt;br /&gt;
//        CAMERA_PITCH, 80.0, // (-45 to 80) degrees&lt;br /&gt;
        //CAMERA_POSITION, &amp;lt;0.0,0.0,0.0&amp;gt;, // region relative position&lt;br /&gt;
//        CAMERA_POSITION_LAG, 0.0, // (0 to 3) seconds&lt;br /&gt;
//        CAMERA_POSITION_LOCKED, FALSE, // (TRUE or FALSE)&lt;br /&gt;
        CAMERA_POSITION_THRESHOLD, 0.0, // (0 to 4) meters&lt;br /&gt;
        CAMERA_FOCUS_OFFSET, &amp;lt;5.0,2.0,-2.0&amp;gt; // &amp;lt;-10,-10,-10&amp;gt; to &amp;lt;10,10,10&amp;gt; meters&lt;br /&gt;
    ]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
overhead_cam()&lt;br /&gt;
{&lt;br /&gt;
    llOwnerSay(&amp;quot;overhead_cam&amp;quot;); // say function name for debugging&lt;br /&gt;
    default_cam();&lt;br /&gt;
    llSetCameraParams([&lt;br /&gt;
        CAMERA_ACTIVE, 1, // 1 is active, 0 is inactive&lt;br /&gt;
        CAMERA_BEHINDNESS_ANGLE, 180.0, // (0 to 180) degrees&lt;br /&gt;
        CAMERA_BEHINDNESS_LAG, 0.5, // (0 to 3) seconds&lt;br /&gt;
        CAMERA_DISTANCE, 10.0, // ( 0.5 to 10) meters&lt;br /&gt;
        //CAMERA_FOCUS, &amp;lt;0.0,0.0,5.0&amp;gt;, // region relative position&lt;br /&gt;
        CAMERA_FOCUS_LAG, 0.05 , // (0 to 3) seconds&lt;br /&gt;
        CAMERA_FOCUS_LOCKED, FALSE, // (TRUE or FALSE)&lt;br /&gt;
        CAMERA_FOCUS_THRESHOLD, 0.0, // (0 to 4) meters&lt;br /&gt;
        CAMERA_PITCH, 80.0, // (-45 to 80) degrees&lt;br /&gt;
        //CAMERA_POSITION, &amp;lt;0.0,0.0,0.0&amp;gt;, // region relative position&lt;br /&gt;
        CAMERA_POSITION_LAG, 0.0, // (0 to 3) seconds&lt;br /&gt;
        CAMERA_POSITION_LOCKED, FALSE, // (TRUE or FALSE)&lt;br /&gt;
        CAMERA_POSITION_THRESHOLD, 0.0, // (0 to 4) meters&lt;br /&gt;
        CAMERA_FOCUS_OFFSET, &amp;lt;0.0,0.0,0.0&amp;gt; // &amp;lt;-10,-10,-10&amp;gt; to &amp;lt;10,10,10&amp;gt; meters&lt;br /&gt;
    ]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
drop_camera_5_seconds()&lt;br /&gt;
{&lt;br /&gt;
    llOwnerSay(&amp;quot;drop_camera_5_seconds&amp;quot;); // say function name for debugging&lt;br /&gt;
    llSetCameraParams([&lt;br /&gt;
        CAMERA_ACTIVE, 1, // 1 is active, 0 is inactive&lt;br /&gt;
        CAMERA_BEHINDNESS_ANGLE, 0.0, // (0 to 180) degrees&lt;br /&gt;
        CAMERA_BEHINDNESS_LAG, 0.5, // (0 to 3) seconds&lt;br /&gt;
        CAMERA_DISTANCE, 3.0, // ( 0.5 to 10) meters&lt;br /&gt;
        //CAMERA_FOCUS, &amp;lt;0.0,0.0,5.0&amp;gt;, // region relative position&lt;br /&gt;
        CAMERA_FOCUS_LAG, 2.0, // (0 to 3) seconds&lt;br /&gt;
        CAMERA_FOCUS_LOCKED, FALSE, // (TRUE or FALSE)&lt;br /&gt;
        CAMERA_FOCUS_THRESHOLD, 0.0, // (0 to 4) meters&lt;br /&gt;
        CAMERA_PITCH, 0.0, // (-45 to 80) degrees&lt;br /&gt;
        //CAMERA_POSITION, &amp;lt;0.0,0.0,0.0&amp;gt;, // region relative position&lt;br /&gt;
        CAMERA_POSITION_LAG, 0.05, // (0 to 3) seconds&lt;br /&gt;
        CAMERA_POSITION_LOCKED, TRUE, // (TRUE or FALSE)&lt;br /&gt;
        CAMERA_POSITION_THRESHOLD, 0.0, // (0 to 4) meters&lt;br /&gt;
        CAMERA_FOCUS_OFFSET, &amp;lt;0.0,0.0,0.0&amp;gt; // &amp;lt;-10,-10,-10&amp;gt; to &amp;lt;10,10,10&amp;gt; meters&lt;br /&gt;
    ]);&lt;br /&gt;
    llSleep(5);&lt;br /&gt;
    default_cam();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
worm_cam()&lt;br /&gt;
{&lt;br /&gt;
    llOwnerSay(&amp;quot;worm_cam&amp;quot;); // say function name for debugging&lt;br /&gt;
    llSetCameraParams([&lt;br /&gt;
        CAMERA_ACTIVE, 1, // 1 is active, 0 is inactive&lt;br /&gt;
        CAMERA_BEHINDNESS_ANGLE, 180.0, // (0 to 180) degrees&lt;br /&gt;
        CAMERA_BEHINDNESS_LAG, 0.0, // (0 to 3) seconds&lt;br /&gt;
        CAMERA_DISTANCE, 8.0, // ( 0.5 to 10) meters&lt;br /&gt;
        //CAMERA_FOCUS, &amp;lt;0.0,0.0,5.0&amp;gt;, // region relative position&lt;br /&gt;
        CAMERA_FOCUS_LAG, 0.0 , // (0 to 3) seconds&lt;br /&gt;
        CAMERA_FOCUS_LOCKED, FALSE, // (TRUE or FALSE)&lt;br /&gt;
        CAMERA_FOCUS_THRESHOLD, 4.0, // (0 to 4) meters&lt;br /&gt;
        CAMERA_PITCH, -45.0, // (-45 to 80) degrees&lt;br /&gt;
        //CAMERA_POSITION, &amp;lt;0.0,0.0,0.0&amp;gt;, // region relative position&lt;br /&gt;
        CAMERA_POSITION_LAG, 1.0, // (0 to 3) seconds&lt;br /&gt;
        CAMERA_POSITION_LOCKED, FALSE, // (TRUE or FALSE)&lt;br /&gt;
        CAMERA_POSITION_THRESHOLD, 1.0, // (0 to 4) meters&lt;br /&gt;
        CAMERA_FOCUS_OFFSET, &amp;lt;0.0,0.0,0.0&amp;gt; // &amp;lt;-10,-10,-10&amp;gt; to &amp;lt;10,10,10&amp;gt; meters&lt;br /&gt;
    ]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
spaz_cam()&lt;br /&gt;
{&lt;br /&gt;
    llOwnerSay(&amp;quot;spaz_cam for 5 seconds&amp;quot;); // say function name for debugging&lt;br /&gt;
    float i;&lt;br /&gt;
    for (i=0; i&amp;lt; 50; i+=1)&lt;br /&gt;
    {&lt;br /&gt;
        vector xyz = llGetPos() + &amp;lt;llFrand(80.0) - 40, llFrand(80.0) - 40, llFrand(10.0)&amp;gt;;&lt;br /&gt;
        //        llOwnerSay((string)xyz);&lt;br /&gt;
        vector xyz2 = llGetPos() + &amp;lt;llFrand(80.0) - 40, llFrand(80.0) - 40, llFrand(10.0)&amp;gt;;&lt;br /&gt;
        llSetCameraParams([&lt;br /&gt;
            CAMERA_ACTIVE, 1, // 1 is active, 0 is inactive&lt;br /&gt;
            CAMERA_BEHINDNESS_ANGLE, 180.0, // (0 to 180) degrees&lt;br /&gt;
            CAMERA_BEHINDNESS_LAG, llFrand(3.0), // (0 to 3) seconds&lt;br /&gt;
            CAMERA_DISTANCE, llFrand(10.0), // ( 0.5 to 10) meters&lt;br /&gt;
            //CAMERA_FOCUS, xyz, // region relative position&lt;br /&gt;
            CAMERA_FOCUS_LAG, llFrand(3.0), // (0 to 3) seconds&lt;br /&gt;
            CAMERA_FOCUS_LOCKED, TRUE, // (TRUE or FALSE)&lt;br /&gt;
            CAMERA_FOCUS_THRESHOLD, llFrand(4.0), // (0 to 4) meters&lt;br /&gt;
            CAMERA_PITCH, llFrand(125.0) - 45, // (-45 to 80) degrees&lt;br /&gt;
            CAMERA_POSITION, xyz2, // region relative position&lt;br /&gt;
            CAMERA_POSITION_LAG, llFrand(3.0), // (0 to 3) seconds&lt;br /&gt;
            CAMERA_POSITION_LOCKED, TRUE, // (TRUE or FALSE)&lt;br /&gt;
            CAMERA_POSITION_THRESHOLD, llFrand(4.0), // (0 to 4) meters&lt;br /&gt;
            CAMERA_FOCUS_OFFSET, &amp;lt;llFrand(20.0) - 10, llFrand(20.0) - 10, llFrand(20) - 10&amp;gt; // &amp;lt;-10,-10,-10&amp;gt; to &amp;lt;10,10,10&amp;gt; meters&lt;br /&gt;
        ]);&lt;br /&gt;
        llSleep(0.1);&lt;br /&gt;
    }&lt;br /&gt;
    default_cam();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
spin_cam()&lt;br /&gt;
{&lt;br /&gt;
    llSetCameraParams([&lt;br /&gt;
        CAMERA_ACTIVE, 1, // 1 is active, 0 is inactive&lt;br /&gt;
        CAMERA_BEHINDNESS_ANGLE, 180.0, // (0 to 180) degrees&lt;br /&gt;
        CAMERA_BEHINDNESS_LAG, 0.5, // (0 to 3) seconds&lt;br /&gt;
        //CAMERA_DISTANCE, 10.0, // ( 0.5 to 10) meters&lt;br /&gt;
        //CAMERA_FOCUS, &amp;lt;0.0,0.0,5.0&amp;gt;, // region relative position&lt;br /&gt;
        CAMERA_FOCUS_LAG, 0.05 , // (0 to 3) seconds&lt;br /&gt;
        CAMERA_FOCUS_LOCKED, FALSE, // (TRUE or FALSE)&lt;br /&gt;
        CAMERA_FOCUS_THRESHOLD, 0.0, // (0 to 4) meters&lt;br /&gt;
        CAMERA_PITCH, 30.0, // (-45 to 80) degrees&lt;br /&gt;
        //CAMERA_POSITION, &amp;lt;0.0,0.0,0.0&amp;gt;, // region relative position&lt;br /&gt;
        CAMERA_POSITION_LAG, 0.0, // (0 to 3) seconds&lt;br /&gt;
        CAMERA_POSITION_LOCKED, FALSE, // (TRUE or FALSE)&lt;br /&gt;
        CAMERA_POSITION_THRESHOLD, 0.0, // (0 to 4) meters&lt;br /&gt;
        CAMERA_FOCUS_OFFSET, &amp;lt;0.0,0.0,0.0&amp;gt; // &amp;lt;-10,-10,-10&amp;gt; to &amp;lt;10,10,10&amp;gt; meters&lt;br /&gt;
    ]);&lt;br /&gt;
&lt;br /&gt;
    float i;&lt;br /&gt;
    vector camera_position;&lt;br /&gt;
    for (i=0; i&amp;lt; 2*TWO_PI; i+=.05)&lt;br /&gt;
    {&lt;br /&gt;
        camera_position = llGetPos() + &amp;lt;0.0, 4.0, 0.0&amp;gt; * llEuler2Rot(&amp;lt;0.0, 0.0, i&amp;gt;);&lt;br /&gt;
        llSetCameraParams([CAMERA_POSITION, camera_position]);&lt;br /&gt;
    }&lt;br /&gt;
    default_cam();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
setup_listen()&lt;br /&gt;
{&lt;br /&gt;
    llListenRemove(1);&lt;br /&gt;
    CHANNEL = llRound(llFrand(1) * 100000);&lt;br /&gt;
    integer x = llListen(CHANNEL, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;, &amp;quot;&amp;quot;); // listen for dialog answers&lt;br /&gt;
}&lt;br /&gt;
&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);&lt;br /&gt;
        setup_listen();&lt;br /&gt;
        llSetTimerEvent(2.0);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        integer perm = llGetPermissions();&lt;br /&gt;
        if (perm &amp;amp; PERMISSION_DEBIT)&lt;br /&gt;
        { llOwnerSay(llGetScriptName() + &amp;quot; has PERMISSION_DEBIT perms for &amp;quot;+(string)llGetPermissionsKey()); }&lt;br /&gt;
        if (perm &amp;amp; PERMISSION_TAKE_CONTROLS)&lt;br /&gt;
        { llOwnerSay(llGetScriptName() + &amp;quot; has PERMISSION_TAKE_CONTROLS perms for &amp;quot;+(string)llGetPermissionsKey()); }&lt;br /&gt;
        if (perm &amp;amp; PERMISSION_TRIGGER_ANIMATION)&lt;br /&gt;
        { llOwnerSay(llGetScriptName() + &amp;quot; has PERMISSION_TRIGGER_ANIMATION perms for &amp;quot;+(string)llGetPermissionsKey()); }&lt;br /&gt;
        if (perm &amp;amp; PERMISSION_ATTACH)&lt;br /&gt;
        { llOwnerSay(llGetScriptName() + &amp;quot; has PERMISSION_ATTACH perms for &amp;quot;+(string)llGetPermissionsKey()); }&lt;br /&gt;
        if (perm &amp;amp; PERMISSION_CHANGE_LINKS)&lt;br /&gt;
        { llOwnerSay(llGetScriptName() + &amp;quot; has PERMISSION_CHANGE_LINKS perms for &amp;quot;+(string)llGetPermissionsKey()); }&lt;br /&gt;
        if (perm &amp;amp; PERMISSION_TRACK_CAMERA)&lt;br /&gt;
        { llOwnerSay(llGetScriptName() + &amp;quot; has PERMISSION_TRACK_CAMERA perms for &amp;quot;+(string)llGetPermissionsKey()); }&lt;br /&gt;
        if (perm &amp;amp; PERMISSION_CONTROL_CAMERA)&lt;br /&gt;
        { llOwnerSay(llGetScriptName() + &amp;quot; has PERMISSION_CONTROL_CAMERA perms for &amp;quot;+(string)llGetPermissionsKey()); }&lt;br /&gt;
        if (perm == 0)&lt;br /&gt;
        { llOwnerSay(llGetScriptName() + &amp;quot; has NO perms for &amp;quot;+(string)llGetPermissionsKey()); }&lt;br /&gt;
&lt;br /&gt;
        llDialog(llDetectedKey(0), &amp;quot;What do you want to do?&amp;quot;, MENU_MAIN, CHANNEL); // present dialog on click&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 (~llListFindList(MENU_MAIN + MENU_2, [message]))  // verify dialog choice&lt;br /&gt;
//        if (~llListFindList(MENU_MAIN, [message]))  // verify dialog choice&lt;br /&gt;
        {&lt;br /&gt;
//            llOwnerSay(name + &amp;quot; picked the option &#039;&amp;quot; + message + &amp;quot;&#039;.&amp;quot;); // output the answer&lt;br /&gt;
            if (message == &amp;quot;More...&amp;quot;)&lt;br /&gt;
                llDialog(id, &amp;quot;Pick an option!&amp;quot;, MENU_2, CHANNEL); // present submenu on request&lt;br /&gt;
            else if (message == &amp;quot;...Back&amp;quot;)&lt;br /&gt;
                llDialog(id, &amp;quot;What do you want to do?&amp;quot;, MENU_MAIN, CHANNEL); // present main menu on request to go back&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
            else if (message == &amp;quot;Cam ON&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                take_camera_control(id);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            else if (message == &amp;quot;Cam OFF&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                release_camera_control(id);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            else if (message == &amp;quot;Default&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                default_cam();&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            else if (message == &amp;quot;Driving Cam&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                driving_cam();&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            else if (message == &amp;quot;Worm Cam&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                worm_cam();&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            else if (message == &amp;quot;Overhead Cam&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                overhead_cam();&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            else if (message == &amp;quot;Spaz Cam&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                spaz_cam();&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            else if (message == &amp;quot;Side Cam&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                side_cam();&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            else if (message == &amp;quot;Drop Cam&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                drop_camera_5_seconds();&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            else if (message == &amp;quot;Trap Toggle&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                trap = !trap;&lt;br /&gt;
                if (trap == 1) {&lt;br /&gt;
                    llOwnerSay(&amp;quot;trap is on&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
                else {&lt;br /&gt;
                    llOwnerSay(&amp;quot;trap is off&amp;quot;);&lt;br /&gt;
                }&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            else if (message == &amp;quot;Spin Cam&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                spin_cam();&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
        } else&lt;br /&gt;
        llOwnerSay(name + &amp;quot; picked invalid option &#039;&amp;quot; + llToLower(message) + &amp;quot;&#039;.&amp;quot;); // not a valid dialog choice&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    run_time_permissions(integer perm) {&lt;br /&gt;
        if (perm &amp;amp; PERMISSION_CONTROL_CAMERA) {&lt;br /&gt;
            llSetCameraParams([CAMERA_ACTIVE, 1]); // 1 is active, 0 is inactive&lt;br /&gt;
            llOwnerSay(&amp;quot;Camera permissions have been taken&amp;quot;);&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_LINK)&lt;br /&gt;
        {&lt;br /&gt;
            key agent = llAvatarOnSitTarget();&lt;br /&gt;
            if (agent)&lt;br /&gt;
            {&lt;br /&gt;
                setup_listen();&lt;br /&gt;
                llRequestPermissions(agent, PERMISSION_CONTROL_CAMERA);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    attach(key agent)&lt;br /&gt;
    {&lt;br /&gt;
        if (agent)&lt;br /&gt;
        {&lt;br /&gt;
            setup_listen();&lt;br /&gt;
            llRequestPermissions(agent, PERMISSION_CONTROL_CAMERA);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        if (trap == 1)&lt;br /&gt;
        {&lt;br /&gt;
            focus_on_me();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Lady Sumoku</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlSetBuoyancy&amp;diff=1194511</id>
		<title>LlSetBuoyancy</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlSetBuoyancy&amp;diff=1194511"/>
		<updated>2015-01-22T22:03:25Z</updated>

		<summary type="html">&lt;p&gt;Lady Sumoku: Replaced old &amp;lt;LSL&amp;gt; block with &amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Function&lt;br /&gt;
|func_id=122&lt;br /&gt;
|func_sleep=0.0&lt;br /&gt;
|func_energy=10.0&lt;br /&gt;
|func=llSetBuoyancy&lt;br /&gt;
|p1_type=float|p1_name=buoyancy|p1_desc&lt;br /&gt;
|func_desc=Sets the buoyancy of the task or object. Requires [[STATUS_PHYSICS|physics]] to be enabled.&lt;br /&gt;
|func_footnote=A &#039;&#039;&#039;buoyancy&#039;&#039;&#039; value of 0.0 disables the effect&amp;lt;br/&amp;gt;when &#039;&#039;&#039;buoyancy&#039;&#039;&#039; is &amp;lt; 1.0, the object sinks &amp;lt;br/&amp;gt;when &#039;&#039;&#039;buoyancy&#039;&#039;&#039; equals 1.0 it floats &amp;lt;br/&amp;gt;when &#039;&#039;&#039;buoyancy&#039;&#039;&#039; is &amp;gt; 1.0 the object rises&lt;br /&gt;
|spec&lt;br /&gt;
|caveats=*[[llWind|Wind]] can cause the prim to drift. (server 1.38.4 this appears not to be true)&lt;br /&gt;
*Unlike some other characteristics, a buoyancy effect is cancelled if the script that set buoyancy is removed from the prim.&lt;br /&gt;
*This function cannot be used to set relative levels of buoyancy in parts of a linked object e.g. to simulate a helium balloon weighted by its string. The most recent call of &amp;lt;code&amp;gt;llSetBuoyancy&amp;lt;/code&amp;gt; in any child prim appears to set the global buoyancy level for the object.&lt;br /&gt;
*This function eats [[energy]] to keep the object floating. Large objects may not be able to supply enough energy to keep the object floating. &lt;br /&gt;
* For better performance, replace by [[llSetPhysicsMaterial]](GRAVITY_MULTIPLIER, gravity, 0.0,0.0,0.0) which doesn&#039;t eat energy&lt;br /&gt;
&amp;lt;br&amp;gt; For example, replace llSetBuoyancy(1.5) by  llSetPhysicsMaterial( GRAVITY_MULTIPLIER, -0.5 ,0.0, 0.0, 0.0 ) to raise an object; replace llSetBuoyancy(1.0) by  llSetPhysicsMaterial( GRAVITY_MULTIPLIER, 0.0 ,0.0, 0.0, 0.0 ) to float an object&lt;br /&gt;
* When buoyancy is changed, the object briefly continues to be affected by the last value. For example, if buoyancy was set it to 1.5 to raise an object, and whilst moving, buoyancy is changed it to 0.0, the object continues to rise for a moment, because  the force is not reversed, only cancelled. With llSetPhysicsMaterial( GRAVITY_MULTIPLIER, -0.5 ,0.0, 0.0, 0.0 ) followed by llSetPhysicsMaterial( GRAVITY_MULTIPLIER, 1.0 ,0.0, 0.0, 0.0 ), the change in movement is immediate, and the object starts to fall at the instant that the second call is done.&lt;br /&gt;
|constants .&lt;br /&gt;
|examples=Makes an object float up slowly (e.g. a red balloon)&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSetStatus(STATUS_PHYSICS, TRUE);&lt;br /&gt;
        llSetBuoyancy(1.05);&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
|helpers&lt;br /&gt;
|also_functions&lt;br /&gt;
|also_tests&lt;br /&gt;
|also_events&lt;br /&gt;
|also_articles&lt;br /&gt;
|notes=Often used to make an object appear to be unaffected by gravity.&lt;br /&gt;
|cat1=Hover&lt;br /&gt;
|cat2=Physics&lt;br /&gt;
|cat3=Movement&lt;br /&gt;
|cat4&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Lady Sumoku</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlSetCameraAtOffset&amp;diff=1194510</id>
		<title>LlSetCameraAtOffset</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlSetCameraAtOffset&amp;diff=1194510"/>
		<updated>2015-01-22T22:02:05Z</updated>

		<summary type="html">&lt;p&gt;Lady Sumoku: Replaced old &amp;lt;LSL&amp;gt; block with &amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function&lt;br /&gt;
|inject-2={{LSL Function/offset|offset}}&lt;br /&gt;
|func_id=244|func_sleep=0.0|func_energy=10.0&lt;br /&gt;
|func=llSetCameraAtOffset&lt;br /&gt;
|p1_type=vector|p1_name=offset&lt;br /&gt;
|func_desc=Sets the point the camera is looking at to {{LSLP|offset}} for avatars that sit on the object.&lt;br /&gt;
|func_footnote=This is the point the camera looks at, not the [[llSetCameraEyeOffset|position of the camera&#039;s eye]].&lt;br /&gt;
|return_text&lt;br /&gt;
|spec&lt;br /&gt;
|caveats=&lt;br /&gt;
* Setting this will not update the cameras of seated avatars, it will only effect avatars that subsequently sit down. The camera settings have to be prepared in advance.&lt;br /&gt;
* The {{LSLP|offset}} is [[Viewer_coordinate_frames#Local|locally relative]] to the object, if you want it relative to the seated [[Viewer_coordinate_frames#Agent|avatar]] (which likely has a custom sit rotation and offset) or the [[Viewer_coordinate_frames#Region|region]], you must do the computation yourself.&lt;br /&gt;
* [[ZERO_VECTOR]] {{LSLP|offset}} will cancel any offset.&lt;br /&gt;
* Camera focus set by this function is a &#039;&#039;&#039;Prim Property&#039;&#039;&#039;. &#039;&#039;&#039;It will survive the script&#039;&#039;&#039; and it will survive prim taking and prim rezzing&lt;br /&gt;
|constants&lt;br /&gt;
|examples=&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Set the seated avatar looking at an arbitrary direction&lt;br /&gt;
// Look over the avatar&#039;s shoulders from behind once it sits down&lt;br /&gt;
&lt;br /&gt;
back_view(float degrees)&lt;br /&gt;
{&lt;br /&gt;
     rotation sitRot = llAxisAngle2Rot(&amp;lt;0, 0, 1&amp;gt;, degrees * DEG_TO_RAD);&lt;br /&gt;
    &lt;br /&gt;
     llSitTarget(&amp;lt;0, 0, 0.1&amp;gt;, sitRot);&lt;br /&gt;
        &lt;br /&gt;
     llSetCameraEyeOffset(&amp;lt;-2, 0, 1&amp;gt; * sitRot);&lt;br /&gt;
     llSetCameraAtOffset(&amp;lt;2, 0, 1&amp;gt; * sitRot);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        back_view( 208 );&lt;br /&gt;
        llSay(0, &amp;quot;Please sit down&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;
{{LSL DefineRow||[[llSetLinkCamera]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llSetCameraEyeOffset]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llForceMouselook]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llSetCameraParams]]|}}&lt;br /&gt;
|also_events&lt;br /&gt;
|also_tests&lt;br /&gt;
|also_articles&lt;br /&gt;
|notes&lt;br /&gt;
|sort=SetCameraAtOffset&lt;br /&gt;
|cat1=Camera&lt;br /&gt;
|cat2=Sit&lt;br /&gt;
|cat3=Vehicle&lt;br /&gt;
|cat4=Prim&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Lady Sumoku</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlSetCameraEyeOffset&amp;diff=1194509</id>
		<title>LlSetCameraEyeOffset</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlSetCameraEyeOffset&amp;diff=1194509"/>
		<updated>2015-01-22T22:01:24Z</updated>

		<summary type="html">&lt;p&gt;Lady Sumoku: Replaced old &amp;lt;LSL&amp;gt; block with &amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function&lt;br /&gt;
|inject-2={{LSL Function/offset|offset}}&lt;br /&gt;
|func_id=243|func_sleep=0.0|func_energy=10.0&lt;br /&gt;
|func=llSetCameraEyeOffset|p1_type=vector|p1_name=offset&lt;br /&gt;
|func_desc=Sets the camera eye {{LSLP|offset}} for avatars that sit on the object.&lt;br /&gt;
|func_footnote=This is the position of the camera&#039;s eye, not the [[llSetCameraAtOffset|point it looks at]].&lt;br /&gt;
|return_text&lt;br /&gt;
|spec&lt;br /&gt;
|caveats=&lt;br /&gt;
* Setting this will not update the cameras of seated avatars, it will only effect avatars that subsequently sit down.  The camera settings have to be prepared in advance.&lt;br /&gt;
* The {{LSLP|offset}} is [[Viewer_coordinate_frames#Local|locally relative]] to the object, if you want it relative to the seated [[Viewer_coordinate_frames#Agent|avatar]] (which likely has a custom sit rotation and offset) or the [[Viewer_coordinate_frames#Region|region]], you must do the computation yourself.&lt;br /&gt;
* [[ZERO_VECTOR]] {{LSLP|offset}} will cancel any eye offset.&lt;br /&gt;
* Camera position set by this function is a &#039;&#039;&#039;Prim Property&#039;&#039;&#039;. &#039;&#039;&#039;It will survive the script&#039;&#039;&#039; and it will survive prim taking and prim rezzing&lt;br /&gt;
|constants&lt;br /&gt;
|examples=&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;// Sit the avatar looking at an arbitrary direction&lt;br /&gt;
// Look over the avatar&#039;s shoulders from behind once it sits down&lt;br /&gt;
&lt;br /&gt;
back_view(float degrees)&lt;br /&gt;
{&lt;br /&gt;
     rotation sitRot = llAxisAngle2Rot(&amp;lt;0, 0, 1&amp;gt;, degrees * DEG_TO_RAD);&lt;br /&gt;
    &lt;br /&gt;
     llSitTarget(&amp;lt;0, 0, 0.1&amp;gt;, sitRot);&lt;br /&gt;
        &lt;br /&gt;
     llSetCameraEyeOffset(&amp;lt;-2, 0, 1&amp;gt; * sitRot);&lt;br /&gt;
     llSetCameraAtOffset(&amp;lt;2, 0, 1&amp;gt; * sitRot);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        back_view( 208 );&lt;br /&gt;
        llSay(0, &amp;quot;Please sit down&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;
{{LSL DefineRow||[[llSetLinkCamera]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llSetCameraAtOffset]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llForceMouselook]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llSetCameraParams]]|}}&lt;br /&gt;
|also_events&lt;br /&gt;
|also_tests&lt;br /&gt;
|also_articles&lt;br /&gt;
|notes&lt;br /&gt;
|cat1=Camera&lt;br /&gt;
|cat2=Sit&lt;br /&gt;
|cat3=Vehicle&lt;br /&gt;
|cat4=Prim&lt;br /&gt;
|cat5&lt;br /&gt;
|cat6&lt;br /&gt;
|cat7&lt;br /&gt;
|cat8&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Lady Sumoku</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlSetCameraParams&amp;diff=1194508</id>
		<title>LlSetCameraParams</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlSetCameraParams&amp;diff=1194508"/>
		<updated>2015-01-22T22:00:32Z</updated>

		<summary type="html">&lt;p&gt;Lady Sumoku: Replaced old &amp;lt;LSL&amp;gt; block with &amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function&lt;br /&gt;
|inject-2={{Issues/SCR-325}}{{Issues/SCR-326}}{{Issues/SCR-327}}{{LSL_Function/permission|PERMISSION_CONTROL_CAMERA}}&lt;br /&gt;
|func_id=313|func_sleep=0.0|func_energy=10.0&lt;br /&gt;
|func=llSetCameraParams&lt;br /&gt;
|p1_type=list|p1_subtype=instructions|p1_name=rules|p1_desc=Format is [ rule1, data1, rule2, data2 . . . rulen, datan ]&lt;br /&gt;
|func_footnote&lt;br /&gt;
|func_desc=Sets multiple camera parameters at once.&lt;br /&gt;
|return_text&lt;br /&gt;
|spec&lt;br /&gt;
|caveats=*Camera control currently (server 1.38) only supported for attachments and objects on which you are sitting. An attempt otherwise will result in an error being shouted on [[DEBUG_CHANNEL]].&lt;br /&gt;
*Scripted camera parameters will not set for the agent if the last controls they used were their camera controls. Manual camera control will override set parameters too.&lt;br /&gt;
|examples=&lt;br /&gt;
&lt;br /&gt;
You can either set the camera in region relative coordinates or you can make the camera follow your avatar.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Region relative coordinates, an example:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;lookAtMe( integer perms )&lt;br /&gt;
{&lt;br /&gt;
    if ( perms &amp;amp; PERMISSION_CONTROL_CAMERA )&lt;br /&gt;
    {&lt;br /&gt;
        vector camPos = llGetPos() + (relCamP * llGetRot() * turnOnChair) ;&lt;br /&gt;
        vector camFocus = llGetPos() ;&lt;br /&gt;
        llClearCameraParams(); // reset camera to default&lt;br /&gt;
        llSetCameraParams([&lt;br /&gt;
            CAMERA_ACTIVE, 1, // 1 is active, 0 is inactive&lt;br /&gt;
            CAMERA_FOCUS, camFocus, // region relative position&lt;br /&gt;
            CAMERA_FOCUS_LOCKED, TRUE, // (TRUE or FALSE)&lt;br /&gt;
            CAMERA_POSITION, camPos, // region relative position&lt;br /&gt;
            CAMERA_POSITION_LOCKED, TRUE // (TRUE or FALSE)&lt;br /&gt;
        ]);&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
Note that Focus and Position are both locked. This first example makes the camera look at &#039;&#039;camFocus&#039;&#039; from &#039;&#039;camPos&#039;&#039;. &lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Camera follow avatar, an example:&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;lookAtMe( integer perms )&lt;br /&gt;
{&lt;br /&gt;
    if ( perms &amp;amp; PERMISSION_CONTROL_CAMERA )&lt;br /&gt;
    {&lt;br /&gt;
        llClearCameraParams(); // reset camera to default&lt;br /&gt;
        llSetCameraParams([&lt;br /&gt;
            CAMERA_ACTIVE, 1, // 1 is active, 0 is inactive&lt;br /&gt;
            CAMERA_BEHINDNESS_ANGLE, 30.0, // (0 to 180) degrees&lt;br /&gt;
            CAMERA_BEHINDNESS_LAG, 0.0, // (0 to 3) seconds&lt;br /&gt;
            CAMERA_DISTANCE, 10.0, // ( 0.5 to 10) meters&lt;br /&gt;
          //CAMERA_FOCUS, &amp;lt;0,0,5&amp;gt;, // region relative position&lt;br /&gt;
            CAMERA_FOCUS_LAG, 0.05 , // (0 to 3) seconds&lt;br /&gt;
            CAMERA_FOCUS_LOCKED, FALSE, // (TRUE or FALSE)&lt;br /&gt;
            CAMERA_FOCUS_THRESHOLD, 0.0, // (0 to 4) meters&lt;br /&gt;
            CAMERA_PITCH, 10.0, // (-45 to 80) degrees&lt;br /&gt;
          //CAMERA_POSITION, &amp;lt;0,0,0&amp;gt;, // region relative position&lt;br /&gt;
            CAMERA_POSITION_LAG, 0.0, // (0 to 3) seconds&lt;br /&gt;
            CAMERA_POSITION_LOCKED, FALSE, // (TRUE or FALSE)&lt;br /&gt;
            CAMERA_POSITION_THRESHOLD, 0.0, // (0 to 4) meters&lt;br /&gt;
            CAMERA_FOCUS_OFFSET, &amp;lt;2.0, 0.0, 0.0&amp;gt; // &amp;lt;-10,-10,-10&amp;gt; to &amp;lt;10,10,10&amp;gt; meters&lt;br /&gt;
        ]);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
Note that in this second example Focus and Position are NOT locked and not even set. This is appropriate for making the camera follow a pilot on a vehicle.&lt;br /&gt;
|helpers&lt;br /&gt;
|also_functions=&lt;br /&gt;
{{LSL DefineRow||[[llClearCameraParams]]}}&lt;br /&gt;
{{LSL DefineRow||[[llGetCameraPos]]}}&lt;br /&gt;
{{LSL DefineRow||[[llGetCameraRot]]}}&lt;br /&gt;
|also_events&lt;br /&gt;
|also_tests=&lt;br /&gt;
{{LSL DefineRow||[[llSetCameraParams Test]]}}&lt;br /&gt;
|also_articles=&lt;br /&gt;
{{LSL DefineRow||[[FollowCam]]}}&lt;br /&gt;
|notes&lt;br /&gt;
|cat1=Camera&lt;br /&gt;
|cat2&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
|constants={{{!}} class=&amp;quot;sortable&amp;quot; {{Prettytable|style=margin-top:0;}}&lt;br /&gt;
{{!}}- {{Hl2}}&lt;br /&gt;
! Rule&lt;br /&gt;
!&lt;br /&gt;
! Parameter&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;{{!}} Default&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;{{!}} Value Range&lt;br /&gt;
!class=&amp;quot;unsortable&amp;quot;{{!}} Description&lt;br /&gt;
{{!}}- &lt;br /&gt;
{{!}} {{LSL Const|CAMERA_ACTIVE|integer|12}}&lt;br /&gt;
{{!}} {{#var:cvalue}}&amp;amp;nbsp;&amp;amp;nbsp;&lt;br /&gt;
{{!}} [[integer]]&amp;amp;nbsp;isActive&lt;br /&gt;
{{!}} {{LSL Const|FALSE|integer|0}}&lt;br /&gt;
{{!}} {{LSL Const|TRUE|integer|1}} or {{LSL Const|FALSE|integer|0}}&lt;br /&gt;
{{!}} Turns on or off [[script|scripted]] control of the camera.&lt;br /&gt;
{{!}}- &lt;br /&gt;
{{!}} {{LSL Const|CAMERA_BEHINDNESS_ANGLE|integer|8}}&lt;br /&gt;
{{!}} {{#var:cvalue}}&lt;br /&gt;
{{!}} [[float]]&amp;amp;nbsp;degrees&lt;br /&gt;
{{!}} 10.0&lt;br /&gt;
{{!}} 0 to 180&lt;br /&gt;
{{!}} Sets the angle in degrees within which the camera is not constrained by changes in target rotation.&lt;br /&gt;
{{!}}- &lt;br /&gt;
{{!}} {{LSL Const|CAMERA_BEHINDNESS_LAG|integer|9}}&lt;br /&gt;
{{!}} {{#var:cvalue}}&lt;br /&gt;
{{!}} [[float]]&amp;amp;nbsp;seconds&lt;br /&gt;
{{!}} 0.0&lt;br /&gt;
{{!}} 0 to 3&lt;br /&gt;
{{!}} Sets how strongly the camera is forced to stay behind the target if outside of behindness angle.&lt;br /&gt;
{{!}}- &lt;br /&gt;
{{!}} {{LSL Const|CAMERA_DISTANCE|integer|7}}&lt;br /&gt;
{{!}} {{#var:cvalue}}&lt;br /&gt;
{{!}} [[float]]&amp;amp;nbsp;meters&lt;br /&gt;
{{!}} 3.0&lt;br /&gt;
{{!}} 0.5 to 50&lt;br /&gt;
{{!}} Sets how far away the camera wants to be from its target.&lt;br /&gt;
{{!}}- &lt;br /&gt;
{{!}} {{LSL Const|CAMERA_FOCUS|integer|17}}&lt;br /&gt;
{{!}} {{#var:cvalue}}&lt;br /&gt;
{{!}} [[vector]]&amp;amp;nbsp;position&lt;br /&gt;
{{!}} n/a&lt;br /&gt;
{{!}} n/a&lt;br /&gt;
{{!}} Sets camera focus (target position) in [[Viewer coordinate frames#Region|region coordinates]].&lt;br /&gt;
{{!}}- &lt;br /&gt;
{{!}} {{LSL Const|CAMERA_FOCUS_LAG|integer|6}}&lt;br /&gt;
{{!}} {{#var:cvalue}}&lt;br /&gt;
{{!}} [[float]]&amp;amp;nbsp;seconds&lt;br /&gt;
{{!}} 0.1&lt;br /&gt;
{{!}} 0 to 3&lt;br /&gt;
{{!}} How much the camera lags as it tries to aim towards the target.&lt;br /&gt;
{{!}}- &lt;br /&gt;
{{!}} {{LSL Const|CAMERA_FOCUS_LOCKED|integer|22}}&lt;br /&gt;
{{!}} {{#var:cvalue}}&lt;br /&gt;
{{!}} [[integer]]&amp;amp;nbsp;isLocked&lt;br /&gt;
{{!}} {{LSL Const|FALSE|integer|0}}&lt;br /&gt;
{{!}} {{LSL Const|TRUE|integer|1}} or {{LSL Const|FALSE|integer|0}}&lt;br /&gt;
{{!}} Locks the camera focus so it will not move.&lt;br /&gt;
{{!}}- &lt;br /&gt;
{{!}} {{LSL Const|CAMERA_FOCUS_OFFSET|integer|1}}&lt;br /&gt;
{{!}} {{#var:cvalue}}&lt;br /&gt;
{{!}} [[vector]]&amp;amp;nbsp;[[meter|meters]]&lt;br /&gt;
{{!}} &amp;lt;0.0,0.0,0.0&amp;gt;&lt;br /&gt;
{{!}} &amp;lt;-10,-10,-10&amp;gt; to &amp;lt;10,10,10&amp;gt;&lt;br /&gt;
{{!}} Adjusts the camera focus [[position]] relative to the target.&lt;br /&gt;
{{!}}- &lt;br /&gt;
{{!}} {{LSL Const|CAMERA_FOCUS_THRESHOLD|integer|11}}&lt;br /&gt;
{{!}} {{#var:cvalue}}&lt;br /&gt;
{{!}} [[float]]&amp;amp;nbsp;meters&lt;br /&gt;
{{!}} 1.0&lt;br /&gt;
{{!}} 0 to 4&lt;br /&gt;
{{!}} Sets the radius of a sphere around the camera&#039;s target position within which its focus is not affected by target motion.&lt;br /&gt;
{{!}}- &lt;br /&gt;
{{!}} {{LSL Const|CAMERA_PITCH|integer|0}}&lt;br /&gt;
{{!}} {{#var:cvalue}}&lt;br /&gt;
{{!}} [[float]]&amp;amp;nbsp;degrees&lt;br /&gt;
{{!}} 0.0&lt;br /&gt;
{{!}} -45 to 80&lt;br /&gt;
{{!}} Adjusts the angular amount that the camera aims straight ahead vs. straight down, maintaining the same distance; analogous to &#039;incidence&#039;.&amp;quot;&lt;br /&gt;
{{!}}- &lt;br /&gt;
{{!}} {{LSL Const|CAMERA_POSITION|integer|13}}&lt;br /&gt;
{{!}} {{#var:cvalue}}&lt;br /&gt;
{{!}} [[vector]]&amp;amp;nbsp;position&lt;br /&gt;
{{!}} n/a&lt;br /&gt;
{{!}} n/a&lt;br /&gt;
{{!}} Sets camera position in [[Viewer coordinate frames#Region|region coordinates]].&lt;br /&gt;
{{!}}- &lt;br /&gt;
{{!}} {{LSL Const|CAMERA_POSITION_LAG|integer|5}}&lt;br /&gt;
{{!}} {{#var:cvalue}}&lt;br /&gt;
{{!}} [[float]]&amp;amp;nbsp;seconds&lt;br /&gt;
{{!}} 0.1&lt;br /&gt;
{{!}} 0 to 3&lt;br /&gt;
{{!}} How much the camera lags as it tries to move towards its &#039;ideal&#039; position.&lt;br /&gt;
{{!}}- &lt;br /&gt;
{{!}} {{LSL Const|CAMERA_POSITION_LOCKED|integer|21}}&lt;br /&gt;
{{!}} {{#var:cvalue}}&lt;br /&gt;
{{!}} [[integer]]&amp;amp;nbsp;isLocked&lt;br /&gt;
{{!}} {{LSL Const|FALSE|integer|0}}&lt;br /&gt;
{{!}} {{LSL Const|TRUE|integer|1}} or {{LSL Const|FALSE|integer|0}}&lt;br /&gt;
{{!}} Locks the camera position so it will not move.&lt;br /&gt;
{{!}}- &lt;br /&gt;
{{!}} {{LSL Const|CAMERA_POSITION_THRESHOLD|integer|10}}&lt;br /&gt;
{{!}} {{#var:cvalue}}&lt;br /&gt;
{{!}} [[float]]&amp;amp;nbsp;meters&lt;br /&gt;
{{!}} 1.0&lt;br /&gt;
{{!}} 0 to 4&lt;br /&gt;
{{!}} Sets the radius of a sphere around the camera&#039;s ideal position within which it is not affected by target motion.&lt;br /&gt;
{{!}}}&lt;br /&gt;
|}}&lt;/div&gt;</summary>
		<author><name>Lady Sumoku</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Void_Singer/Teacup&amp;diff=1194507</id>
		<title>User:Void Singer/Teacup</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Void_Singer/Teacup&amp;diff=1194507"/>
		<updated>2015-01-22T21:57:34Z</updated>

		<summary type="html">&lt;p&gt;Lady Sumoku: Replaced old &amp;lt;LSL&amp;gt; block with &amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;, also for &amp;lt;javascript&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;div style=&amp;quot;float:right;&amp;quot;&amp;gt;__TOC__&amp;lt;/div&amp;gt;&lt;br /&gt;
{{void-box&lt;br /&gt;
|title=[[User:Void_Singer|Return to Void Singers user page]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{void-box&lt;br /&gt;
|title=Teacup&lt;br /&gt;
|content=&lt;br /&gt;
=== [[File:Teacup.png|frameless|left|256px|alt=Teacup/Saucer]]What is it? ===&lt;br /&gt;
----&lt;br /&gt;
Teacup is an open source webserver front end for LSL&#039;s HTTP-in + {{HoverText|MOAP|Media On A Prim}} functionality. It builds on the work of several other people including but not limited to, [[User:Kelly_Linden|Kelly Linden]], [[User:Torley_Linden|Torley Linden]], [[User:Tali_Rosca|Tali Rosca]], [[User:Vegas_Silverweb|Vegas Silverweb]], and special mentions to [[User:Kate_Linden|Kate]] and/or [[User:Edelman_Linden|Edelman]] Linden. The idea is to make it easy to serve web content from within SL, with a minimum of work or understanding, in the most standards compliant and flexible way possible.&lt;br /&gt;
&lt;br /&gt;
=== How does it work? ===&lt;br /&gt;
----&lt;br /&gt;
Externally, when Teacup starts, it gets a URL and creates a Micro HTML page, which it bootstraps onto the prim face with a &amp;quot;data:&amp;quot; URN. Once loaded, that page requests a JavaScript library, which loads normally. Once loaded, the library bootstraps the specially prepared {{HoverText|&amp;quot;.tsp&amp;quot;|Teacup Server Page}} HTML content onto the current page, and captures all links targeting other {{HoverText|&amp;quot;.tsp&amp;quot;|Teacup Server Page}} files, so that it can do the same when they are requested. Internally the server broadcasts a message when it gets a page request, and any installed File Service scripts can reply with content, or the server will simply report back that it doesn&#039;t have the file requested if it doesn&#039;t receive a reply in a set time.&lt;br /&gt;
&lt;br /&gt;
=== Why all the tea jokes? ===&lt;br /&gt;
----&lt;br /&gt;
Well I happen to like steam punk stuff, and it has a sort of pseudo-Victorian-era feel to it, but in all truth it was sparked by a bit of geek humor. There was an old [http://en.wikipedia.org/wiki/April_Fools%27_Day_RFC april fool&#039;s joke] passed around as an [http://tools.ietf.org/html/rfc2324 official sounding memo] about creating a protocol for [http://en.wikipedia.org/wiki/Hyper_Text_Coffee_Pot_Control_Protocol controlling coffee pots with HTTP] (back before they actually started making net enabled appliances) and part of that proposal was that teapots should return an error response &#039;&#039;&#039;418 &amp;quot;I&#039;m a teapot&amp;quot;&#039;&#039;&#039; if you tried to make it brew coffee... since these servers are small, and 418 is safe to use internally because it wouldn&#039;t normally be encountered, I figured hey, Teapot --&amp;gt; Teacup --&amp;gt; Victorian Imagery --&amp;gt; Steam Punk --&amp;gt; teacup that is it&#039;s own teapot --&amp;gt; {{HoverText|SIP|Server In a Prim}} --&amp;gt; many different types of tea --&amp;gt; Success!&lt;br /&gt;
&lt;br /&gt;
... And thus was born the [[Server_In_a_Prim|SIP]], [[User:Void_Singer/Teacup|Teacup]] server, and [[User:Void_Singer/Red_Tea|Red Tea]] File Service&amp;lt;br&amp;gt;(developers are encouraged to keep the theme, but it&#039;s not a requirement)&lt;br /&gt;
:[[User:Void Singer/Teacup#Return_to_Void_Singers_user_page|Return to top]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{void-box&lt;br /&gt;
|title=Quick Start&lt;br /&gt;
|content=&lt;br /&gt;
So you don&#039;t want to read a bunch of tech babble, you just want to make a website in a prim right? Well I can sympathize so here are some (mostly) easy steps to get you up and running fast...&lt;br /&gt;
# Follow the instructions on [[User:Void_Singer/Red_Tea|This Page]] or choose a File Service from the [[User:Void_Singer/Teacup#Compatible_File_Services_and_Extensions|Compatible File Services and Extensions]] and follow those instructions.&lt;br /&gt;
# Optional: Copy the text in the grey box below [[User:Void_Singer/Region_Stats#Region_Stats|Code: Region Stats]] into a script named &amp;quot;Region Stats&amp;quot;, save it, and drop it into your rezzed box.&lt;br /&gt;
# Optional: Copy the text in the grey box below [[User:Void_Singer/Saucer#Saucer|Code: Saucer]] into a script named &amp;quot;Saucer&amp;quot;, save it, and drop it in your rezzed box.&lt;br /&gt;
# Optional: Copy the text in the grey box below [[User:Void_Singer/Tea_Strainer#Tea_Strainer|Code: Tea Strainer]] into a script named &amp;quot;Tea_Strainer&amp;quot;, save it, and drop it in your rezzed box.&lt;br /&gt;
# Copy the text in the grey box below [[User:Void_Singer/Teacup#Teacup|Code: Teacup]] into a script named &amp;quot;Teacup v0.5&amp;quot;, save it, and drop it in your rezzed box.&lt;br /&gt;
# Click on the top of your box if your webpage isn&#039;t already showing.&lt;br /&gt;
#* At this point you may want to rotate and/or resize your box.&lt;br /&gt;
#* If you like, you have my express permission to download (right click, &amp;quot;save as&amp;quot;) and edit (with whichever image editor you prefer) the [[:File:Teacup.png|Teacup.png]] file to use as the default texture of your website prim.&lt;br /&gt;
# Show it off to your friends with {{HoverText|MOAP|Media On A Prim}} enabled viewers.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
If you run into any problems, simply start a thread with the problem you are having [http://community.secondlife.com/t5/LSL-Scripting/bd-p/LSLScripting here], and I or some other technical wizard will assist you.&lt;br /&gt;
:[[User:Void Singer/Teacup#Return_to_Void_Singers_user_page|Return to top]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{void-box&lt;br /&gt;
|title=Code&lt;br /&gt;
|content=&lt;br /&gt;
=== Teacup ===&lt;br /&gt;
----&lt;br /&gt;
* Save in a [[Mono#How_to_use_Mono|MONO]] script named &#039;&#039;&#039;&amp;quot;Teacup v0.5&amp;quot;&#039;&#039;&#039;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;/*( Teacup Server v0.5 )*/&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
 /*//-- Teacup Boot Strap Variables --//*/&lt;br /&gt;
 //-- Server Default page start (always loads)&lt;br /&gt;
string  gStrTBS1xx = &amp;quot;data:text/html;charset:utf-8,&amp;lt;html&amp;gt;\n&amp;quot;;&lt;br /&gt;
 //-- Head Section start: loads with URL_REQUEST_GRANTED&lt;br /&gt;
string  gStrTBS1a1 = &amp;quot;	&amp;lt;head&amp;gt;\n		&amp;lt;base href=&#039;&amp;quot;;&lt;br /&gt;
 //-- Head Section end &amp;amp; Address intsertion point: loads with URL_REQUEST_GRANTED&lt;br /&gt;
string  gStrTBS1a2 = &amp;quot;&#039;/&amp;gt;\n		&amp;lt;script type=&#039;text/javascript&#039; defer=&#039;&#039; src=&#039;teacup.js&#039;&amp;gt;&amp;lt;/script&amp;gt;\n	&amp;lt;/head&amp;gt;\n&amp;quot;;&lt;br /&gt;
 //-- Server Default message (always loads)&lt;br /&gt;
string  gStrTBS2xx = &amp;quot;	&amp;lt;body&amp;gt;\n		&amp;lt;h1&amp;gt;Teacup Server&amp;lt;/h1&amp;gt;\n		&amp;lt;hr/&amp;gt;\n		&amp;lt;h2&amp;gt;If you are reading this, the &amp;lt;em&amp;gt;server&amp;lt;/em&amp;gt; is working&amp;lt;/h2&amp;gt;\n&amp;quot;;&lt;br /&gt;
 //-- Default Error message: loads with URL_REQUEST_GRANTED&lt;br /&gt;
string  gStrTBS2a1 = &amp;quot;		&amp;lt;h3&amp;gt;(But the File Service may not be)&amp;lt;/h3&amp;gt;\n&amp;quot;;&lt;br /&gt;
 //-- URL Failure MessageL included for URL_REQUEST_DENIED&lt;br /&gt;
string  gStrTBS2b1 = &amp;quot;		&amp;lt;h3&amp;gt;(But the region failed to provide a URL)&amp;lt;/h3&amp;gt;\n&amp;quot;;&lt;br /&gt;
 //-- Server Default Footer start (always loads)&lt;br /&gt;
string  gStrTBS3xx = &amp;quot;		&amp;lt;hr/&amp;gt;\n		&amp;lt;p&amp;gt;Teacup/Saucer v0.3&amp;lt;br/&amp;gt;&amp;lt;a href=&#039;secondlife:///app/agent/&amp;quot;;&lt;br /&gt;
 //-- Server Default Footer end &amp;amp; Contact Owner key insertion point (always loads)&lt;br /&gt;
string  gStrTBS4xx = &amp;quot;/about&#039;&amp;gt;Contact Owner?&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;\n	&amp;lt;/body&amp;gt;\n&amp;lt;/html&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
 /*//-- Pending Request Variables --//*/&lt;br /&gt;
list    gLstPndKey; //-- Key queue (pages waiting to be served)&lt;br /&gt;
list    gLstPndTim; //-- Timeout Value queue (Request Timeout)&lt;br /&gt;
//-- These (hopefully) prevent multiple responses if SL sends a timeout.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
default{&lt;br /&gt;
	state_entry(){ //-- Request URL on start up&lt;br /&gt;
		llRequestURL();&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	on_rez( integer vIntBgn ){ //-- Clear pending and request new URL on rez&lt;br /&gt;
		gLstPndKey = gLstPndTim = [];&lt;br /&gt;
		llRequestURL();&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	changed( integer vBitChg ){ //-- Clear pending and re-request URL on region change/restart&lt;br /&gt;
		if ((CHANGED_REGION_START | CHANGED_REGION) &amp;amp; vBitChg){&lt;br /&gt;
			gLstPndKey = gLstPndTim = []; //-- Consider sending custom 404&#039;s or 205&#039;s here instead&lt;br /&gt;
			llRequestURL();&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	http_request( key vKeySrc, string vStrMth, string vStrBdy ){&lt;br /&gt;
		integer vIntMth = llListFindList( [URL_REQUEST_DENIED, URL_REQUEST_GRANTED, &amp;quot;POST&amp;quot;, &amp;quot;GET&amp;quot;], [vStrMth] );&lt;br /&gt;
		if (4 &amp;amp; vIntMth){&lt;br /&gt;
			//-- trap unused here, check we hasve a valid non root file name on the next line&lt;br /&gt;
		}else if (2 &amp;amp; vIntMth){ if (vStrMth = llUnescapeURL( llDeleteSubString( llGetHTTPHeader( vKeySrc, &amp;quot;x-path-info&amp;quot; ), 0, 0 ) )){&lt;br /&gt;
			llMessageLinked( LINK_SET,&lt;br /&gt;
			                 418,&lt;br /&gt;
			                 vStrMth + &amp;quot;?&amp;quot; + llGetHTTPHeader( vKeySrc, &amp;quot;x-query-string&amp;quot; ) +&lt;br /&gt;
			                 &amp;quot;#ip=&amp;quot; + llGetHTTPHeader( vKeySrc, &amp;quot;x-remote-ip&amp;quot; ) + &amp;quot;&amp;amp;&amp;quot; + vStrBdy,&lt;br /&gt;
			                 vKeySrc );&lt;br /&gt;
			if (gLstPndTim == []){&lt;br /&gt;
				llSetTimerEvent( 3.0 );&lt;br /&gt;
			}&lt;br /&gt;
			gLstPndKey += [vKeySrc];&lt;br /&gt;
			gLstPndTim += [llGetUnixTime() + 20];&lt;br /&gt;
		}//-- can handle root requests here later if we want&lt;br /&gt;
		}else{ //-- URL request response: set hover text, push proper page format to prim face&lt;br /&gt;
			if (vIntMth || llList2String( llGetPrimitiveParams( [PRIM_TEXT] ), 0 ) != &amp;quot;No URL&amp;quot;){&lt;br /&gt;
				llSetPrimitiveParams( [PRIM_TEXT, llList2String( [&amp;quot;No URL&amp;quot;, (vStrBdy += &amp;quot;/&amp;quot;)], vIntMth ), &amp;lt;(float)(!vIntMth), 0.5, 0.5&amp;gt;, 0.0] );&lt;br /&gt;
				vStrBdy = gStrTBS1xx + llList2String( [&amp;quot;&amp;quot;, gStrTBS1a1 + vStrBdy + gStrTBS1a2], vIntMth ) + gStrTBS2xx +&lt;br /&gt;
				  llList2String( [gStrTBS2a1, gStrTBS2a1], vIntMth ) + gStrTBS3xx + (string)llGetOwner() + gStrTBS4xx;&lt;br /&gt;
				llSetPrimMediaParams( 0, [PRIM_MEDIA_HOME_URL, vStrBdy, PRIM_MEDIA_CURRENT_URL, vStrBdy] );&lt;br /&gt;
				llMessageLinked( LINK_SET, 418, &amp;quot;Teacup URL changed&amp;quot;, NULL_KEY );&lt;br /&gt;
			} //-- Next Line: abuse Sensor Repeat to retry on no URL in 5 mins&lt;br /&gt;
			llSensorRepeat( &amp;quot;&amp;quot;, llGetKey(), AGENT, 0.0001 * !vIntMth, PI, 300.0 * !vIntMth );&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	link_message( integer vIntSrc, integer vIntDta, string vStrDta, key vKeyDta ){&lt;br /&gt;
		if (~vIntSrc = llListFindList( [200, 201, 202, 204, 403, 404], [vIntDta] )){ //-- valid return code?&lt;br /&gt;
			if (~vIntSrc = llListFindList( gLstPndKey, [vKeyDta] )){ //-- request still pending?&lt;br /&gt;
				llHTTPResponse( vKeyDta, vIntDta, vStrDta ); //-- Serve request &amp;amp; remove from pending queue&lt;br /&gt;
				gLstPndKey = llDeleteSubList( gLstPndKey, vIntSrc, vIntSrc );&lt;br /&gt;
				gLstPndTim = llDeleteSubList( gLstPndTim, vIntSrc, vIntSrc );&lt;br /&gt;
			}&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	timer(){ //-- Optimally, runs once on an empty list for 3sec worth requests&lt;br /&gt;
		if (gLstPndTim != []){ //-- Pending requests?&lt;br /&gt;
			while (llList2Integer( gLstPndTim, 0 ) &amp;lt; llGetUnixTime()){ //-- are any expired?&lt;br /&gt;
				gLstPndTim = llDeleteSubList( gLstPndTim, 0, 0 ); //-- remove expired&lt;br /&gt;
				gLstPndKey = llDeleteSubList( gLstPndKey, 0, 0 );&lt;br /&gt;
				if (gLstPndTim == []){ //-- Pending Queue empty?&lt;br /&gt;
					llSetTimerEvent( 0.0 ); //-- Stop timer, and exit&lt;br /&gt;
					return;&lt;br /&gt;
				}&lt;br /&gt;
			}&lt;br /&gt;
		}else{ //-- No pending requests, turn off the timer&lt;br /&gt;
			llSetTimerEvent( 0.0 );&lt;br /&gt;
		}&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	sensor( integer vIntNul ){&lt;br /&gt;
		//-- Dummy Sensor event required by SCR-53&lt;br /&gt;
	}&lt;br /&gt;
	&lt;br /&gt;
	no_sensor(){ //-- URL re-request 5 mins after failure&lt;br /&gt;
		llSensorRemove();&lt;br /&gt;
		llRequestURL();&lt;br /&gt;
	}&lt;br /&gt;
}&lt;br /&gt;
/*//--                           License Text                           --//*/&lt;br /&gt;
/*//  Free to copy, use, modify, distribute, or sell, with attribution.   //*/&lt;br /&gt;
/*//    (C)2011 (CC-BY) [ http://creativecommons.org/licenses/by/3.0 ]    //*/&lt;br /&gt;
/*//   Void Singer [ https://wiki.secondlife.com/wiki/User:Void_Singer ]  //*/&lt;br /&gt;
/*//  All usages must contain a plain text copy of the previous 2 lines.  //*/&lt;br /&gt;
/*//--                                                                  --//*/&amp;lt;/source&amp;gt;&lt;br /&gt;
^ [[User:Void Singer/Teacup#Return_to_Void_Singers_user_page|Return to top]]&lt;br /&gt;
&lt;br /&gt;
=== teacup.js ===&lt;br /&gt;
----&lt;br /&gt;
* [[User:Void_Singer/Red_Tea|Red Tea]] expects this file saved in a notecard named &amp;quot;&#039;&#039;&#039;teacup.js&#039;&#039;&#039;&amp;quot;&lt;br /&gt;
* Other File systems may have different expectations for loading plain text files; Consult their documentation for details.&lt;br /&gt;
 &amp;lt;source lang=&amp;quot;javascript&amp;quot;&amp;gt;/*  teacup.js v0.5 &amp;lt;!-- */&lt;br /&gt;
&lt;br /&gt;
var u0=function(){//-- faster!&lt;br /&gt;
	if(window.addEventListener){&lt;br /&gt;
		return function(l0,l1,l2){&lt;br /&gt;
			l0.addEventListener(l1,l2,false);&lt;br /&gt;
		};&lt;br /&gt;
	}else if(window.attachEvent){&lt;br /&gt;
		return function(l0,l1,l2){&lt;br /&gt;
			l0.attachEvent(&#039;on&#039;+l1,l2);&lt;br /&gt;
		};&lt;br /&gt;
	}&lt;br /&gt;
}();&lt;br /&gt;
&lt;br /&gt;
function u1(l0){&lt;br /&gt;
	if (l0.preventDefault){&lt;br /&gt;
		l0.preventDefault();&lt;br /&gt;
	}//-- cross-compat?&lt;br /&gt;
	v1=document.createElement(&#039;script&#039;);&lt;br /&gt;
	document.head.appendChild(v1);&lt;br /&gt;
	u0(v1,&#039;load&#039;,u2);//-- no &#039;type&#039; breaks standards&lt;br /&gt;
	v1.src=(typeof(this.href)!=&#039;undefined&#039;)?this.href:l0;&lt;br /&gt;
	v2=setTimeout(&#039;u2(\&#039;504 Gateway Timeout or 404 Not Found\&#039;)&#039;,23000);&lt;br /&gt;
}&lt;br /&gt;
//-- v0,v1,v2 exist here&lt;br /&gt;
function u2(l0){//-- Achtung Baby!&lt;br /&gt;
	clearTimeout(v2);&lt;br /&gt;
	if(typeof(v0)==&#039;undefined&#039;){&lt;br /&gt;
		if (typeof(l0)!=&#039;object&#039;){&lt;br /&gt;
			alert(l0+&#039;\n&#039;+v1.src.substring(81)+&#039;\n&#039;);&lt;br /&gt;
		}//-- catches timeouts, send js to alert others&lt;br /&gt;
	}else{&lt;br /&gt;
		document.body.innerHTML=v0;&lt;br /&gt;
		for(var l1=0;l1&amp;lt;document.links.length;l1++){&lt;br /&gt;
			if (~document.links[l1].href.indexOf(&#039;.tsp&#039;)){&lt;br /&gt;
				u0(document.links[l1],&#039;click&#039;,u1);&lt;br /&gt;
			}&lt;br /&gt;
		}//-- the double split seemed more effective than the regex&lt;br /&gt;
		document.title=decodeURI(v1.src.split(document.head.getElementsByTagName(&#039;base&#039;)[0].href)[1].split(&#039;.tsp&#039;)[0]);&lt;br /&gt;
		var l2;&lt;br /&gt;
		v2=document.body.getElementsByTagName(&#039;script&#039;);&lt;br /&gt;
		for(l1=0;l1&amp;lt;v2.length;l1++){&lt;br /&gt;
			l2=document.createElement(&#039;script&#039;);&lt;br /&gt;
			if(~v2[l1].src.indexOf(&#039;.js&#039;)){&lt;br /&gt;
				l2.src=v2[l1].src;//-- no &#039;type&#039; breaks standards&lt;br /&gt;
			}else if(v2[l1].childNodes.length){&lt;br /&gt;
				l2.appendChild(v2[l1].childNodes[0]);&lt;br /&gt;
			}&lt;br /&gt;
			v2[l1].parentNode.replaceChild(l2,v2[l1]);&lt;br /&gt;
		}//-- extend script jumpstarter to link/css?&lt;br /&gt;
	}//-- next line: clean up; aisle 2&lt;br /&gt;
	document.head.removeChild(v1);&lt;br /&gt;
	v0=v1=v2=(function(){})();&lt;br /&gt;
}//-- like that evil &#039;undefined&#039; hack?&lt;br /&gt;
&lt;br /&gt;
window.onload=function(){//-- webkit is stupid and doesn&#039;t obey script tag defer/async attributes&lt;br /&gt;
	document.head=document.head||document.getElementsByTagName(&#039;head&#039;)[0];&lt;br /&gt;
	document.body=document.body||document.getElementsByTagName(&#039;body&#039;)[0];&lt;br /&gt;
	u1(&#039;index.tsp&#039;);//-- default page name&lt;br /&gt;
};&lt;br /&gt;
&lt;br /&gt;
/* --&amp;gt;&lt;br /&gt;
  (C)2011 (CC-BY) [ http://creativecommons.org/licenses/by/3.0 ]&lt;br /&gt;
 Void Singer [ https://wiki.secondlife.com/wiki/User:Void_Singer ] */&amp;lt;/source&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;NOTE&#039;&#039;&#039;: I recommend removing all the comments to make the file smaller (anything starting with &#039;&#039;&#039;//--&#039;&#039;&#039; to the end of the line)&lt;br /&gt;
:[[User:Void Singer/Teacup#Return_to_Void_Singers_user_page|Return to top]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{void-box&lt;br /&gt;
|title=Protocols&lt;br /&gt;
|content=&lt;br /&gt;
This section is not required reading for users, it is really only of use to scripters looking understand or extend it.&lt;br /&gt;
=== Server Protocols ===&lt;br /&gt;
----&lt;br /&gt;
==== Outgoing Messages ====&lt;br /&gt;
----&lt;br /&gt;
The server has only two outgoing message formats. The first is general advertisement, and can be used by any File Service or extension to advertise information about itself.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;llMessageLinked( LINK_SET, TEACUP_MESSAGE, &amp;quot;Message&amp;quot;, NULL_KEY );&amp;lt;/source&amp;gt;&lt;br /&gt;
Where &amp;quot;Message&amp;quot; is anything the script wants to advertise&lt;br /&gt;
The server only sends one such message &amp;quot;&#039;&#039;&#039;Teacup URL Changed&#039;&#039;&#039;&amp;quot;, and ignores messages sent by other scripts using this format.&lt;br /&gt;
:When this message is sent, The current Address of the Server is placed in the prims hover text, other scripts may use the following to retrieve it&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;string vStrAddress = llList2String( llGetLinkPrimitiveParams( SERVER_LINK_NUMBER, [PRIM_TEXT] ), 0 );&amp;lt;/source&amp;gt;&lt;br /&gt;
::The text will either be the servers URL, the text &amp;quot;&#039;&#039;&#039;No URL&#039;&#039;&#039;&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The second Outgoing Message is a file request and has the format&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;llMessageLinked( LINK_SET, TEACUP_MESSAGE, REQUEST_PAGE, REQUEST_KEY );&amp;lt;/source&amp;gt;&lt;br /&gt;
* TEACUP_MESSAGE: &#039;&#039;&#039;418&#039;&#039;&#039;&lt;br /&gt;
* REQUEST_PAGE: the format is &amp;lt;nowiki&amp;gt;&amp;quot;&amp;lt;page name&amp;gt;?&amp;lt;search string&amp;gt;#ip=&amp;lt;decimal IP Address&amp;gt;&amp;amp;&amp;lt;post data&amp;gt;]&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
** Ex: &amp;quot;&#039;&#039;&#039;index.tsp?#ip=127.0.0.1&amp;amp;&#039;&#039;&#039;&amp;quot; &#039;&#039;&amp;lt;-- file has no search string or post data&#039;&#039;&lt;br /&gt;
** the page name can be parsed with&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;string vStrPageName = llList2String( llParseStringKeepNulls( REQUEST_PAGE, [], [&amp;quot;?&amp;quot;,&amp;quot;#&amp;quot;] ), 0 );&amp;lt;/source&amp;gt;&lt;br /&gt;
* REQUEST_KEY: the return key for the requested data.&lt;br /&gt;
valid Server Requests can be detected by checking that REQUEST_KEY is a valid key, and that TEACUP_MESSAGE is 418.&lt;br /&gt;
&lt;br /&gt;
==== Incoming Messages ====&lt;br /&gt;
----&lt;br /&gt;
The server expects it will receive a return message in the following format for any file request made...&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;llMessageLinked( REQUEST_SOURCE, RESPONSE_CODE, FILE_TEXT, REQUEST_KEY ); //-- sent from the File Service&amp;lt;/source&amp;gt;&lt;br /&gt;
* REQUEST_SOURCE: The link number of the Teacup server that sent the request&lt;br /&gt;
* RESPONSE_CODE: the following standard HTTP Response codes are currently recognized&lt;br /&gt;
** &#039;&#039;&#039;100&#039;&#039;&#039; &amp;quot;Continue&amp;quot;: The server ignores this, make sure you send a normal response code as a follow up (see [[Saucer]] for details)&lt;br /&gt;
** &#039;&#039;&#039;200&#039;&#039;&#039; &amp;quot;Success&amp;quot;: Basic &amp;quot;yes we have it, here you go&amp;quot;. anything that returns data can return this&lt;br /&gt;
** &#039;&#039;&#039;201&#039;&#039;&#039; &amp;quot;Created&amp;quot;: File was created for this request. probably best if the file was created for the request&lt;br /&gt;
** &#039;&#039;&#039;202&#039;&#039;&#039; &amp;quot;Accepted&amp;quot;: Request acknowledged/received (content optional) probably best for commands that generate in world actions&lt;br /&gt;
** &#039;&#039;&#039;204&#039;&#039;&#039; &amp;quot;No Content&amp;quot;: We got the request/data, but don&#039;t need to return anything. probably best for form data, FILE_TEXT should be blank.&lt;br /&gt;
** &#039;&#039;&#039;403&#039;&#039;&#039; &amp;quot;Forbidden&amp;quot;: We got the request, but aren&#039;t allowed to serve it. Expansion space for per user access (unused as of this writing).&lt;br /&gt;
** &#039;&#039;&#039;404&#039;&#039;&#039; &amp;quot;Not Found&amp;quot;: The file does not exist. Avoid using this unless you are reasonably sure the file isn&#039;t being served from another script.&lt;br /&gt;
* FILE_TEXT: text of the file that was requested.&lt;br /&gt;
* REQUEST_KEY: server request key for this file.&lt;br /&gt;
: Any return should be done within 20 seconds or it&#039;s results will be ignored (Mostly an LSL limitation)&lt;br /&gt;
&lt;br /&gt;
==== Special Ranges and limitations ====&lt;br /&gt;
----&lt;br /&gt;
:To promote predictable data flows within a scripted object, The following are &amp;quot;Official&amp;quot; limits for scripts to be included as compatible resources&lt;br /&gt;
# The &#039;&#039;&#039;0xx&#039;&#039;&#039; Range is off limits and may not be used (for compatibility with scripts that may use low numbers)&lt;br /&gt;
# All normal [http://en.wikipedia.org/wiki/List_of_HTTP_status_codes HTTP Response codes] and ranges (&#039;&#039;&#039;1xx-5xx&#039;&#039;&#039;) are reserved... do not use them unless they make sense or the server can actually send them properly.&lt;br /&gt;
# the Range of 6xx codes is reserved for use by File System scripts, limited to no more than 10 per range per script and will be registered by request, first (working script) come, first served. if you reasonably need more than 10, use the 8xx-9xx range&lt;br /&gt;
#* the following &#039;&#039;&#039;6xx&#039;&#039;&#039; codes are are registered at this time&lt;br /&gt;
#** [[Saucer]]&lt;br /&gt;
#*** &#039;&#039;&#039;600&#039;&#039;&#039; &amp;quot;File Removed&amp;quot; (sent with a file name and NULL_KEY)&lt;br /&gt;
#*** &#039;&#039;&#039;601&#039;&#039;&#039; &amp;quot;File Added&amp;quot; (sent with a file name and NULL_KEY)&lt;br /&gt;
# &#039;&#039;&#039;7xx&#039;&#039;&#039; codes are reserved for future expansion&lt;br /&gt;
# &#039;&#039;&#039;8xx-9xx&#039;&#039;&#039; are unregulated, use at your own risk&lt;br /&gt;
# All Codes must be below 1000 (this is to guarantee safe data transfer for other unrelated scripts)&lt;br /&gt;
:To Promote Maximum Stability and Flexibility&lt;br /&gt;
# Any Script that resides in the server prim should expect link messages of up to 40KiB&lt;br /&gt;
#* File Service Scripts should attempt to send files 30KiB or smaller&lt;br /&gt;
# File Service Scripts should not broadcast any link message larger than 4KiB using [[LINK_THIS]]&lt;br /&gt;
#* Responses to requests should be targeted to the Server prim that requested the data for larger data sizes (optimally for ALL responses)&lt;br /&gt;
# Scripts residing outside of the server prim should expect link messages with up to 4KiB of data (the max the server is able to request with normally)&lt;br /&gt;
# {{HoverText|&amp;quot;.tsp&amp;quot;|Teacup Server Page}} pages with inline scripts should avoid using the following variable/function names&lt;br /&gt;
#* v0, v1, v2, v3 - v9 (these variables are used to: wrap the page for transport, serve as a loading container for pages, handle timeout messages for non-loading pages, and the rest being reserved for future support)&lt;br /&gt;
#* u0, u1, u2, u3 - u9 (these functions handle: watching for {{HoverText|&amp;quot;.tsp&amp;quot;|Teacup Server Page}} links to intercept, setting up the container for new {{HoverText|&amp;quot;.tsp&amp;quot;|Teacup Server Page}} requests, loading the {{HoverText|&amp;quot;.tsp&amp;quot;|Teacup Server Page}} files, and the rest being reserved for future support)&lt;br /&gt;
#** you can request a new page from javascript by calling &#039;&#039;&#039;u1(&#039;PageName.tsp&#039;);&#039;&#039;&#039;, however you may want to include some random info in the search string if refreshing the same page&lt;br /&gt;
^ [[User:Void Singer/Teacup#Return_to_Void_Singers_user_page|Return to top]]&lt;br /&gt;
&lt;br /&gt;
=== Teacup Server Page (&amp;quot;.tsp&amp;quot;) Format ===&lt;br /&gt;
----&lt;br /&gt;
Teacup serves a modified html page called a Teacup Server Page (&amp;quot;.tsp&amp;quot;), to overcome limitations in the LSL HTTP-in behavior.&lt;br /&gt;
: if a requested filename ends with {{HoverText|&amp;quot;.tsp&amp;quot;|Teacup Server Page}} it needs to conform to a specific format that is similar but not identical to the contents of a normal html webpage. To convert an html page into a tsp page, the follow actions must take place (an example of all of them may be found in the [[User:Void_Singer/Red Tea|Red Tea]] File Service)&lt;br /&gt;
* The file name should end with {{HoverText|&amp;quot;.tsp&amp;quot;|Teacup Server Page}}&lt;br /&gt;
* The contents are limited to what&#039;s valid &#039;&#039;inside&#039;&#039; a normal html &amp;quot;body&amp;quot; tag.&lt;br /&gt;
* It also requires the following minor changes, made in order:&lt;br /&gt;
*# all backslash characters must be converted to double backslashes (may be applied on a line by line basis)&lt;br /&gt;
*#* eg:&amp;lt;div style=&amp;quot;font-family:monospace;font-size:12px;background-color:#EEE;&amp;quot;&amp;gt;&amp;amp;nbsp;file_string &amp;lt;span style=&amp;quot;color: rgb(102, 204, 102);&amp;quot;&amp;gt;=&amp;lt;/span&amp;gt; [[llDumpList2String|&amp;lt;span style=&amp;quot;color: rgb(160, 0, 0); font-weight: bold; text-decoration: none;&amp;quot;&amp;gt;llDumpList2String&amp;lt;/span&amp;gt;]]&amp;lt;span style=&amp;quot;color: rgb(102, 204, 102);&amp;quot;&amp;gt;(&amp;lt;/span&amp;gt; [[llParseStringKeepNulls|&amp;lt;span style=&amp;quot;color: rgb(160, 0, 0); font-weight: bold; text-decoration: none;&amp;quot;&amp;gt;llParseStringKeepNulls&amp;lt;/span&amp;gt;]]&amp;lt;span style=&amp;quot;color: rgb(102, 204, 102);&amp;quot;&amp;gt;(&amp;lt;/span&amp;gt; file_string, &amp;lt;span style=&amp;quot;color: rgb(102, 204, 102);&amp;quot;&amp;gt;[&amp;lt;span style=&amp;quot;color: rgb(0, 160, 0);&amp;quot;&amp;gt;&amp;quot;\\&amp;quot;&amp;lt;/span&amp;gt;]&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;color: rgb(102, 204, 102);&amp;quot;&amp;gt;[] )&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;color: rgb(0, 160, 0);&amp;quot;&amp;gt;&amp;quot;\\\\&amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color: rgb(102, 204, 102);&amp;quot;&amp;gt;)&amp;lt;/span&amp;gt;;&amp;lt;/div&amp;gt;&lt;br /&gt;
*# all single quote characters must be prefixed with a literal backslash (may be applied on a line by line basis)&lt;br /&gt;
*#* eg:&amp;lt;div style=&amp;quot;font-family:monospace;font-size:12px;background-color:#EEE;&amp;quot;&amp;gt;&amp;amp;nbsp;file_string &amp;lt;span style=&amp;quot;color: rgb(102, 204, 102);&amp;quot;&amp;gt;=&amp;lt;/span&amp;gt; [[llDumpList2String|&amp;lt;span style=&amp;quot;color: rgb(160, 0, 0); font-weight: bold; text-decoration: none;&amp;quot;&amp;gt;llDumpList2String&amp;lt;/span&amp;gt;]]&amp;lt;span style=&amp;quot;color: rgb(102, 204, 102);&amp;quot;&amp;gt;(&amp;lt;/span&amp;gt; [[llParseStringKeepNulls|&amp;lt;span style=&amp;quot;color: rgb(160, 0, 0); font-weight: bold; text-decoration: none;&amp;quot;&amp;gt;llParseStringKeepNulls&amp;lt;/span&amp;gt;]]&amp;lt;span style=&amp;quot;color: rgb(102, 204, 102);&amp;quot;&amp;gt;(&amp;lt;/span&amp;gt; file_string, &amp;lt;span style=&amp;quot;color: rgb(102, 204, 102);&amp;quot;&amp;gt;[&amp;lt;span style=&amp;quot;color: rgb(0, 160, 0);&amp;quot;&amp;gt;&amp;quot;&#039;&amp;quot;&amp;lt;/span&amp;gt;]&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;color: rgb(102, 204, 102);&amp;quot;&amp;gt;[] )&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;color: rgb(0, 160, 0);&amp;quot;&amp;gt;&amp;quot;\\&#039;&amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color: rgb(102, 204, 102);&amp;quot;&amp;gt;)&amp;lt;/span&amp;gt;;&amp;lt;/div&amp;gt;&lt;br /&gt;
*# all line breaks should be converted to &amp;quot;&#039;&#039;&#039;\n&#039;&#039;&#039;&amp;quot; literals (may be applied on a line by line basis)&lt;br /&gt;
*#* eg:&amp;lt;div style=&amp;quot;font-family:monospace;font-size:12px;background-color:#EEE;&amp;quot;&amp;gt;&amp;amp;nbsp;file_string &amp;lt;span style=&amp;quot;color: rgb(102, 204, 102);&amp;quot;&amp;gt;=&amp;lt;/span&amp;gt; [[llDumpList2String|&amp;lt;span style=&amp;quot;color: rgb(160, 0, 0); font-weight: bold; text-decoration: none;&amp;quot;&amp;gt;llDumpList2String&amp;lt;/span&amp;gt;]]&amp;lt;span style=&amp;quot;color: rgb(102, 204, 102);&amp;quot;&amp;gt;(&amp;lt;/span&amp;gt; [[llParseStringKeepNulls|&amp;lt;span style=&amp;quot;color: rgb(160, 0, 0); font-weight: bold; text-decoration: none;&amp;quot;&amp;gt;llParseStringKeepNulls&amp;lt;/span&amp;gt;]]&amp;lt;span style=&amp;quot;color: rgb(102, 204, 102);&amp;quot;&amp;gt;(&amp;lt;/span&amp;gt; file_string, &amp;lt;span style=&amp;quot;color: rgb(102, 204, 102);&amp;quot;&amp;gt;[&amp;lt;span style=&amp;quot;color: rgb(0, 160, 0);&amp;quot;&amp;gt;&amp;quot;\n&amp;quot;&amp;lt;/span&amp;gt;]&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;color: rgb(102, 204, 102);&amp;quot;&amp;gt;[] )&amp;lt;/span&amp;gt;, &amp;lt;span style=&amp;quot;color: rgb(0, 160, 0);&amp;quot;&amp;gt;&amp;quot;\\n&amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color: rgb(102, 204, 102);&amp;quot;&amp;gt;)&amp;lt;/span&amp;gt;;&amp;lt;/div&amp;gt;&lt;br /&gt;
*# The page should be prefixed with &amp;quot;&#039;&#039;&#039;&amp;lt;nowiki&amp;gt;v0=&#039;&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;&#039;&amp;quot; and suffixed with &amp;quot;&#039;&#039;&#039;&amp;lt;nowiki&amp;gt;&#039;;&amp;lt;/nowiki&amp;gt;&#039;&#039;&#039;&amp;quot; (applies only to the whole page)&lt;br /&gt;
*#* eg:&amp;lt;div style=&amp;quot;font-family:monospace;font-size:12px;background-color:#EEE;&amp;quot;&amp;gt;&amp;amp;nbsp;file_string &amp;lt;span style=&amp;quot;color: rgb(102, 204, 102);&amp;quot;&amp;gt;=&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color: rgb(0, 160, 0);&amp;quot;&amp;gt;&amp;quot;v0=&#039;&amp;quot;&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color: rgb(102, 204, 102);&amp;quot;&amp;gt;+&amp;lt;/span&amp;gt; file_string &amp;lt;span style=&amp;quot;color: rgb(102, 204, 102);&amp;quot;&amp;gt;+&amp;lt;/span&amp;gt; &amp;lt;span style=&amp;quot;color: rgb(0, 160, 0);&amp;quot;&amp;gt;&amp;quot;&#039;;&amp;quot;&amp;lt;/span&amp;gt;;&amp;lt;/div&amp;gt;&lt;br /&gt;
:[[User:Void Singer/Teacup#Return_to_Void_Singers_user_page|Return to top]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{void-box&lt;br /&gt;
|title=Notes&lt;br /&gt;
|content=&lt;br /&gt;
=== Compatible File Systems and Extensions ===&lt;br /&gt;
----&lt;br /&gt;
* [[User:Void_Singer/Red_Tea|Red Tea]] - A very simple [[Server_In_a_Prim|SIP]] back end File Service for a starting point.&lt;br /&gt;
* [[User:Void_Singer/Region_Stats|Region Stats]] - A single page Extension that gets live data from the region and refreshes every minute&lt;br /&gt;
* [[User:Void_Singer/Saucer|Saucer]] - Optional Fast 404 Extension for preventing long timeouts for missing/bad pages&lt;br /&gt;
* [[User:Void_Singer/Tea_Strainer|Tea Strainer]] - Optional Troubleshooting Monitor for checking messages being sent and received.&lt;br /&gt;
* [[User:Void_Singer/To_Go_Cup|To Go Cup]] - Experimental Loader for Internal Browsers on v1x viewers (v1.23, Snowglobe, Cool, Phoenix, Imprudence, Ascent, Singularity, and others without {{HoverText|MOAP|Media On A Prim}} support)&lt;br /&gt;
&lt;br /&gt;
=== Known Bugs ===&lt;br /&gt;
----&lt;br /&gt;
* inline style &#039;&#039;elements&#039;&#039; are not evaluated at load time (inline &#039;&#039;attributes&#039;&#039; should work normally)&lt;br /&gt;
** using JavaScript to write these is a viable workaround at the moment&lt;br /&gt;
* document/body onload events are not triggered for page loads&lt;br /&gt;
** images have their own events, and can be used to trigger page load JavaScript&lt;br /&gt;
** may not support this now that inline scripts work, but it&#039;s still under consideration&lt;br /&gt;
* Fails to load directly to external browsers ([http://jira.secondlife.com/browse/VWR-25555 VWR-25555])&lt;br /&gt;
** v2 internal browsers will only load it from the shared media bar &amp;quot;Load URL in browser&amp;quot; button ([http://jira.secondlife.com/browse/VWR-25554 VWR-25554])&lt;br /&gt;
*** Workaround for v2 is to load it via the shared media button, to the internal browser, then cut and paste into an external browser (should work with everything but IE)&lt;br /&gt;
* POST from forms is wonky, it forces a page load, which we can only serve text to.&lt;br /&gt;
** There isn&#039;t any way via JavaScript to intecept form POST data, nor a way to call it from the container we use&lt;br /&gt;
** It may be possible to rework the server to use Frames and detect plain text loads of pages... will look into this.&lt;br /&gt;
* normal onLoad event for the pages scripts are unsupported&lt;br /&gt;
** unfortunately the webkit browser is stupid and doesn&#039;t obey async/defer script attributes so we have to use onload for the main page&lt;br /&gt;
** fortunately, scripts will get refreshed in page order, so just calling the code is a viable alternative&lt;br /&gt;
&lt;br /&gt;
=== Requested Feature Upgrades ===&lt;br /&gt;
----&lt;br /&gt;
* see about faking support for defer/async behavior in the tsp inline script tags&lt;br /&gt;
** this will require supporting page onLoad events&lt;br /&gt;
* Find a simple way to serve base64 encoded content such as images or sounds.&lt;br /&gt;
** &#039;&#039;&#039;NEED ASSISTANCE&#039;&#039;&#039;: I can (probably) do it the same way we load pages, but this makes it hard for page writers.&lt;br /&gt;
** considering a double-tap method where the server js library parses img tags for failures and bootstraps them with a modified name&lt;br /&gt;
** may be able to partially support this via css, but it&#039;s ugly for page writers =(&lt;br /&gt;
&lt;br /&gt;
=== Change Log / Old Versions ===&lt;br /&gt;
----&lt;br /&gt;
Most Recent Changes are at the top, old version links below.&lt;br /&gt;
* Code will be considered stable when it reaches 1.0&lt;br /&gt;
* [[User:Void_Singer/Teacup|Teacup v0.5]]&lt;br /&gt;
** Added support for inline script elements for .tsp files&lt;br /&gt;
** Added IP Address to File Service Requests, to work towards authentication&lt;br /&gt;
** Tweaked the teacup.js to run a bit faster, and condensed it to take a little less space.&lt;br /&gt;
** Added Page Titles (matches the file name minus the {{HoverText|&amp;quot;.tsp&amp;quot;|Teacup Server Page}} extension (only visible in external browsers)&lt;br /&gt;
** Removed default CSS, this should be loadable per page now by JavaScript if nothing else.&lt;br /&gt;
* [http://wiki.secondlife.com/w/index.php?title=User:Void_Singer/Teacup&amp;amp;oldid=1141627 Teacup v0.3.1]&lt;br /&gt;
** Reabsorbed the bootstrap html page into this script and limited it&#039;s size for compatibility due to feedback&lt;br /&gt;
** Moved Saucer to it&#039;s own page, as an option resource&lt;br /&gt;
** Removed dead touch code due to incompatibility with llLoadURL ([http://jira.secondlife.com/browse/VWR-25554 VWR-25554] and [http://jira.secondlife.com/browse/VWR-25555 VWR-25555])&lt;br /&gt;
** Added handling for POST data. Page request format should be stable now.&lt;br /&gt;
* [http://wiki.secondlife.com/w/index.php?title=User:Void_Singer/Teacup&amp;amp;oldid=1141137 Teacup/Saucer v0.3]&lt;br /&gt;
** Server Test Page moved to saucer file availability handler&lt;br /&gt;
** Server JavaScript page loader library (Teacup.js) moved to File Service System&lt;br /&gt;
*** Users should have less trouble editing the file now and can include their own functions in the same file&lt;br /&gt;
** Sitewide CSS supported via &amp;quot;teacup.css&amp;quot;&lt;br /&gt;
** Saucer Script now handles page availability for quick 404 returns to speed page loading.&lt;br /&gt;
** Site Title is pulled from the object name&lt;br /&gt;
** Site address is discoverable by object scripts in the (hidden) prim hovertext&lt;br /&gt;
** Server now runs from any prim, not just the root.&lt;br /&gt;
* [http://wiki.secondlife.com/w/index.php?title=User:Void_Singer/Teacup&amp;amp;oldid=1140984 Teacup v0.2]&lt;br /&gt;
** Initial Public Release&lt;br /&gt;
&lt;br /&gt;
=== NOTE TO WIKI EDITORS ===&lt;br /&gt;
----&lt;br /&gt;
I have kept this page as a sub page of my user page to denote that it should NOT be edited except to correct errors, add confirmed bugs, or add related resources.&amp;lt;br&amp;gt;&lt;br /&gt;
The intent is to ensure executive control is in one person&#039;s hands to retain a cohesive vision of it&#039;s development.&amp;lt;br&amp;gt;&lt;br /&gt;
If you have an improvement suggestion, or request, please use the [https://wiki.secondlife.com/w/index.php?title=User_talk:Void_Singer/Teacup&amp;amp;action=edit&amp;amp;section=new discussion] page.&lt;br /&gt;
:[[User:Void Singer/Teacup#Return_to_Void_Singers_user_page|Return to top]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{void-box&lt;br /&gt;
|title=Questions or Comments?&lt;br /&gt;
|content=&lt;br /&gt;
Feel free to leave me a note on the [https://wiki.secondlife.com/w/index.php?title=User_talk:Void_Singer/Teacup&amp;amp;action=edit&amp;amp;section=new discussion] page.&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Lady Sumoku</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=HTML_HUD_Demo&amp;diff=1194506</id>
		<title>HTML HUD Demo</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=HTML_HUD_Demo&amp;diff=1194506"/>
		<updated>2015-01-22T21:49:40Z</updated>

		<summary type="html">&lt;p&gt;Lady Sumoku: Replaced old &amp;lt;LSL&amp;gt; block with &amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;span id=&amp;quot;top&amp;quot;&amp;gt;&amp;lt;/span&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=TODO:=&lt;br /&gt;
&lt;br /&gt;
* Suggest a &amp;lt;code&amp;gt;Stop All Animations&amp;lt;/code&amp;gt; button be added to Animations selection frame for convenience.&lt;br /&gt;
&lt;br /&gt;
=HTML HUD Demo:=&lt;br /&gt;
&lt;br /&gt;
== Screenshot: ==&lt;br /&gt;
&lt;br /&gt;
[[File:HTML HUD Demo.jpg|200px|thumb|top|screenshots]]&lt;br /&gt;
&lt;br /&gt;
==Tip:==&lt;br /&gt;
&lt;br /&gt;
{{KBtip|This HUD might take a second or two to load when switching from &#039;closed&#039; to &#039;open&#039; mode.}}&lt;br /&gt;
&lt;br /&gt;
==Source code:==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
//  HTML-based, single script HUD&lt;br /&gt;
//&lt;br /&gt;
//  original by Kelly Linden&lt;br /&gt;
//&lt;br /&gt;
//  To use:&lt;br /&gt;
//  - create a default prim (cube)&lt;br /&gt;
//  - wear it as a HUD on top_left (script needs tweaking for other attachment points)&lt;br /&gt;
//  - edit the cube while wearing&lt;br /&gt;
//  - add animations you want to use&lt;br /&gt;
//  - add notecards and objects you want to hand out&lt;br /&gt;
//  - add this script&lt;br /&gt;
//&lt;br /&gt;
//  License:&lt;br /&gt;
//    This script itself is free to share, modify and use without restriction.&lt;br /&gt;
//    Any linked or referenced files are not included in this license and are&lt;br /&gt;
//    licensed by their respective owners under their own respective copyright&lt;br /&gt;
//    and other licenses.&lt;br /&gt;
&lt;br /&gt;
key     owner;&lt;br /&gt;
string  ownerName;&lt;br /&gt;
&lt;br /&gt;
integer scope;&lt;br /&gt;
&lt;br /&gt;
string  url;&lt;br /&gt;
&lt;br /&gt;
key     currentRequestID;&lt;br /&gt;
&lt;br /&gt;
integer responseStatus;&lt;br /&gt;
string  responseBody;&lt;br /&gt;
&lt;br /&gt;
list    lastPath;&lt;br /&gt;
&lt;br /&gt;
string  video_url;&lt;br /&gt;
&lt;br /&gt;
string  header;&lt;br /&gt;
string  footer;&lt;br /&gt;
&lt;br /&gt;
string  currentAnimation;&lt;br /&gt;
&lt;br /&gt;
integer isVisible;&lt;br /&gt;
&lt;br /&gt;
string  exceptions;&lt;br /&gt;
&lt;br /&gt;
//  user-function: init&lt;br /&gt;
//  - does not return anything&lt;br /&gt;
//  - sets initial variable values&lt;br /&gt;
//  - sets object&#039;s name and textures&lt;br /&gt;
//  - request a url to use the HUD&lt;br /&gt;
&lt;br /&gt;
init()&lt;br /&gt;
{&lt;br /&gt;
    owner     = llGetOwner();&lt;br /&gt;
    ownerName = llKey2Name(owner);&lt;br /&gt;
    llSetObjectName(&amp;quot;HTML HUD&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    scope = AGENT_LIST_PARCEL;&lt;br /&gt;
&lt;br /&gt;
    video_url = &amp;quot;http://www.youtube.com/embed/m7p9IEpPu-c?rel=0&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
//  header set in set_link_media(url)&lt;br /&gt;
//  footer set in set_link_media(url)&lt;br /&gt;
&lt;br /&gt;
    float   FLOAT_FALSE      = 0.0;&lt;br /&gt;
    vector  RATIO_ONE_BY_ONE = &amp;lt;0.98, 0.98, 0.00&amp;gt;;//  fix Second Life ... or try to!&lt;br /&gt;
&lt;br /&gt;
    llSetLinkPrimitiveParamsFast(LINK_THIS, [&lt;br /&gt;
        PRIM_TEXTURE, ALL_SIDES, TEXTURE_BLANK,                          RATIO_ONE_BY_ONE, ZERO_VECTOR, FLOAT_FALSE,&lt;br /&gt;
        PRIM_TEXTURE, 2,         &amp;quot;0b815b79-c8f5-fc98-91fc-e77b53a468e2&amp;quot;, RATIO_ONE_BY_ONE, ZERO_VECTOR, FLOAT_FALSE]);&lt;br /&gt;
&lt;br /&gt;
    toggle_visibility_of_HUD_button();&lt;br /&gt;
    request_secure_url();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//  user-function: toggle_visibility_of_HUD_button&lt;br /&gt;
//  - does not return anything&lt;br /&gt;
//  - toggle the visibility of the prim&lt;br /&gt;
//  - will rotate, position and scale the prim&lt;br /&gt;
&lt;br /&gt;
toggle_visibility_of_HUD_button()&lt;br /&gt;
{&lt;br /&gt;
    if (isVisible)&lt;br /&gt;
    {&lt;br /&gt;
        llSetLinkPrimitiveParamsFast(LINK_THIS, [&lt;br /&gt;
            PRIM_POS_LOCAL, &amp;lt;0.0, -0.13, -0.13&amp;gt;,&lt;br /&gt;
            PRIM_ROT_LOCAL, &amp;lt;0.0, 0.0, 0.0, 1.0&amp;gt;,&lt;br /&gt;
            PRIM_SIZE, &amp;lt;0.01, 0.25, 0.25&amp;gt;]);&lt;br /&gt;
    }&lt;br /&gt;
    else&lt;br /&gt;
    {&lt;br /&gt;
        llSetLinkPrimitiveParamsFast(LINK_THIS, [&lt;br /&gt;
            PRIM_POS_LOCAL, &amp;lt;0.0, -0.04, -0.04&amp;gt;,&lt;br /&gt;
            PRIM_ROT_LOCAL, &amp;lt;0.0, 0.0, -1.0, 0.0&amp;gt;,&lt;br /&gt;
            PRIM_SIZE, &amp;lt;0.05, 0.05, 0.05&amp;gt;]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    isVisible = !isVisible;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//  user-function: drop and clear the old url&lt;br /&gt;
//  - does not return anything&lt;br /&gt;
&lt;br /&gt;
release_url()&lt;br /&gt;
{&lt;br /&gt;
    llReleaseURL(url);&lt;br /&gt;
    url = &amp;quot;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//  user-function: request secure url&lt;br /&gt;
//  - does not return anything&lt;br /&gt;
//  - make sure we release the old url before requesting a new one&lt;br /&gt;
&lt;br /&gt;
request_secure_url()&lt;br /&gt;
{&lt;br /&gt;
    release_url();&lt;br /&gt;
    currentRequestID = llRequestSecureURL();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//  user-function: set_link_media&lt;br /&gt;
//  - does not return anything&lt;br /&gt;
//  - set the values for the string variables &#039;header&#039; and &#039;footer&#039;&lt;br /&gt;
//  - prepare face 4 for media on a prim&lt;br /&gt;
&lt;br /&gt;
set_link_media(string scriptUrl)&lt;br /&gt;
{&lt;br /&gt;
    url = scriptUrl;&lt;br /&gt;
&lt;br /&gt;
    header = &amp;quot;&amp;lt;html&amp;gt;&amp;lt;head&amp;gt;&amp;lt;link href=&#039;https://d1979ns0fqtj19.cloudfront.net/&amp;quot;&lt;br /&gt;
        + &amp;quot;assets/common-103828347986224535963905120979424958961.css&#039;&amp;quot;&lt;br /&gt;
        + &amp;quot; media=&#039;all&#039; rel=&#039;stylesheet&#039; type=&#039;text/css&#039; /&amp;gt;&amp;quot;&lt;br /&gt;
        + &amp;quot;&amp;lt;base href=&#039;&amp;quot; + scriptUrl + &amp;quot;/&#039; /&amp;gt;&amp;lt;/head&amp;gt;&amp;lt;body&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    footer = &amp;quot;&amp;lt;div align=&#039;center&#039; style=&#039;position:absolute;top:93%;left:8%;&#039;&amp;gt;&amp;quot;&lt;br /&gt;
        + &amp;quot;&amp;lt;a href=&#039;&#039;&amp;gt;Scan&amp;lt;/a&amp;gt; | &amp;lt;a href=&#039;anims&#039;&amp;gt;Anims&amp;lt;/a&amp;gt; | &amp;lt;a href=&#039;video&#039;&amp;gt;&amp;quot;&lt;br /&gt;
        + &amp;quot;Video&amp;lt;/a&amp;gt; | &amp;lt;a href=&#039;config&#039;&amp;gt;Config&amp;lt;/a&amp;gt; | &amp;lt;a href=&#039;hide&#039;&amp;gt;Hide&amp;lt;/a&amp;gt;&amp;quot;&lt;br /&gt;
        + &amp;quot;&amp;lt;/div&amp;gt;&amp;lt;script src=&#039;https://d2mjw3k7q9u8rb.cloudfront.net/assets/&amp;quot;&lt;br /&gt;
        + &amp;quot;common-170919042270376442559931151451605602726.js&#039; type=&#039;text/&amp;quot;&lt;br /&gt;
        + &amp;quot;javascript&#039;&amp;gt;&amp;lt;/script&amp;gt;&amp;lt;/body&amp;gt;&amp;lt;/html&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    llSetLinkMedia(LINK_THIS, 4, [&lt;br /&gt;
        PRIM_MEDIA_AUTO_PLAY, TRUE,&lt;br /&gt;
        PRIM_MEDIA_CURRENT_URL, url,&lt;br /&gt;
        PRIM_MEDIA_HOME_URL, url,&lt;br /&gt;
        PRIM_MEDIA_HEIGHT_PIXELS, 256,&lt;br /&gt;
        PRIM_MEDIA_WIDTH_PIXELS, 256,&lt;br /&gt;
        PRIM_MEDIA_PERMS_CONTROL, PRIM_MEDIA_PERM_NONE]);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//  user-function:&lt;br /&gt;
//  - does not return anything&lt;br /&gt;
//  - used if there&#039;s not a request to the homepage of our website&lt;br /&gt;
//  - check where on the site we are and prepare variables for the response&lt;br /&gt;
&lt;br /&gt;
http_get(key requestID, list path)&lt;br /&gt;
{&lt;br /&gt;
    currentRequestID        = requestID;&lt;br /&gt;
&lt;br /&gt;
    integer numOfPathsParts = llGetListLength(path);&lt;br /&gt;
    string firstPathPart    = llList2String(path, 0);&lt;br /&gt;
&lt;br /&gt;
    if (firstPathPart == &amp;quot;hide&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        toggle_visibility_of_HUD_button();&lt;br /&gt;
        http_get(requestID, lastPath);&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    lastPath = path;&lt;br /&gt;
&lt;br /&gt;
    if (firstPathPart == &amp;quot;agent&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        if (numOfPathsParts == 1)&lt;br /&gt;
        {&lt;br /&gt;
            prepare_profile_overview_page(requestID, owner);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        else if (numOfPathsParts == 2)&lt;br /&gt;
        {&lt;br /&gt;
            key id = (key)llList2String(path, 1);&lt;br /&gt;
            prepare_profile_overview_page(requestID, id);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        else if (numOfPathsParts == 4)&lt;br /&gt;
        {&lt;br /&gt;
            if (llList2String(path, 2) != &amp;quot;give&amp;quot;)&lt;br /&gt;
            {&lt;br /&gt;
                return;&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            key id          = (key)llList2String(path, 1);&lt;br /&gt;
            string name     = llKey2Name(id);&lt;br /&gt;
            string itemName = llUnescapeURL(llList2String(path, 3));&lt;br /&gt;
&lt;br /&gt;
            llOwnerSay(&amp;quot;Giving &#039;&amp;quot; + itemName + &amp;quot;&#039; to &#039;&amp;quot; + name + &amp;quot;&#039;.&amp;quot;);&lt;br /&gt;
            llGiveInventory(id, itemName);&lt;br /&gt;
            prepare_profile_overview_page(requestID, id);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    else if (firstPathPart == &amp;quot;anims&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        if (numOfPathsParts == 1)&lt;br /&gt;
        {&lt;br /&gt;
            anims_page();&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        else if (numOfPathsParts == 2)&lt;br /&gt;
        {&lt;br /&gt;
            play_anim(llList2String(path, 1));&lt;br /&gt;
            anims_page();&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    else if (firstPathPart == &amp;quot;video&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        responseStatus = 200;&lt;br /&gt;
        responseBody = header + &amp;quot;&amp;lt;br&amp;gt;&amp;lt;iframe width=&#039;255&#039; height=&#039;173&#039; src=&#039;&amp;quot;&lt;br /&gt;
                     + video_url + &amp;quot;&#039; frameborder=&#039;0&#039; allowfullscreen&amp;gt;&amp;lt;/iframe&amp;gt;&amp;quot;&lt;br /&gt;
                     + footer;&lt;br /&gt;
&lt;br /&gt;
        return;&lt;br /&gt;
    }&lt;br /&gt;
    else if (firstPathPart == &amp;quot;config&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        if (numOfPathsParts == 1)&lt;br /&gt;
        {&lt;br /&gt;
            config_page();&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        else if (llList2String(path, 1) == &amp;quot;set&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            string queryString = llGetHTTPHeader(requestID, &amp;quot;x-query-string&amp;quot;);&lt;br /&gt;
            list args          = llParseString2List(queryString, [&amp;quot;=&amp;quot;], [&amp;quot;&amp;amp;&amp;quot;]);&lt;br /&gt;
&lt;br /&gt;
            integer index      = -llGetListLength(args);&lt;br /&gt;
            while (index)&lt;br /&gt;
            {&lt;br /&gt;
                string variable = llList2String(args, index);&lt;br /&gt;
                string value    = llUnescapeURL(llList2String(args, index + 1));&lt;br /&gt;
&lt;br /&gt;
                if (variable == &amp;quot;video&amp;quot;)&lt;br /&gt;
                {&lt;br /&gt;
                    video_url = value;&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
//              because: var, val, &amp;amp;, var, val, &amp;amp;, ...&lt;br /&gt;
                index += 3;&lt;br /&gt;
            }&lt;br /&gt;
            config_page();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    responseStatus = 404;&lt;br /&gt;
    responseBody = header + &amp;quot;&amp;lt;h1&amp;gt;404 Page Not Found.&amp;lt;/h1&amp;gt;&amp;quot; + footer;&lt;br /&gt;
    throw_exception(&amp;quot;There has been a HTTP-request to a non-existant page on &amp;quot;&lt;br /&gt;
                    + &amp;quot;your HUD&#039;s website. Please check the path of the request &amp;quot;&lt;br /&gt;
                    + &amp;quot;for mistakes.&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//  user-function: prepare_profile_overview_page&lt;br /&gt;
//  - does not return anything&lt;br /&gt;
//  - prepares a response for a page with information about a certain avatar&lt;br /&gt;
//  - includes profile thumbnail, name, script info, give menu&lt;br /&gt;
&lt;br /&gt;
prepare_profile_overview_page(key requestID, key id)&lt;br /&gt;
{&lt;br /&gt;
    list avatarDetails = llGetObjectDetails(id, [&lt;br /&gt;
                                    OBJECT_POS, OBJECT_TOTAL_SCRIPT_COUNT,&lt;br /&gt;
                                    OBJECT_SCRIPT_MEMORY, OBJECT_SCRIPT_TIME]);&lt;br /&gt;
&lt;br /&gt;
    responseStatus = 200;&lt;br /&gt;
    responseBody = header + &amp;quot;&amp;lt;table border=&#039;0&#039; cellspacing=&#039;1&#039; cellpadding=&#039;1&#039;&amp;gt;&amp;quot;&lt;br /&gt;
                 + &amp;quot;&amp;lt;tr&amp;gt;&amp;lt;td colspan=&#039;2&#039; style=&#039;white-space:nowrap&#039;&amp;gt;&amp;lt;div class=&#039;&amp;quot;&lt;br /&gt;
                 + &amp;quot;profile_title&#039;&amp;gt;&amp;lt;h1 id=&#039;display_name&#039;&amp;gt;&amp;quot;&lt;br /&gt;
                 + html_body_with_formatted_avatar_name(id) + &amp;quot;&amp;lt;/h1&amp;gt;&amp;lt;h2 id=&#039;&amp;quot;&lt;br /&gt;
                 + &amp;quot;username&#039;&amp;gt;&amp;quot; + llGetUsername(id) + &amp;quot;&amp;lt;/h2&amp;gt;&amp;lt;/div&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;td&amp;gt;&amp;quot;&lt;br /&gt;
                 + &amp;quot;&amp;lt;div align=&#039;right&#039;&amp;gt;&amp;quot;&lt;br /&gt;
                 + html_body_with_links_for_interaction_with_certain_avatar(id)&lt;br /&gt;
                 + &amp;quot;&amp;lt;br&amp;gt;&amp;quot; + html_body_with_inventory_overview_for_give_menu(id)&lt;br /&gt;
                 + &amp;quot;&amp;lt;/div&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;tr&amp;gt;&amp;lt;td width=&#039;80&#039;&amp;gt;&amp;quot;&lt;br /&gt;
                 + html_body_avatar_profile_pic_thumbnail(id)&lt;br /&gt;
                 + &amp;quot;&amp;lt;/td&amp;gt;&amp;lt;td colspan=&#039;2&#039;&amp;gt;&amp;lt;ul style=&#039;list-style-type:circle&#039;&amp;gt;&amp;quot;&lt;br /&gt;
                 + &amp;quot;&amp;lt;li&amp;gt;Scripts:&amp;lt;ul style=&#039;list-style-type:disc;margin-left:&amp;quot;&lt;br /&gt;
                 + &amp;quot;10px&#039;&amp;gt;&amp;lt;li&amp;gt;&amp;quot; + (string)llList2Integer(avatarDetails, 1)&lt;br /&gt;
                 + &amp;quot; total&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;&amp;quot; + bytes2str(llList2Integer(avatarDetails, 2))&lt;br /&gt;
                 + &amp;quot;&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;&amp;quot;&lt;br /&gt;
                 + (string)((integer)(llList2Float(avatarDetails, 3) * 1000000.0))&lt;br /&gt;
                 + &amp;quot;us&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&amp;lt;/td&amp;gt;&amp;lt;/tr&amp;gt;&amp;lt;/table&amp;gt;&amp;quot; + footer;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//  user-function: html_body_with_formatted_avatar_name&lt;br /&gt;
//  - returns the name of the avatar in html format&lt;br /&gt;
//  - removes the lastname if it is Resident&lt;br /&gt;
//  - adds a line-break for long names&lt;br /&gt;
&lt;br /&gt;
string html_body_with_formatted_avatar_name(key id)&lt;br /&gt;
{&lt;br /&gt;
    string stringToReturn = llKey2Name(id);&lt;br /&gt;
&lt;br /&gt;
    if (llGetSubString(stringToReturn, -9, -1) == &amp;quot; Resident&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        stringToReturn = llDeleteSubString(stringToReturn, -9, -1);&lt;br /&gt;
    }&lt;br /&gt;
    if (15 &amp;lt; llStringLength(stringToReturn))&lt;br /&gt;
    {&lt;br /&gt;
        stringToReturn = llDumpList2String(&lt;br /&gt;
                            llParseString2List(stringToReturn,[&amp;quot; &amp;quot;], []),&lt;br /&gt;
                            &amp;quot;&amp;lt;br&amp;gt;&amp;quot;&lt;br /&gt;
                         );&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return stringToReturn;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//  user-function: html_body_with_links_for_interaction_with_certain_avatar&lt;br /&gt;
//  - returns html text with links for an avatar to interact with who has a certain uuid&lt;br /&gt;
&lt;br /&gt;
string html_body_with_links_for_interaction_with_certain_avatar(key id)&lt;br /&gt;
{&lt;br /&gt;
    return &amp;quot;&amp;lt;div class=&#039;menu_button&#039;&amp;gt;&amp;lt;a class=&#039;button call_to_action&#039;&amp;gt;Options&amp;quot;&lt;br /&gt;
        + &amp;quot;&amp;lt;/a&amp;gt;&amp;lt;ul style=&#039;list-style-type:none;text-align:left&#039; class=&#039;menu&#039;&amp;gt;&amp;quot;&lt;br /&gt;
        + &amp;quot;&amp;lt;li&amp;gt;&amp;lt;a href=&#039;secondlife:///app/agent/&amp;quot; + (string)id + &amp;quot;/im&#039;&amp;gt;IM&amp;lt;/a&amp;gt;&amp;quot;&lt;br /&gt;
        + &amp;quot;&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a href=&#039;secondlife:///app/agent/&amp;quot; + (string)id&lt;br /&gt;
        + &amp;quot;/offerteleport&#039;&amp;gt;Offer Teleport&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a href=&#039;secondlife:///&amp;quot;&lt;br /&gt;
        + &amp;quot;app/maptrackavatar/&amp;quot; + (string)id + &amp;quot;&#039;&amp;gt;Map&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;&amp;lt;a href=&#039;&amp;quot;&lt;br /&gt;
        + &amp;quot;secondlife:///app/sharewithavatar/&amp;quot; + (string)id + &amp;quot;&#039;&amp;gt;Share&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;quot;&lt;br /&gt;
        + &amp;quot;&amp;lt;li&amp;gt;&amp;lt;a href=&#039;secondlife:///app/agent/&amp;quot; + (string)id + &amp;quot;/pay&#039;&amp;gt;Pay&amp;lt;/a&amp;gt;&amp;quot;&lt;br /&gt;
        + &amp;quot;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//  user-function: html_body_with_inventory_overview_for_give_menu&lt;br /&gt;
//  - returns html text with inventory item lists&lt;br /&gt;
&lt;br /&gt;
string html_body_with_inventory_overview_for_give_menu(key id)&lt;br /&gt;
{&lt;br /&gt;
    string stringToReturn = &amp;quot;&amp;lt;div class=&#039;menu_button&#039;&amp;gt;&amp;lt;a class=&#039;button &amp;quot;&lt;br /&gt;
        + &amp;quot;call_to_action&#039;&amp;gt;Give&amp;lt;/a&amp;gt;&amp;lt;ul style=&#039;list-style-type:none;text-align:&amp;quot;&lt;br /&gt;
        + &amp;quot;left;white-space:nowrap&#039; class=&#039;menu&#039;&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    integer sizeOfStringBefore = llStringLength(stringToReturn);&lt;br /&gt;
&lt;br /&gt;
    stringToReturn += inventory_list_in_html_format_for_give_menu(id, INVENTORY_NOTECARD);&lt;br /&gt;
    stringToReturn += inventory_list_in_html_format_for_give_menu(id, INVENTORY_OBJECT);&lt;br /&gt;
&lt;br /&gt;
    if (llStringLength(stringToReturn) == sizeOfStringBefore)&lt;br /&gt;
    {&lt;br /&gt;
        stringToReturn += &amp;quot;&amp;lt;li&amp;gt;(no objects or notecards found)&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    stringToReturn += &amp;quot;&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;
    return stringToReturn;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//  user-function: bytes2str&lt;br /&gt;
//  - returns a string with script memory info in readable format&lt;br /&gt;
&lt;br /&gt;
string bytes2str(integer bytes)&lt;br /&gt;
{&lt;br /&gt;
//  1024² = 1048576&lt;br /&gt;
&lt;br /&gt;
    if (bytes &amp;lt; 1048576)&lt;br /&gt;
        return (string)(bytes / 1024) + &amp;quot; KB&amp;quot;;&lt;br /&gt;
//  else&lt;br /&gt;
        return (string)(bytes / 1048576) + &amp;quot; MB&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//  user-function: html_body_avatar_profile_pic_thumbnail&lt;br /&gt;
//  - returns html text with urls to someone&#039;s profile pic&lt;br /&gt;
&lt;br /&gt;
string html_body_avatar_profile_pic_thumbnail(key id)&lt;br /&gt;
{&lt;br /&gt;
    return &amp;quot;&amp;lt;a href=&#039;secondlife:///app/agent/&amp;quot; + (string)id + &amp;quot;/about&#039; class=&#039;&amp;quot;&lt;br /&gt;
        + &amp;quot;avatar avatar_thumb&#039; rel=&#039;#sl_image_zoom&#039; title=&#039;Click to zoom&#039;&amp;quot;&lt;br /&gt;
        + &amp;quot;&amp;lt;img alt=&#039;Thumb_sl_image&#039; src=&#039;https://my-secondlife.s3.amazonaws&amp;quot;&lt;br /&gt;
        + &amp;quot;.com/users/&amp;quot; + llGetUsername(id) + &amp;quot;/sl_image.png&#039; /&amp;gt;&amp;lt;/a&amp;gt;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//  user-function: inventory_list_in_html_format_for_give_menu&lt;br /&gt;
//  - returns html text with inventory item list of given type&lt;br /&gt;
&lt;br /&gt;
string inventory_list_in_html_format_for_give_menu(key id, integer type)&lt;br /&gt;
{&lt;br /&gt;
    string stringToReturn;&lt;br /&gt;
&lt;br /&gt;
    integer index = llGetInventoryNumber(type);&lt;br /&gt;
    while (index)&lt;br /&gt;
    {&lt;br /&gt;
        --index;&lt;br /&gt;
&lt;br /&gt;
        string name = llGetInventoryName(type, index);&lt;br /&gt;
&lt;br /&gt;
        stringToReturn += &amp;quot;&amp;lt;li&amp;gt;&amp;lt;a href=&#039;agent/&amp;quot; + (string)id + &amp;quot;/give/&amp;quot; + name&lt;br /&gt;
                       + &amp;quot;&#039;&amp;gt;&amp;quot; + name + &amp;quot;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    return stringToReturn;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//  user-function: anims_page&lt;br /&gt;
//  - does not return anything&lt;br /&gt;
//  - prepares an html text overview page of animations&lt;br /&gt;
&lt;br /&gt;
anims_page()&lt;br /&gt;
{&lt;br /&gt;
    responseStatus = 200;&lt;br /&gt;
    responseBody   = header + &amp;quot;&amp;lt;h1&amp;gt;Animations&amp;lt;/h1&amp;gt;&amp;lt;h2&amp;gt;Choose an animation:&amp;lt;/h2&amp;gt;&amp;quot;&lt;br /&gt;
                   + &amp;quot;&amp;lt;div style=&#039;margin-left:40px&#039;&amp;gt;&amp;quot;&lt;br /&gt;
                   + html_body_animations_overview() + &amp;quot;&amp;lt;/div&amp;gt;&amp;lt;br&amp;gt;&amp;lt;br&amp;gt;&amp;quot; + footer;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//  user-function: html_body_animations_overview&lt;br /&gt;
//  - returns html text with a list of included animations&lt;br /&gt;
&lt;br /&gt;
string html_body_animations_overview()&lt;br /&gt;
{&lt;br /&gt;
    string stringToReturn = &amp;quot;&amp;lt;div class=&#039;menu_button&#039; style=&#039;align:center&#039;&amp;gt;&amp;quot;&lt;br /&gt;
                          + &amp;quot;&amp;lt;a class=&#039;button call_to_action&#039;&amp;gt;Animate&amp;lt;b class=&amp;quot;&lt;br /&gt;
                          + &amp;quot;&#039;actions_dropdown&#039;&amp;gt;&amp;amp;nbsp;&amp;lt;/b&amp;gt;&amp;lt;/a&amp;gt;&amp;lt;ul style=&#039;&amp;quot;&lt;br /&gt;
                          + &amp;quot;list-style-type:none;text-align:left&#039; class=&#039;menu&#039;&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    integer index = llGetInventoryNumber(INVENTORY_ANIMATION);&lt;br /&gt;
&lt;br /&gt;
    if (!index)&lt;br /&gt;
    {&lt;br /&gt;
        stringToReturn += &amp;quot;&amp;lt;li&amp;gt;(no animations found)&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
    else while (index)&lt;br /&gt;
    {&lt;br /&gt;
        --index;&lt;br /&gt;
&lt;br /&gt;
        string name = llGetInventoryName(INVENTORY_ANIMATION, index);&lt;br /&gt;
&lt;br /&gt;
        stringToReturn += &amp;quot;&amp;lt;li&amp;gt;&amp;lt;a href=&#039;anims/&amp;quot; + name + &amp;quot;&#039;&amp;gt;&amp;quot; + name + &amp;quot;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    stringToReturn += &amp;quot;&amp;lt;/ul&amp;gt;&amp;lt;/div&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
    return stringToReturn;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//  user-function: play_anim&lt;br /&gt;
//  - does not return anything&lt;br /&gt;
//  - prompts a perms request to animate owner&lt;br /&gt;
&lt;br /&gt;
play_anim(string anim)&lt;br /&gt;
{&lt;br /&gt;
    llRequestPermissions(owner, PERMISSION_TRIGGER_ANIMATION);&lt;br /&gt;
    currentAnimation = llUnescapeURL(anim);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//  user-function: config_page&lt;br /&gt;
//  - does not return anything&lt;br /&gt;
//  - prepares page to configure youtube video link&lt;br /&gt;
&lt;br /&gt;
config_page()&lt;br /&gt;
{&lt;br /&gt;
    responseStatus = 200;&lt;br /&gt;
    responseBody = header + &amp;quot;&amp;lt;h1&amp;gt;Options:&amp;lt;/h1&amp;gt;&amp;lt;form action=&#039;config/set&#039; method=&#039;&amp;quot;&lt;br /&gt;
                 + &amp;quot;get&#039;&amp;gt;Video URL: &amp;lt;input type=&#039;text&#039; name=&#039;video&#039; value=&#039;&amp;quot;&lt;br /&gt;
                 + video_url + &amp;quot;&#039; /&amp;gt;&amp;lt;input type=&#039;submit&#039; value=&#039;Set&#039; /&amp;gt;&amp;lt;/form&amp;gt;&amp;quot;&lt;br /&gt;
                 + footer;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//  user-function: throw_exception&lt;br /&gt;
//  - does not return anything&lt;br /&gt;
//  - logs errors into cache for later viewing and debugging&lt;br /&gt;
&lt;br /&gt;
throw_exception(string inputString)&lt;br /&gt;
{&lt;br /&gt;
    if (exceptions == &amp;quot;&amp;quot;)&lt;br /&gt;
    {&lt;br /&gt;
        exceptions = &amp;quot;The following un-handled exception(s) occurred that are &amp;quot;&lt;br /&gt;
                   + &amp;quot;preventing this device&#039;s operation:\n&amp;quot;;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    exceptions += &amp;quot;\t&amp;quot;+inputString+&amp;quot;\n&amp;quot;;&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;
        release_url();&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;
        {&lt;br /&gt;
            release_url();&lt;br /&gt;
            llResetScript();&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (change &amp;amp; (CHANGED_REGION | CHANGED_REGION_START | CHANGED_TELEPORT))&lt;br /&gt;
        {&lt;br /&gt;
            request_secure_url();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        init();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer num_detected)&lt;br /&gt;
    {&lt;br /&gt;
        toggle_visibility_of_HUD_button();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    http_request(key id, string method, string body)&lt;br /&gt;
    {&lt;br /&gt;
        responseStatus = 400;&lt;br /&gt;
        responseBody   = &amp;quot;Unsupported method&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
        if (method == URL_REQUEST_GRANTED)&lt;br /&gt;
        {&lt;br /&gt;
            responseStatus = 200;&lt;br /&gt;
            responseBody   = &amp;quot;OK&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
            set_link_media(body);&lt;br /&gt;
        }&lt;br /&gt;
        else if (method == URL_REQUEST_DENIED)&lt;br /&gt;
        {&lt;br /&gt;
            responseBody   = &amp;quot;Bad request&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
            throw_exception(&amp;quot;The following error occurred while attempting to &amp;quot;&lt;br /&gt;
                            + &amp;quot;get a free URL for this device:\n \n&amp;quot; + body);&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;GET&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
            string pathInfoHeader = llGetHTTPHeader(id, &amp;quot;x-path-info&amp;quot;);&lt;br /&gt;
            list path             = llParseString2List(pathInfoHeader, [&amp;quot;/&amp;quot;], []);&lt;br /&gt;
&lt;br /&gt;
            if (path == [])&lt;br /&gt;
            {&lt;br /&gt;
                currentRequestID = id;&lt;br /&gt;
&lt;br /&gt;
                list    agents = llGetAgentList(scope, []);&lt;br /&gt;
                integer index  = llGetListLength(agents);&lt;br /&gt;
&lt;br /&gt;
                if (!index)&lt;br /&gt;
                {&lt;br /&gt;
                    responseBody   = header + &amp;quot;&amp;lt;h2&amp;gt;Scan Results:&amp;lt;/h2&amp;gt;&amp;lt;ul style=&#039;&amp;quot;&lt;br /&gt;
                                   + &amp;quot;list-style-type:circle;margin-left:20px&#039;&amp;gt;&amp;lt;li&amp;gt;No one &amp;quot;&lt;br /&gt;
                                   + &amp;quot;near by.&amp;lt;/li&amp;gt;&amp;lt;li&amp;gt;Owner: &amp;lt;a href=&#039;agent/&amp;quot; + (string)owner&lt;br /&gt;
                                   + &amp;quot;&#039;&amp;gt;&amp;quot; + ownerName + &amp;quot;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;lt;/ul&amp;gt;&amp;quot; + footer;&lt;br /&gt;
                }&lt;br /&gt;
                else&lt;br /&gt;
                {&lt;br /&gt;
                    responseBody   = header + &amp;quot;&amp;lt;h2&amp;gt;Scan Results:&amp;lt;/h2&amp;gt;&amp;lt;ul style=&#039;&amp;quot;&lt;br /&gt;
                                   + &amp;quot;list-style-type:circle;margin-left:20px&#039;&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
                    while (index)&lt;br /&gt;
                    {&lt;br /&gt;
                        --index;&lt;br /&gt;
&lt;br /&gt;
                        key agent = llList2Key(agents, index);&lt;br /&gt;
&lt;br /&gt;
                        responseBody += &amp;quot;&amp;lt;li&amp;gt;&amp;lt;a href=&#039;agent/&amp;quot; + (string)agent + &amp;quot;&#039;&amp;gt;&amp;quot;&lt;br /&gt;
                                     + html_body_with_formatted_avatar_name(agent) + &amp;quot;&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;&amp;quot;;&lt;br /&gt;
                    }&lt;br /&gt;
&lt;br /&gt;
                    responseBody += &amp;quot;&amp;lt;/ul&amp;gt;&amp;quot; + footer;&lt;br /&gt;
                }&lt;br /&gt;
&lt;br /&gt;
                lastPath = [];&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                http_get(id, path);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        llSetContentType(id, CONTENT_TYPE_HTML);&lt;br /&gt;
        llHTTPResponse(id, responseStatus, responseBody);&lt;br /&gt;
&lt;br /&gt;
        if (exceptions != &amp;quot;&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            state error;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    run_time_permissions(integer perm)&lt;br /&gt;
    {&lt;br /&gt;
        if (perm &amp;amp; PERMISSION_TRIGGER_ANIMATION)&lt;br /&gt;
        {&lt;br /&gt;
            llStartAnimation(currentAnimation);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            throw_exception(&amp;quot;This HUD has tried to animate your avatar WITHOUT &amp;quot;&lt;br /&gt;
                            + &amp;quot;having the permissions to do so. You must grant this HUD &amp;quot;&lt;br /&gt;
                            + &amp;quot;permissions to animate your avatar for this feature to work.&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (exceptions != &amp;quot;&amp;quot;)&lt;br /&gt;
        {&lt;br /&gt;
            state error;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    state_exit()&lt;br /&gt;
    {&lt;br /&gt;
        release_url();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
state error&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;
        {&lt;br /&gt;
            llResetScript();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llOwnerSay(&amp;quot;========== ERROR REPORT START ==========&amp;quot;);&lt;br /&gt;
        llOwnerSay(exceptions);&lt;br /&gt;
        llOwnerSay(&amp;quot;========== ERROR REPORT END ==========&amp;quot;);&lt;br /&gt;
        llOwnerSay(&amp;quot;Resetting now...&amp;quot;);&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
[[#top|Go to top!]]&lt;/div&gt;</summary>
		<author><name>Lady Sumoku</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Color_and_Scripting&amp;diff=1194505</id>
		<title>Color and Scripting</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Color_and_Scripting&amp;diff=1194505"/>
		<updated>2015-01-22T21:48:15Z</updated>

		<summary type="html">&lt;p&gt;Lady Sumoku: Replaced old &amp;lt;LSL&amp;gt; block with &amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#vardefine:ml-cat|/LSL}}{{Help|Misc=*}}&lt;br /&gt;
{{LSL Header}}&lt;br /&gt;
Using color in LSL scripting is fairly easy. If works by combining values of red, green, and blue light. They are stored like this:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
float red_value;&lt;br /&gt;
float green_value;&lt;br /&gt;
float blue_value;&lt;br /&gt;
&lt;br /&gt;
vector color = &amp;lt;red_value, green_value, blue_value&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
//  or:&lt;br /&gt;
//        color.x = red_value;&lt;br /&gt;
//        color.y = green_value;&lt;br /&gt;
//        color.z = blue_value;&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Each red, green, or blue value can be between 0.0 (no color saturation) to 1.0 (total color saturation). These values are determined by combining the colors as if they were light, not paint. Therefore, the combination of all three in total saturation is white. The combination of all three with no saturation is pitch black. If there is not saturation on two values, and the third is saturated, you get a pure color.&lt;br /&gt;
&lt;br /&gt;
{{{!}} class=&amp;quot;sortable&amp;quot; {{Prettytable}}&lt;br /&gt;
{{!}}- {{Hl2}}&lt;br /&gt;
! Color&lt;br /&gt;
! Hexadecimal code&lt;br /&gt;
! LSL color representations&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} style=&amp;quot;color: white; background: #001f3f&amp;quot; {{!}}NAVY&lt;br /&gt;
{{!}} #001f3f&lt;br /&gt;
{{!}}&amp;lt;code&amp;gt;&amp;lt;0.000, 0.122, 0.247&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} style=&amp;quot;background: #0074d9&amp;quot; {{!}}BLUE&lt;br /&gt;
{{!}} #0074d9&lt;br /&gt;
{{!}}&amp;lt;code&amp;gt;&amp;lt;0.000, 0.455, 0.851&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} style=&amp;quot;background: #7fdbff&amp;quot; {{!}}AQUA&lt;br /&gt;
{{!}} #7fdbff&lt;br /&gt;
{{!}}&amp;lt;code&amp;gt;&amp;lt;0.498, 0.859, 1.000&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} style=&amp;quot;background: #39cccc&amp;quot; {{!}}TEAL&lt;br /&gt;
{{!}} #39cccc&lt;br /&gt;
{{!}}&amp;lt;code&amp;gt;&amp;lt;0.224, 0.800, 0.800&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} style=&amp;quot;background: #3d9970&amp;quot; {{!}}OLIVE&lt;br /&gt;
{{!}} #3d9970&lt;br /&gt;
{{!}}&amp;lt;code&amp;gt;&amp;lt;0.239, 0.600, 0.439&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} style=&amp;quot;background: #2ecc40&amp;quot; {{!}}GREEN&lt;br /&gt;
{{!}} #2ecc40&lt;br /&gt;
{{!}}&amp;lt;code&amp;gt;&amp;lt;0.180, 0.800, 0.251&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} style=&amp;quot;background: #01ff70&amp;quot; {{!}}LIME&lt;br /&gt;
{{!}} #01ff70&lt;br /&gt;
{{!}}&amp;lt;code&amp;gt;&amp;lt;0.004, 1.000, 0.439&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} style=&amp;quot;background: #ffdc00&amp;quot; {{!}}YELLOW&lt;br /&gt;
{{!}} #ffdc00&lt;br /&gt;
{{!}}&amp;lt;code&amp;gt;&amp;lt;1.000, 0.863, 0.000&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} style=&amp;quot;background: #ff851b&amp;quot; {{!}}ORANGE&lt;br /&gt;
{{!}} #ff851b&lt;br /&gt;
{{!}}&amp;lt;code&amp;gt;&amp;lt;1.000, 0.522, 0.106&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} style=&amp;quot;background: #ff4136&amp;quot; {{!}}RED&lt;br /&gt;
{{!}} #ff4136&lt;br /&gt;
{{!}}&amp;lt;code&amp;gt;&amp;lt;1.000, 0.255, 0.212&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} style=&amp;quot;color: white; background: #85144b&amp;quot; {{!}}MAROON&lt;br /&gt;
{{!}} #85144b&lt;br /&gt;
{{!}}&amp;lt;code&amp;gt;&amp;lt;0.522, 0.078, 0.294&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} style=&amp;quot;background: #f012be&amp;quot; {{!}}FUCHSIA&lt;br /&gt;
{{!}} #f012be&lt;br /&gt;
{{!}}&amp;lt;code&amp;gt;&amp;lt;0.941, 0.071, 0.745&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} style=&amp;quot;color: white; background: #b10dc9&amp;quot; {{!}}PURPLE&lt;br /&gt;
{{!}} #b10dc9&lt;br /&gt;
{{!}}&amp;lt;code&amp;gt;&amp;lt;0.694, 0.051, 0.788&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} style=&amp;quot;background: #ffffff&amp;quot; {{!}}WHITE&lt;br /&gt;
{{!}} #ffffff&lt;br /&gt;
{{!}}&amp;lt;code&amp;gt;&amp;lt;1.000, 1.000, 1.000&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} style=&amp;quot;background: #dddddd&amp;quot; {{!}}SILVER&lt;br /&gt;
{{!}} #dddddd&lt;br /&gt;
{{!}}&amp;lt;code&amp;gt;&amp;lt;0.867, 0.867, 0.867&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} style=&amp;quot;background: #aaaaaa&amp;quot; {{!}}GRAY&lt;br /&gt;
{{!}} #aaaaaa&lt;br /&gt;
{{!}}&amp;lt;code&amp;gt;&amp;lt;0.667, 0.667, 0.667&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} style=&amp;quot;color: white; background: #111111&amp;quot; {{!}}BLACK&lt;br /&gt;
{{!}} #111111&lt;br /&gt;
{{!}}&amp;lt;code&amp;gt;&amp;lt;0.067, 0.067, 0.067&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}}}&lt;br /&gt;
&lt;br /&gt;
== Converting Hexadecimal to Vectors ==&lt;br /&gt;
&lt;br /&gt;
To convert from a hexadecimal values used in CSS or HTML to ones usable in Second Life scripting, first convert the number for the red, green and blue saturation from hexadecimal to decimal, then divide that number by 255. Do bear in mind that 3-digit codes are a shorthand form, so each digit should be doubled (F becomes FF, 4 becomes 44, 0 becomes 00 etc)&lt;br /&gt;
&lt;br /&gt;
{|class=&amp;quot;wikitable&amp;quot; {{Prettytable}}&lt;br /&gt;
|- &lt;br /&gt;
| style=&amp;quot;background-color:#FFCC00; text-align:center;&amp;quot; | &amp;lt;sub&amp;gt;Form&amp;lt;/sub&amp;gt;&amp;lt;span style=&amp;quot;size:1.5em;&amp;quot;&amp;gt;\&amp;lt;/span&amp;gt;&amp;lt;sup&amp;gt;Channels&amp;lt;/sup&amp;gt;&lt;br /&gt;
!{{Hl2}}| Red &lt;br /&gt;
!{{Hl2}}| Green &lt;br /&gt;
!{{Hl2}}| Blue&lt;br /&gt;
|-&lt;br /&gt;
! {{Hl2}} | Hexadecimal&lt;br /&gt;
| {{HoverText|FF|total saturation}}&lt;br /&gt;
| CC&lt;br /&gt;
| {{HoverText|00|no saturation}}&lt;br /&gt;
|-&lt;br /&gt;
! {{Hl2}} |Decimal&lt;br /&gt;
| {{HoverText|255|total saturation}}&lt;br /&gt;
| 204&lt;br /&gt;
| {{HoverText|0|no saturation}}&lt;br /&gt;
|-&lt;br /&gt;
! {{Hl2}} |Saturation Float&lt;br /&gt;
| {{HoverText|1.0|total saturation}}&lt;br /&gt;
| 0.8&lt;br /&gt;
| {{HoverText|0.0|no saturation}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
total saturation:&lt;br /&gt;
* hexadecimal: FF&lt;br /&gt;
* decimal: 255&lt;br /&gt;
* float: 1.0&lt;br /&gt;
&lt;br /&gt;
no saturation:&lt;br /&gt;
* hexadecimal: 00&lt;br /&gt;
* decimal: 0&lt;br /&gt;
* float: 0.0&lt;br /&gt;
&lt;br /&gt;
Therefore:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;#F0F = #FF00FF = &amp;lt;1.0,0.0,1.0&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Contributor ==&lt;br /&gt;
[[User:FlipperPA Peregrine|FlipperPA Peregrine]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Text from In-world Notecards|Color and Scripting]]&lt;br /&gt;
[[Category:Tutorials|Color and Scripting]]&lt;br /&gt;
[[Category:Articles in need of expansion|Color and Scripting]]&lt;/div&gt;</summary>
		<author><name>Lady Sumoku</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlSetClickAction&amp;diff=1194504</id>
		<title>LlSetClickAction</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlSetClickAction&amp;diff=1194504"/>
		<updated>2015-01-22T21:47:31Z</updated>

		<summary type="html">&lt;p&gt;Lady Sumoku: Replaced old &amp;lt;LSL&amp;gt; block with &amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function&lt;br /&gt;
|inject-2={{Issues/VWR-640}}{{Issues/VWR-10829}}&lt;br /&gt;
|func_id=333|func_sleep=0.0|func_energy=10.0&lt;br /&gt;
|func=llSetClickAction&lt;br /&gt;
|p1_type=integer|p1_name=action|p1_desc=CLICK_ACTION_* flag&lt;br /&gt;
|func_desc=Sets the action performed when a prim is clicked upon (aka [[click action]]).&lt;br /&gt;
|func_footnote=When the cursor hovers over the prim, its image changes to reflect the action.&lt;br /&gt;
|caveats= *When set in the root of an object the chosen CLICK_ACTION_* will be that for the children also even if they have their own [[llSetClickAction]] set (it will be over-ridden). However (in the case of [[touch]] for example) if the CLICK_ACTION_* is set in the root but not at all in the children (including not having [[touch]] [[event]] [[script]]s in them (this creates a default CLICK_ACTION_TOUCH)) the effect of the roots CLICK_ACTION_* is not &#039;&#039;seen&#039;&#039; but the CLICK_ACTION_* is &#039;&#039;used&#039;&#039; on clicking. To both use &#039;&#039;&#039;and see&#039;&#039;&#039; the correct cursor the CLICK_ACTION_* flags must match in the children and root.&lt;br /&gt;
*If [[llSetClickAction]] is [[CLICK_ACTION_PAY]] then you must have a  [[money]] event, or it will revert to [[CLICK_ACTION_NONE]].&lt;br /&gt;
*While this function works or attached objects (click action can be changed), the configured click action of an attachment is ignored by the viewer.  The viewer always behaves as though an attached object has [[CLICK_ACTION_TOUCH]] set.&lt;br /&gt;
|examples={{{!}} class=&amp;quot;sortable&amp;quot; width=&amp;quot;100%&amp;quot; {{Prettytable}}&lt;br /&gt;
{{!}}- {{Hl2}}&lt;br /&gt;
! &#039;&#039;&#039;make sitting easier&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;make unpaking for next owner easier&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;make buying for customers easier&#039;&#039;&#039;&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;
        llSetClickAction(CLICK_ACTION_SIT);&lt;br /&gt;
        llRemoveInventory(llGetScriptName());&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;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSetClickAction(CLICK_ACTION_OPEN);&lt;br /&gt;
        llRemoveInventory(llGetScriptName());&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;
//  remember you&#039;ll have to set a price&lt;br /&gt;
//  in the general tab of the edit window&lt;br /&gt;
//  for your object before using this script&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSetClickAction(CLICK_ACTION_BUY);&lt;br /&gt;
        llRemoveInventory(llGetScriptName());&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;
//  simple tipjar&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSetClickAction(CLICK_ACTION_BUY);&lt;br /&gt;
&lt;br /&gt;
    //  enabled edit field to put own amount, all quick-pay-buttons hidden&lt;br /&gt;
        llSetPayPrice(PAY_DEFAULT, [PAY_HIDE, PAY_HIDE, PAY_HIDE, PAY_HIDE]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    money(key id, integer amount)&lt;br /&gt;
    {&lt;br /&gt;
        string name = llKey2Name(id);&lt;br /&gt;
&lt;br /&gt;
        llInstantMessage(id, &amp;quot;Thank you for the tip, &amp;quot; + name + &amp;quot;!&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|spec&lt;br /&gt;
|constants=&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
==Constants==&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em;&amp;quot;&amp;gt;&lt;br /&gt;
{{{!}} class=&amp;quot;sortable&amp;quot; {{Prettytable}}&lt;br /&gt;
{{!}}- {{Hl2}}&lt;br /&gt;
! {{!}} Flag&lt;br /&gt;
! title=&amp;quot;Value&amp;quot; {{!}}&lt;br /&gt;
! class=&amp;quot;unsortable&amp;quot; {{!}} Description&lt;br /&gt;
! class=&amp;quot;unsortable&amp;quot; {{!}} Cursor&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}}{{LSL Const|CLICK_ACTION_NONE|integer|0|c=Performs the default action: when the prim is touched, touch events are triggered}}&lt;br /&gt;
{{!}}{{#var:value}}&lt;br /&gt;
{{!}}{{#var:comment}}&lt;br /&gt;
{{!}}&amp;lt;!--[[Image:]]--&amp;gt;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}}{{LSL Const|CLICK_ACTION_TOUCH|integer|0|c=When the prim is touched, touch events are triggered}}&lt;br /&gt;
{{!}}{{#var:value}}&lt;br /&gt;
{{!}}{{#var:comment}}&lt;br /&gt;
{{!}}&amp;lt;!--[[Image:]]--&amp;gt;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}}{{LSL Const|CLICK_ACTION_SIT|integer|1|c=When the prim is touched, the avatar sits upon it}}&lt;br /&gt;
{{!}}{{#var:value}}&lt;br /&gt;
{{!}}{{#var:comment}}&lt;br /&gt;
{{!}}[[File:SitActionCursor.png‎]]&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}}{{LSL Const|CLICK_ACTION_BUY|integer|2|c=When the prim is touched, the buy dialog is opened}}&lt;br /&gt;
{{!}}{{#var:value}}&lt;br /&gt;
{{!}}{{#var:comment}}&lt;br /&gt;
{{!}}[[File:SaleOneclickCursor.png]]&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}}{{LSL Const|CLICK_ACTION_PAY|integer|3|c=When the prim is touched, the pay dialog is opened}}&lt;br /&gt;
{{!}}{{#var:value}}&lt;br /&gt;
{{!}}{{#var:comment}}&lt;br /&gt;
{{!}}[[File:SaleOneclickCursor.png]]&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}}{{LSL Const|CLICK_ACTION_OPEN|integer|4|c=When the prim is touched, the object inventory dialog is opened}}&lt;br /&gt;
{{!}}{{#var:value}}&lt;br /&gt;
{{!}}{{#var:comment}}&lt;br /&gt;
{{!}}[[File:OpenOneclickCursor.png]]&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}}{{LSL Const|CLICK_ACTION_PLAY|integer|5|c=Play or pause parcel media on touch}}&lt;br /&gt;
{{!}}{{#var:value}}&lt;br /&gt;
{{!}}{{#var:comment}}&lt;br /&gt;
{{!}}[[Image:Toolplay.png]]&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}}{{LSL Const|CLICK_ACTION_OPEN_MEDIA|integer|6|c=Play parcel media on touch, no pause}}&lt;br /&gt;
{{!}}{{#var:value}}&lt;br /&gt;
{{!}}{{#var:comment}}&lt;br /&gt;
{{!}}[[Image:Toolmediaopen.png]]&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}}{{LSL Const|CLICK_ACTION_ZOOM|integer|7|c=Zoom}}&lt;br /&gt;
{{!}}{{#var:value}}&lt;br /&gt;
{{!}}{{#var:comment}} ([[Viewer_2_Help|Viewer 2]])&lt;br /&gt;
{{!}}[[Image:Toolzoom.png]]&lt;br /&gt;
{{!}}}&lt;br /&gt;
&amp;lt;/div&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
|signature=&lt;br /&gt;
{{LSL Const/Signature|CLICK_ACTION_ZOOM|integer|7|c=Zoom}}&lt;br /&gt;
|helpers&lt;br /&gt;
|also_functions={{LSL DefineRow||[[llPassTouches]]}}&lt;br /&gt;
|also_tests&lt;br /&gt;
|also_events=&lt;br /&gt;
{{LSL DefineRow||[[touch_start]]}}&lt;br /&gt;
{{LSL DefineRow||[[touch]]}}&lt;br /&gt;
{{LSL DefineRow||[[touch_end]]}}&lt;br /&gt;
|also_articles={{LSL DefineRow||{{LSLGC|Detected}}}}&lt;br /&gt;
&lt;br /&gt;
|history=&lt;br /&gt;
* Introduced in SL Client 1.19.1(0)&lt;br /&gt;
* [[CLICK_ACTION_ZOOM]] added in SL Server 1.32 and [[Viewer_2_Help|Viewer 2]]&lt;br /&gt;
|cat1=Prim&lt;br /&gt;
|cat2=Touch&lt;br /&gt;
|cat3=Sit&lt;br /&gt;
|cat4=Money&lt;br /&gt;
|cat5=Media&lt;br /&gt;
|cat6=Effects&lt;br /&gt;
|cat7&lt;br /&gt;
|cat8&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Lady Sumoku</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlSetColor&amp;diff=1194502</id>
		<title>LlSetColor</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlSetColor&amp;diff=1194502"/>
		<updated>2015-01-22T21:46:04Z</updated>

		<summary type="html">&lt;p&gt;Lady Sumoku: Replaced old &amp;lt;LSL&amp;gt; block with &amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function&lt;br /&gt;
|inject-2={{LSL Function/color|color}}{{LSL_Function/face|face|}}&lt;br /&gt;
|func_id=49|func_sleep=0.0|func_energy=10.0&lt;br /&gt;
|func=llSetColor&lt;br /&gt;
|p1_type=vector|p1_name=color|p2_type=integer|p2_name=face&lt;br /&gt;
|func_footnote&lt;br /&gt;
|func_desc=Sets the {{LSLP|color}} on {{LSLP|face}} of the prim.&lt;br /&gt;
|return_text&lt;br /&gt;
|spec&lt;br /&gt;
|caveats&lt;br /&gt;
|constants&lt;br /&gt;
|examples=&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
integer face = -1;&lt;br /&gt;
vector color = &amp;lt;1.0, 1.0, 1.0&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    touch_start(integer num)&lt;br /&gt;
    {&lt;br /&gt;
        if(~face)       //quick &amp;amp; dirty but efficient way of testing if face is not equal to -1&lt;br /&gt;
            llSetColor(color, face); //restore the color&lt;br /&gt;
        face = (face + 1) % llGetNumberOfSides(); //increment and keep the face number in range&lt;br /&gt;
        color = llGetColor(face); //save the face&#039;s color&lt;br /&gt;
        llSetColor(&amp;lt;0.5, 0.0, 0.0&amp;gt;, face );  //change the face&#039;s color&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|helpers=&lt;br /&gt;
{{{!}} class=&amp;quot;sortable&amp;quot; {{Prettytable}}&lt;br /&gt;
{{!}}- {{Hl2}}&lt;br /&gt;
! Color&lt;br /&gt;
! Hexadecimal code&lt;br /&gt;
! LSL color representations&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} style=&amp;quot;color: white; background: #001f3f&amp;quot; {{!}}NAVY&lt;br /&gt;
{{!}} #001f3f&lt;br /&gt;
{{!}}&amp;lt;code&amp;gt;&amp;lt;0.000, 0.122, 0.247&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} style=&amp;quot;background: #0074d9&amp;quot; {{!}}BLUE&lt;br /&gt;
{{!}} #0074d9&lt;br /&gt;
{{!}}&amp;lt;code&amp;gt;&amp;lt;0.000, 0.455, 0.851&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} style=&amp;quot;background: #7fdbff&amp;quot; {{!}}AQUA&lt;br /&gt;
{{!}} #7fdbff&lt;br /&gt;
{{!}}&amp;lt;code&amp;gt;&amp;lt;0.498, 0.859, 1.000&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} style=&amp;quot;background: #39cccc&amp;quot; {{!}}TEAL&lt;br /&gt;
{{!}} #39cccc&lt;br /&gt;
{{!}}&amp;lt;code&amp;gt;&amp;lt;0.224, 0.800, 0.800&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} style=&amp;quot;background: #3d9970&amp;quot; {{!}}OLIVE&lt;br /&gt;
{{!}} #3d9970&lt;br /&gt;
{{!}}&amp;lt;code&amp;gt;&amp;lt;0.239, 0.600, 0.439&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} style=&amp;quot;background: #2ecc40&amp;quot; {{!}}GREEN&lt;br /&gt;
{{!}} #2ecc40&lt;br /&gt;
{{!}}&amp;lt;code&amp;gt;&amp;lt;0.180, 0.800, 0.251&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} style=&amp;quot;background: #01ff70&amp;quot; {{!}}LIME&lt;br /&gt;
{{!}} #01ff70&lt;br /&gt;
{{!}}&amp;lt;code&amp;gt;&amp;lt;0.004, 1.000, 0.439&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} style=&amp;quot;background: #ffdc00&amp;quot; {{!}}YELLOW&lt;br /&gt;
{{!}} #ffdc00&lt;br /&gt;
{{!}}&amp;lt;code&amp;gt;&amp;lt;1.000, 0.863, 0.000&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} style=&amp;quot;background: #ff851b&amp;quot; {{!}}ORANGE&lt;br /&gt;
{{!}} #ff851b&lt;br /&gt;
{{!}}&amp;lt;code&amp;gt;&amp;lt;1.000, 0.522, 0.106&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} style=&amp;quot;background: #ff4136&amp;quot; {{!}}RED&lt;br /&gt;
{{!}} #ff4136&lt;br /&gt;
{{!}}&amp;lt;code&amp;gt;&amp;lt;1.000, 0.255, 0.212&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} style=&amp;quot;color: white; background: #85144b&amp;quot; {{!}}MAROON&lt;br /&gt;
{{!}} #85144b&lt;br /&gt;
{{!}}&amp;lt;code&amp;gt;&amp;lt;0.522, 0.078, 0.294&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} style=&amp;quot;background: #f012be&amp;quot; {{!}}FUCHSIA&lt;br /&gt;
{{!}} #f012be&lt;br /&gt;
{{!}}&amp;lt;code&amp;gt;&amp;lt;0.941, 0.071, 0.745&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} style=&amp;quot;color: white; background: #b10dc9&amp;quot; {{!}}PURPLE&lt;br /&gt;
{{!}} #b10dc9&lt;br /&gt;
{{!}}&amp;lt;code&amp;gt;&amp;lt;0.694, 0.051, 0.788&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} style=&amp;quot;background: #ffffff&amp;quot; {{!}}WHITE&lt;br /&gt;
{{!}} #ffffff&lt;br /&gt;
{{!}}&amp;lt;code&amp;gt;&amp;lt;1.000, 1.000, 1.000&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} style=&amp;quot;background: #dddddd&amp;quot; {{!}}SILVER&lt;br /&gt;
{{!}} #dddddd&lt;br /&gt;
{{!}}&amp;lt;code&amp;gt;&amp;lt;0.867, 0.867, 0.867&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} style=&amp;quot;background: #aaaaaa&amp;quot; {{!}}GRAY&lt;br /&gt;
{{!}} #aaaaaa&lt;br /&gt;
{{!}}&amp;lt;code&amp;gt;&amp;lt;0.667, 0.667, 0.667&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} style=&amp;quot;color: white; background: #111111&amp;quot; {{!}}BLACK&lt;br /&gt;
{{!}} #111111&lt;br /&gt;
{{!}}&amp;lt;code&amp;gt;&amp;lt;0.067, 0.067, 0.067&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}}}&lt;br /&gt;
|also_functions=&lt;br /&gt;
{{LSL DefineRow||[[llGetAlpha]]|Gets the prim&#039;s alpha}}&lt;br /&gt;
{{LSL DefineRow||[[llSetAlpha]]|Sets the prim&#039;s alpha}}&lt;br /&gt;
{{LSL DefineRow||[[llGetColor]]|Gets the prim&#039;s color}}&lt;br /&gt;
{{LSL DefineRow||[[llSetLinkColor]]|Sets link&#039;s color}}&lt;br /&gt;
{{LSL DefineRow||[[llSetLinkAlpha]]|Sets link&#039;s alpha}}&lt;br /&gt;
|also_tests&lt;br /&gt;
|also_events=&lt;br /&gt;
{{LSL DefineRow||[[changed]]|[[CHANGED_COLOR]]}}&lt;br /&gt;
|also_articles=&lt;br /&gt;
{{LSL DefineRow||[[Color and Scripting]]}}&lt;br /&gt;
|notes&lt;br /&gt;
|deprecated&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>Lady Sumoku</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlSetContentType&amp;diff=1194498</id>
		<title>LlSetContentType</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlSetContentType&amp;diff=1194498"/>
		<updated>2015-01-22T21:45:09Z</updated>

		<summary type="html">&lt;p&gt;Lady Sumoku: Replaced old &amp;lt;LSL&amp;gt; block with &amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function&lt;br /&gt;
|func=llSetContentType&lt;br /&gt;
|func_id=?&lt;br /&gt;
|func_energy=?&lt;br /&gt;
|func_sleep&lt;br /&gt;
|func_desc=Sets the {{Wikipedia|Internet media type|Internet media type}} &amp;lt;code&amp;gt;{{String|Content-Type}}&amp;lt;/code&amp;gt; header of any subsequent [[LSL HTTP server]] response via [[llHTTPResponse]].&lt;br /&gt;
|sort&lt;br /&gt;
|func_footnote&lt;br /&gt;
|return_type&lt;br /&gt;
|return_text&lt;br /&gt;
|p1_type=key|p1_subtype=handle|p1_name=request_id|p1_desc=a valid [[http_request]]() key|p1_hover=a valid http_request() key&lt;br /&gt;
|p2_type=integer|p2_name=content_type|p2_desc=Media type to use with any following [[llHTTPResponse]]({{LSLP|request_id}}, ...)&lt;br /&gt;
|p2_hover=Media type to use with any following llHTTPResponse(request_id, ...) &lt;br /&gt;
|constants={{LSL Constants/Content Type}}&lt;br /&gt;
|spec&lt;br /&gt;
|caveats=&lt;br /&gt;
* When using [[CONTENT_TYPE_HTML]], this setting will be ignored unless all of these conditions are met: &lt;br /&gt;
*# the web browser is the Second Life client&lt;br /&gt;
*# the user (logged into the SL client viewing the page) is the owner of the object.&lt;br /&gt;
*# the user (logged into the SL client viewing the page) is connected to the region the object is located in&lt;br /&gt;
*: Obviously this is not compatible with group owned objects. One way around this limitation would be to [[llAttachToAvatarTemp|temporarily attach]] a repeated.&lt;br /&gt;
|examples=&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
key url_request;&lt;br /&gt;
&lt;br /&gt;
string HTML_BODY =&lt;br /&gt;
&amp;quot;&amp;lt;!DOCTYPE html&amp;gt;&lt;br /&gt;
&amp;lt;html&amp;gt;&lt;br /&gt;
&amp;lt;body&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h1&amp;gt;My First Heading&amp;lt;/h1&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;My first paragraph.&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/body&amp;gt;&lt;br /&gt;
&amp;lt;/html&amp;gt;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        url_request = llRequestURL();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    http_request(key id, string method, string body)&lt;br /&gt;
    {&lt;br /&gt;
        key owner = llGetOwner();&lt;br /&gt;
        vector ownerSize = llGetAgentSize(owner);&lt;br /&gt;
&lt;br /&gt;
        if (url_request == id)&lt;br /&gt;
        {&lt;br /&gt;
        //  if you&#039;re usually not resetting the query ID&lt;br /&gt;
        //  now is a good time to start!&lt;br /&gt;
            url_request = &amp;quot;&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
            if (method == URL_REQUEST_GRANTED)&lt;br /&gt;
            {&lt;br /&gt;
                llOwnerSay(&amp;quot;URL: &amp;quot; + body);&lt;br /&gt;
&lt;br /&gt;
            //  if owner in sim&lt;br /&gt;
                if (ownerSize)//  != ZERO_VECTOR&lt;br /&gt;
                    llLoadURL(owner, &amp;quot;I got a new URL!&amp;quot;, body);&lt;br /&gt;
            }&lt;br /&gt;
&lt;br /&gt;
            else if (method == URL_REQUEST_DENIED)&lt;br /&gt;
                llOwnerSay(&amp;quot;Something went wrong, no url:\n&amp;quot; + body);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            llOwnerSay(&amp;quot;request body:\n&amp;quot; + body);&lt;br /&gt;
&lt;br /&gt;
        //  if owner in sim&lt;br /&gt;
            if (ownerSize)//  != ZERO_VECTOR&lt;br /&gt;
            {&lt;br /&gt;
                llSetContentType(id, CONTENT_TYPE_HTML);&lt;br /&gt;
                llHTTPResponse(id, 200, HTML_BODY);&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                llSetContentType(id, CONTENT_TYPE_TEXT);&lt;br /&gt;
                llHTTPResponse(id, 200, &amp;quot;OK&amp;quot;);&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_header&lt;br /&gt;
|also_constants&lt;br /&gt;
|also_events=&lt;br /&gt;
{{LSL DefineRow||[[http_request]]}}&lt;br /&gt;
{{LSL DefineRow||[[http_response]]}}&lt;br /&gt;
|also_functions={{LSL DefineRow||[[llHTTPResponse]]}}&lt;br /&gt;
|also_articles=&lt;br /&gt;
{{LSL DefineRow||[[LSL HTTP server]]}}&lt;br /&gt;
{{LSL DefineRow||[[HTML HUD Demo]]}}&lt;br /&gt;
|also_footer&lt;br /&gt;
|notes=&lt;br /&gt;
* A workaround for displaying html to non-owners inworld can be found [[Teacup|here]].&lt;br /&gt;
|history=* Released August 16, 2011.&lt;br /&gt;
*{{Jira|SCR-394}} - Documentation revised but no change in functionality.&lt;br /&gt;
|mode&lt;br /&gt;
|deprecated&lt;br /&gt;
|permission&lt;br /&gt;
|cat1=HTTP&lt;br /&gt;
|cat2=HTTP/Server&lt;br /&gt;
|comments=The client and owner limitations are most likely to remove the possibility of running a website from a prim.&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Lady Sumoku</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlSetDamage&amp;diff=1194496</id>
		<title>LlSetDamage</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlSetDamage&amp;diff=1194496"/>
		<updated>2015-01-22T21:44:09Z</updated>

		<summary type="html">&lt;p&gt;Lady Sumoku: Replaced old &amp;lt;LSL&amp;gt; block with &amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function&lt;br /&gt;
|func_id=157|func_sleep=0.0|func_energy=10.0&lt;br /&gt;
|sort=SetDamage&lt;br /&gt;
|func=llSetDamage|p1_type=float|p1_name=damage|p1_desc=range: 0.0 (no [[damage]]) ~ 100.0 (instant [[death|kill]])&lt;br /&gt;
|func_footnote&lt;br /&gt;
|func_desc=Sets the amount of &#039;&#039;&#039;damage&#039;&#039;&#039; that will be done when this object hits an avatar.&lt;br /&gt;
|return_text&lt;br /&gt;
|spec=&lt;br /&gt;
For an avatar to take damage when the object collides with an avatar...&lt;br /&gt;
*The object must not be [[STATUS_PHANTOM|phantom]] or [[llVolumeDetect]]([[TRUE]])&lt;br /&gt;
*The avatar must be on the land where &amp;quot;Safe (no damage)&amp;quot; is disabled.&lt;br /&gt;
**The object however does not need to be on or even partially over damage enabled land.&lt;br /&gt;
When these preconditions are met, the avatar receives the damage, and the object will [[llDie|die]] without calling the {{LSLGC|Collision|collision}} events.&lt;br /&gt;
|caveats=&lt;br /&gt;
*If &#039;&#039;&#039;damage&#039;&#039;&#039; is 100.0 or greater, the object will instantly [[death|kill]] even a fully healthy avatar.&lt;br /&gt;
*If &#039;&#039;&#039;damage&#039;&#039;&#039; is zero or less, no damage will be inflicted and the object will &#039;&#039;not&#039;&#039; die and the {{LSLGC|Collision|collision}} or {{LSLGC|Land Collision|land_collision}} events will be queued.&lt;br /&gt;
*If a damage enabled object hits a physics enabled object that an avatar is sitting on, the avatar receives the damage just the same as they would if they had been hit directly.&lt;br /&gt;
|constants&lt;br /&gt;
|examples=&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;//Simple autokiller bullet:&lt;br /&gt;
// This will instantly &amp;quot;kill&amp;quot; on collision if contact is made with avatar on damage enabled land.&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    on_rez(integer param) // Becomes active when rezzed.&lt;br /&gt;
    {&lt;br /&gt;
        llSetDamage(100.0); // Set the damage to maximum.&lt;br /&gt;
        llSensor(&amp;quot;&amp;quot;, &amp;quot;&amp;quot;, AGENT, 96.0, PI); // Sweep a 96 meter sphere searching for agents.&lt;br /&gt;
    }&lt;br /&gt;
    sensor(integer num) // If an agent is detected...&lt;br /&gt;
    {&lt;br /&gt;
        llSetStatus(STATUS_PHYSICS, TRUE); // Enable physics to allow physical movement.&lt;br /&gt;
        llSetTimerEvent(10.0); // Set a 10 second timer.&lt;br /&gt;
        llMoveToTarget(llDetectedPos(0), 0.5); // Move to the detected position.&lt;br /&gt;
    }&lt;br /&gt;
    no_sensor() // If no agents are detected...&lt;br /&gt;
    {&lt;br /&gt;
        llDie(); // Auto destruct.&lt;br /&gt;
    }&lt;br /&gt;
    timer() // If we missed our target...&lt;br /&gt;
    {&lt;br /&gt;
        llDie(); // Auto destruct.&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;
|negative_index&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>Lady Sumoku</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlSetForce&amp;diff=1194494</id>
		<title>LlSetForce</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlSetForce&amp;diff=1194494"/>
		<updated>2015-01-22T21:43:06Z</updated>

		<summary type="html">&lt;p&gt;Lady Sumoku: Replaced old &amp;lt;LSL&amp;gt; block with &amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Function&lt;br /&gt;
|inject-2={{LSL_Function/force|force|local=local}}{{LSL_Function/physical}}&lt;br /&gt;
|func_id=64&lt;br /&gt;
|func_sleep=0.0&lt;br /&gt;
|func_energy=10.0&lt;br /&gt;
|func=llSetForce&lt;br /&gt;
|p1_type=vector|p1_name=force|p1_desc=directional force&lt;br /&gt;
|p2_type=integer|p2_subtype=boolean|p2_name=local&lt;br /&gt;
|func_footnote=Continuous force. [[llApplyImpulse]] has instantaneous push.&lt;br /&gt;
|func_desc=Applies force to the object (if the script is physical)&lt;br /&gt;
|spec&lt;br /&gt;
|caveats=Only works on physical objects and attachments (non-physical as well as physical).  Used on an attachment, it will apply the force to the avatar.&lt;br /&gt;
|constants&lt;br /&gt;
|examples=&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;//A simple rocket script. Launches object up when touched. &lt;br /&gt;
//Sit on it for an interesting ride!&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    touch_start(integer i)&lt;br /&gt;
    {&lt;br /&gt;
        llSetStatus(STATUS_PHYSICS, TRUE);&lt;br /&gt;
        llSetForce(&amp;lt;0,0,0x7FFFFFFF&amp;gt;, 0);  //FLY!&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
|helpers&lt;br /&gt;
|also_functions={{LSL DefineRow||[[llSetForceAndTorque]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llSetTorque]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llApplyImpulse]]|Instantaneous force}}&lt;br /&gt;
|also_tests&lt;br /&gt;
|also_events&lt;br /&gt;
|also_articles&lt;br /&gt;
|notes&lt;br /&gt;
|cat1=Physics&lt;br /&gt;
|cat2=Movement&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Lady Sumoku</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlSetForceAndTorque&amp;diff=1194492</id>
		<title>LlSetForceAndTorque</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlSetForceAndTorque&amp;diff=1194492"/>
		<updated>2015-01-22T21:42:15Z</updated>

		<summary type="html">&lt;p&gt;Lady Sumoku: Replaced old &amp;lt;LSL&amp;gt; block with &amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Function&lt;br /&gt;
|inject-2={{LSL_Function/force|force|torque|local=local}}{{LSL_Function/physical}}&lt;br /&gt;
|func_id=76&lt;br /&gt;
|func_sleep=0.0&lt;br /&gt;
|func_energy=10.0&lt;br /&gt;
|func=llSetForceAndTorque&lt;br /&gt;
|p1_type=vector|p1_name=force|p1_desc=directional force&lt;br /&gt;
|p2_type=vector|p2_name=torque|p2_desc=torque force&lt;br /&gt;
|p3_type=integer|p3_subtype=boolean|p3_name=local&lt;br /&gt;
|func_desc=Sets the force and torque of object (if the script is physical)&lt;br /&gt;
|spec&lt;br /&gt;
|caveats=&lt;br /&gt;
* If either value is [[ZERO_VECTOR]], the function eliminates both forces. Both values must be non-zero for this function to work. (The workaround to this is setting both separately.)&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;
    touch_start(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        llSetForceAndTorque( &amp;lt;0.0,0.0,5.0&amp;gt;, &amp;lt;1.0,0.0,0.0&amp;gt;, FALSE );&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||[[llSetForce]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llSetTorque]]|}}&lt;br /&gt;
|also_tests&lt;br /&gt;
|also_events&lt;br /&gt;
|also_articles&lt;br /&gt;
|notes&lt;br /&gt;
|cat1=Physics&lt;br /&gt;
|cat2=Movement&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Lady Sumoku</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlSetHoverHeight&amp;diff=1194490</id>
		<title>LlSetHoverHeight</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlSetHoverHeight&amp;diff=1194490"/>
		<updated>2015-01-22T21:41:45Z</updated>

		<summary type="html">&lt;p&gt;Lady Sumoku: Replaced old &amp;lt;LSL&amp;gt; block with &amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function&lt;br /&gt;
|inject-2=&lt;br /&gt;
{{LSL_Function/physical}}&lt;br /&gt;
{{LSL_Function/damping|tau}}&lt;br /&gt;
|inject-3=&lt;br /&gt;
{{LSL_Function/boolean|water|bool=*|if=*|td=then hover above water too (or below if {{LSLP|height}} is negative)|th=then hover above water too (or below if height is negative)|fd=ignore water like it isn&#039;t there}}&lt;br /&gt;
|func_id=123|func_sleep=0.0|func_energy=10.0&lt;br /&gt;
|func=llSetHoverHeight&lt;br /&gt;
|p1_type=float|p1_name=height|p1_desc=Distance to hover above the ground (if negative, hovers below ground)&lt;br /&gt;
|p2_type=integer|p2_subtype=boolean|p2_name=water&lt;br /&gt;
|p3_type=float|p3_name=tau&lt;br /&gt;
|func_footnote=Do not use with vehicles.&amp;lt;br/&amp;gt;Use [[llStopHover]] to stop hovering.&lt;br /&gt;
|func_desc=Critically damps to a {{LSLP|height}} above the ground (or water) in {{LSLP|tau}} seconds.&lt;br /&gt;
|return_text&lt;br /&gt;
|spec&lt;br /&gt;
|caveats=*Do not rely on built-in limits. In the past, the difference between the object&#039;s initial position and the hover height was limited to 64 meters. Under SL Server 1.26.2 the limit is 4096 meters above the ground level.&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;
// Put in an attached prim and touch to start floating in air without flying.&lt;br /&gt;
// Touch again to drop to the ground.&lt;br /&gt;
&lt;br /&gt;
integer gHovering = FALSE; // are we supposd to be hovering now?&lt;br /&gt;
&lt;br /&gt;
default {&lt;br /&gt;
    touch_start(integer total_number) {&lt;br /&gt;
        if (!llGetAttached()) {&lt;br /&gt;
            llWhisper(0, &amp;quot;Wear me to play.&amp;quot;);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        if (gHovering) {&lt;br /&gt;
            llOwnerSay(&amp;quot;Releasing you.&amp;quot;);&lt;br /&gt;
            llStopHover();&lt;br /&gt;
        }&lt;br /&gt;
        else {&lt;br /&gt;
            llOwnerSay(&amp;quot;Making you float...&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            // Start hovering 5 meters over our current location.&lt;br /&gt;
            vector myPosition = llGetPos();&lt;br /&gt;
            llSetHoverHeight(myPosition.z - llGround(ZERO_VECTOR) + 5.0, FALSE, 1.0);&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        gHovering = !gHovering; // flip the switch&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|notes=* It is possible to assign &#039;&#039;&#039;height&#039;&#039;&#039; a negative value. If &#039;&#039;&#039;water&#039;&#039;&#039; is [[TRUE]], this will make the object hover below the water level.&lt;br /&gt;
* Unless [[llVolumeDetect|volume detect]] is enabled, negative &#039;&#039;&#039;height&#039;&#039;&#039; values when &#039;&#039;&#039;water&#039;&#039;&#039; is [[FALSE]] will not move the object below the ground level and may cause it to be dragged down the local incline to the nearest low point. Enabling [[llVolumeDetect|volume detect]] will cause negative &#039;&#039;&#039;height&#039;&#039;&#039; settings to move the object below the ground level.&lt;br /&gt;
* Assigning &#039;&#039;&#039;height&#039;&#039;&#039; a value of zero will have the same effect as [[llStopHover]].&lt;br /&gt;
|helpers&lt;br /&gt;
|also_functions={{LSL DefineRow||[[llGroundRepel]]| Same as llSetHoverHeight but does not hover all the time}}&lt;br /&gt;
{{LSL DefineRow||[[llStopHover]]|To stop hovering}}&lt;br /&gt;
|also_tests&lt;br /&gt;
|also_events&lt;br /&gt;
|also_articles&lt;br /&gt;
|notes&lt;br /&gt;
|cat1=Hover&lt;br /&gt;
|cat2=Movement&lt;br /&gt;
|cat3=Physics&lt;br /&gt;
|cat4&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Lady Sumoku</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlSetKeyframedMotion&amp;diff=1194487</id>
		<title>LlSetKeyframedMotion</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlSetKeyframedMotion&amp;diff=1194487"/>
		<updated>2015-01-22T21:40:13Z</updated>

		<summary type="html">&lt;p&gt;Lady Sumoku: Replaced old &amp;lt;LSL&amp;gt; block with &amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function&lt;br /&gt;
|inject-2={{Issues/SCR-345}}{{Issues/SCR-346}}{{Issues/SVC-7796}}{{Issues/SCR-373}}&lt;br /&gt;
|func=llSetKeyframedMotion&lt;br /&gt;
|func_id=?&lt;br /&gt;
|func_desc=Specify a list of times, positions, and orientations to be followed by an object. The object will be smoothly moved between keyframes by the simulator. Collisions with other nonphysical or keyframed objects will be ignored (no script events will fire and collision processing will not occur). Collisions with physical objects will be computed and reported, but the keyframed object will be unaffected by those collisions. (The physical object will be affected, however.) &lt;br /&gt;
|func_sleep&lt;br /&gt;
|func_energy&lt;br /&gt;
|func_footnote&lt;br /&gt;
|p1_type=list|p1_name=keyframes|p1_hover=Strided keyframe list of the form: [vector position, rotation orientation, float time]&lt;br /&gt;
|p1_desc=Strided keyframe list of the form:&lt;br /&gt;
* &#039;&#039;vector&#039;&#039; position (optional via [[KFM_TRANSLATION]] and [[KFM_DATA]])&lt;br /&gt;
* &#039;&#039;rotation&#039;&#039; orientation (optional via [[KFM_ROTATION]] and [[KFM_DATA]])&lt;br /&gt;
* &#039;&#039;float&#039;&#039; time&lt;br /&gt;
&lt;br /&gt;
Each keyframe is interpreted relative to the previous transform of the object. For example, consider the following list of keyframes: [&amp;lt;0, 0, 10&amp;gt;, [[ZERO_ROTATION]], 5, &amp;lt;0, 0, 0&amp;gt;, [[ZERO_ROTATION]], 5, &amp;lt;0, 0, -10&amp;gt;, [[ZERO_ROTATION]], 5]. This would cause the object to move up 10m over the course of 5s. It would then remain at the location for 5s before moving down 10m over the course of another 5s.&lt;br /&gt;
Time values must be 1/9s. or greater.&lt;br /&gt;
Linear and angular velocities will be clamped to limits set by the simulator (values TBD).&lt;br /&gt;
An empty list will terminate any keyframed animation currently playing. &lt;br /&gt;
|p2_type=list|p2_subtype=instructions|p2_name=options|p2_desc=modifiers and future options &lt;br /&gt;
|spec=&lt;br /&gt;
The following flags will be supported within the &#039;&#039;options&#039;&#039; list:&lt;br /&gt;
*[[KFM_MODE]] followed by one of: [[KFM_LOOP]], [[KFM_REVERSE]], [[KFM_FORWARD]], or [[KFM_PING_PONG]] will specify the playback mode. Defaults to [[KFM_FORWARD]]. Must be specified when the keyframe list is provided.&lt;br /&gt;
*[[KFM_DATA]] followed by a bitwise combination of: [[KFM_TRANSLATION]] and [[KFM_ROTATION]]. By default both rotations and translations must be provided. If you specify one or the other, you should only include translations or rotations in your keyframe list. Must be specified at the time the keyframe list is provided.&lt;br /&gt;
*[[KFM_COMMAND]] followed by one of: [[KFM_CMD_STOP]], [[KFM_CMD_PLAY]], [[KFM_CMD_PAUSE]]. STOP will pause the animation AND reset it to the beginning. PAUSE will pause the animation without resetting. PLAY will resume a paused or stopped animation. &lt;br /&gt;
Note that if [[KFM_COMMAND]] is provided in the options list, it must be the only option in the list, and cannot be specified in the same function call that sets the keyframes list.&lt;br /&gt;
&lt;br /&gt;
Inter-region movement is supported; simply specify a target keyframe that would place the object outside the sim boundaries and it will cross over. This seems to provide the same effect as pausing the animation when it is in limbo between the two regions, but the viewer continues to interpolate its movement. It will jump back to the sim border and continue on the same speed, although the time between waypoints will be increased due to the sim crossing. Make sure you factor this into your system.&lt;br /&gt;
&lt;br /&gt;
Since keyframed motion is a prim property rather than restricted to the script that called it, you can use multiple scripts to control, pause, or restart the same keyframed motion without passing the original keyframe list provided. Just pass an empty list for keyframes list, and the [[KFM_COMMAND]] followed by the command in the options list.&lt;br /&gt;
|constants={{LSL Constants/KeyframedMotion|set|table=*}}&lt;br /&gt;
|caveats=&lt;br /&gt;
*This function does not work in attachments.&lt;br /&gt;
*This function can only be called on NON-physical objects. In the future it could be extended to support physical objects, but this is more complicated as collisions could prevent the object from reaching its goal positions on time.&lt;br /&gt;
*You cannot use scripts to move any prim in the linkset while the keyframed motion is active. If you must, first pause and restart it with [[KFM_CMD_PLAY]] when done. [[#Pause-Play|#Example]]&lt;br /&gt;
*Collisions with avatars affect the angular movement of the object and it may not reach the final rotation.&lt;br /&gt;
*This function can only be called on the root prim of a linkset.&lt;br /&gt;
*This function requires the linkset to use the Prim Equivalency system. However, it keyframed objects will not receive the dynamics penalty and can have a physics weight of up to 64.&lt;br /&gt;
*llSetKeyframedMotion is implemented in terms of frames and not real time. To avoid a drift from the expected positions and rotations, use times which are integer multiples of 1/45, e.g. 20.0/45.0, 40.0/45.0, 90.0/45.0, etc. [http://community.secondlife.com/t5/LSL-Scripting/llSetKeyframedMotion-turning-a-corner/td-p/1225219 Forum Thread]&lt;br /&gt;
**Natural drift can still occur; for best results use [[moving_end]] to determine when the animation has ended and confirm the target position with [[llSetPos]].  Or you can use [[at_target]] or [[at_rot_target]].&lt;br /&gt;
*There are a few bugs in the avatar animation system that may cause strange looking animations to play when standing on a moving platform (e.g., walking in place, feet-at-pelvis). We hope to fix these in the future, but doing so is out of scope for this feature.&lt;br /&gt;
*As with dynamic objects, objects moving using this function are paused when they are selected by an avatar with adequate permissions (object owner, passenger, etc). When such an avatar deselects the object, motion resumes, even if the object had been paused using [[KFM_CMD_PAUSE]].&lt;br /&gt;
*A Key Framed Motion is a &#039;&#039;&#039;prim property&#039;&#039;&#039; in some respect. When a [[KFM_LOOP]] or [[KFM_PING_PONG]] is initiated the &#039;&#039;&#039;the motion&#039;&#039;&#039; is &#039;&#039;&#039;preserved after the script is removed&#039;&#039;&#039;. I.E. The prim will continue what motion it had. It will not survive take and copy. It will survive server restart.&lt;br /&gt;
*Inter region movement is far from perfect. Crossing from sim 1 to sim 2 using a Key Frame list with numerous frames on a curved path will pick up conspicuous errors on the crossing and when reversed by [ [[KFM_MODE]], [[KFM_REVERSE]] ] the object will stay in sim 2 and never return to sim 1&lt;br /&gt;
|examples=&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
// If your client is not mesh-aware use the following line:&lt;br /&gt;
&lt;br /&gt;
llSetLinkPrimitiveParamsFast(LINK_THIS,&lt;br /&gt;
    [PRIM_PHYSICS_SHAPE_TYPE, PRIM_PHYSICS_SHAPE_CONVEX]);&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;
llSetKeyframedMotion(&lt;br /&gt;
    [&amp;lt;0.0, 0.0, 10.0&amp;gt;,  5,&lt;br /&gt;
        &amp;lt;0.0, 0.0, -10.0&amp;gt;,  5],&lt;br /&gt;
    [KFM_DATA, KFM_TRANSLATION, KFM_MODE, KFM_PING_PONG]);&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;
llSetKeyframedMotion(&lt;br /&gt;
    [&amp;lt;0.0, 0.0, 10.0&amp;gt;, llEuler2Rot(&amp;lt;90, 45, 180&amp;gt; * DEG_TO_RAD), 5,&lt;br /&gt;
        &amp;lt;0.0, 0.0, -10.0&amp;gt;, llEuler2Rot(&amp;lt;270, 225, 360&amp;gt; * DEG_TO_RAD), 5],&lt;br /&gt;
    [KFM_MODE, KFM_REVERSE]);&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
=== Pause-Play ===&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;llSetKeyframedMotion([],[KFM_COMMAND, KFM_CMD_PAUSE]);&lt;br /&gt;
//modify prim positions here&lt;br /&gt;
llSetKeyframedMotion([],[KFM_COMMAND, KFM_CMD_PLAY]);&amp;lt;/source&amp;gt;&lt;br /&gt;
===Sample Script - Key Framed Follower===&lt;br /&gt;
Under some circumstances, rotations will generate a run-time error unless they are normalized.  This script illustrates a way to use llKeyframedMotion to create a follower -- think, for example, of a cart behind a vehicle -- using normalized target rotation.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
integer isSensorRepeatOn;&lt;br /&gt;
&lt;br /&gt;
rotation NormRot(rotation Q)&lt;br /&gt;
{&lt;br /&gt;
    float MagQ = llSqrt(Q.x*Q.x + Q.y*Q.y +Q.z*Q.z + Q.s*Q.s);&lt;br /&gt;
&lt;br /&gt;
    return&lt;br /&gt;
        &amp;lt;Q.x/MagQ, Q.y/MagQ, Q.z/MagQ, Q.s/MagQ&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;
        llSetLinkPrimitiveParamsFast(LINK_ROOT,&lt;br /&gt;
                [PRIM_PHYSICS_SHAPE_TYPE, PRIM_PHYSICS_SHAPE_CONVEX,&lt;br /&gt;
            PRIM_LINK_TARGET, LINK_ALL_CHILDREN,&lt;br /&gt;
                PRIM_PHYSICS_SHAPE_TYPE, PRIM_PHYSICS_SHAPE_NONE]);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        isSensorRepeatOn = !isSensorRepeatOn;&lt;br /&gt;
&lt;br /&gt;
        if (isSensorRepeatOn)&lt;br /&gt;
        {&lt;br /&gt;
        //  PUBLIC_CHANNEL has the integer value 0&lt;br /&gt;
            llSay(PUBLIC_CHANNEL, &amp;quot;Sensor repeat switched on!&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
            llSensorRepeat(&amp;quot;&amp;quot;, &amp;quot;91b39b5b-13b1-2517-273a-67360b842c02&amp;quot;, SCRIPTED, 10.0, PI, 0.1);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
//      {&lt;br /&gt;
            llSensorRemove();&lt;br /&gt;
//      }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    sensor(integer num_detected)&lt;br /&gt;
    {&lt;br /&gt;
        vector ownPosition = llGetPos();&lt;br /&gt;
        rotation ownRotation = llGetRot();&lt;br /&gt;
        vector detectedPosition = llDetectedPos(0);&lt;br /&gt;
        rotation detectedRotation = llDetectedRot(0);&lt;br /&gt;
&lt;br /&gt;
        llSetKeyframedMotion(&lt;br /&gt;
            [(detectedPosition - ownPosition) + &amp;lt;-1.0, 0.0, 0.2&amp;gt;*detectedRotation,&lt;br /&gt;
            NormRot(detectedRotation/ownRotation), 0.12],&lt;br /&gt;
            []);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
===Universal Hinged Motion in 8 Key Frames===&lt;br /&gt;
The script will turn a box prim around one edge parallel to the prim&#039;s Y-axis&amp;lt;br&amp;gt;&lt;br /&gt;
The script will work for any prim orientation&amp;lt;br&amp;gt;&lt;br /&gt;
Note that the smallest accepted time per frame is 1/9S=0.11111111S and NOT 0.1S&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
float angleEnd=PI_BY_TWO;&lt;br /&gt;
float speed=0.2; // m/S&lt;br /&gt;
float steps=8.0; // number of Key Frames&lt;br /&gt;
float step=0.0;&lt;br /&gt;
list KFMlist=[];&lt;br /&gt;
vector V;&lt;br /&gt;
integer open=TRUE;&lt;br /&gt;
vector basePos;&lt;br /&gt;
rotation baseRot;&lt;br /&gt;
&lt;br /&gt;
float motion_time( float mt)&lt;br /&gt;
{&lt;br /&gt;
    mt = llRound(45.0*mt)/45.0;&lt;br /&gt;
    if ( mt &amp;gt; 0.11111111 ) return mt;&lt;br /&gt;
    else return 0.11111111;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSetMemoryLimit(0x2000);&lt;br /&gt;
        llSetPrimitiveParams([PRIM_PHYSICS_SHAPE_TYPE, PRIM_PHYSICS_SHAPE_CONVEX]);&lt;br /&gt;
        basePos = llGetPos();&lt;br /&gt;
        baseRot = llGetRot();&lt;br /&gt;
        vector v1 = 0.5*llGetScale()*llGetRot();&lt;br /&gt;
        rotation deltaRot = llEuler2Rot(&amp;lt; 0.0, angleEnd/steps, 0.0&amp;gt;);&lt;br /&gt;
        while ( step &amp;lt; steps )&lt;br /&gt;
        {&lt;br /&gt;
            V = v1*llAxisAngle2Rot(llRot2Left(llGetRot()), angleEnd*step/steps);&lt;br /&gt;
            V = v1*llAxisAngle2Rot(llRot2Left(llGetRot()), angleEnd*(step+1.0)/steps) - V;&lt;br /&gt;
            KFMlist += [V, deltaRot, motion_time(llVecMag(V)/speed)];&lt;br /&gt;
            step += 1.0;&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    touch_end( integer n)&lt;br /&gt;
    {&lt;br /&gt;
        llSetKeyframedMotion( [], []);&lt;br /&gt;
        if ( open )&lt;br /&gt;
        {&lt;br /&gt;
            llSetPrimitiveParams([PRIM_POSITION, basePos, PRIM_ROTATION, baseRot]);&lt;br /&gt;
            llSetKeyframedMotion( KFMlist, []);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            llSetKeyframedMotion( KFMlist, [KFM_MODE, KFM_REVERSE]);&lt;br /&gt;
        }&lt;br /&gt;
        open = !open;&lt;br /&gt;
    }&lt;br /&gt;
    on_rez( integer n) { llResetScript(); }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
After editing prim position, rotation and/or size the script should be reset in order to update the motion&lt;br /&gt;
===More Examples===&lt;br /&gt;
* [[User:Dora_Gustafson/Pendulum_motion|Simple Pendulum Motion in 24 Key Frames]], a good motion for a swing&lt;br /&gt;
* [[User:Dora_Gustafson/Harmonic_Oscillator_motion|Oscillator Motion in 12 Key Frames]]&lt;br /&gt;
|notes=&lt;br /&gt;
Potential Use Cases:&lt;br /&gt;
* Elevators&lt;br /&gt;
* Moving platforms&lt;br /&gt;
* Trains/Fixed-Track Vehicles&lt;br /&gt;
* Moving doors/walls/gates&lt;br /&gt;
* Windmills and other machines&lt;br /&gt;
Targeted coordinate systems: The Translation is in Global coordinates, the Rotation in Local coordinates&lt;br /&gt;
* Say: a move on the X-axis will move the object along the global, region X-axis no matter how the object is rotated&lt;br /&gt;
* Say: a rotate around the X-axis will rotate the object around it&#039;s local, prim X-axis no matter the object&#039;s rotation&lt;br /&gt;
* When the object is not rotated in the global system you won&#039;t notice the difference&lt;br /&gt;
|cat1=Physics&lt;br /&gt;
|cat2=Movement&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
|haiku={{Haiku|author={{User|Progenitor Resident}}|This is how they move,|Non-phys life for my critters|Smooth, no collisions.}}&lt;br /&gt;
|history = Date of Release  [[ Release_Notes/Second_Life_Server/11#11.11.09.244706 | 09/11/2011 ]]&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Lady Sumoku</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Category:LSL_Alpha&amp;diff=1194480</id>
		<title>Category:LSL Alpha</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Category:LSL_Alpha&amp;diff=1194480"/>
		<updated>2015-01-22T21:35:57Z</updated>

		<summary type="html">&lt;p&gt;Lady Sumoku: Replaced old &amp;lt;LSL&amp;gt; block with &amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header|ml=*}}&lt;br /&gt;
The term &amp;quot;Alpha&amp;quot; refers to how translucent an object (or, in this case, a prim) is. In Second Life, the alpha property is set by the scripting functions [[llSetAlpha]], [[llSetLinkAlpha]], [[llSetPrimitiveParams]], and [[llSetLinkPrimitiveParams]]. These functions use a [[float]] value. When set to &#039;&#039;&#039;0.0&#039;&#039;&#039;, the object/prim is fully transparent. When set to &#039;&#039;&#039;1.0&#039;&#039;&#039;, the object is opaque.&lt;br /&gt;
Sometimes, [[Resident]]s refer to a transparent [[texture]] as &#039;&#039;alpha texture&#039;&#039;. This is a texture with an alpha map, not to be confused with this prim property. See [[llSetTexture]] and [[TEXTURE_TRANSPARENT]] instead.&lt;br /&gt;
&lt;br /&gt;
==Build Mode== &lt;br /&gt;
In Build Mode, the alpha is represented by a percentage, ranging from &#039;&#039;&#039;0%&#039;&#039;&#039; to &#039;&#039;&#039;100%&#039;&#039;&#039;. Take extra care when moving viewer transparency settings to scripts and back. In the editor a higher number is more transparent, while in scripts a higher number is more visible.&lt;br /&gt;
&lt;br /&gt;
==Examples==&lt;br /&gt;
Below are examples on how one may set the alpha of an object. &lt;br /&gt;
{|cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;6&amp;quot; border=&amp;quot;1&amp;quot; style=&amp;quot;border: 1px solid #aaaaaa; margin: 1em 1em 1em 0pt; background-color: #F8F8FF; border-collapse: collapse&amp;quot;&lt;br /&gt;
!style=&amp;quot;background-color: #D2D3FF&amp;quot; | Function&lt;br /&gt;
!style=&amp;quot;background-color: #D2D3FF&amp;quot; | LSL Example &amp;amp; Description&lt;br /&gt;
|-&lt;br /&gt;
| [[llSetAlpha]]&lt;br /&gt;
| &amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;llSetAlpha(1.0, ALL_SIDES);&amp;lt;/source&amp;gt; This will set the object&#039;s sides&#039; alpha to opaque, or &#039;&#039;&#039;0%&#039;&#039;&#039;.&lt;br /&gt;
|-&lt;br /&gt;
| [[llSetLinkAlpha]]&lt;br /&gt;
| &amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;llSetLinkAlpha(LINK_SET, 0.0, ALL_SIDES);&amp;lt;/source&amp;gt;&lt;br /&gt;
This will set link-set&#039;s alpha to transparent, or &#039;&#039;&#039;100%&#039;&#039;&#039;.&lt;br /&gt;
|-&lt;br /&gt;
| [[llSetPrimitiveParams]]&lt;br /&gt;
| &amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;llSetPrimitiveParams([PRIM_COLOR, ALL_SIDES, llGetColor(ALL_SIDES), 0.5]);&lt;br /&gt;
// Using llGetColor this way may not give the desired result (it returns the average color)&amp;lt;/source&amp;gt;&lt;br /&gt;
This will set the object&#039;s alpha to translucent, or &#039;&#039;&#039;50%&#039;&#039;&#039;.&lt;br /&gt;
|-&lt;br /&gt;
| [[llSetLinkPrimitiveParams]]&lt;br /&gt;
| &amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;llSetLinkPrimitiveParams(LINK_SET, [PRIM_COLOR, ALL_SIDES, llGetColor(ALL_SIDES), 0.5]);&lt;br /&gt;
// Using llGetColor this way may not give the desired result (it returns the average color).&amp;lt;/source&amp;gt;&lt;br /&gt;
This will set the link-set&#039;s alpha to translucent, or &#039;&#039;&#039;50%&#039;&#039;&#039;.&lt;br /&gt;
|-&lt;br /&gt;
| [[llSetLinkPrimitiveParamsFast]]&lt;br /&gt;
| &amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;llSetLinkPrimitiveParamsFast(LINK_SET, [PRIM_COLOR, ALL_SIDES, llGetColor(ALL_SIDES), 0.5]);&lt;br /&gt;
// Using llGetColor this way may not give the desired result (it returns the average color).&amp;lt;/source&amp;gt;&lt;br /&gt;
This will set the link-set&#039;s alpha to translucent, or &#039;&#039;&#039;50%&#039;&#039;&#039;.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{{LSLC|}}{{LSLC|Face|*Alpha}}&lt;/div&gt;</summary>
		<author><name>Lady Sumoku</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlSetLinkAlpha&amp;diff=1194476</id>
		<title>LlSetLinkAlpha</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlSetLinkAlpha&amp;diff=1194476"/>
		<updated>2015-01-22T21:34:10Z</updated>

		<summary type="html">&lt;p&gt;Lady Sumoku: Replaced old &amp;lt;LSL&amp;gt; block with &amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function&lt;br /&gt;
|inject-2={{LSL Function/face|face|}}{{LSL Function/link|link|}}{{LSL_Function/alpha|alpha}}&lt;br /&gt;
|func_id=274|func_sleep=0.0|func_energy=10.0&lt;br /&gt;
|func=llSetLinkAlpha&lt;br /&gt;
|p1_type=integer|p1_subtype=link|p1_name=link&lt;br /&gt;
|p2_type=float|p2_name=alpha&lt;br /&gt;
|p3_type=integer|p3_name=face&lt;br /&gt;
|func_footnote&lt;br /&gt;
|func_desc=If a prim exists in the link set at {{LSLP|link}}, set {{LSLP|alpha}} on {{LSLP|face}} of that prim.&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;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
// Make the entire object disappear for 5 seconds&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    touch_start(integer num_detected)&lt;br /&gt;
    {&lt;br /&gt;
        // transparent&lt;br /&gt;
        llSetLinkAlpha(LINK_SET, 0.0, ALL_SIDES);&lt;br /&gt;
        llSetTimerEvent(5.0);&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    timer()&lt;br /&gt;
    {&lt;br /&gt;
        // opaque&lt;br /&gt;
        llSetLinkAlpha(LINK_SET, 1.0, ALL_SIDES);&lt;br /&gt;
        llSetTimerEvent(0.0);&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;
// when the object is touched,&lt;br /&gt;
// fade it out and back in again&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    touch_start(integer num_detected)&lt;br /&gt;
    {&lt;br /&gt;
        // fade out&lt;br /&gt;
        float alpha = 1.0;&lt;br /&gt;
        while (alpha &amp;gt;= 0.0)&lt;br /&gt;
        {&lt;br /&gt;
            llSetLinkAlpha(LINK_SET, alpha, ALL_SIDES);&lt;br /&gt;
            alpha -= 0.001;&lt;br /&gt;
        }&lt;br /&gt;
&lt;br /&gt;
        // fade in&lt;br /&gt;
        while (alpha &amp;lt; 1.0)&lt;br /&gt;
        {&lt;br /&gt;
            alpha += 0.001;&lt;br /&gt;
            llSetLinkAlpha(LINK_SET, alpha, ALL_SIDES);&lt;br /&gt;
        }&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;
// Makes selected prims in a linkset become transparent or visible on chat command. Give each prim a unique name.&lt;br /&gt;
&lt;br /&gt;
list PrimList = [&amp;quot;ALL&amp;quot;];&lt;br /&gt;
// Start our prim list with a dummy entry, so that the index into this list will correspond directly to the link number&lt;br /&gt;
// By making the dummy entry &#039;ALL&#039; we provide a match for that option too&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_LINK)&lt;br /&gt;
	    llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
	integer PrimCount = llGetNumberOfPrims();&lt;br /&gt;
	llListen(37, &amp;quot;&amp;quot;, NULL_KEY, &amp;quot;&amp;quot;);  		    //  listen to chat commands from anyone on channel 37&lt;br /&gt;
	integer i;&lt;br /&gt;
	for (i = 1; i &amp;lt;= PrimCount; ++i)&lt;br /&gt;
	    PrimList += llToUpper(llGetLinkName(i) );  	    // Build a list of upper-case link names, where list position equals link number&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    listen(integer channel, string name, key id, string msg)&lt;br /&gt;
    {&lt;br /&gt;
	list    TempList = llCSV2List( llToUpper(msg) );    // make a list from upper-case version of user command line&lt;br /&gt;
	integer ListLen  = llGetListLength (TempList);&lt;br /&gt;
	integer alpha    = (llList2String(TempList, 0) == &amp;quot;SHOW&amp;quot;);&lt;br /&gt;
	// &#039;SHOW&#039; sets selected prims visible, otherwise set them transparent&lt;br /&gt;
	// e.g.  HIDE,PLATE,SPOON,NAPKIN	            &amp;lt;---- makes named prims invisible&lt;br /&gt;
	// e.g.  SHOW,ALL                                   &amp;lt;---- makes all prims visible&lt;br /&gt;
&lt;br /&gt;
	integer i;&lt;br /&gt;
	for (i = 1; i &amp;lt; ListLen; ++i)&lt;br /&gt;
	{&lt;br /&gt;
	    string  ThisPrim   = llStringTrim(llList2String(TempList, i), STRING_TRIM);&lt;br /&gt;
	    integer LinkNumber = llListFindList(PrimList, [ThisPrim]);&lt;br /&gt;
	    if (~LinkNumber)    // i.e. if LinkNumber != -1&lt;br /&gt;
	    {&lt;br /&gt;
		if (!LinkNumber)&lt;br /&gt;
		    LinkNumber = LINK_SET;   	// list position 0 is &#039;ALL&#039;&lt;br /&gt;
&lt;br /&gt;
		llSetLinkAlpha(LinkNumber, alpha, ALL_SIDES);&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||[[llGetAlpha]]|Gets the prim&#039;s alpha}}&lt;br /&gt;
{{LSL DefineRow||[[llSetAlpha]]|Sets the prim&#039;s alpha}}&lt;br /&gt;
{{LSL DefineRow||[[llGetColor]]|Gets the prim&#039;s color}}&lt;br /&gt;
{{LSL DefineRow||[[llSetColor]]|Sets the prim&#039;s color}}&lt;br /&gt;
{{LSL DefineRow||[[llSetLinkColor]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llSetLinkTexture]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llSetLinkPrimitiveParams]]|}}&lt;br /&gt;
|also_tests&lt;br /&gt;
|also_events={{LSL DefineRow||[[changed]]|[[CHANGED_COLOR]]}}&lt;br /&gt;
|also_articles&lt;br /&gt;
|notes&lt;br /&gt;
|deprecated&lt;br /&gt;
|cat1=Link/Set&lt;br /&gt;
|cat2&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Lady Sumoku</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlSetLinkColor&amp;diff=1194472</id>
		<title>LlSetLinkColor</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlSetLinkColor&amp;diff=1194472"/>
		<updated>2015-01-22T21:32:12Z</updated>

		<summary type="html">&lt;p&gt;Lady Sumoku: Replaced old &amp;lt;LSL&amp;gt; block with &amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function&lt;br /&gt;
|inject-2={{LSL Function/color|color}}{{LSL_Function/link-face|link|face}}&lt;br /&gt;
|func_id=140|func_sleep=0.0|func_energy=10.0&lt;br /&gt;
|func=llSetLinkColor&lt;br /&gt;
|p1_type=integer|p1_subtype=link|p1_name=link&lt;br /&gt;
|p2_type=vector|p2_name=color&lt;br /&gt;
|p3_type=integer|p3_name=face&lt;br /&gt;
|func_footnote&lt;br /&gt;
|func_desc=If a prim exists in the link set at {{LSLP|link}}, set {{LSLP|color}} on {{LSLP|face}} of that prim.&lt;br /&gt;
|return_text&lt;br /&gt;
|spec&lt;br /&gt;
|caveats&lt;br /&gt;
|constants&lt;br /&gt;
|examples=Turn a link set green&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    touch_start(integer detected)&lt;br /&gt;
    {&lt;br /&gt;
        llSetLinkColor(LINK_SET, &amp;lt;0.0, 1.0, 0.0&amp;gt;, ALL_SIDES);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|helpers=&lt;br /&gt;
{{{!}} class=&amp;quot;sortable&amp;quot; {{Prettytable}}&lt;br /&gt;
{{!}}- {{Hl2}}&lt;br /&gt;
! Color&lt;br /&gt;
! Hexadecimal code&lt;br /&gt;
! LSL color representations&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} style=&amp;quot;color: white; background: #001f3f&amp;quot; {{!}}NAVY&lt;br /&gt;
{{!}} #001f3f&lt;br /&gt;
{{!}}&amp;lt;code&amp;gt;&amp;lt;0.000, 0.122, 0.247&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} style=&amp;quot;background: #0074d9&amp;quot; {{!}}BLUE&lt;br /&gt;
{{!}} #0074d9&lt;br /&gt;
{{!}}&amp;lt;code&amp;gt;&amp;lt;0.000, 0.455, 0.851&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} style=&amp;quot;background: #7fdbff&amp;quot; {{!}}AQUA&lt;br /&gt;
{{!}} #7fdbff&lt;br /&gt;
{{!}}&amp;lt;code&amp;gt;&amp;lt;0.498, 0.859, 1.000&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} style=&amp;quot;background: #39cccc&amp;quot; {{!}}TEAL&lt;br /&gt;
{{!}} #39cccc&lt;br /&gt;
{{!}}&amp;lt;code&amp;gt;&amp;lt;0.224, 0.800, 0.800&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} style=&amp;quot;background: #3d9970&amp;quot; {{!}}OLIVE&lt;br /&gt;
{{!}} #3d9970&lt;br /&gt;
{{!}}&amp;lt;code&amp;gt;&amp;lt;0.239, 0.600, 0.439&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} style=&amp;quot;background: #2ecc40&amp;quot; {{!}}GREEN&lt;br /&gt;
{{!}} #2ecc40&lt;br /&gt;
{{!}}&amp;lt;code&amp;gt;&amp;lt;0.180, 0.800, 0.251&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} style=&amp;quot;background: #01ff70&amp;quot; {{!}}LIME&lt;br /&gt;
{{!}} #01ff70&lt;br /&gt;
{{!}}&amp;lt;code&amp;gt;&amp;lt;0.004, 1.000, 0.439&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} style=&amp;quot;background: #ffdc00&amp;quot; {{!}}YELLOW&lt;br /&gt;
{{!}} #ffdc00&lt;br /&gt;
{{!}}&amp;lt;code&amp;gt;&amp;lt;1.000, 0.863, 0.000&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} style=&amp;quot;background: #ff851b&amp;quot; {{!}}ORANGE&lt;br /&gt;
{{!}} #ff851b&lt;br /&gt;
{{!}}&amp;lt;code&amp;gt;&amp;lt;1.000, 0.522, 0.106&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} style=&amp;quot;background: #ff4136&amp;quot; {{!}}RED&lt;br /&gt;
{{!}} #ff4136&lt;br /&gt;
{{!}}&amp;lt;code&amp;gt;&amp;lt;1.000, 0.255, 0.212&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} style=&amp;quot;color: white; background: #85144b&amp;quot; {{!}}MAROON&lt;br /&gt;
{{!}} #85144b&lt;br /&gt;
{{!}}&amp;lt;code&amp;gt;&amp;lt;0.522, 0.078, 0.294&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} style=&amp;quot;background: #f012be&amp;quot; {{!}}FUCHSIA&lt;br /&gt;
{{!}} #f012be&lt;br /&gt;
{{!}}&amp;lt;code&amp;gt;&amp;lt;0.941, 0.071, 0.745&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} style=&amp;quot;color: white; background: #b10dc9&amp;quot; {{!}}PURPLE&lt;br /&gt;
{{!}} #b10dc9&lt;br /&gt;
{{!}}&amp;lt;code&amp;gt;&amp;lt;0.694, 0.051, 0.788&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} style=&amp;quot;background: #ffffff&amp;quot; {{!}}WHITE&lt;br /&gt;
{{!}} #ffffff&lt;br /&gt;
{{!}}&amp;lt;code&amp;gt;&amp;lt;1.000, 1.000, 1.000&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} style=&amp;quot;background: #dddddd&amp;quot; {{!}}SILVER&lt;br /&gt;
{{!}} #dddddd&lt;br /&gt;
{{!}}&amp;lt;code&amp;gt;&amp;lt;0.867, 0.867, 0.867&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} style=&amp;quot;background: #aaaaaa&amp;quot; {{!}}GRAY&lt;br /&gt;
{{!}} #aaaaaa&lt;br /&gt;
{{!}}&amp;lt;code&amp;gt;&amp;lt;0.667, 0.667, 0.667&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} style=&amp;quot;color: white; background: #111111&amp;quot; {{!}}BLACK&lt;br /&gt;
{{!}} #111111&lt;br /&gt;
{{!}}&amp;lt;code&amp;gt;&amp;lt;0.067, 0.067, 0.067&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
{{!}}}&lt;br /&gt;
|also_functions=&lt;br /&gt;
{{LSL DefineRow||[[llGetAlpha]]|Gets the prim&#039;s alpha}}&lt;br /&gt;
{{LSL DefineRow||[[llSetAlpha]]|Sets the prim&#039;s alpha}}&lt;br /&gt;
{{LSL DefineRow||[[llGetColor]]|Gets the prim&#039;s color}}&lt;br /&gt;
{{LSL DefineRow||[[llSetColor]]|Sets the prim&#039;s color}}&lt;br /&gt;
{{LSL DefineRow||[[llSetLinkAlpha]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llSetLinkTexture]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llSetLinkPrimitiveParams]]|}}&lt;br /&gt;
|also_tests&lt;br /&gt;
|also_events={{LSL DefineRow||[[changed]]|[[CHANGED_COLOR]]}}&lt;br /&gt;
|also_articles=&lt;br /&gt;
{{LSL DefineRow||[[Color and Scripting]]}}&lt;br /&gt;
|notes&lt;br /&gt;
|deprecated&lt;br /&gt;
|cat1=Link/Set&lt;br /&gt;
|cat2&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Lady Sumoku</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlSetLinkMedia&amp;diff=1194471</id>
		<title>LlSetLinkMedia</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlSetLinkMedia&amp;diff=1194471"/>
		<updated>2015-01-22T21:31:07Z</updated>

		<summary type="html">&lt;p&gt;Lady Sumoku: Replaced old &amp;lt;LSL&amp;gt; block with &amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function&lt;br /&gt;
|inject-2={{LSL_Function/face|face|notall=*}}{{LSL_Function/link|link|nogroup=*}}{{Issues/SVC-7422}}&lt;br /&gt;
|func_id=?|func_sleep=0.0|func_energy=0.0|mode&lt;br /&gt;
|func=llSetLinkMedia|return_type=integer|return_subtype=status&lt;br /&gt;
|p1_type=integer|p1_subtype=link|p1_name=link|p1_desc&lt;br /&gt;
|p2_type=integer|p2_name=face|p2_desc&lt;br /&gt;
|p3_type=list|p3_subtype=instructions|p3_name=params|p3_desc=a set of name/value pairs (in no particular order)&lt;br /&gt;
|func_footnote=&lt;br /&gt;
|func_desc=Set the media {{LSLP|params}} for a particular {{LSLP|face}} on the {{LSLP|link}}ed prim(s) without a delay.&lt;br /&gt;
|return_text=that is a STATUS_* flag which details the success/failure of the operation(s).&lt;br /&gt;
|spec=&lt;br /&gt;
|caveats=*If prim-media is not already on this object, add it.&lt;br /&gt;
*Params not specified are unchanged, or if new media is added set to the default specified.&lt;br /&gt;
* Both width and height must be specified together to work, and they narrow the texture space while inversely widening the aperture.&lt;br /&gt;
** width and height scaled larger than 1024pixels will require the texture backdrop to be resized to fit(see [[#Useful_Snippets|Useful Snippets]])&lt;br /&gt;
*** if resized to fit, the resulting view will cut off scrolled content outside the bounds making it impossible to be viewed&lt;br /&gt;
|constants={{LSL Constants/ReturnStatus|table=*|sortable=*}}{{LSL Constants/PrimMedia|set}}&lt;br /&gt;
|examples&lt;br /&gt;
|helpers=&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;//-- expand media textures greater than 1024 pixel in a direction to fit the media face&lt;br /&gt;
//-- does exactly what the &amp;quot;align&amp;quot; button does in the edit window&lt;br /&gt;
//-- original by Edelman Linden (or Kate Linden), tweaked by Void Singer&lt;br /&gt;
uExpandMediaTexture( integer vIntWidth, integer vIntHeight, integer vIntFace ){&lt;br /&gt;
    integer vIntTemp;&lt;br /&gt;
    vector  vSizScale;&lt;br /&gt;
&lt;br /&gt;
    while (vIntWidth &amp;gt;&amp;gt; ++vIntTemp);&lt;br /&gt;
    vSizScale.x = vIntWidth / (float)(1 &amp;lt;&amp;lt; vIntTemp);&lt;br /&gt;
    vIntTemp = 0;&lt;br /&gt;
    while (vIntHeight &amp;gt;&amp;gt; ++vIntTemp);&lt;br /&gt;
    vSizScale.y = vIntHeight / (float)(1 &amp;lt;&amp;lt; vIntTemp);&lt;br /&gt;
    llSetLinkPrimitiveParamsFast( LINK_THIS,&lt;br /&gt;
                                  [PRIM_TEXTURE, vIntFace] +&lt;br /&gt;
                                  llListReplaceList( llGetLinkPrimitiveParams(LINK_THIS, [PRIM_TEXTURE, vIntFace] ),&lt;br /&gt;
                                                    [vSizScale, ((vSizScale - &amp;lt;1.0, 1.0, 0.0&amp;gt;) / 2.0)],&lt;br /&gt;
                                                    1,&lt;br /&gt;
                                                    2 ) );&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
|also_functions=&lt;br /&gt;
{{LSL DefineRow||[[llSetPrimMediaParams]]}}&lt;br /&gt;
{{LSL DefineRow||[[llGetLinkMedia]]}}&lt;br /&gt;
{{LSL DefineRow||[[llClearLinkMedia]]}}&lt;br /&gt;
|also_tests&lt;br /&gt;
|also_events=&lt;br /&gt;
|also_articles=*[[User:Kelly Linden/lsl hacks]]&lt;br /&gt;
|notes&lt;br /&gt;
|deepnotes&lt;br /&gt;
|history = Date of Release  [[ Release_Notes/Second_Life_Server/11#11.08.10.238207 | 10/08/2011 ]]&lt;br /&gt;
|cat1=Prim Media&lt;br /&gt;
|cat2=Media&lt;br /&gt;
|cat3=Link/Set&lt;br /&gt;
|cat4&lt;br /&gt;
}}&lt;br /&gt;
[[Category:Shared Media]]&lt;/div&gt;</summary>
		<author><name>Lady Sumoku</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlSetLinkTexture&amp;diff=1194468</id>
		<title>LlSetLinkTexture</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlSetLinkTexture&amp;diff=1194468"/>
		<updated>2015-01-22T21:29:59Z</updated>

		<summary type="html">&lt;p&gt;Lady Sumoku: Replaced old &amp;lt;LSL&amp;gt; block with &amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function&lt;br /&gt;
|inject-1={{Issues/SVC-1500}}{{Issues/SVC-3199}}{{Issues/SVC-914}}&lt;br /&gt;
{{LSL Function/inventory|texture|uuid=true|type=texture|full=*}}{{LSL Function/link-face|link|face}}&lt;br /&gt;
|func_id=329|func_sleep=0.2|func_energy=10.0&lt;br /&gt;
|func=llSetLinkTexture&lt;br /&gt;
|p1_type=integer|p1_name=link&lt;br /&gt;
|p2_type=string|p2_name=texture&lt;br /&gt;
|p3_type=integer|p3_name=face&lt;br /&gt;
|func_footnote&lt;br /&gt;
|func_desc=If a prim exists in the link set at {{LSLP|link}}, set {{LSLP|texture}} on {{LSLP|face}} of that prim.&lt;br /&gt;
|return_text&lt;br /&gt;
|spec&lt;br /&gt;
|sort=SetLinkTexture&lt;br /&gt;
|caveats&lt;br /&gt;
|constants&lt;br /&gt;
|examples=Cover a link set in the texture &amp;quot;bark&amp;quot; (from the library)&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    touch_start(integer detected)&lt;br /&gt;
    {&lt;br /&gt;
        llSetLinkTexture(LINK_SET, &amp;quot;66bf4030-04f9-a808-43ab-b48b6aeb6456&amp;quot;, ALL_SIDES);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|helpers= ===SetLinkTextureFast===&lt;br /&gt;
This function doesn&#039;t have the 0.2 second delay. It&#039;s not very fast anyway though, but faster than &#039;&#039;&#039;llSetLinkTexture&#039;&#039;&#039;.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
SetLinkTextureFast(integer link, string texture, integer face)&lt;br /&gt;
{&lt;br /&gt;
    // Obtain the current texture parameters and replace the texture only.&lt;br /&gt;
    // If we are going to apply the texture to ALL_SIDES, we need&lt;br /&gt;
    // to adjust the returned parameters in a loop, so that each face&lt;br /&gt;
    // keeps its current repeats, offsets and rotation.&lt;br /&gt;
    list Params = llGetLinkPrimitiveParams(link, [PRIM_TEXTURE, face]);&lt;br /&gt;
    integer idx;&lt;br /&gt;
    face *= face &amp;gt; 0; // Make it zero if it was ALL_SIDES&lt;br /&gt;
    // This part is tricky. The list returned by llGLPP has a 4 element stride&lt;br /&gt;
    // (texture, repeats, offsets, angle). But as we modify it, we add two&lt;br /&gt;
    // elements to each, so the completed part of the list has 6 elements per&lt;br /&gt;
    // stride.&lt;br /&gt;
    integer NumSides = llGetListLength(Params) / 4; // At this point, 4 elements per stride&lt;br /&gt;
    for (idx = 0; idx &amp;lt; NumSides; ++idx)&lt;br /&gt;
    {&lt;br /&gt;
        // The part we&#039;ve completed has 6 elements per stride, thus the *6.&lt;br /&gt;
        Params = llListReplaceList(Params, [PRIM_TEXTURE, face++, texture], idx*6, idx*6);&lt;br /&gt;
    }&lt;br /&gt;
    llSetLinkPrimitiveParamsFast(link, Params);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|also_functions=&lt;br /&gt;
{{LSL DefineRow||[[llSetLinkAlpha]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llSetLinkColor]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llSetLinkPrimitiveParams]]|}}&lt;br /&gt;
|also_tests&lt;br /&gt;
|also_events&lt;br /&gt;
|also_articles&lt;br /&gt;
|notes&lt;br /&gt;
|deprecated&lt;br /&gt;
|cat1=Texture&lt;br /&gt;
|cat2=Link/Set&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
|history =&lt;br /&gt;
*Date of release [[ Release_Notes/Second_Life_Release/1.13#Release_Notes_for_Second_Life_1.13.4.281.29_February_21.2C_2007 | 21-02-2007 ]]&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Lady Sumoku</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlSetLinkTextureAnim&amp;diff=1194465</id>
		<title>LlSetLinkTextureAnim</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlSetLinkTextureAnim&amp;diff=1194465"/>
		<updated>2015-01-22T21:28:41Z</updated>

		<summary type="html">&lt;p&gt;Lady Sumoku: Replaced old &amp;lt;LSL&amp;gt; block with &amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function&lt;br /&gt;
|inject-2=&lt;br /&gt;
{{LSL_Function/link|link}}&lt;br /&gt;
{{LSL_Function/face|face}}&lt;br /&gt;
{{Issues/SVC-3925}}&lt;br /&gt;
{{Issues/SVC-1242}}&lt;br /&gt;
{{Issues/VWR-4018}}&lt;br /&gt;
|inject-3=&lt;br /&gt;
{{LSL_Function/negative index|true|start|length={{LSLPT|length}}}}&lt;br /&gt;
|func_id=356&lt;br /&gt;
|func_sleep=0.0&lt;br /&gt;
|func_energy=10.0&lt;br /&gt;
|sort=SetLinkTextureAnim&lt;br /&gt;
|func=llSetLinkTextureAnim&lt;br /&gt;
|p1_type=integer|p1_subtype=link|p1_name=link|p1_desc=to effect|p1_hover=to effect&lt;br /&gt;
|p2_type=integer|p2_subtype=bit_field|p2_name=mode|p2_desc=bit field of Mode flags&lt;br /&gt;
|p3_type=integer|p3_name=face&lt;br /&gt;
|p4_type=integer|p4_name=sizex|p4_desc=horizontal frames (ignored for [[ROTATE]] and [[SCALE]])&lt;br /&gt;
|p5_type=integer|p5_name=sizey|p5_desc=vertical frames (ignored for [[ROTATE]] and [[SCALE]])&lt;br /&gt;
|p6_type=float|p6_name=start|p6_desc=Start position/frame number (or radians for [[ROTATE]])&lt;br /&gt;
|p7_type=float|p7_name=length|p7_desc=number of frames to display (or radians for [[ROTATE]])&lt;br /&gt;
|p8_type=float|p8_name=rate|p8_desc=frames per second (must not be zero)&lt;br /&gt;
|func_footnote=Frames are numbered from left to right, top to bottom, starting at 0.&amp;lt;br/&amp;gt;If {{LSLP|rate}} is negative, it has the same effect as using the [[REVERSE]] flag.{{Footnote|Though if {{LSLP|rate}} is negative and the [[REVERSE]] flag is used, they cancel each other out.|Though if rate is negative and the REVERSE flag is used, they cancel each other out.}}&lt;br /&gt;
|func_desc=Animate the texture on the specified face/faces of the specified prim/prims by setting the texture scale and offset.  Identical to [[llSetTextureAnim]] except able to modify any prim in the link set.&lt;br /&gt;
|return_text&lt;br /&gt;
|spec=&lt;br /&gt;
===Frames===&lt;br /&gt;
Frames are sub-rectangles within the texture. A set of frames with 2 horizontal ({{LSLP|sizex}}) and 3 vertical ({{LSLP|sizey}}) means the overall texture is divided into 3 rows of 2 columns of images, each of which is a frame. llSetLinkTextureAnim will animate across these 6 starting with the top left image and going across and down, optionally repeating. If [[SMOOTH]] is set the frames slide smoothly from one to the next, if off, each frame is displayed in turn centered on the face.&lt;br /&gt;
|caveats=*You can only have one texture animation on a prim&lt;br /&gt;
**Calling llSetLinkTextureAnim more than once on a prim will reset it.&lt;br /&gt;
**Calling llSetLinkTextureAnim again with exact same values will not reset animation (a small difference in rate will suffice).&lt;br /&gt;
*You cannot combine [[ROTATE]] and [[SCALE]] flags.&lt;br /&gt;
*{{LSLP|sizex}} &amp;amp; {{LSLP|sizey}} are both limited to a range of 0 to 255&lt;br /&gt;
*llSetLinkTextureAnim, when on, shows the texture with 1 repeat in X and Y and 0 rotation and offset.&lt;br /&gt;
*Selecting and un-selecting a prim with animation will reset animation from beginning.&lt;br /&gt;
|constants={{{!}} class=&amp;quot;sortable collapsible&amp;quot; {{Prettytable|style=margin-top:0;}}&lt;br /&gt;
{{!}}-{{Hl2}}&lt;br /&gt;
! Modes&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;
{{!}}[[ANIM_ON]]&lt;br /&gt;
{{!}}{{LSL Hex||1|chars=2}}&lt;br /&gt;
{{!}}Texture animation is on. This must be set to start the animation, cleared to stop it.&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}}[[LOOP]]&lt;br /&gt;
{{!}}{{LSL Hex||2|chars=2}}&lt;br /&gt;
{{!}}Loop the texture animation.&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}}[[REVERSE]]&lt;br /&gt;
{{!}}{{LSL Hex||4|chars=2}}&lt;br /&gt;
{{!}}Play animation in reverse direction.&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}}[[PING_PONG]]&lt;br /&gt;
{{!}}{{LSL Hex||8|chars=2}}&lt;br /&gt;
{{!}}Play animation going forwards, then backwards.&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}}[[SMOOTH]]&lt;br /&gt;
{{!}}{{LSL Hex||16|chars=2}}&lt;br /&gt;
{{!}}Slide in the X direction, instead of playing separate frames.&amp;lt;br/&amp;gt;In both [[SCALE]] and [[ROTATE]] modes, causes smooth transitions.&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}}[[ROTATE]]&lt;br /&gt;
{{!}}{{LSL Hex||32|chars=2}}&lt;br /&gt;
{{!}}Animate texture rotation.&amp;lt;br&amp;gt;Does not work with [[SCALE]]&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}}[[SCALE]]&lt;br /&gt;
{{!}}{{LSL Hex||64|chars=2}}&lt;br /&gt;
{{!}}Animate the texture scale.&amp;lt;br&amp;gt;Does not work with [[ROTATE]]&lt;br /&gt;
{{!}}}&lt;br /&gt;
|examples=&lt;br /&gt;
This slides a texture smoothly, along the horizontal U-axis, and loops it when it gets to the end. Note - the texture&#039;s rotation for each side affects the apparent motion.  So if the texture is rotated 90 degrees by use of the edit box, the texture may not flow in the direction expected.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;llSetLinkTextureAnim(LINK_THIS, ANIM_ON | SMOOTH | LOOP , ALL_SIDES, 1, 1, 1, 1, 1);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This slides a texture smoothly, along the horizontal U-axis, in the opposite direction&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;llSetLinkTextureAnim(LINK_THIS, ANIM_ON | SMOOTH | LOOP , ALL_SIDES, 1, 1, 1, 1, -1);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This divides a texture into 64 &amp;quot;cells&amp;quot;, 8 across, and 8 down, and flips through them, left to right, top to bottom. This is useful for cell animation.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;llSetLinkTextureAnim(LINK_THIS, ANIM_ON | LOOP, ALL_SIDES, 8, 8, 0, 64, 6.4 );&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This rotates a texture counter-clockwise at 2 revolutions per second. Change the last value to -2*TWO_PI to rotate clockwise.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;llSetLinkTextureAnim(LINK_THIS, ANIM_ON | SMOOTH | ROTATE | LOOP, ALL_SIDES,1,1,0, TWO_PI, 2*TWO_PI);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This scales a texture larger and smaller.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;llSetLinkTextureAnim(LINK_THIS, ANIM_ON | SMOOTH | SCALE | PING_PONG | LOOP, ALL_SIDES, 1, 1, 1, 3, 2);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This turns off all texture animations&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;llSetLinkTextureAnim(LINK_THIS, FALSE, ALL_SIDES, 0, 0, 0.0, 0.0, 1.0);&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|helpers&lt;br /&gt;
|also_functions=&lt;br /&gt;
{{LSL DefineRow||[[llSetTextureAnim]]|Set texture animation for the prim the script is on.}}&lt;br /&gt;
|also_events&lt;br /&gt;
|also_articles&lt;br /&gt;
|notes=&lt;br /&gt;
Texture animation is a property of the prim (i.e., you can remove the script that started the animation, and the prim will remember the settings anyway.) Note, though, that as of Jan 2009, texture animation is still one of the prim properties that are lost when using the rezzed in world copy method of shift-drag. Originally brought up in {{Jira|VWR-640}}, it got its own issue in [[#SVC-3925|SVC-3925]]&lt;br /&gt;
&lt;br /&gt;
An online-tool for rough and ready conversion of moving gifs to animated textures is here: http://www.peregrinesalon.com/anim/ (link valid as of Jan 2009.)&lt;br /&gt;
|cat1=Media&lt;br /&gt;
|cat2=Effects&lt;br /&gt;
|cat3=Texture&lt;br /&gt;
|cat4=Video&lt;br /&gt;
|cat5&lt;br /&gt;
|cat6&lt;br /&gt;
|history= *Date of release [[ Release_Notes/Second_Life_Server/1.38#New_Features | 29-03-2010 ]]&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Lady Sumoku</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlSetLocalRot&amp;diff=1194461</id>
		<title>LlSetLocalRot</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlSetLocalRot&amp;diff=1194461"/>
		<updated>2015-01-22T21:26:13Z</updated>

		<summary type="html">&lt;p&gt;Lady Sumoku: Replaced old &amp;lt;LSL&amp;gt; block with &amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Function&lt;br /&gt;
|func_id=284|func_sleep=0.2|func_energy=10.0&lt;br /&gt;
|func=llSetLocalRot&lt;br /&gt;
|p1_type=rotation|p1_name=rot|p1_desc&lt;br /&gt;
|func_desc=Sets the rotation of a child prim relative to the root prim&lt;br /&gt;
|return_text&lt;br /&gt;
|spec&lt;br /&gt;
|caveats&lt;br /&gt;
|constants&lt;br /&gt;
|examples=Drop this script in a prim* to rotate it in 1 degree increments. *This prim must be attached as child of a root prim.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;rotation rot_xyzq;&lt;br /&gt;
 &lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        vector xyz_angles = &amp;lt;0,1.0,0&amp;gt;; // This is to define a 1 degree change&lt;br /&gt;
        vector angles_in_radians = xyz_angles*DEG_TO_RAD; // Change to Radians&lt;br /&gt;
        rot_xyzq = llEuler2Rot(angles_in_radians); // Change to a Rotation&lt;br /&gt;
    }&lt;br /&gt;
 &lt;br /&gt;
    touch_start(integer s)&lt;br /&gt;
    {&lt;br /&gt;
        llSetLocalRot(llGetLocalRot()*rot_xyzq); //Do the Rotation...&lt;br /&gt;
 &lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
|helpers=&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;//-- this is an equivalent call from any prim in the same link set&lt;br /&gt;
llSetLinkPrimitiveParamsFast( target_prim, [PRIM_ROT_LOCAL, rot] );&lt;br /&gt;
//-- where &amp;quot;target_prim&amp;quot; is the link number of the prim you want to set the local rotation of&amp;lt;/source&amp;gt;&lt;br /&gt;
|also_functions=&lt;br /&gt;
{{LSL DefineRow||[[llGetRot]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llGetLocalRot]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llGetRootRotation]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llGetPrimitiveParams]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llGetLinkPrimitiveParams]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llSetRot]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llSetPrimitiveParams]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llSetLinkPrimitiveParams]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llSetLinkPrimitiveParamsFast]]|}}&lt;br /&gt;
|also_tests&lt;br /&gt;
|also_events&lt;br /&gt;
|also_articles&lt;br /&gt;
|notes&lt;br /&gt;
|cat1=Movement&lt;br /&gt;
|cat2=Rotation&lt;br /&gt;
|haiku={{Haiku|Carousel horses|Race, ever facing forward.|Turn without turning.}}&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Lady Sumoku</name></author>
	</entry>
</feed>