<?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=MoiraAtropos+Resident</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=MoiraAtropos+Resident"/>
	<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/wiki/Special:Contributions/MoiraAtropos_Resident"/>
	<updated>2026-06-23T11:38:22Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Widget_talk:YouTube&amp;diff=1216897</id>
		<title>Widget talk:YouTube</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Widget_talk:YouTube&amp;diff=1216897"/>
		<updated>2024-07-04T13:07:14Z</updated>

		<summary type="html">&lt;p&gt;MoiraAtropos Resident: /* Needs update! */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Needs update! ==&lt;br /&gt;
&lt;br /&gt;
Flash has been gone for ages. Youtube embedding uses iframes and the html5 player now.&amp;lt;ref&amp;gt;https://support.google.com/youtube/answer/171780?hl=en&amp;lt;/ref&amp;gt; Can someone please update this? -- [[User:MoiraAtropos Resident|MoiraAtropos Resident]] ([[User talk:MoiraAtropos Resident|talk]]) 06:07, 4 July 2024 (PDT)&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/references&amp;gt;&lt;/div&gt;</summary>
		<author><name>MoiraAtropos Resident</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Sculpted_prim&amp;diff=1216896</id>
		<title>Sculpted prim</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Sculpted_prim&amp;diff=1216896"/>
		<updated>2024-07-04T12:59:49Z</updated>

		<summary type="html">&lt;p&gt;MoiraAtropos Resident: /* An informal introduction to Sculpted Prims */ Update video embed to current widget&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Help|Object=*}}{{Navbox/Media}}[[Image:Sculpted_fruit_small.png|frame|right|Sculpted Prims]]&lt;br /&gt;
[[Image:Sculpted_couch_Xenius_Revere.png|frame|right|Seven prim couch by Xenius Revere, using baked ambient occlusion.]]&lt;br /&gt;
[[Image:Sculpted_head_Chip_Midnight.png|frame|right|One prim head by Chip Midnight, using baked diffuse lighting.]]&lt;br /&gt;
[[Image:Sculpted_vases_Damanios_Thetan.jpg|frame|right|Vase sculpture by Damanios Thetan]]&lt;br /&gt;
&lt;br /&gt;
{|cellspacing=&amp;quot;5px&amp;quot;&lt;br /&gt;
|valign=&amp;quot;top&amp;quot;|&lt;br /&gt;
__TOC__&lt;br /&gt;
|valign=&amp;quot;top&amp;quot; width=&amp;quot;48%&amp;quot;|&lt;br /&gt;
{{Sculpted Prims/Links}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;videoflash&amp;gt;LlfpACg_lww&amp;lt;/videoflash&amp;gt;&lt;br /&gt;
&lt;br /&gt;
A &#039;&#039;&#039;Sculpted Prim&#039;&#039;&#039;, or &#039;&#039;sculptie&#039;&#039;, is a [[prim]] whose shape is determined by an array of x, y, z coordinates stored as RGB values in an image file &lt;br /&gt;
(a &#039;&#039;&#039;[[Sculpted Prims: FAQ#SculptTextures|Sculpt Texture]]&#039;&#039;&#039; or &#039;&#039;&#039;[[Sculpted Prims: FAQ#SculptTextures|Sculpt Map]]&#039;&#039;&#039;). &lt;br /&gt;
Sculpted prims can be used to create more complex, organic shapes that were not previously possible with the Second Life prim system. Each piece of fruit to the right is one prim (and so is the plate). For technical details, see [[Sculpted Prims: Technical Explanation]].&lt;br /&gt;
&lt;br /&gt;
== An informal introduction to Sculpted Prims ==&lt;br /&gt;
&lt;br /&gt;
Here is a video about the most important things you should know about Sculpted Prims. The video is made with Blender, but it focusses on the principles of Sculpted Prims, and thus it is completely independent from any 3D-tool. &lt;br /&gt;
&lt;br /&gt;
{{#widget:YouTube|id=4CJxwvvgFzE}}&lt;br /&gt;
&lt;br /&gt;
== How do I make Sculpted Prims == &lt;br /&gt;
&lt;br /&gt;
Presently, there are only a few limited tools &#039;&#039;&#039;inside&#039;&#039;&#039; Second Life for creating sculpties.  They are usually created externally using a 3D modeling tool such as Blender, Maya, or Wings 3D, and then uploaded to Second Life, where they are applied to a prim with the build tools.&lt;br /&gt;
&lt;br /&gt;
Further Informations can be found here:&lt;br /&gt;
*[[Sculpted Prims: Creator&#039;s Guide]] for more guidance&lt;br /&gt;
*[[Sculpted Prims: 3d Software Guide]] for a list of supporting software.&lt;br /&gt;
&lt;br /&gt;
==  News ==&lt;br /&gt;
&lt;br /&gt;
=== 20 June 2007 ===&lt;br /&gt;
&lt;br /&gt;
In-world group &#039;&#039;&#039;Sculptie Dev&#039;&#039;&#039;: group primarily for the communication/announcement of sculpted prim development.&lt;br /&gt;
&lt;br /&gt;
=== 24 May 2007 ===&lt;br /&gt;
&lt;br /&gt;
Linden Lab is running a contest: show off your sculpties for fun, fame and schwag!  [http://blog.secondlife.com/2007/05/24/second-life-sculpted-prim-contest-show-us-your-sculpties/ Read the blog for details.]  Deadline for submissions is June 1st.&lt;br /&gt;
&lt;br /&gt;
=== 23 May 2007 ===&lt;br /&gt;
&lt;br /&gt;
Sculpted prims are now available on the [http://blog.secondlife.com/2007/05/23/the-grid-is-down-for-scheduled-maintenance/ Main Grid] as of version 1.16.0(5).&lt;br /&gt;
&lt;br /&gt;
=== 16 May 2007 ===&lt;br /&gt;
&lt;br /&gt;
An update to sculpted prims, included in the [http://blog.secondlife.com/2007/05/15/beta-grid-updated-to-second-life-11601/ latest build] of the beta viewer ([http://secondlife.com/community/preview.php 1.16.0(1)]), has two changes that are not backwards-compatible:&lt;br /&gt;
&lt;br /&gt;
1) The orientation of the &#039;&#039;&#039;sculpt map&#039;&#039;&#039; (sculpt texture) is reversed. This means all previously created sculpt maps/textures need to be horizontally flipped (otherwise they&#039;ll appear inside out.) This change fixes the orientation discrepancy between sculpt maps/textures and surface textures (which have required a 90 degree rotate and flip.) ([http://blog.secondlife.com/2007/05/15/beta-grid-updated-to-second-life-11601/ source])&lt;br /&gt;
&lt;br /&gt;
2) The LSL call to set sculpted prims is changing to require two parameters: the texture and the topology type. (source: [[Talk:Sculpted_Prims#HEADS_UP.21|Talk page]])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== 27 April 2007 ===&lt;br /&gt;
&lt;br /&gt;
Sculpted Prims made available on the [http://www.secondlife.com/community/preview.php preview grid].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Where can I find out more about Sculpted Prims? ==&lt;br /&gt;
&lt;br /&gt;
Sculpted Prims have now a comprehensive [[Sculpted Prims: FAQ|FAQ]] wiki page.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
*[[Sculpted Prims: Technical Explanation]]&lt;br /&gt;
*[[Sculpted Prims: FAQ| Sculpted Prims FAQ]]&lt;br /&gt;
*[[Sculpted_Prims:_Sculpt_Maps_and_Textures|Sculpt Maps and Textures]]&lt;br /&gt;
*[[Sculpted_Prims:_3d_Software_Guide|3D Software Guide]]&lt;br /&gt;
*[[Sculpted_Prims:_3d_Modeling_Glossary|3D Modeling Glossary]]&lt;br /&gt;
*[[Sculpt_Textures_in_Paint_Programs|Sculpt Maps and 2D Graphics Software]]&lt;br /&gt;
*[[Sculpted_Prims:_Resident-made_Tools|Sculpted Prims: Resident-made Tools]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Sculpted Prims]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Features]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Creation]]&lt;/div&gt;</summary>
		<author><name>MoiraAtropos Resident</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Profile_Image&amp;diff=1216817</id>
		<title>Profile Image</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Profile_Image&amp;diff=1216817"/>
		<updated>2024-06-19T07:59:29Z</updated>

		<summary type="html">&lt;p&gt;MoiraAtropos Resident: /* Aspect Ratio */ Updated to current behaviour&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;==PROFILE IMAGE==&lt;br /&gt;
&lt;br /&gt;
===Aspect Ratio===&lt;br /&gt;
The [[Profile]] Image to be uploaded (thereafter to be referred to as a Texture) needs a Pixel Aspect Ratio of 1:1, which means that the width should qual the height.&lt;br /&gt;
So, the image might be 512 x 512 pixels, 800 x 800 pixels, or 1024 x 1024, for example.  You may need to use an image editor to crop your image accordingly.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;NOTE&#039;&#039;&#039;&#039;&#039;; &#039;&#039;if you have previously saved [[Snapshots]] from within Second Life to your inventory without altering the standard proportions given (this would be done in the Snapshot tool by unchecking Constrain Proportions and then changing the pixel measurements for either width or height in isolation), your image will already have the right proportions.  There will no need to use an image editor such as Photoshop or GIMP to alter it. If you have saved the image to disk or altered proportions, you&#039;ll likely want to crop the image.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Uploading the Image===&lt;br /&gt;
To upload the image into Second Life, click &lt;br /&gt;
File &lt;br /&gt;
Upload - &amp;gt;  Image &lt;br /&gt;
&lt;br /&gt;
===Profile Image Picker===&lt;br /&gt;
To set this texture (image) as the Profile Image, right-click your [[avatar]] and select Profile.  &lt;br /&gt;
In the General tab, click on the Profile Image placeholder (blue image with silhouette). The Pick window will appear. You can search for the uploaded texture/image using the search field on this tab.  &lt;br /&gt;
Select the texture and click &lt;br /&gt;
Select &lt;br /&gt;
OK.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;NOTE&#039;&#039;&#039;&#039;&#039;: &#039;&#039;the placeholder image in the Pick window appears squashed in from the sides so that the contents are tall and thin.  This does NOT mean that you have to stretch your prospective image in an image editor before uploading it, with the idea of compensating for the narrow/thin squashing effect.  Once you select the image, it will appear with normal proportions in the profile. &lt;br /&gt;
&#039;&#039;(But if you ever DO need to do this for some other application within Second Life, expand your image laterally so that the contents will appear wide/fat, by multiplying the width measurement by the number 1.33.)&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Category:UPLOAD]]&lt;br /&gt;
[[Category:IMAGE]]&lt;br /&gt;
[[Category:PROFILE]]&lt;br /&gt;
[[Category:TEXTURE]]&lt;br /&gt;
[[Category:Textures and Snapshots]]&lt;/div&gt;</summary>
		<author><name>MoiraAtropos Resident</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=CONTENT_TYPE_LLSD&amp;diff=1216816</id>
		<title>CONTENT TYPE LLSD</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=CONTENT_TYPE_LLSD&amp;diff=1216816"/>
		<updated>2024-06-19T07:45:26Z</updated>

		<summary type="html">&lt;p&gt;MoiraAtropos Resident: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;onlyinclude&amp;gt;{{#vardefine:CONTENT_TYPE_LLSD|{{LSL Const|CONTENT_TYPE_LLSD|integer|6|c={{#if:{{{direct|}}}|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]] to &amp;lt;code&amp;gt;{{String|application/llsd+xml}}&amp;lt;/code&amp;gt; ([[Linden Lab Structured Data]]).}}}}}}&amp;lt;/onlyinclude&amp;gt;{{LSL Constant&lt;br /&gt;
|name={{#var:cname}}&lt;br /&gt;
|type={{#var:type}}&lt;br /&gt;
|value=6&lt;br /&gt;
|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]] to &amp;lt;code&amp;gt;{{String|application/llsd+xml}}&amp;lt;/code&amp;gt; ([[Linden Lab Structured Data]]).&lt;br /&gt;
|comment={{#var:comment}}&lt;br /&gt;
|examples=&lt;br /&gt;
|constants=&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|CONTENT_TYPE_TEXT}}|3={{#var:comment}}}}&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|CONTENT_TYPE_HTML}}|3={{#var:comment}}}}&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|CONTENT_TYPE_XML}}|3={{#var:comment}}}}&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|CONTENT_TYPE_XHTML}}|3={{#var:comment}}}}&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|CONTENT_TYPE_ATOM}}|3={{#var:comment}}}}&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|CONTENT_TYPE_JSON}}|3={{#var:comment}}}}&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|CONTENT_TYPE_FORM}}|3={{#var:comment}}}}&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|CONTENT_TYPE_RSS}}|3={{#var:comment}}}}&lt;br /&gt;
|functions=&lt;br /&gt;
{{LSL DefineRow||[[llSetContentType]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llHTTPResponse]]|}}&lt;br /&gt;
|events=&lt;br /&gt;
{{LSL DefineRow||[[http_request]]|}}&lt;br /&gt;
{{LSL DefineRow||[[http_response]]|}}&lt;br /&gt;
|articles={{LSL DefineRow||[[LSL HTTP server]]}}&lt;br /&gt;
|cat1=Chat&lt;br /&gt;
|cat2&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>MoiraAtropos Resident</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=CONTENT_TYPE_LLSD&amp;diff=1216815</id>
		<title>CONTENT TYPE LLSD</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=CONTENT_TYPE_LLSD&amp;diff=1216815"/>
		<updated>2024-06-19T07:44:19Z</updated>

		<summary type="html">&lt;p&gt;MoiraAtropos Resident: link Linden Lab Structured Data&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;onlyinclude&amp;gt;{{#vardefine:CONTENT_TYPE_LLSD|{{LSL Const|CONTENT_TYPE_LLSD|integer|6|c={{#if:{{{direct|}}}|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]] to &amp;lt;code&amp;gt;{{String|application/llsd+xml}}&amp;lt;/code&amp;gt; ([[Linden Lab Structured Data]]).}}}}}}&amp;lt;/onlyinclude&amp;gt;{{LSL Constant&lt;br /&gt;
|name={{#var:cname}}&lt;br /&gt;
|type={{#var:type}}&lt;br /&gt;
|value=6&lt;br /&gt;
|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]] to &amp;lt;code&amp;gt;{{String|application/llsd+xml ([[Linden Lab Structured Data]]).}}&amp;lt;/code&amp;gt;.&lt;br /&gt;
|comment={{#var:comment}}&lt;br /&gt;
|examples=&lt;br /&gt;
|constants=&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|CONTENT_TYPE_TEXT}}|3={{#var:comment}}}}&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|CONTENT_TYPE_HTML}}|3={{#var:comment}}}}&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|CONTENT_TYPE_XML}}|3={{#var:comment}}}}&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|CONTENT_TYPE_XHTML}}|3={{#var:comment}}}}&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|CONTENT_TYPE_ATOM}}|3={{#var:comment}}}}&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|CONTENT_TYPE_JSON}}|3={{#var:comment}}}}&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|CONTENT_TYPE_FORM}}|3={{#var:comment}}}}&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|CONTENT_TYPE_RSS}}|3={{#var:comment}}}}&lt;br /&gt;
|functions=&lt;br /&gt;
{{LSL DefineRow||[[llSetContentType]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llHTTPResponse]]|}}&lt;br /&gt;
|events=&lt;br /&gt;
{{LSL DefineRow||[[http_request]]|}}&lt;br /&gt;
{{LSL DefineRow||[[http_response]]|}}&lt;br /&gt;
|articles={{LSL DefineRow||[[LSL HTTP server]]}}&lt;br /&gt;
|cat1=Chat&lt;br /&gt;
|cat2&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>MoiraAtropos Resident</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=CONTENT_TYPE_LLSD&amp;diff=1216814</id>
		<title>CONTENT TYPE LLSD</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=CONTENT_TYPE_LLSD&amp;diff=1216814"/>
		<updated>2024-06-19T07:43:12Z</updated>

		<summary type="html">&lt;p&gt;MoiraAtropos Resident: link Linden Lab Structured Data&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;onlyinclude&amp;gt;{{#vardefine:CONTENT_TYPE_LLSD|{{LSL Const|CONTENT_TYPE_LLSD|integer|6|c={{#if:{{{direct|}}}|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]] to &amp;lt;code&amp;gt;{{String|application/llsd+xml}}&amp;lt;/code&amp;gt; ([[Linden Lab Structured Data]]).}}}}}}&amp;lt;/onlyinclude&amp;gt;{{LSL Constant&lt;br /&gt;
|name={{#var:cname}}&lt;br /&gt;
|type={{#var:type}}&lt;br /&gt;
|value=6&lt;br /&gt;
|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]] to &amp;lt;code&amp;gt;{{String|application/llsd+xml}}&amp;lt;/code&amp;gt;.&lt;br /&gt;
|comment={{#var:comment}}&lt;br /&gt;
|examples=&lt;br /&gt;
|constants=&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|CONTENT_TYPE_TEXT}}|3={{#var:comment}}}}&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|CONTENT_TYPE_HTML}}|3={{#var:comment}}}}&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|CONTENT_TYPE_XML}}|3={{#var:comment}}}}&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|CONTENT_TYPE_XHTML}}|3={{#var:comment}}}}&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|CONTENT_TYPE_ATOM}}|3={{#var:comment}}}}&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|CONTENT_TYPE_JSON}}|3={{#var:comment}}}}&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|CONTENT_TYPE_FORM}}|3={{#var:comment}}}}&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|CONTENT_TYPE_RSS}}|3={{#var:comment}}}}&lt;br /&gt;
|functions=&lt;br /&gt;
{{LSL DefineRow||[[llSetContentType]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llHTTPResponse]]|}}&lt;br /&gt;
|events=&lt;br /&gt;
{{LSL DefineRow||[[http_request]]|}}&lt;br /&gt;
{{LSL DefineRow||[[http_response]]|}}&lt;br /&gt;
|articles={{LSL DefineRow||[[LSL HTTP server]]}}&lt;br /&gt;
|cat1=Chat&lt;br /&gt;
|cat2&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>MoiraAtropos Resident</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Linden_Lab_Structured_Data&amp;diff=1216813</id>
		<title>Linden Lab Structured Data</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Linden_Lab_Structured_Data&amp;diff=1216813"/>
		<updated>2024-06-19T07:41:20Z</updated>

		<summary type="html">&lt;p&gt;MoiraAtropos Resident: redirect to llsd&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;#redirect [[LLSD]]&lt;/div&gt;</summary>
		<author><name>MoiraAtropos Resident</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Clothing_Tutorials&amp;diff=1216700</id>
		<title>Clothing Tutorials</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Clothing_Tutorials&amp;diff=1216700"/>
		<updated>2024-05-21T20:16:00Z</updated>

		<summary type="html">&lt;p&gt;MoiraAtropos Resident: Removed Nicola Escher&amp;#039;s tutorials as the website no longer exists.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Help|Object=*|Avatar=*}}&lt;br /&gt;
{{Navbox/Media}}&lt;br /&gt;
&lt;br /&gt;
This page links to &#039;&#039;&#039;tools &amp;amp; tutorials for making clothing and skins&#039;&#039;&#039; Please add your fave tuts, remove obviated bits, and improve the usefulness of this resource!&lt;br /&gt;
&lt;br /&gt;
== Clothing texture templates ==&lt;br /&gt;
* &#039;&#039;&#039;[http://static-secondlife-com.s3.amazonaws.com/downloads/textures/fashion/All_Fashion_Design_Templates.zip Linden body and clothing templates]&#039;&#039;&#039;, for eyes, head, face, hair, upper and lower body, skirt; templates as PSD with instructions as PDF; 7 MB. Available under the [http://creativecommons.org/licenses/by/3.0/ Creative Commons 3.0 license].&lt;br /&gt;
* &#039;&#039;&#039;[http://static-secondlife-com.s3.amazonaws.com/templates/CMFF_Template_Set.zip Chip Midnight&#039;s improved clothing templates]&#039;&#039;&#039;, ZIP of 512x512 PSD files for head, upper and lower body, skirt; 10.7 MB&lt;br /&gt;
* &#039;&#039;&#039;[http://www.robinwood.com/Catalog/Technical/SL-Tuts/SLPages/AVUVTemplates.html Robin Wood&#039;s clothing templates]&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;[http://amblabs.ath.cx/ Higher Resolution Clothing &amp;amp; Skin Templates]&#039;&#039;&#039; - By Chip Midnight. These templates are even higher-rez than the official ones. Chip Midnight is an original master of fine fashions in SL. Once you get really serious about detail, you’ll want to get these and have a deep look.  (Note: The higher resolution is just to help you with your creation work in your paint program.  They won&#039;t affect the resolution of your in-world clothing and skins.  All outfit textures in SL are baked at 512x512 when worn on the avatar, no matter what.  So, don&#039;t forget to downsize your output files to 512x512, before you upload them to SL.  Otherwise, you&#039;ll just be wasting resources.)&lt;br /&gt;
&lt;br /&gt;
== Second Life avatar models ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;[http://static-secondlife-com.s3.amazonaws.com/downloads/avatar/avatar_mesh.zip Second Life avatar meshes]&#039;&#039;&#039; in .obj and .cr2 format, includes assets to preview the avatar in Poser, SLCP, Photoshop Extended, etc. Available under the [http://creativecommons.org/licenses/by/3.0/ Creative Commons 3.0 license].&lt;br /&gt;
** Also see &#039;&#039;&#039;[[Mesh/Rigging Fitted Mesh|Rigging Fitted Mesh]]&#039;&#039;&#039; for .ma, .fbx, .blend and .dae formats with revised skeletons.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;[http://web.archive.org/web/20120711023730/http://abbloch.com/slAvatars_OBJ_Fixed/ Improved Second Life avatar meshes for 3D texture painting]&#039;&#039;&#039; - By Chosen Few.  These OBJ files feature cleaned up geometry and proper UV tilings, for painting textures directly onto the models, in Mudbox, Zbrush, Photoshop Extended, etc.&lt;br /&gt;
**[http://pastebin.com/raw.php?i=UXmvJngs avatarSLMale.mtl]&lt;br /&gt;
**[http://pastebin.com/raw.php?i=cRjdGhTa avatarSLFemale.mtl]&lt;br /&gt;
**[http://pastebin.com/raw.php?i=Qzb6WRYV avatarSLFemale.obj]&lt;br /&gt;
**[http://pastebin.com/raw.php?i=inBjmuGj avatarSLMale.obj]&lt;br /&gt;
**[http://pastebin.com/raw.php?i=GPWGFkWq changelog.txt]&lt;br /&gt;
**[http://pastebin.com/raw.php?i=uwAPkDe2 LICENSE.txt]&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;[http://www.ccccybernetics.com/avatar_databank/ Avatar Databank]&#039;&#039;&#039; is an extended alternative avatar mesh library that includes all avatar extremes (fat, skinny, etc...). Models are in AC3D and .obj formats with .png format 1024x1024 texture templates. For the very advanced clothing and make-up designers.&lt;br /&gt;
&lt;br /&gt;
==Tutorials==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;[http://www.robinwood.com/Catalog/Technical/SL-Tuts/SLTutSet.html Second Life tutorials]&#039;&#039;&#039; - By [http://wiki.secondlife.com/wiki/User:Robin_Sojourner Robin Sojourner] AKA Robin Wood. She has a really elegant, organized approach. Check out her fantasy art as proof! She’s mentioned that she’ll be adding more to this site, so keep watching, and check out her posts on the forums too, like her fab [http://forums.secondlife.com/showthread.php?t=77501 T-Shirt Template] — learn how to make wrinkles without photo-sourcing!&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;[http://leezu-tutorials.blogspot.com/ Second Life Clothing Tutorials]&#039;&#039;&#039; - By LeeZu Baxter. The creator of [LeeZu!] Designs, LeeZu Baxter offers step by step tutorials to assist new builders as they face the challenges of creating their own original designs.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;[http://www.secondlife-shirts.com/secondlife_tutorials.htm Second Life Clothing Tutorials]&#039;&#039;&#039; - By Minmo Dreadlow. A Simple tutorial on how to create a t-shirt using photoshop, or turn your own clothing into secondife clothes with photoshop. Offers several free shirt fabrics as well. &lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;[http://blog.nalates.net/2012/05/20/second-life-mesh-clothes-blender-2-6-setup-2012-tutorial/ Blender 2.63a Setup Tutorial for Mesh Clothes]&#039;&#039;&#039; - By Nalates Urriah May 2012. Includes information on selecting the base/default avatar for future Mesh Deformer.&lt;br /&gt;
** [http://blog.nalates.net/?p=7381 Page 1 – Blender Install, Base Mesh Selection]&lt;br /&gt;
** [http://blog.nalates.net/?p=7381&amp;amp;page=2 Page 2 – Details on Files and Base Avatar Meshes Available]&lt;br /&gt;
** [http://blog.nalates.net/?p=7381&amp;amp;page=3 Page 3 – Deconfuser, File to Use, Actual Mesh Differences, Easy File Fix]&lt;br /&gt;
** [http://blog.nalates.net/?p=7381&amp;amp;page=4 Page 4 –  Not So Easy Fix for Learning, Exporting Shapes from SL, What’s Needed]&lt;br /&gt;
** [http://blog.nalates.net/?p=7381&amp;amp;page=5 Page 5 – Getting Started, Customize Blender, GPU Kick-in, Load Mesh – Import OBJ, Setup Layers]&lt;br /&gt;
** [http://blog.nalates.net/?p=7381&amp;amp;page=6 Page 6 – Join Parts or Not, Remove Doubles, Parenting, Check Parenting, Start Weighting – Vertex Weight Painting]&lt;br /&gt;
** [http://blog.nalates.net/?p=7381&amp;amp;page=7 Page 7 – Weight Painting, Checking Weight Painting, ]&lt;br /&gt;
** [http://blog.nalates.net/?p=7381&amp;amp;page=8 Page 8 – Checking the Weighting, Exporting Collada for Second Life]&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;[http://blog.nalates.net/2013/04/23/second-life-shape-export/ Second Life Shape Export]&#039;&#039;&#039; - 4/2013 - There are currently problems with all the OBJ export features for SL. &#039;&#039;&#039;&#039;&#039;Only the XML exports produce correctly sized avatar exports.&#039;&#039;&#039;&#039;&#039; All the importers for XML are, so far, retail products. This article shows how to get an OBJ export correctly sized in Blender, or any modeling program.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;[http://forums.secondlife.com/showthread.php?t=76703 Tattoo Creation]&#039;&#039;&#039; - By Amber Stonecutter. Tattoos may be likened to clothes that are harder to take off, at least offline. The magic unfolds in this thread. Amber had never made a tutorial before, and in response to Flugel inquiring, she spontaneously cooked one up — pictures and all! She even got props from Chosen and Robin.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;[http://seshat-czeret.blogspot.com/2008/06/how-to-make-sl-clothes-in-gimp.html How to make SL clothes in the Gimp]&#039;&#039;&#039; - By Seshat Czeret. The first installment of a series of SL clothing tutorials, each linked to the next. The series starts with preparation, and continues with making a simple t-shirt and adding highlights and shadows. It explains why you do each step, as well as how.&lt;br /&gt;
:Also see &#039;&#039;&#039;[http://seshat-czeret.blogspot.com/2009/04/theory-of-second-life-skin-and-clothing.html The Theory of Second Life Skin and Clothing]&#039;&#039;&#039;. This is useful regardless of which image program you use.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;[http://metavirtual.us/template Cassie Clowes Clothing Videos]&#039;&#039;&#039; - By Cassie Clowes. Read the FAQ regarding information. Video tutorials that are high quality and with clothing templates (socks, tshirts, pants, etc)&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;[http://mistressofdesign.wordpress.com/ Random Rambling, Tips &amp;amp; Tricks]&#039;&#039;&#039; - By Claire Hartford. Sporadically updated blog with tutorials for clothing (and skin) creation. Of particular note is the [http://mistressofdesign.wordpress.com/2011/01/19/multi-chan-hax-its-all-kinds-of-awesome-2/ video tutorial on the use of Multi Chan Hax].&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;[http://chimerafire.wordpress.com/sl-clothing-creation-guide/ Guide to Making Second Life Clothing]&#039;&#039;&#039; - By Chimera Firecaster.   Nicely presented, Chimera&#039;s site includes a number of fully illustrated, well researched, and up-to-date tutorials.  Complementing the tutorials are free packages composed of useful tools, templates and graphic files.  Also found on the site are annotated lists of SL clothing resources found elsewhere on the web.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;[http://www.tdtemplates.com/basictutorial/ SL Clothes Creation: The Basics (Feb 2012)]&#039;&#039;&#039; - By TD Templates. An introduction for beginners providing an overview of the basics when creating SL clothing and starting your fashion store in Second Life.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;[http://createmesh.com/ Create Mesh Video Tutorials for Maya]&#039;&#039;&#039; - Everything you need to know to make clothing for Second Life with Maya, from various modeling techniques, sizing around an avatar, rigging, and even draping cloth around your model.  The Clothing Course is about eight hours of step-by-step instruction from leading designer, [https://wiki.secondlife.com/wiki/User:Leviathan_Flux Leviathan Flux].  The site currently offers other courses on using Maya with basic introductory tutorials and an introduction to architecture, focusing on efficient builds, LODs, lighting, and physics.&lt;br /&gt;
&lt;br /&gt;
== See also ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;[[Texture Tools]]&#039;&#039;&#039;&lt;br /&gt;
* &#039;&#039;&#039;[[Clothes design starter tips]]&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
[[Category:Tutorials]] [[Category:Creation]]&lt;/div&gt;</summary>
		<author><name>MoiraAtropos Resident</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlBase64ToString&amp;diff=1216098</id>
		<title>LlBase64ToString</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlBase64ToString&amp;diff=1216098"/>
		<updated>2024-01-24T17:15:54Z</updated>

		<summary type="html">&lt;p&gt;MoiraAtropos Resident: return_text=that is the {{LSLGC|Base64}} &amp;#039;&amp;#039;&amp;#039;str&amp;#039;&amp;#039;&amp;#039; decoded into a conventional string, interpreting the Base64-encoded bytes as UTF-8 character sequence.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Function&lt;br /&gt;
|func=llBase64ToString|func_id=261|func_sleep=0.0|func_energy=10.0&lt;br /&gt;
|return_type=string&lt;br /&gt;
|p1_type=string|p1_name=str|p1_desc=Base64 string&lt;br /&gt;
|return_text=that is the {{LSLGC|Base64}} &#039;&#039;&#039;str&#039;&#039;&#039; decoded into a conventional string, interpreting the Base64-encoded bytes as UTF-8 character sequence.&lt;br /&gt;
|caveats=*If the conversion creates any unprintable characters, they are converted to spaces.&lt;br /&gt;
*Converts invalid characters into question marks (&#039;?&#039;).&lt;br /&gt;
|spec&lt;br /&gt;
|examples=&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;default {&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        string test = llBase64ToString(&amp;quot;U2VjcmV0Ok9wZW4=&amp;quot;);&lt;br /&gt;
        llSay(0,test );&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This can be used in {{Wikipedia|Basic access authentication|Basic Authentication}}, such as this login:&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
GET / HTTP/1.1&lt;br /&gt;
User-Agent: Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.2)&lt;br /&gt;
Host: www.example.com&lt;br /&gt;
Authorization: Basic U2VjcmV0Ok9wZW4= &lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;llBase64ToString(&amp;quot;U2VjcmV0Ok9wZW4=&amp;quot;); //will return the string &amp;quot;Secret:Open&amp;quot;&amp;lt;/source&amp;gt;&lt;br /&gt;
|helpers&lt;br /&gt;
|related&lt;br /&gt;
|also_header&lt;br /&gt;
|also_events&lt;br /&gt;
|also_functions=&lt;br /&gt;
{{LSL DefineRow||[[llXorBase64]]|Article also discusses xor based Cryptography.}}&lt;br /&gt;
{{LSL DefineRow||[[llStringToBase64]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llBase64ToInteger]]|}}&lt;br /&gt;
|also_articles=&lt;br /&gt;
{{LSL DefineRow||{{LSLGC|Base64}}|}}&lt;br /&gt;
|also_footer&lt;br /&gt;
|notes&lt;br /&gt;
|mode&lt;br /&gt;
|deprecated&lt;br /&gt;
|cat1=Base64&lt;br /&gt;
|cat2=String&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>MoiraAtropos Resident</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlStringLength&amp;diff=1216097</id>
		<title>LlStringLength</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlStringLength&amp;diff=1216097"/>
		<updated>2024-01-24T13:13:53Z</updated>

		<summary type="html">&lt;p&gt;MoiraAtropos Resident: *To quickly find out the number of bytes (in UTF-8), you can use llStringToBase64 (see also snippet there)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function&lt;br /&gt;
|func_id=128|func_sleep=0.0|func_energy=10.0&lt;br /&gt;
|func=llStringLength|return_type=integer|p1_type=string|p1_name=str&lt;br /&gt;
|func_footnote&lt;br /&gt;
|func_desc&lt;br /&gt;
|return_text=that is the number of characters in &#039;&#039;&#039;str&#039;&#039;&#039;.&lt;br /&gt;
|spec&lt;br /&gt;
|caveats=&lt;br /&gt;
*The index of the last character is not equal to the string length.&lt;br /&gt;
**Character indexs start at zero (the index of the first character is zero).&lt;br /&gt;
*llStringLength() gets the number of characters, not bytes&lt;br /&gt;
**LSL-2 sees all strings as UTF-8&lt;br /&gt;
**LSL-Mono sees all string as UTF-16&lt;br /&gt;
**Both UTF-8 and UTF-16 use multibyte characters&lt;br /&gt;
*Some communication functions (e.g. llHTTPResponse) are limited by number of Bytes, and work with UTF-8 strings&lt;br /&gt;
**To quickly find out the number of bytes (in UTF-8), you can use [[llStringToBase64]] (see also snippet there)&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;
// assumptions: &lt;br /&gt;
//    object name: LSLWiki&lt;br /&gt;
//    script name: _lslwiki&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        string HowLongAmI = &amp;quot;123&amp;quot;;&lt;br /&gt;
        integer strlen = llStringLength(HowLongAmI);&lt;br /&gt;
        llOwnerSay( &amp;quot;&#039;&amp;quot; + HowLongAmI + &amp;quot;&#039; has &amp;quot; +(string) strlen + &amp;quot; characters.&amp;quot;);&lt;br /&gt;
        // The owner of object LSLWiki will hear &lt;br /&gt;
        // LSLWiki: &#039;123&#039; has 3 characters.&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|helpers&lt;br /&gt;
|also_functions={{LSL DefineRow||[[llGetListLength]]|}}&lt;br /&gt;
|also_events&lt;br /&gt;
|also_tests&lt;br /&gt;
|also_articles&lt;br /&gt;
|notes&lt;br /&gt;
|permission&lt;br /&gt;
|negative_index&lt;br /&gt;
|sort=StringLength&lt;br /&gt;
|cat1=String&lt;br /&gt;
|cat2&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>MoiraAtropos Resident</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlHTTPRequest&amp;diff=1215899</id>
		<title>LlHTTPRequest</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlHTTPRequest&amp;diff=1215899"/>
		<updated>2023-12-23T20:02:56Z</updated>

		<summary type="html">&lt;p&gt;MoiraAtropos Resident: When the response is received, a http_response event is raised.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function&lt;br /&gt;
|func=llHTTPRequest&lt;br /&gt;
|func_id=230&lt;br /&gt;
|func_energy=10.0&lt;br /&gt;
|func_sleep=0.0&lt;br /&gt;
|func_desc=Sends an HTTP request to the specified URL with the body of the request and parameters. When the response is received, a [[http_response]] event is raised.&lt;br /&gt;
|sort=HTTPRequest&lt;br /&gt;
|func_footnote=&lt;br /&gt;
|return_type=key|return_subtype=handle&lt;br /&gt;
|return_text=identifying the HTTP request made.&lt;br /&gt;
|p1_type=string|p1_name=url|p1_desc=A valid HTTP/HTTPS URL.&lt;br /&gt;
|p2_type=list|p2_subtype=instructions|p2_name=parameters|p2_desc=configuration parameters, specified as HTTP_* flag-value pairs&lt;br /&gt;
[ parameter1, value1, parameter2, value2, . . . parameterN, valueN]&lt;br /&gt;
|p3_type=string|p3_name=body|p3_desc=Contents of the request.&lt;br /&gt;
|constants={{LSL_Constants_HTTP}}&lt;br /&gt;
{{LSL_Constants/HTTP_Headers}}&lt;br /&gt;
{{LSL_Extended_Error_HTTP}}&lt;br /&gt;
|spec=&lt;br /&gt;
|caveats=&lt;br /&gt;
*Spaces, control characters, and other characters that are not allowed in URLs will cause a run time error.&lt;br /&gt;
*The corresponding [[http_response]] event will be triggered in all scripts in the [[prim]], not just in the requesting script.&lt;br /&gt;
*Requests must fully complete after 60 seconds, or else the response will be thrown away and the [[http_response]] status code will be 499.&lt;br /&gt;
*The response body is limited to 2048 bytes by default, see [[HTTP_BODY_MAXLENGTH]] above to increase it. If the response is longer, it will be truncated.&lt;br /&gt;
*The request body size (e.g., of POST and PUT requests) is limited only by available script memory. Scripts can hold at most 32k characters in a string, under [[Mono]], as characters are two bytes each, so, scripts cannot upload over 32k UTF-8 characters&lt;br /&gt;
*Cannot be used to load textures or images from the internet, for more information see [[Web Textures]].&lt;br /&gt;
*If the accessed site is relying on the LSL script to report [[L$]] transactions, then it &#039;&#039;&#039;must&#039;&#039;&#039; check the &amp;lt;code&amp;gt;X-SecondLife-Shard&amp;lt;/code&amp;gt; header to see if the script is running on the beta grid.&lt;br /&gt;
* Some servers will return a &amp;lt;code&amp;gt;405&amp;lt;/code&amp;gt; error if you send POST to a file that can&#039;t accept metadata, such as a text or HTML file. Make sure you use the GET method to ensure success in any environment.&lt;br /&gt;
* While the HTTP status code from the server is provided to the script, redirect codes such as &amp;lt;code&amp;gt;302&amp;lt;/code&amp;gt; will result in the redirect being automatically and transparently followed ONLY IF the [[HTTP_METHOD]] is GET, with the resulting response being returned.  If the [[HTTP_METHOD]] is anything other than GET then you&#039;ll get back an [[http_response]] with a status code of &amp;lt;code&amp;gt;302&amp;lt;/code&amp;gt;, but without any way to view the headers, you can&#039;t know where you were being redirected to unless that was also included in the body.&lt;br /&gt;
* The following applies when making a request to a script using HTTP-In:&lt;br /&gt;
**When appending a query string to a cap URL there &#039;&#039;&#039;MUST&#039;&#039;&#039; be a trailing slash between the cap guid and the query string token &amp;lt;code&amp;gt;&amp;quot;?&amp;quot;&amp;lt;/code&amp;gt;. For example: [https://sim3015.aditi.lindenlab.com:12043/cap/a7717681-2c04-e4ac-35e3-1f01c9861322?arg=gra {{HoverTextStyle|style=color:green;|&amp;lt;nowiki&amp;gt;https://sim3015.aditi.lindenlab.com:12043/cap/a7717681-2c04-e4ac-35e3-1f01c9861322&amp;lt;/nowiki&amp;gt;|2={{String|x-script-url}} = {{String|https://sim3015.aditi.lindenlab.com:12043/cap/a7717681-2c04-e4ac-35e3-1f01c9861322}}}}?{{HoverTextStyle|style=color:red;|1=arg=gra|2={{String|x-query-string}} = {{String|1=arg=gra}}}}] will return a 500 HTTP status {{Wikipedia|List_of_HTTP_status_codes#5xx_Server_Error|Server Error code}}, but [https://sim3015.aditi.lindenlab.com:12043/cap/a7717681-2c04-e4ac-35e3-1f01c9861322/?arg=gra {{HoverTextStyle|style=color:green;|&amp;lt;nowiki&amp;gt;https://sim3015.aditi.lindenlab.com:12043/cap/a7717681-2c04-e4ac-35e3-1f01c9861322&amp;lt;/nowiki&amp;gt;|2={{String|x-script-url}} = {{String|https://sim3015.aditi.lindenlab.com:12043/cap/a7717681-2c04-e4ac-35e3-1f01c9861322}}}}{{HoverTextStyle|style=color:blue;|/|2={{String|x-path-info}} = {{String|/}}}}?{{HoverTextStyle|style=color:red;|1=arg=gra|2={{String|x-query-string}} = {{String|1=arg=gra}}}}] will succeed.&lt;br /&gt;
* &amp;lt;code&amp;gt;X-SecondLife-Owner-Name&amp;lt;/code&amp;gt; may return &amp;lt;code&amp;gt;&amp;quot;(Loading...)&amp;quot;&amp;lt;/code&amp;gt; instead of owner name (still true, 30th of March, 2022)&lt;br /&gt;
* Requests made at approx 0625 SLT may fail with a &amp;lt;code&amp;gt;503&amp;lt;/code&amp;gt; status code, with &amp;lt;code&amp;gt;&amp;quot;ERROR: The requested URL could not be retrieved&amp;quot;&amp;lt;/code&amp;gt;, and &amp;lt;code&amp;gt;&amp;quot;(111) Connection refused&amp;quot;&amp;lt;/code&amp;gt; in the body of the response.  This has been confirmed as expected behavior by Kelly, due to the nightly maintenance and log rotation.  It does reliably impact object to object HTTP at that time, and quite probably may impact object to/from web around the same time.  The interruption in service is fairly brief, and the precise timing may vary as LL adjust their nightly maintenance processes, or due to server load.&lt;br /&gt;
* Use &amp;lt;code&amp;gt;HTTP_MIMETYPE&amp;lt;/code&amp;gt; to set the &amp;lt;code&amp;gt;Content-Type&amp;lt;/code&amp;gt; header. Attempts to use &amp;lt;code&amp;gt;HTTP_CUSTOM_HEADER&amp;lt;/code&amp;gt; to set it will cause a runtime script error.&lt;br /&gt;
* If the origin server does not include a content-type header in its response, LSL will attempt to treat the incoming data as &amp;quot;text/plain; charset=utf-8&amp;quot;. This behavior diverges from [https://datatracker.ietf.org/doc/html/rfc2616#section-7.2.1 RFC 2616].&lt;br /&gt;
&lt;br /&gt;
==== Throttles ====&lt;br /&gt;
&lt;br /&gt;
The LSL function [[llHTTPRequest]] is throttled in two ways:  by prim and owner.  All group-owned objects are considered together in the same throttle.&lt;br /&gt;
&lt;br /&gt;
The current limits are 25 requests in 20 seconds for each object, and 1000 in 20 seconds for each owner.   These may change in the future if needed to prevent problems in regions.&lt;br /&gt;
&lt;br /&gt;
It is possible for a large collection of objects or scripts to make many calls to [[llHTTPRequest]] and reach this throttle.  When a script calls [[llHTTPRequest]] with the throttle blocking the request, it will return [[NULL_KEY]].&lt;br /&gt;
&lt;br /&gt;
The calling script must check for the [[NULL_KEY]] result and react properly for the script and object to function correctly.   Some things to consider:&lt;br /&gt;
&lt;br /&gt;
* Pause further requests until the throttle clears&lt;br /&gt;
* Do not make any additional [[llHTTPRequest]] calls until enough time has passed for the throttle to reset.    They will fail and continue to return [[NULL_KEY]] otherwise.&lt;br /&gt;
* Once reached, the throttles will remain in effect as long as requests continue, but will clear if there is a silent period with no requests at least twice the throttle interval, in this case 2 * 20 or 40 seconds.‎&lt;br /&gt;
&lt;br /&gt;
:Consider how a group of objects behaves.   Developers must consider how multiple objects will interact and how that will affect clearing the throttle.‎&lt;br /&gt;
&lt;br /&gt;
:The [[llHTTPRequest]] throttle is most likely to be an issue with a large number of objects in a region making requests.  To clear the throttle fastest, when an object encounters the throttle, it should broadcast a region-wide chat message to other objects informing them of the event and stopping their requests. If those objects continue making requests, those requests will fail and just prolong recovery.‎&lt;br /&gt;
&lt;br /&gt;
:If an object waits and still gets a failure, it may be a good idea to increase the time before the next request and/or add a small random value to the wait time. This may help prevent failures caused by large groups of objects acting nearly in unison.&lt;br /&gt;
&lt;br /&gt;
* Object requests are throttled at approximately 25 requests per 20 seconds. This is to support a sustained rate of one per second or a maximum burst of up to 25 every 40 seconds (twice the interval for maximum burst), smaller bursts are recommended. &lt;br /&gt;
* [[NULL_KEY]] is returned if the request is throttled.&lt;br /&gt;
* See [http://forums-archive.secondlife.com/139/72/108960/1.html this thread] and [http://forums-archive.secondlife.com/139/2c/109571/1.html this thread] for older details.&lt;br /&gt;
----&lt;br /&gt;
|examples=&lt;br /&gt;
&lt;br /&gt;
*[[Writing Headers and HTTP POST Body to a File]]&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
key http_request_id;&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        http_request_id = llHTTPRequest(&amp;quot;url&amp;quot;, [], &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) return;// exit if unknown&lt;br /&gt;
&lt;br /&gt;
        vector COLOR_BLUE = &amp;lt;0.0, 0.0, 1.0&amp;gt;;&lt;br /&gt;
        float  OPAQUE     = 1.0;&lt;br /&gt;
&lt;br /&gt;
        llSetText(body, COLOR_BLUE, OPAQUE);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example PHP test script:&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php header(&amp;quot;content-type: text/plain; charset=utf-8&amp;quot;); ?&amp;gt;&lt;br /&gt;
Headers received:&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
&lt;br /&gt;
/**&lt;br /&gt;
 * @author Wouter Hobble&lt;br /&gt;
 * @copyright 2008&lt;br /&gt;
 */&lt;br /&gt;
&lt;br /&gt;
foreach ($_SERVER as $k =&amp;gt; $v)&lt;br /&gt;
{&lt;br /&gt;
    if( substr($k, 0, 5) == &#039;HTTP_&#039;)&lt;br /&gt;
    {&lt;br /&gt;
        print &amp;quot;\n&amp;quot;. $k. &amp;quot;\t&amp;quot;. $v;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example PHP wrapper script both capturing Apache headers and global methods&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
    // Author Waster Skronski.&lt;br /&gt;
    // General Public License (GPL).&lt;br /&gt;
    // Mind that some headers are not included because they&#039;re either useless or unreliable.&lt;br /&gt;
&lt;br /&gt;
    $USE_APACHE_HEADERS = TRUE;// switch to false if you need CGI methods&lt;br /&gt;
&lt;br /&gt;
    if ($USE_APACHE_HEADERS)&lt;br /&gt;
    {&lt;br /&gt;
        $headers    = apache_request_headers();&lt;br /&gt;
        $objectgrid = $headers[&amp;quot;X-SecondLife-Shard&amp;quot;];&lt;br /&gt;
        $objectname = $headers[&amp;quot;X-SecondLife-Object-Name&amp;quot;];&lt;br /&gt;
        $objectkey  = $headers[&amp;quot;X-SecondLife-Object-Key&amp;quot;];&lt;br /&gt;
        $objectpos  = $headers[&amp;quot;X-SecondLife-Local-Position&amp;quot;];&lt;br /&gt;
        $ownerkey   = $headers[&amp;quot;X-SecondLife-Owner-Key&amp;quot;];&lt;br /&gt;
        $ownername  = $headers[&amp;quot;X-SecondLife-Owner-Name&amp;quot;];&lt;br /&gt;
        $regiondata = $headers[&amp;quot;X-SecondLife-Region&amp;quot;];&lt;br /&gt;
        $regiontmp  = explode (&amp;quot;(&amp;quot;,$regiondata);        // cut coords off&lt;br /&gt;
        $regionpos  = explode (&amp;quot;)&amp;quot;,$regiontmp[1]);&lt;br /&gt;
        $regionname = substr($regiontmp[0],0,-1);       // cut last space from region name&lt;br /&gt;
    } else {&lt;br /&gt;
        $db         = $GLOBALS;&lt;br /&gt;
        $headers    = $db[&#039;$_ENV&#039;];&lt;br /&gt;
        $objectgrid = $headers[&amp;quot;HTTP_X_SECONDLIFE_SHARD&amp;quot;];&lt;br /&gt;
        $objectname = $headers[&amp;quot;HTTP_X_SECONDLIFE_OBJECT_NAME&amp;quot;];&lt;br /&gt;
        $objectkey  = $headers[&amp;quot;HTTP_X_SECONDLIFE_OBJECT_KEY&amp;quot;];&lt;br /&gt;
        $ownerkey   = $headers[&amp;quot;HTTP_X_SECONDLIFE_OWNER_KEY&amp;quot;];&lt;br /&gt;
        $objectpos  = $headers[&amp;quot;HTTP_X_SECONDLIFE_LOCAL_POSITION&amp;quot;];&lt;br /&gt;
        $ownername  = $headers[&amp;quot;HTTP_X_SECONDLIFE_OWNER_NAME&amp;quot;];&lt;br /&gt;
        $regiondata = $headers[&amp;quot;HTTP_X_SECONDLIFE_REGION&amp;quot;];&lt;br /&gt;
        $regiontmp  = explode (&amp;quot;(&amp;quot;,$regiondata);&lt;br /&gt;
        $regionpos  = explode (&amp;quot;)&amp;quot;,$regiontmp[1]);&lt;br /&gt;
        $regionname = substr($regiontmp[0],0,-1);&lt;br /&gt;
    }&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example wrapper script for GoDaddy.com Linux PHP servers (fix made by Thomas Conover):&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;php&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;?php&lt;br /&gt;
// FETCH HEADERS START&lt;br /&gt;
&lt;br /&gt;
if (!function_exists(&#039;apache_request_headers&#039;))&lt;br /&gt;
{&lt;br /&gt;
    function apache_request_headers() {&lt;br /&gt;
        foreach($_SERVER as $key=&amp;gt;$value) {&lt;br /&gt;
            if (substr($key,0,5)==&amp;quot;HTTP_&amp;quot;) {&lt;br /&gt;
                $key=str_replace(&amp;quot; &amp;quot;,&amp;quot;-&amp;quot;,ucwords(strtolower(str_replace(&amp;quot;_&amp;quot;,&amp;quot; &amp;quot;,substr($key,5)))));&lt;br /&gt;
                $out[$key]=$value;&lt;br /&gt;
            }else{&lt;br /&gt;
                $out[$key]=$value;&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        return $out;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
// Mind that some headers are not included because they&#039;re either useless or unreliable (e.g. X-Secondlife-Local-Position)&lt;br /&gt;
$headers    = apache_request_headers();&lt;br /&gt;
$objectgrid = $headers[&amp;quot;X-Secondlife-Shard&amp;quot;];&lt;br /&gt;
$objectname = $headers[&amp;quot;X-Secondlife-Object-Name&amp;quot;];&lt;br /&gt;
$objectkey  = $headers[&amp;quot;X-Secondlife-Object-Key&amp;quot;];&lt;br /&gt;
$objectpos  = $headers[&amp;quot;X-Secondlife-Local-Position&amp;quot;];&lt;br /&gt;
$ownerkey   = $headers[&amp;quot;X-Secondlife-Owner-Key&amp;quot;];&lt;br /&gt;
$ownername  = $headers[&amp;quot;X-Secondlife-Owner-Name&amp;quot;];&lt;br /&gt;
$regiondata = $headers[&amp;quot;X-Secondlife-Region&amp;quot;];&lt;br /&gt;
$regiontmp  = explode (&amp;quot;(&amp;quot;,$regiondata);            // cut coords off&lt;br /&gt;
$regionname = substr($regiontmp[0],0,-1);           // cut last space from region name&lt;br /&gt;
$regiontmp  = explode (&amp;quot;)&amp;quot;,$regiontmp[1]);&lt;br /&gt;
$regionpos  = $regiontmp[0];&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
// FETCH HEADERS END&lt;br /&gt;
?&amp;gt;&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|helpers&lt;br /&gt;
|also_header&lt;br /&gt;
|also_events={{LSL DefineRow||[[http_response]]}}&lt;br /&gt;
|also_functions={{LSL DefineRow||[[llEscapeURL]]}}&lt;br /&gt;
{{LSL DefineRow||[[llHTTPResponse]]}}&lt;br /&gt;
{{LSL DefineRow||[[llUnescapeURL]]}}&lt;br /&gt;
|also_articles={{LSL DefineRow||[[Simulator IP Addresses]]}}&lt;br /&gt;
|also_footer&lt;br /&gt;
|notes=If for some reason while using the function [[llHTTPRequest]] or the event [[http_response]] you are unable to parse a known good RSS feed or some other form of web contents, you will need to work around it outside of Second Life. This is unlikely to change in the near future since checking the headers requires more overhead at the simulator level.&lt;br /&gt;
&lt;br /&gt;
You may find that some web servers return either a null or a nonsensical result when [[llHTTPRequest]] is used, even though the same URL in a PC web browser returns the expected result. This may be due to the fact that the [[llHTTPRequest]] User Agent string is not recognised by some web servers as it does not contain &amp;lt;code&amp;gt;&amp;quot;Mozilla&amp;quot;&amp;lt;/code&amp;gt;, which would identify it as a web browser instead of, for example, a [https://www.shoutcast.com/ Shoutcast] or an RSS client. This is also true when the PHP script relies on [https://www.php.net/manual/en/reserved.variables.cookies.php $_COOKIE]. Neither can the function [[llHTTPRequest]] set a cookie nor can the event [[http_request]] retrieve them.&lt;br /&gt;
&lt;br /&gt;
CGI environments may place the headers into variables by capitalizing the entire name, replacing dashes with underscores, and prefixing the name with &amp;lt;code&amp;gt;HTTP_&amp;lt;/code&amp;gt;, e.g. &amp;lt;code&amp;gt;HTTP_X_SECONDLIFE_OBJECT_NAME&amp;lt;/code&amp;gt;. PHP &amp;lt;code&amp;gt;$_SERVER&amp;lt;/code&amp;gt; variables do this as well.&lt;br /&gt;
&lt;br /&gt;
Apache can include the headers in its logs, using the &amp;lt;code&amp;gt;CustomLog&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;LogFormat&amp;lt;/code&amp;gt; directives.  See [https://httpd.apache.org/docs/2.4/mod/mod_log_config.html#formats the docs] for details on the syntax.&lt;br /&gt;
&lt;br /&gt;
|mode&lt;br /&gt;
|deprecated&lt;br /&gt;
|permission&lt;br /&gt;
|cat1=HTTP&lt;br /&gt;
|cat2=XML-RPC&lt;br /&gt;
|cat3=Communications&lt;br /&gt;
|cat4=HTTP/Client&lt;br /&gt;
|haiku={{Haiku|Shining break of day|Lov&#039;ly web, carefully spun|Of bytes and prims}}&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>MoiraAtropos Resident</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlDialog&amp;diff=1215893</id>
		<title>LlDialog</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlDialog&amp;diff=1215893"/>
		<updated>2023-12-23T02:01:52Z</updated>

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

		<summary type="html">&lt;p&gt;MoiraAtropos Resident: /* Starting at an offset */ If you want every second (or third, etc.) item in each stride returned, rather than the first, use llList2ListSlice instead.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function&lt;br /&gt;
|inject-2={{LSL_Function/negative index|true|start|end|noExclude=*}}{{LSL_Function/stride|stride}}&lt;br /&gt;
|func_id=198|func_sleep=0.0|func_energy=10.0&lt;br /&gt;
|func=llList2ListStrided&lt;br /&gt;
|return_type=list&lt;br /&gt;
|p1_type=list|p1_name=src&lt;br /&gt;
|p2_type=integer|p2_name=start&lt;br /&gt;
|p3_type=integer|p3_name=end&lt;br /&gt;
|p4_type=integer|p4_name=stride&lt;br /&gt;
|func_footnote&lt;br /&gt;
|func_desc&lt;br /&gt;
|return_text=of all the entries in the [[List#Strided_lists|strided list]] whose index is a multiple of {{LSLP|stride}} in the range {{LSLP|start}} to {{LSLP|end}}.&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;list mylist = [0,1,2,3,4,5,6];&lt;br /&gt;
list result_a = llList2ListStrided(mylist,0,-1,2); //start at first item in list, go to the end, return every 2nd item&lt;br /&gt;
//result_a == [0,2,4,6]&lt;br /&gt;
&lt;br /&gt;
list result_b = llList2ListStrided(mylist,1,-1,2); //start at second item in list, go to the end, return every 2nd item&lt;br /&gt;
//result_b == [2,4,6]&lt;br /&gt;
&lt;br /&gt;
list result_c = llList2ListStrided(mylist,2,-1,2); //start at third item in list, go to the end, return every 2nd item&lt;br /&gt;
//result_c == [2,4,6]&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;list menu = [&amp;quot;1&amp;quot;, &amp;quot;one&amp;quot;, &amp;quot;2&amp;quot;, &amp;quot;two&amp;quot;, &amp;quot;3&amp;quot;, &amp;quot;three&amp;quot;];&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llListen(10, &amp;quot;&amp;quot;, llGetOwner(), &amp;quot;&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    touch_start(integer detected)&lt;br /&gt;
    {&lt;br /&gt;
        list buttons = llList2ListStrided(menu, 0, -1, 2);&lt;br /&gt;
        llDialog(llDetectedKey(0), &amp;quot;choose a number&amp;quot;, buttons, 10);&lt;br /&gt;
    }&lt;br /&gt;
    listen(integer channel, string obj, key id, string message)&lt;br /&gt;
    {&lt;br /&gt;
        integer index = llListFindList(menu, [message]);&lt;br /&gt;
        if (index != -1)&lt;br /&gt;
        {&lt;br /&gt;
            llOwnerSay(&amp;quot;you chose &amp;quot; + llList2String(menu, index + 1) + &amp;quot; (&amp;quot; + message + &amp;quot;)&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|helpers&lt;br /&gt;
|also_functions=&lt;br /&gt;
{{LSL DefineRow||[[llList2ListSlice]]|}}&lt;br /&gt;
&lt;br /&gt;
|also_events&lt;br /&gt;
|also_tests&lt;br /&gt;
|also_articles&lt;br /&gt;
|notes= &lt;br /&gt;
=== Starting at an offset ===&lt;br /&gt;
If you want every second (or third, etc.) item in each stride returned, rather than the first, use [[llList2ListSlice]] instead.&lt;br /&gt;
|permission&lt;br /&gt;
|negative_index&lt;br /&gt;
|haiku={{Haiku|Ah, the strided list.|C had structs in the &#039;70s.|Someday, we will, too...}}&lt;br /&gt;
|sort=List2ListStrided&lt;br /&gt;
|cat1=List&lt;br /&gt;
|cat2&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>MoiraAtropos Resident</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlList2ListStrided&amp;diff=1215160</id>
		<title>LlList2ListStrided</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlList2ListStrided&amp;diff=1215160"/>
		<updated>2023-10-25T19:40:40Z</updated>

		<summary type="html">&lt;p&gt;MoiraAtropos Resident: hint on llList2ListSlice() and replace workarounds emulating it&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function&lt;br /&gt;
|inject-2={{LSL_Function/negative index|true|start|end|noExclude=*}}{{LSL_Function/stride|stride}}&lt;br /&gt;
|func_id=198|func_sleep=0.0|func_energy=10.0&lt;br /&gt;
|func=llList2ListStrided&lt;br /&gt;
|return_type=list&lt;br /&gt;
|p1_type=list|p1_name=src&lt;br /&gt;
|p2_type=integer|p2_name=start&lt;br /&gt;
|p3_type=integer|p3_name=end&lt;br /&gt;
|p4_type=integer|p4_name=stride&lt;br /&gt;
|func_footnote&lt;br /&gt;
|func_desc&lt;br /&gt;
|return_text=of all the entries in the [[List#Strided_lists|strided list]] whose index is a multiple of {{LSLP|stride}} in the range {{LSLP|start}} to {{LSLP|end}}.&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;list mylist = [0,1,2,3,4,5,6];&lt;br /&gt;
list result_a = llList2ListStrided(mylist,0,-1,2); //start at first item in list, go to the end, return every 2nd item&lt;br /&gt;
//result_a == [0,2,4,6]&lt;br /&gt;
&lt;br /&gt;
list result_b = llList2ListStrided(mylist,1,-1,2); //start at second item in list, go to the end, return every 2nd item&lt;br /&gt;
//result_b == [2,4,6]&lt;br /&gt;
&lt;br /&gt;
list result_c = llList2ListStrided(mylist,2,-1,2); //start at third item in list, go to the end, return every 2nd item&lt;br /&gt;
//result_c == [2,4,6]&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;list menu = [&amp;quot;1&amp;quot;, &amp;quot;one&amp;quot;, &amp;quot;2&amp;quot;, &amp;quot;two&amp;quot;, &amp;quot;3&amp;quot;, &amp;quot;three&amp;quot;];&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llListen(10, &amp;quot;&amp;quot;, llGetOwner(), &amp;quot;&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
    touch_start(integer detected)&lt;br /&gt;
    {&lt;br /&gt;
        list buttons = llList2ListStrided(menu, 0, -1, 2);&lt;br /&gt;
        llDialog(llDetectedKey(0), &amp;quot;choose a number&amp;quot;, buttons, 10);&lt;br /&gt;
    }&lt;br /&gt;
    listen(integer channel, string obj, key id, string message)&lt;br /&gt;
    {&lt;br /&gt;
        integer index = llListFindList(menu, [message]);&lt;br /&gt;
        if (index != -1)&lt;br /&gt;
        {&lt;br /&gt;
            llOwnerSay(&amp;quot;you chose &amp;quot; + llList2String(menu, index + 1) + &amp;quot; (&amp;quot; + message + &amp;quot;)&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|helpers&lt;br /&gt;
|also_functions=&lt;br /&gt;
{{LSL DefineRow||[[llList2ListSlice]]|}}&lt;br /&gt;
&lt;br /&gt;
|also_events&lt;br /&gt;
|also_tests&lt;br /&gt;
|also_articles&lt;br /&gt;
|notes= &lt;br /&gt;
=== Starting at an offset ===&lt;br /&gt;
If you want the items starting at index {{LSLP|start}} returned, rather than starting at the next multiple of {{LSLP|stride}}, use [[llList2ListSlice]] instead.&lt;br /&gt;
|permission&lt;br /&gt;
|negative_index&lt;br /&gt;
|haiku={{Haiku|Ah, the strided list.|C had structs in the &#039;70s.|Someday, we will, too...}}&lt;br /&gt;
|sort=List2ListStrided&lt;br /&gt;
|cat1=List&lt;br /&gt;
|cat2&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>MoiraAtropos Resident</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Fred_Gandt/Scripts/Functions&amp;diff=1215159</id>
		<title>User:Fred Gandt/Scripts/Functions</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Fred_Gandt/Scripts/Functions&amp;diff=1215159"/>
		<updated>2023-10-25T19:19:39Z</updated>

		<summary type="html">&lt;p&gt;MoiraAtropos Resident: /* StrideOfList */ Note: this functionality is no directly provided by llList2ListSlice.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{User:Fred Gandt/Template|content=&lt;br /&gt;
&lt;br /&gt;
== Functions ==&lt;br /&gt;
A collection of functions that perform defined actions. Things we can&#039;t use one [[:Category:LSL_Functions|Linden Library function]] to do.&lt;br /&gt;
&lt;br /&gt;
=== GetUniqueListEntries ===&lt;br /&gt;
Feed a list in and get out a list which contains no duplicate entries. Fast.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lsl2&amp;quot;&amp;gt;// V1 //&lt;br /&gt;
&lt;br /&gt;
list GetUniqueListEntries(list src)&lt;br /&gt;
{&lt;br /&gt;
    integer index = 0;&lt;br /&gt;
    list output = [];&lt;br /&gt;
    list entry = [];&lt;br /&gt;
    do&lt;br /&gt;
    {&lt;br /&gt;
        output += (entry = llList2List(src, 0, 0));&lt;br /&gt;
        src = llDeleteSubList(src, 0, 0);&lt;br /&gt;
        while((index = llListFindList(src, entry)) != -1)&lt;br /&gt;
        src = llDeleteSubList(src, index, index);&lt;br /&gt;
    }&lt;br /&gt;
    while(llGetListLength(src));&lt;br /&gt;
    return output;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Usage Example //&lt;br /&gt;
&lt;br /&gt;
list source = [&amp;quot;How&amp;quot;, &amp;quot;much&amp;quot;, &amp;quot;wood&amp;quot;, &amp;quot;would&amp;quot;, &amp;quot;a&amp;quot;, &amp;quot;woodchuck&amp;quot;, &amp;quot;chuck&amp;quot;, &amp;quot;if&amp;quot;, &amp;quot;a&amp;quot;, &amp;quot;woodchuck&amp;quot;, &amp;quot;could&amp;quot;, &amp;quot;chuck&amp;quot;, &amp;quot;wood&amp;quot;, &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;
        llOwnerSay(llDumpList2String(GetUniqueListEntries(source), &amp;quot;, &amp;quot;));&lt;br /&gt;
        // Return == &amp;quot;How, much, wood, would, a, woodchuck, chuck, if, could, ?&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== MultiListReplace ===&lt;br /&gt;
Replace entries in a list with other entries.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lsl2&amp;quot;&amp;gt;// V1 //&lt;br /&gt;
&lt;br /&gt;
list MultiListReplace(list src, list thisnthats)&lt;br /&gt;
{&lt;br /&gt;
    integer index = 0;&lt;br /&gt;
    integer lc = 0;&lt;br /&gt;
    integer ll = llGetListLength(thisnthats);&lt;br /&gt;
    do&lt;br /&gt;
    {&lt;br /&gt;
        list this = llList2List(thisnthats, lc, lc);&lt;br /&gt;
        ++lc;&lt;br /&gt;
        while((index = llListFindList(src, this)) != -1)&lt;br /&gt;
        src = llListReplaceList(src, llList2List(thisnthats, lc, lc), index, index);&lt;br /&gt;
    }&lt;br /&gt;
    while((++lc) &amp;lt; ll);&lt;br /&gt;
    return src;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Usage Example //&lt;br /&gt;
&lt;br /&gt;
list source = [&amp;quot;How&amp;quot;, &amp;quot;much&amp;quot;, &amp;quot;wood&amp;quot;, &amp;quot;would&amp;quot;, &amp;quot;a&amp;quot;, &amp;quot;woodchuck&amp;quot;, &amp;quot;chuck&amp;quot;, &amp;quot;if&amp;quot;, &amp;quot;a&amp;quot;, &amp;quot;woodchuck&amp;quot;, &amp;quot;could&amp;quot;, &amp;quot;chuck&amp;quot;, &amp;quot;wood&amp;quot;, &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;
        llOwnerSay(llDumpList2String(MultiListReplace(source, [&amp;quot;woodchuck&amp;quot;, &amp;quot;primrezzer&amp;quot;, &amp;quot;much&amp;quot;, &amp;quot;many&amp;quot;, &amp;quot;wood&amp;quot;, &amp;quot;prims&amp;quot;, &amp;quot;chuck&amp;quot;, &amp;quot;rez&amp;quot;]), &amp;quot;, &amp;quot;));&lt;br /&gt;
        // Return == &amp;quot;How, many, prims, would, a, primrezzer, rez, if, a, primrezzer, could, rez, prims, ?&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== MultiStringReplace ===&lt;br /&gt;
Replace parts of a string with other strings.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lsl2&amp;quot;&amp;gt;// V5 //&lt;br /&gt;
 &lt;br /&gt;
string MultiStringReplace(string src, list thisnthats)&lt;br /&gt;
{&lt;br /&gt;
    integer index = 0;&lt;br /&gt;
    integer lc = 0;&lt;br /&gt;
    integer ll = llGetListLength(thisnthats);&lt;br /&gt;
    do&lt;br /&gt;
    {&lt;br /&gt;
        string this = llList2String(thisnthats, lc);&lt;br /&gt;
        ++lc;&lt;br /&gt;
        while((index = llSubStringIndex(src, this)) != -1)&lt;br /&gt;
        src = llInsertString(llDeleteSubString(src, index, (index + (llStringLength(this) - 1))), index, llList2String(thisnthats, lc));&lt;br /&gt;
    }&lt;br /&gt;
    while((++lc) &amp;lt; ll);&lt;br /&gt;
    return src;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Usage Examples //&lt;br /&gt;
&lt;br /&gt;
string source = &amp;quot;How much wood would a woodchuck chuck if a woodchuck could chuck wood?&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llOwnerSay(MultiStringReplace(source, [&amp;quot;woodchuck&amp;quot;, &amp;quot;primrezzer&amp;quot;, &amp;quot;much&amp;quot;, &amp;quot;many&amp;quot;, &amp;quot;wood&amp;quot;, &amp;quot;prims&amp;quot;, &amp;quot;chuck&amp;quot;, &amp;quot;rez&amp;quot;]));&lt;br /&gt;
        // Return == &amp;quot;How many prims would a primrezzer rez if a primrezzer could rez prims?&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        llOwnerSay(MultiStringReplace(source, [&amp;quot;much&amp;quot;, &amp;quot;many&amp;quot;, &amp;quot;wood&amp;quot;, &amp;quot;prims&amp;quot;, &amp;quot;woodchuck&amp;quot;, &amp;quot;primrezzer&amp;quot;, &amp;quot;chuck&amp;quot;, &amp;quot;rez&amp;quot;]));&lt;br /&gt;
        // Return == &amp;quot;How many prims would a primsrez rez if a primsrez could rez prims?&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        llOwnerSay(MultiStringReplace(source, [&amp;quot;farmers&amp;quot;, &amp;quot;primrezzer&amp;quot;, &amp;quot;much&amp;quot;, &amp;quot;many&amp;quot;, &amp;quot;wood&amp;quot;, &amp;quot;prims&amp;quot;, &amp;quot;chuck&amp;quot;, &amp;quot;rez&amp;quot;]));&lt;br /&gt;
        // Return == &amp;quot;How many prims would a primsrez rez if a primsrez could rez prims?&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        llOwnerSay(MultiStringReplace(source, [&amp;quot;much&amp;quot;, &amp;quot;many&amp;quot;, &amp;quot;wood&amp;quot;, &amp;quot;prims&amp;quot;, &amp;quot;farmers&amp;quot;, &amp;quot;primrezzer&amp;quot;, &amp;quot;chuck&amp;quot;, &amp;quot;rez&amp;quot;]));&lt;br /&gt;
        // Return == &amp;quot;How many prims would a primsrez rez if a primsrez could rez prims?&amp;quot;&lt;br /&gt;
        &lt;br /&gt;
        llOwnerSay(MultiStringReplace(source, [&amp;quot;woodchuck&amp;quot;, &amp;quot;primrezzer&amp;quot;, &amp;quot;much&amp;quot;, &amp;quot;many&amp;quot;, &amp;quot;wood&amp;quot;, &amp;quot;prims&amp;quot;, &amp;quot;farmers&amp;quot;, &amp;quot;piggies&amp;quot;, &amp;quot;chuck&amp;quot;, &amp;quot;rez&amp;quot;]));&lt;br /&gt;
        // Return == &amp;quot;How many prims would a primrezzer rez if a primrezzer could rez prims?&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== StrideOfList ===&lt;br /&gt;
Get strided entries from a list. Note: this functionality is no directly provided by [[llList2ListSlice]].&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lsl2&amp;quot;&amp;gt;// V2 //&lt;br /&gt;
&lt;br /&gt;
list StrideOfList(list src, integer stride, integer start, integer end)&lt;br /&gt;
{&lt;br /&gt;
    list l = [];&lt;br /&gt;
    integer ll = llGetListLength(src);&lt;br /&gt;
    if(start &amp;lt; 0)start += ll;&lt;br /&gt;
    if(end &amp;lt; 0)end += ll;&lt;br /&gt;
    if(end &amp;lt; start) return llList2List(src, start, start);&lt;br /&gt;
    while(start &amp;lt;= end)&lt;br /&gt;
    {&lt;br /&gt;
        l += llList2List(src, start, start);&lt;br /&gt;
        start += stride;&lt;br /&gt;
    }&lt;br /&gt;
    return l;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Usage Examples //&lt;br /&gt;
&lt;br /&gt;
list source = [&amp;quot;How&amp;quot;, &amp;quot;much&amp;quot;, &amp;quot;wood&amp;quot;, &amp;quot;would&amp;quot;, &amp;quot;a&amp;quot;, &amp;quot;woodchuck&amp;quot;, &amp;quot;chuck&amp;quot;, &amp;quot;if&amp;quot;, &amp;quot;a&amp;quot;, &amp;quot;woodchuck&amp;quot;, &amp;quot;could&amp;quot;, &amp;quot;chuck&amp;quot;, &amp;quot;wood?&amp;quot;];&lt;br /&gt;
 &lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llOwnerSay(llDumpList2String(StrideOfList(source, 1, 0, -1), &amp;quot;, &amp;quot;));&lt;br /&gt;
        // Return == &amp;quot;How, much, wood, would, a, woodchuck, chuck, if, a, woodchuck, could, chuck, wood?&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
        llOwnerSay(llDumpList2String(StrideOfList(source, 2, 0, -2), &amp;quot;, &amp;quot;));&lt;br /&gt;
        // Return == &amp;quot;How, wood, a, chuck, a, could&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
        llOwnerSay(llDumpList2String(StrideOfList(source, 4, 3, -1), &amp;quot;, &amp;quot;));&lt;br /&gt;
        // Return == &amp;quot;would, if, chuck&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
        llOwnerSay(llDumpList2String(StrideOfList(source, 5, 3, -4), &amp;quot;, &amp;quot;));&lt;br /&gt;
        // Return == &amp;quot;would, a&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
        llOwnerSay(llDumpList2String(StrideOfList(source, 3, -10, -7), &amp;quot;, &amp;quot;));&lt;br /&gt;
        // Return == &amp;quot;would, chuck&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
        llOwnerSay(llDumpList2String(StrideOfList(source, 3, 7, -7), &amp;quot;, &amp;quot;)); // Start index is closer to end than end index (whoops).&lt;br /&gt;
        // Return == &amp;quot;if&amp;quot;                                                    // Start is returned only.&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Capitalization Functions ===&lt;br /&gt;
==== ToNormal ====&lt;br /&gt;
&lt;br /&gt;
Returns a string that holds true to a few simple rules.&lt;br /&gt;
*First person reference &amp;quot;I&amp;quot; is capitalized.&lt;br /&gt;
*Specified names are capitalized.&lt;br /&gt;
*The first word of each &#039;&#039;proper&#039;&#039; sentence is capitalized.&lt;br /&gt;
:*This includes quotes. E.g. &amp;quot;Time is an illusion; Lunchtime, doubly so.&amp;quot; - [http://en.wikipedia.org/wiki/Douglas_Adams Douglas Adams]&lt;br /&gt;
:*Also new lines (see examples below).&lt;br /&gt;
I would imagine the results will be a mess if the source is not neatly written. I&#039;ll work on improving it as time goes on (it&#039;s a start).&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lsl2&amp;quot;&amp;gt;// V4 //&lt;br /&gt;
&lt;br /&gt;
string ToNormal(string src, list names)&lt;br /&gt;
{&lt;br /&gt;
    list abc = [&amp;quot;a&amp;quot;,&amp;quot;b&amp;quot;,&amp;quot;c&amp;quot;,&amp;quot;d&amp;quot;,&amp;quot;e&amp;quot;,&amp;quot;f&amp;quot;,&amp;quot;g&amp;quot;,&amp;quot;h&amp;quot;,&amp;quot;i&amp;quot;,&amp;quot;j&amp;quot;,&amp;quot;k&amp;quot;,&amp;quot;l&amp;quot;,&amp;quot;m&amp;quot;, // The script needs to know what a letter is.&lt;br /&gt;
                &amp;quot;n&amp;quot;,&amp;quot;o&amp;quot;,&amp;quot;p&amp;quot;,&amp;quot;q&amp;quot;,&amp;quot;r&amp;quot;,&amp;quot;s&amp;quot;,&amp;quot;t&amp;quot;,&amp;quot;u&amp;quot;,&amp;quot;v&amp;quot;,&amp;quot;w&amp;quot;,&amp;quot;x&amp;quot;,&amp;quot;y&amp;quot;,&amp;quot;z&amp;quot;];&lt;br /&gt;
    list punc = [&amp;quot;. &amp;quot;,&amp;quot;; &amp;quot;,&amp;quot;? &amp;quot;,&amp;quot;! &amp;quot;, &amp;quot; \&amp;quot;&amp;quot;,&amp;quot;\n&amp;quot;]; // Punctuation we create a new sentance after.&lt;br /&gt;
    src = llToLower(&amp;quot; &amp;quot; + src + &amp;quot; &amp;quot;);&lt;br /&gt;
    string result = &amp;quot;&amp;quot;;&lt;br /&gt;
    integer index = 0;&lt;br /&gt;
    integer lc = 0;&lt;br /&gt;
    integer ll = 0;&lt;br /&gt;
    string ko = &amp;quot;&amp;quot;;&lt;br /&gt;
    if((ll = llGetListLength(names)))&lt;br /&gt;
    {&lt;br /&gt;
        do&lt;br /&gt;
        {&lt;br /&gt;
            string name = llToLower(llList2String(names, lc));&lt;br /&gt;
            while((index = llSubStringIndex(src, name)) != -1)&lt;br /&gt;
            src = llInsertString(llDeleteSubString(src, index, (index + (llStringLength(name) - 1))),&lt;br /&gt;
                                 index, llList2String(names, lc));&lt;br /&gt;
        }&lt;br /&gt;
        while((++lc) &amp;lt; ll);&lt;br /&gt;
        index = 0;&lt;br /&gt;
    }&lt;br /&gt;
    while((index = llSubStringIndex(src, &amp;quot;i&amp;quot;)) != -1)&lt;br /&gt;
    {&lt;br /&gt;
        if(ko == &amp;quot;&amp;quot;)&lt;br /&gt;
        ko = llGetSubString(src, 0, (index - 1));&lt;br /&gt;
        if((llListFindList(abc, [llGetSubString(src, (index - 1), (index - 1))]) == -1)&lt;br /&gt;
        &amp;amp;&amp;amp; (llListFindList(abc, [llGetSubString(src, (index + 1), (index + 1))]) == -1))&lt;br /&gt;
        {&lt;br /&gt;
            src = llDeleteSubString(src, index, index);&lt;br /&gt;
            result += (&amp;quot;I&amp;quot; + llGetSubString(src, index, (llSubStringIndex(src, &amp;quot;i&amp;quot;) - 1)));&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            src = llDeleteSubString(src, index, index);&lt;br /&gt;
            result += (&amp;quot;i&amp;quot; + llGetSubString(src, index, (llSubStringIndex(src, &amp;quot;i&amp;quot;) - 1)));&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
    names = llParseString2List(llStringTrim((result = (ko + result)), STRING_TRIM), [], punc); // Reusing variable to save bytes.&lt;br /&gt;
    lc = 0;&lt;br /&gt;
    index = -1;&lt;br /&gt;
    ll = llGetListLength(names);&lt;br /&gt;
    string ABC = llToUpper(llDumpList2String(abc, &amp;quot;&amp;quot;));&lt;br /&gt;
    do&lt;br /&gt;
    {&lt;br /&gt;
        string entry = llList2String(names, lc);&lt;br /&gt;
        do&lt;br /&gt;
        {&lt;br /&gt;
            ++index;&lt;br /&gt;
            result = llToUpper(llGetSubString(entry, index, index));&lt;br /&gt;
        }&lt;br /&gt;
        while(llSubStringIndex(ABC, result) == -1);&lt;br /&gt;
        names = llListReplaceList(names, [llInsertString(llDeleteSubString(entry, index, index), index, result)], lc, lc);&lt;br /&gt;
        index = -1;&lt;br /&gt;
    }&lt;br /&gt;
    while((++lc) &amp;lt; ll);&lt;br /&gt;
    return llDumpList2String(names, &amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Usage Example //&lt;br /&gt;
 &lt;br /&gt;
//string source = &amp;quot;I can&#039;t help but wonder; \&amp;quot;What time should I and Sally arrive for dinner\&amp;quot;? For some reason, I like Tori Amos!! Should I?&amp;quot;;&lt;br /&gt;
&lt;br /&gt;
string source = &amp;quot;Confessions of a cigar smoker&lt;br /&gt;
&lt;br /&gt;
I owe to smoking, more or less,&lt;br /&gt;
Through life the whole of my success;&lt;br /&gt;
With my Cigar I&#039;m sage and wise -&lt;br /&gt;
Without, I&#039;m dull as cloudy skies.&lt;br /&gt;
When smoking all my ideas soar,&lt;br /&gt;
When not, they sink upon the floor.&lt;br /&gt;
The greatest men have all been smokers,&lt;br /&gt;
And so were all the greatest jokers.&lt;br /&gt;
Then ye who&#039;d bid adieu to care,&lt;br /&gt;
Come here and smoke it into air.&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        source = llToUpper(source); // For whatever reason...&lt;br /&gt;
&lt;br /&gt;
        llOwnerSay(ToNormal(source, []));&lt;br /&gt;
        &lt;br /&gt;
        // OR (depending on source)&lt;br /&gt;
        &lt;br /&gt;
        //llOwnerSay(ToNormal(source, [&amp;quot;Sally&amp;quot;, &amp;quot;Tori Amos&amp;quot;]));&lt;br /&gt;
&lt;br /&gt;
// Return == &amp;quot;I can&#039;t help but wonder; &amp;quot;What time should I and Sally arrive for dinner&amp;quot;? For some reason, I like Tori Amos!! Should I?&amp;quot;&lt;br /&gt;
&lt;br /&gt;
// OR (depending on source)&lt;br /&gt;
&lt;br /&gt;
// Return == &amp;quot;Confessions of a cigar smoker&lt;br /&gt;
&lt;br /&gt;
            //I owe to smoking, more or less,&lt;br /&gt;
            //Through life the whole of my success;&lt;br /&gt;
            //With my cigar I&#039;m sage and wise -&lt;br /&gt;
            //Without, I&#039;m dull as cloudy skies.&lt;br /&gt;
            //When smoking all my ideas soar,&lt;br /&gt;
            //When not, they sink upon the floor.&lt;br /&gt;
            //The greatest men have all been smokers,&lt;br /&gt;
            //And so were all the greatest jokers.&lt;br /&gt;
            //Then ye who&#039;d bid adieu to care,&lt;br /&gt;
            //Come here and smoke it into air.&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== ToTitle ====&lt;br /&gt;
Returns a string with ALL first letters of ALL words capitalized.&lt;br /&gt;
A slower (source length being equal) function than [[#ToNormal|ToNormal]] but &#039;&#039;possibly&#039;&#039; more reliable.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lsl2&amp;quot;&amp;gt;// V2 //&lt;br /&gt;
 &lt;br /&gt;
string ToTitle(string src)&lt;br /&gt;
{&lt;br /&gt;
    list words = llParseString2List(llToLower(src), [], [&amp;quot;.&amp;quot;,&amp;quot;;&amp;quot;,&amp;quot;?&amp;quot;,&amp;quot;!&amp;quot;,&amp;quot;\&amp;quot;&amp;quot;,&amp;quot; &amp;quot;,&amp;quot;\n&amp;quot;]);&lt;br /&gt;
    integer ll = llGetListLength(words);&lt;br /&gt;
    integer lc = -1;&lt;br /&gt;
    string word = &amp;quot;&amp;quot;;&lt;br /&gt;
    while((++lc) &amp;lt; ll)&lt;br /&gt;
    {&lt;br /&gt;
        string cap = llToUpper(llGetSubString((word = llList2String(words, lc)), 0, 0));&lt;br /&gt;
        words = llListReplaceList(words, [(cap + llDeleteSubString(word, 0, 0))], lc, lc);&lt;br /&gt;
    }&lt;br /&gt;
    return llDumpList2String(words, &amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
 &lt;br /&gt;
// Usage Example //&lt;br /&gt;
 &lt;br /&gt;
string source = &amp;quot;I can&#039;t help but wonder; \&amp;quot;What time should I and Sally arrive for dinner\&amp;quot;? For some reason, I like Tori Amos!! Should I?&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
//string source = &amp;quot;Confessions of a cigar smoker&lt;br /&gt;
//&lt;br /&gt;
//I owe to smoking, more or less,&lt;br /&gt;
//Through life the whole of my success;&lt;br /&gt;
//With my Cigar I&#039;m sage and wise -&lt;br /&gt;
//Without, I&#039;m dull as cloudy skies.&lt;br /&gt;
//When smoking all my ideas soar,&lt;br /&gt;
//When not, they sink upon the floor.&lt;br /&gt;
//The greatest men have all been smokers,&lt;br /&gt;
//And so were all the greatest jokers.&lt;br /&gt;
//Then ye who&#039;d bid adieu to care,&lt;br /&gt;
//Come here and smoke it into air.&amp;quot;;&lt;br /&gt;
 &lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        source = llToUpper(source); // For whatever reason...&lt;br /&gt;
 &lt;br /&gt;
        llOwnerSay(ToTitle(source));&lt;br /&gt;
 &lt;br /&gt;
// Return == &amp;quot;I Can&#039;t Help But Wonder; &amp;quot;What Time Should I And Sally Arrive For Dinner&amp;quot;? For Some Reason, I Like Tori Amos!! Should I?&amp;quot;&lt;br /&gt;
 &lt;br /&gt;
// OR (depending on source)&lt;br /&gt;
 &lt;br /&gt;
// Return == &amp;quot;Confessions Of A Cigar Smoker&lt;br /&gt;
 &lt;br /&gt;
            //I Owe To Smoking, More Or Less,&lt;br /&gt;
            //Through Life The Whole Of My Success;&lt;br /&gt;
            //With My Cigar I&#039;m Sage And Wise -&lt;br /&gt;
            //Without, I&#039;m Dull As Cloudy Skies.&lt;br /&gt;
            //When Smoking All My Ideas Soar,&lt;br /&gt;
            //When Not, They Sink Upon The Floor.&lt;br /&gt;
            //The Greatest Men Have All Been Smokers,&lt;br /&gt;
            //And So Were All The Greatest Jokers.&lt;br /&gt;
            //Then Ye Who&#039;d Bid Adieu To Care,&lt;br /&gt;
            //Come Here And Smoke It Into Air.&amp;quot;&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/syntaxhighlight&amp;gt;}}&lt;/div&gt;</summary>
		<author><name>MoiraAtropos Resident</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LSL_Operators&amp;diff=1215145</id>
		<title>LSL Operators</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LSL_Operators&amp;diff=1215145"/>
		<updated>2023-10-20T16:39:36Z</updated>

		<summary type="html">&lt;p&gt;MoiraAtropos Resident: /* Useful Snippets */ Concatenation by list casting&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header|ml=*}}{{LSLC|FixMe}}&amp;lt;!-- This article is woefully incomplete, it needs more Operator tables --&amp;gt;&lt;br /&gt;
Operators are used to cause an operation (or mathematical action) to be performed on one (such as !) or two operands. The easy and common example is 1 + 2 where 1 and 2 are operands, and the &#039;&#039;&#039;+&#039;&#039;&#039; is the operator. This concept can be extended much further with LSL since operands can be variables with the special case of the assignment operators requiring that the left hand side be a variable.&lt;br /&gt;
&lt;br /&gt;
The following table lists the operators in descending order of evaluation, i.e. higher in the table means higher evaluation precedence. Multiple operators on the same line share evaluation precedence. Parenthesize an expression if you need to force an evaluation order.&lt;br /&gt;
&lt;br /&gt;
{| bgcolor=&amp;quot;#FFFFFF&amp;quot; border=&amp;quot;1&amp;quot;  cellspacing=&amp;quot;2&amp;quot; cellpadding=&amp;quot;6&amp;quot;&lt;br /&gt;
|- bgColor=&amp;quot;#A7C1F2&amp;quot;&lt;br /&gt;
! Operator&lt;br /&gt;
! Description&lt;br /&gt;
! Usage Example&lt;br /&gt;
|- &lt;br /&gt;
| &amp;lt;code&amp;gt;()&amp;lt;/code&amp;gt;&lt;br /&gt;
|| parentheses: grouping and evaluation precedence&lt;br /&gt;
|| &amp;lt;code&amp;gt;integer val = a * (b + c);&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;[]&amp;lt;/code&amp;gt;&lt;br /&gt;
|| brackets: list constructor&lt;br /&gt;
|| &amp;lt;code&amp;gt;list lst = [a, 2, &amp;quot;this&amp;quot;, 0.01];&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;(&#039;&#039;type&#039;&#039;)&amp;lt;/code&amp;gt;&lt;br /&gt;
|| typecasting&lt;br /&gt;
|| &amp;lt;code&amp;gt;string message = &amp;quot;The result is:&amp;quot; + (string)result;&amp;lt;/code&amp;gt;&lt;br /&gt;
|- &lt;br /&gt;
| &amp;lt;code&amp;gt;!&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;~&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;++&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt;&lt;br /&gt;
|| logical NOT, bitwise NOT, increment, decrement&lt;br /&gt;
|| &amp;lt;code&amp;gt;counter++;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;*&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;/&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;&lt;br /&gt;
|| multiply/dot product, divide, modulus/cross product&lt;br /&gt;
|| &amp;lt;code&amp;gt;integer rollover = (count + 1) % 5;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;-&amp;lt;/code&amp;gt;&lt;br /&gt;
|| subtraction, negation&lt;br /&gt;
|| &amp;lt;code&amp;gt;integer one = 3 - 2;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;integer neg_one = -1;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;&lt;br /&gt;
|| addition, string concatenation&lt;br /&gt;
|| &amp;lt;code&amp;gt;integer two = 1 + 1;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;string text = &amp;quot;Hello&amp;quot; + &amp;quot; world&amp;quot;;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;+&amp;lt;/code&amp;gt;&lt;br /&gt;
|| list concatenation&lt;br /&gt;
|| &amp;lt;code&amp;gt;list myList = [1, 2, 3] + [4, 5];&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;list newList = oldList + addList;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;amp;lt;&amp;amp;lt;&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;&amp;amp;gt;&amp;amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|| [https://en.wikipedia.org/wiki/Arithmetic_shift arithmetic] left shift, [https://en.wikipedia.org/wiki/Arithmetic_shift arithmetic] right shift&lt;br /&gt;
|| &amp;lt;code&amp;gt;integer eight = 4 &amp;amp;lt;&amp;amp;lt; 1;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;integer neg_one = -2 &amp;amp;gt;&amp;amp;gt; 1;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;amp;lt;&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;&amp;amp;lt;=&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;&amp;amp;gt;&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;&amp;amp;gt;=&amp;lt;/code&amp;gt;&lt;br /&gt;
|| less than, less than or equal to, greater than, greater than or equal to&lt;br /&gt;
|| &amp;lt;code&amp;gt;integer isFalse = (6 &amp;amp;lt;= 4);&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;==&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;!=&amp;lt;/code&amp;gt;&lt;br /&gt;
|| comparison: equal, not equal&lt;br /&gt;
|| &amp;lt;code&amp;gt;integer isFalse = (&amp;quot;this&amp;quot; == &amp;quot;that&amp;quot;);&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;amp;&amp;lt;/code&amp;gt;&lt;br /&gt;
|| bitwise AND&lt;br /&gt;
|| &amp;lt;code&amp;gt;integer zero = 4 &amp;amp; 2;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;integer four = 4 &amp;amp; 4;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;^&amp;lt;/code&amp;gt;&lt;br /&gt;
|| bitwise XOR&lt;br /&gt;
|| &amp;lt;code&amp;gt;integer zero = 4 ^ 4;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;integer six = 4 ^ 2;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|| bitwise OR&lt;br /&gt;
|| &amp;lt;code&amp;gt;integer four = 4 &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; 4;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;integer six = 4 &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; 2;&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;lt;nowiki&amp;gt;||&amp;lt;/nowiki&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
|| logical OR&lt;br /&gt;
|| &amp;lt;code&amp;gt;integer isTrue = (FALSE &amp;lt;nowiki&amp;gt;||&amp;lt;/nowiki&amp;gt; TRUE);&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;&amp;amp;&amp;amp;&amp;lt;/code&amp;gt;&lt;br /&gt;
|| logical AND&lt;br /&gt;
|| &amp;lt;code&amp;gt;integer isFalse = (FALSE &amp;amp;&amp;amp; TRUE);&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| &amp;lt;code&amp;gt;=&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;+=&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;-=&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;*=&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;/=&amp;lt;/code&amp;gt; &amp;lt;code&amp;gt;%=&amp;lt;/code&amp;gt;&lt;br /&gt;
|| assignment&lt;br /&gt;
|| &amp;lt;code&amp;gt;integer four = 4;&amp;lt;/code&amp;gt;&lt;br /&gt;
&amp;lt;code&amp;gt;integer eight = four; eight *= 2;&amp;lt;/code&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Modulus (&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt;), like division, cause a &#039;&#039;Script run-time error. Math Error&#039;&#039; when its second operand equals zero.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; The &amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt; operator only accepts integer (&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt; as modulus) and vector (&amp;lt;code&amp;gt;%&amp;lt;/code&amp;gt; as cross product) operands.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Unlike most other languages that use the C-style &amp;lt;code&amp;gt;&amp;amp;&amp;amp;&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;||&amp;lt;/code&amp;gt; operators, &#039;&#039;&#039;both&#039;&#039;&#039; operands are &#039;&#039;&#039;always&#039;&#039;&#039; evaluated.  For example,&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lsl2&amp;quot;&amp;gt;if (TRUE || 1/0) llSay(PUBLIC_CHANNEL, &amp;quot;Aha!&amp;quot;);&amp;lt;/syntaxhighlight&amp;gt; &lt;br /&gt;
&lt;br /&gt;
: will cause a Math Error rather than say &amp;quot;Aha!&amp;quot;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; The &amp;lt;code&amp;gt;++&amp;lt;/code&amp;gt; (increment) and &amp;lt;code&amp;gt;--&amp;lt;/code&amp;gt; (decrement) operators have two versions, pre- and post-. The &#039;&#039;pre&#039;&#039;-increment (or &#039;&#039;pre&#039;&#039;-decrement) operator increments (or decrements) its operand by 1; the value of the expression is the incremented (or decremented) value. The &#039;&#039;post&#039;&#039;-increment (or &#039;&#039;post&#039;&#039;-decrement) operator increases (or decreases) the value of its operand by 1, but the value of the expression is the operand&#039;s original value &#039;&#039;prior&#039;&#039; to the operation.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lsl2&amp;quot;&amp;gt;integer count = 0;&lt;br /&gt;
if( ++count == 1 ) // &#039;count&#039; is incremented then evaluated.&lt;br /&gt;
    llSay(PUBLIC_CHANNEL, &amp;quot;Aha&amp;quot;); // message will be said.&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lsl2&amp;quot;&amp;gt;integer count = 0;&lt;br /&gt;
if( count++ == 1 ) // &#039;count&#039; is evaluated then incremented.&lt;br /&gt;
    llSay(PUBLIC_CHANNEL, &amp;quot;Aha&amp;quot;); // message will not be said.&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; The order of precedence of boolean operators is unclear. It is possible that there is a [http://jira.secondlife.com/browse/SVC-779 bug] in the expression parser, making precedence inconsistent, or it may simply be that &#039;&#039;&#039;||&#039;&#039;&#039; and &#039;&#039;&#039;&amp;amp;&amp;amp;&#039;&#039;&#039; have equal precedence; testing is inconclusive. Thus, when in doubt, parenthesize.&lt;br /&gt;
&#039;&#039;&#039;SubNote:&#039;&#039;&#039; As the above bug has been closed as expected behavior, one can only assume the boolean operators have equal precedence.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; The order of evaluation appears to be backwards from most languages.  If the value of x starts as 1 then the first two conditions below evaluate false and the second two evaluate true:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lsl2&amp;quot;&amp;gt;(x &amp;amp;&amp;amp; (x = 0) == 0 &amp;amp;&amp;amp; x)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lsl2&amp;quot;&amp;gt;(x &amp;amp;&amp;amp; (x = 0) == 0 &amp;amp;&amp;amp; x == 0)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lsl2&amp;quot;&amp;gt;(x == 0 &amp;amp;&amp;amp; (x = 0) == 0)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lsl2&amp;quot;&amp;gt;(x == 0 &amp;amp;&amp;amp; (x = 0) == 0 &amp;amp;&amp;amp; x)&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Both sides are evaluated regardless of the the truth of either side.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Equality test on lists does not compare contents, only the length.&lt;br /&gt;
{| {{Prettytable}}&lt;br /&gt;
|+&lt;br /&gt;
==+ Operator==&lt;br /&gt;
&amp;lt;code&amp;gt;result = left + right&amp;lt;/code&amp;gt;&lt;br /&gt;
|-{{Hl2}}&lt;br /&gt;
!Left Type&lt;br /&gt;
!Right Type&lt;br /&gt;
!Result Type&lt;br /&gt;
!Description&lt;br /&gt;
|-&lt;br /&gt;
|integer&lt;br /&gt;
|integer&lt;br /&gt;
|integer&lt;br /&gt;
|Adds &#039;&#039;&#039;left&#039;&#039;&#039; and &#039;&#039;&#039;right&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|integer&lt;br /&gt;
|float&lt;br /&gt;
|float&lt;br /&gt;
|Adds &#039;&#039;&#039;left&#039;&#039;&#039; and &#039;&#039;&#039;right&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|float&lt;br /&gt;
|integer&lt;br /&gt;
|float&lt;br /&gt;
|Adds &#039;&#039;&#039;left&#039;&#039;&#039; and &#039;&#039;&#039;right&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|string&lt;br /&gt;
|string&lt;br /&gt;
|string&lt;br /&gt;
|Concatenates &#039;&#039;&#039;right&#039;&#039;&#039; onto the end of &#039;&#039;&#039;left&#039;&#039;&#039;.&lt;br /&gt;
|-&lt;br /&gt;
|list&lt;br /&gt;
|*&lt;br /&gt;
|list&lt;br /&gt;
|Concatenates &#039;&#039;&#039;right&#039;&#039;&#039; onto the end of &#039;&#039;&#039;left&#039;&#039;&#039;.&lt;br /&gt;
|-&lt;br /&gt;
|*&lt;br /&gt;
|list&lt;br /&gt;
|list&lt;br /&gt;
|Affixes &#039;&#039;&#039;left&#039;&#039;&#039; onto the start of &#039;&#039;&#039;right&#039;&#039;&#039;.&lt;br /&gt;
|-&lt;br /&gt;
|vector&lt;br /&gt;
|vector&lt;br /&gt;
|vector&lt;br /&gt;
|Adds &#039;&#039;&#039;left&#039;&#039;&#039; and &#039;&#039;&#039;right&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|rotation&lt;br /&gt;
|rotation&lt;br /&gt;
|rotation&lt;br /&gt;
|Adds &#039;&#039;&#039;left&#039;&#039;&#039; and &#039;&#039;&#039;right&#039;&#039;&#039;&amp;lt;br/&amp;gt;Not useful for combining rotations, use [[#* Operator|*]] or [[#/ Operator|/]] instead.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| {{Prettytable}}&lt;br /&gt;
|+&lt;br /&gt;
==Shorthand Operators==&lt;br /&gt;
Alternatives to the simple &#039;=&#039; operator...&lt;br /&gt;
|-{{Hl2}}&lt;br /&gt;
!Simple assignment operator&lt;br /&gt;
!Shorthand operator&lt;br /&gt;
|-&lt;br /&gt;
|a = a + 1&lt;br /&gt;
|a += 1&lt;br /&gt;
|-&lt;br /&gt;
|a = a – 1&lt;br /&gt;
|a -= 1&lt;br /&gt;
|-&lt;br /&gt;
|a = a * (n+1)&lt;br /&gt;
|a *= (n+1)&lt;br /&gt;
|-&lt;br /&gt;
|a = a / (n+1)&lt;br /&gt;
|a /= (n+1)&lt;br /&gt;
|-&lt;br /&gt;
|a = a % b&lt;br /&gt;
|a %= b&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=={{Wikipedia|De Morgan&#039;s laws|w=n}}==&lt;br /&gt;
{| {{Prettytable|style=margin-top:0; float:left;}}&lt;br /&gt;
|+ Bitwise Equivalencies&lt;br /&gt;
!AND&lt;br /&gt;
!OR&lt;br /&gt;
|-&lt;br /&gt;
|| &amp;lt;code&amp;gt;~(a &amp;amp; b)&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;~a &amp;amp;#124; ~b&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|| &amp;lt;code&amp;gt;~a &amp;amp; ~b&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;~(a &amp;amp;#124; b)&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|| &amp;lt;code&amp;gt;a &amp;amp; ~b&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;~(~a &amp;amp;#124; b)&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|| &amp;lt;code&amp;gt;~(a &amp;amp; ~b)&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;~a &amp;amp;#124; b&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
{| {{Prettytable|style=margin-top:0; float:left;}}&lt;br /&gt;
|+ Boolean Equivalencies&lt;br /&gt;
!AND&lt;br /&gt;
!OR&lt;br /&gt;
|-&lt;br /&gt;
|| &amp;lt;code&amp;gt;!(a &amp;amp;&amp;amp; b)&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;!a &amp;amp;#124;&amp;amp;#124; !b&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|| &amp;lt;code&amp;gt;!a &amp;amp;&amp;amp; !b&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;!(a &amp;amp;#124;&amp;amp;#124; b)&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot; |&lt;br /&gt;
|-&lt;br /&gt;
|| &amp;lt;code&amp;gt;a &amp;amp;&amp;amp; !b&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;!(!a &amp;amp;#124;&amp;amp;#124; b)&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|| &amp;lt;code&amp;gt;!(a &amp;amp;&amp;amp; !b)&amp;lt;/code&amp;gt; || &amp;lt;code&amp;gt;!a &amp;amp;#124;&amp;amp;#124; b&amp;lt;/code&amp;gt;&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
Due to {{Wikipedia|De Morgan&#039;s laws|w=n}}, by row, code in the &#039;&#039;&#039;AND&#039;&#039;&#039; column is logically equivalent to code in the &#039;&#039;&#039;OR&#039;&#039;&#039;. &#039;&#039;&#039;a&#039;&#039;&#039; and &#039;&#039;&#039;b&#039;&#039;&#039; need not be variables, they can be expressions. In certain circumstances these equivalencies can be used to simplify complex code. It is important not to confuse the two sets when using them. The first two rows depict De Morgan&#039;s laws as it is formulated, the second two build upon it.&lt;br /&gt;
&lt;br /&gt;
{{LSLC|}}{{LSLC|Syntax}}{{LSLC|Keywords}}&lt;br /&gt;
&lt;br /&gt;
== Useful Snippets ==&lt;br /&gt;
&lt;br /&gt;
Typecasting can also be used if you have to concatenate many parts into a string:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lsl2&amp;quot;&amp;gt;// the following twp statements are equivalent:&lt;br /&gt;
string message1 = (string)[&amp;quot;I have &amp;quot;, 5, &amp;quot; children at the average age of &amp;quot;, 8.2, &amp;quot; years&amp;quot;];&lt;br /&gt;
string message2 = &amp;quot;I have 5 children at the average age of 8.2000001 years&amp;quot;;&amp;lt;/syntaxhighlight&amp;gt;&lt;/div&gt;</summary>
		<author><name>MoiraAtropos Resident</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlListFindStrided&amp;diff=1214685</id>
		<title>LlListFindStrided</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlListFindStrided&amp;diff=1214685"/>
		<updated>2023-09-26T21:04:58Z</updated>

		<summary type="html">&lt;p&gt;MoiraAtropos Resident: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function&lt;br /&gt;
|func=llListFindStrided&lt;br /&gt;
|func_id=201|func_sleep=0.0|func_energy=10.0&lt;br /&gt;
|return_type=integer&lt;br /&gt;
|Return_text=index of the first instance of {{LSLP|test}} in {{LSLP|src}} matching conditions.&lt;br /&gt;
|p1_type=list|p1_name=src|p1_desc=what to search in (haystack)&lt;br /&gt;
|p2_type=list|p2_name=test|p2_desc=what to search for (needle)&lt;br /&gt;
|p3_type=integer|p3_name=start|p3_desc=Start of range to search&lt;br /&gt;
|p4_type=integer|p4_name=end|p4_desc=End of range to search&lt;br /&gt;
|p5_type=integer|p5_name=stride|p5_desc=Number of entries per stride within src&lt;br /&gt;
&lt;br /&gt;
|func_footnote=If {{LSLP|test}} matching range and stride conditions is not found in {{LSLP|src}}, -1 is returned.&amp;lt;br/&amp;gt;&lt;br /&gt;
The length of {{LSLP|test}} may be equal to or less than {{LSLP|stride}} in order to generate a match.&amp;lt;br/&amp;gt;&lt;br /&gt;
The index of the first entry in the list is {{HoverText|0|zero}}&amp;lt;br&amp;gt;&lt;br /&gt;
If {{LSLP|test}} is found at the last index in {{LSLP|src}} the positive index is returned (5th entry of 5 returns 4).&amp;lt;br&amp;gt;&lt;br /&gt;
If {{LSLP|start}} or {{LSLP|end}} is negative, it is counted from the end list. The last element in the list is -1, the first is -list_length &lt;br /&gt;
|func_desc&lt;br /&gt;
|spec&lt;br /&gt;
|caveats=&lt;br /&gt;
* Strict type matching and case sensitivity is enforced.&lt;br /&gt;
** &amp;quot;1&amp;quot; != 1&lt;br /&gt;
** &amp;quot;1.0&amp;quot; != 1.0&lt;br /&gt;
** 1 != 1.0&lt;br /&gt;
** &amp;quot;a822ff2b-ff02-461d-b45d-dcd10a2de0c2&amp;quot; != (key)&amp;quot;a822ff2b-ff02-461d-b45d-dcd10a2de0c2&amp;quot;&lt;br /&gt;
** &amp;quot;Justice&amp;quot; != &amp;quot;justice&amp;quot;&lt;br /&gt;
* If {{LSLP|test}} is an {{HoverText|empty list|[]}} the value returned is {{HoverText|0|zero}} rather than -1.&lt;br /&gt;
|constants&lt;br /&gt;
|examples=&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;list mylist = [&amp;quot;a&amp;quot;,0,&amp;quot;b&amp;quot;,1,&amp;quot;c&amp;quot;,2,&amp;quot;b&amp;quot;,1];&lt;br /&gt;
&lt;br /&gt;
integer result_a = llListFindStrided(mylist, [&amp;quot;b&amp;quot;], 0, -1, 1); //Stride 1 full range functionally equivalent to llListFindList(mylist,&amp;quot;b&amp;quot;);&lt;br /&gt;
//result_a = 2&lt;br /&gt;
&lt;br /&gt;
integer result_b = llListFindStrided(mylist, [&amp;quot;b&amp;quot;,1], 2, -1, 1); //Inclusive range for start and end will find 2nd list in list&lt;br /&gt;
//result_b = 2&lt;br /&gt;
&lt;br /&gt;
integer result_e = llListFindStrided(mylist, [&amp;quot;b&amp;quot;], 3, -1, 1); //The first &amp;quot;b&amp;quot; is at index 2 and will be skipped by starting at 3&lt;br /&gt;
//result_c = 6&lt;br /&gt;
&lt;br /&gt;
integer result_d = llListFindStrided(mylist, [&amp;quot;b&amp;quot;,1], 2, -1, 1); //Inclusive range for start and end will find 2nd item in list&lt;br /&gt;
//result_d = 2&lt;br /&gt;
&lt;br /&gt;
integer result_e = llListFindStrided(mylist, [&amp;quot;b&amp;quot;,1], 3, -1, 1); //The first &amp;quot;b&amp;quot;,1 series is at index 2 and will be skipped by starting at 3&lt;br /&gt;
//result_e = 6&lt;br /&gt;
&lt;br /&gt;
integer result_f = llListFindStrided(mylist, [&amp;quot;b&amp;quot;,1], 3, -2, 1); //The first &amp;quot;b&amp;quot;,1 series is at index 2 and will be skipped by starting at 3.  The second [&amp;quot;b&amp;quot;,1] set exceeds the range criteria of the search.&lt;br /&gt;
//result_f = -1&lt;br /&gt;
&lt;br /&gt;
integer result_g = llListFindStrided(mylist, [&amp;quot;b&amp;quot;,2], 0, -1, 1); //No consecutive elements match [&amp;quot;b&amp;quot;,2]&lt;br /&gt;
//result_g = -1&lt;br /&gt;
&lt;br /&gt;
integer result_h = llListFindStrided(mylist, [&amp;quot;c&amp;quot;], 0, -1, 2); //With a stride of 2, &amp;quot;c&amp;quot; will be found.&lt;br /&gt;
//result_h = 4&lt;br /&gt;
&lt;br /&gt;
integer result_i = llListFindStrided(mylist, [&amp;quot;c&amp;quot;], 0, -1, 3); //With a stride of 3, &amp;quot;c&amp;quot; won&#039;t be found.&lt;br /&gt;
//result_i = -1&lt;br /&gt;
&lt;br /&gt;
integer result_j = llListFindStrided(mylist, [&amp;quot;c&amp;quot;], 0, -1, 4); //With a stride of 4, &amp;quot;c&amp;quot; will be found.&lt;br /&gt;
//result_j = 4&lt;br /&gt;
&lt;br /&gt;
integer result_k = llListFindStrided(mylist, [&amp;quot;c&amp;quot;], 1, -1, 2); //While the stride is even, starting at the 2nd element will miss this stride.&lt;br /&gt;
//result_k = -1&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;list numbers = [1, 2, 3, 4, 5];&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        integer index = llListFindStrided(numbers, [3], 0, -1, 1);  //Functionally identical to llListFindList(numbers, [3]);&lt;br /&gt;
        if (index != -1)&lt;br /&gt;
        {&lt;br /&gt;
            list three_four = llList2List(numbers, index, index + 1);&lt;br /&gt;
            llOwnerSay(llDumpList2String(three_four, &amp;quot;,&amp;quot;));&lt;br /&gt;
            // Object: 3,4&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;//You can also search for two items at once to find a pattern in a list&lt;br /&gt;
list avatarsWhoFoundMagicLeaves = [&amp;quot;Water Duck&amp;quot;, &amp;quot;Green Ham&amp;quot;, &amp;quot;Fire Centaur&amp;quot;,&amp;quot;Red Leaf&amp;quot;];&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        integer index = llListFindStrided(avatarsWhoFoundMagicLeaves, [&amp;quot;Fire Centaur&amp;quot;,&amp;quot;Red Leaf&amp;quot;],0,-1,2);&lt;br /&gt;
        if (index != -1)&lt;br /&gt;
        {&lt;br /&gt;
            list output = llList2List(avatarsWhoFoundMagicLeaves, index, index + 1);&lt;br /&gt;
            llOwnerSay(llDumpList2String(output, &amp;quot;,&amp;quot;));&lt;br /&gt;
            // Object: Fire Centaur, Red Leaf&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;//It&#039;s nearly a database&lt;br /&gt;
list food_db = [&amp;quot;FIRSTNAME&amp;quot;, &amp;quot;LASTNAME&amp;quot;, &amp;quot;FAVORITE FOOD&amp;quot;, &amp;quot;ALLERGIES&amp;quot;, &lt;br /&gt;
                                   &amp;quot;Awesome&amp;quot;, &amp;quot;Resident&amp;quot;,&amp;quot;Apples&amp;quot;,0,&lt;br /&gt;
                                   &amp;quot;Charlie&amp;quot;, &amp;quot;Kites&amp;quot;, &amp;quot;Peanuts&amp;quot;, &amp;quot;dogs&amp;quot;,&lt;br /&gt;
                                   &amp;quot;Cool&amp;quot;, &amp;quot;McLastname&amp;quot;, &amp;quot;Burgers&amp;quot;,&amp;quot;peanuts&amp;quot;];&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        list potential_allergen = [&amp;quot;peanuts&amp;quot;];&lt;br /&gt;
        integer any_allergies = llListFindStrided(food_db, potential_allergen,4,-1,4);&lt;br /&gt;
        if (any_allergies != -1)&lt;br /&gt;
        {&lt;br /&gt;
            llOwnerSay(&amp;quot;Every can eat it&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            list output = llList2List(food_db, any_allergens - 3, any_allergens - 2);&lt;br /&gt;
            llOwnerSay(llDumpList2String(output, &amp;quot; &amp;quot;)+&amp;quot; is allergic to it!&amp;quot;);&lt;br /&gt;
            // Object: Cool McLastName is allergic to peanuts&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
|helpers=&lt;br /&gt;
|also_functions=&lt;br /&gt;
{{LSL DefineRow||[[llSubStringIndex]]|Find a string in another string}}&lt;br /&gt;
|also_events&lt;br /&gt;
|also_tests&lt;br /&gt;
|also_articles&lt;br /&gt;
|notes&lt;br /&gt;
|sort=ListFindList&lt;br /&gt;
|cat1=List&lt;br /&gt;
|haiku={{Haiku|I made a database|Using Only Some Lists|Find by last name.}}&lt;br /&gt;
|cat2&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>MoiraAtropos Resident</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlSetPayPrice&amp;diff=1214301</id>
		<title>LlSetPayPrice</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlSetPayPrice&amp;diff=1214301"/>
		<updated>2023-08-11T11:10:08Z</updated>

		<summary type="html">&lt;p&gt;MoiraAtropos Resident: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function&lt;br /&gt;
|inject-2={{Issues/VWR-3048}}{{Issues/VWR-8744}}&lt;br /&gt;
|func_id=302|func_sleep=0.0|func_energy=10.0&lt;br /&gt;
|func=llSetPayPrice|sort=SetPayPrice&lt;br /&gt;
|p1_type=integer|p1_name=price|p1_desc=PAY_* constant or positive value (including zero)&lt;br /&gt;
|p2_type=list|p2_name=quick_pay_buttons|p2_desc=Four PAY_* constants and/or positive integer values (zero is not shown)&lt;br /&gt;
|func_desc=Suggest default amounts for the pay text field and pay buttons of the appearing dialog when someone chooses to pay this object.&lt;br /&gt;
|caveats=*This function should not be trusted to limit the values of money payable to the object; &#039;&#039;always&#039;&#039; verify the amount paid is the amount expected.&lt;br /&gt;
* Use only one call to this function in all the scripts on an object to prevent confusion about which values are used.   You still need to check in the money event that the amount is as expected.&lt;br /&gt;
* This function only works when called from the root prim of an object. Its effect applies to all the prims in the object. Calling it from a child prim has no effect.  &lt;br /&gt;
* Payment to a prim can be blocked by the llSetPayPrice() setting in the prim, which persists even if the script with llSetPayPrice() is removed.&lt;br /&gt;
* &#039;&#039;&#039;Caution:&#039;&#039;&#039; Calling this function will enable payment on the prim (or the whole object if it is the root prim) for the current state, even when this state has no money event.&lt;br /&gt;
* Otherwise, the pay option will only be shown in prims having a running script with a [[money]] event (or in all the prims of the object if the root has a running script with a money event).&lt;br /&gt;
* The effect seems to persist even if the script is recompiled with out the [[llSetPayPrice]] function, even if the script is replaced with another one which includes a [[money]] event, but not [[llSetPayPrice]].&lt;br /&gt;
* Money cannot be paid to an attachment; &amp;quot;Pay&amp;quot; will go directly to the wearer instead.&lt;br /&gt;
* If &#039;&#039;&#039;quick_pay_buttons&#039;&#039;&#039; contains a negative value or zero, the button will not be shown at all.&lt;br /&gt;
** However, zero is allowed for &#039;&#039;&#039;price&#039;&#039;&#039;, which is used to set the custom text field&#039;s value within the Pay window.&lt;br /&gt;
&lt;br /&gt;
|examples=This will give the user a dialog box without the &#039;&#039;&#039;price&#039;&#039;&#039; field and only one button with a value of 150.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;llSetPayPrice(PAY_HIDE, [150,PAY_HIDE,PAY_HIDE,PAY_HIDE])&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;integer price = 10;&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSetPayPrice(PAY_HIDE, [PAY_HIDE ,PAY_HIDE, PAY_HIDE, PAY_HIDE]);&lt;br /&gt;
        llRequestPermissions(llGetOwner(), PERMISSION_DEBIT);&lt;br /&gt;
    }&lt;br /&gt;
    run_time_permissions(integer perm)&lt;br /&gt;
    {&lt;br /&gt;
        if(perm &amp;amp; PERMISSION_DEBIT)&lt;br /&gt;
            state cash;&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
state cash&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSetPayPrice(price, [price ,PAY_HIDE, PAY_HIDE, PAY_HIDE]);&lt;br /&gt;
    }&lt;br /&gt;
    money(key id, integer amount)&lt;br /&gt;
    {&lt;br /&gt;
        if(amount != price)&lt;br /&gt;
        {&lt;br /&gt;
            llGiveMoney(id, amount);&lt;br /&gt;
            llInstantMessage(id, &amp;quot;You paid &amp;quot;+(string)amount+&amp;quot;, which is the wrong price, the price is: &amp;quot;+(string)price);&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            //insert your give code here.&lt;br /&gt;
            llInstantMessage(id, &amp;quot;You paid the right price&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/source&amp;gt;&lt;br /&gt;
|spec&lt;br /&gt;
|constants=&lt;br /&gt;
{{{!}}&lt;br /&gt;
{{!}}&lt;br /&gt;
{{{!}}{{Prettytable|style=margin-top:0;}}&lt;br /&gt;
{{!}}-{{Hl2}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; {{!}} Constant&lt;br /&gt;
! {{HoverText|Alt|Alternate}}&lt;br /&gt;
! Description&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} [[PAY_HIDE]]&lt;br /&gt;
{{!}} -1&lt;br /&gt;
{{!}} &amp;lt;center&amp;gt;0&amp;lt;/center&amp;gt;&lt;br /&gt;
{{!}} Hides this quick pay button.&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} [[PAY_DEFAULT]]&lt;br /&gt;
{{!}} -2&lt;br /&gt;
{{!}} &lt;br /&gt;
{{!}} Use the default value for this quick pay button.&lt;br /&gt;
{{!}}}&lt;br /&gt;
{{!}}&lt;br /&gt;
{{{!}} {{Prettytable|style=margin-top:0;}}&lt;br /&gt;
{{!}}-{{Hl2}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; {{!}} Button Order&lt;br /&gt;
{{!}}- &lt;br /&gt;
{{!}} &amp;lt;center&amp;gt;1&amp;lt;/center&amp;gt;&lt;br /&gt;
{{!}} &amp;lt;center&amp;gt;2&amp;lt;/center&amp;gt;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} &amp;lt;center&amp;gt;3&amp;lt;/center&amp;gt;&lt;br /&gt;
{{!}} &amp;lt;center&amp;gt;4&amp;lt;/center&amp;gt;&lt;br /&gt;
{{!}}}&lt;br /&gt;
{{!}}&lt;br /&gt;
{{{!}}{{Prettytable|style=margin-top:0;}}&lt;br /&gt;
{{!}}-{{Hl2}}&lt;br /&gt;
! colspan=&amp;quot;2&amp;quot; {{!}} Defaults&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}}$1&lt;br /&gt;
{{!}}$5&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}}$10&lt;br /&gt;
{{!}}$20&lt;br /&gt;
{{!}}}&lt;br /&gt;
{{!}}}&lt;br /&gt;
|helpers&lt;br /&gt;
|also_functions={{LSL DefineRow||[[llGiveMoney]]|}}&lt;br /&gt;
|also_tests={{LSL DefineRow||[[llSetPayPrice Test]]|}}&lt;br /&gt;
|also_events={{LSL DefineRow||[[money]]|}}&lt;br /&gt;
|also_articles&lt;br /&gt;
|notes&lt;br /&gt;
|cat1=Money&lt;br /&gt;
|cat2=Prim&lt;br /&gt;
|cat3=Dialog&lt;br /&gt;
|cat4&lt;br /&gt;
|issues&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>MoiraAtropos Resident</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Simplex_Text&amp;diff=1214252</id>
		<title>Simplex Text</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Simplex_Text&amp;diff=1214252"/>
		<updated>2023-08-01T10:34:54Z</updated>

		<summary type="html">&lt;p&gt;MoiraAtropos Resident: Script formatting&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Simplex Text is, in the creator&#039;s opinion, the successor to XyzzyText. Whether that is true or not, the future will decide. Simplex provides end users an easy way to generate dynamic text on prims. Using only one texture and one script, this becomes a viable option for many users. Unfortunately, unlike XyzzyText, it uses a linkset, rather than a single prim, to visualize its contents.&lt;br /&gt;
&lt;br /&gt;
Rudy Glassfield, the sole developer of Simplex Text, has made the script open-source and currently sells it on the Marketplace for free. The script comes packaged in a box, which doubles up as a demo for the Simplex Text System.&lt;br /&gt;
&lt;br /&gt;
The script is also available here on the Wiki, for those intrepid users who wish to dive right in.&lt;br /&gt;
&lt;br /&gt;
    // PRELIMINARY NOTES:&lt;br /&gt;
    //&lt;br /&gt;
    // ALL CHARACTER PRIM BLOCKS MUST BE NAMED &amp;quot;CHARACTER&amp;quot; THIS IS DONE TO ENSURE NO OTHER PRIMS ARE ALTERED.&lt;br /&gt;
    // ALL OBJECTS MUST BE LINKED. THIS SCRIPT IS IN THE ROOT PRIM.&lt;br /&gt;
    &lt;br /&gt;
    // PLEASE MODIFY THESE VARIABLES TO YOUR LIKING&lt;br /&gt;
    &lt;br /&gt;
    integer face = 3; // FACE NUMBER WHICH THE LETTERS WILL SHOW UP ON (USE ALL_SIDES IF YOU&#039;RE NOT SURE)&lt;br /&gt;
    vector color = &amp;lt;1, 1, 1&amp;gt;; // COLOR OF TEXT &amp;lt;1, 1, 1&amp;gt; = (RGB) WHITE, &amp;lt;0, 0, 0&amp;gt; = (RGB) BLACK&lt;br /&gt;
    &lt;br /&gt;
    // END USER CONTENT&lt;br /&gt;
    &lt;br /&gt;
    list charOrder = [];&lt;br /&gt;
    key ascii = &amp;quot;b2e7394f-5e54-aa12-6e1c-ef327b6bed9e&amp;quot;;&lt;br /&gt;
    string gCharIndex  = &amp;quot; !\&amp;quot;#$%&amp;amp;&#039;()*+,-./0123456789:;&amp;lt;=&amp;gt;?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\\]^_`abcdefghijklmnopqrstuvwxyz&amp;quot;;&lt;br /&gt;
    float xOrigin = -0.450;&lt;br /&gt;
    float yOrigin = -0.550;&lt;br /&gt;
    setCharacter(integer linknum, string msg)&lt;br /&gt;
    {&lt;br /&gt;
    	integer index = llSubStringIndex(gCharIndex, msg);&lt;br /&gt;
    	float xOffset = xOrigin + (index % 10)/10.f;&lt;br /&gt;
    	if(xOffset &amp;gt; 1) xOffset -= 1.f;&lt;br /&gt;
    	if(xOffset &amp;lt; -1) xOffset += 1.f;&lt;br /&gt;
    	float yOffset = yOrigin - (index / 10)/10.f;&lt;br /&gt;
    	if(yOffset &amp;gt; 1) yOffset -= 1.f;&lt;br /&gt;
    	if(yOffset &amp;lt; -1) yOffset += 1.f;&lt;br /&gt;
    	llSetLinkPrimitiveParamsFast(linknum, [PRIM_TEXTURE, face, ascii, &amp;lt;0.1, 0.1, 0&amp;gt;, &amp;lt;xOffset, yOffset, 0&amp;gt;, 0, PRIM_COLOR, face, color, 1.0]);&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    setCharacters(string msg, list order)&lt;br /&gt;
    {&lt;br /&gt;
    	integer i;&lt;br /&gt;
    	for(i = 0; i &amp;lt; llGetListLength(order); i ++)&lt;br /&gt;
    	{&lt;br /&gt;
    		setCharacter(llList2Integer(order, i), llGetSubString(msg, i, i));&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 temp;&lt;br /&gt;
    		&lt;br /&gt;
    		// Set Up Letter Blocks&lt;br /&gt;
    		&lt;br /&gt;
    		integer linked = llGetNumberOfPrims();&lt;br /&gt;
    		&lt;br /&gt;
    		integer i;&lt;br /&gt;
    		for(i = 2; i &amp;lt;= linked; i ++)&lt;br /&gt;
    		{&lt;br /&gt;
    			if(llGetLinkName(i) == &amp;quot;Character&amp;quot;)&lt;br /&gt;
    			{&lt;br /&gt;
    				vector pos = llList2Vector(llGetLinkPrimitiveParams(i, [PRIM_POSITION]), 0);&lt;br /&gt;
    				vector posNorm = llVecNorm(pos)*llGetRot();&lt;br /&gt;
    				temp += pos*llRot2Up(llGetRot())+posNorm.x;&lt;br /&gt;
    				temp += i;&lt;br /&gt;
    			}&lt;br /&gt;
    		}&lt;br /&gt;
    		charOrder = llList2ListStrided(llDeleteSubList(llListSort(temp, 2, FALSE), 0, 0), 0, -1, 2);&lt;br /&gt;
    	}&lt;br /&gt;
    	link_message(integer linknum, integer num, string str, key id)&lt;br /&gt;
    	{&lt;br /&gt;
    		llSetLinkPrimitiveParamsFast(LINK_ALL_CHILDREN, [PRIM_COLOR, ALL_SIDES, &amp;lt;0, 0, 0&amp;gt;, 0.0]);&lt;br /&gt;
    		setCharacters(str, charOrder);&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;
    			llResetScript();&lt;br /&gt;
    		}&lt;br /&gt;
    	}&lt;br /&gt;
    }&lt;/div&gt;</summary>
		<author><name>MoiraAtropos Resident</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlRegionSayTo&amp;diff=1214009</id>
		<title>LlRegionSayTo</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlRegionSayTo&amp;diff=1214009"/>
		<updated>2023-06-05T13:25:44Z</updated>

		<summary type="html">&lt;p&gt;MoiraAtropos Resident: Category:LSL_Chat&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function&lt;br /&gt;
|inject-2={{Issues/SCR-66}}&lt;br /&gt;
{{LSL_Function/uuid|target|sim=*|group=}}&lt;br /&gt;
|func_id=363&lt;br /&gt;
|func_sleep=0.0&lt;br /&gt;
|func_energy=10.0&lt;br /&gt;
|func=llRegionSayTo&lt;br /&gt;
|sort=RegionSayTo&lt;br /&gt;
|p1_type=key|p1_name=target&lt;br /&gt;
|p2_type=integer|p2_name=channel&lt;br /&gt;
|p3_type=string|p3_name=msg&lt;br /&gt;
|func_desc=Says&amp;lt;ref name=&amp;quot;send&amp;quot;&amp;gt;In this context, &#039;&#039;saying&#039;&#039; or &#039;&#039;speaking&#039;&#039; means that a message is being &#039;&#039;sent&#039;&#039; to the recipient (object or avatar); it&#039;s not about audio/voice chat!&amp;lt;/ref&amp;gt; the text supplied in string {{LSLP|msg}} on channel supplied in [[integer]] {{LSLP|channel}} to the [[object]] or [[avatar]] specified by {{LSLP|target}}&lt;br /&gt;
|return_text&lt;br /&gt;
|spec&lt;br /&gt;
|caveats=&lt;br /&gt;
*Text is spoken&amp;lt;ref name=&amp;quot;send&amp;quot; /&amp;gt; directly to the [[object]] or [[avatar]] within the same [[region]] as the [[script]].&lt;br /&gt;
*Script in tasks other than {{LSLP|target}} can neither listen for&amp;lt;ref&amp;gt;In this context, this means waiting to &#039;&#039;receive&#039;&#039; a message.&amp;lt;/ref&amp;gt;, nor receive these text messages, with an exception for attachments as described below.&lt;br /&gt;
*Text can be a maximum of 1024 bytes. This can convey 1024 ASCII-7 characters, or 512 UTF-8 characters such as á&lt;br /&gt;
*A [[prim]] cannot hear itself, to prevent problems with recursion.&lt;br /&gt;
*Sending text on {{LSLP|DEBUG_CHANNEL}} is not supported.&lt;br /&gt;
*Text sent to an avatar&#039;s [[UUID|ID]] on channel [[PUBLIC_CHANNEL|zero]] will be sent to the receiver&#039;s viewer.&lt;br /&gt;
*Text sent to an avatar&#039;s ID on non-zero channels can be heard&amp;lt;ref&amp;gt;I.e., &#039;&#039;received&#039;&#039;&amp;lt;/ref&amp;gt; by any attachment on the avatar.&lt;br /&gt;
*A quick series of messages sent by [[llRegionSayTo]] cannot be relied on to arrive at their destination in the same order as sent.&lt;br /&gt;
*There is a per-destination throttle of 200 messages sent over 10 seconds on channel [[PUBLIC_CHANNEL|zero]].   Thereafter, there is also a per-sending-object throttle of 100 messages on channel zero over 300 seconds (5 minutes).  This throttle is relevant only after the first throttle is activated.  Messages sent on channels other than zero do not trigger the throttle but, once it is triggered, the block applies to &#039;&#039;all&#039;&#039; channels. The block is region-wide and applies to all objects with the same [[:Category:LSL_Owner|owner]]. The block apparently lasts until the region is restarted.&lt;br /&gt;
|examples=&lt;br /&gt;
&amp;lt;syntaxhighlight lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    touch_start(integer num_detected)&lt;br /&gt;
    {&lt;br /&gt;
        key id = llDetectedKey(0);&lt;br /&gt;
&lt;br /&gt;
        // send a message to the chat window of the avatar touching&lt;br /&gt;
        llRegionSayTo(id, 0, &amp;quot;You touched this!&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
        // send a message to the attachments of the avatar touching&lt;br /&gt;
        // example channel: -12345&lt;br /&gt;
        llRegionSayTo(id, -12345, &amp;quot;Hello there attachments!&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
|helpers&lt;br /&gt;
|also_events=&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}}{{!}}{{!}} style=&amp;quot;width:9em;&amp;quot; {{!}}&lt;br /&gt;
{{LSL DefineRow||[[listen]]|Receives chat}}&lt;br /&gt;
|also_functions=&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}}{{!}}{{!}} style=&amp;quot;width:9em;&amp;quot; {{!}}&lt;br /&gt;
{{LSL DefineRow||[[llListen]]|Ask for [[listen]] events}}&lt;br /&gt;
{{LSL DefineRow||[[llInstantMessage]]|Sends chat to a specific avatar, inside or outside the current region.}}&lt;br /&gt;
{{LSL DefineRow||[[llOwnerSay]]|Sends chat to the owner only to avoid spamming the [[PUBLIC_CHANNEL]]}}&lt;br /&gt;
{{LSL DefineRow||[[llRegionSay]]|Sends chat region wide}}&lt;br /&gt;
{{LSL DefineRow||[[llSay]]|Sends chat limited to 20 meters}}&lt;br /&gt;
{{LSL DefineRow||[[llShout]]|Sends chat limited to 100 meters}}&lt;br /&gt;
{{LSL DefineRow||[[llWhisper]]|Sends chat limited to 10 meters}}&lt;br /&gt;
|also_tests&lt;br /&gt;
|also_articles={{LSL DefineRow||[[Hello Avatar]]}}&lt;br /&gt;
|notes=&lt;br /&gt;
* If one object &#039;says&#039;&amp;lt;ref name=&amp;quot;send&amp;quot; /&amp;gt; something to another object (&#039;&#039;e.g.&#039;&#039;, a button that, when touched, turns on a lamp), it is a good idea to use a very negative {{LSLP|channel}}&amp;lt;ref&amp;gt;This should be considered as an idiomatic way of programming in [[LSL]]; scripters will &#039;know&#039; that negative channels are usually &#039;&#039;not&#039;&#039; meant for &#039;&#039;users&#039;&#039; to type, but only as a way for objects to communicate among themselves.&amp;lt;/ref&amp;gt;, &#039;&#039;e.g.&#039;&#039;,&lt;br /&gt;
:&amp;lt;syntaxhighlight lang=&amp;quot;lsl2&amp;quot;&amp;gt;llRegionSayTo(&amp;quot;55499a64-45c3-4b81-8880-8ffb5a7c251b&amp;quot;, -5243212, &amp;quot;turn on&amp;quot;);&amp;lt;/syntaxhighlight&amp;gt;&lt;br /&gt;
:Negative channels are popular for script communications because, before September 2016, the standard Second Life Viewer was unable to chat directly on those channels (&amp;lt;kbd&amp;gt;/-xxxx message&amp;lt;/kbd&amp;gt; wouldn&#039;t chat {{mono|message}} on {{LSLPT|channel}} {{mono|-xxxx}}). &lt;br /&gt;
* Messages sent on channel zero via [[llRegionSayTo]]() are blocked after 200 messages on to the same destination in a 10 second period.  After this throttle is activated, there is a further throttle, on objects belonging to the owner of the object that triggered the first throttle, of 100 messages per object over 5 minutes (see {{Jira|BUG-5457}}). The block is region-wide and applies to all objects belonging to the owner, so if a script triggers the throttle, all objects in the same region belonging to the same owner will also be blocked. Messages sent on channels other than zero do not trigger the throttles.  The throttles apparently reset only when the region is restarted. &lt;br /&gt;
&lt;br /&gt;
Therefore, [[llRegionSayTo]]() is unsuitable for (say) verbose script debugging, and even moderate use can break users&#039; content completely unrelated to the script for an indeterminate (and potentially very long) period of time.   Consider using [[llOwnerSay]]() for debugging instead or, if this is not appropriate, try {{mono|llRegionSayTo(avatar, non-zero-channel, message)}} and have an attachment relay the message using [[llOwnerSay]](). &lt;br /&gt;
|cat1&lt;br /&gt;
|cat2&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
|history = Date of Release  [[ Release_Notes/Second_Life_Server/11#11.04.26.227686 | 26/04/2011 ]]&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
[[Category:LSL_Chat]]&lt;/div&gt;</summary>
		<author><name>MoiraAtropos Resident</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LSL_Portal&amp;diff=1214008</id>
		<title>LSL Portal</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LSL_Portal&amp;diff=1214008"/>
		<updated>2023-06-05T09:38:36Z</updated>

		<summary type="html">&lt;p&gt;MoiraAtropos Resident: /* {{LSLGC||LSL Features by category}} */ Object / LinksetData&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header|ml=*}}&lt;br /&gt;
__NOTOC__&lt;br /&gt;
LSL (Linden Scripting Language) is the scripting language that gives behavior to Second Life primitives, objects, and avatars. This is a community effort to provide an accurate &amp;amp; open documentation resource on LSL for scripters of all skill levels.&lt;br /&gt;
&lt;br /&gt;
Feel free to edit and add content. For more information on how to edit the wiki, see [[Project:Editing Guidelines|Editing Guidelines]]. Do not copy any information from other sources, unless you are sure about the copyright agreements.  See the [[Talk:LSL Portal|LSL Portal discussion]] page for more information.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Want to learn LSL? See [[LSL Tutorial]].&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot; rules=&amp;quot;all&amp;quot; style=&amp;quot;border-width: 0px; border-spacing: 5px;&amp;quot;&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot; rules=&amp;quot;all&amp;quot; style=&amp;quot;border-width: 1px 1px 1px 1px; padding: 1px 1px 1px 1px; border-style: solid solid solid solid; border-color: gray;&amp;quot;&lt;br /&gt;
| height=&amp;quot;1&amp;quot; width=&amp;quot;30%&amp;quot;|&lt;br /&gt;
&lt;br /&gt;
== LSL Portal ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em;&amp;quot;&amp;gt;&lt;br /&gt;
* [[LSL Editing Primer|Editing Primer]] - Editing Instructions&lt;br /&gt;
* [[LSL Portal Guidelines|Guidelines]] - Administration and Design Standards (Mission, rules, layout, etc.)&lt;br /&gt;
* [[LSL Portal To-do|To-Do]] - Edit/Revisions To-Do Listing&lt;br /&gt;
* [[LSL Portal Translation Project|Translation Project]] - Translation Coordination&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
|height=&amp;quot;1&amp;quot; width=&amp;quot;30%&amp;quot; rowspan=&amp;quot;2&amp;quot;|&lt;br /&gt;
&lt;br /&gt;
== LSL Language Reference ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em;&amp;quot;&amp;gt;&lt;br /&gt;
* [[:Category:LSL Constants|Constants]]&lt;br /&gt;
* [[:Category:LSL Events|Events]]&lt;br /&gt;
* {{LSLGC|Flow Control}}&lt;br /&gt;
** [[for]]&lt;br /&gt;
** [[if]]&lt;br /&gt;
** [[while]]&lt;br /&gt;
** [[do-while]]&lt;br /&gt;
** [[jump]]&lt;br /&gt;
** [[return]]&lt;br /&gt;
** [[state]]&lt;br /&gt;
* [[:Category:LSL Functions|Functions]]&lt;br /&gt;
**&amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[{{fullurl:Category:LSL_Functions}}#mw-pages (A..L)]&amp;lt;/span&amp;gt;&lt;br /&gt;
**&amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[{{fullurl:Category:LSL_Functions|from=L}}#mw-pages (L..T)]&amp;lt;/span&amp;gt;&lt;br /&gt;
**&amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[{{fullurl:Category:LSL_Functions|from=T}}#mw-pages (T..Z)]&amp;lt;/span&amp;gt;&lt;br /&gt;
**[[LSL_Function_ID|(By internal index id)]]&lt;br /&gt;
* [[LSL Operators|Operators]]&lt;br /&gt;
* [[state|States]]&lt;br /&gt;
* [[:Category:LSL Types|Types]]&lt;br /&gt;
** [[integer]]&lt;br /&gt;
** [[float]]&lt;br /&gt;
** [[string]]&lt;br /&gt;
** [[key]]&lt;br /&gt;
** [[list]]&lt;br /&gt;
** [[vector]]&lt;br /&gt;
** [[rotation]]&lt;br /&gt;
* [[LSL Variables|Variables]]&lt;br /&gt;
* [[LSL Errors|Errors]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
|height=&amp;quot;1&amp;quot; width=&amp;quot;25%&amp;quot; rowspan=&amp;quot;5&amp;quot;|&lt;br /&gt;
&lt;br /&gt;
== {{LSLGC||LSL Features by category}} ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em;&amp;quot;&amp;gt;&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;0&amp;quot;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|width=&amp;quot;50%&amp;quot;|&lt;br /&gt;
* [[:Category:LSL Alpha|Alpha]]&lt;br /&gt;
* [[:Category:LSL Animation|Animation]]&lt;br /&gt;
* [[:Category:LSL Attachment|Attachments]]&lt;br /&gt;
* [[:Category:LSL Avatar|Avatar]]&lt;br /&gt;
* [[:Category:LSL Camera|Camera]]&lt;br /&gt;
* [[:Category:LSL Collision|Collision]]&lt;br /&gt;
* [[:Category:LSL Color|Color]]&lt;br /&gt;
* [[:Category:LSL Communications|Communications]]&lt;br /&gt;
* [[:Category:LSL Controls|Controls]]&lt;br /&gt;
* [[:Category:LSL Dataserver|Dataserver]]&lt;br /&gt;
* [[:Category:LSL Dialog|Dialog]]&lt;br /&gt;
* [[:Category:LSL Face|Face]]&lt;br /&gt;
* [[:Category:LSL Group|Group]]&lt;br /&gt;
* [[:Category:LSL Inventory|Inventory]]&lt;br /&gt;
* [[:Category:LSL Light|Light]]&lt;br /&gt;
* [[:Category:LSL Link|Link]]&lt;br /&gt;
* [[:Category:LSL LinksetData|Linkset Persistent {{abbr|KVP|Key-Value Pair}} Store]]&lt;br /&gt;
* [[:Category:LSL_List|Lists]]&lt;br /&gt;
* [[:Category:LSL Math|Math]]&lt;br /&gt;
* [[:Category:LSL Needs Example|Needs Example]]&lt;br /&gt;
* [[:Category:LSL Permissions|Permissions]]&lt;br /&gt;
* [[:Category:LSL Physics|Physics]]&lt;br /&gt;
* [[:Category:LSL Prim|Primitive]]&lt;br /&gt;
* [[:Category:LSL Rotation|Rotation]]&lt;br /&gt;
* [[:Category:LSL_Script|Scripts]]&lt;br /&gt;
* [[:Category:LSL Sensor|Sensor]]&lt;br /&gt;
* [[:Category:LSL Sound|Sound]]&lt;br /&gt;
* {{LSLGC|Text}}&lt;br /&gt;
** {{LSLGC|Chat}}&lt;br /&gt;
** {{LSLGC|Notecard}}&lt;br /&gt;
** {{LSLGC|String}}&lt;br /&gt;
* [[:Category:LSL Teleport|Teleport]]&lt;br /&gt;
* [[:Category:LSL Texture|Texture]]&lt;br /&gt;
* [[:Category:LSL Time|Time]]&lt;br /&gt;
* [[:Category:LSL Vehicle|Vehicle]]&lt;br /&gt;
* [[:Category:LSL Video|Video]]&lt;br /&gt;
* [[:Category:LSL World|World]]&lt;br /&gt;
|width=&amp;quot;50%&amp;quot;|&lt;br /&gt;
* {{LSLGC|Avatar}}&lt;br /&gt;
** {{LSLGC|Animation}}&lt;br /&gt;
** {{LSLGC|Attachment}}&lt;br /&gt;
** {{LSLGC|Camera}}&lt;br /&gt;
** {{LSLGC|Controls}}&lt;br /&gt;
** {{LSLGC|Sit}}&lt;br /&gt;
* {{LSLGC|Communications}}&lt;br /&gt;
** {{LSLGC|Chat}}&lt;br /&gt;
** {{LSLGC|Dialog}}&lt;br /&gt;
** {{LSLGC|HTTP}}&lt;br /&gt;
** {{LSLGC|XML-RPC}}&lt;br /&gt;
* [[:Category:LSL Detected|Detection]]&lt;br /&gt;
** {{LSLGC|Collision}}&lt;br /&gt;
** {{LSLGC|Sensor}}&lt;br /&gt;
** {{LSLGC|Touch}}&lt;br /&gt;
* {{LSLGC|Functions}}&lt;br /&gt;
** {{LSLGC|God Mode}}&lt;br /&gt;
* {{LSLGC|Inventory}}&lt;br /&gt;
** {{LSLGC|Creator}}&lt;br /&gt;
** {{LSLGC|Notecard}}&lt;br /&gt;
** {{LSLGC|Owner}}&lt;br /&gt;
* {{LSLGC|Media}}&lt;br /&gt;
** {{LSLGC|Prim Media}}&lt;br /&gt;
** {{LSLGC|Sound}}&lt;br /&gt;
** {{LSLGC|Video}}&lt;br /&gt;
* {{LSLGC|Movement}}&lt;br /&gt;
** {{LSLGC|Physics}}&lt;br /&gt;
*** {{LSLGC|Damping}}&lt;br /&gt;
*** {{LSLGC|Hover}}&lt;br /&gt;
** {{LSLGC|Rotation}}&lt;br /&gt;
* {{LSLGC|Object}}&lt;br /&gt;
** [[:Category:LSL Dataserver|Dataserver]]&lt;br /&gt;
** [[:Category:LSL LinksetData|Linkset Persistent {{abbr|KVP|Key-Value Pair}} Store]]&lt;br /&gt;
** {{LSLGC|Link}}&lt;br /&gt;
** {{LSLGC|Vehicle}}&lt;br /&gt;
* {{LSLGC|Permissions}}&lt;br /&gt;
** [[:Category:LSL Permissions/Asset|Asset]]&lt;br /&gt;
** [[:Category:LSL Permissions/Script|Script]]&lt;br /&gt;
* {{LSLGC|Prim|Primitive}}&lt;br /&gt;
** {{LSLGC|Effects}}&lt;br /&gt;
*** {{LSLGC|Light}}&lt;br /&gt;
*** {{LSLGC|Particles}}&lt;br /&gt;
** {{LSLGC|Face}}&lt;br /&gt;
*** {{LSLGC|Alpha}}&lt;br /&gt;
*** {{LSLGC|Color}}&lt;br /&gt;
*** {{LSLGC|Texture}}&lt;br /&gt;
* {{LSLGC|Region}}&lt;br /&gt;
** {{LSLGC|Ground}}&lt;br /&gt;
** {{LSLGC|Parcel}}&lt;br /&gt;
** {{LSLGC|Security}}&lt;br /&gt;
** {{LSLGC|Time}}&lt;br /&gt;
* {{LSLGC|Script}}&lt;br /&gt;
** {{LSLGC|Error}}&lt;br /&gt;
*** [[:Category:LSL Error/Math|Math Errors]]&lt;br /&gt;
** {{LSLGC|Keywords}}&lt;br /&gt;
** {{LSLGC|Math}}&lt;br /&gt;
** {{LSLGC|Types}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot; rules=&amp;quot;all&amp;quot; style=&amp;quot;border-width: 1px 1px 1px 1px; padding: 1px 1px 1px 1px; border-style: solid solid solid solid; border-color: gray;&amp;quot;&lt;br /&gt;
|height=&amp;quot;1&amp;quot;|&lt;br /&gt;
&lt;br /&gt;
== Developer Resources ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* [[:Category:LSL_User-Defined_Functions|User-Defined Functions]]&lt;br /&gt;
* [[LSL Protocol|User-Defined  Protocols &amp;amp; APIs]]&lt;br /&gt;
----&lt;br /&gt;
* [[:Category:LSL Mentors|Mentors]]&lt;br /&gt;
* [[:Category:LSL Teachers|Teachers]]&lt;br /&gt;
* [[LSL_Help|Help]]&lt;br /&gt;
----&lt;br /&gt;
* [[LSL Write Once Debug Everywhere|Write Once Debug Everywhere]]&lt;br /&gt;
* [[LSL_Alternate_Editors|Alternate Editors]]&lt;br /&gt;
----&lt;br /&gt;
* [[LSL Tutorial|Tutorials]]&lt;br /&gt;
* [[:Category:LSL Examples|Examples]]&lt;br /&gt;
* [[LSL Style Guide|Style Guide]]&lt;br /&gt;
* [[LSL Script Efficiency|Efficiency]]&lt;br /&gt;
* [[LSL Script Memory|Memory]]&lt;br /&gt;
* [[LSL Hacks|Hacks]]&lt;br /&gt;
* [[LSL Benchmarking Scripts|Benchmarking Scripts]]&lt;br /&gt;
----&lt;br /&gt;
* [[:Category:LSL Categorized Library|Categorized Library]]&lt;br /&gt;
* [[:Category:LSL Library|Library]]&lt;br /&gt;
----&lt;br /&gt;
* [[LSL Test Harness|Test Harness]]&lt;br /&gt;
* [[LSL Useful Function WishList|Useful Function Wish-List]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot; rules=&amp;quot;all&amp;quot; style=&amp;quot;border-width: 1px 1px 1px 1px; padding: 1px 1px 1px 1px; border-style: solid solid solid solid; border-color: gray;&amp;quot;&lt;br /&gt;
| height=&amp;quot;1&amp;quot; colspan=&amp;quot;2&amp;quot;|&lt;br /&gt;
{{LSL News}}&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot; rules=&amp;quot;all&amp;quot; style=&amp;quot;border-width: 1px 1px 1px 1px; padding: 1px 1px 1px 1px; border-style: solid solid solid solid; border-color: gray;&amp;quot;&lt;br /&gt;
| height=&amp;quot;1&amp;quot; colspan=&amp;quot;2&amp;quot;|&lt;br /&gt;
{{LSL Bugs}}&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot; rules=&amp;quot;all&amp;quot; style=&amp;quot;border-width: 1px 1px 1px 1px; padding: 1px 1px 1px 1px; border-style: solid solid solid solid; border-color: gray;&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot;|&lt;br /&gt;
&lt;br /&gt;
== Other LSL Wikis ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em;&amp;quot;&amp;gt;&lt;br /&gt;
* {{strike|1=[http://lslwiki.net/lslwiki/wakka.php?wakka=HomePage LSL Wiki] (The original LSL Wiki.)}} (currently offline)&lt;br /&gt;
* [http://lsl.project.zone/lsl/ Unofficial LSL Reference Wiki] (work in progress)&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Snapshot Mirrors ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
[[Category:Portals]]&lt;br /&gt;
[[Category:Creation]]&lt;br /&gt;
[[Category:LSL|*]]&lt;/div&gt;</summary>
		<author><name>MoiraAtropos Resident</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LSL_Portal&amp;diff=1214007</id>
		<title>LSL Portal</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LSL_Portal&amp;diff=1214007"/>
		<updated>2023-06-05T09:35:12Z</updated>

		<summary type="html">&lt;p&gt;MoiraAtropos Resident: /* {{LSLGC||LSL Features by category}} */ Objectss / Dataserver&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header|ml=*}}&lt;br /&gt;
__NOTOC__&lt;br /&gt;
LSL (Linden Scripting Language) is the scripting language that gives behavior to Second Life primitives, objects, and avatars. This is a community effort to provide an accurate &amp;amp; open documentation resource on LSL for scripters of all skill levels.&lt;br /&gt;
&lt;br /&gt;
Feel free to edit and add content. For more information on how to edit the wiki, see [[Project:Editing Guidelines|Editing Guidelines]]. Do not copy any information from other sources, unless you are sure about the copyright agreements.  See the [[Talk:LSL Portal|LSL Portal discussion]] page for more information.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Want to learn LSL? See [[LSL Tutorial]].&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div id=&amp;quot;box&amp;quot;&amp;gt;&lt;br /&gt;
{| width=&amp;quot;100%&amp;quot; rules=&amp;quot;all&amp;quot; style=&amp;quot;border-width: 0px; border-spacing: 5px;&amp;quot;&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot; rules=&amp;quot;all&amp;quot; style=&amp;quot;border-width: 1px 1px 1px 1px; padding: 1px 1px 1px 1px; border-style: solid solid solid solid; border-color: gray;&amp;quot;&lt;br /&gt;
| height=&amp;quot;1&amp;quot; width=&amp;quot;30%&amp;quot;|&lt;br /&gt;
&lt;br /&gt;
== LSL Portal ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em;&amp;quot;&amp;gt;&lt;br /&gt;
* [[LSL Editing Primer|Editing Primer]] - Editing Instructions&lt;br /&gt;
* [[LSL Portal Guidelines|Guidelines]] - Administration and Design Standards (Mission, rules, layout, etc.)&lt;br /&gt;
* [[LSL Portal To-do|To-Do]] - Edit/Revisions To-Do Listing&lt;br /&gt;
* [[LSL Portal Translation Project|Translation Project]] - Translation Coordination&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
|height=&amp;quot;1&amp;quot; width=&amp;quot;30%&amp;quot; rowspan=&amp;quot;2&amp;quot;|&lt;br /&gt;
&lt;br /&gt;
== LSL Language Reference ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em;&amp;quot;&amp;gt;&lt;br /&gt;
* [[:Category:LSL Constants|Constants]]&lt;br /&gt;
* [[:Category:LSL Events|Events]]&lt;br /&gt;
* {{LSLGC|Flow Control}}&lt;br /&gt;
** [[for]]&lt;br /&gt;
** [[if]]&lt;br /&gt;
** [[while]]&lt;br /&gt;
** [[do-while]]&lt;br /&gt;
** [[jump]]&lt;br /&gt;
** [[return]]&lt;br /&gt;
** [[state]]&lt;br /&gt;
* [[:Category:LSL Functions|Functions]]&lt;br /&gt;
**&amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[{{fullurl:Category:LSL_Functions}}#mw-pages (A..L)]&amp;lt;/span&amp;gt;&lt;br /&gt;
**&amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[{{fullurl:Category:LSL_Functions|from=L}}#mw-pages (L..T)]&amp;lt;/span&amp;gt;&lt;br /&gt;
**&amp;lt;span class=&amp;quot;plainlinks&amp;quot;&amp;gt;[{{fullurl:Category:LSL_Functions|from=T}}#mw-pages (T..Z)]&amp;lt;/span&amp;gt;&lt;br /&gt;
**[[LSL_Function_ID|(By internal index id)]]&lt;br /&gt;
* [[LSL Operators|Operators]]&lt;br /&gt;
* [[state|States]]&lt;br /&gt;
* [[:Category:LSL Types|Types]]&lt;br /&gt;
** [[integer]]&lt;br /&gt;
** [[float]]&lt;br /&gt;
** [[string]]&lt;br /&gt;
** [[key]]&lt;br /&gt;
** [[list]]&lt;br /&gt;
** [[vector]]&lt;br /&gt;
** [[rotation]]&lt;br /&gt;
* [[LSL Variables|Variables]]&lt;br /&gt;
* [[LSL Errors|Errors]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
|height=&amp;quot;1&amp;quot; width=&amp;quot;25%&amp;quot; rowspan=&amp;quot;5&amp;quot;|&lt;br /&gt;
&lt;br /&gt;
== {{LSLGC||LSL Features by category}} ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em;&amp;quot;&amp;gt;&lt;br /&gt;
{| border=&amp;quot;0&amp;quot; cellspacing=&amp;quot;0&amp;quot; cellpadding=&amp;quot;0&amp;quot;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot;&lt;br /&gt;
|width=&amp;quot;50%&amp;quot;|&lt;br /&gt;
* [[:Category:LSL Alpha|Alpha]]&lt;br /&gt;
* [[:Category:LSL Animation|Animation]]&lt;br /&gt;
* [[:Category:LSL Attachment|Attachments]]&lt;br /&gt;
* [[:Category:LSL Avatar|Avatar]]&lt;br /&gt;
* [[:Category:LSL Camera|Camera]]&lt;br /&gt;
* [[:Category:LSL Collision|Collision]]&lt;br /&gt;
* [[:Category:LSL Color|Color]]&lt;br /&gt;
* [[:Category:LSL Communications|Communications]]&lt;br /&gt;
* [[:Category:LSL Controls|Controls]]&lt;br /&gt;
* [[:Category:LSL Dataserver|Dataserver]]&lt;br /&gt;
* [[:Category:LSL Dialog|Dialog]]&lt;br /&gt;
* [[:Category:LSL Face|Face]]&lt;br /&gt;
* [[:Category:LSL Group|Group]]&lt;br /&gt;
* [[:Category:LSL Inventory|Inventory]]&lt;br /&gt;
* [[:Category:LSL Light|Light]]&lt;br /&gt;
* [[:Category:LSL Link|Link]]&lt;br /&gt;
* [[:Category:LSL LinksetData|Linkset Persistent {{abbr|KVP|Key-Value Pair}} Store]]&lt;br /&gt;
* [[:Category:LSL_List|Lists]]&lt;br /&gt;
* [[:Category:LSL Math|Math]]&lt;br /&gt;
* [[:Category:LSL Needs Example|Needs Example]]&lt;br /&gt;
* [[:Category:LSL Permissions|Permissions]]&lt;br /&gt;
* [[:Category:LSL Physics|Physics]]&lt;br /&gt;
* [[:Category:LSL Prim|Primitive]]&lt;br /&gt;
* [[:Category:LSL Rotation|Rotation]]&lt;br /&gt;
* [[:Category:LSL_Script|Scripts]]&lt;br /&gt;
* [[:Category:LSL Sensor|Sensor]]&lt;br /&gt;
* [[:Category:LSL Sound|Sound]]&lt;br /&gt;
* {{LSLGC|Text}}&lt;br /&gt;
** {{LSLGC|Chat}}&lt;br /&gt;
** {{LSLGC|Notecard}}&lt;br /&gt;
** {{LSLGC|String}}&lt;br /&gt;
* [[:Category:LSL Teleport|Teleport]]&lt;br /&gt;
* [[:Category:LSL Texture|Texture]]&lt;br /&gt;
* [[:Category:LSL Time|Time]]&lt;br /&gt;
* [[:Category:LSL Vehicle|Vehicle]]&lt;br /&gt;
* [[:Category:LSL Video|Video]]&lt;br /&gt;
* [[:Category:LSL World|World]]&lt;br /&gt;
|width=&amp;quot;50%&amp;quot;|&lt;br /&gt;
* {{LSLGC|Avatar}}&lt;br /&gt;
** {{LSLGC|Animation}}&lt;br /&gt;
** {{LSLGC|Attachment}}&lt;br /&gt;
** {{LSLGC|Camera}}&lt;br /&gt;
** {{LSLGC|Controls}}&lt;br /&gt;
** {{LSLGC|Sit}}&lt;br /&gt;
* {{LSLGC|Communications}}&lt;br /&gt;
** {{LSLGC|Chat}}&lt;br /&gt;
** {{LSLGC|Dialog}}&lt;br /&gt;
** {{LSLGC|HTTP}}&lt;br /&gt;
** {{LSLGC|XML-RPC}}&lt;br /&gt;
* [[:Category:LSL Detected|Detection]]&lt;br /&gt;
** {{LSLGC|Collision}}&lt;br /&gt;
** {{LSLGC|Sensor}}&lt;br /&gt;
** {{LSLGC|Touch}}&lt;br /&gt;
* {{LSLGC|Functions}}&lt;br /&gt;
** {{LSLGC|God Mode}}&lt;br /&gt;
* {{LSLGC|Inventory}}&lt;br /&gt;
** {{LSLGC|Creator}}&lt;br /&gt;
** {{LSLGC|Notecard}}&lt;br /&gt;
** {{LSLGC|Owner}}&lt;br /&gt;
* {{LSLGC|Media}}&lt;br /&gt;
** {{LSLGC|Prim Media}}&lt;br /&gt;
** {{LSLGC|Sound}}&lt;br /&gt;
** {{LSLGC|Video}}&lt;br /&gt;
* {{LSLGC|Movement}}&lt;br /&gt;
** {{LSLGC|Physics}}&lt;br /&gt;
*** {{LSLGC|Damping}}&lt;br /&gt;
*** {{LSLGC|Hover}}&lt;br /&gt;
** {{LSLGC|Rotation}}&lt;br /&gt;
* {{LSLGC|Object}}&lt;br /&gt;
** [[:Category:LSL Dataserver|Dataserver]]&lt;br /&gt;
** {{LSLGC|Link}}&lt;br /&gt;
** {{LSLGC|Vehicle}}&lt;br /&gt;
* {{LSLGC|Permissions}}&lt;br /&gt;
** [[:Category:LSL Permissions/Asset|Asset]]&lt;br /&gt;
** [[:Category:LSL Permissions/Script|Script]]&lt;br /&gt;
* {{LSLGC|Prim|Primitive}}&lt;br /&gt;
** {{LSLGC|Effects}}&lt;br /&gt;
*** {{LSLGC|Light}}&lt;br /&gt;
*** {{LSLGC|Particles}}&lt;br /&gt;
** {{LSLGC|Face}}&lt;br /&gt;
*** {{LSLGC|Alpha}}&lt;br /&gt;
*** {{LSLGC|Color}}&lt;br /&gt;
*** {{LSLGC|Texture}}&lt;br /&gt;
* {{LSLGC|Region}}&lt;br /&gt;
** {{LSLGC|Ground}}&lt;br /&gt;
** {{LSLGC|Parcel}}&lt;br /&gt;
** {{LSLGC|Security}}&lt;br /&gt;
** {{LSLGC|Time}}&lt;br /&gt;
* {{LSLGC|Script}}&lt;br /&gt;
** {{LSLGC|Error}}&lt;br /&gt;
*** [[:Category:LSL Error/Math|Math Errors]]&lt;br /&gt;
** {{LSLGC|Keywords}}&lt;br /&gt;
** {{LSLGC|Math}}&lt;br /&gt;
** {{LSLGC|Types}}&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
|-valign=&amp;quot;top&amp;quot; rules=&amp;quot;all&amp;quot; style=&amp;quot;border-width: 1px 1px 1px 1px; padding: 1px 1px 1px 1px; border-style: solid solid solid solid; border-color: gray;&amp;quot;&lt;br /&gt;
|height=&amp;quot;1&amp;quot;|&lt;br /&gt;
&lt;br /&gt;
== Developer Resources ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em;&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* [[:Category:LSL_User-Defined_Functions|User-Defined Functions]]&lt;br /&gt;
* [[LSL Protocol|User-Defined  Protocols &amp;amp; APIs]]&lt;br /&gt;
----&lt;br /&gt;
* [[:Category:LSL Mentors|Mentors]]&lt;br /&gt;
* [[:Category:LSL Teachers|Teachers]]&lt;br /&gt;
* [[LSL_Help|Help]]&lt;br /&gt;
----&lt;br /&gt;
* [[LSL Write Once Debug Everywhere|Write Once Debug Everywhere]]&lt;br /&gt;
* [[LSL_Alternate_Editors|Alternate Editors]]&lt;br /&gt;
----&lt;br /&gt;
* [[LSL Tutorial|Tutorials]]&lt;br /&gt;
* [[:Category:LSL Examples|Examples]]&lt;br /&gt;
* [[LSL Style Guide|Style Guide]]&lt;br /&gt;
* [[LSL Script Efficiency|Efficiency]]&lt;br /&gt;
* [[LSL Script Memory|Memory]]&lt;br /&gt;
* [[LSL Hacks|Hacks]]&lt;br /&gt;
* [[LSL Benchmarking Scripts|Benchmarking Scripts]]&lt;br /&gt;
----&lt;br /&gt;
* [[:Category:LSL Categorized Library|Categorized Library]]&lt;br /&gt;
* [[:Category:LSL Library|Library]]&lt;br /&gt;
----&lt;br /&gt;
* [[LSL Test Harness|Test Harness]]&lt;br /&gt;
* [[LSL Useful Function WishList|Useful Function Wish-List]]&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot; rules=&amp;quot;all&amp;quot; style=&amp;quot;border-width: 1px 1px 1px 1px; padding: 1px 1px 1px 1px; border-style: solid solid solid solid; border-color: gray;&amp;quot;&lt;br /&gt;
| height=&amp;quot;1&amp;quot; colspan=&amp;quot;2&amp;quot;|&lt;br /&gt;
{{LSL News}}&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot; rules=&amp;quot;all&amp;quot; style=&amp;quot;border-width: 1px 1px 1px 1px; padding: 1px 1px 1px 1px; border-style: solid solid solid solid; border-color: gray;&amp;quot;&lt;br /&gt;
| height=&amp;quot;1&amp;quot; colspan=&amp;quot;2&amp;quot;|&lt;br /&gt;
{{LSL Bugs}}&lt;br /&gt;
|- valign=&amp;quot;top&amp;quot; rules=&amp;quot;all&amp;quot; style=&amp;quot;border-width: 1px 1px 1px 1px; padding: 1px 1px 1px 1px; border-style: solid solid solid solid; border-color: gray;&amp;quot;&lt;br /&gt;
| colspan=&amp;quot;2&amp;quot;|&lt;br /&gt;
&lt;br /&gt;
== Other LSL Wikis ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em;&amp;quot;&amp;gt;&lt;br /&gt;
* {{strike|1=[http://lslwiki.net/lslwiki/wakka.php?wakka=HomePage LSL Wiki] (The original LSL Wiki.)}} (currently offline)&lt;br /&gt;
* [http://lsl.project.zone/lsl/ Unofficial LSL Reference Wiki] (work in progress)&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Snapshot Mirrors ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;padding: 0.5em;&amp;quot;&amp;gt;&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
[[Category:Portals]]&lt;br /&gt;
[[Category:Creation]]&lt;br /&gt;
[[Category:LSL|*]]&lt;/div&gt;</summary>
		<author><name>MoiraAtropos Resident</name></author>
	</entry>
</feed>