<?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=Darien+Caldwell</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=Darien+Caldwell"/>
	<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/wiki/Special:Contributions/Darien_Caldwell"/>
	<updated>2026-08-04T13:11:59Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Limits&amp;diff=1202601</id>
		<title>Limits</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Limits&amp;diff=1202601"/>
		<updated>2016-07-14T01:51:41Z</updated>

		<summary type="html">&lt;p&gt;Darien Caldwell: /* Groups */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;{{KBmaster}}&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
== Summary ==&lt;br /&gt;
{{RightToc}}&lt;br /&gt;
The Second Life Viewer and simulators have a division of labor, keeping track of the data that makes Second Life run. The Viewer&#039;s job is to:&lt;br /&gt;
&lt;br /&gt;
* Handle locations of objects.&lt;br /&gt;
* Get velocities and other physics information, and does simple physics to keep track of what is moving where.&lt;br /&gt;
&lt;br /&gt;
The simulator&#039;s job is to:&lt;br /&gt;
&lt;br /&gt;
* Run the physics engine.&lt;br /&gt;
* Detect collisions.&lt;br /&gt;
* Keep track of where everything is&lt;br /&gt;
* Send locations of content to the Viewer along with updates when certain changes occur.&lt;br /&gt;
&lt;br /&gt;
Limits are necessary for all of these components to work together. The list below outlines many of the &#039;&#039;&#039;Second Life numerical limits that affect your inworld experience&#039;&#039;&#039;. Some of these will likely change over time, so if you spot something incorrect/outdated, please take a moment to update it.&lt;br /&gt;
&lt;br /&gt;
{{KBcaution|1=The scope of this page is focused on Linden Lab&#039;s official Viewers, keeping in mind [[Third_Party_Viewer_Directory|3rd-party viewers may differ]]. Cite sources and provide substantiation for limits that aren&#039;t provided by Linden Lab. Also, unconfirmed speculation [[Talk:Limits|goes on this discussion page]]. Don&#039;t add data without a hard limit, and don&#039;t add obscure trivia that doesn&#039;t practically affect the general inworld experience.|width=80%}}&lt;br /&gt;
&lt;br /&gt;
== [[Avatar]] ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Max. # of attachments&#039;&#039;&#039; - 38 combined [[HUD]] or body attachments.&lt;br /&gt;
** They can be viewed by right-clicking your avatar and choosing &#039;&#039;&#039;Edit My Outfit&#039;&#039;&#039;.&lt;br /&gt;
** With the formal introduction of [[multiple attachments|multiple attachments to a single point]] in Viewer 2.4, you can attach up to 38 total objects, and they can all be attached to a single point. &lt;br /&gt;
* &#039;&#039;&#039;Max. # of clothing layers&#039;&#039;&#039; - 60 including alpha, tattoo, shoe base, physics, socks, gloves, undershirt, underpants, shirt, pants, jacket, skirt&lt;br /&gt;
** On viewers before Second Life Release 3.7.29.301305, the potential total was still 60, but limited to 5 items of each type.&lt;br /&gt;
** In any case, only one each of shape, skin, eyes and hair base may be worn.&lt;br /&gt;
* &#039;&#039;&#039;Max Clothing Texture&#039;&#039;&#039; - 512x512 px (except 128x128 px for eyes) - Server Side Appearance (and legacy baking on outside grids) will downsize larger textures.&amp;lt;!--per Nyx Linden 9/23/2013 Content n Mesh Meeting--&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Max. unassisted fly height&#039;&#039;&#039; - Stable hover at current ground elevation &#039;&#039;plus&#039;&#039; 5020m.&lt;br /&gt;
** You can easily acquire a flight attachment to fly high. Also see [[flight limit]] and [[Limits#Navigation|the Navigation section]] below.&lt;br /&gt;
* &#039;&#039;&#039;Common shoe sizes&#039;&#039;&#039; - Traditionally, most women&#039;s shoes were designed for a size 0 (zero) foot. Men&#039;s generally scale up to 14. Newer items (mesh and some sculpted) replace the system feet or conform to the avatar&#039;s shape, so adjustments may be necessary.&lt;br /&gt;
** You can check this by going to Edit menu &amp;gt; Appearance and clicking on the Shape &amp;gt; Legs tab.&lt;br /&gt;
&amp;lt;!--Can someone verify the following?&lt;br /&gt;
* &#039;&#039;&#039;Min. length of avatar name&#039;&#039;&#039; - 2 for first name, 2 for last name, 5 in total (including the space).--&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Max. length of avatar name&#039;&#039;&#039; - 31 for first name, 31 for last name, 63 in total (including the space).&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Max. length of {{LSLGC|Username}}&#039;&#039;&#039; - All lower case and a maximum of 63 including the &#039;.&#039;(eg; firstname.lastname)&lt;br /&gt;
**Older account user names are a combination of the First and last name in lower case separated by a period(.)(eg; lilmix.pixelmaid)&lt;br /&gt;
**Modern user names are a single name(no period)(eg; john1234) - &#039;&#039;&#039;Max.&#039;&#039;&#039; length is 31 characters&lt;br /&gt;
**The {{LSLGC|Legacy Name}}s for modern user names always shows Resident as the last name. So the Max is 40 characters in total for a new avatar&#039;s legacy name(including the space and last name &#039;Resident&#039;)&lt;br /&gt;
*&#039;&#039;&#039;Min. length of [[Display_Names]]&#039;&#039;&#039; - At least one script character&lt;br /&gt;
*&#039;&#039;&#039;Max. length of Display Names&#039;&#039;&#039; - 31 characters&lt;br /&gt;
**Display Names can include most Unicode script characters, spaces, and some punctuation.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Max. avatar speed&#039;&#039;&#039; - 250m/s (with only attachments to assist)&lt;br /&gt;
* &#039;&#039;&#039;Max. teleport speed&#039;&#039;&#039;&amp;lt;!-- - 3 teleports per 15 seconds (server 1.27.0) and 10 teleports per 15 seconds (server 1.27.1)--&amp;gt; - 10 teleports per 15 seconds, since SL server 1.27.1&lt;br /&gt;
&lt;br /&gt;
== [[Animation]] ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; width=&amp;quot;100%&amp;quot; {{Prettytable}}&lt;br /&gt;
|- {{Hl2}}&lt;br /&gt;
! &#039;&#039;&#039;Limit affects&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Lower limit&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Upper limit&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Comment&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;More coverage&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||Length of animation&lt;br /&gt;
| n/a&lt;br /&gt;
| {{no|60.0 seconds}}&lt;br /&gt;
| Limited by length or Size, whichever is reached first&lt;br /&gt;
| n/a&lt;br /&gt;
|-&lt;br /&gt;
||Size of Animation&lt;br /&gt;
| n/a&lt;br /&gt;
| {{no|120k bytes}}&lt;br /&gt;
| Limited by length or Size, whichever is reached first. Size is after conversion to SL [[Internal Animation Format|internal animaton format]], not BVH source which can be much larger.&lt;br /&gt;
| n/a&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
||animation priority&lt;br /&gt;
| {{no|0}}&lt;br /&gt;
| {{no|4, with custom tools 6}}&lt;br /&gt;
| n/a&lt;br /&gt;
| [[Animation_Priority]]&lt;br /&gt;
|-&lt;br /&gt;
||Number of unique joints per animation&lt;br /&gt;
| n/a&lt;br /&gt;
| {{no|32}}&lt;br /&gt;
| n/a&lt;br /&gt;
| n/a&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== [http://community.secondlife.com/t5/English-Knowledge-Base/Build-Tools/ta-p/700039 Building] ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; width=&amp;quot;100%&amp;quot; {{Prettytable}}&lt;br /&gt;
|- {{Hl2}}&lt;br /&gt;
! &#039;&#039;&#039;Limit affects&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Lower limit&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Upper limit&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Comment&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;More coverage&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||[[Prim]] dimensions&lt;br /&gt;
| {{no|&amp;lt;0.01,&amp;amp;nbsp;0.01,&amp;amp;nbsp;0.01&amp;gt;}}&lt;br /&gt;
| {{no|&amp;lt;64.0, 64.0, 64.0&amp;gt;}}&lt;br /&gt;
| Used to be &amp;lt;10.0, 10.0, 10.0&amp;gt; prior to Second Life Server version 11.08.17.238770&lt;br /&gt;
| [[llSetScale]], [[PRIM_SIZE]] and [[Megaprim]]&lt;br /&gt;
|-&lt;br /&gt;
||Number of prims in a linkset&lt;br /&gt;
| n/a&lt;br /&gt;
| {{no|256 prims}}&lt;br /&gt;
| Used to be 255 prior to Second Life Server version 1.26&lt;br /&gt;
| n/a&lt;br /&gt;
|-&lt;br /&gt;
||Linking distance&lt;br /&gt;
| n/a&lt;br /&gt;
| {{no|[[Linkability_Rules]]}}&lt;br /&gt;
| n/a&lt;br /&gt;
| n/a&lt;br /&gt;
|-&lt;br /&gt;
||[[Mesh/Mesh_physics#Physics_Resource_Cost|Physics cost]] for a physical object&lt;br /&gt;
| n/a&lt;br /&gt;
| {{no|32.0}}&lt;br /&gt;
||Additional notes:&lt;br /&gt;
* If you try to link more, it&#039;ll either say &amp;quot;Can&#039;t enable physics for objects with more than 32 primitives&amp;quot; or &amp;quot;Object has too many primitives -- its dynamics have been disabled.&amp;quot;.&lt;br /&gt;
* On server versions 1.38 and below, each sitting avatar counted as 1 prim. From 1.40.2 the limit is only on actual prims.&lt;br /&gt;
| [[OBJECT_PHYSICS_COST]]&lt;br /&gt;
|-&lt;br /&gt;
||Build or rez height&lt;br /&gt;
| n/a&lt;br /&gt;
| {{no|4096.0 meters}}&lt;br /&gt;
| 768.0 meters for Viewers prior to version 1.20&lt;br /&gt;
| n/a&lt;br /&gt;
|-&lt;br /&gt;
||Prim name length&lt;br /&gt;
| n/a&lt;br /&gt;
| {{no|63 bytes UTF-8 [[String|string]]}}&lt;br /&gt;
| same limit for {{LSLGC|Avatar/Name|avatar names}}, although the character set for avatar names is significantly limited.&lt;br /&gt;
| n/a&lt;br /&gt;
|-&lt;br /&gt;
||Prim description length&lt;br /&gt;
| n/a&lt;br /&gt;
| {{no|127 bytes UTF-8 [[String|string]]}}&lt;br /&gt;
| n/a&lt;br /&gt;
| n/a&lt;br /&gt;
|-&lt;br /&gt;
||Temporary prims&#039; lifetime&lt;br /&gt;
| n/a&lt;br /&gt;
| {{no|up to around 60 seconds}}&lt;br /&gt;
| depends upon when the next garbage collector cycle is&lt;br /&gt;
| n/a&lt;br /&gt;
|-&lt;br /&gt;
||Number of temporary prims&lt;br /&gt;
| n/a&lt;br /&gt;
| {{no|RegionPrimLimit - NumberOfPrimsInRegion + Minimum(0.5*RegionPrimLimit, 1000)}}&lt;br /&gt;
| n/a&lt;br /&gt;
| n/a&lt;br /&gt;
|-&lt;br /&gt;
||Length of hovertext&lt;br /&gt;
| n/a&lt;br /&gt;
| {{no|254 bytes UTF-8 [[String|string]]}}&lt;br /&gt;
| n/a&lt;br /&gt;
| [[llSetText]] and [[PRIM_TEXT]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== [[Communication]] ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; width=&amp;quot;100%&amp;quot; {{Prettytable}}&lt;br /&gt;
|- {{Hl2}}&lt;br /&gt;
! &#039;&#039;&#039;Limit affects&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Lower limit&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Upper limit&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Comment&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;More coverage&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||Whisper distance&lt;br /&gt;
| n/a&lt;br /&gt;
| {{no|10 meters}}&lt;br /&gt;
| &amp;lt;code&amp;gt;/whisper&amp;lt;/code&amp;gt; as the first few characters in a message can be used in viewer-2-code based viewers in local chat.&lt;br /&gt;
| n/a&lt;br /&gt;
|-&lt;br /&gt;
||Chat distance&lt;br /&gt;
| n/a&lt;br /&gt;
| {{no|20 meters}}&lt;br /&gt;
| text spoken as a &amp;quot;chat&amp;quot; step &#039;&#039;&#039;within gestures&#039;&#039;&#039; cannot be shouted or whispered. /whisper and /shout &#039;&#039;can&#039;&#039; be used in the &amp;quot;Replace with&amp;quot; field.&lt;br /&gt;
| n/a&lt;br /&gt;
|-&lt;br /&gt;
||Shout distance&lt;br /&gt;
| n/a&lt;br /&gt;
| {{no|100 meters}}&lt;br /&gt;
| &amp;lt;code&amp;gt;/shout&amp;lt;/code&amp;gt; as the first few characters in a message can be used in viewer-2-code based viewers in local chat.&lt;br /&gt;
| n/a&lt;br /&gt;
|-&lt;br /&gt;
||Length of a chat message and whether or not it is truncated&lt;br /&gt;
| {{no|1 byte or single-byte character}}&lt;br /&gt;
| {{no|1024 bytes or single-byte characters}}&lt;br /&gt;
| Limit does not apply to instant messages via [[llInstantMessage]] and communication between IM and email, the limit there is 1023 bytes or single-byte characters.&lt;br /&gt;
&lt;br /&gt;
The viewer-to-server communication on &#039;&#039;negative&#039;&#039; channels is truncated to 254 bytes, and on &#039;&#039;positive&#039;&#039; channels, to 1023 bytes. These limits do not affect communication between scripts.&lt;br /&gt;
| [[llInstantMessage]]&lt;br /&gt;
|-&lt;br /&gt;
||Number of offline messages&lt;br /&gt;
| n/a&lt;br /&gt;
| {{no|Capped at 25 messages, unless the account has a Premium Subscription, in which case the cap raises to 50 messages.}}&lt;br /&gt;
| Number of offline messages (involving [[IM|IMs]], inventory offers, group notices, group invitations) received before messages get capped. Note: If autoAcceptNewInventory (debug setting) is set to TRUE (the default is FALSE), then all inventory offers, even above 25 (or 50 in the case of Premium members), go directly to inventory and do not count against the cap on offline messages. &lt;br /&gt;
| [[IM]] - [https://community.secondlife.com/t5/Featured-News/A-New-Perk-for-Premium-Subscribers/ba-p/2917357 Blog Post]&lt;br /&gt;
|-&lt;br /&gt;
||Length of a properly delivered email reply to an [[IM]]&lt;br /&gt;
| n/a&lt;br /&gt;
| {{no|1023 bytes or single-byte characters}}&lt;br /&gt;
| n/a&lt;br /&gt;
| n/a&lt;br /&gt;
|-&lt;br /&gt;
||Time after which a reply to an [[IM]] can be sent via email.&lt;br /&gt;
| {{no|when receiving the IM via email.}}&lt;br /&gt;
| {{no|5 days after receiving the offline IM via email.}}&lt;br /&gt;
| n/a&lt;br /&gt;
| [https://blogs.secondlife.com/community/features/blog/2007/02/06/im-to-e-mail-return-addresses-changing Second Life Blogs]&lt;br /&gt;
|-&lt;br /&gt;
||Time period for which [[IM|IMs]] are stored within Second Life.&lt;br /&gt;
| n/a&lt;br /&gt;
| {{no|31 days after receiving the [[IM]]}}&lt;br /&gt;
| [[User:Torley_Linden|Torley Linden]] confirmed this with [[User:Kelly_Linden|Kelly Linden]]&lt;br /&gt;
| n/a&lt;br /&gt;
|-&lt;br /&gt;
||Number of [[IM|IMs]] sent by an object within an hour&lt;br /&gt;
| n/a&lt;br /&gt;
| {{no|5000 per hour}}&lt;br /&gt;
| n/a&lt;br /&gt;
| n/a&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== [[Gesture]]s ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; width=&amp;quot;100%&amp;quot; {{Prettytable}}&lt;br /&gt;
|- {{Hl2}}&lt;br /&gt;
! &#039;&#039;&#039;Limit affects&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Lower limit&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Upper limit&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Comment&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;More coverage&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||Shortcut key mappings&lt;br /&gt;
| n/a&lt;br /&gt;
| {{no|33 unique combinations, since {{K|F2}}&amp;amp;ndash;{{K|F12}} can be used with the {{K|Ctrl}} or {{K|Shift}} modifiers.}}&lt;br /&gt;
| n/a&lt;br /&gt;
| [[All_keyboard_shortcut_keys]] and [http://community.secondlife.com/t5/English-Knowledge-Base/Keyboard-shortcuts/ta-p/1086557 the knowledge base]&lt;br /&gt;
|-&lt;br /&gt;
||Chat step length&lt;br /&gt;
| n/a&lt;br /&gt;
| {{no|127 bytes or single-byte characters}}&lt;br /&gt;
| n/a&lt;br /&gt;
| n/a&lt;br /&gt;
|-&lt;br /&gt;
||Wait time&lt;br /&gt;
| n/a&lt;br /&gt;
| {{no|3600 seconds (which is one hour)}}&lt;br /&gt;
| n/a&lt;br /&gt;
| n/a&lt;br /&gt;
|-&lt;br /&gt;
| Maximum steps data&lt;br /&gt;
| n/a&lt;br /&gt;
| {{no|1000 bytes}} of packed data; saving with more data returns the message &amp;quot;Gesture save failed. This gesture has too many steps. Try removing some steps, then save again.&amp;quot; Shorter text, for example, will allow more steps.&lt;br /&gt;
| n/a&lt;br /&gt;
| n/a&lt;br /&gt;
|-&lt;br /&gt;
||Length of included assets&lt;br /&gt;
| n/a&lt;br /&gt;
| see sections for [[#Animation|animation]], [[#Sound|sound]]&lt;br /&gt;
| n/a&lt;br /&gt;
| n/a&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== [[Group]]s ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Maximum number of groups you can belong to:&#039;&#039;&#039; 42 for Basic accounts, 60 for Premium accounts.&lt;br /&gt;
** After downgrading from a Premium account to a Basic account, you may not join any new groups until you are a member of fewer than 42 groups.&lt;br /&gt;
** Roles within groups are sort of like sub-groups. In many cases, you can use them instead of creating new groups.&lt;br /&gt;
* &#039;&#039;&#039;Minimum number of members in a group:&#039;&#039;&#039; 2&lt;br /&gt;
** A group with only 1 person for 48 hours will be disbanded (cancelled). Unless the group owns land.&lt;br /&gt;
* &#039;&#039;&#039;Maximum number of roles allowed in a group:&#039;&#039;&#039; 10 (including &amp;quot;Owners&amp;quot; and &amp;quot;Everyone&amp;quot;, which cannot be deleted)&lt;br /&gt;
* &#039;&#039;&#039;Maximum Group Name:&#039;&#039;&#039; 35 single-byte characters.&lt;br /&gt;
* &#039;&#039;&#039;Maximum Group Title:&#039;&#039;&#039; 20 single-byte characters.&lt;br /&gt;
* &#039;&#039;&#039;Maximum Length of a Group Notice:&#039;&#039;&#039; 512 single-byte characters.&lt;br /&gt;
* &#039;&#039;&#039;Maximum Age of a Group Notice:&#039;&#039;&#039; 14 days.&lt;br /&gt;
&lt;br /&gt;
== [[Inventory]] ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Maximum number of inventory items that can be sent in a folder:&#039;&#039;&#039; 42&lt;br /&gt;
** Folders count as items too. This has more to do with packet size limits than cheeky Douglas Adams references.&lt;br /&gt;
* &#039;&#039;&#039;Maximum number of inventory items that can be contained in a prim:&#039;&#039;&#039; None, but more items increase the loading time when you open it.&lt;br /&gt;
** &amp;lt;pre style=&amp;quot;color: red&amp;quot;&amp;gt;&#039;&#039;&#039;WARNING:&#039;&#039;&#039; This may soon change to 10k items per prim. If the change is implemented, prims with &amp;gt;10k items will no longer rez.&amp;lt;/pre&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Maximum characters in an inventory item name:&#039;&#039;&#039; 63&lt;br /&gt;
* &#039;&#039;&#039;Maximum notecard line:&#039;&#039;&#039; None, but scripts can only read the first 255 bytes.&lt;br /&gt;
* &#039;&#039;&#039;Maximum notecard size:&#039;&#039;&#039; 65,536 bytes&lt;br /&gt;
* &#039;&#039;&#039;Number of items in the Library:&#039;&#039;&#039; 1,248 as of 2010-06-17&lt;br /&gt;
* &#039;&#039;&#039;Number of items in the Library:&#039;&#039;&#039; 2,210 as of 2012-11-04&lt;br /&gt;
** Verified by [[How_does_the_Library_work|hiding the Library]] and counting the difference.&lt;br /&gt;
* &#039;&#039;&#039;Maximum number of inventory items displayed in a single inventory folder:&#039;&#039;&#039; Several thousand. &amp;lt;!-- not a specific item count, because the data is variable size, but still useful to document that there is a limit. --&amp;gt;&lt;br /&gt;
** This was discussed during [http://wiki.secondlife.com/wiki/Simulator_User_Group/Transcripts/2011.03.08] &amp;quot;the folder will load up to the limit number of items, and remaining ones won&#039;t show up in the viewer. you still own them, they aren&#039;t lost, but they will be hidden until the folder size is reduced.&amp;quot;&lt;br /&gt;
** There is no specified limit for total avatar inventory, very large folders can be split.&lt;br /&gt;
** There was discussion in the Third Party Developers&#039; UG (4/10/2015) meeting about new inventory and login problems from having large numbers of items in a single folder. AISv3 &#039;&#039;removed&#039;&#039; server side limits on the number of items in a folder. Flat inventories are bad. No one is certain at what number of items in a folder cause a login problem. The fix is to clear the inventory cache (not the viewer cache) and log into a deserted, empty region then move inventory items into folders and sub-folders. - The problem appears at different a number of items depending on your computer and connection speed. Hopefully being on an empty region will give one enough edge to get logged in and do some corrective work before being dropped.&lt;br /&gt;
&lt;br /&gt;
== [[Land]] ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Maximum [[Land#Parcel|parcel]] size:&#039;&#039;&#039; 65,536 meters²&lt;br /&gt;
** Covering a whole region, or square on the World Map.&lt;br /&gt;
* &#039;&#039;&#039;Minimum parcel size:&#039;&#039;&#039; 16 meters²&lt;br /&gt;
* &#039;&#039;&#039;Maximum parcel name length:&#039;&#039;&#039; 63 single-byte characters&lt;br /&gt;
* &#039;&#039;&#039;Maximum parcel description length:&#039;&#039;&#039; 255 characters&lt;br /&gt;
* &#039;&#039;&#039;Region name length:&#039;&#039;&#039; Under Linden Concierge policy, minimum of 3 characters, and a maximum of 25 characters (including spaces). See [[Linden Lab Official:Guidelines for Private Region Naming|Guidelines for Private Region Naming]].&lt;br /&gt;
** Rare exceptions exist, like [http://slurl.com/secondlife/X/128/128/24 X].&lt;br /&gt;
* &#039;&#039;&#039;Maximum ban line height for &amp;quot;no entry&amp;quot; or &amp;quot;pay to access&amp;quot;&#039;&#039;&#039; (in other words, &amp;quot;allow public access&amp;quot; is turned off, or &amp;quot;allow group access&amp;quot; is turned on, in the parcel options) is the parcel&#039;s ground elevation &#039;&#039;plus&#039;&#039; 50 meters. If a user is &#039;&#039;&#039;explicitly banned by name&#039;&#039;&#039;, the height is the parcel&#039;s ground elevation &#039;&#039;plus&#039;&#039; 5000 meters. On current viewers this is visible to the full extent.&lt;br /&gt;
* &#039;&#039;&#039;Maximum prims in a [[Land#Region|region]]:&#039;&#039;&#039;&lt;br /&gt;
** Full region: 15,000&lt;br /&gt;
** [[Land#Homestead|Homestead]]: 3,750&lt;br /&gt;
** [[Land#Openspace|Openspace]]: 750&lt;br /&gt;
* &#039;&#039;&#039;Maximum auto return value&#039;&#039;&#039;: Besides &amp;quot;0&amp;quot; (which means &#039;&#039;never&#039;&#039;), {{HoverText|999,999|Almost 23 months}} minutes is the highest auto return value.&lt;br /&gt;
* &#039;&#039;&#039;Terraforming limits:&#039;&#039;&#039;&lt;br /&gt;
** Most mainland can be raised/lowered by 4 meters (+/-).&lt;br /&gt;
** Some mainland cannot be terraformed, including: Bay City regions, Boardman, Brown, De Haro, Kama City regions, Nautilus City regions, Nova Albion regions, and Shermerville regions.&lt;br /&gt;
** [http://community.secondlife.com/t5/English-Knowledge-Base/Linden-Homes/ta-p/700103 Linden Homes] do not allow terraforming.&lt;br /&gt;
** A few, very old mainland Regions like Da Boom have a terraform range of 40 meters (+/-).&lt;br /&gt;
** Estate (private island) terraformability is settable to a maximum of 100 meters (+/-) by the estate owner or managers.&lt;br /&gt;
* &#039;&#039;&#039;Maximum water height:&#039;&#039;&#039; 100 meters using inworld controls, 255 meters by using a *.raw file upload.&lt;br /&gt;
** Region water height is usually 20 meters, and adjacent regions should have the same water height, or else they will look discontinuous.&lt;br /&gt;
* &#039;&#039;&#039;Maximum terrain height:&#039;&#039;&#039; 255 meters using inworld controls (mainland limit), 510 meters by using a *.raw file upload.&lt;br /&gt;
* &#039;&#039;&#039;Miscellaneous estate limits:&#039;&#039;&#039; You can have a maximum of 10 estate managers, 500 allowed Residents, 63 allowed groups, and 500 banned Residents.&lt;br /&gt;
** See World menu &amp;gt; Region/Estate &amp;gt; Estate tab.&lt;br /&gt;
* &#039;&#039;&#039;Maximum number of agents&#039;&#039;&#039;&lt;br /&gt;
** Full region: 100 (Typically set to 40 on mainland, 55 on Linden Homes regions, but this does vary. Some meeting areas have this set to 60 and higher.)&lt;br /&gt;
*** Recent server performance improvements make regions with 60 agents in them perform quite well.&lt;br /&gt;
** [[Land#Homestead|Homestead]]: 20&lt;br /&gt;
** [[Land#Openspace|Openspace]]: 10&lt;br /&gt;
* &#039;&#039;&#039;Freeze Time:&#039;&#039;&#039; Land owners can [[freeze]] other Residents for up to 30 seconds.  Members of land owning groups can also be granted this ability.&lt;br /&gt;
* &#039;&#039;&#039;Minimum parcel that can be listed in Places or All search:&#039;&#039;&#039; 144 meters² &amp;lt;!-- 128 and under are disabled --&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Minimum parcel that can be listed in Events:&#039;&#039;&#039; 512 meters²&lt;br /&gt;
* &#039;&#039;&#039;Maximum altitude for event listings:&#039;&#039;&#039;  768 meters ({{JIRA|WEB-814}})&lt;br /&gt;
* &#039;&#039;&#039;Maximum heights that objects can be seen on the [[World Map]]:&#039;&#039;&#039; 400.005m&lt;br /&gt;
&lt;br /&gt;
== [[Mesh]] ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; width=&amp;quot;100%&amp;quot; {{Prettytable}}&lt;br /&gt;
|- {{Hl2}}&lt;br /&gt;
! &#039;&#039;&#039;Limit affects&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Lower limit&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Upper limit&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Comment&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;More coverage&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||Number of vertices&lt;br /&gt;
| n/a&lt;br /&gt;
| {{no|65536 vertices per LOD for each [[mesh]] - See [[Talk:Limits#Mesh_Limits|discussion page]]}}&lt;br /&gt;
| n/a&lt;br /&gt;
| n/a&lt;br /&gt;
|-&lt;br /&gt;
||COLLADA file size&lt;br /&gt;
| n/a&lt;br /&gt;
| {{no|Maximum mesh asset size after compression is 8 MB, roughly equivalent to a 256 MB Raw COLLADA file.}}&lt;br /&gt;
| n/a&lt;br /&gt;
| n/a&lt;br /&gt;
|-&lt;br /&gt;
||Bone influence weights per vertex&lt;br /&gt;
| n/a&lt;br /&gt;
| {{no|4}}&lt;br /&gt;
| n/a&lt;br /&gt;
| n/a&lt;br /&gt;
|-&lt;br /&gt;
||Number of materials per mesh&lt;br /&gt;
| n/a&lt;br /&gt;
| {{no|8}}&lt;br /&gt;
| n/a&lt;br /&gt;
| n/a&lt;br /&gt;
|-&lt;br /&gt;
||Number of materials per face&lt;br /&gt;
| n/a&lt;br /&gt;
| {{no|1}}&lt;br /&gt;
| n/a&lt;br /&gt;
| n/a&lt;br /&gt;
|-&lt;br /&gt;
||Physics weight for a vehicle&lt;br /&gt;
| n/a&lt;br /&gt;
| {{no|32.0}}&lt;br /&gt;
| n/a&lt;br /&gt;
| n/a&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===User Found Temporary Mesh limits:===&lt;br /&gt;
&#039;&#039;Because of an apparent bug in the importer stay within these limits.&#039;&#039;&lt;br /&gt;
* 174,752 triangles, beyond which additional triangles will appear as holes.&lt;br /&gt;
* The 64k vertices per material is pre-empted by a limit of 21,844 triangles per material, which is presently reported as {{Jira|BUG-1001}}. (4/2014 - See [[Talk:Limits#Mesh_Limits|discussion page]])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:: The import process will continue making new materials beyond 8 x 21,844 (=174,752) triangles, but the extra triangles then get dropped by the limitation to 8 materials, causing holes in the resulting object. Over the 21,844 triangle limit, the vertex count will start to climb steeply, even with smooth shading, because the materials get highly interspersed. So the same vertices have to appear in multiple material lists. So the moral of the story is to stay below 21,844 triangles per material, for now, if you want to avoid some unexpected effects.&lt;br /&gt;
&lt;br /&gt;
::Since viewer release 3.8.4, processing of meshes in the Collada file that have faces assigned to more than 8 materials has changed. Instead of simply dropping the extra material faces, the uploader now creates a new object to accommodate them. The result is that the single mesh is divided into multiple objects (prims) in a linkset. Thus the limitation to 8 materials is removed as far as input is concerned, but still applies to each of the resulting linked objects actually uploaded. As a consequence it is now possible to upload a mesh with more than 174,752 triangles, although it will be divided into multiple objects.&lt;br /&gt;
&lt;br /&gt;
== Misc. ==&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;[https://secondlife.com/currency/describe-limits.php Billing and Trading Limits]&#039;&#039;&#039; - Includes [https://secondlife.com/whatis/economy-market.php LindeX] currency exchange limits.&lt;br /&gt;
*&#039;&#039;&#039;Contacts in Communication &amp;gt; Friends tab &#039;&#039;&#039; - A maximum of 20 simultaneous contacts can be selected to change permissions, remove, or invite for a conference chat.&lt;br /&gt;
&lt;br /&gt;
== Navigation ==&lt;br /&gt;
&lt;br /&gt;
[[File:Max Alt.jpg|thumb|right|435px|&#039;&#039;&#039;Height counter error above 2147483647 meters&#039;&#039;&#039;]]&lt;br /&gt;
* &#039;&#039;&#039;Absolute height limit:&#039;&#039;&#039; [http://en.wikipedia.org/wiki/2147483647#2147483647_in_computing 2147483647]&amp;amp;nbsp;=&amp;amp;nbsp;2&amp;lt;sup&amp;gt;31&amp;lt;/sup&amp;gt;&amp;amp;nbsp;−&amp;amp;nbsp;1 meters, which causes the altitude counter to roll over. Altitudes well below this cause graphics errors probably due to limited floating point number precision.&lt;br /&gt;
* &#039;&#039;&#039;Highest z-value of an [[SLurl]], that will still teleport you to a positive altitude:&#039;&#039;&#039; 4096&lt;br /&gt;
** This used to be much higher, but is clamped in late model viewers.&lt;br /&gt;
&lt;br /&gt;
== [[Profile]] ==&lt;br /&gt;
&lt;br /&gt;
Each 7-bit ASCII character is encoded in one byte. International characters might need more bytes. When pasting text instead of typing, you can get in one byte more into each of the below.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;2nd Life tab&#039;s About field&#039;&#039;&#039; - 510 bytes&lt;br /&gt;
* &#039;&#039;&#039;Picks tab&#039;&#039;&#039; - 10 picks with 1022 bytes each&lt;br /&gt;
* &#039;&#039;&#039;1st Life tab&#039;s Info field&#039;&#039;&#039; - 253 bytes&lt;br /&gt;
* &#039;&#039;&#039;Classified tab&#039;&#039;&#039; - 100 listings with x bytes each&lt;br /&gt;
* &#039;&#039;&#039;My Notes&#039;&#039;&#039; - 1022 bytes&lt;br /&gt;
&lt;br /&gt;
== Performance ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Healthy Viewer FPS&#039;&#039;&#039; - Generally, FPS above 15 is good. The higher it gets, the smoother. You can check via [[Advanced]] menu &amp;gt; Performance Tools &amp;gt; Lag Meter, or for more advanced usage, see Advanced &amp;gt; Performance Tools &amp;gt; Statistics Bar.&lt;br /&gt;
* &#039;&#039;&#039;Avatar Rendering Cost scores&#039;&#039;&#039; - [[Avatar Rendering Cost|Learn all about it!]]&lt;br /&gt;
&lt;br /&gt;
== [[Scripting]] == &amp;lt;!-- Important scripting limits should be placed here, less important ones should be in the articles Caveats or Specification sections --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Height at which scripts reactivate on a no-script parcel&#039;&#039;&#039; - 50 m above terrain mesh. Scripted objects that take controls will keep running when you fly down or enter a no-script parcel. (If scripts are disabled in the region debug panel, they will not run at any height.)&lt;br /&gt;
* &#039;&#039;&#039;Maximum height where scripts can run&#039;&#039;&#039; - none, as long as the object remains rezzed or attached.&lt;br /&gt;
* &#039;&#039;&#039;Maximum script source code size&#039;&#039;&#039; - 65536 single byte characters (that&#039;s a viewer limit and can be changed in the config file &#039;panel_script_ed.xml&#039;).&lt;br /&gt;
* &#039;&#039;&#039;Maximum script memory size (LSO)&#039;&#039;&#039; - 16384 bytes.&lt;br /&gt;
* &#039;&#039;&#039;Maximum script memory size (Mono)&#039;&#039;&#039; - 65536 bytes (the maximum memory available to Mono scripts can be constrained via [[llSetMemoryLimit]]).&lt;br /&gt;
* &#039;&#039;&#039;Maximum active [[llListen|listeners]] per script&#039;&#039;&#039; - 65.&lt;br /&gt;
** &#039;&#039;&#039;Usable channel for each listener&#039;&#039;&#039; - &#039;&#039;min.&#039;&#039; -2147483648, &#039;&#039;max.&#039;&#039; 2147483647, including the following special channels: [[PUBLIC_CHANNEL]] &#039;&#039;and&#039;&#039; [[DEBUG_CHANNEL]].&lt;br /&gt;
* For specific scripting limits, look up calls in the &#039;&#039;&#039;[[LSL Portal]]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== [[Sound]] ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; width=&amp;quot;100%&amp;quot; {{Prettytable}}&lt;br /&gt;
|- {{Hl2}}&lt;br /&gt;
! &#039;&#039;&#039;Limit affects&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Lower limit&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Upper limit&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Comment&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;More coverage&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||Sound length&lt;br /&gt;
| n/a&lt;br /&gt;
| {{no|10.00000 seconds (441,000 samples)}}&lt;br /&gt;
| 441,001 samples (10.00002 seconds) won&#039;t work. You&#039;re advised to cut longer sounds into 9.9-second-pieces.&lt;br /&gt;
| n/a&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== [[Textures]] ==&lt;br /&gt;
* &#039;&#039;&#039;[http://en.wikipedia.org/wiki/Aspect_ratio Aspect ratios]&#039;&#039;&#039; of profile, place, etc. pictures — all of these were measured at UI size (Edit menu &amp;gt; Preferences &amp;gt; General tab &amp;gt; UI Size) = 1.000:&lt;br /&gt;
&lt;br /&gt;
=== Second Life Viewer 3.6 ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Search &amp;gt; Classifieds thumbnail&#039;&#039;&#039; - ~3:2 (101&amp;amp;times;69 pixels)&lt;br /&gt;
* &#039;&#039;&#039;Search &amp;gt; Classifieds expanded&#039;&#039;&#039; - ~4:3 (159&amp;amp;times;120 pixels)&lt;br /&gt;
* &#039;&#039;&#039;Search &amp;gt; Classifieds expanded &amp;gt; More Info&#039;&#039;&#039; - native aspect ratio&lt;br /&gt;
* &#039;&#039;&#039;Search &amp;gt; Destination Guide thumbnail&#039;&#039;&#039; - ~3:2 (101&amp;amp;times;69 pixels) &lt;br /&gt;
* &#039;&#039;&#039;Search &amp;gt; Destination Guide expanded&#039;&#039;&#039; - ~4:3 (159&amp;amp;times;120 pixels)&lt;br /&gt;
* &#039;&#039;&#039;Search &amp;gt; People&#039;&#039;&#039; - 1:1 (100&amp;amp;times;100 pixels)&lt;br /&gt;
* &#039;&#039;&#039;Search &amp;gt; Places expanded&#039;&#039;&#039; ~4:3 (159&amp;amp;times;120 pixels)&lt;br /&gt;
* &#039;&#039;&#039;Place Profile&#039;&#039;&#039; - ~3:2 (290&amp;amp;times;197 pixels)&lt;br /&gt;
* &#039;&#039;&#039;About Land &amp;gt; Options tab&#039;&#039;&#039; - ~4:3 (195&amp;amp;times;150 pixels)&lt;br /&gt;
* &#039;&#039;&#039;Profile &amp;gt; Picture&#039;&#039;&#039; - native aspect ratio; thumbnail cropped to 72&amp;amp;times;72 pixels; zoomed uncropped up to 300&amp;amp;times;300 pixels&lt;br /&gt;
* &#039;&#039;&#039;Profile &amp;gt; Real world picture&#039;&#039;&#039; - native aspect ratio; thumbnail cropped to 45&amp;amp;times;45 pixels; zoomed uncropped up to 300&amp;amp;times;300 pixels&lt;br /&gt;
* &#039;&#039;&#039;Profile &amp;gt; Picks thumbnail&#039;&#039;&#039; - 4:3 (60&amp;amp;times;45 pixels)&lt;br /&gt;
* &#039;&#039;&#039;Profile &amp;gt; Pick expanded&#039;&#039;&#039; - 4:3 (320&amp;amp;times;240 pixels)&lt;br /&gt;
&lt;br /&gt;
=== 1.x Series Viewers ===&lt;br /&gt;
(official Viewer up to 1.23.5, still used by some [[Alternate viewers|Third Party Viewers]])&lt;br /&gt;
* &#039;&#039;&#039;Search &amp;gt; All for &amp;quot;Classifieds&amp;quot;, &amp;quot;People&amp;quot;, and &amp;quot;Places&amp;quot;&#039;&#039;&#039; - 4:3 (256&amp;amp;times;192 pi&amp;amp;times;els)&lt;br /&gt;
* &#039;&#039;&#039;Search &amp;gt; Places and Classified tabs&#039;&#039;&#039; - ~7:5 (398&amp;amp;times;282 pixels)&lt;br /&gt;
* &#039;&#039;&#039;Search &amp;gt; Land tab&#039;&#039;&#039; - ~7:5 (358&amp;amp;times;252 pixels)&lt;br /&gt;
* &#039;&#039;&#039;Profile &amp;gt; 2nd Life tab&#039;&#039;&#039; - ~4:3 (178&amp;amp;times;133 pixels)&lt;br /&gt;
* &#039;&#039;&#039;Profile &amp;gt; Picks tab&#039;&#039;&#039; - 16:9 (288&amp;amp;times;162 pixels)&lt;br /&gt;
* &#039;&#039;&#039;Profile &amp;gt; 1st Life tab&#039;&#039;&#039; - 1:1 (133&amp;amp;times;133 pixels)&lt;br /&gt;
* &#039;&#039;&#039;Profile &amp;gt; Classifieds tab&#039;&#039;&#039; - ~3:2 (206&amp;amp;times;137 pixels)&lt;br /&gt;
* &#039;&#039;&#039;Profile &amp;gt; Web tab&#039;&#039;&#039; - 1:1 (400&amp;amp;times;400 pixels)&lt;br /&gt;
** A scrollbar uses 15 pixels on the right-hand side.&lt;br /&gt;
* &#039;&#039;&#039;About Land &amp;gt; Options tab&#039;&#039;&#039; - ~3:2 (178&amp;amp;times;117 pixels)&lt;br /&gt;
* &#039;&#039;&#039;Group Information &amp;gt; General tab&#039;s &amp;quot;Group Insignia&amp;quot;&#039;&#039;&#039; - 1:1 (126&amp;amp;times;126 pixels)&lt;br /&gt;
** Some of these textures are shared (for example, Search &amp;gt; All place pages, Search &amp;gt; Places, and About Land &amp;gt; Options use the same image), so you should pick a well-balanced ratio and size.&lt;br /&gt;
** [[Texture_aspect_ratios|Learn how to get correct texture aspect ratios when editing images.]]&lt;br /&gt;
&lt;br /&gt;
=== All Viewers ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Maximum texture size&#039;&#039;&#039; - 1024&amp;amp;times;1024 pixels&lt;br /&gt;
** All Second Life textures are constrained to [http://en.wikipedia.org/wiki/Power_of_2 powers of 2] (e.g., 128, 256, 512).&lt;br /&gt;
** Some textures inworld have a resolution as high as 2048&amp;amp;times;2048; this is due to a previous limit that was higher.&lt;br /&gt;
** We strongly recommend you use as small textures as possible because larger ones consume more memory and take substantially longer to load.&lt;br /&gt;
** Where large textures are being forced by import to only 512&amp;amp;times;512, lower your ...&amp;gt; Preferences &amp;gt;...&amp;gt; UI Size under 1.0, to increase import size to the max 1024&amp;amp;times;1024.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Minimum texture size&#039;&#039;&#039; - 4&amp;amp;times;4 pixels&lt;br /&gt;
** This means that there are nine possible image dimensions: 4, 8, 16, 32, 64, 128, 256, 512, and 1024 pixels, either horizontal or vertical.&lt;br /&gt;
&lt;br /&gt;
[[Category:Creation]] [[Category:Tutorials]] [[Category:Lists]]&lt;br /&gt;
&lt;br /&gt;
=== Notes ===&lt;br /&gt;
In general 1 byte is enough to contain one character.&lt;/div&gt;</summary>
		<author><name>Darien Caldwell</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LSL_Protocol/OpenRadioCommunication&amp;diff=1200522</id>
		<title>LSL Protocol/OpenRadioCommunication</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LSL_Protocol/OpenRadioCommunication&amp;diff=1200522"/>
		<updated>2016-06-26T03:36:57Z</updated>

		<summary type="html">&lt;p&gt;Darien Caldwell: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Open Radio Communication (ORC for short) Is a &amp;quot;binary like&amp;quot; radio system designed for small simple applications, where part of the goal is to have equipments interfere with eachothers.&lt;br /&gt;
=Channels=&lt;br /&gt;
The channels used by ORC go from -797386 to -797186 with 200 independent frequencies.&lt;br /&gt;
&lt;br /&gt;
Frequency &amp;quot;friendly&amp;quot; numbers go from 88.1 to 108.1.&lt;br /&gt;
&lt;br /&gt;
=API=&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
//Open Radio System v0.1&lt;br /&gt;
&lt;br /&gt;
integer POWER_LOW 	= 0;//whisper&lt;br /&gt;
integer POWER_MED 	= 1;//say&lt;br /&gt;
integer POWER_HI 	= 2;//shout&lt;br /&gt;
integer POWER_MAX 	= 3;//region&lt;br /&gt;
&lt;br /&gt;
integer CHANNEL = -798267; //ORC in decimal basically&lt;br /&gt;
integer giSubchannel;&lt;br /&gt;
//This function is used to trim/pad data to length&lt;br /&gt;
string Size(integer iData,integer iBytes)&lt;br /&gt;
{&lt;br /&gt;
	string s = (string)iData;&lt;br /&gt;
	while(llStringLength(s)&amp;lt;iBytes)&lt;br /&gt;
			s = &amp;quot;0&amp;quot;+s;&lt;br /&gt;
	if(llStringLength(s)&amp;gt;iBytes)&lt;br /&gt;
		s = llGetSubString(s,-iBytes,-1);&lt;br /&gt;
	return s;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////RECEIVER//////////////////////////////////////////&lt;br /&gt;
//Functions to listen and read an OpenRC datastream										  //&lt;br /&gt;
//////////////////////////////////////////RECEIVER//////////////////////////////////////////&lt;br /&gt;
integer giReceiverPointer;&lt;br /&gt;
integer giReceiverHandle = -1;&lt;br /&gt;
integer Receiver(float fFrequency)&lt;br /&gt;
{&lt;br /&gt;
	integer iFrequency = llAbs((integer)(fFrequency*10));&lt;br /&gt;
	//set frequency to zero to turn receiver off.&lt;br /&gt;
	if(iFrequency == 0)&lt;br /&gt;
	{&lt;br /&gt;
		if(giReceiverHandle != -1)&lt;br /&gt;
			llListenRemove(giReceiverHandle);&lt;br /&gt;
		giReceiverHandle = -1;&lt;br /&gt;
		return -1;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// 88.1 to 108.1 expressed as 881 to 1081 -&amp;gt; 200 possible frequencies&lt;br /&gt;
	if(iFrequency &amp;lt; 881)&lt;br /&gt;
		iFrequency = 881;&lt;br /&gt;
	else if(iFrequency &amp;gt; 1081)&lt;br /&gt;
		iFrequency = 1081;&lt;br /&gt;
&lt;br /&gt;
	if(giReceiverHandle != -1)&lt;br /&gt;
		llListenRemove(giReceiverHandle);&lt;br /&gt;
	giSubchannel = CHANNEL+iFrequency;&lt;br /&gt;
	giReceiverHandle = llListen(giSubchannel,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;);&lt;br /&gt;
	return iFrequency;&lt;br /&gt;
}&lt;br /&gt;
ReceiverInit()&lt;br /&gt;
{&lt;br /&gt;
	//init basically set the pointer to 0&lt;br /&gt;
	giReceiverPointer = 0;&lt;br /&gt;
}&lt;br /&gt;
string ReceiverRead(string sDatastream,integer iBytes)&lt;br /&gt;
{&lt;br /&gt;
	//Main stream reader, read the number of bytes and move the pointer forward.&lt;br /&gt;
	string sData = llGetSubString(sDatastream,giReceiverPointer,giReceiverPointer + iBytes - 1);&lt;br /&gt;
	giReceiverPointer+=iBytes;&lt;br /&gt;
	return sData;&lt;br /&gt;
}&lt;br /&gt;
integer ReceiverReadInt(string sDatastream,integer iBytes)&lt;br /&gt;
{&lt;br /&gt;
	return (integer)ReceiverRead(sDatastream,iBytes);&lt;br /&gt;
}&lt;br /&gt;
string ReceiverReadASCIIChar(string sDatastream)&lt;br /&gt;
{&lt;br /&gt;
	return ASCII2Char(ReceiverReadInt(sDatastream,3));&lt;br /&gt;
}&lt;br /&gt;
string ReceiverReadASCIIWord(string sDatastream)&lt;br /&gt;
{&lt;br /&gt;
	//first we attempt to read the header (charcount)&lt;br /&gt;
	integer iLength = ReceiverReadInt(sDatastream,3);&lt;br /&gt;
	if(iLength &amp;lt; 1)&lt;br /&gt;
		iLength = 0;&lt;br /&gt;
	string sBuffer = &amp;quot;&amp;quot;;&lt;br /&gt;
	integer i;&lt;br /&gt;
	for(i=0;i&amp;lt;iLength;i++)&lt;br /&gt;
		sBuffer += ReceiverReadASCIIChar(sDatastream);&lt;br /&gt;
	return sBuffer;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string ReceiverReadMorseWord(string sDatastream)&lt;br /&gt;
{&lt;br /&gt;
	//you should check the header manually! (000)&lt;br /&gt;
	string sBuffer = &amp;quot;&amp;quot;;&lt;br /&gt;
	integer iInt;&lt;br /&gt;
    do&lt;br /&gt;
    {&lt;br /&gt;
        iInt = ReceiverReadInt(sDatastream,1);&lt;br /&gt;
        if(iInt)&lt;br /&gt;
            sBuffer += (string)iInt;&lt;br /&gt;
    }&lt;br /&gt;
    while(iInt);&lt;br /&gt;
    &lt;br /&gt;
    return sBuffer;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////SENDER//////////////////////////////////////////&lt;br /&gt;
//Functions to build and send an OpenRCsend datastream									//&lt;br /&gt;
//////////////////////////////////////////SENDER//////////////////////////////////////////&lt;br /&gt;
string gsSendBuffer;&lt;br /&gt;
&lt;br /&gt;
//Execute before building a datastream to ensure that the send buffer is clean.&lt;br /&gt;
SendInit()&lt;br /&gt;
{&lt;br /&gt;
	gsSendBuffer = &amp;quot;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Used to add an integer to the datastream, only positive values, you can pick the number of bytes used&lt;br /&gt;
SendInt(integer iValue,integer iBytes)&lt;br /&gt;
{&lt;br /&gt;
	gsSendBuffer += Size(llAbs(iValue),iBytes);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Used to add an ASCII character to the datastream, each ascii char always use 3 bytes.&lt;br /&gt;
SendASCIIChar(string sChar)&lt;br /&gt;
{&lt;br /&gt;
	gsSendBuffer += Char2ASCII(sChar);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Used to add an ASCII word to the datastream, words use 3 bytes per character and 3 extra bytes as header.&lt;br /&gt;
SendASCIIWord(string sWord)&lt;br /&gt;
{&lt;br /&gt;
	//count the number of chars&lt;br /&gt;
	integer iCount = llStringLength(sWord) % 999; //max word size is 999 chars because 3 bytes max.&lt;br /&gt;
	integer i;&lt;br /&gt;
	SendInt(iCount,3);	//header of a word is it&#039;s total character count.&lt;br /&gt;
	for(i=0;i&amp;lt;iCount;i++)&lt;br /&gt;
		SendASCIIChar(llGetSubString(sWord,i,i));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Used to send a morse word on the datastream,this start with 000 and end with 000&lt;br /&gt;
//requires pre encoded morse!&lt;br /&gt;
SendMorseWord(string sWord)&lt;br /&gt;
{&lt;br /&gt;
    //count the number of chars&lt;br /&gt;
    integer iCount = llStringLength(sWord);&lt;br /&gt;
    integer i;&lt;br /&gt;
    SendInt(0,3);&lt;br /&gt;
    for(i=0;i&amp;lt;iCount;i++)&lt;br /&gt;
        SendInt((integer)llGetSubString(sWord,i,i),1);&lt;br /&gt;
    SendInt(0,3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Send the buffer and purge it&#039;s content, you have to set power and frequency here.&lt;br /&gt;
SendEnd(float fFrequency,integer iPower)&lt;br /&gt;
{&lt;br /&gt;
	integer iChannel = llAbs((integer)(fFrequency*10));&lt;br /&gt;
	// 88.1 to 108.1 expressed as 881 to 1081 -&amp;gt; 200 possible frequencies&lt;br /&gt;
	if(iChannel &amp;lt; 881)&lt;br /&gt;
		iChannel = 881;&lt;br /&gt;
	else if(iChannel &amp;gt; 1081)&lt;br /&gt;
		iChannel = 1081;&lt;br /&gt;
&lt;br /&gt;
	iChannel += CHANNEL;&lt;br /&gt;
	if(gsSendBuffer == &amp;quot;&amp;quot;)&lt;br /&gt;
		return;&lt;br /&gt;
	if(iPower == POWER_LOW)&lt;br /&gt;
		llWhisper(iChannel,gsSendBuffer);&lt;br /&gt;
	else if(iPower == POWER_HI)&lt;br /&gt;
		llShout(iChannel,gsSendBuffer);&lt;br /&gt;
	else if(iPower == POWER_MAX)&lt;br /&gt;
		llRegionSay(iChannel,gsSendBuffer);&lt;br /&gt;
	else&lt;br /&gt;
		llSay(iChannel,gsSendBuffer);&lt;br /&gt;
	gsSendBuffer = &amp;quot;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////CODEC//////////////////////////////////////////&lt;br /&gt;
//this is a basic ASCII coder/decoder toolset for char/word							   //&lt;br /&gt;
//////////////////////////////////////////CODEC//////////////////////////////////////////&lt;br /&gt;
//Conversion table to extended ascii, character index + 1 = value.&lt;br /&gt;
//                  1        10        20        30         40        50        60        70        80        90        100       110       120       130       140       150       160       170       180       190       200       210       220       230       240       250  255 (nbsp)&lt;br /&gt;
string ASCII = &amp;quot;☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼ !\&amp;quot;#$%&amp;amp;&#039;()*+,-./0123456789:;&amp;lt;=&amp;gt;?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø×ƒáíóúñÑªº¿®¬½¼¡«»░▒▓│┤ÁÂÀ©╣║╗╝¢¥┐└┴┬├─┼ãÃ╚╔╩╦╠═╬¤ðÐÊËÈıÍÎÏ┘┌█▄¦Ì▀ÓßÔÒõÕµþÞÚÛÙýÝ¯´­±‗¾¶§÷¸°¨·¹³²■ &amp;quot;;&lt;br /&gt;
//Turns the supplied character into a 3 byte integer.&lt;br /&gt;
string Char2ASCII(string sData)&lt;br /&gt;
{&lt;br /&gt;
	return Size(llSubStringIndex(ASCII,llGetSubString(sData,0,0)) + 1,3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Turns the supplied integer into it&#039;s corresponding character. values wrap around at ORC_ASCII length.&lt;br /&gt;
string ASCII2Char(integer iCharcode)&lt;br /&gt;
{&lt;br /&gt;
	iCharcode = llAbs(iCharcode) % (llStringLength(ASCII)+1);&lt;br /&gt;
	if(iCharcode &amp;lt;= 0)&lt;br /&gt;
		return &amp;quot;&amp;quot;;&lt;br /&gt;
	iCharcode--;	//shifting of 1 to account for the &amp;quot;&amp;quot; that is at position zero.&lt;br /&gt;
	return llGetSubString(ASCII,iCharcode,iCharcode);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
integer MORSE_SPACE = 1;&lt;br /&gt;
integer MORSE_SHORT = 2;&lt;br /&gt;
integer MORSE_LONG  = 3;&lt;br /&gt;
&lt;br /&gt;
list MORSE_SYMBOLS = [&amp;quot;&amp;quot;,&amp;quot; &amp;quot;,&amp;quot;.&amp;quot;,&amp;quot;-&amp;quot;];&lt;br /&gt;
string String2Morse(string sData)&lt;br /&gt;
{&lt;br /&gt;
	string buffer;&lt;br /&gt;
	integer i;&lt;br /&gt;
	integer max = llStringLength(sData);&lt;br /&gt;
	for(i=0;i&amp;lt;max;i++)&lt;br /&gt;
	{&lt;br /&gt;
	   integer value = llListFindList(MORSE_SYMBOLS,[llGetSubString(sData,i,i)]);&lt;br /&gt;
	   if(value &amp;lt; 0)&lt;br /&gt;
	       value = 0;&lt;br /&gt;
	   buffer += (string)value;&lt;br /&gt;
	}&lt;br /&gt;
    return buffer;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string Morse2String(string sData)&lt;br /&gt;
{&lt;br /&gt;
	string buffer;&lt;br /&gt;
    integer i;&lt;br /&gt;
    integer max = llStringLength(sData);&lt;br /&gt;
    for(i=0;i&amp;lt;max;i++)&lt;br /&gt;
        buffer += llList2String(MORSE_SYMBOLS,(integer)llGetSubString(sData,i,i));&lt;br /&gt;
	return buffer;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Examples=&lt;br /&gt;
==Sending a simple message with the API==&lt;br /&gt;
Note that in this example, we are sending int(5) and then a variable length ascii encoded text. It will have to be decoded in the same order to be reserved.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
state_entry()&lt;br /&gt;
{&lt;br /&gt;
    SendInit(); //Required before any transmission to setup the radio systems.&lt;br /&gt;
    SendInt(5000,5); //This will add a 5 digit long integer, containing the value 5000 to the buffer.&lt;br /&gt;
    SendASCIIWord(&amp;quot;Hello world!&amp;quot;); //This will add an ASCII encoded string of variable length to the sending buffer.&lt;br /&gt;
    SendEnd(105.5,POWER_MED); //This will send the buffer over channel 105.5 with the &amp;quot;medium&amp;quot; power setting (20 meters range)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Receiving a messages with the API==&lt;br /&gt;
The way variable length ascii encoded texts are stored, the first int(3) contains the length of the character chain, and then every subsequenct in(3) is a character.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
state_entry()&lt;br /&gt;
{&lt;br /&gt;
    Receiver(105.5); //Will start listening for messages on channel 105.5&lt;br /&gt;
}&lt;br /&gt;
listen(integer channel,string name,key id,string datastream)&lt;br /&gt;
{&lt;br /&gt;
    if(channel = giSubchannel &amp;amp;&amp;amp; giReceiverHandle != -1)&lt;br /&gt;
    {&lt;br /&gt;
        ReceiverInit(); //setup the ORC system for reading the datastream&lt;br /&gt;
        &lt;br /&gt;
        integer value = ReceiverReadInt(datastream,5); //read an Integer value of 5 digits.&lt;br /&gt;
        string text = ReceiverReadASCIIWord(datastream); //read a variable length Ascii word.&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Darien Caldwell</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LSL_Protocol/OpenRadioCommunication&amp;diff=1200521</id>
		<title>LSL Protocol/OpenRadioCommunication</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LSL_Protocol/OpenRadioCommunication&amp;diff=1200521"/>
		<updated>2016-06-26T03:31:00Z</updated>

		<summary type="html">&lt;p&gt;Darien Caldwell: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Open Radio Communication (ORC for short) Is a &amp;quot;binary like&amp;quot; radio system designed for small simple applications, where part of the goal is to have equipments interfere with eachothers.&lt;br /&gt;
=Channels=&lt;br /&gt;
The channels used by ORC go from -797386 to -797186 with 200 independent frequencies.&lt;br /&gt;
&lt;br /&gt;
Frequency &amp;quot;friendly&amp;quot; numbers go from 88.1 to 108.1.&lt;br /&gt;
&lt;br /&gt;
=API=&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
//Open Radio System v0.1&lt;br /&gt;
&lt;br /&gt;
integer POWER_LOW 	= 0;//whisper&lt;br /&gt;
integer POWER_MED 	= 1;//say&lt;br /&gt;
integer POWER_HI 	= 2;//shout&lt;br /&gt;
integer POWER_MAX 	= 3;//region&lt;br /&gt;
&lt;br /&gt;
integer CHANNEL = -798267; //ORC in decimal basically&lt;br /&gt;
integer giSubchannel;&lt;br /&gt;
//This function is used to trim/pad data to length&lt;br /&gt;
string Size(integer iData,integer iBytes)&lt;br /&gt;
{&lt;br /&gt;
	string s = (string)iData;&lt;br /&gt;
	while(llStringLength(s)&amp;lt;iBytes)&lt;br /&gt;
			s = &amp;quot;0&amp;quot;+s;&lt;br /&gt;
	if(llStringLength(s)&amp;gt;iBytes)&lt;br /&gt;
		s = llGetSubString(s,-iBytes,-1);&lt;br /&gt;
	return s;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////RECEIVER//////////////////////////////////////////&lt;br /&gt;
//Functions to listen and read an OpenRC datastream										  //&lt;br /&gt;
//////////////////////////////////////////RECEIVER//////////////////////////////////////////&lt;br /&gt;
integer giReceiverPointer;&lt;br /&gt;
integer giReceiverHandle = -1;&lt;br /&gt;
integer Receiver(float fFrequency)&lt;br /&gt;
{&lt;br /&gt;
	integer iFrequency = llAbs((integer)(fFrequency*10));&lt;br /&gt;
	//set frequency to zero to turn receiver off.&lt;br /&gt;
	if(iFrequency == 0)&lt;br /&gt;
	{&lt;br /&gt;
		if(giReceiverHandle != -1)&lt;br /&gt;
			llListenRemove(giReceiverHandle);&lt;br /&gt;
		giReceiverHandle = -1;&lt;br /&gt;
		return -1;&lt;br /&gt;
	}&lt;br /&gt;
&lt;br /&gt;
	// 88.1 to 108.1 expressed as 881 to 1081 -&amp;gt; 200 possible frequencies&lt;br /&gt;
	if(iFrequency &amp;lt; 881)&lt;br /&gt;
		iFrequency = 881;&lt;br /&gt;
	else if(iFrequency &amp;gt; 1081)&lt;br /&gt;
		iFrequency = 1081;&lt;br /&gt;
&lt;br /&gt;
	if(giReceiverHandle != -1)&lt;br /&gt;
		llListenRemove(giReceiverHandle);&lt;br /&gt;
	giSubchannel = CHANNEL+iFrequency;&lt;br /&gt;
	giReceiverHandle = llListen(giSubchannel,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;,&amp;quot;&amp;quot;);&lt;br /&gt;
	return iFrequency;&lt;br /&gt;
}&lt;br /&gt;
ReceiverInit()&lt;br /&gt;
{&lt;br /&gt;
	//init basically set the pointer to 0&lt;br /&gt;
	giReceiverPointer = 0;&lt;br /&gt;
}&lt;br /&gt;
string ReceiverRead(string sDatastream,integer iBytes)&lt;br /&gt;
{&lt;br /&gt;
	//Main stream reader, read the number of bytes and move the pointer forward.&lt;br /&gt;
	string sData = llGetSubString(sDatastream,giReceiverPointer,giReceiverPointer + iBytes - 1);&lt;br /&gt;
	giReceiverPointer+=iBytes;&lt;br /&gt;
	return sData;&lt;br /&gt;
}&lt;br /&gt;
integer ReceiverReadInt(string sDatastream,integer iBytes)&lt;br /&gt;
{&lt;br /&gt;
	return (integer)ReceiverRead(sDatastream,iBytes);&lt;br /&gt;
}&lt;br /&gt;
string ReceiverReadASCIIChar(string sDatastream)&lt;br /&gt;
{&lt;br /&gt;
	return ASCII2Char(ReceiverReadInt(sDatastream,3));&lt;br /&gt;
}&lt;br /&gt;
string ReceiverReadASCIIWord(string sDatastream)&lt;br /&gt;
{&lt;br /&gt;
	//first we attempt to read the header (charcount)&lt;br /&gt;
	integer iLength = ReceiverReadInt(sDatastream,3);&lt;br /&gt;
	if(iLength &amp;lt; 1)&lt;br /&gt;
		iLength = 0;&lt;br /&gt;
	string sBuffer = &amp;quot;&amp;quot;;&lt;br /&gt;
	integer i;&lt;br /&gt;
	for(i=0;i&amp;lt;iLength;i++)&lt;br /&gt;
		sBuffer += ReceiverReadASCIIChar(sDatastream);&lt;br /&gt;
	return sBuffer;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string ReceiverReadMorseWord(string sDatastream)&lt;br /&gt;
{&lt;br /&gt;
	//you should check the header manually! (000)&lt;br /&gt;
	string sBuffer = &amp;quot;&amp;quot;;&lt;br /&gt;
	integer iInt;&lt;br /&gt;
    do&lt;br /&gt;
    {&lt;br /&gt;
        iInt = ReceiverReadInt(sDatastream,1);&lt;br /&gt;
        if(iInt)&lt;br /&gt;
            sBuffer += (string)iInt;&lt;br /&gt;
    }&lt;br /&gt;
    while(iInt);&lt;br /&gt;
    &lt;br /&gt;
    return sBuffer;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////SENDER//////////////////////////////////////////&lt;br /&gt;
//Functions to build and send an OpenRCsend datastream									//&lt;br /&gt;
//////////////////////////////////////////SENDER//////////////////////////////////////////&lt;br /&gt;
string gsSendBuffer;&lt;br /&gt;
&lt;br /&gt;
//Execute before building a datastream to ensure that the send buffer is clean.&lt;br /&gt;
SendInit()&lt;br /&gt;
{&lt;br /&gt;
	gsSendBuffer = &amp;quot;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Used to add an integer to the datastream, only positive values, you can pick the number of bytes used&lt;br /&gt;
SendInt(integer iValue,integer iBytes)&lt;br /&gt;
{&lt;br /&gt;
	gsSendBuffer += Size(llAbs(iValue),iBytes);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Used to add an ASCII character to the datastream, each ascii char always use 3 bytes.&lt;br /&gt;
SendASCIIChar(string sChar)&lt;br /&gt;
{&lt;br /&gt;
	gsSendBuffer += Char2ASCII(sChar);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Used to add an ASCII word to the datastream, words use 3 bytes per character and 3 extra bytes as header.&lt;br /&gt;
SendASCIIWord(string sWord)&lt;br /&gt;
{&lt;br /&gt;
	//count the number of chars&lt;br /&gt;
	integer iCount = llStringLength(sWord) % 999; //max word size is 999 chars because 3 bytes max.&lt;br /&gt;
	integer i;&lt;br /&gt;
	SendInt(iCount,3);	//header of a word is it&#039;s total character count.&lt;br /&gt;
	for(i=0;i&amp;lt;iCount;i++)&lt;br /&gt;
		SendASCIIChar(llGetSubString(sWord,i,i));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Used to send a morse word on the datastream,this start with 000 and end with 000&lt;br /&gt;
//requires pre encoded morse!&lt;br /&gt;
SendMorseWord(string sWord)&lt;br /&gt;
{&lt;br /&gt;
    //count the number of chars&lt;br /&gt;
    integer iCount = llStringLength(sWord);&lt;br /&gt;
    integer i;&lt;br /&gt;
    SendInt(0,3);&lt;br /&gt;
    for(i=0;i&amp;lt;iCount;i++)&lt;br /&gt;
        SendInt((integer)llGetSubString(sWord,i,i),1);&lt;br /&gt;
    SendInt(0,3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Send the buffer and purge it&#039;s content, you have to set power and frequency here.&lt;br /&gt;
SendEnd(float fFrequency,integer iPower)&lt;br /&gt;
{&lt;br /&gt;
	integer iChannel = llAbs((integer)(fFrequency*10));&lt;br /&gt;
	// 88.1 to 108.1 expressed as 881 to 1081 -&amp;gt; 200 possible frequencies&lt;br /&gt;
	if(iChannel &amp;lt; 881)&lt;br /&gt;
		iChannel = 881;&lt;br /&gt;
	else if(iChannel &amp;gt; 1081)&lt;br /&gt;
		iChannel = 1081;&lt;br /&gt;
&lt;br /&gt;
	iChannel += CHANNEL;&lt;br /&gt;
	if(gsSendBuffer == &amp;quot;&amp;quot;)&lt;br /&gt;
		return;&lt;br /&gt;
	if(iPower == POWER_LOW)&lt;br /&gt;
		llWhisper(iChannel,gsSendBuffer);&lt;br /&gt;
	else if(iPower == POWER_HI)&lt;br /&gt;
		llShout(iChannel,gsSendBuffer);&lt;br /&gt;
	else if(iPower == POWER_MAX)&lt;br /&gt;
		llRegionSay(iChannel,gsSendBuffer);&lt;br /&gt;
	else&lt;br /&gt;
		llSay(iChannel,gsSendBuffer);&lt;br /&gt;
	gsSendBuffer = &amp;quot;&amp;quot;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//////////////////////////////////////////CODEC//////////////////////////////////////////&lt;br /&gt;
//this is a basic ASCII coder/decoder toolset for char/word							   //&lt;br /&gt;
//////////////////////////////////////////CODEC//////////////////////////////////////////&lt;br /&gt;
//Conversion table to extended ascii, character index + 1 = value.&lt;br /&gt;
//                  1        10        20        30         40        50        60        70        80        90        100       110       120       130       140       150       160       170       180       190       200       210       220       230       240       250  255 (nbsp)&lt;br /&gt;
string ASCII = &amp;quot;☺☻♥♦♣♠•◘○◙♂♀♪♫☼►◄↕‼¶§▬↨↑↓→←∟↔▲▼ !\&amp;quot;#$%&amp;amp;&#039;()*+,-./0123456789:;&amp;lt;=&amp;gt;?@ABCDEFGHIJKLMNOPQRSTUVWXYZ[\]^_`abcdefghijklmnopqrstuvwxyz{|}~⌂ÇüéâäàåçêëèïîìÄÅÉæÆôöòûùÿÖÜø£Ø×ƒáíóúñÑªº¿®¬½¼¡«»░▒▓│┤ÁÂÀ©╣║╗╝¢¥┐└┴┬├─┼ãÃ╚╔╩╦╠═╬¤ðÐÊËÈıÍÎÏ┘┌█▄¦Ì▀ÓßÔÒõÕµþÞÚÛÙýÝ¯´­±‗¾¶§÷¸°¨·¹³²■ &amp;quot;;&lt;br /&gt;
//Turns the supplied character into a 3 byte integer.&lt;br /&gt;
string Char2ASCII(string sData)&lt;br /&gt;
{&lt;br /&gt;
	return Size(llSubStringIndex(ASCII,llGetSubString(sData,0,0)) + 1,3);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
//Turns the supplied integer into it&#039;s corresponding character. values wrap around at ORC_ASCII length.&lt;br /&gt;
string ASCII2Char(integer iCharcode)&lt;br /&gt;
{&lt;br /&gt;
	iCharcode = llAbs(iCharcode) % (llStringLength(ASCII)+1);&lt;br /&gt;
	if(iCharcode &amp;lt;= 0)&lt;br /&gt;
		return &amp;quot;&amp;quot;;&lt;br /&gt;
	iCharcode--;	//shifting of 1 to account for the &amp;quot;&amp;quot; that is at position zero.&lt;br /&gt;
	return llGetSubString(ASCII,iCharcode,iCharcode);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
integer MORSE_SPACE = 1;&lt;br /&gt;
integer MORSE_SHORT = 2;&lt;br /&gt;
integer MORSE_LONG  = 3;&lt;br /&gt;
&lt;br /&gt;
list MORSE_SYMBOLS = [&amp;quot;&amp;quot;,&amp;quot; &amp;quot;,&amp;quot;.&amp;quot;,&amp;quot;-&amp;quot;];&lt;br /&gt;
string String2Morse(string sData)&lt;br /&gt;
{&lt;br /&gt;
	string buffer;&lt;br /&gt;
	integer i;&lt;br /&gt;
	integer max = llStringLength(sData);&lt;br /&gt;
	for(i=0;i&amp;lt;max;i++)&lt;br /&gt;
	{&lt;br /&gt;
	   integer value = llListFindList(MORSE_SYMBOLS,[llGetSubString(sData,i,i)]);&lt;br /&gt;
	   if(value &amp;lt; 0)&lt;br /&gt;
	       value = 0;&lt;br /&gt;
	   buffer += (string)value;&lt;br /&gt;
	}&lt;br /&gt;
    return buffer;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
string Morse2String(string sData)&lt;br /&gt;
{&lt;br /&gt;
	string buffer;&lt;br /&gt;
    integer i;&lt;br /&gt;
    integer max = llStringLength(sData);&lt;br /&gt;
    for(i=0;i&amp;lt;max;i++)&lt;br /&gt;
        buffer += llList2String(MORSE_SYMBOLS,(integer)llGetSubString(sData,i,i));&lt;br /&gt;
	return buffer;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=Examples=&lt;br /&gt;
==Sending a simple message with the API==&lt;br /&gt;
Note that in this example, we are sending int(5) and then a variable length ascii encoded text. It will have to be decoded in the same order to be reserved.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
state_entry()&lt;br /&gt;
{&lt;br /&gt;
    SendInit(); //Required before any transmission to setup the radio systems.&lt;br /&gt;
    SendInt(5,5000); //This will add a 5 digit long integer, containing the value 5000 to the buffer.&lt;br /&gt;
    SendASCIIWord(&amp;quot;Hello world!&amp;quot;); //This will add an ASCII encoded string of variable length to the sending buffer.&lt;br /&gt;
    SendEnd(105.5,POWER_MED); //This will send the buffer over channel 105.5 with the &amp;quot;medium&amp;quot; power setting (20 meters range)&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==Receiving a messages with the API==&lt;br /&gt;
The way variable length ascii encoded texts are stored, the first int(3) contains the length of the character chain, and then every subsequenct in(3) is a character.&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
state_entry()&lt;br /&gt;
{&lt;br /&gt;
    Receiver(105.5); //Will start listening for messages on channel 105.5&lt;br /&gt;
}&lt;br /&gt;
listen(integer channel,string name,key id,string datastream)&lt;br /&gt;
{&lt;br /&gt;
    if(channel = giSubchannel &amp;amp;&amp;amp; giReceiverHandle != -1)&lt;br /&gt;
    {&lt;br /&gt;
        ReceiverInit(); //setup the ORC system for reading the datastream&lt;br /&gt;
        &lt;br /&gt;
        integer value = ReceiverReadInt(datastream,5); //read an Integer value of 5 digits.&lt;br /&gt;
        string text = ReceiverReadASCIIWord(datastream); //read a variable length Ascii word.&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;/div&gt;</summary>
		<author><name>Darien Caldwell</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Mesh/Avatar_Shape_XML_Format&amp;diff=1199784</id>
		<title>Mesh/Avatar Shape XML Format</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Mesh/Avatar_Shape_XML_Format&amp;diff=1199784"/>
		<updated>2016-03-28T19:20:23Z</updated>

		<summary type="html">&lt;p&gt;Darien Caldwell: clarify what SSA is&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Navbox/Mesh|tech}}&lt;br /&gt;
== History ==&lt;br /&gt;
The Shape XML format has been ingrained in the viewer since the early days, long before mesh existed. However, with the addition of rigged mesh and customized clothing, the file has become invaluable to creators. Sometimes called an &amp;quot;archetype file&amp;quot; due to it&#039;s default name &amp;quot;new_archetype.xml&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
With the release of [[Project_Sunshine-Server_Side_Appearance|Server Side Appearance]] in Early 2013, The XML format has inherited additional information. However, its XML version number is still 1.0, and it is still backward compatible with the original terse format. The additions will be outlined separately in the SSA Extensions section.&lt;br /&gt;
&lt;br /&gt;
== Header ==&lt;br /&gt;
The file is standard XML, with 3 parameters:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;US-ASCII&amp;quot; standalone=&amp;quot;yes&amp;quot;?&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
** The &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter sets the version of the XML markup. (should always be 1.0)&lt;br /&gt;
** The &amp;lt;code&amp;gt;encoding&amp;lt;/code&amp;gt; parameter sets the character encoding for the file. (should always be US-ASCII)&lt;br /&gt;
** The &amp;lt;code&amp;gt;standalone&amp;lt;/code&amp;gt; parameter informs that the file is self-containted, and not dependent on any external files. (should always be yes)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note that some viewers&#039;&#039;&#039; set &amp;lt;code&amp;gt;standalone=&amp;quot;true&amp;quot;&amp;lt;/code&amp;gt;.  This is technically incorrect via the XML standard. It should be &amp;lt;code&amp;gt;standalone=&amp;quot;yes&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Root Node ==&lt;br /&gt;
&lt;br /&gt;
The root node is of type &amp;lt;code&amp;gt;linden_genepool&amp;lt;/code&amp;gt; with one parameter:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;linden_genepool version=&amp;quot;1.0&amp;quot;&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
** The &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter sets the version of the data contained in the node. Currently LL&#039;s data is version 1.0. Future revisions may increment this version, so any implementation should check this version number before using the data.&lt;br /&gt;
&lt;br /&gt;
== Data Body ==&lt;br /&gt;
&lt;br /&gt;
The Root node contains one node of type &amp;lt;code&amp;gt;archetype&amp;lt;/code&amp;gt; with one parameter.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;archetype name=&amp;quot;???&amp;quot;&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
** The &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; parameter is a information parameter, and can contain anything, or nothing. Most commonly populated with 3 question marks.&lt;br /&gt;
&lt;br /&gt;
== The Data ==&lt;br /&gt;
&lt;br /&gt;
The data inside is a list of parameters and textures associated with the Avatar&#039;s appearance. These can be broken up into 4 categories:&lt;br /&gt;
&lt;br /&gt;
* Shape&lt;br /&gt;
* Skin&lt;br /&gt;
* Hair&lt;br /&gt;
* Eyes&lt;br /&gt;
&lt;br /&gt;
Each category will have several &amp;lt;code&amp;gt;param&amp;lt;/code&amp;gt; nodes and possibly &amp;lt;code&amp;gt;texture&amp;lt;/code&amp;gt; nodes included. More about these nodes in the next section.&lt;br /&gt;
&lt;br /&gt;
== Param Nodes ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;param&amp;lt;/code&amp;gt; nodes correspond to sliders in the appearance pane. Each has 3 parameters:&lt;br /&gt;
*Example: &amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;param id=&amp;quot;649&amp;quot; name=&amp;quot;torso muscles&amp;quot; value=&amp;quot;0.500&amp;quot;/&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
** The &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; parameter corresponds to an internal viewer table of possible sliders. These numbers are guaranteed to be unique, and always correspond to the same slider.&lt;br /&gt;
** The &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; parameter corresponds to internal &#039;driving elements&#039; in the viewer. This can vary depending on the type of param. For shapes, it&#039;s often the name of the morph being controlled. For skins or eyes, it&#039;s usually a material that&#039;s being changed (color etc).  For hair, a combination of both are present. These are &#039;&#039;&#039;not&#039;&#039;&#039; always unique. For example, there are two parameters called &amp;quot;torso muscles&amp;quot;, with different IDs (one for male, one for female).&lt;br /&gt;
** The &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; parameter is the value of the slider. It is however in the internally used format, not the 0-100 value seen by Residents. Calculating what these values mean requires finding the Minimum and Maximum of that value from other sources, such as the [[Avatar_Appearance#Linden_avatar_definition_file|Linden Avatar Definition File]] (avatar_lad.xml)&lt;br /&gt;
&lt;br /&gt;
== Texture Nodes ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;texture&amp;lt;/code&amp;gt; nodes correspond to textures applied via the appearance pane. Each has two parameters:&lt;br /&gt;
*Example: &amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;texture te=&amp;quot;3&amp;quot; uuid=&amp;quot;00000000-0000-4000-8000-000000000000&amp;quot;/&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
** The &amp;lt;code&amp;gt;te&amp;lt;/code&amp;gt; parameter corresponds to an internal viewer table of possible textures. These numbers are guaranteed to be unique.&lt;br /&gt;
** The &amp;lt;code&amp;gt;uuid&amp;lt;/code&amp;gt; parameter corresponds to the [[UUID]] of the texture applied at the time of the XML creation.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note that &amp;lt;code&amp;gt;texture&amp;lt;/code&amp;gt; nodes are optional&#039;&#039;&#039; and not guaranteed to be present. Especially when the file is generated from 3rd party sources.&lt;br /&gt;
&lt;br /&gt;
== Comments ==&lt;br /&gt;
&lt;br /&gt;
Comments are styled in the standard HTML style, with the string &amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;!--&amp;lt;/source&amp;gt; denoting the start of a comment, and &amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;--&amp;gt;&amp;lt;/source&amp;gt; denoting the end of a comment. This is per the XML specification.&lt;br /&gt;
*Example: &amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;!-- wearable: shape --&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== File Termination ==&lt;br /&gt;
&lt;br /&gt;
The file is terminated by the closing of the &amp;lt;code&amp;gt;archetype&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;linden_genepool&amp;lt;/code&amp;gt; nodes:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;/archetype&amp;gt;&amp;lt;/linden_genepool&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SSA Extensions ==&lt;br /&gt;
The Two main changes with [[Project_Sunshine-Server_Side_Appearance|Server Side Appearance]]  are the addition of &#039;&#039;&#039;many&#039;&#039;&#039; new &amp;lt;code&amp;gt;param&amp;lt;/code&amp;gt; nodes , and the inclusion of new data in all &amp;lt;code&amp;gt;param&amp;lt;/code&amp;gt; nodes.&lt;br /&gt;
*The additional &amp;lt;code&amp;gt;param&amp;lt;/code&amp;gt; nodes now cover more than just the avatar&#039;s body shape and texture. Now, there is data for every possible avatar appearance modifier, including all clothes layers, alpha layers, tattoo layers, all internal morphs, and all settings for these items. In short there is every bit of data needed to completely recreate the entire avatar&#039;s &#039;look&#039;.&lt;br /&gt;
*The new parameters included in the &amp;lt;code&amp;gt;param&amp;lt;/code&amp;gt; nodes is &#039;&#039;in addition to&#039;&#039; the original parameters. All of the originally available parameters are still provided. The new parameters are as follows:&lt;br /&gt;
**The &amp;lt;code&amp;gt;u8&amp;lt;/code&amp;gt; parameter is a short integer normalized representation of the displayed slider value. Whereas before some complex math was necessary to determine what 0-100 slider value was indicated by the morph value in the &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; parameter, now you can simply take the u8 value, divide it by 255, then multiply that value by 100. That will give you the displayed slider values.  255 would be a slider value of 100, 128 would be a slider value of 50, and 0 would of course be 0.&lt;br /&gt;
**The &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; parameter is a rough indication of what kind of data the &amp;lt;code&amp;gt;param&amp;lt;/code&amp;gt; entry is associated with. There seem to be 5 distinct values, which likely correspond to entries in the [[Avatar_Appearance#Linden_avatar_definition_file|Linden Avatar Definition File]] (avatar_lad.xml)&lt;br /&gt;
*** param_morph, param_driver, param_skeleton, param_color, param_alpha&lt;br /&gt;
** The &amp;lt;code&amp;gt;wearable&amp;lt;/code&amp;gt; parameter further groups &amp;lt;code&amp;gt;param&amp;lt;/code&amp;gt; entries into distinct groups. These clearly indicate what avatar component the &amp;lt;code&amp;gt;param&amp;lt;/code&amp;gt; node is associated with. There seem to be 16 distinct values:&lt;br /&gt;
*** shape, hair, invalid, gloves, eyes, skin, pants, shoes, shirt, jacket, socks, underpants, undershirt, skirt, tattoo, physics&lt;br /&gt;
** The &amp;lt;code&amp;gt;invalid&amp;lt;/code&amp;gt; wearable indicates a morph.&lt;/div&gt;</summary>
		<author><name>Darien Caldwell</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlTeleportAgentGlobalCoords&amp;diff=1199717</id>
		<title>LlTeleportAgentGlobalCoords</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlTeleportAgentGlobalCoords&amp;diff=1199717"/>
		<updated>2016-03-12T19:07:59Z</updated>

		<summary type="html">&lt;p&gt;Darien Caldwell: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function&lt;br /&gt;
|inject-2={{LSL Function/avatar|agent|region=*}}{{Issues/BUG-4062}}&lt;br /&gt;
|inject-3={{LSL_Function/permission|PERMISSION_TELEPORT|grant={{LSLP|agent}}}}&lt;br /&gt;
|func=llTeleportAgentGlobalCoords&lt;br /&gt;
|func_desc=Teleports an {{LSLP|agent}} to set of a {{LSLP|region_coordinates}} within a region at the specified {{LSLP|global_coordinates}}.  The agent lands facing the position defined by {{LSLP|look_at}} local coordinates.  A region&#039;s global coordinates can be retrieved using &amp;lt;code&amp;gt;[[llRequestSimulatorData]](region_name, DATA_SIM_POS)&amp;lt;/code&amp;gt;&lt;br /&gt;
|func_footnote=The combination of [[llRequestSimulatorData]] and [[llTeleportAgentGlobalCoords]] allows agents to be teleported to regions by region name.&lt;br /&gt;
|p1_type=key|p1_name=agent|p1_desc=&amp;amp;#32;(avatar to be teleported)&lt;br /&gt;
|p2_type=vector|p2_name=global_coordinates|p2_desc=Global coordinates of the destination region. Can be retrieved by using [[llRequestSimulatorData]](region_name, DATA_SIM_POS).&lt;br /&gt;
|p3_type=vector|p3_name=region_coordinates|p3_desc=Destination position inside the target region, given in local coordinates.&lt;br /&gt;
|p4_type=vector|p4_name=look_at|p4_desc=Location avatar will face after completing the teleport, given in local coordinates.&lt;br /&gt;
|caveats=&lt;br /&gt;
* &#039;&#039;&#039;This function can only teleport the owner of the object&#039;&#039;&#039; (unless part of an [[:Category:Experience Tools|Experience]]).&lt;br /&gt;
* Teleports are throttled&lt;br /&gt;
* This function cannot be used in a script in an object attached using [[llAttachToAvatarTemp]].&lt;br /&gt;
* Sitting avatars cannot be teleported using this function. You must [[llUnSit]] them first.&lt;br /&gt;
* This function does not override a parcel&#039;s teleport settings, i.e. if the parcel has a landing zone enabled the agent will be teleported there.&lt;br /&gt;
* If the script is part of an experience that the avatar has granted permission, then this function may teleport them without being the owner and it will override parcel teleport routing.&lt;br /&gt;
* according to [[https://jira.secondlife.com/browse/SVC-7987]], the lookat vector for teleporting between sims is &amp;lt;llCos(facing), llSin(facing), 0.0&amp;gt; where facing is the angle towards which the arriving avatar is to look, *not* the coordinates of a point in the region.&lt;br /&gt;
|examples=&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
string simName = &amp;quot;Help Island Public&amp;quot;;&lt;br /&gt;
vector simGlobalCoords;&lt;br /&gt;
&lt;br /&gt;
vector landingPoint = &amp;lt;128.0, 128.0, 24.0&amp;gt;;&lt;br /&gt;
&lt;br /&gt;
key owner;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    on_rez(integer start_param)&lt;br /&gt;
    {&lt;br /&gt;
        llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    changed(integer change)&lt;br /&gt;
    {&lt;br /&gt;
        if (change &amp;amp; CHANGED_OWNER)&lt;br /&gt;
            llResetScript();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        owner = llGetOwner();&lt;br /&gt;
&lt;br /&gt;
        llRequestPermissions(owner, PERMISSION_TELEPORT);&lt;br /&gt;
        llRequestSimulatorData(simName, DATA_SIM_POS);&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;
&lt;br /&gt;
        if (id == owner)&lt;br /&gt;
        {&lt;br /&gt;
            if (simGlobalCoords == ZERO_VECTOR)&lt;br /&gt;
            {&lt;br /&gt;
                llOwnerSay(&amp;quot;Config error, tp request was denied. Please try again!&amp;quot;);&lt;br /&gt;
                llResetScript();&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                llOwnerSay(&amp;quot;Teleporting you to: http://maps.secondlife.com/secondlife/&amp;quot;&lt;br /&gt;
                    + llEscapeURL(simName) + &amp;quot;/&amp;quot; + (string)llRound(landingPoint.x)&lt;br /&gt;
                    + &amp;quot;/&amp;quot; + (string)llRound(landingPoint.y) + &amp;quot;/&amp;quot; + (string)llRound(landingPoint.z) + &amp;quot;/&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
                llTeleportAgentGlobalCoords(owner, simGlobalCoords, landingPoint, ZERO_VECTOR);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            // llRegionSayTo is faster than llInstantMessage and we can assume&lt;br /&gt;
            // that the touching avatar is within the same sim&lt;br /&gt;
&lt;br /&gt;
            llRegionSayTo(id, PUBLIC_CHANNEL,&lt;br /&gt;
                &amp;quot;Sorry, I can&#039;t tp you. You&#039;re NOT my owner!&amp;quot;);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    run_time_permissions(integer perm)&lt;br /&gt;
    {&lt;br /&gt;
        // if permission request has been denied (read ! as not)&lt;br /&gt;
        if (!(perm &amp;amp; PERMISSION_TELEPORT))&lt;br /&gt;
        {&lt;br /&gt;
            llOwnerSay(&amp;quot;I need permissions to teleport you!&amp;quot;);&lt;br /&gt;
            llRequestPermissions(owner, PERMISSION_TELEPORT);&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
//  dataserver event only called if data is returned&lt;br /&gt;
//  or in other words, if you request data for a sim that does&lt;br /&gt;
//  not exist this event will NOT be called&lt;br /&gt;
&lt;br /&gt;
    dataserver(key query_id, string data)&lt;br /&gt;
    {&lt;br /&gt;
        simGlobalCoords = (vector)data;&lt;br /&gt;
        // llOwnerSay(&amp;quot;Sim global coords: &amp;quot; + (string)simGlobalCoords);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
|also_functions=&lt;br /&gt;
{{LSL DefineRow||[[llRequestSimulatorData]]|Useful for requesting simulator position}}&lt;br /&gt;
{{LSL DefineRow||[[llTeleportAgent]]|Teleporting agents to a landmark or position in the region.}}&lt;br /&gt;
|cat1=Teleport&lt;br /&gt;
|cat2&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
|history = Date of Release  [[ Release_Notes/Second_Life_Server/12#12.07.24.262437 | 24/07/2012 ]]&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Darien Caldwell</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Darien_Caldwell/HTTP-DNS&amp;diff=1197295</id>
		<title>User:Darien Caldwell/HTTP-DNS</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Darien_Caldwell/HTTP-DNS&amp;diff=1197295"/>
		<updated>2015-08-29T16:38:53Z</updated>

		<summary type="html">&lt;p&gt;Darien Caldwell: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{void-box&lt;br /&gt;
|title=Dynamic DNS service for HTTP-IN via Google App Engine:&lt;br /&gt;
|content=&lt;br /&gt;
&lt;br /&gt;
NOTE: While the original version of this code did not provide true DNS service, it has since been updated to do so. Please read the original thread to understand the evolution of the code. A lot of good information and workarounds are also provided in the old thread!&lt;br /&gt;
&lt;br /&gt;
http://forums-archive.secondlife.com/54/33/323981/1.html&lt;br /&gt;
&lt;br /&gt;
One of the big issues with HTTP-IN is the fact that the URLs are dynamic and can change under many conditions. Many have balked at the requirements of having an external server to manage a Dynamic DNS service to keep track of these ever changing URLs. So here&#039;s a free solution that anyone can use, and expand with their needs.&lt;br /&gt;
&lt;br /&gt;
Using this DNS, you can have servers register their URL &#039;service&#039; and allow other in-world (and out of world) applications discover the URL for this service in a consistent manner. The Google App Engine is free and offers resource limits which should be able to support small to mid range applications. Of course, for a small fee you can purchase more resources from Google as well. &lt;br /&gt;
(Resouce limits: http://developers.google.com/appengine/docs/quotas )&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
This is the basics, and has no verification or encryption, but should be fairly secure as long as you don&#039;t go around giving your service URL to people. Feel free to add on to it as you like. The code is released to the Public Domain. Enjoy.&lt;br /&gt;
&lt;br /&gt;
NOTE: As of March 8th, 2013, Google has announced the depreciation of the Python 2.5 Runtime. I have updated the files here to use the newer Pythonn 2.7 Runtime. If you use this service, and have it on Python 2.5, you should consider migrating to 2.7   As well, To use Python 2.7, you must migrate from the Master/Slave datastore to the HRD (High Replication Datastore).&lt;br /&gt;
&lt;br /&gt;
Migration Info here:&lt;br /&gt;
&lt;br /&gt;
Migrating to HRD: https://developers.google.com/appengine/docs/adminconsole/migration&lt;br /&gt;
&lt;br /&gt;
Migrating to Python 2.7: https://developers.google.com/appengine/docs/python/python25/migrate27&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
{{void-box&lt;br /&gt;
|title=Setup and Installation&lt;br /&gt;
|content=&lt;br /&gt;
*First, download the files here:&lt;br /&gt;
&lt;br /&gt;
 http://home.comcast.net/~volfin/lsl-dns.zip&lt;br /&gt;
&lt;br /&gt;
Or, you can find the contents of the zip file here: &lt;br /&gt;
&lt;br /&gt;
 http://wiki.secondlife.com/w/index.php?title=User:Darien_Caldwell/HTTP-DNS%20Code&lt;br /&gt;
&lt;br /&gt;
Now, what to do with these files:&lt;br /&gt;
&lt;br /&gt;
*Go to http://developers.google.com/appengine/ to sign up for a free account. Or if you already have a GMail or other Google account, use that.&lt;br /&gt;
&lt;br /&gt;
*Go here to install Python 2.7 (if you don&#039;t already have it)&lt;br /&gt;
 http://www.python.org/download/releases/2.7.5/  (Note that GAE updated to Python 2.7.5 on July 16th, 2013. other versions of 2.7.x can be used, but may lack newer features)&lt;br /&gt;
&lt;br /&gt;
*Download and install the App Engine SDK for Python:&lt;br /&gt;
&lt;br /&gt;
 http://developers.google.com/appengine/downloads&lt;br /&gt;
&lt;br /&gt;
The SDK will be installed into a subdirectory called &#039;google_appengine&#039;.&lt;br /&gt;
&lt;br /&gt;
*Create a directory under the &#039;google_appengine&#039; directory called &#039;lsl-dns&#039;&lt;br /&gt;
&lt;br /&gt;
*Place the files from the zip file (dns.py and app.yaml) into this new directory.&lt;br /&gt;
&lt;br /&gt;
*Edit the app.yaml file to change the name of the application to the name you specified when you signed up for the service (at https://appengine.google.com/ ):&lt;br /&gt;
&lt;br /&gt;
 application: YOUR-APP-NAME-HERE &amp;lt;-- Change this&lt;br /&gt;
&lt;br /&gt;
*From the &#039;google_appengine&#039; directory (where the SDK was installed), run this command from the console (DOS Prompt):&lt;br /&gt;
&lt;br /&gt;
 appcfg.py update lsl-dns/&lt;br /&gt;
&lt;br /&gt;
This will install the application.&lt;br /&gt;
&lt;br /&gt;
*You&#039;re done.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{void-box&lt;br /&gt;
|title=The API Calls&lt;br /&gt;
|content=&lt;br /&gt;
Once it&#039;s installed you can start using it:&lt;br /&gt;
&lt;br /&gt;
*http://&#039;&#039;yourappname&#039;&#039;.appspot.com/?type=add&amp;amp;name=[NAME]&amp;amp;url=[URL]&lt;br /&gt;
Adds a new service named [NAME] with the HTTP-IN url [URL]. &lt;br /&gt;
The URL must be converted to a string using llEscapeURL() first.&lt;br /&gt;
 if the URL is added, returns the response &#039;Added&#039;, or &#039;Found&#039; if the service&lt;br /&gt;
 already exists. &lt;br /&gt;
&lt;br /&gt;
*http://&#039;&#039;yourappname&#039;&#039;.appspot.com/?type=remove&amp;amp;name=[NAME]&lt;br /&gt;
Removes the given service named [NAME]. &lt;br /&gt;
 Returns &#039;Removed&#039; if successful, or &#039;None&#039; if the service wasn&#039;t found.&lt;br /&gt;
&lt;br /&gt;
*http://&#039;&#039;yourappname&#039;&#039;.appspot.com/?type=update&amp;amp;name=[NAME]&amp;amp;url=[URL]&lt;br /&gt;
Updates the service named [NAME] with the HTTP-IN url [URL].&lt;br /&gt;
 The URL must be converted to a string using llEscapeURL() first.&lt;br /&gt;
 If the URL is updated the response &#039;Updated&#039; is returned.&lt;br /&gt;
 If the service doesn&#039;t exist, a new service is added and &#039;Added&#039; is returned.&lt;br /&gt;
&lt;br /&gt;
*http://&#039;&#039;yourappname&#039;&#039;.appspot.com/?type=retrieve&amp;amp;name=[NAME]&lt;br /&gt;
Retrieves the url of the given service named [NAME]. &lt;br /&gt;
 Returns the URL if the service is found, or &#039;None&#039; if the service wasn&#039;t found.&lt;br /&gt;
 the returned URL must be converted to a URL using llUnescapeURL()&lt;br /&gt;
&lt;br /&gt;
*http://&#039;&#039;yourappname&#039;&#039;.appspot.com/?type=list&lt;br /&gt;
Lists the available services currently stored. &lt;br /&gt;
 Returns a Comma seperated list of service names, ending with the word &#039;END&#039;.&lt;br /&gt;
 if no services are defined, &#039;Empty&#039; is returned.&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
{{void-box&lt;br /&gt;
|title=Optimizing to stay in the Free Quota&lt;br /&gt;
|content= Google App Engine is designed for high scalability, so it will try to use as much resources as it can to keep up with the load put on it. However, for someone in the free Quota, you may not want it to do that. :) So, to stay in the free quota you have to sacrifice some scalability and latency. But for SL this is generally okay to do.&lt;br /&gt;
&lt;br /&gt;
The thing to do is make some simple changes to some Application configuration settings.  Logging into your application dashboard (https://appengine.google.com/), on the left hand menu find Application Settings under the &amp;quot;Administration&amp;quot; subheading, and go there. Then change the settings shown below to match what you see here:&lt;br /&gt;
&lt;br /&gt;
[[File:app_settings.jpg|Application Instance Settings]]&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
{{void-box&lt;br /&gt;
|title=Using the DNS URL&lt;br /&gt;
|content=&lt;br /&gt;
Once a service has been entered, you can use the serivce name in the URL to do automatic redirection.&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
&lt;br /&gt;
You establish a service named &#039;Intro1&#039;&lt;br /&gt;
&lt;br /&gt;
The URL for the service is:&lt;br /&gt;
http://&#039;&#039;sim3015.aditi.lindenlab.com&#039;&#039;:12046/cap/3ff4f3f2-ea08-76c1-cef6-a22b4a573a7c&lt;br /&gt;
&lt;br /&gt;
By Navigating to http://&#039;&#039;yourappname&#039;&#039;.appspot.com/Intro1&lt;br /&gt;
The page will be automatically redirected to the service URL:&lt;br /&gt;
&lt;br /&gt;
http://&#039;&#039;sim3015.aditi.lindenlab.com&#039;&#039;:12046/cap/3ff4f3f2-ea08-76c1-cef6-a22b4a573a7c&lt;br /&gt;
&lt;br /&gt;
If the service name used in the URL is invalid, &#039;None&#039; is returned.&lt;br /&gt;
}}&lt;br /&gt;
{{void-box&lt;br /&gt;
|title=Example LSL Script&lt;br /&gt;
|content=&lt;br /&gt;
&amp;lt;source lang=&amp;quot;lsl2&amp;quot;&amp;gt;&lt;br /&gt;
&lt;br /&gt;
string url = &amp;quot;&amp;quot;;&lt;br /&gt;
string service_name = &amp;quot;Intro1&amp;quot;;&lt;br /&gt;
key URL_KEY;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
setup()&lt;br /&gt;
{&lt;br /&gt;
    llReleaseURL(url);&lt;br /&gt;
    URL_KEY=llRequestURL();&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSetObjectName(&amp;quot;HTTP Server&amp;quot;);&lt;br /&gt;
        setup();&lt;br /&gt;
    }&lt;br /&gt;
    &lt;br /&gt;
    on_rez(integer n)&lt;br /&gt;
    {&lt;br /&gt;
        setup();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    changed(integer c)&lt;br /&gt;
    {&lt;br /&gt;
        if (c &amp;amp; (CHANGED_REGION | CHANGED_REGION_START | CHANGED_TELEPORT) )&lt;br /&gt;
        {&lt;br /&gt;
            setup();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    //Response to our HTTPRequest&lt;br /&gt;
    http_response(key id, integer status, list meta, string body)&lt;br /&gt;
    {&lt;br /&gt;
        &lt;br /&gt;
        if (status == 415) // The remote server did reply to your request but the Content-Type of the reply (such as XML, JSON, Atom, RSS, PLS) &lt;br /&gt;
                           // is not recognised by the LL server and so is not passed back to the script. &lt;br /&gt;
                           // You can assume that 415 means the server heard your request and did reply. &lt;br /&gt;
        {&lt;br /&gt;
            llInstantMessage(llGetOwner(),&amp;quot;Special Error Status 415 Encountered.&amp;quot;);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        else if (status == 499) // Besides the usual HTTP status codes, SL implements a special status code 499. &lt;br /&gt;
                                // This code isn&#039;t generated by the remote web server but by SL&#039;s servers, it can indicate: &lt;br /&gt;
                                // Request timeout (60 seconds)   --  SSL failure  --  A space was present in the url (escape your URL with llEscapeURL). &lt;br /&gt;
        {&lt;br /&gt;
            llInstantMessage(llGetOwner(),&amp;quot;Special Error Status 499 Encountered.&amp;quot;);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        else if (status == 502)  // The proxy server received an invalid response from an upstream server. &lt;br /&gt;
                                 // This error occurs when you send an llHTTPRequest to an object in-world, and it does not reply with an llHTTPResponse. &lt;br /&gt;
        {&lt;br /&gt;
            llInstantMessage(llGetOwner(),&amp;quot;Special Error Status 502 Encountered.&amp;quot;);&lt;br /&gt;
            return;&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        if (body==&amp;quot;Updated&amp;quot;) llOwnerSay(&amp;quot;DNS updated with Server Address.&amp;quot;);&lt;br /&gt;
        else  llOwnerSay(&amp;quot;Response code:&amp;quot;+(string)status+&amp;quot; Body:&amp;quot;+body);  // Some other arbitrary response&lt;br /&gt;
&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    http_request(key id, string method, string body)&lt;br /&gt;
    {&lt;br /&gt;
        if (id==URL_KEY)&lt;br /&gt;
        {&lt;br /&gt;
            if (method == URL_REQUEST_GRANTED)&lt;br /&gt;
            {&lt;br /&gt;
                // the &#039;/&#039; must be added to work around a quirk with LL&#039;s HTTP-in URLS (see forum thread)&lt;br /&gt;
                url = body+&amp;quot;/&amp;quot;; &lt;br /&gt;
                                // DON&#039;T FORGET TO CHANGE &#039;yourappname&#039; to the name of your specific App!!!&lt;br /&gt;
                llHTTPRequest(&amp;quot;http://yourappname.appspot.com/?type=update&amp;amp;name=&amp;quot; + service_name + &amp;quot;&amp;amp;url=&amp;quot; + llEscapeURL(url),[],&amp;quot;&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
            else&lt;br /&gt;
            {&lt;br /&gt;
                url=&amp;quot;&amp;quot;;&lt;br /&gt;
                llOwnerSay(&amp;quot;Error: HTTP-IN URL Request Denied.&amp;quot;);&lt;br /&gt;
            }&lt;br /&gt;
        }&lt;br /&gt;
        else&lt;br /&gt;
        {&lt;br /&gt;
            // Some other Request&lt;br /&gt;
            llOwnerSay(&amp;quot;Got:&amp;quot;+body);&lt;br /&gt;
            string pathInfoHeader = llGetHTTPHeader(id, &amp;quot;x-path-info&amp;quot;);&lt;br /&gt;
            llOwnerSay(&amp;quot;Path:&amp;quot;+pathInfoHeader);&lt;br /&gt;
            string query = llGetHTTPHeader(id, &amp;quot;x-query-string&amp;quot;);&lt;br /&gt;
            llOwnerSay(&amp;quot;Query:&amp;quot;+query);&lt;br /&gt;
        }&lt;br /&gt;
        &lt;br /&gt;
        // should always respond to prevent timeouts.&lt;br /&gt;
        llHTTPResponse(id,200,&amp;quot;ACK&amp;quot;); &lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
}}&lt;br /&gt;
{{void-box&lt;br /&gt;
|title=Advanced Version&lt;br /&gt;
|content= There is an advanced version that has a very basic admin function, password protection, and verbose logging. Thanks goes to [[User:CrystalShard Foo|Crystalshard Foo]] for contributing her time to work with me on this.&lt;br /&gt;
&lt;br /&gt;
The code can be found here:  &lt;br /&gt;
&lt;br /&gt;
  http://wiki.secondlife.com/w/index.php?title=User:Darien_Caldwell/Advanced%20HTTP-DNS%20Code&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
{{void-box&lt;br /&gt;
|title=Advanced API Calls&lt;br /&gt;
|content=&lt;br /&gt;
The API is much the same, but there are several new *optional* parameters that can be used.&lt;br /&gt;
*wpass: Write protect password. If an entry has a write protect password set, it can&#039;t be updated or deleted without specificying this password.&lt;br /&gt;
*rpass: Read Protect password. If an entry has a read protect password set, it can&#039;t be retrieved without specificying this password. It also can&#039;t be called via a DNS url.&lt;br /&gt;
*hidden: Hidden status. If an entry is marked as hidden, it will not show up in the Entry List. &#039;list&#039;ing the services with the admin password included will show hidden entries.&lt;br /&gt;
*pass: A generic password parameter, takes the place of rpass, wpass, or both in various situations. If whien adding a service through an update, you specifiy &#039;pass&#039;, it will be set as the read and write passwords. specifying &#039;rpass&#039; or &#039;wpass&#039; will override this. &lt;br /&gt;
*admin: Admin Password. The hard-coded Admin password allows global overriding of some actions, regardless of the entry password set. If an Admin password is set, only Add requests that include the admin password will be accepted. &#039;admin&#039; can also be used to override update,remove,retrieve,and list.&lt;br /&gt;
&lt;br /&gt;
 The Admin password is hard coded in the dns.py file:&lt;br /&gt;
&amp;lt;source lang=&amp;quot;python&amp;quot;&amp;gt;&lt;br /&gt;
        admin_password = &amp;quot;adminpassword&amp;quot;        # This password enables you to have unrestricted access to the DNS&lt;br /&gt;
&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*http://&#039;&#039;yourappname&#039;&#039;.appspot.com/?type=add&amp;amp;name=[NAME]&amp;amp;url=[URL]&amp;amp;hidden=[0/1]&amp;amp;admin=[ADMIN PASS]&amp;amp;wpass=[WRITE PASS]&amp;amp;rpass=[READ PASS]&lt;br /&gt;
Adds a new service named [NAME] with the HTTP-IN url [URL]. &lt;br /&gt;
Can be &#039;hidden&#039;, &#039;wpass&#039; protected, and/or &#039;rpass&#039; protected.&lt;br /&gt;
The URL must be converted to a string using llEscapeURL() first.&lt;br /&gt;
 if the URL is added, returns the response &#039;Added&#039;, or &#039;Found&#039; if the service already exists. &lt;br /&gt;
&lt;br /&gt;
*http://&#039;&#039;yourappname&#039;&#039;.appspot.com/?type=remove&amp;amp;name=[NAME]&amp;amp;admin=[ADMIN PASS]&amp;amp;pass=[WRITE PASS]&lt;br /&gt;
Removes the given service named [NAME].&lt;br /&gt;
If &#039;wpass&#039; was set during creation/update, must be specificed as &#039;pass&#039;. or overridden by admin=[ADMIN PASS]&lt;br /&gt;
 Returns &#039;Removed&#039; if successful, or &#039;None&#039; if the service wasn&#039;t found.&lt;br /&gt;
&lt;br /&gt;
*http://&#039;&#039;yourappname&#039;&#039;.appspot.com/?type=update&amp;amp;name=[NAME]&amp;amp;url=[URL]&amp;amp;hidden=[0/1]&amp;amp;admin=[ADMIN PASS]&amp;amp;wpass=[WRITE PASS]&amp;amp;rpass=[READ PASS]&lt;br /&gt;
Updates the service named [NAME] with the HTTP-IN url [URL].&lt;br /&gt;
Can be &#039;hidden&#039;, &#039;wpass&#039; protected, and/or &#039;rpass&#039; protected.&lt;br /&gt;
If &#039;wpass&#039; was set during previous creation/update, must be specificed as &#039;pass&#039;, or overridden by admin=[ADMIN PASS]&lt;br /&gt;
 The URL must be converted to a string using llEscapeURL() first.&lt;br /&gt;
 If the URL is updated the response &#039;Updated&#039; is returned.&lt;br /&gt;
 If the service doesn&#039;t exist, a new service is added and &#039;Added&#039; is returned.&lt;br /&gt;
&lt;br /&gt;
*http://&#039;&#039;yourappname&#039;&#039;.appspot.com/?type=retrieve&amp;amp;name=[NAME]&amp;amp;pass=[READ PASS]&amp;amp;admin=[ADMIN PASS]&lt;br /&gt;
Retrieves the url of the given service named [NAME]. &lt;br /&gt;
If &#039;rpass&#039; was set during previous creation/update, must be specificed as &#039;pass&#039;, or overridden by admin=[ADMIN PASS]&lt;br /&gt;
 Returns the URL if the service is found, or &#039;None&#039; if the service wasn&#039;t found.&lt;br /&gt;
 the returned URL must be converted to a URL using llUnescapeURL()&lt;br /&gt;
&lt;br /&gt;
*http://&#039;&#039;yourappname&#039;&#039;.appspot.com/?type=list&amp;amp;admin=[ADMIN PASS]&lt;br /&gt;
Lists the available services currently stored.&lt;br /&gt;
Will only show entries not marked as &#039;hidden&#039;, Unless &amp;amp;admin=[ADMIN PASS] is included. then all are shown.&lt;br /&gt;
 Returns a Comma seperated list of service names, ending with the word &#039;END&#039;.&lt;br /&gt;
 If no services are defined, &#039;Empty&#039; is returned.&lt;br /&gt;
&lt;br /&gt;
Enjoy :)&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Darien Caldwell</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Instant_Message&amp;diff=1196003</id>
		<title>Instant Message</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Instant_Message&amp;diff=1196003"/>
		<updated>2015-03-31T16:16:32Z</updated>

		<summary type="html">&lt;p&gt;Darien Caldwell: Added info about new Premium cap increase/ removed dead link.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Help |Glossary=*|Communication=*}}The chat window that allows two [[Resident]]s to have a private conversation with each other. &lt;br /&gt;
&lt;br /&gt;
Opposed to open chat, which is [[Limits|limited]] to a distance of 20 meter, instant messages (often abbrivated as IMs) reach [[grid]] wide. The length of an IM is limited to 1023 bytes/single-byte characters.&lt;br /&gt;
&lt;br /&gt;
When a Resident is offline, up to 25 messages (50 if a premium account holder) will be stored and delivered at the next login. This limit includes [[inventory]] offers, [[group]] notices, group invitation and IMs. All messages above this limit will be &#039;&#039;capped&#039;&#039; and not delivered.&lt;br /&gt;
&lt;br /&gt;
However, there is an IM to Email feature, which sends offline messages directly to the mailbox connected to your account. To activate it, go to &#039;&#039;&#039;Edit&#039;&#039;&#039; &amp;gt; &#039;&#039;&#039;Preferences&#039;&#039;&#039; (or press {{KeyCombo|ctrl=*|P}}), go to the &#039;&#039;&#039;Communication&#039;&#039;&#039; tab and check the &#039;&#039;&#039;Send IM to Email&#039;&#039;&#039; checkbox. Press &#039;&#039;&#039;Apply&#039;&#039;&#039; and close the window with &#039;&#039;&#039;OK&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
When an offline message is received via Email, this message can also be answered via Email again. These mails will be converted back to IM and sent to the right Resident. Note that the Email to IM feature expires 5 days after the receival of the IM. Messages sent afterwards won&#039;t be received anymore. Also note that the length of properly delivered Email replies is limited to 1023 bytes/single-byte characters. Messages exceeding this limited will be truncated to fit the limit.&lt;br /&gt;
&lt;br /&gt;
Note that, due to {{Jira|SVC-1144}}, replies to offline emails currently can&#039;t contain special unicode characters.&lt;br /&gt;
&lt;br /&gt;
Also note that &#039;&#039;&#039;offline IMs are only retained for 31 days and discarded afterwards&#039;&#039;&#039;. For example, if someone sends you an Instant Message and the next time you login is 33 days later, you won&#039;t receive it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Conferences ==&lt;br /&gt;
&lt;br /&gt;
A conference is a private conversation with two or more Residents, who can communicate gridwide. It is similar to group chat, but more dynamic, since everyone on your friends list can be invited, as well as everyone where you got a [[calling card]] from. &lt;br /&gt;
&lt;br /&gt;
To start a conference by&lt;br /&gt;
* selecting several Residents in your friends list ({{Keypress|Ctrl|title=Control}}+LEFT CLICK) and press &amp;quot;IM/Call&amp;quot; button.&lt;br /&gt;
* dragging a Resident&#039;s calling card into an IM window.&lt;br /&gt;
&lt;br /&gt;
Once conference is started you can invite new Residents by dragging their calling card in the conference window.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;{{#widget:Vimeo|id=5937623|width=640|height=480}}&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Related Links ==&lt;br /&gt;
*[[IM to Email]]&lt;br /&gt;
*[[How do I Instant Message (IM) someone?]]&lt;br /&gt;
*[[Linden_Lab_Official:How do I log chat and instant messages|How do I log chat and instant messages?]]&lt;br /&gt;
*[[Where are my chat and IM logs stored?]]&lt;br /&gt;
*[[How do I Instant Message (IM) a group of people at once?]]&lt;br /&gt;
*[https://blogs.secondlife.com/community/features/blog/2007/02/06/im-to-e-mail-return-addresses-changing Blog: IM to E-mail Return Addresses Changing]&lt;br /&gt;
*[https://community.secondlife.com/t5/Featured-News/A-New-Perk-for-Premium-Subscribers/ba-p/2917357 Blog: Premium Subscriber Cap Increase]&lt;/div&gt;</summary>
		<author><name>Darien Caldwell</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Instant_Message&amp;diff=1196002</id>
		<title>Instant Message</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Instant_Message&amp;diff=1196002"/>
		<updated>2015-03-31T16:15:13Z</updated>

		<summary type="html">&lt;p&gt;Darien Caldwell: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Help |Glossary=*|Communication=*}}The chat window that allows two [[Resident]]s to have a private conversation with each other. &lt;br /&gt;
&lt;br /&gt;
Opposed to open chat, which is [[Limits|limited]] to a distance of 20 meter, instant messages (often abbrivated as IMs) reach [[grid]] wide. The length of an IM is limited to 1023 bytes/single-byte characters.&lt;br /&gt;
&lt;br /&gt;
When a Resident is offline, up to 25 messages (50 if a premium account holder) will be stored and delivered at the next login. This limit includes [[inventory]] offers, [[group]] notices, group invitation and IMs. All messages above this limit will be &#039;&#039;capped&#039;&#039; and not delivered.&lt;br /&gt;
&lt;br /&gt;
However, there is an IM to Email feature, which sends offline messages directly to the mailbox connected to your account. To activate it, go to &#039;&#039;&#039;Edit&#039;&#039;&#039; &amp;gt; &#039;&#039;&#039;Preferences&#039;&#039;&#039; (or press {{KeyCombo|ctrl=*|P}}), go to the &#039;&#039;&#039;Communication&#039;&#039;&#039; tab and check the &#039;&#039;&#039;Send IM to Email&#039;&#039;&#039; checkbox. Press &#039;&#039;&#039;Apply&#039;&#039;&#039; and close the window with &#039;&#039;&#039;OK&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
When an offline message is received via Email, this message can also be answered via Email again. These mails will be converted back to IM and sent to the right Resident. Note that the Email to IM feature expires 5 days after the receival of the IM. Messages sent afterwards won&#039;t be received anymore. Also note that the length of properly delivered Email replies is limited to 1023 bytes/single-byte characters. Messages exceeding this limited will be truncated to fit the limit.&lt;br /&gt;
&lt;br /&gt;
Note that, due to {{Jira|SVC-1144}}, replies to offline emails currently can&#039;t contain special unicode characters.&lt;br /&gt;
&lt;br /&gt;
Also note that &#039;&#039;&#039;offline IMs are only retained for 31 days and discarded afterwards&#039;&#039;&#039;. For example, if someone sends you an Instant Message and the next time you login is 33 days later, you won&#039;t receive it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Conferences ==&lt;br /&gt;
&lt;br /&gt;
A conference is a private conversation with two or more Residents, who can communicate gridwide. It is similar to group chat, but more dynamic, since everyone on your friends list can be invited, as well as everyone where you got a [[calling card]] from. &lt;br /&gt;
&lt;br /&gt;
To start a conference by&lt;br /&gt;
* selecting several Residents in your friends list ({{Keypress|Ctrl|title=Control}}+LEFT CLICK) and press &amp;quot;IM/Call&amp;quot; button.&lt;br /&gt;
* dragging a Resident&#039;s calling card into an IM window.&lt;br /&gt;
&lt;br /&gt;
Once conference is started you can invite new Residents by dragging their calling card in the conference window.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&amp;lt;p&amp;gt;{{#widget:Vimeo|id=5937623|width=640|height=480}}&amp;lt;/p&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Related Links ==&lt;br /&gt;
*[[Instant Messaging (IM) FAQ]]&lt;br /&gt;
*[[IM to Email]]&lt;br /&gt;
*[[How do I Instant Message (IM) someone?]]&lt;br /&gt;
*[[Linden_Lab_Official:How do I log chat and instant messages|How do I log chat and instant messages?]]&lt;br /&gt;
*[[Where are my chat and IM logs stored?]]&lt;br /&gt;
*[[How do I Instant Message (IM) a group of people at once?]]&lt;br /&gt;
*[https://blogs.secondlife.com/community/features/blog/2007/02/06/im-to-e-mail-return-addresses-changing Blog: IM to E-mail Return Addresses Changing]&lt;br /&gt;
*[https://community.secondlife.com/t5/Featured-News/A-New-Perk-for-Premium-Subscribers/ba-p/2917357 Blog: Premium Subscriber Cap Increase]&lt;/div&gt;</summary>
		<author><name>Darien Caldwell</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Limits&amp;diff=1196001</id>
		<title>Limits</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Limits&amp;diff=1196001"/>
		<updated>2015-03-31T16:11:34Z</updated>

		<summary type="html">&lt;p&gt;Darien Caldwell: Updated with information about new IM cap.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;noinclude&amp;gt;{{KBmaster}}&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
== Summary ==&lt;br /&gt;
{{RightToc}}&lt;br /&gt;
The Second Life Viewer and simulators have a division of labor, keeping track of the data that makes Second Life run. The Viewer&#039;s job is to:&lt;br /&gt;
&lt;br /&gt;
* Handle locations of objects.&lt;br /&gt;
* Get velocities and other physics information, and does simple physics to keep track of what is moving where.&lt;br /&gt;
&lt;br /&gt;
The simulator&#039;s job is to:&lt;br /&gt;
&lt;br /&gt;
* Run the physics engine.&lt;br /&gt;
* Detect collisions.&lt;br /&gt;
* Keep track of where everything is&lt;br /&gt;
* Send locations of content to the Viewer along with updates when certain changes occur.&lt;br /&gt;
&lt;br /&gt;
Limits are necessary for all of these components to work together. The list below outlines many of the &#039;&#039;&#039;Second Life numerical limits that affect your inworld experience&#039;&#039;&#039;. Some of these will likely change over time, so if you spot something incorrect/outdated, please take a moment to update it.&lt;br /&gt;
&lt;br /&gt;
{{KBcaution|1=The scope of this page is focused on Linden Lab&#039;s official Viewers, keeping in mind [[Third_Party_Viewer_Directory|3rd-party viewers may differ]]. Cite sources and provide substantiation for limits that aren&#039;t provided by Linden Lab. Also, unconfirmed speculation [[Talk:Limits|goes on this discussion page]]. Don&#039;t add data without a hard limit, and don&#039;t add obscure trivia that doesn&#039;t practically affect the general inworld experience.|width=80%}}&lt;br /&gt;
&lt;br /&gt;
== [[Avatar]] ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Max. # of attachments&#039;&#039;&#039; - 38 combined [[HUD]] or body attachments.&lt;br /&gt;
** They can be viewed by right-clicking your avatar and choosing &#039;&#039;&#039;Edit My Outfit&#039;&#039;&#039;.&lt;br /&gt;
** With the formal introduction of [[multiple attachments|multiple attachments to a single point]] in Viewer 2.4, you can attach up to 38 total objects, and they can all be attached to a single point. &lt;br /&gt;
* &#039;&#039;&#039;Max. # of clothing layers&#039;&#039;&#039; including alpha, tattoo, shoe base, physics, socks, gloves, undershirt, underpants, shirt, pants, jacket, skirt&lt;br /&gt;
** On viewers from before the layer limits project: 5 per slot&lt;br /&gt;
** On viewers with revised layer limits: up to 60 total, no per-slot limit. &#039;&#039;As of March 2015, this is only available in project viewers.&#039;&#039;&lt;br /&gt;
** In any case, only one each of shape, skin, eyes and hair base may be worn.&lt;br /&gt;
* &#039;&#039;&#039;Max Clothing Texture&#039;&#039;&#039; - 512x512 px (except 128x128 px for eyes) - Server Side Appearance will downsize larger textures.&amp;lt;!--per Nyx Linden 9/23/2013 Content n Mesh Meeting--&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Max. unassisted fly height&#039;&#039;&#039; - Stable hover at current ground elevation &#039;&#039;plus&#039;&#039; 5020m.&lt;br /&gt;
** You can easily acquire a flight attachment to fly high. Also see [[flight limit]] and [[Limits#Navigation|the Navigation section]] below.&lt;br /&gt;
* &#039;&#039;&#039;Common shoe sizes&#039;&#039;&#039; - Most women&#039;s shoes are designed for a size 0 (zero) foot. Men&#039;s generally scale up to 14.&lt;br /&gt;
** You can check this by going to Edit menu &amp;gt; Appearance and clicking on the Shape &amp;gt; Legs tab.&lt;br /&gt;
&amp;lt;!--Can someone verify the following?&lt;br /&gt;
* &#039;&#039;&#039;Min. length of avatar name&#039;&#039;&#039; - 2 for first name, 2 for last name, 5 in total (including the space).--&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Max. length of avatar name&#039;&#039;&#039; - 31 for first name, 31 for last name, 63 in total (including the space).&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Max. length of {{LSLGC|Username}}&#039;&#039;&#039; - All lower case and a maximum of 63 including the &#039;.&#039;(eg; firstname.lastname)&lt;br /&gt;
**Older account user names are a combination of the First and last name in lower case separated by a period(.)(eg; lilmix.pixelmaid)&lt;br /&gt;
**Modern user names are a single name(no period)(eg; john1234) - &#039;&#039;&#039;Max.&#039;&#039;&#039; length is 31 characters&lt;br /&gt;
**The {{LSLGC|Legacy Name}}s for modern user names always shows Resident as the last name. So the Max is 40 characters in total for a new avatar&#039;s legacy name(including the space and last name &#039;Resident&#039;)&lt;br /&gt;
*&#039;&#039;&#039;Min. length of [[Display_Names]]&#039;&#039;&#039; - At least one script character&lt;br /&gt;
*&#039;&#039;&#039;Max. length of Display Names&#039;&#039;&#039; - 31 characters&lt;br /&gt;
**Display Names can include most Unicode script characters, spaces, and some punctuation.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Max. avatar speed&#039;&#039;&#039; - 250m/s (with only attachments to assist)&lt;br /&gt;
* &#039;&#039;&#039;Max. teleport speed&#039;&#039;&#039;&amp;lt;!-- - 3 teleports per 15 seconds (server 1.27.0) and 10 teleports per 15 seconds (server 1.27.1)--&amp;gt; - 10 teleports per 15 seconds, since SL server 1.27.1&lt;br /&gt;
&lt;br /&gt;
== [[Animation]] ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; width=&amp;quot;100%&amp;quot; {{Prettytable}}&lt;br /&gt;
|- {{Hl2}}&lt;br /&gt;
! &#039;&#039;&#039;Limit affects&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Lower limit&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Upper limit&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Comment&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;More coverage&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||Length of animation&lt;br /&gt;
| n/a&lt;br /&gt;
| {{no|60.0 seconds}}&lt;br /&gt;
| Limited by length or Size, whichever is reached first&lt;br /&gt;
| n/a&lt;br /&gt;
|-&lt;br /&gt;
||Size of Animation&lt;br /&gt;
| n/a&lt;br /&gt;
| {{no|120k bytes}}&lt;br /&gt;
| Limited by length or Size, whichever is reached first. Size is after conversion to SL [[Internal Animation Format|internal animaton format]], not BVH source which can be much larger.&lt;br /&gt;
| n/a&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
||animation priority&lt;br /&gt;
| {{no|0}}&lt;br /&gt;
| {{no|4, with custom tools 6}}&lt;br /&gt;
| n/a&lt;br /&gt;
| [[Animation_Priority]]&lt;br /&gt;
|-&lt;br /&gt;
||Number of unique joints per animation&lt;br /&gt;
| n/a&lt;br /&gt;
| {{no|32}}&lt;br /&gt;
| n/a&lt;br /&gt;
| n/a&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== [http://community.secondlife.com/t5/English-Knowledge-Base/Build-Tools/ta-p/700039 Building] ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; width=&amp;quot;100%&amp;quot; {{Prettytable}}&lt;br /&gt;
|- {{Hl2}}&lt;br /&gt;
! &#039;&#039;&#039;Limit affects&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Lower limit&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Upper limit&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Comment&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;More coverage&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||[[Prim]] dimensions&lt;br /&gt;
| {{no|&amp;lt;0.01,&amp;amp;nbsp;0.01,&amp;amp;nbsp;0.01&amp;gt;}}&lt;br /&gt;
| {{no|&amp;lt;64.0, 64.0, 64.0&amp;gt;}}&lt;br /&gt;
| Used to be &amp;lt;10.0, 10.0, 10.0&amp;gt; prior to Second Life Server version 11.08.17.238770&lt;br /&gt;
| [[llSetScale]], [[PRIM_SIZE]] and [[Megaprim]]&lt;br /&gt;
|-&lt;br /&gt;
||Number of prims in a linkset&lt;br /&gt;
| n/a&lt;br /&gt;
| {{no|256 prims}}&lt;br /&gt;
| Used to be 255 prior to Second Life Server version 1.26&lt;br /&gt;
| n/a&lt;br /&gt;
|-&lt;br /&gt;
||Linking distance&lt;br /&gt;
| n/a&lt;br /&gt;
| {{no|[[Linkability_Rules]]}}&lt;br /&gt;
| n/a&lt;br /&gt;
| n/a&lt;br /&gt;
|-&lt;br /&gt;
||[[Mesh/Mesh_physics#Physics_Resource_Cost|Physics cost]] for a physical object&lt;br /&gt;
| n/a&lt;br /&gt;
| {{no|32.0}}&lt;br /&gt;
||Additional notes:&lt;br /&gt;
* If you try to link more, it&#039;ll either say &amp;quot;Can&#039;t enable physics for objects with more than 32 primitives&amp;quot; or &amp;quot;Object has too many primitives -- its dynamics have been disabled.&amp;quot;.&lt;br /&gt;
* On server versions 1.38 and below, each sitting avatar counted as 1 prim. From 1.40.2 the limit is only on actual prims.&lt;br /&gt;
| [[OBJECT_PHYSICS_COST]]&lt;br /&gt;
|-&lt;br /&gt;
||Build or rez height&lt;br /&gt;
| n/a&lt;br /&gt;
| {{no|4096.0 meters}}&lt;br /&gt;
| 768.0 meters for Viewers prior to version 1.20&lt;br /&gt;
| n/a&lt;br /&gt;
|-&lt;br /&gt;
||Prim name length&lt;br /&gt;
| n/a&lt;br /&gt;
| {{no|63 bytes UTF-8 [[String|string]]}}&lt;br /&gt;
| same limit for {{LSLGC|Avatar/Name|avatar names}}, although the character set for avatar names is significantly limited.&lt;br /&gt;
| n/a&lt;br /&gt;
|-&lt;br /&gt;
||Prim description length&lt;br /&gt;
| n/a&lt;br /&gt;
| {{no|127 bytes UTF-8 [[String|string]]}}&lt;br /&gt;
| n/a&lt;br /&gt;
| n/a&lt;br /&gt;
|-&lt;br /&gt;
||Temporary prims&#039; lifetime&lt;br /&gt;
| n/a&lt;br /&gt;
| {{no|up to around 60 seconds}}&lt;br /&gt;
| depends upon when the next garbage collector cycle is&lt;br /&gt;
| n/a&lt;br /&gt;
|-&lt;br /&gt;
||Number of temporary prims&lt;br /&gt;
| n/a&lt;br /&gt;
| {{no|RegionPrimLimit - NumberOfPrimsInRegion + Minimum(0.5*RegionPrimLimit, 1000)}}&lt;br /&gt;
| n/a&lt;br /&gt;
| n/a&lt;br /&gt;
|-&lt;br /&gt;
||Length of hovertext&lt;br /&gt;
| n/a&lt;br /&gt;
| {{no|254 bytes UTF-8 [[String|string]]}}&lt;br /&gt;
| n/a&lt;br /&gt;
| [[llSetText]] and [[PRIM_TEXT]]&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== [[Communication]] ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; width=&amp;quot;100%&amp;quot; {{Prettytable}}&lt;br /&gt;
|- {{Hl2}}&lt;br /&gt;
! &#039;&#039;&#039;Limit affects&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Lower limit&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Upper limit&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Comment&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;More coverage&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||Whisper distance&lt;br /&gt;
| n/a&lt;br /&gt;
| {{no|10 meters}}&lt;br /&gt;
| &amp;lt;code&amp;gt;/whisper&amp;lt;/code&amp;gt; as the first few characters in a message can be used in viewer-2-code based viewers in local chat.&lt;br /&gt;
| n/a&lt;br /&gt;
|-&lt;br /&gt;
||Chat distance&lt;br /&gt;
| n/a&lt;br /&gt;
| {{no|20 meters}}&lt;br /&gt;
| text spoken as a &amp;quot;chat&amp;quot; step &#039;&#039;&#039;within gestures&#039;&#039;&#039; cannot be shouted or whispered. /whisper and /shout &#039;&#039;can&#039;&#039; be used in the &amp;quot;Replace with&amp;quot; field.&lt;br /&gt;
| n/a&lt;br /&gt;
|-&lt;br /&gt;
||Shout distance&lt;br /&gt;
| n/a&lt;br /&gt;
| {{no|100 meters}}&lt;br /&gt;
| &amp;lt;code&amp;gt;/shout&amp;lt;/code&amp;gt; as the first few characters in a message can be used in viewer-2-code based viewers in local chat.&lt;br /&gt;
| n/a&lt;br /&gt;
|-&lt;br /&gt;
||Length of a chat message and whether or not it is truncated&lt;br /&gt;
| {{no|1 byte or single-byte character}}&lt;br /&gt;
| {{no|1024 bytes or single-byte characters}}&lt;br /&gt;
| Limit does not apply to instant messages via [[llInstantMessage]] and communication between IM and email, the limit there is 1023 bytes or single-byte characters.&lt;br /&gt;
| [[llInstantMessage]]&lt;br /&gt;
|-&lt;br /&gt;
||Number of offline messages&lt;br /&gt;
| n/a&lt;br /&gt;
| {{no|Capped at 25 messages, unless the account has a Premium Subscription, in which case the cap raises to 50 messages.}}&lt;br /&gt;
| Number of offline messages (involving [[IM|IMs]], inventory offers, group notices, group invitations) received before messages get capped. Note: If autoAcceptNewInventory (debug setting) is set to TRUE (the default is FALSE), then all inventory offers, even above 25 (or 50 in the case of Premium members), go directly to inventory and do not count against the cap on offline messages. &lt;br /&gt;
| [[IM]] - [https://community.secondlife.com/t5/Featured-News/A-New-Perk-for-Premium-Subscribers/ba-p/2917357 Blog Post]&lt;br /&gt;
|-&lt;br /&gt;
||Length of a properly delivered email reply to an [[IM]]&lt;br /&gt;
| n/a&lt;br /&gt;
| {{no|1023 bytes or single-byte characters}}&lt;br /&gt;
| n/a&lt;br /&gt;
| n/a&lt;br /&gt;
|-&lt;br /&gt;
||Time after which a reply to an [[IM]] can be sent via email.&lt;br /&gt;
| {{no|when receiving the IM via email.}}&lt;br /&gt;
| {{no|5 days after receiving the offline IM via email.}}&lt;br /&gt;
| n/a&lt;br /&gt;
| [https://blogs.secondlife.com/community/features/blog/2007/02/06/im-to-e-mail-return-addresses-changing Second Life Blogs]&lt;br /&gt;
|-&lt;br /&gt;
||Time period for which [[IM|IMs]] are stored within Second Life.&lt;br /&gt;
| n/a&lt;br /&gt;
| {{no|31 days after receiving the [[IM]]}}&lt;br /&gt;
| [[User:Torley_Linden|Torley Linden]] confirmed this with [[User:Kelly_Linden|Kelly Linden]]&lt;br /&gt;
| n/a&lt;br /&gt;
|-&lt;br /&gt;
||Number of [[IM|IMs]] sent by an object within an hour&lt;br /&gt;
| n/a&lt;br /&gt;
| {{no|5000 per hour}}&lt;br /&gt;
| n/a&lt;br /&gt;
| n/a&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== [[Gesture]]s ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; width=&amp;quot;100%&amp;quot; {{Prettytable}}&lt;br /&gt;
|- {{Hl2}}&lt;br /&gt;
! &#039;&#039;&#039;Limit affects&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Lower limit&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Upper limit&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Comment&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;More coverage&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||Shortcut key mappings&lt;br /&gt;
| n/a&lt;br /&gt;
| {{no|33 unique combinations, since {{K|F2}}&amp;amp;ndash;{{K|F12}} can be used with the {{K|Ctrl}} or {{K|Shift}} modifiers.}}&lt;br /&gt;
| n/a&lt;br /&gt;
| [[All_keyboard_shortcut_keys]] and [http://community.secondlife.com/t5/English-Knowledge-Base/Keyboard-shortcuts/ta-p/1086557 the knowledge base]&lt;br /&gt;
|-&lt;br /&gt;
||Chat step length&lt;br /&gt;
| n/a&lt;br /&gt;
| {{no|127 bytes or single-byte characters}}&lt;br /&gt;
| n/a&lt;br /&gt;
| n/a&lt;br /&gt;
|-&lt;br /&gt;
||Wait time&lt;br /&gt;
| n/a&lt;br /&gt;
| {{no|3600 seconds (which is one hour)}}&lt;br /&gt;
| n/a&lt;br /&gt;
| n/a&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== [[Group]]s ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Maximum number of groups you can belong to:&#039;&#039;&#039; 42&lt;br /&gt;
** Roles within groups are sort of like sub-groups. In many cases, you can use them instead of creating new groups.&lt;br /&gt;
* &#039;&#039;&#039;Minimum number of members in a group:&#039;&#039;&#039; 2&lt;br /&gt;
** A group with only 1 person for 48 hours will be disbanded (cancelled). Unless the group owns land.&lt;br /&gt;
* &#039;&#039;&#039;Maximum number of roles allowed in a group:&#039;&#039;&#039; 10 (including &amp;quot;Owners&amp;quot; and &amp;quot;Everyone&amp;quot;, which cannot be deleted)&lt;br /&gt;
* &#039;&#039;&#039;Maximum Group Name:&#039;&#039;&#039; 35 single-byte characters.&lt;br /&gt;
* &#039;&#039;&#039;Maximum Group Title:&#039;&#039;&#039; 20 single-byte characters.&lt;br /&gt;
* &#039;&#039;&#039;Maximum Length of a Group Notice:&#039;&#039;&#039; 512 single-byte characters.&lt;br /&gt;
&lt;br /&gt;
== [[Inventory]] ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Maximum number of inventory items that can be sent in a folder:&#039;&#039;&#039; 42&lt;br /&gt;
** Folders count as items too. This has more to do with packet size limits than cheeky Douglas Adams references.&lt;br /&gt;
* &#039;&#039;&#039;Maximum number of inventory items that can be contained in a prim:&#039;&#039;&#039; None, but more items increase the loading time when you open it.&lt;br /&gt;
* &#039;&#039;&#039;Maximum characters in an inventory item name:&#039;&#039;&#039; 63&lt;br /&gt;
* &#039;&#039;&#039;Maximum notecard line:&#039;&#039;&#039; None, but scripts can only read the first 255 bytes.&lt;br /&gt;
* &#039;&#039;&#039;Maximum notecard size:&#039;&#039;&#039; 65,536 bytes&lt;br /&gt;
* &#039;&#039;&#039;Number of items in the Library:&#039;&#039;&#039; 1,248 as of 2010-06-17&lt;br /&gt;
* &#039;&#039;&#039;Number of items in the Library:&#039;&#039;&#039; 2,210 as of 2012-11-04&lt;br /&gt;
** Verified by [[How_does_the_Library_work|hiding the Library]] and counting the difference.&lt;br /&gt;
* &#039;&#039;&#039;Maximum number of inventory items displayed in a single inventory folder:&#039;&#039;&#039; Several thousand. &amp;lt;!-- not a specific item count, because the data is variable size, but still useful to document that there is a limit. --&amp;gt;&lt;br /&gt;
** This was discussed during [http://wiki.secondlife.com/wiki/Simulator_User_Group/Transcripts/2011.03.08] &amp;quot;the folder will load up to the limit number of items, and remaining ones won&#039;t show up in the viewer. you still own them, they aren&#039;t lost, but they will be hidden until the folder size is reduced.&amp;quot;&lt;br /&gt;
** There is no specified limit for total avatar inventory, very large folders can be split.&lt;br /&gt;
&lt;br /&gt;
== [[Land]] ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Maximum [[Land#Parcel|parcel]] size:&#039;&#039;&#039; 65,536 meters²&lt;br /&gt;
** Covering a whole region, or square on the World Map.&lt;br /&gt;
* &#039;&#039;&#039;Minimum parcel size:&#039;&#039;&#039; 16 meters²&lt;br /&gt;
* &#039;&#039;&#039;Maximum parcel name length:&#039;&#039;&#039; 63 single-byte characters&lt;br /&gt;
* &#039;&#039;&#039;Maximum parcel description length:&#039;&#039;&#039; 255 characters&lt;br /&gt;
* &#039;&#039;&#039;Region name length:&#039;&#039;&#039; Under Linden Concierge policy, minimum of 3 characters, and a maximum of 25 characters (including spaces). See [[Linden Lab Official:Guidelines for Private Region Naming|Guidelines for Private Region Naming]].&lt;br /&gt;
** Rare exceptions exist, like [http://slurl.com/secondlife/X/128/128/24 X].&lt;br /&gt;
* &#039;&#039;&#039;Maximum ban line height for &amp;quot;no entry&amp;quot; or &amp;quot;pay to access&amp;quot;&#039;&#039;&#039; (in other words, &amp;quot;allow public access&amp;quot; is turned off in the parcel options) is the parcel&#039;s ground elevation &#039;&#039;plus&#039;&#039; 50 meters. If a user is &#039;&#039;&#039;explicitly banned by name&#039;&#039;&#039;, the height is the parcel&#039;s ground elevation &#039;&#039;plus&#039;&#039; 5000 meters. On current viewers this is visible to the full extent.&lt;br /&gt;
* &#039;&#039;&#039;Maximum prims in a [[Land#Region|region]]:&#039;&#039;&#039;&lt;br /&gt;
** Full region: 15,000&lt;br /&gt;
** [[Land#Homestead|Homestead]]: 3,750&lt;br /&gt;
** [[Land#Openspace|Openspace]]: 750&lt;br /&gt;
* &#039;&#039;&#039;Maximum auto return value&#039;&#039;&#039;: Besides &amp;quot;0&amp;quot; (which means &#039;&#039;never&#039;&#039;), {{HoverText|999,999|Almost 23 months}} minutes is the highest auto return value.&lt;br /&gt;
* &#039;&#039;&#039;Terraforming limits:&#039;&#039;&#039;&lt;br /&gt;
** Most mainland can be raised/lowered by 4 meters (+/-).&lt;br /&gt;
** Some mainland cannot be terraformed, including: Bay City regions, Boardman, Brown, De Haro, Kama City regions, Nautilus City regions, Nova Albion regions, and Shermerville regions.&lt;br /&gt;
** [http://community.secondlife.com/t5/English-Knowledge-Base/Linden-Homes/ta-p/700103 Linden Homes] do not allow terraforming.&lt;br /&gt;
** A few, very old mainland Regions like Da Boom have a terraform range of 40 meters (+/-).&lt;br /&gt;
** Estate (private island) terraformability is settable to a maximum of 100 meters (+/-) by the estate owner or managers.&lt;br /&gt;
* &#039;&#039;&#039;Maximum water height:&#039;&#039;&#039; 100 meters using inworld controls, 255 meters by using a *.raw file upload.&lt;br /&gt;
** Region water height is usually 20 meters, and adjacent regions should have the same water height, or else they will look discontinuous.&lt;br /&gt;
* &#039;&#039;&#039;Maximum terrain height:&#039;&#039;&#039; 255 meters using inworld controls (mainland limit), 510 meters by using a *.raw file upload.&lt;br /&gt;
* &#039;&#039;&#039;Miscellaneous estate limits:&#039;&#039;&#039; You can have a maximum of 10 estate managers, 500 allowed Residents, 63 allowed groups, and 500 banned Residents.&lt;br /&gt;
** See World menu &amp;gt; Region/Estate &amp;gt; Estate tab.&lt;br /&gt;
* &#039;&#039;&#039;Maximum number of agents&#039;&#039;&#039;&lt;br /&gt;
** Full region: 100 (Typically set to 40 on mainland, 55 on Linden Homes regions, but this does vary. Some meeting areas have this set to 60 and higher.)&lt;br /&gt;
*** Recent server performance improvements make regions with 60 agents in them perform quite well.&lt;br /&gt;
** [[Land#Homestead|Homestead]]: 20&lt;br /&gt;
** [[Land#Openspace|Openspace]]: 10&lt;br /&gt;
* &#039;&#039;&#039;Freeze Time:&#039;&#039;&#039; Land owners can [[freeze]] other Residents for up to 30 seconds.  Members of land owning groups can also be granted this ability.&lt;br /&gt;
* &#039;&#039;&#039;Minimum parcel that can be listed in Places or All search:&#039;&#039;&#039; 144 meters² &amp;lt;!-- 128 and under are disabled --&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Minimum parcel that can be listed in Events:&#039;&#039;&#039; 512 meters²&lt;br /&gt;
* &#039;&#039;&#039;Maximum altitude for event listings:&#039;&#039;&#039;  768 meters ({{JIRA|WEB-814}})&lt;br /&gt;
* &#039;&#039;&#039;Maximum heights that objects can be seen on the [[World Map]]:&#039;&#039;&#039; 400.005m&lt;br /&gt;
&lt;br /&gt;
== [[Mesh]] ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; width=&amp;quot;100%&amp;quot; {{Prettytable}}&lt;br /&gt;
|- {{Hl2}}&lt;br /&gt;
! &#039;&#039;&#039;Limit affects&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Lower limit&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Upper limit&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Comment&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;More coverage&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||Number of vertices&lt;br /&gt;
| n/a&lt;br /&gt;
| {{no|65536 vertices per LOD for each [[mesh]] - See [[Talk:Limits#Mesh_Limits|discussion page]]}}&lt;br /&gt;
| n/a&lt;br /&gt;
| n/a&lt;br /&gt;
|-&lt;br /&gt;
||COLLADA file size&lt;br /&gt;
| n/a&lt;br /&gt;
| {{no|Maximum mesh asset size after compression is 8 MB, roughly equivalent to a 256 MB Raw COLLADA file.}}&lt;br /&gt;
| n/a&lt;br /&gt;
| n/a&lt;br /&gt;
|-&lt;br /&gt;
||Bone influence weights per vertex&lt;br /&gt;
| n/a&lt;br /&gt;
| {{no|4}}&lt;br /&gt;
| n/a&lt;br /&gt;
| n/a&lt;br /&gt;
|-&lt;br /&gt;
||Number of materials per mesh&lt;br /&gt;
| n/a&lt;br /&gt;
| {{no|8}}&lt;br /&gt;
| n/a&lt;br /&gt;
| n/a&lt;br /&gt;
|-&lt;br /&gt;
||Number of materials per face&lt;br /&gt;
| n/a&lt;br /&gt;
| {{no|1}}&lt;br /&gt;
| n/a&lt;br /&gt;
| n/a&lt;br /&gt;
|-&lt;br /&gt;
||Physics weight for a vehicle&lt;br /&gt;
| n/a&lt;br /&gt;
| {{no|32.0}}&lt;br /&gt;
| n/a&lt;br /&gt;
| n/a&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
===User Found Temporary Mesh limits:===&lt;br /&gt;
&#039;&#039;Because of an apparent bug in the importer stay within these limits.&#039;&#039;&lt;br /&gt;
* 174,752 triangles, beyond which additional triangles will appear as holes.&lt;br /&gt;
* The 64k vertices per material is pre-empted by a limit of 21,844 triangles per material, which is presently reported as {{Jira|BUG-1001}}. (4/2014 - See [[Talk:Limits#Mesh_Limits|discussion page]])&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
:: The import process will continue making new materials beyond 8 x 21,844 (=174,752) triangles, but the extra triangles then get dropped by the limitation to 8 materials, causing holes in the resulting object. Over the 21,844 triangle limit, the vertex count will start to climb steeply, even with smooth shading, because the materials get highly interspersed. So the same vertices have to appear in multiple material lists. So the moral of the story is to stay below 21,844 triangles per material, for now, if you want to avoid some unexpected effects.&lt;br /&gt;
&lt;br /&gt;
== Misc. ==&lt;br /&gt;
&lt;br /&gt;
*&#039;&#039;&#039;[https://secondlife.com/currency/describe-limits.php Billing and Trading Limits]&#039;&#039;&#039; - Includes [https://secondlife.com/whatis/economy-market.php LindeX] currency exchange limits.&lt;br /&gt;
*&#039;&#039;&#039;Contacts in Communication &amp;gt; Friends tab &#039;&#039;&#039; - A maximum of 20 simultaneous contacts can be selected to change permissions, remove, or invite for a conference chat.&lt;br /&gt;
&lt;br /&gt;
== Navigation ==&lt;br /&gt;
&lt;br /&gt;
[[File:Max Alt.jpg|thumb|right|435px|&#039;&#039;&#039;Height counter error above 2147483647 meters&#039;&#039;&#039;]]&lt;br /&gt;
* &#039;&#039;&#039;Absolute height limit:&#039;&#039;&#039; [http://en.wikipedia.org/wiki/2147483647#2147483647_in_computing 2147483647]&amp;amp;nbsp;=&amp;amp;nbsp;2&amp;lt;sup&amp;gt;31&amp;lt;/sup&amp;gt;&amp;amp;nbsp;−&amp;amp;nbsp;1 meters, which causes the altitude counter to roll over. Altitudes well below this cause graphics errors probably due to limited floating point number precision.&lt;br /&gt;
* &#039;&#039;&#039;Highest z-value of an [[SLurl]], that will still teleport you to a positive altitude:&#039;&#039;&#039; 4096&lt;br /&gt;
** This used to be much higher, but is clamped in late model viewers.&lt;br /&gt;
&lt;br /&gt;
== [[Profile]] ==&lt;br /&gt;
&lt;br /&gt;
Each 7-bit ASCII character is encoded in one byte. International characters might need more bytes. When pasting text instead of typing, you can get in one byte more into each of the below.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;2nd Life tab&#039;s About field&#039;&#039;&#039; - 510 bytes&lt;br /&gt;
* &#039;&#039;&#039;Picks tab&#039;&#039;&#039; - 10 picks with 1022 bytes each&lt;br /&gt;
* &#039;&#039;&#039;1st Life tab&#039;s Info field&#039;&#039;&#039; - 253 bytes&lt;br /&gt;
* &#039;&#039;&#039;Classified tab&#039;&#039;&#039; - 100 listings with x bytes each&lt;br /&gt;
* &#039;&#039;&#039;My Notes&#039;&#039;&#039; - 1022 bytes&lt;br /&gt;
&lt;br /&gt;
== Performance ==&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Healthy Viewer FPS&#039;&#039;&#039; - Generally, FPS above 15 is good. The higher it gets, the smoother. You can check via [[Advanced]] menu &amp;gt; Performance Tools &amp;gt; Lag Meter, or for more advanced usage, see Advanced &amp;gt; Performance Tools &amp;gt; Statistics Bar.&lt;br /&gt;
* &#039;&#039;&#039;Avatar Rendering Cost scores&#039;&#039;&#039; - [[Avatar Rendering Cost|Learn all about it!]]&lt;br /&gt;
&lt;br /&gt;
== [[Scripting]] == &amp;lt;!-- Important scripting limits should be placed here, less important ones should be in the articles Caveats or Specification sections --&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Height at which scripts reactivate on a no-script parcel&#039;&#039;&#039; - 50 m above terrain mesh. Scripted objects that take controls will keep running when you fly down or enter a no-script parcel. (If scripts are disabled in the region debug panel, they will not run at any height.)&lt;br /&gt;
* &#039;&#039;&#039;Maximum height where scripts can run&#039;&#039;&#039; - none, as long as the object remains rezzed or attached.&lt;br /&gt;
* &#039;&#039;&#039;Maximum script source code size&#039;&#039;&#039; - 65536 single byte characters (that&#039;s a viewer limit and can be changed in the config file &#039;panel_script_ed.xml&#039;).&lt;br /&gt;
* &#039;&#039;&#039;Maximum script memory size (LSO)&#039;&#039;&#039; - 16384 bytes.&lt;br /&gt;
* &#039;&#039;&#039;Maximum script memory size (Mono)&#039;&#039;&#039; - 65536 bytes (the maximum memory available to Mono scripts can be constrained via [[llSetMemoryLimit]]).&lt;br /&gt;
* &#039;&#039;&#039;Maximum active [[llListen|listeners]] per script&#039;&#039;&#039; - 65.&lt;br /&gt;
** &#039;&#039;&#039;Usable channel for each listener&#039;&#039;&#039; - &#039;&#039;min.&#039;&#039; -2147483648, &#039;&#039;max.&#039;&#039; 2147483647, including the following special channels: [[PUBLIC_CHANNEL]] &#039;&#039;and&#039;&#039; [[DEBUG_CHANNEL]].&lt;br /&gt;
* For specific scripting limits, look up calls in the &#039;&#039;&#039;[[LSL Portal]]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== [[Sound]] ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;sortable&amp;quot; width=&amp;quot;100%&amp;quot; {{Prettytable}}&lt;br /&gt;
|- {{Hl2}}&lt;br /&gt;
! &#039;&#039;&#039;Limit affects&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Lower limit&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Upper limit&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Comment&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;More coverage&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
||Sound length&lt;br /&gt;
| n/a&lt;br /&gt;
| {{no|any length &#039;&#039;less than&#039;&#039; 10.0 seconds}}&lt;br /&gt;
| You&#039;re advised to cut longer sounds into 9.9-second-pieces.&lt;br /&gt;
| n/a&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== [[Textures]] ==&lt;br /&gt;
* &#039;&#039;&#039;[http://en.wikipedia.org/wiki/Aspect_ratio Aspect ratios]&#039;&#039;&#039; of profile, place, etc. pictures — all of these were measured at UI size (Edit menu &amp;gt; Preferences &amp;gt; General tab &amp;gt; UI Size) = 1.000:&lt;br /&gt;
&lt;br /&gt;
=== Second Life Viewer 3.6 ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Search &amp;gt; Classifieds thumbnail&#039;&#039;&#039; - ~3:2 (101&amp;amp;times;69 pixels)&lt;br /&gt;
* &#039;&#039;&#039;Search &amp;gt; Classifieds expanded&#039;&#039;&#039; - ~4:3 (159&amp;amp;times;120 pixels)&lt;br /&gt;
* &#039;&#039;&#039;Search &amp;gt; Classifieds expanded &amp;gt; More Info&#039;&#039;&#039; - native aspect ratio&lt;br /&gt;
* &#039;&#039;&#039;Search &amp;gt; Destination Guide thumbnail&#039;&#039;&#039; - ~3:2 (101&amp;amp;times;69 pixels) &lt;br /&gt;
* &#039;&#039;&#039;Search &amp;gt; Destination Guide expanded&#039;&#039;&#039; - ~4:3 (159&amp;amp;times;120 pixels)&lt;br /&gt;
* &#039;&#039;&#039;Search &amp;gt; People&#039;&#039;&#039; - 1:1 (100&amp;amp;times;100 pixels)&lt;br /&gt;
* &#039;&#039;&#039;Search &amp;gt; Places expanded&#039;&#039;&#039; ~4:3 (159&amp;amp;times;120 pixels)&lt;br /&gt;
* &#039;&#039;&#039;Place Profile&#039;&#039;&#039; - ~3:2 (290&amp;amp;times;197 pixels)&lt;br /&gt;
* &#039;&#039;&#039;About Land &amp;gt; Options tab&#039;&#039;&#039; - ~4:3 (195&amp;amp;times;150 pixels)&lt;br /&gt;
* &#039;&#039;&#039;Profile &amp;gt; Picture&#039;&#039;&#039; - native aspect ratio; thumbnail cropped to 72&amp;amp;times;72 pixels; zoomed uncropped up to 300&amp;amp;times;300 pixels&lt;br /&gt;
* &#039;&#039;&#039;Profile &amp;gt; Real world picture&#039;&#039;&#039; - native aspect ratio; thumbnail cropped to 45&amp;amp;times;45 pixels; zoomed uncropped up to 300&amp;amp;times;300 pixels&lt;br /&gt;
* &#039;&#039;&#039;Profile &amp;gt; Picks thumbnail&#039;&#039;&#039; - 4:3 (60&amp;amp;times;45 pixels)&lt;br /&gt;
* &#039;&#039;&#039;Profile &amp;gt; Pick expanded&#039;&#039;&#039; - 4:3 (320&amp;amp;times;240 pixels)&lt;br /&gt;
&lt;br /&gt;
=== 1.x Series Viewers ===&lt;br /&gt;
(official Viewer up to 1.23.5, still used by some [[Alternate viewers|Third Party Viewers]])&lt;br /&gt;
* &#039;&#039;&#039;Search &amp;gt; All for &amp;quot;Classifieds&amp;quot;, &amp;quot;People&amp;quot;, and &amp;quot;Places&amp;quot;&#039;&#039;&#039; - 4:3 (256&amp;amp;times;192 pi&amp;amp;times;els)&lt;br /&gt;
* &#039;&#039;&#039;Search &amp;gt; Places and Classified tabs&#039;&#039;&#039; - ~7:5 (398&amp;amp;times;282 pixels)&lt;br /&gt;
* &#039;&#039;&#039;Search &amp;gt; Land tab&#039;&#039;&#039; - ~7:5 (358&amp;amp;times;252 pixels)&lt;br /&gt;
* &#039;&#039;&#039;Profile &amp;gt; 2nd Life tab&#039;&#039;&#039; - ~4:3 (178&amp;amp;times;133 pixels)&lt;br /&gt;
* &#039;&#039;&#039;Profile &amp;gt; Picks tab&#039;&#039;&#039; - 16:9 (288&amp;amp;times;162 pixels)&lt;br /&gt;
* &#039;&#039;&#039;Profile &amp;gt; 1st Life tab&#039;&#039;&#039; - 1:1 (133&amp;amp;times;133 pixels)&lt;br /&gt;
* &#039;&#039;&#039;Profile &amp;gt; Classifieds tab&#039;&#039;&#039; - ~3:2 (206&amp;amp;times;137 pixels)&lt;br /&gt;
* &#039;&#039;&#039;Profile &amp;gt; Web tab&#039;&#039;&#039; - 1:1 (400&amp;amp;times;400 pixels)&lt;br /&gt;
** A scrollbar uses 15 pixels on the right-hand side.&lt;br /&gt;
* &#039;&#039;&#039;About Land &amp;gt; Options tab&#039;&#039;&#039; - ~3:2 (178&amp;amp;times;117 pixels)&lt;br /&gt;
* &#039;&#039;&#039;Group Information &amp;gt; General tab&#039;s &amp;quot;Group Insignia&amp;quot;&#039;&#039;&#039; - 1:1 (126&amp;amp;times;126 pixels)&lt;br /&gt;
** Some of these textures are shared (for example, Search &amp;gt; All place pages, Search &amp;gt; Places, and About Land &amp;gt; Options use the same image), so you should pick a well-balanced ratio and size.&lt;br /&gt;
** [[Texture_aspect_ratios|Learn how to get correct texture aspect ratios when editing images.]]&lt;br /&gt;
&lt;br /&gt;
=== All Viewers ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Maximum texture size&#039;&#039;&#039; - 1024&amp;amp;times;1024 pixels&lt;br /&gt;
** All Second Life textures are constrained to [http://en.wikipedia.org/wiki/Power_of_2 powers of 2] (e.g., 128, 256, 512).&lt;br /&gt;
** Some textures inworld have a resolution as high as 2048&amp;amp;times;2048; this is due to a previous limit that was higher.&lt;br /&gt;
** We strongly recommend you use as small textures as possible because larger ones consume more memory and take substantially longer to load.&lt;br /&gt;
** Where large textures are being forced by import to only 512&amp;amp;times;512, lower your ...&amp;gt; Preferences &amp;gt;...&amp;gt; UI Size under 1.0, to increase import size to the max 1024&amp;amp;times;1024.&lt;br /&gt;
&lt;br /&gt;
[[Category:Creation]] [[Category:Tutorials]] [[Category:Lists]]&lt;br /&gt;
&lt;br /&gt;
=== Notes ===&lt;br /&gt;
In general 1 byte is enough to contain one character.&lt;/div&gt;</summary>
		<author><name>Darien Caldwell</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Mesh/Avatar_Shape_XML_Format&amp;diff=1195855</id>
		<title>Mesh/Avatar Shape XML Format</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Mesh/Avatar_Shape_XML_Format&amp;diff=1195855"/>
		<updated>2015-03-19T02:02:39Z</updated>

		<summary type="html">&lt;p&gt;Darien Caldwell: Repair Syntax Highlighting from new Wiki software version.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Navbox/Mesh|tech}}&lt;br /&gt;
== History ==&lt;br /&gt;
The Shape XML format has been ingrained in the viewer since the early days, long before mesh existed. However, with the addition of rigged mesh and customized clothing, the file has become invaluable to creators. Sometimes called an &amp;quot;archetype file&amp;quot; due to it&#039;s default name &amp;quot;new_archetype.xml&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
With the release of [[Project_Sunshine-Server_Side_Appearance|Server Side Appearance]] in Early 2013, The XML format has inherited additional information. However, its XML version number is still 1.0, and it is still backward compatible with the original terse format. The additions will be outlined separately in the SSA Extensions section.&lt;br /&gt;
&lt;br /&gt;
== Header ==&lt;br /&gt;
The file is standard XML, with 3 parameters:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;US-ASCII&amp;quot; standalone=&amp;quot;yes&amp;quot;?&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
** The &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter sets the version of the XML markup. (should always be 1.0)&lt;br /&gt;
** The &amp;lt;code&amp;gt;encoding&amp;lt;/code&amp;gt; parameter sets the character encoding for the file. (should always be US-ASCII)&lt;br /&gt;
** The &amp;lt;code&amp;gt;standalone&amp;lt;/code&amp;gt; parameter informs that the file is self-containted, and not dependent on any external files. (should always be yes)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note that some viewers&#039;&#039;&#039; set &amp;lt;code&amp;gt;standalone=&amp;quot;true&amp;quot;&amp;lt;/code&amp;gt;.  This is technically incorrect via the XML standard. It should be &amp;lt;code&amp;gt;standalone=&amp;quot;yes&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Root Node ==&lt;br /&gt;
&lt;br /&gt;
The root node is of type &amp;lt;code&amp;gt;linden_genepool&amp;lt;/code&amp;gt; with one parameter:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;linden_genepool version=&amp;quot;1.0&amp;quot;&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
** The &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter sets the version of the data contained in the node. Currently LL&#039;s data is version 1.0. Future revisions may increment this version, so any implementation should check this version number before using the data.&lt;br /&gt;
&lt;br /&gt;
== Data Body ==&lt;br /&gt;
&lt;br /&gt;
The Root node contains one node of type &amp;lt;code&amp;gt;archetype&amp;lt;/code&amp;gt; with one parameter.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;archetype name=&amp;quot;???&amp;quot;&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
** The &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; parameter is a information parameter, and can contain anything, or nothing. Most commonly populated with 3 question marks.&lt;br /&gt;
&lt;br /&gt;
== The Data ==&lt;br /&gt;
&lt;br /&gt;
The data inside is a list of parameters and textures associated with the Avatar&#039;s appearance. These can be broken up into 4 categories:&lt;br /&gt;
&lt;br /&gt;
* Shape&lt;br /&gt;
* Skin&lt;br /&gt;
* Hair&lt;br /&gt;
* Eyes&lt;br /&gt;
&lt;br /&gt;
Each category will have several &amp;lt;code&amp;gt;param&amp;lt;/code&amp;gt; nodes and possibly &amp;lt;code&amp;gt;texture&amp;lt;/code&amp;gt; nodes included. More about these nodes in the next section.&lt;br /&gt;
&lt;br /&gt;
== Param Nodes ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;param&amp;lt;/code&amp;gt; nodes correspond to sliders in the appearance pane. Each has 3 parameters:&lt;br /&gt;
*Example: &amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;param id=&amp;quot;649&amp;quot; name=&amp;quot;torso muscles&amp;quot; value=&amp;quot;0.500&amp;quot;/&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
** The &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; parameter corresponds to an internal viewer table of possible sliders. These numbers are guaranteed to be unique, and always correspond to the same slider.&lt;br /&gt;
** The &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; parameter corresponds to internal &#039;driving elements&#039; in the viewer. This can vary depending on the type of param. For shapes, it&#039;s often the name of the morph being controlled. For skins or eyes, it&#039;s usually a material that&#039;s being changed (color etc).  For hair, a combination of both are present. These are &#039;&#039;&#039;not&#039;&#039;&#039; always unique. For example, there are two parameters called &amp;quot;torso muscles&amp;quot;, with different IDs (one for male, one for female).&lt;br /&gt;
** The &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; parameter is the value of the slider. It is however in the internally used format, not the 0-100 value seen by Residents. Calculating what these values mean requires finding the Minimum and Maximum of that value from other sources, such as the [[Avatar_Appearance#Linden_avatar_definition_file|Linden Avatar Definition File]] (avatar_lad.xml)&lt;br /&gt;
&lt;br /&gt;
== Texture Nodes ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;texture&amp;lt;/code&amp;gt; nodes correspond to textures applied via the appearance pane. Each has two parameters:&lt;br /&gt;
*Example: &amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;texture te=&amp;quot;3&amp;quot; uuid=&amp;quot;00000000-0000-4000-8000-000000000000&amp;quot;/&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
** The &amp;lt;code&amp;gt;te&amp;lt;/code&amp;gt; parameter corresponds to an internal viewer table of possible textures. These numbers are guaranteed to be unique.&lt;br /&gt;
** The &amp;lt;code&amp;gt;uuid&amp;lt;/code&amp;gt; parameter corresponds to the [[UUID]] of the texture applied at the time of the XML creation.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note that &amp;lt;code&amp;gt;texture&amp;lt;/code&amp;gt; nodes are optional&#039;&#039;&#039; and not guaranteed to be present. Especially when the file is generated from 3rd party sources.&lt;br /&gt;
&lt;br /&gt;
== Comments ==&lt;br /&gt;
&lt;br /&gt;
Comments are styled in the standard HTML style, with the string &amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;!--&amp;lt;/source&amp;gt; denoting the start of a comment, and &amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;--&amp;gt;&amp;lt;/source&amp;gt; denoting the end of a comment. This is per the XML specification.&lt;br /&gt;
*Example: &amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;!-- wearable: shape --&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== File Termination ==&lt;br /&gt;
&lt;br /&gt;
The file is terminated by the closing of the &amp;lt;code&amp;gt;archetype&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;linden_genepool&amp;lt;/code&amp;gt; nodes:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;source lang=&amp;quot;xml&amp;quot;&amp;gt;&amp;lt;/archetype&amp;gt;&amp;lt;/linden_genepool&amp;gt;&amp;lt;/source&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SSA Extensions ==&lt;br /&gt;
The Two main changes with SSA are the addition of &#039;&#039;&#039;many&#039;&#039;&#039; new &amp;lt;code&amp;gt;param&amp;lt;/code&amp;gt; nodes , and the inclusion of new data in all &amp;lt;code&amp;gt;param&amp;lt;/code&amp;gt; nodes.&lt;br /&gt;
*The additional &amp;lt;code&amp;gt;param&amp;lt;/code&amp;gt; nodes now cover more than just the avatar&#039;s body shape and texture. Now, there is data for every possible avatar appearance modifier, including all clothes layers, alpha layers, tattoo layers, all internal morphs, and all settings for these items. In short there is every bit of data needed to completely recreate the entire avatar&#039;s &#039;look&#039;.&lt;br /&gt;
*The new parameters included in the &amp;lt;code&amp;gt;param&amp;lt;/code&amp;gt; nodes is &#039;&#039;in addition to&#039;&#039; the original parameters. All of the originally available parameters are still provided. The new parameters are as follows:&lt;br /&gt;
**The &amp;lt;code&amp;gt;u8&amp;lt;/code&amp;gt; parameter is a short integer normalized representation of the displayed slider value. Whereas before some complex math was necessary to determine what 0-100 slider value was indicated by the morph value in the &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; parameter, now you can simply take the u8 value, divide it by 255, then multiply that value by 100. That will give you the displayed slider values.  255 would be a slider value of 100, 128 would be a slider value of 50, and 0 would of course be 0.&lt;br /&gt;
**The &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; parameter is a rough indication of what kind of data the &amp;lt;code&amp;gt;param&amp;lt;/code&amp;gt; entry is associated with. There seem to be 5 distinct values, which likely correspond to entries in the [[Avatar_Appearance#Linden_avatar_definition_file|Linden Avatar Definition File]] (avatar_lad.xml)&lt;br /&gt;
*** param_morph, param_driver, param_skeleton, param_color, param_alpha&lt;br /&gt;
** The &amp;lt;code&amp;gt;wearable&amp;lt;/code&amp;gt; parameter further groups &amp;lt;code&amp;gt;param&amp;lt;/code&amp;gt; entries into distinct groups. These clearly indicate what avatar component the &amp;lt;code&amp;gt;param&amp;lt;/code&amp;gt; node is associated with. There seem to be 16 distinct values:&lt;br /&gt;
*** shape, hair, invalid, gloves, eyes, skin, pants, shoes, shirt, jacket, socks, underpants, undershirt, skirt, tattoo, physics&lt;br /&gt;
** The &amp;lt;code&amp;gt;invalid&amp;lt;/code&amp;gt; wearable indicates a morph.&lt;/div&gt;</summary>
		<author><name>Darien Caldwell</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Darien_Caldwell/New_Materials&amp;diff=1192393</id>
		<title>User:Darien Caldwell/New Materials</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Darien_Caldwell/New_Materials&amp;diff=1192393"/>
		<updated>2014-07-29T16:18:23Z</updated>

		<summary type="html">&lt;p&gt;Darien Caldwell: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;•LSL support for materials&lt;br /&gt;
 &lt;br /&gt;
•Materials can be added to object faces with llSetPrimitiveParams() functions &lt;br /&gt;
&lt;br /&gt;
•[PRIM_SPECULAR, integer face, string texture, vector repeats, vector offsets, float rotation_in_radians, vector color, integer glossy, integer environment]&lt;br /&gt;
&lt;br /&gt;
•[PRIM_NORMAL, integer face, string texture, vector repeats, vector offsets, float rotation_in_radians]&lt;br /&gt;
&lt;br /&gt;
•[PRIM_ALPHA_MODE, integer face, integer alpha_mode, integer alpha_cutoff] &lt;br /&gt;
&lt;br /&gt;
Wiki Pages: [[PRIM_NORMAL]], [[PRIM_SPECULAR]], and [[PRIM_ALPHA_MODE]]&lt;br /&gt;
&lt;br /&gt;
•Valid alpha_mode options are PRIM_ALPHA_MODE_NONE, PRIM_ALPHA_MODE_BLEND, PRIM_ALPHA_MODE_MASK, PRIM_ALPHA_MODE_EMISSIVE&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
•Materials can be read with the various llGetPrimitiveParams() functions &lt;br /&gt;
&lt;br /&gt;
•[PRIM_SPECULAR, integer face] returns [string texture, vector repeats, vector offsets, float rotation_in_radians, vector color, integer glossy, integer environment]&lt;br /&gt;
&lt;br /&gt;
•[PRIM_NORMAL, integer face] returns [string texture, vector repeats, vector offsets, float rotation_in_radians]&lt;br /&gt;
&lt;br /&gt;
•[PRIM_ALPHA_MODE, integer face] returns [integer alpha_mode, integer alpha_cutoff]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
•Behavior for both getting and setting materials parameters should basically correspond to behavior with PRIM_TEXTURE&lt;br /&gt;
&lt;br /&gt;
•The color vectors use 0.0-1.0 as the range, as with llSetColor()&lt;br /&gt;
&lt;br /&gt;
•The integer parameters for PRIM_SPECULAR correspond to the same values that you see in the build tool&lt;br /&gt;
&lt;br /&gt;
•Components of a material can be ‘reset’ as follows:&lt;br /&gt;
&lt;br /&gt;
• &lt;br /&gt;
•PRIM_NORMAL and PRIM_SPECULAR settings are set to ‘default’ values by setting the texture to NULL_KEY&lt;br /&gt;
&lt;br /&gt;
•PRIM_ALPHA_MODE settings are set to ‘default’ values by setting the alpha_mode to PRIM_ALPHA_MODE_BLEND &lt;br /&gt;
&lt;br /&gt;
•mask_cutoff is actually reset to 0 unless the alpha mode is PRIM_ALPHA_MODE_MASK&lt;br /&gt;
&lt;br /&gt;
•When PRIM_NORMAL, PRIM_SPECULAR, and PRIM_ALPHA_MODE settings are all set to ‘default’ values, the material is deleted from that prim face, and LI may be updated accordingly&lt;br /&gt;
&lt;br /&gt;
•Known issues &lt;br /&gt;
&lt;br /&gt;
•There is a viewer rendering issue, where the face will not be rendered and you’ll see log spam (BUG-6187), &lt;br /&gt;
&lt;br /&gt;
•If the viewer has ALM enabled&lt;br /&gt;
&lt;br /&gt;
•and a prim face has a material on it&lt;br /&gt;
&lt;br /&gt;
•and PRIM_ALPHA_MODE is PRIM_ALPHA_MODE_BLEND (this is the default after a material is added)&lt;br /&gt;
&lt;br /&gt;
•and the diffuse texture does not have an alpha channel (e.g. plywood)&lt;/div&gt;</summary>
		<author><name>Darien Caldwell</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Darien_Caldwell/New_Materials&amp;diff=1192392</id>
		<title>User:Darien Caldwell/New Materials</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Darien_Caldwell/New_Materials&amp;diff=1192392"/>
		<updated>2014-07-29T16:16:45Z</updated>

		<summary type="html">&lt;p&gt;Darien Caldwell: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;•LSL support for materials&lt;br /&gt;
 &lt;br /&gt;
•Materials can be added to object faces with llSetPrimitiveParams() functions &lt;br /&gt;
&lt;br /&gt;
•[PRIM_SPECULAR, integer face, string texture, vector repeats, vector offsets, float rotation_in_radians, vector color, integer glossy, integer environment]&lt;br /&gt;
&lt;br /&gt;
•[PRIM_NORMAL, integer face, string texture, vector repeats, vector offsets, float rotation_in_radians]&lt;br /&gt;
&lt;br /&gt;
•[PRIM_ALPHA_MODE, integer face, integer alpha_mode, integer alpha_cutoff] &lt;br /&gt;
&lt;br /&gt;
•Valid alpha_mode options are PRIM_ALPHA_MODE_NONE, PRIM_ALPHA_MODE_BLEND, PRIM_ALPHA_MODE_MASK, PRIM_ALPHA_MODE_EMISSIVE&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
•Materials can be read with the various llGetPrimitiveParams() functions &lt;br /&gt;
&lt;br /&gt;
•[PRIM_SPECULAR, integer face] returns [string texture, vector repeats, vector offsets, float rotation_in_radians, vector color, integer glossy, integer environment]&lt;br /&gt;
&lt;br /&gt;
•[PRIM_NORMAL, integer face] returns [string texture, vector repeats, vector offsets, float rotation_in_radians]&lt;br /&gt;
&lt;br /&gt;
•[PRIM_ALPHA_MODE, integer face] returns [integer alpha_mode, integer alpha_cutoff]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
•Behavior for both getting and setting materials parameters should basically correspond to behavior with PRIM_TEXTURE&lt;br /&gt;
&lt;br /&gt;
•The color vectors use 0.0-1.0 as the range, as with llSetColor()&lt;br /&gt;
&lt;br /&gt;
•The integer parameters for PRIM_SPECULAR correspond to the same values that you see in the build tool&lt;br /&gt;
&lt;br /&gt;
•Components of a material can be ‘reset’ as follows:&lt;br /&gt;
&lt;br /&gt;
• &lt;br /&gt;
•PRIM_NORMAL and PRIM_SPECULAR settings are set to ‘default’ values by setting the texture to NULL_KEY&lt;br /&gt;
&lt;br /&gt;
•PRIM_ALPHA_MODE settings are set to ‘default’ values by setting the alpha_mode to PRIM_ALPHA_MODE_BLEND &lt;br /&gt;
&lt;br /&gt;
•mask_cutoff is actually reset to 0 unless the alpha mode is PRIM_ALPHA_MODE_MASK&lt;br /&gt;
&lt;br /&gt;
•When PRIM_NORMAL, PRIM_SPECULAR, and PRIM_ALPHA_MODE settings are all set to ‘default’ values, the material is deleted from that prim face, and LI may be updated accordingly&lt;br /&gt;
&lt;br /&gt;
•Known issues &lt;br /&gt;
&lt;br /&gt;
•There is a viewer rendering issue, where the face will not be rendered and you’ll see log spam (BUG-6187), &lt;br /&gt;
&lt;br /&gt;
•If the viewer has ALM enabled&lt;br /&gt;
&lt;br /&gt;
•and a prim face has a material on it&lt;br /&gt;
&lt;br /&gt;
•and PRIM_ALPHA_MODE is PRIM_ALPHA_MODE_BLEND (this is the default after a material is added)&lt;br /&gt;
&lt;br /&gt;
•and the diffuse texture does not have an alpha channel (e.g. plywood)&lt;/div&gt;</summary>
		<author><name>Darien Caldwell</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Darien_Caldwell&amp;diff=1191734</id>
		<title>User:Darien Caldwell</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Darien_Caldwell&amp;diff=1191734"/>
		<updated>2014-07-04T19:46:05Z</updated>

		<summary type="html">&lt;p&gt;Darien Caldwell: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;If you have to ask, It&#039;s not important enough to know. :)&lt;br /&gt;
&lt;br /&gt;
HTTP-IN Dynamic DNS service for Google App Engine: https://wiki.secondlife.com/wiki/User:Darien_Caldwell/HTTP-DNS&lt;br /&gt;
&lt;br /&gt;
Original Code: https://wiki.secondlife.com/wiki/User:Darien_Caldwell/HTTP-DNS_Code&lt;br /&gt;
&lt;br /&gt;
Enchanced Security code: https://wiki.secondlife.com/w/index.php?title=User:Darien_Caldwell/Advanced%20HTTP-DNS%20Code&lt;br /&gt;
&lt;br /&gt;
The old forum post: http://forums-archive.secondlife.com/54/33/323981/1.html&lt;br /&gt;
&lt;br /&gt;
https://wiki.secondlife.com/wiki/User:Darien_Caldwell/New_Materials&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[[Category:SL Certification Participant|Darien Caldwell]]&lt;/div&gt;</summary>
		<author><name>Darien Caldwell</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Darien_Caldwell/New_Materials&amp;diff=1191733</id>
		<title>User:Darien Caldwell/New Materials</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Darien_Caldwell/New_Materials&amp;diff=1191733"/>
		<updated>2014-07-04T19:45:45Z</updated>

		<summary type="html">&lt;p&gt;Darien Caldwell: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;•LSL support for materials is in testing&lt;br /&gt;
 &lt;br /&gt;
•Certain Aditi regions (DRTSIM-253 channel, presently) have LSL support for materials &lt;br /&gt;
&lt;br /&gt;
•Regions “roller-test102″ and “roller-test103″ are on this channel&lt;br /&gt;
&lt;br /&gt;
•This is still a work-in-progress – testing is still underway&lt;br /&gt;
&lt;br /&gt;
•Materials can be added to object faces with llSetPrimitiveParams() functions &lt;br /&gt;
&lt;br /&gt;
•[PRIM_SPECULAR, integer face, string texture, vector repeats, vector offsets, float rotation_in_radians, vector color, integer glossy, integer environment]&lt;br /&gt;
&lt;br /&gt;
•[PRIM_NORMAL, integer face, string texture, vector repeats, vector offsets, float rotation_in_radians]&lt;br /&gt;
&lt;br /&gt;
•[PRIM_ALPHA_MODE, integer face, integer alpha_mode, integer alpha_cutoff] &lt;br /&gt;
&lt;br /&gt;
•Valid alpha_mode options are PRIM_ALPHA_MODE_NONE, PRIM_ALPHA_MODE_BLEND, PRIM_ALPHA_MODE_MASK, PRIM_ALPHA_MODE_EMISSIVE&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
•Materials can be read with the various llGetPrimitiveParams() functions &lt;br /&gt;
&lt;br /&gt;
•[PRIM_SPECULAR, integer face] returns [string texture, vector repeats, vector offsets, float rotation_in_radians, vector color, integer glossy, integer environment]&lt;br /&gt;
&lt;br /&gt;
•[PRIM_NORMAL, integer face] returns [string texture, vector repeats, vector offsets, float rotation_in_radians]&lt;br /&gt;
&lt;br /&gt;
•[PRIM_ALPHA_MODE, integer face] returns [integer alpha_mode, integer alpha_cutoff]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
•Behavior for both getting and setting materials parameters should basically correspond to behavior with PRIM_TEXTURE&lt;br /&gt;
&lt;br /&gt;
•The color vectors use 0.0-1.0 as the range, as with llSetColor()&lt;br /&gt;
&lt;br /&gt;
•The integer parameters for PRIM_SPECULAR correspond to the same values that you see in the build tool&lt;br /&gt;
&lt;br /&gt;
•Components of a material can be ‘reset’ as follows:&lt;br /&gt;
&lt;br /&gt;
• &lt;br /&gt;
•PRIM_NORMAL and PRIM_SPECULAR settings are set to ‘default’ values by setting the texture to NULL_KEY&lt;br /&gt;
&lt;br /&gt;
•PRIM_ALPHA_MODE settings are set to ‘default’ values by setting the alpha_mode to PRIM_ALPHA_MODE_BLEND &lt;br /&gt;
&lt;br /&gt;
•mask_cutoff is actually reset to 0 unless the alpha mode is PRIM_ALPHA_MODE_MASK&lt;br /&gt;
&lt;br /&gt;
•When PRIM_NORMAL, PRIM_SPECULAR, and PRIM_ALPHA_MODE settings are all set to ‘default’ values, the material is deleted from that prim face, and LI may be updated accordingly&lt;br /&gt;
&lt;br /&gt;
•Known issues &lt;br /&gt;
&lt;br /&gt;
•There is a viewer rendering issue, where the face will not be rendered and you’ll see log spam (BUG-6187), &lt;br /&gt;
&lt;br /&gt;
•If the viewer has ALM enabled&lt;br /&gt;
&lt;br /&gt;
•and a prim face has a material on it&lt;br /&gt;
&lt;br /&gt;
•and PRIM_ALPHA_MODE is PRIM_ALPHA_MODE_BLEND (this is the default after a material is added)&lt;br /&gt;
&lt;br /&gt;
•and the diffuse texture does not have an alpha channel (e.g. plywood)&lt;br /&gt;
&lt;br /&gt;
•The version currently on Aditi lacks proper throttling, so there could be performance issues if scripts behave badly&lt;/div&gt;</summary>
		<author><name>Darien Caldwell</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Darien_Caldwell/New_Materials&amp;diff=1191732</id>
		<title>User:Darien Caldwell/New Materials</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Darien_Caldwell/New_Materials&amp;diff=1191732"/>
		<updated>2014-07-04T19:44:01Z</updated>

		<summary type="html">&lt;p&gt;Darien Caldwell: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;•LSL support for materials is in testing &lt;br /&gt;
•Certain Aditi regions (DRTSIM-253 channel, presently) have LSL support for materials &lt;br /&gt;
•Regions “roller-test102″ and “roller-test103″ are on this channel&lt;br /&gt;
•This is still a work-in-progress – testing is still underway&lt;br /&gt;
&lt;br /&gt;
•Materials can be added to object faces with llSetPrimitiveParams() functions &lt;br /&gt;
•[PRIM_SPECULAR, integer face, string texture, vector repeats, vector offsets, float rotation_in_radians, vector color, integer glossy, integer environment]&lt;br /&gt;
•[PRIM_NORMAL, integer face, string texture, vector repeats, vector offsets, float rotation_in_radians]&lt;br /&gt;
•[PRIM_ALPHA_MODE, integer face, integer alpha_mode, integer alpha_cutoff] &lt;br /&gt;
•Valid alpha_mode options are PRIM_ALPHA_MODE_NONE, PRIM_ALPHA_MODE_BLEND, PRIM_ALPHA_MODE_MASK, PRIM_ALPHA_MODE_EMISSIVE&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
•Materials can be read with the various llGetPrimitiveParams() functions &lt;br /&gt;
•[PRIM_SPECULAR, integer face] returns [string texture, vector repeats, vector offsets, float rotation_in_radians, vector color, integer glossy, integer environment]&lt;br /&gt;
•[PRIM_NORMAL, integer face] returns [string texture, vector repeats, vector offsets, float rotation_in_radians]&lt;br /&gt;
•[PRIM_ALPHA_MODE, integer face] returns [integer alpha_mode, integer alpha_cutoff]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
•Behavior for both getting and setting materials parameters should basically correspond to behavior with PRIM_TEXTURE&lt;br /&gt;
•The color vectors use 0.0-1.0 as the range, as with llSetColor()&lt;br /&gt;
•The integer parameters for PRIM_SPECULAR correspond to the same values that you see in the build tool&lt;br /&gt;
•Components of a material can be ‘reset’ as follows:&lt;br /&gt;
• &lt;br /&gt;
•PRIM_NORMAL and PRIM_SPECULAR settings are set to ‘default’ values by setting the texture to NULL_KEY&lt;br /&gt;
•PRIM_ALPHA_MODE settings are set to ‘default’ values by setting the alpha_mode to PRIM_ALPHA_MODE_BLEND •mask_cutoff is actually reset to 0 unless the alpha mode is PRIM_ALPHA_MODE_MASK&lt;br /&gt;
&lt;br /&gt;
•When PRIM_NORMAL, PRIM_SPECULAR, and PRIM_ALPHA_MODE settings are all set to ‘default’ values, the material is deleted from that prim face, and LI may be updated accordingly&lt;br /&gt;
&lt;br /&gt;
•Known issues &lt;br /&gt;
•There is a viewer rendering issue, where the face will not be rendered and you’ll see log spam (BUG-6187), &lt;br /&gt;
•If the viewer has ALM enabled&lt;br /&gt;
•and a prim face has a material on it&lt;br /&gt;
•and PRIM_ALPHA_MODE is PRIM_ALPHA_MODE_BLEND (this is the default after a material is added)&lt;br /&gt;
•and the diffuse texture does not have an alpha channel (e.g. plywood)&lt;br /&gt;
&lt;br /&gt;
•The version currently on Aditi lacks proper throttling, so there could be performance issues if scripts behave badly&lt;/div&gt;</summary>
		<author><name>Darien Caldwell</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Darien_Caldwell/New_Materials&amp;diff=1191731</id>
		<title>User:Darien Caldwell/New Materials</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Darien_Caldwell/New_Materials&amp;diff=1191731"/>
		<updated>2014-07-04T19:42:51Z</updated>

		<summary type="html">&lt;p&gt;Darien Caldwell: Created page with &amp;quot;•LSL support for materials is in testing •Certain Aditi regions (DRTSIM-253 channel, presently) have LSL support for materials •Regions “roller-test102″ and “roller-t…&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;•LSL support for materials is in testing •Certain Aditi regions (DRTSIM-253 channel, presently) have LSL support for materials •Regions “roller-test102″ and “roller-test103″ are on this channel&lt;br /&gt;
•This is still a work-in-progress – testing is still underway&lt;br /&gt;
&lt;br /&gt;
•Materials can be added to object faces with llSetPrimitiveParams() functions •[PRIM_SPECULAR, integer face, string texture, vector repeats, vector offsets, float rotation_in_radians, vector color, integer glossy, integer environment]&lt;br /&gt;
•[PRIM_NORMAL, integer face, string texture, vector repeats, vector offsets, float rotation_in_radians]&lt;br /&gt;
•[PRIM_ALPHA_MODE, integer face, integer alpha_mode, integer alpha_cutoff] •Valid alpha_mode options are PRIM_ALPHA_MODE_NONE, PRIM_ALPHA_MODE_BLEND, PRIM_ALPHA_MODE_MASK, PRIM_ALPHA_MODE_EMISSIVE&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
•Materials can be read with the various llGetPrimitiveParams() functions •[PRIM_SPECULAR, integer face] returns [string texture, vector repeats, vector offsets, float rotation_in_radians, vector color, integer glossy, integer environment]&lt;br /&gt;
•[PRIM_NORMAL, integer face] returns [string texture, vector repeats, vector offsets, float rotation_in_radians]&lt;br /&gt;
•[PRIM_ALPHA_MODE, integer face] returns [integer alpha_mode, integer alpha_cutoff]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
•Behavior for both getting and setting materials parameters should basically correspond to behavior with PRIM_TEXTURE&lt;br /&gt;
•The color vectors use 0.0-1.0 as the range, as with llSetColor()&lt;br /&gt;
•The integer parameters for PRIM_SPECULAR correspond to the same values that you see in the build tool&lt;br /&gt;
•Components of a material can be ‘reset’ as follows:&lt;br /&gt;
• •PRIM_NORMAL and PRIM_SPECULAR settings are set to ‘default’ values by setting the texture to NULL_KEY&lt;br /&gt;
•PRIM_ALPHA_MODE settings are set to ‘default’ values by setting the alpha_mode to PRIM_ALPHA_MODE_BLEND •mask_cutoff is actually reset to 0 unless the alpha mode is PRIM_ALPHA_MODE_MASK&lt;br /&gt;
&lt;br /&gt;
•When PRIM_NORMAL, PRIM_SPECULAR, and PRIM_ALPHA_MODE settings are all set to ‘default’ values, the material is deleted from that prim face, and LI may be updated accordingly&lt;br /&gt;
&lt;br /&gt;
•Known issues •There is a viewer rendering issue, where the face will not be rendered and you’ll see log spam (BUG-6187), •If the viewer has ALM enabled&lt;br /&gt;
•and a prim face has a material on it&lt;br /&gt;
•and PRIM_ALPHA_MODE is PRIM_ALPHA_MODE_BLEND (this is the default after a material is added)&lt;br /&gt;
•and the diffuse texture does not have an alpha channel (e.g. plywood)&lt;br /&gt;
&lt;br /&gt;
•The version currently on Aditi lacks proper throttling, so there could be performance issues if scripts behave badly&lt;/div&gt;</summary>
		<author><name>Darien Caldwell</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Material_Data&amp;diff=1191306</id>
		<title>Material Data</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Material_Data&amp;diff=1191306"/>
		<updated>2014-06-14T18:33:42Z</updated>

		<summary type="html">&lt;p&gt;Darien Caldwell: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Materials]]&lt;br /&gt;
&lt;br /&gt;
{{RightToc}}&lt;br /&gt;
&lt;br /&gt;
This page describes how the various parameters and texture data used to define a material in Second Life are interpreted for rendering. It is intended to help content creators and external tool developers to better understand how to create images to achieve good visual results.&lt;br /&gt;
&lt;br /&gt;
There are as many as two colors and three images associated with a face.  &lt;br /&gt;
For a more detailed explanation of the fundamentals of materials, see Pedro Toledo&#039;s [http://www.manufato.com/?p=902 Brief Considerations About Materials]&lt;br /&gt;
{{KBnote|&#039;&#039;&#039;Setting any of the materials properties on an object causes its Land Impact to be calculated using the current algorithm.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The additional textures used for Normal and Specular maps add to the Download Weight of the object.  &lt;br /&gt;
&lt;br /&gt;
If the object was previously using the legacy accounting (prim count), setting a material property on it may increase costs significantly due to other properties (such as complex shapes) that are more accurately accounted for in the current system.&lt;br /&gt;
&lt;br /&gt;
For details, see [http://community.secondlife.com/t5/English-Knowledge-Base/Calculating-land-impact/ta-p/974163 Calculating land impact] and [[Physics Optimization]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Colors==&lt;br /&gt;
&lt;br /&gt;
;Color&lt;br /&gt;
:a solid color for the surface; Tints the color of the diffuse map.&lt;br /&gt;
&lt;br /&gt;
;Specular Color&lt;br /&gt;
:this is a color that ‘tints’ any reflections from the face; see also [[#Specular Map|Specular Map]]&lt;br /&gt;
&lt;br /&gt;
==Textures==&lt;br /&gt;
&lt;br /&gt;
===Texture===&lt;br /&gt;
&lt;br /&gt;
Also called the &#039;&#039;&#039;Diffuse Map&#039;&#039;&#039;, this is an image that is displayed on the surface. The way the texture is applied to the face is controlled by &lt;br /&gt;
&lt;br /&gt;
====Positioning &amp;amp;amp; Scaling Properties====&lt;br /&gt;
Note that each image (diffuse/texture, normal map, specular map) has its own values for these parameters.&lt;br /&gt;
:;Mapping&lt;br /&gt;
::&#039;&#039;Default&#039;&#039; or &#039;&#039;Planar&#039;&#039;&lt;br /&gt;
:;Horizontal Repeats:number of repeats of the image over the surface (used only in default mapping)&lt;br /&gt;
:;Vertical Repeats:number of repeats of the image over the surface (used only in default mapping)&lt;br /&gt;
:;Rotation:clockwise degrees the image is rotated&lt;br /&gt;
:;Repeats Per Meter:number of repeats of the image per in-world meter of the surface (used only in planar mapping)&lt;br /&gt;
:;Horizontal Offset:distance in meters the image is shifted right on the surface&lt;br /&gt;
:;Vertical Offset:distance in meters the image is shifted up on the surface&lt;br /&gt;
&lt;br /&gt;
===Normal Map===&lt;br /&gt;
&lt;br /&gt;
An image whose color data encodes changes to the &amp;quot;normal&amp;quot; for each pixel on the surface.  The normal is the direction that the pixel &amp;quot;faces&amp;quot; for the purpose of determining how it is illuminated by and reflects light sources (imagine that each pixel is turned on tiny pivots).  The alpha channel of the Normal Map may contain a specular exponent value that is mutilplied by the &amp;quot;Glossiness&amp;quot; parameter.  A higher alpha value will result in specular highlights that are brighter and tighter.  Keep in mind these are OpenGL style normal maps, where bright green is up and bright red is right. (or to put in Industry terms, the normal maps are X+, Y+, Z+ normal maps)&lt;br /&gt;
&lt;br /&gt;
For details on what a normal map is and for a sample normal map see http://en.wikipedia.org/wiki/Normal_mapping.  See also the [[#Texture Channel Encoding|Texture Channel Encoding]] table below.&lt;br /&gt;
&lt;br /&gt;
;Positioning:The Normal Map has its own set of the same [[#Positioning &amp;amp;amp; Scaling Properties|Positioning &amp;amp;amp; Scaling Properties]] properties as the [[#Texture|Texture]].&lt;br /&gt;
&lt;br /&gt;
===Specular Map===&lt;br /&gt;
&lt;br /&gt;
This encodes the color of the light reflected by each pixel on the surface.  See the [[#Texture Channel Encoding|Texture Channel Encoding]] table below.&lt;br /&gt;
&lt;br /&gt;
The Alpha channel value of the Specular Map encodes the environment intensity.  A lower value in the alpha channel will diminish the impact of the environment map reflections on the surface of the object.&lt;br /&gt;
&lt;br /&gt;
;Positioning:The Specular Map has its own set of the same [[#Positioning &amp;amp;amp; Scaling Properties|Positioning &amp;amp;amp; Scaling Properties]] properties as the [[#Texture|Texture]].&lt;br /&gt;
&lt;br /&gt;
===Texture Channel Encoding===&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; style=&amp;quot;width: 100%; border-collapse: separate; border-spacing: 0; border-width: 1px; border-style: solid; border-color: #000; padding: 0;&amp;quot;&lt;br /&gt;
|+How the renderer will treat each color value in a texture image channel&lt;br /&gt;
|-&lt;br /&gt;
!Parameter&lt;br /&gt;
!Red&lt;br /&gt;
!Green&lt;br /&gt;
!Blue&lt;br /&gt;
!Alpha&lt;br /&gt;
|+&lt;br /&gt;
!Diffuse Map&lt;br /&gt;
|Red&lt;br /&gt;
|Green&lt;br /&gt;
|Blue&lt;br /&gt;
|&#039;&#039;selectable&#039;&#039;&lt;br /&gt;
see [[#Alpha Mode|Alpha Mode]]&lt;br /&gt;
|+&lt;br /&gt;
!Normal Map&lt;br /&gt;
|Normal X Axis&lt;br /&gt;
|Normal Y Axis&lt;br /&gt;
|Normal Z Axis&lt;br /&gt;
|Specular exponent&lt;br /&gt;
|+&lt;br /&gt;
!Specular Map&lt;br /&gt;
|Red&lt;br /&gt;
|Green&lt;br /&gt;
|Blue&lt;br /&gt;
|Environment intensity&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Additional Parameters==&lt;br /&gt;
&lt;br /&gt;
;Alpha Mode&lt;br /&gt;
:This controls the interpretation of the Alpha channel data in the Diffuse Map.  It can have one of four values:&lt;br /&gt;
:;None:Alpha channel data is not used&lt;br /&gt;
:;Transparency (blended):The value is a degree of transparency (255 = opaque, 0 = fully transparent)&lt;br /&gt;
:;Alpha Mask (cutoff):The value (0...255) is compared to the Alpha Cutoff parameter (below); if the pixel is greater than the cutoff, it is fully opaque; if not, it is fully transparent.&lt;br /&gt;
:;Emissive:The value is used to encode how brightly the pixel appears in the absence of light (ambiance): 0 = no additional ambiance (default); 255 = full brightness&lt;br /&gt;
:&#039;&#039;Note that using any alpha mode other than Transparency may cause problems when rendered with viewers that do not yet support materials because they will be rendered as blended transparency.  We expect that support for materials will be adopted quickly in most viewers, so this is acceptable.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
;Alpha Cutoff&lt;br /&gt;
:Used only when Alpha Mode is Alpha Mask (see description of that mode above)&lt;br /&gt;
&lt;br /&gt;
;Specular Light Color&lt;br /&gt;
:Tints the light reflected from the object; this value is combined with any value from the color for the pixel as specified in the Specular Map, if any.&lt;br /&gt;
&lt;br /&gt;
;Environment Intensity&lt;br /&gt;
:Modulates the intensity of the environment on the surface as a whole.  &lt;br /&gt;
&lt;br /&gt;
;Glossiness&lt;br /&gt;
:This controls the “glossiness”, or the roughness, of the reflected light on a surface.  The lower this value is, the “rougher” the light reflectance is, while the higher the value the “sharper” the light reflectance is.  When the normal map’s alpha channel is present, the specular exponent map contained in it is modulated by this parameter.&lt;/div&gt;</summary>
		<author><name>Darien Caldwell</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Material_Data&amp;diff=1191305</id>
		<title>Material Data</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Material_Data&amp;diff=1191305"/>
		<updated>2014-06-14T18:33:07Z</updated>

		<summary type="html">&lt;p&gt;Darien Caldwell: added terminology clarification&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Materials]]&lt;br /&gt;
&lt;br /&gt;
{{RightToc}}&lt;br /&gt;
&lt;br /&gt;
This page describes how the various parameters and texture data used to define a material in Second Life are interpreted for rendering. It is intended to help content creators and external tool developers to better understand how to create images to achieve good visual results.&lt;br /&gt;
&lt;br /&gt;
There are as many as two colors and three images associated with a face.  &lt;br /&gt;
For a more detailed explanation of the fundamentals of materials, see Pedro Toledo&#039;s [http://www.manufato.com/?p=902 Brief Considerations About Materials]&lt;br /&gt;
{{KBnote|&#039;&#039;&#039;Setting any of the materials properties on an object causes its Land Impact to be calculated using the current algorithm.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The additional textures used for Normal and Specular maps add to the Download Weight of the object.  &lt;br /&gt;
&lt;br /&gt;
If the object was previously using the legacy accounting (prim count), setting a material property on it may increase costs significantly due to other properties (such as complex shapes) that are more accurately accounted for in the current system.&lt;br /&gt;
&lt;br /&gt;
For details, see [http://community.secondlife.com/t5/English-Knowledge-Base/Calculating-land-impact/ta-p/974163 Calculating land impact] and [[Physics Optimization]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Colors==&lt;br /&gt;
&lt;br /&gt;
;Color&lt;br /&gt;
:a solid color for the surface; Tints the color of the diffuse map.&lt;br /&gt;
&lt;br /&gt;
;Specular Color&lt;br /&gt;
:this is a color that ‘tints’ any reflections from the face; see also [[#Specular Map|Specular Map]]&lt;br /&gt;
&lt;br /&gt;
==Textures==&lt;br /&gt;
&lt;br /&gt;
===Texture===&lt;br /&gt;
&lt;br /&gt;
Also called the &#039;&#039;&#039;Diffuse Map&#039;&#039;&#039;, this is an image that is displayed on the surface. The way the texture is applied to the face is controlled by &lt;br /&gt;
&lt;br /&gt;
====Positioning &amp;amp;amp; Scaling Properties====&lt;br /&gt;
Note that each image (diffuse/texture, normal map, specular map) has its own values for these parameters.&lt;br /&gt;
:;Mapping&lt;br /&gt;
::&#039;&#039;Default&#039;&#039; or &#039;&#039;Planar&#039;&#039;&lt;br /&gt;
:;Horizontal Repeats:number of repeats of the image over the surface (used only in default mapping)&lt;br /&gt;
:;Vertical Repeats:number of repeats of the image over the surface (used only in default mapping)&lt;br /&gt;
:;Rotation:clockwise degrees the image is rotated&lt;br /&gt;
:;Repeats Per Meter:number of repeats of the image per in-world meter of the surface (used only in planar mapping)&lt;br /&gt;
:;Horizontal Offset:distance in meters the image is shifted right on the surface&lt;br /&gt;
:;Vertical Offset:distance in meters the image is shifted up on the surface&lt;br /&gt;
&lt;br /&gt;
===Normal Map===&lt;br /&gt;
&lt;br /&gt;
An image whose color data encodes changes to the &amp;quot;normal&amp;quot; for each pixel on the surface.  The normal is the direction that the pixel &amp;quot;faces&amp;quot; for the purpose of determining how it is illuminated by and reflects light sources (imagine that each pixel is turned on tiny pivots).  The alpha channel of the Normal Map may contain a specular exponent value that is mutilplied by the &amp;quot;Glossiness&amp;quot; parameter.  A higher alpha value will result in specular highlights that are brighter and tighter.  Keep in mind these are OpenGL style normal maps, where bright green is up and bright red is right.(or to put in Industry terms, the normal maps are X+, Y+, Z+ normal maps)  For details on what a normal map is and for a sample normal map see http://en.wikipedia.org/wiki/Normal_mapping.  See also the [[#Texture Channel Encoding|Texture Channel Encoding]] table below.&lt;br /&gt;
&lt;br /&gt;
;Positioning:The Normal Map has its own set of the same [[#Positioning &amp;amp;amp; Scaling Properties|Positioning &amp;amp;amp; Scaling Properties]] properties as the [[#Texture|Texture]].&lt;br /&gt;
&lt;br /&gt;
===Specular Map===&lt;br /&gt;
&lt;br /&gt;
This encodes the color of the light reflected by each pixel on the surface.  See the [[#Texture Channel Encoding|Texture Channel Encoding]] table below.&lt;br /&gt;
&lt;br /&gt;
The Alpha channel value of the Specular Map encodes the environment intensity.  A lower value in the alpha channel will diminish the impact of the environment map reflections on the surface of the object.&lt;br /&gt;
&lt;br /&gt;
;Positioning:The Specular Map has its own set of the same [[#Positioning &amp;amp;amp; Scaling Properties|Positioning &amp;amp;amp; Scaling Properties]] properties as the [[#Texture|Texture]].&lt;br /&gt;
&lt;br /&gt;
===Texture Channel Encoding===&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; style=&amp;quot;width: 100%; border-collapse: separate; border-spacing: 0; border-width: 1px; border-style: solid; border-color: #000; padding: 0;&amp;quot;&lt;br /&gt;
|+How the renderer will treat each color value in a texture image channel&lt;br /&gt;
|-&lt;br /&gt;
!Parameter&lt;br /&gt;
!Red&lt;br /&gt;
!Green&lt;br /&gt;
!Blue&lt;br /&gt;
!Alpha&lt;br /&gt;
|+&lt;br /&gt;
!Diffuse Map&lt;br /&gt;
|Red&lt;br /&gt;
|Green&lt;br /&gt;
|Blue&lt;br /&gt;
|&#039;&#039;selectable&#039;&#039;&lt;br /&gt;
see [[#Alpha Mode|Alpha Mode]]&lt;br /&gt;
|+&lt;br /&gt;
!Normal Map&lt;br /&gt;
|Normal X Axis&lt;br /&gt;
|Normal Y Axis&lt;br /&gt;
|Normal Z Axis&lt;br /&gt;
|Specular exponent&lt;br /&gt;
|+&lt;br /&gt;
!Specular Map&lt;br /&gt;
|Red&lt;br /&gt;
|Green&lt;br /&gt;
|Blue&lt;br /&gt;
|Environment intensity&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Additional Parameters==&lt;br /&gt;
&lt;br /&gt;
;Alpha Mode&lt;br /&gt;
:This controls the interpretation of the Alpha channel data in the Diffuse Map.  It can have one of four values:&lt;br /&gt;
:;None:Alpha channel data is not used&lt;br /&gt;
:;Transparency (blended):The value is a degree of transparency (255 = opaque, 0 = fully transparent)&lt;br /&gt;
:;Alpha Mask (cutoff):The value (0...255) is compared to the Alpha Cutoff parameter (below); if the pixel is greater than the cutoff, it is fully opaque; if not, it is fully transparent.&lt;br /&gt;
:;Emissive:The value is used to encode how brightly the pixel appears in the absence of light (ambiance): 0 = no additional ambiance (default); 255 = full brightness&lt;br /&gt;
:&#039;&#039;Note that using any alpha mode other than Transparency may cause problems when rendered with viewers that do not yet support materials because they will be rendered as blended transparency.  We expect that support for materials will be adopted quickly in most viewers, so this is acceptable.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
;Alpha Cutoff&lt;br /&gt;
:Used only when Alpha Mode is Alpha Mask (see description of that mode above)&lt;br /&gt;
&lt;br /&gt;
;Specular Light Color&lt;br /&gt;
:Tints the light reflected from the object; this value is combined with any value from the color for the pixel as specified in the Specular Map, if any.&lt;br /&gt;
&lt;br /&gt;
;Environment Intensity&lt;br /&gt;
:Modulates the intensity of the environment on the surface as a whole.  &lt;br /&gt;
&lt;br /&gt;
;Glossiness&lt;br /&gt;
:This controls the “glossiness”, or the roughness, of the reflected light on a surface.  The lower this value is, the “rougher” the light reflectance is, while the higher the value the “sharper” the light reflectance is.  When the normal map’s alpha channel is present, the specular exponent map contained in it is modulated by this parameter.&lt;/div&gt;</summary>
		<author><name>Darien Caldwell</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Material_Data&amp;diff=1190919</id>
		<title>Material Data</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Material_Data&amp;diff=1190919"/>
		<updated>2014-05-21T19:44:43Z</updated>

		<summary type="html">&lt;p&gt;Darien Caldwell: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Materials]]&lt;br /&gt;
&lt;br /&gt;
{{RightToc}}&lt;br /&gt;
&lt;br /&gt;
This page describes how the various parameters and texture data used to define a material in Second Life are interpreted for rendering. It is intended to help content creators and external tool developers to better understand how to create images to achieve good visual results.&lt;br /&gt;
&lt;br /&gt;
There are as many as two colors and three images associated with a face.  &lt;br /&gt;
For a more detailed explanation of the fundamentals of materials, see Pedro Toledo&#039;s [http://www.manufato.com/?p=902 Brief Considerations About Materials]&lt;br /&gt;
{{KBnote|&#039;&#039;&#039;Setting any of the materials properties on an object causes its Land Impact to be calculated using the current algorithm.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The additional textures used for Normal and Specular maps add to the Download Weight of the object.  &lt;br /&gt;
&lt;br /&gt;
If the object was previously using the legacy accounting (prim count), setting a material property on it may increase costs significantly due to other properties (such as complex shapes) that are more accurately accounted for in the current system.&lt;br /&gt;
&lt;br /&gt;
For details, see [http://community.secondlife.com/t5/English-Knowledge-Base/Calculating-land-impact/ta-p/974163 Calculating land impact] and [[Physics Optimization]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Colors==&lt;br /&gt;
&lt;br /&gt;
;Color&lt;br /&gt;
:a solid color for the surface; Tints the color of the diffuse map.&lt;br /&gt;
&lt;br /&gt;
;Specular Color&lt;br /&gt;
:this is a color that ‘tints’ any reflections from the face; see also [[#Specular Map|Specular Map]]&lt;br /&gt;
&lt;br /&gt;
==Textures==&lt;br /&gt;
&lt;br /&gt;
===Texture===&lt;br /&gt;
&lt;br /&gt;
Also called the &#039;&#039;&#039;Diffuse Map&#039;&#039;&#039;, this is an image that is displayed on the surface. The way the texture is applied to the face is controlled by &lt;br /&gt;
&lt;br /&gt;
====Positioning &amp;amp;amp; Scaling Properties====&lt;br /&gt;
Note that each image (diffuse/texture, normal map, specular map) has its own values for these parameters.&lt;br /&gt;
:;Mapping&lt;br /&gt;
::&#039;&#039;Default&#039;&#039; or &#039;&#039;Planar&#039;&#039;&lt;br /&gt;
:;Horizontal Repeats:number of repeats of the image over the surface (used only in default mapping)&lt;br /&gt;
:;Vertical Repeats:number of repeats of the image over the surface (used only in default mapping)&lt;br /&gt;
:;Rotation:clockwise degrees the image is rotated&lt;br /&gt;
:;Repeats Per Meter:number of repeats of the image per in-world meter of the surface (used only in planar mapping)&lt;br /&gt;
:;Horizontal Offset:distance in meters the image is shifted right on the surface&lt;br /&gt;
:;Vertical Offset:distance in meters the image is shifted up on the surface&lt;br /&gt;
&lt;br /&gt;
===Normal Map===&lt;br /&gt;
&lt;br /&gt;
An image whose color data encodes changes to the &amp;quot;normal&amp;quot; for each pixel on the surface.  The normal is the direction that the pixel &amp;quot;faces&amp;quot; for the purpose of determining how it is illuminated by and reflects light sources (imagine that each pixel is turned on tiny pivots).  The alpha channel of the Normal Map may contain a specular exponent value that is mutilplied by the &amp;quot;Glossiness&amp;quot; parameter.  A higher alpha value will result in specular highlights that are brighter and tighter.  Keep in mind these are OpenGL style normal maps, where bright green is up and bright red is right.  For details on what a normal map is and for a sample normal map see http://en.wikipedia.org/wiki/Normal_mapping.  See also the [[#Texture Channel Encoding|Texture Channel Encoding]] table below.&lt;br /&gt;
&lt;br /&gt;
;Positioning:The Normal Map has its own set of the same [[#Positioning &amp;amp;amp; Scaling Properties|Positioning &amp;amp;amp; Scaling Properties]] properties as the [[#Texture|Texture]].&lt;br /&gt;
&lt;br /&gt;
===Specular Map===&lt;br /&gt;
&lt;br /&gt;
This encodes the color of the light reflected by each pixel on the surface.  See the [[#Texture Channel Encoding|Texture Channel Encoding]] table below.&lt;br /&gt;
&lt;br /&gt;
The Alpha channel value of the Specular Map encodes the environment intensity.  A lower value in the alpha channel will diminish the impact of the environment map reflections on the surface of the object.&lt;br /&gt;
&lt;br /&gt;
;Positioning:The Specular Map has its own set of the same [[#Positioning &amp;amp;amp; Scaling Properties|Positioning &amp;amp;amp; Scaling Properties]] properties as the [[#Texture|Texture]].&lt;br /&gt;
&lt;br /&gt;
===Texture Channel Encoding===&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; style=&amp;quot;width: 100%; border-collapse: separate; border-spacing: 0; border-width: 1px; border-style: solid; border-color: #000; padding: 0;&amp;quot;&lt;br /&gt;
|+How the renderer will treat each color value in a texture image channel&lt;br /&gt;
|-&lt;br /&gt;
!Parameter&lt;br /&gt;
!Red&lt;br /&gt;
!Green&lt;br /&gt;
!Blue&lt;br /&gt;
!Alpha&lt;br /&gt;
|+&lt;br /&gt;
!Diffuse Map&lt;br /&gt;
|Red&lt;br /&gt;
|Green&lt;br /&gt;
|Blue&lt;br /&gt;
|&#039;&#039;selectable&#039;&#039;&lt;br /&gt;
see [[#Alpha Mode|Alpha Mode]]&lt;br /&gt;
|+&lt;br /&gt;
!Normal Map&lt;br /&gt;
|Normal X Axis&lt;br /&gt;
|Normal Y Axis&lt;br /&gt;
|Normal Z Axis&lt;br /&gt;
|Specular exponent&lt;br /&gt;
|+&lt;br /&gt;
!Specular Map&lt;br /&gt;
|Red&lt;br /&gt;
|Green&lt;br /&gt;
|Blue&lt;br /&gt;
|Environment intensity&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Additional Parameters==&lt;br /&gt;
&lt;br /&gt;
;Alpha Mode&lt;br /&gt;
:This controls the interpretation of the Alpha channel data in the Diffuse Map.  It can have one of four values:&lt;br /&gt;
:;None:Alpha channel data is not used&lt;br /&gt;
:;Transparency (blended):The value is a degree of transparency (255 = opaque, 0 = fully transparent)&lt;br /&gt;
:;Alpha Mask (cutoff):The value (0...255) is compared to the Alpha Cutoff parameter (below); if the pixel is greater than the cutoff, it is fully opaque; if not, it is fully transparent.&lt;br /&gt;
:;Emissive:The value is used to encode how brightly the pixel appears in the absence of light (ambiance): 0 = no additional ambiance (default); 255 = full brightness&lt;br /&gt;
:&#039;&#039;Note that using any alpha mode other than Transparency may cause problems when rendered with viewers that do not yet support materials because they will be rendered as blended transparency.  We expect that support for materials will be adopted quickly in most viewers, so this is acceptable.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
;Alpha Cutoff&lt;br /&gt;
:Used only when Alpha Mode is Alpha Mask (see description of that mode above)&lt;br /&gt;
&lt;br /&gt;
;Specular Light Color&lt;br /&gt;
:Tints the light reflected from the object; this value is combined with any value from the color for the pixel as specified in the Specular Map, if any.&lt;br /&gt;
&lt;br /&gt;
;Environment Intensity&lt;br /&gt;
:Modulates the intensity of the environment on the surface as a whole.  &lt;br /&gt;
&lt;br /&gt;
;Glossiness&lt;br /&gt;
:This controls the “glossiness”, or the roughness, of the reflected light on a surface.  The lower this value is, the “rougher” the light reflectance is, while the higher the value the “sharper” the light reflectance is.  When the normal map’s alpha channel is present, the specular exponent map contained in it is modulated by this parameter.&lt;/div&gt;</summary>
		<author><name>Darien Caldwell</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Material_Data&amp;diff=1190918</id>
		<title>Material Data</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Material_Data&amp;diff=1190918"/>
		<updated>2014-05-21T19:44:27Z</updated>

		<summary type="html">&lt;p&gt;Darien Caldwell: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Materials]]&lt;br /&gt;
&lt;br /&gt;
{{RightToc}}&lt;br /&gt;
&lt;br /&gt;
This page describes how the various parameters and texture data used to define a material in Second Life are interpreted for rendering. It is intended to help content creators and external tool developers to better understand how to create images to achieve good visual results.&lt;br /&gt;
&lt;br /&gt;
There are as many as two colors and three images associated with a face.  &lt;br /&gt;
For a more detailed explanation of the fundamentals of materials, see Pedro Toledo&#039;s [http://www.manufato.com/?p=902 Brief Considerations About Materials]&lt;br /&gt;
&lt;br /&gt;
{{KBnote|&#039;&#039;&#039;Setting any of the materials properties on an object causes its Land Impact to be calculated using the current algorithm.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The additional textures used for Normal and Specular maps add to the Download Weight of the object.  &lt;br /&gt;
&lt;br /&gt;
If the object was previously using the legacy accounting (prim count), setting a material property on it may increase costs significantly due to other properties (such as complex shapes) that are more accurately accounted for in the current system.&lt;br /&gt;
&lt;br /&gt;
For details, see [http://community.secondlife.com/t5/English-Knowledge-Base/Calculating-land-impact/ta-p/974163 Calculating land impact] and [[Physics Optimization]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
==Colors==&lt;br /&gt;
&lt;br /&gt;
;Color&lt;br /&gt;
:a solid color for the surface; Tints the color of the diffuse map.&lt;br /&gt;
&lt;br /&gt;
;Specular Color&lt;br /&gt;
:this is a color that ‘tints’ any reflections from the face; see also [[#Specular Map|Specular Map]]&lt;br /&gt;
&lt;br /&gt;
==Textures==&lt;br /&gt;
&lt;br /&gt;
===Texture===&lt;br /&gt;
&lt;br /&gt;
Also called the &#039;&#039;&#039;Diffuse Map&#039;&#039;&#039;, this is an image that is displayed on the surface. The way the texture is applied to the face is controlled by &lt;br /&gt;
&lt;br /&gt;
====Positioning &amp;amp;amp; Scaling Properties====&lt;br /&gt;
Note that each image (diffuse/texture, normal map, specular map) has its own values for these parameters.&lt;br /&gt;
:;Mapping&lt;br /&gt;
::&#039;&#039;Default&#039;&#039; or &#039;&#039;Planar&#039;&#039;&lt;br /&gt;
:;Horizontal Repeats:number of repeats of the image over the surface (used only in default mapping)&lt;br /&gt;
:;Vertical Repeats:number of repeats of the image over the surface (used only in default mapping)&lt;br /&gt;
:;Rotation:clockwise degrees the image is rotated&lt;br /&gt;
:;Repeats Per Meter:number of repeats of the image per in-world meter of the surface (used only in planar mapping)&lt;br /&gt;
:;Horizontal Offset:distance in meters the image is shifted right on the surface&lt;br /&gt;
:;Vertical Offset:distance in meters the image is shifted up on the surface&lt;br /&gt;
&lt;br /&gt;
===Normal Map===&lt;br /&gt;
&lt;br /&gt;
An image whose color data encodes changes to the &amp;quot;normal&amp;quot; for each pixel on the surface.  The normal is the direction that the pixel &amp;quot;faces&amp;quot; for the purpose of determining how it is illuminated by and reflects light sources (imagine that each pixel is turned on tiny pivots).  The alpha channel of the Normal Map may contain a specular exponent value that is mutilplied by the &amp;quot;Glossiness&amp;quot; parameter.  A higher alpha value will result in specular highlights that are brighter and tighter.  Keep in mind these are OpenGL style normal maps, where bright green is up and bright red is right.  For details on what a normal map is and for a sample normal map see http://en.wikipedia.org/wiki/Normal_mapping.  See also the [[#Texture Channel Encoding|Texture Channel Encoding]] table below.&lt;br /&gt;
&lt;br /&gt;
;Positioning:The Normal Map has its own set of the same [[#Positioning &amp;amp;amp; Scaling Properties|Positioning &amp;amp;amp; Scaling Properties]] properties as the [[#Texture|Texture]].&lt;br /&gt;
&lt;br /&gt;
===Specular Map===&lt;br /&gt;
&lt;br /&gt;
This encodes the color of the light reflected by each pixel on the surface.  See the [[#Texture Channel Encoding|Texture Channel Encoding]] table below.&lt;br /&gt;
&lt;br /&gt;
The Alpha channel value of the Specular Map encodes the environment intensity.  A lower value in the alpha channel will diminish the impact of the environment map reflections on the surface of the object.&lt;br /&gt;
&lt;br /&gt;
;Positioning:The Specular Map has its own set of the same [[#Positioning &amp;amp;amp; Scaling Properties|Positioning &amp;amp;amp; Scaling Properties]] properties as the [[#Texture|Texture]].&lt;br /&gt;
&lt;br /&gt;
===Texture Channel Encoding===&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; style=&amp;quot;width: 100%; border-collapse: separate; border-spacing: 0; border-width: 1px; border-style: solid; border-color: #000; padding: 0;&amp;quot;&lt;br /&gt;
|+How the renderer will treat each color value in a texture image channel&lt;br /&gt;
|-&lt;br /&gt;
!Parameter&lt;br /&gt;
!Red&lt;br /&gt;
!Green&lt;br /&gt;
!Blue&lt;br /&gt;
!Alpha&lt;br /&gt;
|+&lt;br /&gt;
!Diffuse Map&lt;br /&gt;
|Red&lt;br /&gt;
|Green&lt;br /&gt;
|Blue&lt;br /&gt;
|&#039;&#039;selectable&#039;&#039;&lt;br /&gt;
see [[#Alpha Mode|Alpha Mode]]&lt;br /&gt;
|+&lt;br /&gt;
!Normal Map&lt;br /&gt;
|Normal X Axis&lt;br /&gt;
|Normal Y Axis&lt;br /&gt;
|Normal Z Axis&lt;br /&gt;
|Specular exponent&lt;br /&gt;
|+&lt;br /&gt;
!Specular Map&lt;br /&gt;
|Red&lt;br /&gt;
|Green&lt;br /&gt;
|Blue&lt;br /&gt;
|Environment intensity&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Additional Parameters==&lt;br /&gt;
&lt;br /&gt;
;Alpha Mode&lt;br /&gt;
:This controls the interpretation of the Alpha channel data in the Diffuse Map.  It can have one of four values:&lt;br /&gt;
:;None:Alpha channel data is not used&lt;br /&gt;
:;Transparency (blended):The value is a degree of transparency (255 = opaque, 0 = fully transparent)&lt;br /&gt;
:;Alpha Mask (cutoff):The value (0...255) is compared to the Alpha Cutoff parameter (below); if the pixel is greater than the cutoff, it is fully opaque; if not, it is fully transparent.&lt;br /&gt;
:;Emissive:The value is used to encode how brightly the pixel appears in the absence of light (ambiance): 0 = no additional ambiance (default); 255 = full brightness&lt;br /&gt;
:&#039;&#039;Note that using any alpha mode other than Transparency may cause problems when rendered with viewers that do not yet support materials because they will be rendered as blended transparency.  We expect that support for materials will be adopted quickly in most viewers, so this is acceptable.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
;Alpha Cutoff&lt;br /&gt;
:Used only when Alpha Mode is Alpha Mask (see description of that mode above)&lt;br /&gt;
&lt;br /&gt;
;Specular Light Color&lt;br /&gt;
:Tints the light reflected from the object; this value is combined with any value from the color for the pixel as specified in the Specular Map, if any.&lt;br /&gt;
&lt;br /&gt;
;Environment Intensity&lt;br /&gt;
:Modulates the intensity of the environment on the surface as a whole.  &lt;br /&gt;
&lt;br /&gt;
;Glossiness&lt;br /&gt;
:This controls the “glossiness”, or the roughness, of the reflected light on a surface.  The lower this value is, the “rougher” the light reflectance is, while the higher the value the “sharper” the light reflectance is.  When the normal map’s alpha channel is present, the specular exponent map contained in it is modulated by this parameter.&lt;/div&gt;</summary>
		<author><name>Darien Caldwell</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Material_Data&amp;diff=1190916</id>
		<title>Material Data</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Material_Data&amp;diff=1190916"/>
		<updated>2014-05-21T19:44:04Z</updated>

		<summary type="html">&lt;p&gt;Darien Caldwell: removed unnecessary warning: materials has been released for at least a year.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;[[Category:Materials]]&lt;br /&gt;
&lt;br /&gt;
{{RightToc}}&lt;br /&gt;
&lt;br /&gt;
This page describes how the various parameters and texture data used to define a material in Second Life are interpreted for rendering. It is intended to help content creators and external tool developers to better understand how to create images to achieve good visual results.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
There are as many as two colors and three images associated with a face.  &lt;br /&gt;
For a more detailed explanation of the fundamentals of materials, see Pedro Toledo&#039;s [http://www.manufato.com/?p=902 Brief Considerations About Materials]&lt;br /&gt;
&lt;br /&gt;
{{KBnote|&#039;&#039;&#039;Setting any of the materials properties on an object causes its Land Impact to be calculated using the current algorithm.&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
The additional textures used for Normal and Specular maps add to the Download Weight of the object.  &lt;br /&gt;
&lt;br /&gt;
If the object was previously using the legacy accounting (prim count), setting a material property on it may increase costs significantly due to other properties (such as complex shapes) that are more accurately accounted for in the current system.&lt;br /&gt;
&lt;br /&gt;
For details, see [http://community.secondlife.com/t5/English-Knowledge-Base/Calculating-land-impact/ta-p/974163 Calculating land impact] and [[Physics Optimization]].&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Colors==&lt;br /&gt;
&lt;br /&gt;
;Color&lt;br /&gt;
:a solid color for the surface; Tints the color of the diffuse map.&lt;br /&gt;
&lt;br /&gt;
;Specular Color&lt;br /&gt;
:this is a color that ‘tints’ any reflections from the face; see also [[#Specular Map|Specular Map]]&lt;br /&gt;
&lt;br /&gt;
==Textures==&lt;br /&gt;
&lt;br /&gt;
===Texture===&lt;br /&gt;
&lt;br /&gt;
Also called the &#039;&#039;&#039;Diffuse Map&#039;&#039;&#039;, this is an image that is displayed on the surface. The way the texture is applied to the face is controlled by &lt;br /&gt;
&lt;br /&gt;
====Positioning &amp;amp;amp; Scaling Properties====&lt;br /&gt;
Note that each image (diffuse/texture, normal map, specular map) has its own values for these parameters.&lt;br /&gt;
:;Mapping&lt;br /&gt;
::&#039;&#039;Default&#039;&#039; or &#039;&#039;Planar&#039;&#039;&lt;br /&gt;
:;Horizontal Repeats:number of repeats of the image over the surface (used only in default mapping)&lt;br /&gt;
:;Vertical Repeats:number of repeats of the image over the surface (used only in default mapping)&lt;br /&gt;
:;Rotation:clockwise degrees the image is rotated&lt;br /&gt;
:;Repeats Per Meter:number of repeats of the image per in-world meter of the surface (used only in planar mapping)&lt;br /&gt;
:;Horizontal Offset:distance in meters the image is shifted right on the surface&lt;br /&gt;
:;Vertical Offset:distance in meters the image is shifted up on the surface&lt;br /&gt;
&lt;br /&gt;
===Normal Map===&lt;br /&gt;
&lt;br /&gt;
An image whose color data encodes changes to the &amp;quot;normal&amp;quot; for each pixel on the surface.  The normal is the direction that the pixel &amp;quot;faces&amp;quot; for the purpose of determining how it is illuminated by and reflects light sources (imagine that each pixel is turned on tiny pivots).  The alpha channel of the Normal Map may contain a specular exponent value that is mutilplied by the &amp;quot;Glossiness&amp;quot; parameter.  A higher alpha value will result in specular highlights that are brighter and tighter.  Keep in mind these are OpenGL style normal maps, where bright green is up and bright red is right.  For details on what a normal map is and for a sample normal map see http://en.wikipedia.org/wiki/Normal_mapping.  See also the [[#Texture Channel Encoding|Texture Channel Encoding]] table below.&lt;br /&gt;
&lt;br /&gt;
;Positioning:The Normal Map has its own set of the same [[#Positioning &amp;amp;amp; Scaling Properties|Positioning &amp;amp;amp; Scaling Properties]] properties as the [[#Texture|Texture]].&lt;br /&gt;
&lt;br /&gt;
===Specular Map===&lt;br /&gt;
&lt;br /&gt;
This encodes the color of the light reflected by each pixel on the surface.  See the [[#Texture Channel Encoding|Texture Channel Encoding]] table below.&lt;br /&gt;
&lt;br /&gt;
The Alpha channel value of the Specular Map encodes the environment intensity.  A lower value in the alpha channel will diminish the impact of the environment map reflections on the surface of the object.&lt;br /&gt;
&lt;br /&gt;
;Positioning:The Specular Map has its own set of the same [[#Positioning &amp;amp;amp; Scaling Properties|Positioning &amp;amp;amp; Scaling Properties]] properties as the [[#Texture|Texture]].&lt;br /&gt;
&lt;br /&gt;
===Texture Channel Encoding===&lt;br /&gt;
&lt;br /&gt;
{|border=&amp;quot;1&amp;quot; style=&amp;quot;width: 100%; border-collapse: separate; border-spacing: 0; border-width: 1px; border-style: solid; border-color: #000; padding: 0;&amp;quot;&lt;br /&gt;
|+How the renderer will treat each color value in a texture image channel&lt;br /&gt;
|-&lt;br /&gt;
!Parameter&lt;br /&gt;
!Red&lt;br /&gt;
!Green&lt;br /&gt;
!Blue&lt;br /&gt;
!Alpha&lt;br /&gt;
|+&lt;br /&gt;
!Diffuse Map&lt;br /&gt;
|Red&lt;br /&gt;
|Green&lt;br /&gt;
|Blue&lt;br /&gt;
|&#039;&#039;selectable&#039;&#039;&lt;br /&gt;
see [[#Alpha Mode|Alpha Mode]]&lt;br /&gt;
|+&lt;br /&gt;
!Normal Map&lt;br /&gt;
|Normal X Axis&lt;br /&gt;
|Normal Y Axis&lt;br /&gt;
|Normal Z Axis&lt;br /&gt;
|Specular exponent&lt;br /&gt;
|+&lt;br /&gt;
!Specular Map&lt;br /&gt;
|Red&lt;br /&gt;
|Green&lt;br /&gt;
|Blue&lt;br /&gt;
|Environment intensity&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==Additional Parameters==&lt;br /&gt;
&lt;br /&gt;
;Alpha Mode&lt;br /&gt;
:This controls the interpretation of the Alpha channel data in the Diffuse Map.  It can have one of four values:&lt;br /&gt;
:;None:Alpha channel data is not used&lt;br /&gt;
:;Transparency (blended):The value is a degree of transparency (255 = opaque, 0 = fully transparent)&lt;br /&gt;
:;Alpha Mask (cutoff):The value (0...255) is compared to the Alpha Cutoff parameter (below); if the pixel is greater than the cutoff, it is fully opaque; if not, it is fully transparent.&lt;br /&gt;
:;Emissive:The value is used to encode how brightly the pixel appears in the absence of light (ambiance): 0 = no additional ambiance (default); 255 = full brightness&lt;br /&gt;
:&#039;&#039;Note that using any alpha mode other than Transparency may cause problems when rendered with viewers that do not yet support materials because they will be rendered as blended transparency.  We expect that support for materials will be adopted quickly in most viewers, so this is acceptable.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
;Alpha Cutoff&lt;br /&gt;
:Used only when Alpha Mode is Alpha Mask (see description of that mode above)&lt;br /&gt;
&lt;br /&gt;
;Specular Light Color&lt;br /&gt;
:Tints the light reflected from the object; this value is combined with any value from the color for the pixel as specified in the Specular Map, if any.&lt;br /&gt;
&lt;br /&gt;
;Environment Intensity&lt;br /&gt;
:Modulates the intensity of the environment on the surface as a whole.  &lt;br /&gt;
&lt;br /&gt;
;Glossiness&lt;br /&gt;
:This controls the “glossiness”, or the roughness, of the reflected light on a surface.  The lower this value is, the “rougher” the light reflectance is, while the higher the value the “sharper” the light reflectance is.  When the normal map’s alpha channel is present, the specular exponent map contained in it is modulated by this parameter.&lt;/div&gt;</summary>
		<author><name>Darien Caldwell</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Mesh/Download_Weight&amp;diff=1189482</id>
		<title>Mesh/Download Weight</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Mesh/Download_Weight&amp;diff=1189482"/>
		<updated>2014-04-15T19:31:06Z</updated>

		<summary type="html">&lt;p&gt;Darien Caldwell: /* Equation */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Navbox/Mesh|tech}}&lt;br /&gt;
== Motivation ==&lt;br /&gt;
Previously used methods of [[Mesh_and_LOD#Level_Of_Detail|LOD]] enforcement and [[Mesh]] cost have proved ineffective and difficult to adhere to.  Proposed here is an algorithm for determining cost of a [[Mesh/Mesh_Asset_Format|Mesh asset]] (in terms of prim parcel cost) that correlates strongly to the actual load of streaming and displaying a [[Mesh]] in a general way, without making assumptions about triangle/vertex limits and ratios between levels of detail.  The artist need not adhere to any arbitrary restrictions with respect to what [[Mesh_and_LOD#Level_Of_Detail|LODs]] must be supplied and what the parameters of those [[Mesh_and_LOD#Level_Of_Detail|LODs]] are, but providing proper [[Mesh_and_LOD#Level_Of_Detail|LODs]] will greatly reduce the cost of an [[Object|object]] in terms of parcel limits, effectively allowing regions with efficient content to carry more content, while regions with inefficient content can carry less.  This should allow greater control from Linden Lab in terms of acceptable rendering and streaming budgets while also giving artists complete control over how they build.&lt;br /&gt;
&lt;br /&gt;
== Concept ==&lt;br /&gt;
The streaming and rendering cost of a [[Mesh]] is directly related to the number of bytes in a [[Mesh/Mesh_Asset_Format|Mesh asset]] [[Mesh_and_LOD#Level_Of_Detail|LOD]] slot, and the likelihood that a given [[Mesh_and_LOD#Level_Of_Detail|LOD]] will be downloaded and displayed can be computed based on the size of the object.  Imagine a set of 3 concentric circles centered on an object where each circle represents the transition boundary between [[Mesh_and_LOD#Level_Of_Detail|LODs]].  The streaming/rendering cost of that object can be determined by examining the size of those circles vs the number of bytes in the relevant [[Mesh_and_LOD#Level_Of_Detail|LODs]].  Uploading a high [[Mesh_and_LOD#Level_Of_Detail|LOD]] only will result in the load of the high lod being applied to the entire 256m, while uploading appropriate [[Mesh_and_LOD#Level_Of_Detail|LODs]] will result in the lion&#039;s share of 256m being applied to the lowest [[Mesh_and_LOD#Level_Of_Detail|LOD]].&lt;br /&gt;
&lt;br /&gt;
== Equation ==&lt;br /&gt;
# Compute the distance at which each [[Mesh_and_LOD#Level_Of_Detail|LOD]] is displayed&lt;br /&gt;
# Compute the area in which each [[Mesh_and_LOD#Level_Of_Detail|LOD]] is relevant&lt;br /&gt;
# Adjust for missiing [[Mesh_and_LOD#Level_Of_Detail|LODs]]&lt;br /&gt;
# Scale relative weights of each [[Mesh_and_LOD#Level_Of_Detail|LOD]] based on what percentage of the [[Region|region]] each [[Mesh_and_LOD#Level_Of_Detail|LOD]] covers.&lt;br /&gt;
# Compute cost based on relevant range and bytes in [[Mesh_and_LOD#Level_Of_Detail|LOD]]&lt;br /&gt;
&lt;br /&gt;
Traditional parametric prims have their streaming weights capped at 1.0. Sculpted prims are capped at 2.0. This only holds true as long as the Traditional prims remain under the Legacy Prim accounting system. Changing to Convex Hull Physics type, or applying Advanced Materials (Normal maps and/or Specular maps) will take Traditional prims out of Legacy prim accounting and place under the New accounting. Under New accounting their streaming cost will not be capped, and will be calculated as explained here.&amp;lt;sup&amp;gt;[[Release Notes/Second Life Server/12#12.07.31.262785|1]]&amp;lt;/sup&amp;gt;&lt;br /&gt;
=== [[Mesh_and_LOD#Level_Of_Detail|LOD]] Transition Distances ===&lt;br /&gt;
To compute the distance at which each [[Mesh_and_LOD#Level_Of_Detail|LOD]] is displayed, take the radius of the [[Object|object]]&#039;s bounding box (R) and divide by the [[Mesh_and_LOD#Level_Of_Detail|LOD]] ratios used in the viewer:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Dlowest = distance at which lowest LOD begins to be displayed.&lt;br /&gt;
Dlow    = distance at which low LOD begins to be displayed.&lt;br /&gt;
Dmid    = distance at which mid LOD begins to be displayed.&lt;br /&gt;
Dhigh   = distance at which high LOD begins to be displayed.&lt;br /&gt;
&lt;br /&gt;
Dlowest = R / 0.03&lt;br /&gt;
Dlow    = R / 0.06&lt;br /&gt;
Dmid    = R / 0.24&lt;br /&gt;
Dhigh   = 0.0&lt;br /&gt;
&lt;br /&gt;
lowest_circle = max area&lt;br /&gt;
low_circle    = PI * Dlowest ^2&lt;br /&gt;
mid_circle    = PI * Dlow ^2&lt;br /&gt;
high_circle   = PI * Dmid^2&lt;br /&gt;
&lt;br /&gt;
lowest_area = lowest_circle - low_circle&lt;br /&gt;
low_area    = low_circle - mid_circle&lt;br /&gt;
mid_area    = mid_circle - high_circle&lt;br /&gt;
high_area   = high_circle&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Relevant [[Mesh_and_LOD#Level_Of_Detail|LOD]] Ranges ===&lt;br /&gt;
The relevant range of each [[Mesh_and_LOD#Level_Of_Detail|LOD]] is the distance between which that [[Mesh_and_LOD#Level_Of_Detail|LOD]] becomes visible and the distance at which that [[Mesh_and_LOD#Level_Of_Detail|LOD]] is no longer displayed, clamped to a 256m circle.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Example:&lt;br /&gt;
For an object with a bounding box R of 10m,&lt;br /&gt;
The Dhigh LOD will be displayed while the camera is within 0m to 42m from the object&#039;s center.&lt;br /&gt;
The Dmid LOD will be displayed while the camera is within 42m to 166.67m (10/0.24) from the object&#039;s center.&lt;br /&gt;
The Dlow LOD will be displayed while the camera is within 166.67m to 333.3m from the object&#039;s center.&lt;br /&gt;
The Dlowest LOD will be displayed while the camera is further than 333.37m from the object&#039;s center.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Adjusting for missing [[Mesh_and_LOD#Level_Of_Detail|LODs]] ====&lt;br /&gt;
if any lod is missing, substitute bytes in next highest available [[Mesh_and_LOD#Level_Of_Detail|LOD]]. That is, if &amp;lt;code&amp;gt;BYTES_IN_MID&amp;lt;/code&amp;gt; is zero, substitute &amp;lt;code&amp;gt;BYTES_IN_HIGH&amp;lt;/code&amp;gt; for &amp;lt;code&amp;gt;BYTES_IN_MID&amp;lt;/code&amp;gt;, and so on.&lt;br /&gt;
&lt;br /&gt;
==== Computing Cost ====&lt;br /&gt;
At the simplest level, streaming cost is computed as:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    Streaming Cost =&lt;br /&gt;
        (   (lowest_area / total_area) * bytes_in_lowest&lt;br /&gt;
          + (low_area    / total_area) * bytes_in_low&lt;br /&gt;
          + (mid_area    / total_area) * bytes_in_mid&lt;br /&gt;
          + (high_area   / total_area) * bytes_in_high   ) * cost_scalar&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the details of the implementation, the &amp;lt;code&amp;gt;cost_scalar&amp;lt;/code&amp;gt; is based on a target triangle budget, and efforts are made to convert &amp;lt;code&amp;gt;bytes_in_foo&amp;lt;/code&amp;gt; to an estimated triangle count.&lt;br /&gt;
&lt;br /&gt;
=== Implementation ===&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
// Get the streaming cost for the given mesh&lt;br /&gt;
// header -- header of mesh as described in mesh asset format&lt;br /&gt;
// radius -- magnitude of the mesh object scale, divided by two&lt;br /&gt;
// bytes -- if not NULL, gets number of bytes in this mesh (for debugging)&lt;br /&gt;
// bytes_visible -- if not NULL, gets number of bytes in specified lod (for debugging)&lt;br /&gt;
// lod -- currently visible lod (for debugging)&lt;br /&gt;
&lt;br /&gt;
F32 LLMeshRepository::getStreamingCost(LLSD&amp;amp; header, F32 radius, S32* bytes, S32* bytes_visible, S32 lod)&lt;br /&gt;
{&lt;br /&gt;
    F32 max_distance = 512.f;&lt;br /&gt;
&lt;br /&gt;
    F32 dlowest = llmin(radius/0.03f, max_distance);&lt;br /&gt;
    F32 dlow    = llmin(radius/0.06f, max_distance);&lt;br /&gt;
    F32 dmid    = llmin(radius/0.24f, max_distance);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//  discount 128 bytes to cover the cost of LLSD tags and compression domain overhead&lt;br /&gt;
    F32 METADATA_DISCOUNT = (F32) gSavedSettings.getU32(&amp;quot;MeshMetaDataDiscount&amp;quot;);&lt;br /&gt;
//  make sure nothing is &amp;quot;free&amp;quot;&lt;br /&gt;
    F32 MINIMUM_SIZE = (F32) gSavedSettings.getU32(&amp;quot;MeshMinimumByteSize&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    F32 bytes_per_triangle = (F32) gSavedSettings.getU32(&amp;quot;MeshBytesPerTriangle&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    S32 bytes_lowest = header[&amp;quot;lowest_lod&amp;quot;][&amp;quot;size&amp;quot;].asInteger();&lt;br /&gt;
    S32 bytes_low    = header[&amp;quot;low_lod&amp;quot;][&amp;quot;size&amp;quot;].asInteger();&lt;br /&gt;
    S32 bytes_mid    = header[&amp;quot;medium_lod&amp;quot;][&amp;quot;size&amp;quot;].asInteger();&lt;br /&gt;
    S32 bytes_high   = header[&amp;quot;high_lod&amp;quot;][&amp;quot;size&amp;quot;].asInteger();&lt;br /&gt;
&lt;br /&gt;
    if (bytes_high == 0)&lt;br /&gt;
    {&lt;br /&gt;
        return 0.f;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (bytes_mid == 0)&lt;br /&gt;
    {&lt;br /&gt;
        bytes_mid = bytes_high;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (bytes_low == 0)&lt;br /&gt;
    {&lt;br /&gt;
        bytes_low = bytes_mid;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (bytes_lowest == 0)&lt;br /&gt;
    {&lt;br /&gt;
        bytes_lowest = bytes_low;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    F32 triangles_lowest = llmax((F32) bytes_lowest-METADATA_DISCOUNT, MINIMUM_SIZE)/bytes_per_triangle;&lt;br /&gt;
    F32 triangles_low    = llmax((F32) bytes_low-METADATA_DISCOUNT, MINIMUM_SIZE)/bytes_per_triangle;&lt;br /&gt;
    F32 triangles_mid    = llmax((F32) bytes_mid-METADATA_DISCOUNT, MINIMUM_SIZE)/bytes_per_triangle;&lt;br /&gt;
    F32 triangles_high   = llmax((F32) bytes_high-METADATA_DISCOUNT, MINIMUM_SIZE)/bytes_per_triangle;&lt;br /&gt;
&lt;br /&gt;
    if (bytes)&lt;br /&gt;
    {&lt;br /&gt;
        *bytes = 0;&lt;br /&gt;
        *bytes += header[&amp;quot;lowest_lod&amp;quot;][&amp;quot;size&amp;quot;].asInteger();&lt;br /&gt;
        *bytes += header[&amp;quot;low_lod&amp;quot;][&amp;quot;size&amp;quot;].asInteger();&lt;br /&gt;
        *bytes += header[&amp;quot;medium_lod&amp;quot;][&amp;quot;size&amp;quot;].asInteger();&lt;br /&gt;
        *bytes += header[&amp;quot;high_lod&amp;quot;][&amp;quot;size&amp;quot;].asInteger();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (bytes_visible)&lt;br /&gt;
    {&lt;br /&gt;
        lod = LLMeshRepository::getActualMeshLOD(header, lod);&lt;br /&gt;
        if (lod &amp;gt;= 0 &amp;amp;&amp;amp; lod &amp;lt;= 3)&lt;br /&gt;
        {&lt;br /&gt;
            *bytes_visible = header[header_lod[lod]][&amp;quot;size&amp;quot;].asInteger();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    F32 max_area = 102932.f; //area of circle that encompasses region&lt;br /&gt;
    F32 min_area = 1.f;&lt;br /&gt;
&lt;br /&gt;
    F32 high_area   = llmin(F_PI*dmid*dmid, max_area);&lt;br /&gt;
    F32 mid_area    = llmin(F_PI*dlow*dlow, max_area);&lt;br /&gt;
    F32 low_area    = llmin(F_PI*dlowest*dlowest, max_area);&lt;br /&gt;
    F32 lowest_area = max_area;&lt;br /&gt;
&lt;br /&gt;
    lowest_area -= low_area;&lt;br /&gt;
    low_area    -= mid_area;&lt;br /&gt;
    mid_area    -= high_area;&lt;br /&gt;
&lt;br /&gt;
    high_area   = llclamp(high_area, min_area, max_area);&lt;br /&gt;
    mid_area    = llclamp(mid_area, min_area, max_area);&lt;br /&gt;
    low_area    = llclamp(low_area, min_area, max_area);&lt;br /&gt;
    lowest_area = llclamp(lowest_area, min_area, max_area);&lt;br /&gt;
&lt;br /&gt;
    F32 total_area = high_area + mid_area + low_area + lowest_area;&lt;br /&gt;
    high_area   /= total_area;&lt;br /&gt;
    mid_area    /= total_area;&lt;br /&gt;
    low_area    /= total_area;&lt;br /&gt;
    lowest_area /= total_area;&lt;br /&gt;
&lt;br /&gt;
    F32 weighted_avg = triangles_high*high_area +&lt;br /&gt;
                       triangles_mid*mid_area +&lt;br /&gt;
                       triangles_low*low_area +&lt;br /&gt;
                      triangles_lowest*lowest_area;&lt;br /&gt;
&lt;br /&gt;
    return weighted_avg/gSavedSettings.getU32(&amp;quot;MeshTriangleBudget&amp;quot;)*15000.f;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Issues ==&lt;br /&gt;
* Providing identical models for every [[Mesh_and_LOD#Level_Of_Detail|LOD]] results in a cost identical to providing a single [[Mesh_and_LOD#Level_Of_Detail|LOD]], but results in 4x the bandwidth usage.&lt;br /&gt;
* Changing the scale of an object changes its cost, which can be confusing.&lt;br /&gt;
* For viewers with a view distance greater than 256m, the clamping to 256m is unrealistic.&lt;br /&gt;
* Some validating of [[Mesh_and_LOD#Level_Of_Detail|LODs]] is still necessary.&lt;br /&gt;
** The highest [[Mesh_and_LOD#Level_Of_Detail|LOD]] must be specified.&lt;br /&gt;
** Each [[Mesh_and_LOD#Level_Of_Detail|LOD]] must have the same number of faces as the highest [[Mesh_and_LOD#Level_Of_Detail|LOD]].&lt;br /&gt;
&lt;br /&gt;
== Related Articles ==&lt;br /&gt;
* [[Mesh Accounting Test]]&lt;br /&gt;
* [[Mesh/Mesh physics|Mesh physics]]&lt;/div&gt;</summary>
		<author><name>Darien Caldwell</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Mesh/Download_Weight&amp;diff=1189481</id>
		<title>Mesh/Download Weight</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Mesh/Download_Weight&amp;diff=1189481"/>
		<updated>2014-04-15T19:30:00Z</updated>

		<summary type="html">&lt;p&gt;Darien Caldwell: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Navbox/Mesh|tech}}&lt;br /&gt;
== Motivation ==&lt;br /&gt;
Previously used methods of [[Mesh_and_LOD#Level_Of_Detail|LOD]] enforcement and [[Mesh]] cost have proved ineffective and difficult to adhere to.  Proposed here is an algorithm for determining cost of a [[Mesh/Mesh_Asset_Format|Mesh asset]] (in terms of prim parcel cost) that correlates strongly to the actual load of streaming and displaying a [[Mesh]] in a general way, without making assumptions about triangle/vertex limits and ratios between levels of detail.  The artist need not adhere to any arbitrary restrictions with respect to what [[Mesh_and_LOD#Level_Of_Detail|LODs]] must be supplied and what the parameters of those [[Mesh_and_LOD#Level_Of_Detail|LODs]] are, but providing proper [[Mesh_and_LOD#Level_Of_Detail|LODs]] will greatly reduce the cost of an [[Object|object]] in terms of parcel limits, effectively allowing regions with efficient content to carry more content, while regions with inefficient content can carry less.  This should allow greater control from Linden Lab in terms of acceptable rendering and streaming budgets while also giving artists complete control over how they build.&lt;br /&gt;
&lt;br /&gt;
== Concept ==&lt;br /&gt;
The streaming and rendering cost of a [[Mesh]] is directly related to the number of bytes in a [[Mesh/Mesh_Asset_Format|Mesh asset]] [[Mesh_and_LOD#Level_Of_Detail|LOD]] slot, and the likelihood that a given [[Mesh_and_LOD#Level_Of_Detail|LOD]] will be downloaded and displayed can be computed based on the size of the object.  Imagine a set of 3 concentric circles centered on an object where each circle represents the transition boundary between [[Mesh_and_LOD#Level_Of_Detail|LODs]].  The streaming/rendering cost of that object can be determined by examining the size of those circles vs the number of bytes in the relevant [[Mesh_and_LOD#Level_Of_Detail|LODs]].  Uploading a high [[Mesh_and_LOD#Level_Of_Detail|LOD]] only will result in the load of the high lod being applied to the entire 256m, while uploading appropriate [[Mesh_and_LOD#Level_Of_Detail|LODs]] will result in the lion&#039;s share of 256m being applied to the lowest [[Mesh_and_LOD#Level_Of_Detail|LOD]].&lt;br /&gt;
&lt;br /&gt;
== Equation ==&lt;br /&gt;
# Compute the distance at which each [[Mesh_and_LOD#Level_Of_Detail|LOD]] is displayed&lt;br /&gt;
# Compute the area in which each [[Mesh_and_LOD#Level_Of_Detail|LOD]] is relevant&lt;br /&gt;
# Adjust for missiing [[Mesh_and_LOD#Level_Of_Detail|LODs]]&lt;br /&gt;
# Scale relative weights of each [[Mesh_and_LOD#Level_Of_Detail|LOD]] based on what percentage of the [[Region|region]] each [[Mesh_and_LOD#Level_Of_Detail|LOD]] covers.&lt;br /&gt;
# Compute cost based on relevant range and bytes in [[Mesh_and_LOD#Level_Of_Detail|LOD]]&lt;br /&gt;
&lt;br /&gt;
Traditional parametric prims have their streaming weights capped at 1.0. Sculpted prims are capped at 2.0. This only holds true as long as the Traditional prims remain under the Legacy Prim accounting system. Changing to Convex Hull Physics type, or applying Advanced Materials (Normal maps and/or Specular maps) will take Traditional prims out of Legacy prim accounting and place under the New accounting. Under New accounting their streaming cost will not be capped. &amp;lt;sup&amp;gt;[[Release Notes/Second Life Server/12#12.07.31.262785|1]]&amp;lt;/sup&amp;gt;&lt;br /&gt;
=== [[Mesh_and_LOD#Level_Of_Detail|LOD]] Transition Distances ===&lt;br /&gt;
To compute the distance at which each [[Mesh_and_LOD#Level_Of_Detail|LOD]] is displayed, take the radius of the [[Object|object]]&#039;s bounding box (R) and divide by the [[Mesh_and_LOD#Level_Of_Detail|LOD]] ratios used in the viewer:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Dlowest = distance at which lowest LOD begins to be displayed.&lt;br /&gt;
Dlow    = distance at which low LOD begins to be displayed.&lt;br /&gt;
Dmid    = distance at which mid LOD begins to be displayed.&lt;br /&gt;
Dhigh   = distance at which high LOD begins to be displayed.&lt;br /&gt;
&lt;br /&gt;
Dlowest = R / 0.03&lt;br /&gt;
Dlow    = R / 0.06&lt;br /&gt;
Dmid    = R / 0.24&lt;br /&gt;
Dhigh   = 0.0&lt;br /&gt;
&lt;br /&gt;
lowest_circle = max area&lt;br /&gt;
low_circle    = PI * Dlowest ^2&lt;br /&gt;
mid_circle    = PI * Dlow ^2&lt;br /&gt;
high_circle   = PI * Dmid^2&lt;br /&gt;
&lt;br /&gt;
lowest_area = lowest_circle - low_circle&lt;br /&gt;
low_area    = low_circle - mid_circle&lt;br /&gt;
mid_area    = mid_circle - high_circle&lt;br /&gt;
high_area   = high_circle&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Relevant [[Mesh_and_LOD#Level_Of_Detail|LOD]] Ranges ===&lt;br /&gt;
The relevant range of each [[Mesh_and_LOD#Level_Of_Detail|LOD]] is the distance between which that [[Mesh_and_LOD#Level_Of_Detail|LOD]] becomes visible and the distance at which that [[Mesh_and_LOD#Level_Of_Detail|LOD]] is no longer displayed, clamped to a 256m circle.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
Example:&lt;br /&gt;
For an object with a bounding box R of 10m,&lt;br /&gt;
The Dhigh LOD will be displayed while the camera is within 0m to 42m from the object&#039;s center.&lt;br /&gt;
The Dmid LOD will be displayed while the camera is within 42m to 166.67m (10/0.24) from the object&#039;s center.&lt;br /&gt;
The Dlow LOD will be displayed while the camera is within 166.67m to 333.3m from the object&#039;s center.&lt;br /&gt;
The Dlowest LOD will be displayed while the camera is further than 333.37m from the object&#039;s center.&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
==== Adjusting for missing [[Mesh_and_LOD#Level_Of_Detail|LODs]] ====&lt;br /&gt;
if any lod is missing, substitute bytes in next highest available [[Mesh_and_LOD#Level_Of_Detail|LOD]]. That is, if &amp;lt;code&amp;gt;BYTES_IN_MID&amp;lt;/code&amp;gt; is zero, substitute &amp;lt;code&amp;gt;BYTES_IN_HIGH&amp;lt;/code&amp;gt; for &amp;lt;code&amp;gt;BYTES_IN_MID&amp;lt;/code&amp;gt;, and so on.&lt;br /&gt;
&lt;br /&gt;
==== Computing Cost ====&lt;br /&gt;
At the simplest level, streaming cost is computed as:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;pre&amp;gt;&lt;br /&gt;
    Streaming Cost =&lt;br /&gt;
        (   (lowest_area / total_area) * bytes_in_lowest&lt;br /&gt;
          + (low_area    / total_area) * bytes_in_low&lt;br /&gt;
          + (mid_area    / total_area) * bytes_in_mid&lt;br /&gt;
          + (high_area   / total_area) * bytes_in_high   ) * cost_scalar&lt;br /&gt;
&amp;lt;/pre&amp;gt;&lt;br /&gt;
&lt;br /&gt;
In the details of the implementation, the &amp;lt;code&amp;gt;cost_scalar&amp;lt;/code&amp;gt; is based on a target triangle budget, and efforts are made to convert &amp;lt;code&amp;gt;bytes_in_foo&amp;lt;/code&amp;gt; to an estimated triangle count.&lt;br /&gt;
&lt;br /&gt;
=== Implementation ===&lt;br /&gt;
&amp;lt;cpp&amp;gt;&lt;br /&gt;
// Get the streaming cost for the given mesh&lt;br /&gt;
// header -- header of mesh as described in mesh asset format&lt;br /&gt;
// radius -- magnitude of the mesh object scale, divided by two&lt;br /&gt;
// bytes -- if not NULL, gets number of bytes in this mesh (for debugging)&lt;br /&gt;
// bytes_visible -- if not NULL, gets number of bytes in specified lod (for debugging)&lt;br /&gt;
// lod -- currently visible lod (for debugging)&lt;br /&gt;
&lt;br /&gt;
F32 LLMeshRepository::getStreamingCost(LLSD&amp;amp; header, F32 radius, S32* bytes, S32* bytes_visible, S32 lod)&lt;br /&gt;
{&lt;br /&gt;
    F32 max_distance = 512.f;&lt;br /&gt;
&lt;br /&gt;
    F32 dlowest = llmin(radius/0.03f, max_distance);&lt;br /&gt;
    F32 dlow    = llmin(radius/0.06f, max_distance);&lt;br /&gt;
    F32 dmid    = llmin(radius/0.24f, max_distance);&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
//  discount 128 bytes to cover the cost of LLSD tags and compression domain overhead&lt;br /&gt;
    F32 METADATA_DISCOUNT = (F32) gSavedSettings.getU32(&amp;quot;MeshMetaDataDiscount&amp;quot;);&lt;br /&gt;
//  make sure nothing is &amp;quot;free&amp;quot;&lt;br /&gt;
    F32 MINIMUM_SIZE = (F32) gSavedSettings.getU32(&amp;quot;MeshMinimumByteSize&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    F32 bytes_per_triangle = (F32) gSavedSettings.getU32(&amp;quot;MeshBytesPerTriangle&amp;quot;);&lt;br /&gt;
&lt;br /&gt;
    S32 bytes_lowest = header[&amp;quot;lowest_lod&amp;quot;][&amp;quot;size&amp;quot;].asInteger();&lt;br /&gt;
    S32 bytes_low    = header[&amp;quot;low_lod&amp;quot;][&amp;quot;size&amp;quot;].asInteger();&lt;br /&gt;
    S32 bytes_mid    = header[&amp;quot;medium_lod&amp;quot;][&amp;quot;size&amp;quot;].asInteger();&lt;br /&gt;
    S32 bytes_high   = header[&amp;quot;high_lod&amp;quot;][&amp;quot;size&amp;quot;].asInteger();&lt;br /&gt;
&lt;br /&gt;
    if (bytes_high == 0)&lt;br /&gt;
    {&lt;br /&gt;
        return 0.f;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (bytes_mid == 0)&lt;br /&gt;
    {&lt;br /&gt;
        bytes_mid = bytes_high;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (bytes_low == 0)&lt;br /&gt;
    {&lt;br /&gt;
        bytes_low = bytes_mid;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (bytes_lowest == 0)&lt;br /&gt;
    {&lt;br /&gt;
        bytes_lowest = bytes_low;&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    F32 triangles_lowest = llmax((F32) bytes_lowest-METADATA_DISCOUNT, MINIMUM_SIZE)/bytes_per_triangle;&lt;br /&gt;
    F32 triangles_low    = llmax((F32) bytes_low-METADATA_DISCOUNT, MINIMUM_SIZE)/bytes_per_triangle;&lt;br /&gt;
    F32 triangles_mid    = llmax((F32) bytes_mid-METADATA_DISCOUNT, MINIMUM_SIZE)/bytes_per_triangle;&lt;br /&gt;
    F32 triangles_high   = llmax((F32) bytes_high-METADATA_DISCOUNT, MINIMUM_SIZE)/bytes_per_triangle;&lt;br /&gt;
&lt;br /&gt;
    if (bytes)&lt;br /&gt;
    {&lt;br /&gt;
        *bytes = 0;&lt;br /&gt;
        *bytes += header[&amp;quot;lowest_lod&amp;quot;][&amp;quot;size&amp;quot;].asInteger();&lt;br /&gt;
        *bytes += header[&amp;quot;low_lod&amp;quot;][&amp;quot;size&amp;quot;].asInteger();&lt;br /&gt;
        *bytes += header[&amp;quot;medium_lod&amp;quot;][&amp;quot;size&amp;quot;].asInteger();&lt;br /&gt;
        *bytes += header[&amp;quot;high_lod&amp;quot;][&amp;quot;size&amp;quot;].asInteger();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    if (bytes_visible)&lt;br /&gt;
    {&lt;br /&gt;
        lod = LLMeshRepository::getActualMeshLOD(header, lod);&lt;br /&gt;
        if (lod &amp;gt;= 0 &amp;amp;&amp;amp; lod &amp;lt;= 3)&lt;br /&gt;
        {&lt;br /&gt;
            *bytes_visible = header[header_lod[lod]][&amp;quot;size&amp;quot;].asInteger();&lt;br /&gt;
        }&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    F32 max_area = 102932.f; //area of circle that encompasses region&lt;br /&gt;
    F32 min_area = 1.f;&lt;br /&gt;
&lt;br /&gt;
    F32 high_area   = llmin(F_PI*dmid*dmid, max_area);&lt;br /&gt;
    F32 mid_area    = llmin(F_PI*dlow*dlow, max_area);&lt;br /&gt;
    F32 low_area    = llmin(F_PI*dlowest*dlowest, max_area);&lt;br /&gt;
    F32 lowest_area = max_area;&lt;br /&gt;
&lt;br /&gt;
    lowest_area -= low_area;&lt;br /&gt;
    low_area    -= mid_area;&lt;br /&gt;
    mid_area    -= high_area;&lt;br /&gt;
&lt;br /&gt;
    high_area   = llclamp(high_area, min_area, max_area);&lt;br /&gt;
    mid_area    = llclamp(mid_area, min_area, max_area);&lt;br /&gt;
    low_area    = llclamp(low_area, min_area, max_area);&lt;br /&gt;
    lowest_area = llclamp(lowest_area, min_area, max_area);&lt;br /&gt;
&lt;br /&gt;
    F32 total_area = high_area + mid_area + low_area + lowest_area;&lt;br /&gt;
    high_area   /= total_area;&lt;br /&gt;
    mid_area    /= total_area;&lt;br /&gt;
    low_area    /= total_area;&lt;br /&gt;
    lowest_area /= total_area;&lt;br /&gt;
&lt;br /&gt;
    F32 weighted_avg = triangles_high*high_area +&lt;br /&gt;
                       triangles_mid*mid_area +&lt;br /&gt;
                       triangles_low*low_area +&lt;br /&gt;
                      triangles_lowest*lowest_area;&lt;br /&gt;
&lt;br /&gt;
    return weighted_avg/gSavedSettings.getU32(&amp;quot;MeshTriangleBudget&amp;quot;)*15000.f;&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/cpp&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Issues ==&lt;br /&gt;
* Providing identical models for every [[Mesh_and_LOD#Level_Of_Detail|LOD]] results in a cost identical to providing a single [[Mesh_and_LOD#Level_Of_Detail|LOD]], but results in 4x the bandwidth usage.&lt;br /&gt;
* Changing the scale of an object changes its cost, which can be confusing.&lt;br /&gt;
* For viewers with a view distance greater than 256m, the clamping to 256m is unrealistic.&lt;br /&gt;
* Some validating of [[Mesh_and_LOD#Level_Of_Detail|LODs]] is still necessary.&lt;br /&gt;
** The highest [[Mesh_and_LOD#Level_Of_Detail|LOD]] must be specified.&lt;br /&gt;
** Each [[Mesh_and_LOD#Level_Of_Detail|LOD]] must have the same number of faces as the highest [[Mesh_and_LOD#Level_Of_Detail|LOD]].&lt;br /&gt;
&lt;br /&gt;
== Related Articles ==&lt;br /&gt;
* [[Mesh Accounting Test]]&lt;br /&gt;
* [[Mesh/Mesh physics|Mesh physics]]&lt;/div&gt;</summary>
		<author><name>Darien Caldwell</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlDialog&amp;diff=1188373</id>
		<title>LlDialog</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlDialog&amp;diff=1188373"/>
		<updated>2014-03-14T19:08:13Z</updated>

		<summary type="html">&lt;p&gt;Darien Caldwell: clarified language.&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;
{{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 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;
----&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;lsl&amp;gt;llDialog(avatar_key,&amp;quot; \n&amp;quot;,button_list,dialog_channel);&amp;lt;/lsl&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 8 lines of {{LSLP|message}}. If it is longer, the dialog has a scroll bar. See [[#Appearance]].&lt;br /&gt;
Note: this should be 7 lines in message; one of the 8 lines is the owner and name of the object.&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;
*If a button is named &amp;lt;code&amp;gt;[&amp;quot;Ignore&amp;quot;]&amp;lt;/code&amp;gt;, it will behave like the small &amp;lt;code&amp;gt;[&amp;quot;Ignore&amp;quot;]&amp;lt;/code&amp;gt; button of the menu (i.e. pressing it will &#039;&#039;&#039;not&#039;&#039;&#039; get &amp;lt;code&amp;gt;[&amp;quot;Ignore&amp;quot;]&amp;lt;/code&amp;gt; sent to the menu channel). If you need an &amp;lt;code&amp;gt;[&amp;quot;Ignore&amp;quot;]&amp;lt;/code&amp;gt; button in your menu and wish to have its name sent back to the script when you press it, then use 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;
***This snippet can be used to truncate the string without giving an error: &amp;lt;code&amp;gt;[[llBase64ToString]]([[llGetSubString]]([[llStringToBase64]](theString), 0, 31))&amp;lt;/code&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, in button 0, will cause [[llDialog]] to behave as [[llTextBox]] instead.&lt;br /&gt;
|examples=&lt;br /&gt;
&amp;lt;lsl&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;/lsl&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;lsl&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;/lsl&amp;gt;&lt;br /&gt;
|helpers=&amp;lt;lsl&amp;gt;//Compact function to put buttons in &amp;quot;correct&amp;quot; human-readable order&lt;br /&gt;
integer channel;&lt;br /&gt;
&lt;br /&gt;
list order_buttons(list buttons)&lt;br /&gt;
{&lt;br /&gt;
    return llList2List(buttons, -3, -1) + llList2List(buttons, -6, -4)&lt;br /&gt;
         + llList2List(buttons, -9, -7) + llList2List(buttons, -12, -10);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {   // Create random channel within range [-1000000000,-2000000000]&lt;br /&gt;
	channel = (integer)(llFrand(-1000000000.0) - 1000000000.0);&lt;br /&gt;
&lt;br /&gt;
	llListen(channel,&amp;quot;&amp;quot;, &amp;quot;&amp;quot;,&amp;quot;&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
	&lt;br /&gt;
    touch_start(integer total_number)&lt;br /&gt;
    {&lt;br /&gt;
        llDialog(llDetectedKey(0),&amp;quot;\nPlease choose an option:\n&amp;quot;,&lt;br /&gt;
	    order_buttons([&amp;quot;1&amp;quot;, &amp;quot;2&amp;quot;, &amp;quot;3&amp;quot;, &amp;quot;4&amp;quot;, &amp;quot;5&amp;quot;, &amp;quot;6&amp;quot;, &amp;quot;7&amp;quot;, &amp;quot;8&amp;quot;, &amp;quot;9&amp;quot;, &amp;quot;10&amp;quot;]),channel);&lt;br /&gt;
    }&lt;br /&gt;
	&lt;br /&gt;
    listen(integer _chan, string _name, key _id, string _option)&lt;br /&gt;
    {&lt;br /&gt;
        llSay(0, _name + &amp;quot; selected option &amp;quot; + _option);&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&amp;lt;lsl&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;/lsl&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;lsl&amp;gt;// Create random channel within range [-1000000000,-2000000000]&lt;br /&gt;
integer channel = (integer)(llFrand(-1000000000.0) - 1000000000.0);&lt;br /&gt;
&lt;br /&gt;
llDialog(llDetectedKey(0), &amp;quot;Please choose one of the below options:&amp;quot;,&lt;br /&gt;
    [&amp;quot;Yes&amp;quot;, &amp;quot;No&amp;quot;, &amp;quot;0&amp;quot;, &amp;quot;1&amp;quot;], channel);&amp;lt;/lsl&amp;gt;&lt;br /&gt;
Negative channels are popular for script communications because the standard SL client is unable to chat directly on those channels. The only way to do so prior to [[llTextBox]] was to use [[llDialog]] which was limited to 24 bytes. (Several third party viewers can access them from the chat bar.)&lt;br /&gt;
&lt;br /&gt;
You can be reasonably confident that all of your scripted objects have a unique chat channel with this small function:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;integer dialog_channel; // top of script in variables&lt;br /&gt;
&lt;br /&gt;
integer channel() { // top of script in functions&lt;br /&gt;
    return (integer)(&amp;quot;0x&amp;quot;+llGetSubString((string)llGetKey(),-8,-1));&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
dialog_channel = channel(); // somewhere in actual script execution, such as state_entry()&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#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;lsl&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;/lsl&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;lsl&amp;gt;privchan = ((integer)(&amp;quot;0x&amp;quot;+llGetSubString((string)llGetKey(),-8,-1)) &amp;amp; 0x3FFFFFFF) ^ 0xBFFFFFFF;&amp;lt;/lsl&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;/div&gt;</summary>
		<author><name>Darien Caldwell</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User_talk:Omei_Qunhua&amp;diff=1187567</id>
		<title>User talk:Omei Qunhua</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User_talk:Omei_Qunhua&amp;diff=1187567"/>
		<updated>2014-02-05T21:30:31Z</updated>

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

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

		<summary type="html">&lt;p&gt;Darien Caldwell: Undo revision 1187387 by Darien Caldwell (Talk) Was correct to begin with.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function&lt;br /&gt;
|func_id=???|func_sleep=0.0|func_energy=???&lt;br /&gt;
|func=llSetMemoryLimit&lt;br /&gt;
|p1_type=integer|p1_name=limit&lt;br /&gt;
|return_type=integer|return_subtype=boolean&lt;br /&gt;
|func_desc=Request {{LSLP|limit}} bytes to be reserved for this script.&lt;br /&gt;
|Return_text=[[TRUE]] if the memory limit was successfully set (or [[FALSE]] if not).&lt;br /&gt;
|func_footer&lt;br /&gt;
|spec=&lt;br /&gt;
This function&#039;s behavior is dependent upon the VM the script is using. [[#Mono|Mono]] is the new VM, [[#LSO|LSO]] is the old VM.&lt;br /&gt;
&lt;br /&gt;
;Mono:Sets the memory limit for the script.&lt;br /&gt;
* The memory limit can be set up to 64k.&lt;br /&gt;
* The memory limit can not be set lower than the memory currently in use by the script.&lt;br /&gt;
* All new scripts start with a limit of 64k&lt;br /&gt;
* All existing scripts have a limit of 64k&lt;br /&gt;
* A lower limit will effect the amount of memory reported in the viewer UI and by [[llGetObjectDetails]].&lt;br /&gt;
* The memory limit is not the amount of real memory actually used by the script, just the upper limit on it.&lt;br /&gt;
&lt;br /&gt;
;LSO:Has no effect on LSO scripts which will always use exactly 16k&lt;br /&gt;
|caveats=&lt;br /&gt;
;Mono:When &#039;&#039;&#039;&#039;&#039;n&#039;&#039;&#039;&#039;&#039; is too small, llSetMemoryLimit(&#039;&#039;&#039;&#039;&#039;n&#039;&#039;&#039;&#039;&#039;) is ignored and the memory limit is not changed&lt;br /&gt;
|examples=&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
// Memory-walkthrough by Daemonika Nightfire (daemonika.nightfire)&lt;br /&gt;
&lt;br /&gt;
integer limit = 20000; // &amp;lt;- bytes&lt;br /&gt;
&lt;br /&gt;
Test()&lt;br /&gt;
{&lt;br /&gt;
    llSetText(&amp;quot;Limited Memory &amp;quot; + (string)llGetMemoryLimit() +&lt;br /&gt;
              &amp;quot;\nUsed Memory &amp;quot; + (string)llGetUsedMemory() +&lt;br /&gt;
              &amp;quot;\nFree Memory &amp;quot; + (string)llGetFreeMemory(),&amp;lt;1,1,1&amp;gt;,1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSetMemoryLimit(limit);&lt;br /&gt;
        &lt;br /&gt;
        llScriptProfiler(PROFILE_SCRIPT_MEMORY);&lt;br /&gt;
        Test();&lt;br /&gt;
        llScriptProfiler(PROFILE_NONE);&lt;br /&gt;
        &lt;br /&gt;
        llSay(0,&amp;quot;This script used at most &amp;quot; + (string)llGetSPMaxMemory() + &amp;quot; bytes of memory during Test.&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Result:&lt;br /&gt;
        &lt;br /&gt;
// Floating Text:&lt;br /&gt;
// Limited Memory 20000&lt;br /&gt;
// Used Memory 4972&lt;br /&gt;
// Free Memory 15100&lt;br /&gt;
        &lt;br /&gt;
// Chat:&lt;br /&gt;
// [05:11] Object: This script used at most 4972 bytes of memory during Test.&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
|helpers&lt;br /&gt;
|also_functions=&lt;br /&gt;
{{LSL DefineRow||[[llScriptProfiler]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llGetSPMaxMemory]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llGetMemoryLimit]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llGetFreeMemory]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llGetUsedMemory]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llGetObjectDetails]]|}}&lt;br /&gt;
|also_events&lt;br /&gt;
|also_tests&lt;br /&gt;
|also_articles&lt;br /&gt;
|notes&lt;br /&gt;
|history=*Scheduled for [[Beta/Magnum|RC Magnum]] channel, week of August 3, 2011.&lt;br /&gt;
|lso&lt;br /&gt;
|cat1=Script&lt;br /&gt;
|cat2=Memory&lt;br /&gt;
|cat3=Script Profiler&lt;br /&gt;
|cat4&lt;br /&gt;
|history = Date of Release  [[ Release_Notes/Second_Life_Server/11#11.08.10.238207 | 10/08/2011 ]]&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Darien Caldwell</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlGetObjectDetails&amp;diff=1187390</id>
		<title>LlGetObjectDetails</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlGetObjectDetails&amp;diff=1187390"/>
		<updated>2014-01-31T04:23:56Z</updated>

		<summary type="html">&lt;p&gt;Darien Caldwell: Fixed the fix (oops)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function&lt;br /&gt;
|inject-2=&lt;br /&gt;
{{LSL_Function/limits}}{{LSL_Function/uuid|id|sim=*}}&lt;br /&gt;
{{Issues/SCR-87}}{{Issues/SVC-7592}}&lt;br /&gt;
|func_id=332|func_sleep=0.0|func_energy=10.0&lt;br /&gt;
|func=llGetObjectDetails&lt;br /&gt;
|p1_type=key|p1_name=id|p1_desc=&amp;amp;#32;or adjacent regions[[#id_Parameter|*]]&lt;br /&gt;
|p2_type=list|p2_name=params|p2_desc=OBJECT_* flags&lt;br /&gt;
|return_type=list|return_text=of the details for &#039;&#039;&#039;id&#039;&#039;&#039;, specifically those requested in &#039;&#039;&#039;params&#039;&#039;&#039;. &lt;br /&gt;
|func_footnote=An empty list if &#039;&#039;&#039;id&#039;&#039;&#039; is not found.{{PBR}}&lt;br /&gt;
{{LSL Const|OBJECT_UNKNOWN_DETAIL|integer|-1|c=}} is returned when passed an invalid integer parameter.&lt;br /&gt;
|spec=&amp;lt;div style=&amp;quot;padding: 1px; float: left;&amp;quot;&amp;gt;[[Image:LlGetObjectdetails-avatar-range.png|thumb|none|250px|Avatar detection range for SL Server 1.34]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;h5 style=&amp;quot;margin:0;&amp;quot;&amp;gt;id Parameter&amp;lt;/h5&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;id&#039;&#039;&#039; holds the UUID of the avatar or prim this function is going to get the details of.&lt;br /&gt;
&lt;br /&gt;
If &#039;&#039;&#039;id&#039;&#039;&#039; is not found in the region, adjacent regions are searched for avatars which match &#039;&#039;&#039;id&#039;&#039;&#039;. An avatar is only considered to have been found if it is inside the region, or within a 34 meter zone outside the region boundaries (see diagram). A single valid result may be returned after the avatar leaves this zone.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h5 style=&amp;quot;margin:0;&amp;quot;&amp;gt;params Parameter&amp;lt;/h5&amp;gt;&lt;br /&gt;
The &#039;&#039;&#039;params&#039;&#039;&#039; list is used to indicate which object attributes of interest. The order they are supplied in determines the order of the corresponding return values in the return list.&lt;br /&gt;
{{{!}} cellpadding=&amp;quot;0&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
{{!}}&lt;br /&gt;
*If &#039;&#039;&#039;params&#039;&#039;&#039; contains unsupported integer values, {{LSL Const|OBJECT_UNKNOWN_DETAIL|integer|-1|c=}} is placed in the output list.&lt;br /&gt;
*If &#039;&#039;&#039;params&#039;&#039;&#039; contains non-[[integer]] types, those values will be silently ignored.&lt;br /&gt;
{{!}}}&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
|caveats=&lt;br /&gt;
&lt;br /&gt;
*OBJECT_ROT will return an accurate facing for Avatars seated or in mouselook, but only a rough direction otherwise.&lt;br /&gt;
*Adjacent regions are not searched for prims which match &#039;&#039;&#039;id&#039;&#039;&#039;.&lt;br /&gt;
*Information for avatars that can no longer be found will still be available for a short period (about 45 seconds) but it is not updated.&lt;br /&gt;
*Items in &#039;&#039;&#039;params&#039;&#039;&#039; that are not integers are silently ignored, {{LSL Const|OBJECT_UNKNOWN_DETAIL|integer|-1|c=}} is not returned.&lt;br /&gt;
*This function does not return information about items in inventory.&lt;br /&gt;
*[[llTargetOmega]] will only effect the return of [[OBJECT_ROT]] if the object is [[STATUS_PHYSICS|physical]]. If the object is not physical then the original start rotation is returned, [[llTargetOmega]] is a {{LSLGC|Effects|client side effect}}.&lt;br /&gt;
*{{LSL Const|OBJECT_SCRIPT_MEMORY|integer|11|c=}} reports the actual memory that all scripts in an object use. Mono scripts can set a memory limit lower than the maximum by using [[llSetMemoryLimit]].  As this value is accurately reported, the value returned by [[llGetObjectDetails]] is accurate to within 1024 bytes.&lt;br /&gt;
*{{LSL Const|OBJECT_RUNNING_SCRIPT_COUNT|integer|9|c=}} includes crashed scripts in its count.&lt;br /&gt;
|examples=&lt;br /&gt;
&amp;lt;lsl&amp;gt;default&lt;br /&gt;
{&lt;br /&gt;
    collision_start(integer i)&lt;br /&gt;
    {&lt;br /&gt;
        list a = llGetObjectDetails(llDetectedKey(0), ([OBJECT_NAME, &lt;br /&gt;
                    OBJECT_DESC, OBJECT_POS, OBJECT_ROT, OBJECT_VELOCITY,&lt;br /&gt;
                    OBJECT_OWNER, OBJECT_GROUP, OBJECT_CREATOR]));&lt;br /&gt;
        llWhisper(0,&amp;quot;UUID: &amp;quot;         + (string)llDetectedKey(0) +&lt;br /&gt;
                  &amp;quot;\nName: \&amp;quot;&amp;quot;       + llList2String(a,0) + &amp;quot;\&amp;quot;&amp;quot; +&lt;br /&gt;
                  &amp;quot;\nDescription: \&amp;quot;&amp;quot; + llList2String(a,1) + &amp;quot;\&amp;quot;&amp;quot; +&lt;br /&gt;
                  &amp;quot;\nPosition: &amp;quot;     + llList2String(a,2) +&lt;br /&gt;
                  &amp;quot;\nRotation: &amp;quot;     + llList2String(a,3) +&lt;br /&gt;
                  &amp;quot;\nVelocity: &amp;quot;     + llList2String(a,4) +&lt;br /&gt;
                  &amp;quot;\nOwner: &amp;quot;        + llList2String(a,5) +&lt;br /&gt;
                  &amp;quot;\nGroup: &amp;quot;        + llList2String(a,6) +&lt;br /&gt;
                  &amp;quot;\nCreator: &amp;quot;      + llList2String(a,7));&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
// group join inviter&lt;br /&gt;
// gets the name of the object&#039;s active group from the online group profile&lt;br /&gt;
&lt;br /&gt;
key groupNameRequestId;&lt;br /&gt;
key groupKey;&lt;br /&gt;
string groupName;&lt;br /&gt;
&lt;br /&gt;
init()&lt;br /&gt;
{&lt;br /&gt;
    // WARNING:&lt;br /&gt;
    // different prims can have different active groups!!!&lt;br /&gt;
&lt;br /&gt;
    // get the key of the root prim&#039;s group&lt;br /&gt;
    groupKey = llList2Key(llGetObjectDetails(llGetLinkKey(LINK_ROOT), [OBJECT_GROUP]), 0);&lt;br /&gt;
&lt;br /&gt;
    // request the name of the root prim&#039;s group&lt;br /&gt;
    groupNameRequestId = llHTTPRequest(&amp;quot;http://world.secondlife.com/group/&amp;quot; + (string)groupKey, [], &amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        init();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer num_detected)&lt;br /&gt;
    {&lt;br /&gt;
        if (groupKey == NULL_KEY || groupName == &amp;quot;&amp;quot;)&lt;br /&gt;
            return;&lt;br /&gt;
&lt;br /&gt;
        key id = llDetectedKey(0);&lt;br /&gt;
        llInstantMessage(id,&lt;br /&gt;
            &amp;quot;Click the link to join the group &#039;&amp;quot; + groupName + &amp;quot;&#039;\n&amp;quot;&lt;br /&gt;
            + &amp;quot;secondlife:///app/group/&amp;quot; + (string)groupKey + &amp;quot;/about&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 != groupNameRequestId)&lt;br /&gt;
            return;&lt;br /&gt;
&lt;br /&gt;
        list args = llParseString2List(body, [&amp;quot;title&amp;quot;], []);&lt;br /&gt;
        groupName = llList2String(llParseString2List(llList2String(args, 1), [&amp;quot;&amp;gt;&amp;quot;, &amp;quot;&amp;lt;&amp;quot;, &amp;quot;/&amp;quot;], []), 0);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&amp;lt;lsl&amp;gt;// aim &amp;amp; shoot&lt;br /&gt;
default&lt;br /&gt;
{   state_entry()&lt;br /&gt;
    {   llRequestPermissions(llGetOwner(), PERMISSION_TAKE_CONTROLS);&lt;br /&gt;
    }&lt;br /&gt;
    control(key id, integer pressed, integer change) &lt;br /&gt;
    {   if(change &amp;amp; pressed &amp;amp; CONTROL_ML_LBUTTON)&lt;br /&gt;
            llSensor(&amp;quot;&amp;quot;, &amp;quot;&amp;quot;, AGENT|PASSIVE|ACTIVE, 96.0, PI/16.0);&lt;br /&gt;
    }&lt;br /&gt;
    run_time_permissions(integer perm)&lt;br /&gt;
    {   if(perm&amp;amp;PERMISSION_TAKE_CONTROLS)&lt;br /&gt;
            llTakeControls(CONTROL_ML_LBUTTON, TRUE, TRUE); &lt;br /&gt;
    }&lt;br /&gt;
    sensor(integer n)&lt;br /&gt;
    {   key uuid=llDetectedKey(0);&lt;br /&gt;
        list a = llGetObjectDetails(uuid, ([&lt;br /&gt;
            OBJECT_NAME, OBJECT_DESC, OBJECT_POS, OBJECT_ROT,&lt;br /&gt;
            OBJECT_VELOCITY,OBJECT_OWNER, OBJECT_GROUP, OBJECT_CREATOR]));&lt;br /&gt;
        llOwnerSay(&amp;quot;UUID: &amp;quot; + (string)uuid +&lt;br /&gt;
            &amp;quot;\nName: \&amp;quot;&amp;quot; + llList2String(a,0)+ &amp;quot;\&amp;quot;&amp;quot; +&lt;br /&gt;
            &amp;quot;\nDecription: \&amp;quot;&amp;quot; + llList2String(a,1) + &amp;quot;\&amp;quot;&amp;quot; +&lt;br /&gt;
            &amp;quot;\nPosition: &amp;quot; + llList2String(a,2) +&lt;br /&gt;
            &amp;quot;\nRotation: &amp;quot; + llList2String(a,3) +&lt;br /&gt;
            &amp;quot;\nVelocity: &amp;quot; + llList2String(a,4) +&lt;br /&gt;
            &amp;quot;\nOwner: &amp;quot; + llList2String(a,5) +&lt;br /&gt;
            &amp;quot;\nGroup: &amp;quot; + llList2String(a,6) +&lt;br /&gt;
            &amp;quot;\nCreator: &amp;quot; + llList2String(a,7)&lt;br /&gt;
        );&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&amp;lt;lsl&amp;gt;// Object Script Time&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    touch_start(integer num_detected)&lt;br /&gt;
    {&lt;br /&gt;
        llOwnerSay(llGetObjectName()+&amp;quot; Script Time: &amp;quot;+llList2String(llGetObjectDetails(llGetKey(), [OBJECT_SCRIPT_TIME]), 0));&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
|spec&lt;br /&gt;
|constants={{LSL Constants/Object Details}}&lt;br /&gt;
|helpers=See {{LSLGC|Link/Get}} for some {{LSLGC|Link|link}} related helper functions. Also see [[llGetLinkPrimitiveParams]] if you need to get the position and rotation of a linked prim.&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
integer isLindenTreeOrGrass(key id){&lt;br /&gt;
    //Check if it&#039;s an OPT_OTHER and not an attachment, which makes it a Linden tree or grass!&lt;br /&gt;
    list out = llGetObjectDetails(id, [OBJECT_PATHFINDING_TYPE, OBJECT_ATTACHED_POINT]);&lt;br /&gt;
    return (llList2Integer(out, 0) == OPT_OTHER) &amp;amp;&amp;amp; !llList2Integer(out, 1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
|also_functions={{LSL DefineRow||[[llKey2Name]]}}&lt;br /&gt;
{{LSL DefineRow||[[llGetPrimitiveParams]]}}&lt;br /&gt;
{{LSL DefineRow||[[llSetLinkPrimitiveParams]]}}&lt;br /&gt;
{{LSL DefineRow||[[llSetPrimitiveParams]]}}&lt;br /&gt;
{{LSL DefineRow||[[llGetParcelDetails]]}}&lt;br /&gt;
|also_tests&lt;br /&gt;
|also_events&lt;br /&gt;
|also_articles={{LSL DefineRow||{{LSLGC|Detected}}}}&lt;br /&gt;
{{LSL DefineRow||[[Prim Attribute Overloading]]}}&lt;br /&gt;
|notes&lt;br /&gt;
|history=&lt;br /&gt;
*Introduced in SL 1.18.3(2)&lt;br /&gt;
*Date of Release [[Release_Notes/Second_Life_Release/1.18#Release_Notes_for_Second_Life_1.18.3.285.29_September_28.2C_2007 | 28-09-2007 ]]&lt;br /&gt;
|cat1=Object&lt;br /&gt;
|cat2=Prim&lt;br /&gt;
|cat3=Avatar&lt;br /&gt;
|cat4=Owner&lt;br /&gt;
|cat5=Creator&lt;br /&gt;
|cat6=Group&lt;br /&gt;
|cat7=Link&lt;br /&gt;
|cat8&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Darien Caldwell</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlGetObjectDetails&amp;diff=1187388</id>
		<title>LlGetObjectDetails</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlGetObjectDetails&amp;diff=1187388"/>
		<updated>2014-01-31T04:09:58Z</updated>

		<summary type="html">&lt;p&gt;Darien Caldwell: Corrected reference to Mono Memory limiting, removed opinion.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function&lt;br /&gt;
|inject-2=&lt;br /&gt;
{{LSL_Function/limits}}{{LSL_Function/uuid|id|sim=*}}&lt;br /&gt;
{{Issues/SCR-87}}{{Issues/SVC-7592}}&lt;br /&gt;
|func_id=332|func_sleep=0.0|func_energy=10.0&lt;br /&gt;
|func=llGetObjectDetails&lt;br /&gt;
|p1_type=key|p1_name=id|p1_desc=&amp;amp;#32;or adjacent regions[[#id_Parameter|*]]&lt;br /&gt;
|p2_type=list|p2_name=params|p2_desc=OBJECT_* flags&lt;br /&gt;
|return_type=list|return_text=of the details for &#039;&#039;&#039;id&#039;&#039;&#039;, specifically those requested in &#039;&#039;&#039;params&#039;&#039;&#039;. &lt;br /&gt;
|func_footnote=An empty list if &#039;&#039;&#039;id&#039;&#039;&#039; is not found.{{PBR}}&lt;br /&gt;
{{LSL Const|OBJECT_UNKNOWN_DETAIL|integer|-1|c=}} is returned when passed an invalid integer parameter.&lt;br /&gt;
|spec=&amp;lt;div style=&amp;quot;padding: 1px; float: left;&amp;quot;&amp;gt;[[Image:LlGetObjectdetails-avatar-range.png|thumb|none|250px|Avatar detection range for SL Server 1.34]]&amp;lt;/div&amp;gt;&lt;br /&gt;
&amp;lt;h5 style=&amp;quot;margin:0;&amp;quot;&amp;gt;id Parameter&amp;lt;/h5&amp;gt;&lt;br /&gt;
&#039;&#039;&#039;id&#039;&#039;&#039; holds the UUID of the avatar or prim this function is going to get the details of.&lt;br /&gt;
&lt;br /&gt;
If &#039;&#039;&#039;id&#039;&#039;&#039; is not found in the region, adjacent regions are searched for avatars which match &#039;&#039;&#039;id&#039;&#039;&#039;. An avatar is only considered to have been found if it is inside the region, or within a 34 meter zone outside the region boundaries (see diagram). A single valid result may be returned after the avatar leaves this zone.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;h5 style=&amp;quot;margin:0;&amp;quot;&amp;gt;params Parameter&amp;lt;/h5&amp;gt;&lt;br /&gt;
The &#039;&#039;&#039;params&#039;&#039;&#039; list is used to indicate which object attributes of interest. The order they are supplied in determines the order of the corresponding return values in the return list.&lt;br /&gt;
{{{!}} cellpadding=&amp;quot;0&amp;quot; cellspacing=&amp;quot;0&amp;quot;&lt;br /&gt;
{{!}}&lt;br /&gt;
*If &#039;&#039;&#039;params&#039;&#039;&#039; contains unsupported integer values, {{LSL Const|OBJECT_UNKNOWN_DETAIL|integer|-1|c=}} is placed in the output list.&lt;br /&gt;
*If &#039;&#039;&#039;params&#039;&#039;&#039; contains non-[[integer]] types, those values will be silently ignored.&lt;br /&gt;
{{!}}}&lt;br /&gt;
&amp;lt;div style=&amp;quot;clear:both;&amp;quot;&amp;gt;&amp;lt;/div&amp;gt;&lt;br /&gt;
|caveats=&lt;br /&gt;
&lt;br /&gt;
*OBJECT_ROT will return an accurate facing for Avatars seated or in mouselook, but only a rough direction otherwise.&lt;br /&gt;
*Adjacent regions are not searched for prims which match &#039;&#039;&#039;id&#039;&#039;&#039;.&lt;br /&gt;
*Information for avatars that can no longer be found will still be available for a short period (about 45 seconds) but it is not updated.&lt;br /&gt;
*Items in &#039;&#039;&#039;params&#039;&#039;&#039; that are not integers are silently ignored, {{LSL Const|OBJECT_UNKNOWN_DETAIL|integer|-1|c=}} is not returned.&lt;br /&gt;
*This function does not return information about items in inventory.&lt;br /&gt;
*[[llTargetOmega]] will only effect the return of [[OBJECT_ROT]] if the object is [[STATUS_PHYSICS|physical]]. If the object is not physical then the original start rotation is returned, [[llTargetOmega]] is a {{LSLGC|Effects|client side effect}}.&lt;br /&gt;
*{{LSL Const|OBJECT_SCRIPT_MEMORY|integer|11|c=}} reports the maximum memory that all scripts in an object could use, not the actual amount of real memory currently used.  In particular, Mono scripts could have set a memory limit lower than the maximum by using [[llSetMemoryLimit]].  In practice, this makes the number reported a worst case scenario.&lt;br /&gt;
*{{LSL Const|OBJECT_RUNNING_SCRIPT_COUNT|integer|9|c=}} includes crashed scripts in its count.&lt;br /&gt;
|examples=&lt;br /&gt;
&amp;lt;lsl&amp;gt;default&lt;br /&gt;
{&lt;br /&gt;
    collision_start(integer i)&lt;br /&gt;
    {&lt;br /&gt;
        list a = llGetObjectDetails(llDetectedKey(0), ([OBJECT_NAME, &lt;br /&gt;
                    OBJECT_DESC, OBJECT_POS, OBJECT_ROT, OBJECT_VELOCITY,&lt;br /&gt;
                    OBJECT_OWNER, OBJECT_GROUP, OBJECT_CREATOR]));&lt;br /&gt;
        llWhisper(0,&amp;quot;UUID: &amp;quot;         + (string)llDetectedKey(0) +&lt;br /&gt;
                  &amp;quot;\nName: \&amp;quot;&amp;quot;       + llList2String(a,0) + &amp;quot;\&amp;quot;&amp;quot; +&lt;br /&gt;
                  &amp;quot;\nDescription: \&amp;quot;&amp;quot; + llList2String(a,1) + &amp;quot;\&amp;quot;&amp;quot; +&lt;br /&gt;
                  &amp;quot;\nPosition: &amp;quot;     + llList2String(a,2) +&lt;br /&gt;
                  &amp;quot;\nRotation: &amp;quot;     + llList2String(a,3) +&lt;br /&gt;
                  &amp;quot;\nVelocity: &amp;quot;     + llList2String(a,4) +&lt;br /&gt;
                  &amp;quot;\nOwner: &amp;quot;        + llList2String(a,5) +&lt;br /&gt;
                  &amp;quot;\nGroup: &amp;quot;        + llList2String(a,6) +&lt;br /&gt;
                  &amp;quot;\nCreator: &amp;quot;      + llList2String(a,7));&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
// group join inviter&lt;br /&gt;
// gets the name of the object&#039;s active group from the online group profile&lt;br /&gt;
&lt;br /&gt;
key groupNameRequestId;&lt;br /&gt;
key groupKey;&lt;br /&gt;
string groupName;&lt;br /&gt;
&lt;br /&gt;
init()&lt;br /&gt;
{&lt;br /&gt;
    // WARNING:&lt;br /&gt;
    // different prims can have different active groups!!!&lt;br /&gt;
&lt;br /&gt;
    // get the key of the root prim&#039;s group&lt;br /&gt;
    groupKey = llList2Key(llGetObjectDetails(llGetLinkKey(LINK_ROOT), [OBJECT_GROUP]), 0);&lt;br /&gt;
&lt;br /&gt;
    // request the name of the root prim&#039;s group&lt;br /&gt;
    groupNameRequestId = llHTTPRequest(&amp;quot;http://world.secondlife.com/group/&amp;quot; + (string)groupKey, [], &amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        init();&lt;br /&gt;
    }&lt;br /&gt;
&lt;br /&gt;
    touch_start(integer num_detected)&lt;br /&gt;
    {&lt;br /&gt;
        if (groupKey == NULL_KEY || groupName == &amp;quot;&amp;quot;)&lt;br /&gt;
            return;&lt;br /&gt;
&lt;br /&gt;
        key id = llDetectedKey(0);&lt;br /&gt;
        llInstantMessage(id,&lt;br /&gt;
            &amp;quot;Click the link to join the group &#039;&amp;quot; + groupName + &amp;quot;&#039;\n&amp;quot;&lt;br /&gt;
            + &amp;quot;secondlife:///app/group/&amp;quot; + (string)groupKey + &amp;quot;/about&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 != groupNameRequestId)&lt;br /&gt;
            return;&lt;br /&gt;
&lt;br /&gt;
        list args = llParseString2List(body, [&amp;quot;title&amp;quot;], []);&lt;br /&gt;
        groupName = llList2String(llParseString2List(llList2String(args, 1), [&amp;quot;&amp;gt;&amp;quot;, &amp;quot;&amp;lt;&amp;quot;, &amp;quot;/&amp;quot;], []), 0);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&amp;lt;lsl&amp;gt;// aim &amp;amp; shoot&lt;br /&gt;
default&lt;br /&gt;
{   state_entry()&lt;br /&gt;
    {   llRequestPermissions(llGetOwner(), PERMISSION_TAKE_CONTROLS);&lt;br /&gt;
    }&lt;br /&gt;
    control(key id, integer pressed, integer change) &lt;br /&gt;
    {   if(change &amp;amp; pressed &amp;amp; CONTROL_ML_LBUTTON)&lt;br /&gt;
            llSensor(&amp;quot;&amp;quot;, &amp;quot;&amp;quot;, AGENT|PASSIVE|ACTIVE, 96.0, PI/16.0);&lt;br /&gt;
    }&lt;br /&gt;
    run_time_permissions(integer perm)&lt;br /&gt;
    {   if(perm&amp;amp;PERMISSION_TAKE_CONTROLS)&lt;br /&gt;
            llTakeControls(CONTROL_ML_LBUTTON, TRUE, TRUE); &lt;br /&gt;
    }&lt;br /&gt;
    sensor(integer n)&lt;br /&gt;
    {   key uuid=llDetectedKey(0);&lt;br /&gt;
        list a = llGetObjectDetails(uuid, ([&lt;br /&gt;
            OBJECT_NAME, OBJECT_DESC, OBJECT_POS, OBJECT_ROT,&lt;br /&gt;
            OBJECT_VELOCITY,OBJECT_OWNER, OBJECT_GROUP, OBJECT_CREATOR]));&lt;br /&gt;
        llOwnerSay(&amp;quot;UUID: &amp;quot; + (string)uuid +&lt;br /&gt;
            &amp;quot;\nName: \&amp;quot;&amp;quot; + llList2String(a,0)+ &amp;quot;\&amp;quot;&amp;quot; +&lt;br /&gt;
            &amp;quot;\nDecription: \&amp;quot;&amp;quot; + llList2String(a,1) + &amp;quot;\&amp;quot;&amp;quot; +&lt;br /&gt;
            &amp;quot;\nPosition: &amp;quot; + llList2String(a,2) +&lt;br /&gt;
            &amp;quot;\nRotation: &amp;quot; + llList2String(a,3) +&lt;br /&gt;
            &amp;quot;\nVelocity: &amp;quot; + llList2String(a,4) +&lt;br /&gt;
            &amp;quot;\nOwner: &amp;quot; + llList2String(a,5) +&lt;br /&gt;
            &amp;quot;\nGroup: &amp;quot; + llList2String(a,6) +&lt;br /&gt;
            &amp;quot;\nCreator: &amp;quot; + llList2String(a,7)&lt;br /&gt;
        );&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&amp;lt;lsl&amp;gt;// Object Script Time&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    touch_start(integer num_detected)&lt;br /&gt;
    {&lt;br /&gt;
        llOwnerSay(llGetObjectName()+&amp;quot; Script Time: &amp;quot;+llList2String(llGetObjectDetails(llGetKey(), [OBJECT_SCRIPT_TIME]), 0));&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
|spec&lt;br /&gt;
|constants={{LSL Constants/Object Details}}&lt;br /&gt;
|helpers=See {{LSLGC|Link/Get}} for some {{LSLGC|Link|link}} related helper functions. Also see [[llGetLinkPrimitiveParams]] if you need to get the position and rotation of a linked prim.&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
integer isLindenTreeOrGrass(key id){&lt;br /&gt;
    //Check if it&#039;s an OPT_OTHER and not an attachment, which makes it a Linden tree or grass!&lt;br /&gt;
    list out = llGetObjectDetails(id, [OBJECT_PATHFINDING_TYPE, OBJECT_ATTACHED_POINT]);&lt;br /&gt;
    return (llList2Integer(out, 0) == OPT_OTHER) &amp;amp;&amp;amp; !llList2Integer(out, 1);&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
|also_functions={{LSL DefineRow||[[llKey2Name]]}}&lt;br /&gt;
{{LSL DefineRow||[[llGetPrimitiveParams]]}}&lt;br /&gt;
{{LSL DefineRow||[[llSetLinkPrimitiveParams]]}}&lt;br /&gt;
{{LSL DefineRow||[[llSetPrimitiveParams]]}}&lt;br /&gt;
{{LSL DefineRow||[[llGetParcelDetails]]}}&lt;br /&gt;
|also_tests&lt;br /&gt;
|also_events&lt;br /&gt;
|also_articles={{LSL DefineRow||{{LSLGC|Detected}}}}&lt;br /&gt;
{{LSL DefineRow||[[Prim Attribute Overloading]]}}&lt;br /&gt;
|notes&lt;br /&gt;
|history=&lt;br /&gt;
*Introduced in SL 1.18.3(2)&lt;br /&gt;
*Date of Release [[Release_Notes/Second_Life_Release/1.18#Release_Notes_for_Second_Life_1.18.3.285.29_September_28.2C_2007 | 28-09-2007 ]]&lt;br /&gt;
|cat1=Object&lt;br /&gt;
|cat2=Prim&lt;br /&gt;
|cat3=Avatar&lt;br /&gt;
|cat4=Owner&lt;br /&gt;
|cat5=Creator&lt;br /&gt;
|cat6=Group&lt;br /&gt;
|cat7=Link&lt;br /&gt;
|cat8&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Darien Caldwell</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlSetMemoryLimit&amp;diff=1187387</id>
		<title>LlSetMemoryLimit</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlSetMemoryLimit&amp;diff=1187387"/>
		<updated>2014-01-31T03:55:23Z</updated>

		<summary type="html">&lt;p&gt;Darien Caldwell: Corrected erroneous statement concerning Memory size reporting in the viewer and with llGetObjectDetails.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function&lt;br /&gt;
|func_id=???|func_sleep=0.0|func_energy=???&lt;br /&gt;
|func=llSetMemoryLimit&lt;br /&gt;
|p1_type=integer|p1_name=limit&lt;br /&gt;
|return_type=integer|return_subtype=boolean&lt;br /&gt;
|func_desc=Request {{LSLP|limit}} bytes to be reserved for this script.&lt;br /&gt;
|Return_text=[[TRUE]] if the memory limit was successfully set (or [[FALSE]] if not).&lt;br /&gt;
|func_footer&lt;br /&gt;
|spec=&lt;br /&gt;
This function&#039;s behavior is dependent upon the VM the script is using. [[#Mono|Mono]] is the new VM, [[#LSO|LSO]] is the old VM.&lt;br /&gt;
&lt;br /&gt;
;Mono:Sets the memory limit for the script.&lt;br /&gt;
* The memory limit can be set up to 64k.&lt;br /&gt;
* The memory limit can not be set lower than the memory currently in use by the script.&lt;br /&gt;
* All new scripts start with a limit of 64k&lt;br /&gt;
* All existing scripts have a limit of 64k&lt;br /&gt;
* A lower limit will &#039;&#039;&#039;not&#039;&#039;&#039; effect the amount of memory reported in the viewer UI and by [[llGetObjectDetails]].&lt;br /&gt;
* The memory limit is not the amount of real memory actually used by the script, just the upper limit on it.&lt;br /&gt;
&lt;br /&gt;
;LSO:Has no effect on LSO scripts which will always use exactly 16k&lt;br /&gt;
|caveats=&lt;br /&gt;
;Mono:When &#039;&#039;&#039;&#039;&#039;n&#039;&#039;&#039;&#039;&#039; is too small, llSetMemoryLimit(&#039;&#039;&#039;&#039;&#039;n&#039;&#039;&#039;&#039;&#039;) is ignored and the memory limit is not changed&lt;br /&gt;
|examples=&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
// Memory-walkthrough by Daemonika Nightfire (daemonika.nightfire)&lt;br /&gt;
&lt;br /&gt;
integer limit = 20000; // &amp;lt;- bytes&lt;br /&gt;
&lt;br /&gt;
Test()&lt;br /&gt;
{&lt;br /&gt;
    llSetText(&amp;quot;Limited Memory &amp;quot; + (string)llGetMemoryLimit() +&lt;br /&gt;
              &amp;quot;\nUsed Memory &amp;quot; + (string)llGetUsedMemory() +&lt;br /&gt;
              &amp;quot;\nFree Memory &amp;quot; + (string)llGetFreeMemory(),&amp;lt;1,1,1&amp;gt;,1);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llSetMemoryLimit(limit);&lt;br /&gt;
        &lt;br /&gt;
        llScriptProfiler(PROFILE_SCRIPT_MEMORY);&lt;br /&gt;
        Test();&lt;br /&gt;
        llScriptProfiler(PROFILE_NONE);&lt;br /&gt;
        &lt;br /&gt;
        llSay(0,&amp;quot;This script used at most &amp;quot; + (string)llGetSPMaxMemory() + &amp;quot; bytes of memory during Test.&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
// Result:&lt;br /&gt;
        &lt;br /&gt;
// Floating Text:&lt;br /&gt;
// Limited Memory 20000&lt;br /&gt;
// Used Memory 4972&lt;br /&gt;
// Free Memory 15100&lt;br /&gt;
        &lt;br /&gt;
// Chat:&lt;br /&gt;
// [05:11] Object: This script used at most 4972 bytes of memory during Test.&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
|helpers&lt;br /&gt;
|also_functions=&lt;br /&gt;
{{LSL DefineRow||[[llScriptProfiler]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llGetSPMaxMemory]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llGetMemoryLimit]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llGetFreeMemory]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llGetUsedMemory]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llGetObjectDetails]]|}}&lt;br /&gt;
|also_events&lt;br /&gt;
|also_tests&lt;br /&gt;
|also_articles&lt;br /&gt;
|notes&lt;br /&gt;
|history=*Scheduled for [[Beta/Magnum|RC Magnum]] channel, week of August 3, 2011.&lt;br /&gt;
|lso&lt;br /&gt;
|cat1=Script&lt;br /&gt;
|cat2=Memory&lt;br /&gt;
|cat3=Script Profiler&lt;br /&gt;
|cat4&lt;br /&gt;
|history = Date of Release  [[ Release_Notes/Second_Life_Server/11#11.08.10.238207 | 10/08/2011 ]]&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Darien Caldwell</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=PUBLIC_CHANNEL&amp;diff=1186773</id>
		<title>PUBLIC CHANNEL</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=PUBLIC_CHANNEL&amp;diff=1186773"/>
		<updated>2014-01-11T20:20:15Z</updated>

		<summary type="html">&lt;p&gt;Darien Caldwell: Something for the art lovers.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;onlyinclude&amp;gt;{{#vardefine:PUBLIC_CHANNEL|{{LSL Const|PUBLIC_CHANNEL|integer|ihex=0|hex=0x0|c={{#if:{{{direct|}}}|Chat channel used to broadcast to a specific user or prim. This channel is sometimes referred to as: open chat, local chat and public chat.|Chat channel that broadcasts to all nearby users. This channel is sometimes referred to as: open chat, local chat and public chat.}}}}}}&amp;lt;/onlyinclude&amp;gt;{{LSL Constant&lt;br /&gt;
|name={{#var:cname}}&lt;br /&gt;
|type={{#var:type}}&lt;br /&gt;
|hvalue=0x0&lt;br /&gt;
|value=0&lt;br /&gt;
|desc=Chat channel that broadcasts to all nearby users &amp;amp; objects. This channel is sometimes referred to as: open chat, local chat and public chat.&lt;br /&gt;
&lt;br /&gt;
If used with a [[llRegionSayTo]], it goes to the specified user or prim. Unlike private channels, the user&#039;s attachments do not receive the message.&lt;br /&gt;
|comment={{#var:comment}}&lt;br /&gt;
|examples=&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    touch_start(integer num_detected)&lt;br /&gt;
    {&lt;br /&gt;
        llSay(PUBLIC_CHANNEL, &amp;quot;Hello there, I&#039;m talking in local chat on channel 0.&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
|constants=&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|DEBUG_CHANNEL}}|3={{#var:comment}}}}&lt;br /&gt;
|functions=&lt;br /&gt;
{{LSL DefineRow||[[llWhisper]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llSay]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llShout]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llRegionSayTo]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llDialog]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llListen]]|}}&lt;br /&gt;
|events=&lt;br /&gt;
{{LSL DefineRow||[[listen]]|}}&lt;br /&gt;
|haiku={{Haiku|Oh woeful constant,|the focus of much Strife,|value, no, but priceless.}}&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>Darien Caldwell</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=PUBLIC_CHANNEL&amp;diff=1186753</id>
		<title>PUBLIC CHANNEL</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=PUBLIC_CHANNEL&amp;diff=1186753"/>
		<updated>2014-01-10T19:58:27Z</updated>

		<summary type="html">&lt;p&gt;Darien Caldwell: Undoing revision that broke Constant tables.&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;onlyinclude&amp;gt;{{#vardefine:PUBLIC_CHANNEL|{{LSL Const|PUBLIC_CHANNEL|integer|ihex=0|hex=0x0|c={{#if:{{{direct|}}}|Chat channel used to broadcast to a specific user or prim. This channel is sometimes referred to as: open chat, local chat and public chat.|Chat channel that broadcasts to all nearby users. This channel is sometimes referred to as: open chat, local chat and public chat.}}}}}}&amp;lt;/onlyinclude&amp;gt;{{LSL Constant&lt;br /&gt;
|name={{#var:cname}}&lt;br /&gt;
|type={{#var:type}}&lt;br /&gt;
|hvalue=0x0&lt;br /&gt;
|value=0&lt;br /&gt;
|desc=Chat channel that broadcasts to all nearby users &amp;amp; objects. This channel is sometimes referred to as: open chat, local chat and public chat.&lt;br /&gt;
&lt;br /&gt;
If used with a [[llRegionSayTo]], it goes to the specified user or prim. Unlike private channels, the user&#039;s attachments do not receive the message.&lt;br /&gt;
|comment={{#var:comment}}&lt;br /&gt;
|examples=&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    touch_start(integer num_detected)&lt;br /&gt;
    {&lt;br /&gt;
        llSay(PUBLIC_CHANNEL, &amp;quot;Hello there, I&#039;m talking in local chat on channel 0.&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
|constants=&lt;br /&gt;
{{LSL DefineRow|1=|2={{LSL Const|DEBUG_CHANNEL}}|3={{#var:comment}}}}&lt;br /&gt;
|functions=&lt;br /&gt;
{{LSL DefineRow||[[llWhisper]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llSay]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llShout]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llRegionSayTo]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llDialog]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llListen]]|}}&lt;br /&gt;
|events=&lt;br /&gt;
{{LSL DefineRow||[[listen]]|}}&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>Darien Caldwell</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlRegionSay&amp;diff=1186662</id>
		<title>LlRegionSay</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlRegionSay&amp;diff=1186662"/>
		<updated>2014-01-09T00:14:45Z</updated>

		<summary type="html">&lt;p&gt;Darien Caldwell: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function&lt;br /&gt;
|inject-2={{LSL_Function/chat|channel|msg|np=*}}&lt;br /&gt;
|func_id=331&lt;br /&gt;
|func_sleep=0.0&lt;br /&gt;
|func_energy=10.0&lt;br /&gt;
|func=llRegionSay&lt;br /&gt;
|p1_type=integer|p1_name=channel|p1_desc&lt;br /&gt;
|p2_type=string|p2_name=msg|p2_desc&lt;br /&gt;
|func_desc=Says the string {{LSLP|msg}} on channel number {{LSLP|channel}} that can be heard anywhere in the [[region]] by a script [[listen|listening]] on {{LSLP|channel}}.&lt;br /&gt;
|func_footnote=Regardless of where the prim is, the message will not travel over region borders.&lt;br /&gt;
|return_text&lt;br /&gt;
|spec&lt;br /&gt;
|constants&lt;br /&gt;
|caveats=*This function cannot transmit on the {{#var:PUBLIC_CHANNEL}} (channel 0), this is a design feature and not a bug.&lt;br /&gt;
*If {{LSLP|msg}} is longer than 1024 characters it is truncated to 1024 characters. (Note that in Mono, each character occupies 2 memory bytes).&lt;br /&gt;
*A prim can &#039;&#039;&#039;not&#039;&#039;&#039; hear itself, this to prevent problems with recursion. It can however hear other prims within the same object.&lt;br /&gt;
|examples=&amp;lt;lsl&amp;gt;default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llRegionSay(25,&amp;quot;This is an incredibly useless program.&amp;quot; );&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/lsl&amp;gt;&lt;br /&gt;
To avoid making your object spam its neighborhood, use [[llOwnerSay]] or [[llInstantMessage]].&lt;br /&gt;
|helpers&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||[[llRegionSayTo]]|Sends chat directly to specified target within region}}&lt;br /&gt;
{{LSL DefineRow||[[llOwnerSay]]|Sends chat to the owner only}}&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]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llDialog]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llTextBox]]|}}&lt;br /&gt;
|also_tests&lt;br /&gt;
|also_articles&lt;br /&gt;
|notes=If one object &#039;says&#039; something to another object (e.g., a button that, when touched,&lt;br /&gt;
turns on a lamp), it is a good idea to use a very negative channel, e.g.,&lt;br /&gt;
&amp;lt;lsl&amp;gt;    llRegionSay(-5243212,&amp;quot;turn on&amp;quot;);&amp;lt;/lsl&amp;gt;&lt;br /&gt;
Negative channels are popular for script communications because the standard SL client is unable to chat directly on those channels (&amp;quot;/-xxxx message&amp;quot; won&#039;t chat &amp;quot;message&amp;quot; on channel &amp;quot;-xxxx&amp;quot;, it will chat &amp;quot;/-xxxx message&amp;quot; on channel zero). The only way to do so prior to [[llTextBox]] was to use [[llDialog]] which was limited to 24 bytes.&lt;br /&gt;
&lt;br /&gt;
If {{#var:DEBUG_CHANNEL}} is used as {{LSLP|channel}}, the script will say {{LSLP|msg}} to the Script Warning/Error window. &lt;br /&gt;
&lt;br /&gt;
If you wish two objects owned by the same person to communicate within a SIM, one idea is to make both scripts compute the channel based on the owner UUID. e.g. :-&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
    gChannel = 0x80000000 | (integer) ( (string) llGetOwner() );&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* As of 1.18.3, using llRegionSay on the {{#var:DEBUG_CHANNEL}} will wrap around and display on channel 0, with a range of 100m.&lt;br /&gt;
|history=&lt;br /&gt;
*Introduced with SL 1.16.0&lt;br /&gt;
|cat1=Communications&lt;br /&gt;
|cat2=Chat&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Darien Caldwell</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlRegionSay&amp;diff=1186661</id>
		<title>LlRegionSay</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlRegionSay&amp;diff=1186661"/>
		<updated>2014-01-09T00:14:31Z</updated>

		<summary type="html">&lt;p&gt;Darien Caldwell: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function&lt;br /&gt;
|inject-2={{LSL_Function/chat|channel|msg|np=*}}&lt;br /&gt;
|func_id=331&lt;br /&gt;
|func_sleep=0.0&lt;br /&gt;
|func_energy=10.0&lt;br /&gt;
|func=llRegionSay&lt;br /&gt;
|p1_type=integer|p1_name=channel|p1_desc&lt;br /&gt;
|p2_type=string|p2_name=msg|p2_desc&lt;br /&gt;
|func_desc=Says the string {{LSLP|msg}} on channel number {{LSLP|channel}} that can be heard anywhere in the [[region]] by a script [[listen|listening]] on {{LSLP|channel}}.&lt;br /&gt;
|func_footnote=Regardless of where the prim is, the message will not travel over region borders.&lt;br /&gt;
|return_text&lt;br /&gt;
|spec&lt;br /&gt;
|constants&lt;br /&gt;
|caveats=*This function cannot transmit on the {{#var:PUBLIC_CHANNEL}}(channel 0), this is a design feature and not a bug.&lt;br /&gt;
*If {{LSLP|msg}} is longer than 1024 characters it is truncated to 1024 characters. (Note that in Mono, each character occupies 2 memory bytes).&lt;br /&gt;
*A prim can &#039;&#039;&#039;not&#039;&#039;&#039; hear itself, this to prevent problems with recursion. It can however hear other prims within the same object.&lt;br /&gt;
|examples=&amp;lt;lsl&amp;gt;default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        llRegionSay(25,&amp;quot;This is an incredibly useless program.&amp;quot; );&lt;br /&gt;
    }&lt;br /&gt;
}&amp;lt;/lsl&amp;gt;&lt;br /&gt;
To avoid making your object spam its neighborhood, use [[llOwnerSay]] or [[llInstantMessage]].&lt;br /&gt;
|helpers&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||[[llRegionSayTo]]|Sends chat directly to specified target within region}}&lt;br /&gt;
{{LSL DefineRow||[[llOwnerSay]]|Sends chat to the owner only}}&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]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llDialog]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llTextBox]]|}}&lt;br /&gt;
|also_tests&lt;br /&gt;
|also_articles&lt;br /&gt;
|notes=If one object &#039;says&#039; something to another object (e.g., a button that, when touched,&lt;br /&gt;
turns on a lamp), it is a good idea to use a very negative channel, e.g.,&lt;br /&gt;
&amp;lt;lsl&amp;gt;    llRegionSay(-5243212,&amp;quot;turn on&amp;quot;);&amp;lt;/lsl&amp;gt;&lt;br /&gt;
Negative channels are popular for script communications because the standard SL client is unable to chat directly on those channels (&amp;quot;/-xxxx message&amp;quot; won&#039;t chat &amp;quot;message&amp;quot; on channel &amp;quot;-xxxx&amp;quot;, it will chat &amp;quot;/-xxxx message&amp;quot; on channel zero). The only way to do so prior to [[llTextBox]] was to use [[llDialog]] which was limited to 24 bytes.&lt;br /&gt;
&lt;br /&gt;
If {{#var:DEBUG_CHANNEL}} is used as {{LSLP|channel}}, the script will say {{LSLP|msg}} to the Script Warning/Error window. &lt;br /&gt;
&lt;br /&gt;
If you wish two objects owned by the same person to communicate within a SIM, one idea is to make both scripts compute the channel based on the owner UUID. e.g. :-&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
    gChannel = 0x80000000 | (integer) ( (string) llGetOwner() );&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* As of 1.18.3, using llRegionSay on the {{#var:DEBUG_CHANNEL}} will wrap around and display on channel 0, with a range of 100m.&lt;br /&gt;
|history=&lt;br /&gt;
*Introduced with SL 1.16.0&lt;br /&gt;
|cat1=Communications&lt;br /&gt;
|cat2=Chat&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Darien Caldwell</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlSay&amp;diff=1186660</id>
		<title>LlSay</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlSay&amp;diff=1186660"/>
		<updated>2014-01-09T00:13:22Z</updated>

		<summary type="html">&lt;p&gt;Darien Caldwell: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function&lt;br /&gt;
|inject-2={{LSL_Function/chat|channel|msg}}&lt;br /&gt;
|func_id=23&lt;br /&gt;
|func_sleep=0.0&lt;br /&gt;
|func_energy=10.0&lt;br /&gt;
|func=llSay&lt;br /&gt;
|sort=Say&lt;br /&gt;
|p1_type=integer|p1_name=channel&lt;br /&gt;
|p2_type=string|p2_name=msg&lt;br /&gt;
|func_desc=Says the text supplied in string {{LSLP|msg}} on channel supplied in integer {{LSLP|channel}}.&lt;br /&gt;
|return_text&lt;br /&gt;
|spec&lt;br /&gt;
|constants&lt;br /&gt;
|caveats=&lt;br /&gt;
*{{LSLP|msg}} can only be heard within 20 meters of the speaking prim (rather than the root). This is contrary to how the event [[listen]] works, where a {{LSLP|msg}} can only be heard by any prim in the object if and only if the root prim is capable of hearing it.&lt;br /&gt;
*{{LSLP|msg}} can be a maximum of 1024 bytes. This can convey 1024 ASCII characters, or 512 UTF-8 characters such as &amp;lt;code&amp;gt;á&amp;lt;/code&amp;gt;.&lt;br /&gt;
*A prim can &#039;&#039;&#039;not&#039;&#039;&#039; hear itself, this to prevent problems with recursion. It can however hear other prims within the same object.&lt;br /&gt;
|examples=&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        // PUBLIC_CHANNEL has the integer value 0&lt;br /&gt;
        llSay(PUBLIC_CHANNEL, &amp;quot;Hello, Avatar!&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
To avoid making your object spam its neighborhood, use [[llInstantMessage]], [[llOwnerSay]] or [[llRegionSayTo]].&lt;br /&gt;
|helpers&lt;br /&gt;
|also_events=&lt;br /&gt;
{{LSL DefineRow||[[listen]]&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;&amp;amp;nbsp;|Receives chat}}&lt;br /&gt;
|also_functions=&lt;br /&gt;
{{LSL DefineRow||[[llListen]]|Ask for listen events}}&lt;br /&gt;
{{LSL DefineRow||[[llInstantMessage]]|Sends chat to the owner only (or to some other user only) to avoid spamming the [[PUBLIC_CHANNEL]]}}&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||[[llRegionSayTo]]|Sends chat region wide to a specific avatar, or their attachments, or to a rezzed object of known UUID}}&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=&lt;br /&gt;
{{LSL DefineRow||[[Hello Avatar]]}}&lt;br /&gt;
|notes=&lt;br /&gt;
* Channel {{HoverText|0|Zero}} is the [[PUBLIC_CHANNEL]]. Everyone can hear chat transmitted on this channel. All other channels are private channels (not sent to users, with the exception of [[DEBUG_CHANNEL]]).&lt;br /&gt;
* Consider using [[llInstantMessage]], [[llOwnerSay]], or the [[DEBUG_CHANNEL]] for debugging purposes. If [[DEBUG_CHANNEL]] is used as {{LSLP|channel}}, the script will say {{LSLP|msg}} to the Script Warning/Error window. &lt;br /&gt;
* If one object &#039;says&#039; 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 channel, &#039;&#039;e.g.&#039;&#039;, &amp;lt;code&amp;gt;-5243212&amp;lt;/code&amp;gt; but don&#039;t just use any number take a look at the [[User-Defined Protocols &amp;amp; APIs]] and choose one that won&#039;t interfere with other protocols. If you are going to sell your script widely please add it to the appropriate [[LSL_Protocol#Known_negative_chat_channels|known chat channels list]] so others won&#039;t interfere with your product (do keep in mind you should build your product so that it handles interference appropriately).&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
    llSay(-5243212,&amp;quot;turn on&amp;quot;);&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
Negative channels are popular for script communications because the standard SL client is unable to chat directly on those channels (&amp;lt;code&amp;gt;/-xxxx message&amp;lt;/code&amp;gt; won&#039;t chat &amp;lt;code&amp;gt;message&amp;lt;/code&amp;gt; on channel &amp;lt;code&amp;gt;-xxxx&amp;lt;/code&amp;gt;, it will chat &amp;lt;code&amp;gt;/-xxxx message&amp;lt;/code&amp;gt; on channel [[PUBLIC_CHANNEL]]). The only way to do so prior to [[llTextBox]] was to use [[llDialog]] which was limited to 24 bytes.&lt;br /&gt;
|cat1&lt;br /&gt;
|cat2&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Darien Caldwell</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User_talk:Kireji_Haiku&amp;diff=1186659</id>
		<title>User talk:Kireji Haiku</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User_talk:Kireji_Haiku&amp;diff=1186659"/>
		<updated>2014-01-09T00:11:01Z</updated>

		<summary type="html">&lt;p&gt;Darien Caldwell: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== Unnecessary Edits ==&lt;br /&gt;
&lt;br /&gt;
Kindly desist from your inane paranoid obsession with a personal fad. Strife and I have discussed the purpose of edits and agree that edits should not unnecessarily change the style chosen by the example code originators. And don&#039;t split hairs with me about what constitutes &amp;quot;style&amp;quot;. I will continue to revert unneeded edits back to what the originator intended. [[User:Omei Qunhua|Omei Qunhua]] 07:13, 31 December 2013 (PST)&lt;br /&gt;
&lt;br /&gt;
I obviously have not explained myself simply or clearly enough. Let&#039;s try again. There have been thousands of scripts contributed to this Wiki, by hundreds if not thousands of contributors. There have apparently been a million scripts written in LSL and there are tens of thousands of scripts in public libraries. You, I believe, are almost alone among this vast horde of experience in insisting on PUBLIC_CHANNEL and ERROR_GENERIC, (float) FALSE etc. That places you a minuscule minority. You have NO RIGHT to impose your most exceptional view on the rest of us. I personally consider it OBSCENE that you dare to suggest my contributions are in error sufficiently to warrant you getting your sticky little fingers on them, just because I didn&#039;t adhere to a very individual quirk of yours in my otherwise totally correct script. What on earth do you think gives you this right? I am sure you are ABSOLUTELY convinced of the advantages of your preferences. By all means feel free to exercise your preferences in your own creations, and I will honour your right to write what you wish in your own creations, so long as they are accurate (i.e. compile and produce correct results). But that does not give you the right as one individual to impose your ways on thousands of the rest of us. The way to convince others is not to trample rough-shod over years of work by the dedicated majority. That only alienates you, certainly from me. I repeat, I will continue to try and ensure that the valid preferences of script originators are preserved. What&#039;s your excuse? [[User:Omei Qunhua|Omei Qunhua]] 09:43, 31 December 2013 (PST)&lt;br /&gt;
&lt;br /&gt;
== JSON_APPEND and JSON_DELETE ==&lt;br /&gt;
&lt;br /&gt;
I can&#039;t get on right now to test this but what happens if you use [[JSON_APPEND]] with [[JSON_DELETE]]? If the world were a wonderful place it would delete the last value.&lt;br /&gt;
&amp;lt;lsl&amp;gt;llOwnerSay(llJsonSetValue(&amp;quot;[0,1]&amp;quot;, [JSON_APPEND], JSON_DELETE));&amp;lt;/lsl&amp;gt;&lt;br /&gt;
--&#039;&#039;&#039;[[User:Strife_Onizuka|Strife]]&#039;&#039;&#039; &amp;lt;sup&amp;gt;&amp;lt;small&amp;gt;([[User talk:Strife_Onizuka|talk]]|[[Special:Contributions/Strife_Onizuka|contribs]])&amp;lt;/small&amp;gt;&amp;lt;/sup&amp;gt; 06:19, 4 October 2013 (PDT)&lt;br /&gt;
&lt;br /&gt;
:What do you think happens if it&#039;s NOT an array?&lt;br /&gt;
:&amp;lt;lsl&amp;gt;llOwnerSay(llJsonSetValue(&amp;quot;{a:1}&amp;quot;, [JSON_APPEND], JSON_DELETE));&amp;lt;/lsl&amp;gt;&lt;br /&gt;
:-- &#039;&#039;&#039;[[User:Strife_Onizuka|Strife]]&#039;&#039;&#039; &amp;lt;sup&amp;gt;&amp;lt;small&amp;gt;([[User talk:Strife_Onizuka|talk]]|[[Special:Contributions/Strife_Onizuka|contribs]])&amp;lt;/small&amp;gt;&amp;lt;/sup&amp;gt; 06:23, 4 October 2013 (PDT)&lt;br /&gt;
&lt;br /&gt;
::They both output [[JSON_INVALID]]. I&#039;ll erm... test and see if there&#039;s a better example script :P -- [[User:Kireji Haiku|Kireji Haiku]] 06:29, 4 October 2013 (PDT)&lt;br /&gt;
&lt;br /&gt;
:::JSON_DELETE I think is still only in RC. Thanks for looking into this. -- &#039;&#039;&#039;[[User:Strife_Onizuka|Strife]]&#039;&#039;&#039; &amp;lt;sup&amp;gt;&amp;lt;small&amp;gt;([[User talk:Strife_Onizuka|talk]]|[[Special:Contributions/Strife_Onizuka|contribs]])&amp;lt;/small&amp;gt;&amp;lt;/sup&amp;gt; 06:32, 4 October 2013 (PDT)&lt;br /&gt;
&lt;br /&gt;
:::I think I&#039;ll just make a feature suggestion for JSON_LAST so there is no ambiguity. -- &#039;&#039;&#039;[[User:Strife_Onizuka|Strife]]&#039;&#039;&#039; &amp;lt;sup&amp;gt;&amp;lt;small&amp;gt;([[User talk:Strife_Onizuka|talk]]|[[Special:Contributions/Strife_Onizuka|contribs]])&amp;lt;/small&amp;gt;&amp;lt;/sup&amp;gt; 06:35, 4 October 2013 (PDT)&lt;br /&gt;
&lt;br /&gt;
::::I tested both on &amp;lt;code&amp;gt;LeTigre Sandbox 1&amp;lt;/code&amp;gt; which runs &amp;lt;code&amp;gt;3.6.7.281331&amp;lt;/code&amp;gt;. It seems that is before the one introducing [[JSON_DELETE]]. So yeah... will wait and see. I removed the example script for now. -- [[User:Kireji Haiku|Kireji Haiku]] 06:39, 4 October 2013 (PDT)&lt;br /&gt;
&lt;br /&gt;
:::::&amp;lt;.&amp;lt; sorry for wasting your time. [[JSON_LAST]] = {{JIRA|BUG-4075}} -- &#039;&#039;&#039;[[User:Strife_Onizuka|Strife]]&#039;&#039;&#039; &amp;lt;sup&amp;gt;&amp;lt;small&amp;gt;([[User talk:Strife_Onizuka|talk]]|[[Special:Contributions/Strife_Onizuka|contribs]])&amp;lt;/small&amp;gt;&amp;lt;/sup&amp;gt; 06:47, 4 October 2013 (PDT)&lt;br /&gt;
&lt;br /&gt;
:::::Thanks for the useless link. I&#039;d have taken a look, but no perms. So I&#039;ll just hope someone will react to that. Not that anybody would to then ones I report. Have a nice one ;) -- [[User:Kireji Haiku|Kireji Haiku]] 06:54, 4 October 2013 (PDT)&lt;br /&gt;
&lt;br /&gt;
:::::: ^^; sorry -- &#039;&#039;&#039;[[User:Strife_Onizuka|Strife]]&#039;&#039;&#039; &amp;lt;sup&amp;gt;&amp;lt;small&amp;gt;([[User talk:Strife_Onizuka|talk]]|[[Special:Contributions/Strife_Onizuka|contribs]])&amp;lt;/small&amp;gt;&amp;lt;/sup&amp;gt; 07:05, 4 October 2013 (PDT)&lt;br /&gt;
&lt;br /&gt;
:::::::Nah, it&#039;s all good. I just don&#039;t like the way some of the Linden Lab staff reacts to user reports by first acknowledging bugs and then ignoring any help provided to actually get them fixed. Closing down the JIRA from the public doesn&#039;t help either. Anyhow, I&#039;ll stop rambling off-topic. Cya -- [[User:Kireji Haiku|Kireji Haiku]] 08:30, 4 October 2013 (PDT)&lt;br /&gt;
&lt;br /&gt;
:::::::: BUG-4075 is a feature request for a parameter &amp;quot;JSON_LAST&amp;quot; ;) --[[User:MartinRJ Fayray|MartinRJ Fayray]] 15:32, 18 October 2013 (PDT)&lt;br /&gt;
&lt;br /&gt;
== Vendor systems comparison ==&lt;br /&gt;
&lt;br /&gt;
Hi.&lt;br /&gt;
I&#039;ve tried to find the Titan vending system. It seems its no longer available. The SLURL ends in midair of a sim and you don&#039;t land at the vending center, as announced in the creators profile picks. Remove the system from the table?&lt;br /&gt;
--[[User:Mo Noel|Mo Noel]] 09:19, 25 November 2013 (PST)&lt;br /&gt;
&lt;br /&gt;
:Did you try contacting the creator? I personally wouldn&#039;t remove the system from the table as long as it still is working and people are using it. -- [[User:Kireji Haiku|Kireji Haiku]] 03:25, 8 December 2013 (PST)&lt;br /&gt;
&lt;br /&gt;
== PUBLIC_CHANNEL vs Zero ==&lt;br /&gt;
&lt;br /&gt;
Seeing as this topic hasn&#039;t settled down, it&#039;s time for the larger community to choose. I view their decision (even if it&#039;s Pie) as binding.&lt;br /&gt;
http://www.sluniverse.com/php/vb/scripting/91061-wiki-public_channel-vs-zero.html&lt;br /&gt;
-- &#039;&#039;&#039;[[User:Strife_Onizuka|Strife]]&#039;&#039;&#039; &amp;lt;sup&amp;gt;&amp;lt;small&amp;gt;([[User talk:Strife_Onizuka|talk]]|[[Special:Contributions/Strife_Onizuka|contribs]])&amp;lt;/small&amp;gt;&amp;lt;/sup&amp;gt; 00:15, 1 January 2014 (PST)&lt;br /&gt;
&lt;br /&gt;
All these attempts to hide the value of PUBLIC_CHANNEL need to stop. It&#039;s just spiteful Wiki editing. Any I find I&#039;m reverting. [[User:Darien Caldwell|Darien Caldwell]] 16:11, 8 January 2014 (PST)&lt;/div&gt;</summary>
		<author><name>Darien Caldwell</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Mesh/Avatar_Shape_XML_Format&amp;diff=1186655</id>
		<title>Mesh/Avatar Shape XML Format</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Mesh/Avatar_Shape_XML_Format&amp;diff=1186655"/>
		<updated>2014-01-08T23:56:04Z</updated>

		<summary type="html">&lt;p&gt;Darien Caldwell: Undo revision 1186198 by Kireji Haiku (Talk)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Navbox/Mesh|tech}}&lt;br /&gt;
== History ==&lt;br /&gt;
The Shape XML format has been ingrained in the viewer since the early days, long before mesh existed. However, with the addition of rigged mesh and customized clothing, the file has become invaluable to creators. Sometimes called an &amp;quot;archetype file&amp;quot; due to it&#039;s default name &amp;quot;new_archetype.xml&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
With the release of [[Project_Sunshine-Server_Side_Appearance|Server Side Appearance]] in Early 2013, The XML format has inherited additional information. However, it&#039;s XML version number is still 1.0, and it is still backward compatible with the original terse format. The additions will be outlined separately in the SSA Extensions section.&lt;br /&gt;
&lt;br /&gt;
== Header ==&lt;br /&gt;
The file is standard XML, with 3 parameters:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;xml&amp;gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;US-ASCII&amp;quot; standalone=&amp;quot;yes&amp;quot;?&amp;gt;&amp;lt;/xml&amp;gt;&lt;br /&gt;
** The &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter sets the version of the XML markup. (should always be 1.0)&lt;br /&gt;
** The &amp;lt;code&amp;gt;encoding&amp;lt;/code&amp;gt; parameter sets the character encoding for the file. (should always be US-ASCII)&lt;br /&gt;
** The &amp;lt;code&amp;gt;standalone&amp;lt;/code&amp;gt; parameter informs that the file is self-containted, and not dependent on any external files. (should always be yes)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note that some viewers&#039;&#039;&#039; set &amp;lt;code&amp;gt;standalone=&amp;quot;true&amp;quot;&amp;lt;/code&amp;gt;.  This is technically incorrect via the XML standard. It should be &amp;lt;code&amp;gt;standalone=&amp;quot;yes&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Root Node ==&lt;br /&gt;
&lt;br /&gt;
The root node is of type &amp;lt;code&amp;gt;linden_genepool&amp;lt;/code&amp;gt; with one parameter:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;xml&amp;gt;&amp;lt;linden_genepool version=&amp;quot;1.0&amp;quot;&amp;gt;&amp;lt;/xml&amp;gt;&lt;br /&gt;
** The &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter sets the version of the data contained in the node. Currently LL&#039;s data is version 1.0. Future revisions may increment this version, so any implementation should check this version number before using the data.&lt;br /&gt;
&lt;br /&gt;
== Data Body ==&lt;br /&gt;
&lt;br /&gt;
The Root node contains one node of type &amp;lt;code&amp;gt;archetype&amp;lt;/code&amp;gt; with one parameter.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;xml&amp;gt;&amp;lt;archetype name=&amp;quot;???&amp;quot;&amp;gt;&amp;lt;/xml&amp;gt;&lt;br /&gt;
** The &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; parameter is a information parameter, and can contain anything, or nothing. Most commonly populated with 3 question marks.&lt;br /&gt;
&lt;br /&gt;
== The Data ==&lt;br /&gt;
&lt;br /&gt;
The data inside is a list of parameters and textures associated with the Avatar&#039;s appearance. These can be broken up into 4 categories:&lt;br /&gt;
&lt;br /&gt;
* Shape&lt;br /&gt;
* Skin&lt;br /&gt;
* Hair&lt;br /&gt;
* Eyes&lt;br /&gt;
&lt;br /&gt;
Each category will have several &amp;lt;code&amp;gt;param&amp;lt;/code&amp;gt; nodes and possibly &amp;lt;code&amp;gt;texture&amp;lt;/code&amp;gt; nodes included. More about these nodes in the next section.&lt;br /&gt;
&lt;br /&gt;
== Param Nodes ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;param&amp;lt;/code&amp;gt; nodes correspond to sliders in the appearance pane. Each has 3 parameters:&lt;br /&gt;
*Example: &amp;lt;xml&amp;gt;&amp;lt;param id=&amp;quot;649&amp;quot; name=&amp;quot;torso muscles&amp;quot; value=&amp;quot;0.500&amp;quot;/&amp;gt;&amp;lt;/xml&amp;gt;&lt;br /&gt;
** The &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; parameter corresponds to an internal viewer table of possible sliders. These numbers are guaranteed to be unique, and always correspond to the same slider.&lt;br /&gt;
** The &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; parameter corresponds to internal &#039;driving elements&#039; in the viewer. This can vary depending on the type of param. For shapes, it&#039;s often the name of the morph being controlled. For skins or eyes, it&#039;s usually a material that&#039;s being changed (color etc).  For hair, a combination of both are present. These are &#039;&#039;&#039;not&#039;&#039;&#039; always unique. For example, there are two parameters called &amp;quot;torso muscles&amp;quot;, with different IDs (one for male, one for female).&lt;br /&gt;
** The &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; parameter is the value of the slider. It is however in the internally used format, not the 0-100 value seen by Residents. Calculating what these values mean requires finding the Minimum and Maximum of that value from other sources, such as the [[Avatar_Appearance#Linden_avatar_definition_file|Linden Avatar Definition File]] (avatar_lad.xml)&lt;br /&gt;
&lt;br /&gt;
== Texture Nodes ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;texture&amp;lt;/code&amp;gt; nodes correspond to textures applied via the appearance pane. Each has two parameters:&lt;br /&gt;
*Example: &amp;lt;xml&amp;gt;&amp;lt;texture te=&amp;quot;3&amp;quot; uuid=&amp;quot;00000000-0000-4000-8000-000000000000&amp;quot;/&amp;gt;&amp;lt;/xml&amp;gt;&lt;br /&gt;
** The &amp;lt;code&amp;gt;te&amp;lt;/code&amp;gt; parameter corresponds to an internal viewer table of possible textures. These numbers are guaranteed to be unique.&lt;br /&gt;
** The &amp;lt;code&amp;gt;uuid&amp;lt;/code&amp;gt; parameter corresponds to the [[UUID]] of the texture applied at the time of the XML creation.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note that &amp;lt;code&amp;gt;texture&amp;lt;/code&amp;gt; nodes are optional&#039;&#039;&#039; and not guaranteed to be present. Especially when the file is generated from 3rd party sources.&lt;br /&gt;
&lt;br /&gt;
== Comments ==&lt;br /&gt;
&lt;br /&gt;
Comments are styled in the standard HTML style, with the string &amp;lt;xml&amp;gt;&amp;lt;!--&amp;lt;/xml&amp;gt; denoting the start of a comment, and &amp;lt;xml&amp;gt;--&amp;gt;&amp;lt;/xml&amp;gt; denoting the end of a comment. This is per the XML specification.&lt;br /&gt;
*Example: &amp;lt;xml&amp;gt;&amp;lt;!-- wearable: shape --&amp;gt;&amp;lt;/xml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== File Termination ==&lt;br /&gt;
&lt;br /&gt;
The file is terminated by the closing of the &amp;lt;code&amp;gt;archetype&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;linden_genepool&amp;lt;/code&amp;gt; nodes:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;xml&amp;gt;&amp;lt;/archetype&amp;gt;&amp;lt;/linden_genepool&amp;gt;&amp;lt;/xml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SSA Extensions ==&lt;br /&gt;
The Two main changes with SSA are the addition of &#039;&#039;&#039;many&#039;&#039;&#039; new &amp;lt;code&amp;gt;param&amp;lt;/code&amp;gt; nodes , and the inclusion of new data in all &amp;lt;code&amp;gt;param&amp;lt;/code&amp;gt; nodes.&lt;br /&gt;
*The additional &amp;lt;code&amp;gt;param&amp;lt;/code&amp;gt; nodes now cover more than just the avatar&#039;s body shape and texture. Now, there is data for every possible avatar appearance modifier, including all clothes layers, alpha layers, tattoo layers, all internal morphs, and all settings for these items. In short there is every bit of data needed to completely recreate the entire avatar&#039;s &#039;look&#039;.&lt;br /&gt;
*The new parameters included in the &amp;lt;code&amp;gt;param&amp;lt;/code&amp;gt; nodes is &#039;&#039;in addition to&#039;&#039; the original parameters. All of the originally available parameters are still provided. The new parameters are as follows:&lt;br /&gt;
**The &amp;lt;code&amp;gt;u8&amp;lt;/code&amp;gt; parameter is a short integer normalized representation of the displayed slider value. Whereas before some complex math was necessary to determine what 0-100 slider value was indicated by the morph value in the &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; parameter, now you can simply take the u8 value, divide it by 255, then multiply that value by 100. That will give you the displayed slider values.  255 would be a slider value of 100, 128 would be a slider value of 50, and 0 would of course be 0.&lt;br /&gt;
**The &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; parameter is a rough indication of what kind of data the &amp;lt;code&amp;gt;param&amp;lt;/code&amp;gt; entry is associated with. There seem to be 5 distinct values, which likely correspond to entries in the [[Avatar_Appearance#Linden_avatar_definition_file|Linden Avatar Definition File]] (avatar_lad.xml)&lt;br /&gt;
*** param_morph, param_driver, param_skeleton, param_color, param_alpha&lt;br /&gt;
** The &amp;lt;code&amp;gt;wearable&amp;lt;/code&amp;gt; parameter further groups &amp;lt;code&amp;gt;param&amp;lt;/code&amp;gt; entries into distinct groups. These clearly indicate what avatar component the &amp;lt;code&amp;gt;param&amp;lt;/code&amp;gt; node is associated with. There seem to be 16 distinct values:&lt;br /&gt;
*** shape, hair, invalid, gloves, eyes, skin, pants, shoes, shirt, jacket, socks, underpants, undershirt, skirt, tattoo, physics&lt;br /&gt;
** The &amp;lt;code&amp;gt;invalid&amp;lt;/code&amp;gt; wearable indicates a morph.&lt;/div&gt;</summary>
		<author><name>Darien Caldwell</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Mesh/Avatar_Shape_XML_Format&amp;diff=1186654</id>
		<title>Mesh/Avatar Shape XML Format</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Mesh/Avatar_Shape_XML_Format&amp;diff=1186654"/>
		<updated>2014-01-08T23:55:24Z</updated>

		<summary type="html">&lt;p&gt;Darien Caldwell: Undo revision 1186194 by Kireji Haiku (Talk)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Navbox/Mesh|tech}}&lt;br /&gt;
== History ==&lt;br /&gt;
The Shape XML format has been ingrained in the viewer since the early days, long before mesh existed. However, with the addition of rigged mesh and customized clothing, the file has become invaluable to creators. Sometimes called an &amp;quot;archetype file&amp;quot; due to it&#039;s default name &amp;quot;new_archetype.xml&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
With the release of [[Project_Sunshine-Server_Side_Appearance|Server Side Appearance]] in Early 2013, The XML format has inherited additional information. However, it&#039;s XML version number is still &amp;lt;code&amp;gt;1.0&amp;lt;/code&amp;gt;, and it is still backward compatible with the original terse format. The additions will be outlined separately in the SSA Extensions section.&lt;br /&gt;
&lt;br /&gt;
== Header ==&lt;br /&gt;
The file is standard XML, with 3 parameters:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;xml&amp;gt;&amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;US-ASCII&amp;quot; standalone=&amp;quot;yes&amp;quot;?&amp;gt;&amp;lt;/xml&amp;gt;&lt;br /&gt;
** The &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter sets the version of the XML markup. (should always be set to &amp;lt;code&amp;gt;1.0&amp;lt;/code&amp;gt;)&lt;br /&gt;
** The &amp;lt;code&amp;gt;encoding&amp;lt;/code&amp;gt; parameter sets the character encoding for the file. (should always be set to &amp;lt;code&amp;gt;US-ASCII&amp;lt;/code&amp;gt;)&lt;br /&gt;
** The &amp;lt;code&amp;gt;standalone&amp;lt;/code&amp;gt; parameter informs that the file is self-containted, and not dependent on any external files. (should always be set to &amp;lt;code&amp;gt;yes&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note that some viewers&#039;&#039;&#039; set &amp;lt;code&amp;gt;standalone=&amp;quot;true&amp;quot;&amp;lt;/code&amp;gt;.  This is technically incorrect via the XML standard. It should be &amp;lt;code&amp;gt;standalone=&amp;quot;yes&amp;quot;&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
== Root Node ==&lt;br /&gt;
&lt;br /&gt;
The root node is of type &amp;lt;code&amp;gt;linden_genepool&amp;lt;/code&amp;gt; with one parameter:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;xml&amp;gt;&amp;lt;linden_genepool version=&amp;quot;1.0&amp;quot;&amp;gt;&amp;lt;/xml&amp;gt;&lt;br /&gt;
** The &amp;lt;code&amp;gt;version&amp;lt;/code&amp;gt; parameter sets the version of the data contained in the node. Currently LL&#039;s data is version &amp;lt;code&amp;gt;1.0&amp;lt;/code&amp;gt;. Future revisions may increment this version, so any implementation should check this version number before using the data.&lt;br /&gt;
&lt;br /&gt;
== Data Body ==&lt;br /&gt;
&lt;br /&gt;
The Root node contains one node of type &amp;lt;code&amp;gt;archetype&amp;lt;/code&amp;gt; with one parameter.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;xml&amp;gt;&amp;lt;archetype name=&amp;quot;???&amp;quot;&amp;gt;&amp;lt;/xml&amp;gt;&lt;br /&gt;
** The &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; parameter is a information parameter, and can contain anything, or nothing. Most commonly populated with 3 question marks.&lt;br /&gt;
&lt;br /&gt;
== The Data ==&lt;br /&gt;
&lt;br /&gt;
The data inside is a list of parameters and textures associated with the Avatar&#039;s appearance. These can be broken up into 4 categories:&lt;br /&gt;
&lt;br /&gt;
* Shape&lt;br /&gt;
* Skin&lt;br /&gt;
* Hair&lt;br /&gt;
* Eyes&lt;br /&gt;
&lt;br /&gt;
Each category will have several &amp;lt;code&amp;gt;param&amp;lt;/code&amp;gt; nodes and possibly &amp;lt;code&amp;gt;texture&amp;lt;/code&amp;gt; nodes included. More about these nodes in the next section.&lt;br /&gt;
&lt;br /&gt;
== Param Nodes ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;param&amp;lt;/code&amp;gt; nodes correspond to sliders in the appearance pane. Each has 3 parameters:&lt;br /&gt;
*Example: &amp;lt;xml&amp;gt;&amp;lt;param id=&amp;quot;649&amp;quot; name=&amp;quot;torso muscles&amp;quot; value=&amp;quot;0.500&amp;quot;/&amp;gt;&amp;lt;/xml&amp;gt;&lt;br /&gt;
** The &amp;lt;code&amp;gt;id&amp;lt;/code&amp;gt; parameter corresponds to an internal viewer table of possible sliders. These numbers are guaranteed to be unique, and always correspond to the same slider.&lt;br /&gt;
** The &amp;lt;code&amp;gt;name&amp;lt;/code&amp;gt; parameter corresponds to internal &#039;driving elements&#039; in the viewer. This can vary depending on the type of param. For shapes, it&#039;s often the name of the morph being controlled. For skins or eyes, it&#039;s usually a material that&#039;s being changed (color etc).  For hair, a combination of both are present. These are &#039;&#039;&#039;not&#039;&#039;&#039; always unique. For example, there are two parameters called &amp;quot;torso muscles&amp;quot;, with different IDs (one for male, one for female).&lt;br /&gt;
** The &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; parameter is the value of the slider. It is however in the internally used format, not the 0-100 value seen by Residents. Calculating what these values mean requires finding the Minimum and Maximum of that value from other sources, such as the [[Avatar_Appearance#Linden_avatar_definition_file|Linden Avatar Definition File]] (avatar_lad.xml)&lt;br /&gt;
&lt;br /&gt;
== Texture Nodes ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;code&amp;gt;texture&amp;lt;/code&amp;gt; nodes correspond to textures applied via the appearance pane. Each has two parameters:&lt;br /&gt;
*Example: &amp;lt;xml&amp;gt;&amp;lt;texture te=&amp;quot;3&amp;quot; uuid=&amp;quot;00000000-0000-4000-8000-000000000000&amp;quot;/&amp;gt;&amp;lt;/xml&amp;gt;&lt;br /&gt;
** The &amp;lt;code&amp;gt;te&amp;lt;/code&amp;gt; parameter corresponds to an internal viewer table of possible textures. These numbers are guaranteed to be unique.&lt;br /&gt;
** The &amp;lt;code&amp;gt;uuid&amp;lt;/code&amp;gt; parameter corresponds to the [[UUID]] of the texture applied at the time of the XML creation.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note that &amp;lt;code&amp;gt;texture&amp;lt;/code&amp;gt; nodes are optional&#039;&#039;&#039; and not guaranteed to be present. Especially when the file is generated from 3rd party sources.&lt;br /&gt;
&lt;br /&gt;
== Comments ==&lt;br /&gt;
&lt;br /&gt;
Comments are styled in the standard HTML style, with the string &amp;lt;xml&amp;gt;&amp;lt;!--&amp;lt;/xml&amp;gt; denoting the start of a comment, and &amp;lt;xml&amp;gt;--&amp;gt;&amp;lt;/xml&amp;gt; denoting the end of a comment. This is per the XML specification.&lt;br /&gt;
*Example: &amp;lt;xml&amp;gt;&amp;lt;!-- wearable: shape --&amp;gt;&amp;lt;/xml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== File Termination ==&lt;br /&gt;
&lt;br /&gt;
The file is terminated by the closing of the &amp;lt;code&amp;gt;archetype&amp;lt;/code&amp;gt; and &amp;lt;code&amp;gt;linden_genepool&amp;lt;/code&amp;gt; nodes:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;xml&amp;gt;&amp;lt;/archetype&amp;gt;&amp;lt;/linden_genepool&amp;gt;&amp;lt;/xml&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SSA Extensions ==&lt;br /&gt;
The Two main changes with SSA are the addition of &#039;&#039;&#039;many&#039;&#039;&#039; new &amp;lt;code&amp;gt;param&amp;lt;/code&amp;gt; nodes , and the inclusion of new data in all &amp;lt;code&amp;gt;param&amp;lt;/code&amp;gt; nodes.&lt;br /&gt;
*The additional &amp;lt;code&amp;gt;param&amp;lt;/code&amp;gt; nodes now cover more than just the avatar&#039;s body shape and texture. Now, there is data for every possible avatar appearance modifier, including all clothes layers, alpha layers, tattoo layers, all internal morphs, and all settings for these items. In short there is every bit of data needed to completely recreate the entire avatar&#039;s &#039;look&#039;.&lt;br /&gt;
*The new parameters included in the &amp;lt;code&amp;gt;param&amp;lt;/code&amp;gt; nodes is &#039;&#039;in addition to&#039;&#039; the original parameters. All of the originally available parameters are still provided. The new parameters are as follows:&lt;br /&gt;
**The &amp;lt;code&amp;gt;u8&amp;lt;/code&amp;gt; parameter is a short integer normalized representation of the displayed slider value. Whereas before some complex math was necessary to determine what 0-100 slider value was indicated by the morph value in the &amp;lt;code&amp;gt;value&amp;lt;/code&amp;gt; parameter, now you can simply take the u8 value, divide it by 255, then multiply that value by 100. That will give you the displayed slider values.  255 would be a slider value of 100, 128 would be a slider value of 50, and 0 would of course be 0.&lt;br /&gt;
**The &amp;lt;code&amp;gt;type&amp;lt;/code&amp;gt; parameter is a rough indication of what kind of data the &amp;lt;code&amp;gt;param&amp;lt;/code&amp;gt; entry is associated with. There seem to be 5 distinct values, which likely correspond to entries in the [[Avatar_Appearance#Linden_avatar_definition_file|Linden Avatar Definition File]] (avatar_lad.xml)&lt;br /&gt;
*** param_morph, param_driver, param_skeleton, param_color, param_alpha&lt;br /&gt;
** The &amp;lt;code&amp;gt;wearable&amp;lt;/code&amp;gt; parameter further groups &amp;lt;code&amp;gt;param&amp;lt;/code&amp;gt; entries into distinct groups. These clearly indicate what avatar component the &amp;lt;code&amp;gt;param&amp;lt;/code&amp;gt; node is associated with. There seem to be 16 distinct values:&lt;br /&gt;
*** shape, hair, invalid, gloves, eyes, skin, pants, shoes, shirt, jacket, socks, underpants, undershirt, skirt, tattoo, physics&lt;br /&gt;
** The &amp;lt;code&amp;gt;invalid&amp;lt;/code&amp;gt; wearable indicates a morph.&lt;/div&gt;</summary>
		<author><name>Darien Caldwell</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlGetObjectName&amp;diff=1186652</id>
		<title>LlGetObjectName</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlGetObjectName&amp;diff=1186652"/>
		<updated>2014-01-08T23:53:47Z</updated>

		<summary type="html">&lt;p&gt;Darien Caldwell: Undo revision 1186176 by Kireji Haiku (Talk)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function&lt;br /&gt;
|inject-2={{LSL_Function/limits}}&lt;br /&gt;
|func_id=202|func_sleep=0.0|func_energy=10.0&lt;br /&gt;
|func=llGetObjectName&lt;br /&gt;
|return_type=string&lt;br /&gt;
|func_footnote&lt;br /&gt;
|func_desc&lt;br /&gt;
|return_text=that is the name of the prim the script is attached to.&lt;br /&gt;
|spec&lt;br /&gt;
|caveats=*The prim name is limited to 63 bytes, any string longer than that will be truncated. This truncation does not always happen when the attribute is set or read.&lt;br /&gt;
{{LSL Tip|This function &#039;&#039;&#039;does not&#039;&#039;&#039; get the name of the object&#039;s rootprim, but the name of the prim containing the script. Please use [[llGetLinkName]]([[LINK_ROOT]]); instead.}}&lt;br /&gt;
|constants&lt;br /&gt;
|examples=&lt;br /&gt;
{{{!}} class=&amp;quot;sortable&amp;quot; width=&amp;quot;100%&amp;quot; {{Prettytable}}&lt;br /&gt;
{{!}}- {{Hl2}}&lt;br /&gt;
! &#039;&#039;&#039;Get this prim&#039;s name&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Get the root prim&#039;s name&#039;&#039;&#039;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!!}}&amp;lt;lsl&amp;gt;&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
    //  PUBLIC_CHANNEL has the integer value 0&lt;br /&gt;
        llSay(PUBLIC_CHANNEL, &amp;quot;This prim&#039;s name: &amp;quot; + llGetObjectName() );&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
{{!!}}&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
    //  PUBLIC_CHANNEL has the integer value 0&lt;br /&gt;
        llSay(PUBLIC_CHANNEL, &amp;quot;Root prim&#039;s name: &amp;quot;&lt;br /&gt;
            + llGetLinkName(LINK_ROOT));&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
{{!}}}&lt;br /&gt;
|helpers&lt;br /&gt;
|also_functions=&lt;br /&gt;
{{LSL DefineRow||[[llSetObjectName]]|Set the prims name}}&lt;br /&gt;
{{LSL DefineRow||[[llGetLinkName]]|Get a linked prims name}}&lt;br /&gt;
{{LSL DefineRow||[[llGetObjectDesc]]|Get the prims description}}&lt;br /&gt;
{{LSL DefineRow||[[llSetObjectDesc]]|Sets the prims description}}&lt;br /&gt;
{{LSL DefineRow||[[llGetObjectDetails]]}}&lt;br /&gt;
|also_tests&lt;br /&gt;
|also_events&lt;br /&gt;
|also_articles=&lt;br /&gt;
{{LSL DefineRow||[[Prim Attribute Overloading]]}}&lt;br /&gt;
|notes=*This function may return &amp;quot;(Waiting)&amp;quot; sometimes.&lt;br /&gt;
Presumably the function queries the asset server for a predetermined time and returns &amp;quot;(Waiting)&amp;quot; if that elapses.&lt;br /&gt;
It then silently proceeds to the next instruction.&lt;br /&gt;
A work around therefore, might be to test object name is not &amp;quot;(Waiting)&amp;quot; after calling llGetObjectName.&lt;br /&gt;
|cat1=Prim&lt;br /&gt;
|cat2&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Darien Caldwell</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlGetObjectDesc&amp;diff=1186651</id>
		<title>LlGetObjectDesc</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlGetObjectDesc&amp;diff=1186651"/>
		<updated>2014-01-08T23:52:58Z</updated>

		<summary type="html">&lt;p&gt;Darien Caldwell: Undo revision 1186174 by Kireji Haiku (Talk)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function&lt;br /&gt;
|inject-2={{LSL_Function/prim-desc}}&lt;br /&gt;
|func_id=270|func_sleep=0.0|func_energy=10.0&lt;br /&gt;
|func=llGetObjectDesc&lt;br /&gt;
|return_type=string&lt;br /&gt;
|func_footnote=To get the &#039;&#039;object&#039;s&#039;&#039; description (not the current prim&#039;s), use [[PRIM_DESC]] or [[OBJECT_DESC]].&lt;br /&gt;
|func_desc&lt;br /&gt;
|return_text=containing the description of the prim the script is attached to.&lt;br /&gt;
|spec&lt;br /&gt;
|caveats=&lt;br /&gt;
{{LSL Tip|This function &#039;&#039;&#039;does not&#039;&#039;&#039; get the description of the object&#039;s rootprim, but the description of the prim containing the script. Please use [[llList2String]]([[llGetLinkPrimitiveParams]]([[LINK_ROOT]], [ [[PRIM_DESC]] ]), 0); instead.}}&lt;br /&gt;
|constants&lt;br /&gt;
|examples=&lt;br /&gt;
{{{!}} class=&amp;quot;sortable&amp;quot; width=&amp;quot;100%&amp;quot; {{Prettytable}}&lt;br /&gt;
{{!}}- {{Hl2}}&lt;br /&gt;
! &#039;&#039;&#039;Get this prim&#039;s description&#039;&#039;&#039;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!!}}&amp;lt;lsl&amp;gt;&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
    //  PUBLIC_CHANNEL has the integer value 0&lt;br /&gt;
        llSay(PUBLIC_CHANNEL, &amp;quot;This prim&#039;s description: &amp;quot; + llGetObjectDesc() );&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
{{!}}}&lt;br /&gt;
&lt;br /&gt;
{{{!}} class=&amp;quot;sortable&amp;quot; width=&amp;quot;100%&amp;quot; {{Prettytable}}&lt;br /&gt;
{{!}}- {{Hl2}}&lt;br /&gt;
! &#039;&#039;&#039;Get the root prim&#039;s description&#039;&#039;&#039;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!!}}&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
    //  PUBLIC_CHANNEL has the integer value 0&lt;br /&gt;
        llSay(PUBLIC_CHANNEL, &amp;quot;Rootprim&#039;s description: &amp;quot;&lt;br /&gt;
            + llList2String(llGetLinkPrimitiveParams(LINK_ROOT, [ PRIM_DESC ]), 0));&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
{{!}}}&lt;br /&gt;
|helpers&lt;br /&gt;
|also_functions=&lt;br /&gt;
{{LSL DefineRow||[[llSetObjectDesc]]|Sets the prim description.}}&lt;br /&gt;
{{LSL DefineRow||[[llGetObjectName]]|Gets the prim name.}}&lt;br /&gt;
{{LSL DefineRow||[[llSetObjectName]]|Sets the prim name.}}&lt;br /&gt;
{{LSL DefineRow||[[llGetObjectDetails]]}}&lt;br /&gt;
|also_events&lt;br /&gt;
|also_articles=&lt;br /&gt;
{{LSL DefineRow||[[Prim Attribute Overloading]]}}&lt;br /&gt;
|notes&lt;br /&gt;
|cat1=Prim&lt;br /&gt;
|cat2=Description&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Darien Caldwell</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlWhisper&amp;diff=1186650</id>
		<title>LlWhisper</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlWhisper&amp;diff=1186650"/>
		<updated>2014-01-08T23:52:06Z</updated>

		<summary type="html">&lt;p&gt;Darien Caldwell: Undo revision 1186170 by Kireji Haiku (Talk)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function&lt;br /&gt;
|inject-2={{LSL_Function/chat|channel|msg}}&lt;br /&gt;
|func_id=22&lt;br /&gt;
|func_sleep=0.0&lt;br /&gt;
|func_energy=10.0&lt;br /&gt;
|func=llWhisper&lt;br /&gt;
|sort=Whisper&lt;br /&gt;
|p1_type=integer|p1_name=channel&lt;br /&gt;
|p2_type=string|p2_name=msg&lt;br /&gt;
|func_desc=Whispers the text supplied in string {{LSLP|msg}} on channel supplied in integer {{LSLP|channel}}.&lt;br /&gt;
|return_text&lt;br /&gt;
|spec&lt;br /&gt;
|constants&lt;br /&gt;
|caveats=*Text can be a maximum of 1024 bytes. This can convey 1024 ASCII characters, or 512 UTF-8 characters such as á&lt;br /&gt;
*Whispers can only be heard within 10 meters of the speaking prim (rather than the root). This is contrary to how [[listen]]s work, where a message can only be heard by any prim in the object if and only if the root prim is capable of hearing it.&lt;br /&gt;
*A prim can &#039;&#039;&#039;not&#039;&#039;&#039; hear itself, this to prevent problems with recursion. It can however hear other prims within the same object.&lt;br /&gt;
|examples=&lt;br /&gt;
For better readability of your code, you can make use of certain mnemonic constants such as [[PUBLIC_CHANNEL]] instead of channel 0 and [[DEBUG_CHANNEL]] instead of channel +2,147,483,647.&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        // PUBLIC_CHANNEL has the integer value 0&lt;br /&gt;
        llWhisper(PUBLIC_CHANNEL, &amp;quot;This is an incredibly useless program.&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
For communicating with the user or owner it is preferable to use [[llOwnerSay]] or [[llInstantMessage]] or [[llRegionSayTo]] as they won&#039;t spam other users.&lt;br /&gt;
|helpers&lt;br /&gt;
|also_events={{LSL DefineRow||[[listen]]|}}&lt;br /&gt;
|also_functions=&lt;br /&gt;
{{LSL DefineRow||[[llListen]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llOwnerSay]]|}}&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||[[llInstantMessage]]|}}&lt;br /&gt;
|also&lt;br /&gt;
|notes&lt;br /&gt;
|cat1=Communications&lt;br /&gt;
|cat2=Chat&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Darien Caldwell</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlShout&amp;diff=1186649</id>
		<title>LlShout</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlShout&amp;diff=1186649"/>
		<updated>2014-01-08T23:51:47Z</updated>

		<summary type="html">&lt;p&gt;Darien Caldwell: Undo revision 1186171 by Kireji Haiku (Talk)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function&lt;br /&gt;
|inject-2={{LSL_Function/chat|channel|msg}}&lt;br /&gt;
|func_id=24&lt;br /&gt;
|func_sleep=0.0&lt;br /&gt;
|func_energy=10.0&lt;br /&gt;
|func=llShout&lt;br /&gt;
|sort=Shout&lt;br /&gt;
|p1_type=integer|p1_name=channel&lt;br /&gt;
|p2_type=string|p2_name=msg&lt;br /&gt;
|func_desc=Shouts the text supplied in string {{LSLP|msg}} on channel supplied in integer {{LSLP|channel}}.&lt;br /&gt;
|spec&lt;br /&gt;
|constants&lt;br /&gt;
|caveats=*Text can be a maximum of 1024 bytes. This can convey 1024 ASCII characters, or 512 UTF-8 characters such as á&lt;br /&gt;
*Shouts can be heard within 100 meters of the speaking prim (rather than the root). This is contrary to how [[listen]]s work, where a message can only be heard by any prim in the object if and only if the root prim is capable of hearing it.&lt;br /&gt;
*A prim can &#039;&#039;&#039;not&#039;&#039;&#039; hear itself, this to prevent problems with recursion. It can however hear other prims within the same object.&lt;br /&gt;
|examples=&lt;br /&gt;
For better readability of your code, you can make use of certain mnemonic constants such as [[PUBLIC_CHANNEL]] instead of channel 0 and [[DEBUG_CHANNEL]] instead of channel +2,147,483,647.&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        // PUBLIC_CHANNEL has the integer value 0&lt;br /&gt;
        llShout(PUBLIC_CHANNEL,&amp;quot;I scream icecream!&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
For communicating with a user or owner it is preferable to use  [[llOwnerSay]] or [[llInstantMessage]] or [[llRegionSayTo]] as they won&#039;t spam other users.&lt;br /&gt;
The latter is also an excellent choice for communicating to an attachment of a known avatar, or to an object of known UUID.&lt;br /&gt;
|helpers&lt;br /&gt;
|also_events={{LSL DefineRow||[[listen]]|}}&lt;br /&gt;
|also_functions=&lt;br /&gt;
{{LSL DefineRow||[[llListen]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llOwnerSay]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llRegionSay]]|Sends chat region wide}}&lt;br /&gt;
{{LSL DefineRow||[[llRegionSayTo]]|Sends chat region wide to a specific avatar, or their attachments, or to a rezzed object of known UUID}}&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||[[llInstantMessage]]|}}&lt;br /&gt;
|also_tests&lt;br /&gt;
|also_articles&lt;br /&gt;
|notes&lt;br /&gt;
|cat1=Communications&lt;br /&gt;
|cat2=Chat&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Darien Caldwell</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlWhisper&amp;diff=1186648</id>
		<title>LlWhisper</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlWhisper&amp;diff=1186648"/>
		<updated>2014-01-08T23:51:28Z</updated>

		<summary type="html">&lt;p&gt;Darien Caldwell: Undo revision 1186169 by Kireji Haiku (Talk)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL_Function&lt;br /&gt;
|inject-2={{LSL_Function/chat|channel|msg}}&lt;br /&gt;
|func_id=22&lt;br /&gt;
|func_sleep=0.0&lt;br /&gt;
|func_energy=10.0&lt;br /&gt;
|func=llWhisper&lt;br /&gt;
|sort=Whisper&lt;br /&gt;
|p1_type=integer|p1_name=channel&lt;br /&gt;
|p2_type=string|p2_name=msg&lt;br /&gt;
|func_desc=Whispers the text supplied in string {{LSLP|msg}} on channel supplied in integer {{LSLP|channel}}.&lt;br /&gt;
|return_text&lt;br /&gt;
|spec&lt;br /&gt;
|constants&lt;br /&gt;
|caveats=*Text can be a maximum of 1024 bytes. This can convey 1024 ASCII characters, or 512 UTF-8 characters such as á&lt;br /&gt;
*Whispers can only be heard within 10 meters of the speaking prim (rather than the root). This is contrary to how [[listen]]s work, where a message can only be heard by any prim in the object if and only if the root prim is capable of hearing it.&lt;br /&gt;
*A prim can &#039;&#039;&#039;not&#039;&#039;&#039; hear itself, this to prevent problems with recursion. It can however hear other prims within the same object.&lt;br /&gt;
|examples=&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
    state_entry()&lt;br /&gt;
    {&lt;br /&gt;
        // PUBLIC_CHANNEL has the integer value 0&lt;br /&gt;
        llWhisper(PUBLIC_CHANNEL, &amp;quot;This is an incredibly useless program.&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
}&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
For communicating with the user or owner it is preferable to use [[llOwnerSay]] or [[llInstantMessage]] or [[llRegionSayTo]] as they won&#039;t spam other users.&lt;br /&gt;
|helpers&lt;br /&gt;
|also_events={{LSL DefineRow||[[listen]]|}}&lt;br /&gt;
|also_functions=&lt;br /&gt;
{{LSL DefineRow||[[llListen]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llOwnerSay]]|}}&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||[[llInstantMessage]]|}}&lt;br /&gt;
|also&lt;br /&gt;
|notes&lt;br /&gt;
|cat1=Communications&lt;br /&gt;
|cat2=Chat&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Darien Caldwell</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Mesh/Rigging_Fitted_Mesh&amp;diff=1185304</id>
		<title>Mesh/Rigging Fitted Mesh</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Mesh/Rigging_Fitted_Mesh&amp;diff=1185304"/>
		<updated>2013-12-19T22:47:16Z</updated>

		<summary type="html">&lt;p&gt;Darien Caldwell: Added lower/upper back bones to list&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Navbox/Mesh-all}}&lt;br /&gt;
__TOC__&lt;br /&gt;
&amp;lt;div style=&amp;quot;margin: 10px; padding: 0 10px 10px 10px; border: 1px solid #dddddd; background-color: #f9f9f9; width: 256px;&amp;quot;&amp;gt;&lt;br /&gt;
===Download links===&lt;br /&gt;
[http://lecs.opensource.secondlife.com/fittedmesh/SecondLifeAvatarSkeleton.zip Second Life Skeletons]&lt;br /&gt;
&lt;br /&gt;
Includes the male and female models in the following formats:&lt;br /&gt;
 .ma&lt;br /&gt;
 .fbx&lt;br /&gt;
 .blend&lt;br /&gt;
 .dae&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===What is Fitted Mesh?===&lt;br /&gt;
Fitted Mesh is a technique in which an avatar&#039;s collision bones are used to add further deformation detail to an avatar or clothing. The benefit of this technique is that it allows [http://wiki.secondlife.com/wiki/Mesh/Basics Mesh] clothing and avatars to be adjusted using an avatar&#039;s Body Shape sliders in the Appearance Editor. This results in clothing that can adjust and fit to your avatar&#039;s own personal body shape and style.&lt;br /&gt;
&lt;br /&gt;
For content creators, the key difference between a Fitted Mesh skeleton and the previous standard skeleton is that a Fitted Mesh skeleton has more bones. The rigging workflow is the same except that the additional collision bones are also included in the skinning/binding process. Note that unlike the mBones, you do not need to include all of the collision bones, rather only the ones you wish to use.&lt;br /&gt;
&lt;br /&gt;
{{KBtip|For the best results and to avoid unsightly clipping, you should use [http://nicolaescher.com/tutorials/alpha-channel-primer alpha masks] to hide areas covered by mesh on your avatar.}}&lt;br /&gt;
{{KBnote|As of November 20, 2013, Fitted Mesh requires Second Life Project Viewer version 3.6.11.283899, which can be downloaded [https://wiki.secondlife.com/wiki/Release_Notes/Second_Life_Project_FittedMesh/3.6.11.283899 here].}}&lt;br /&gt;
&lt;br /&gt;
===Collision bones===&lt;br /&gt;
====List of original collision bones:====&lt;br /&gt;
* PELVIS&lt;br /&gt;
* BELLY&lt;br /&gt;
* CHEST&lt;br /&gt;
* NECK&lt;br /&gt;
* HEAD&lt;br /&gt;
* L_CLAVICLE&lt;br /&gt;
* L_UPPER_ARM&lt;br /&gt;
* L_LOWER_ARM&lt;br /&gt;
* L_HAND&lt;br /&gt;
* R_CLAVICLE&lt;br /&gt;
* R_UPPER_ARM&lt;br /&gt;
* R_LOWER_ARM&lt;br /&gt;
* R_HAND&lt;br /&gt;
* L_UPPER_LEG&lt;br /&gt;
* L_LOWER_LEG&lt;br /&gt;
* L_FOOT&lt;br /&gt;
* R_UPPER_LEG&lt;br /&gt;
* R_LOWER_LEG&lt;br /&gt;
* R_FOOT&lt;br /&gt;
&lt;br /&gt;
====Collision bones added with Fitted Mesh====&lt;br /&gt;
* BUTT *&lt;br /&gt;
* LEFT_PEC *&lt;br /&gt;
* RIGHT_PEC *&lt;br /&gt;
* LEFT_HANDLE&lt;br /&gt;
* RIGHT_HANDLE&lt;br /&gt;
* LOWER_BACK&lt;br /&gt;
* UPPER_BACK&lt;br /&gt;
&lt;br /&gt;
{{KBnote|BUTT, LEFT_PEC, and RIGHT_PEC are affected by [http://community.secondlife.com/t5/English-Knowledge-Base/Controlling-your-avatar-s-appearance/ta-p/700709#Section_.3 avatar physics].}}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Rigging using the Fitted Mesh technique===&lt;br /&gt;
# Download one of the [[#Download_links|skeleton files]].&lt;br /&gt;
# Follow one of the many tutorials for rigging avatars in your modeling program of choice.&lt;br /&gt;
#* Links to video tutorials on rigging mesh avatars in Maya and Blender can be found in [http://wiki.secondlife.com/wiki/Mesh/Uploading_and_wearing_a_rigged_mesh#Creating_a_rigged_avatar Uploading and wearing a rigged mesh].&lt;br /&gt;
# Export your new rigged mesh from your modeling program of choice:&lt;br /&gt;
#* [http://wiki.secondlife.com/wiki/Mesh/Exporting_a_mesh_from_Blender Exporting a mesh from Blender]&lt;br /&gt;
#* [http://wiki.secondlife.com/wiki/Mesh/Exporting_a_mesh_from_3ds_Max  Exporting a mesh from 3DS Max]&lt;br /&gt;
#* [http://wiki.secondlife.com/wiki/Mesh/Exporting_a_mesh_from_Maya Exporting a mesh from Maya]&lt;br /&gt;
# Import the rigged mesh to Second Life and wear the model, as described in [http://wiki.secondlife.com/wiki/Mesh/Uploading_and_wearing_a_rigged_mesh Uploading an wearing a rigged mesh].&lt;br /&gt;
# Adjust your body shape, make sure to save your changes, and enjoy your creation.&lt;br /&gt;
#* Information on changing your avatar’s appearance and body shape can be found in the Second Life Knowledge Base, under [http://community.secondlife.com/t5/English-Knowledge-Base/Controlling-your-avatar-s-appearance/ta-p/700709#Section_.2 Controlling your avatar’s appearance], and by clicking the &#039;&#039;&#039;?&#039;&#039;&#039; button at the top of the Appearance editor.&lt;br /&gt;
&lt;br /&gt;
===Additional resources===&lt;br /&gt;
* [http://wiki.secondlife.com/wiki/Mesh/Exporting_a_mesh_from_Blender Exporting a mesh from Blender]&lt;br /&gt;
* [http://wiki.secondlife.com/wiki/Mesh/Exporting_a_mesh_from_3ds_Max Exporting a mesh from 3DS Max]&lt;br /&gt;
* [http://wiki.secondlife.com/wiki/Mesh/Exporting_a_mesh_from_Maya Exporting a mesh from Maya]&lt;br /&gt;
* [http://wiki.secondlife.com/wiki/Mesh/Uploading_and_wearing_a_rigged_mesh Uploading and wearing a rigged mesh]&lt;br /&gt;
* [http://community.secondlife.com/t5/Mesh/Ways-to-fix-a-problematic-Avatar-Rig/td-p/1947773 Ways to fix a problematic Avatar Rig]&lt;br /&gt;
* [http://wiki.secondlife.com/wiki/Clothing_Tutorials Clothing Tutorials]&lt;br /&gt;
* [http://community.secondlife.com/t5/English-Knowledge-Base/Controlling-your-avatar-s-appearance/ta-p/700709 Controlling your avatar&#039;s appearance]&lt;/div&gt;</summary>
		<author><name>Darien Caldwell</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=PRIM_TYPE&amp;diff=1184034</id>
		<title>PRIM TYPE</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=PRIM_TYPE&amp;diff=1184034"/>
		<updated>2013-11-27T00:50:09Z</updated>

		<summary type="html">&lt;p&gt;Darien Caldwell: fix typo&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;onlyinclude&amp;gt;{{#if:&lt;br /&gt;
&lt;br /&gt;
{{#vardefine:p_type_flag_desc|PRIM_TYPE_* flag}}&lt;br /&gt;
{{#vardefine:p_type_parameters_hover|a list consisting of the parameters of the PRIM_TYPE_* flag}}&lt;br /&gt;
{{#vardefine:p_type_parameters_desc|a list consisting of the parameters of {{LSLP|flag}}}}&lt;br /&gt;
&lt;br /&gt;
{{#vardefine:p_hole_shape_desc|PRIM_HOLE_* flag}}&lt;br /&gt;
{{#vardefine:p_cut_desc|x and y range from 0.0 to 1.0, x must be at least 0.05 smaller than y (z is ignored)}}&lt;br /&gt;
{{#vardefine:p_hollow_desc|ranges from 0.0 (solid) to 0.95 (maximum hollowed)}}&lt;br /&gt;
{{#vardefine:p_twist_box_desc|ranges from -0.5 (-180 degree in the edit window) to 0.5 (+180 degree in the edit window) for both x and y (z is ignored)}}&lt;br /&gt;
{{#vardefine:p_twist_torus_desc|ranges from -1.0 (-360 degree in the edit window) to 1.0 (+360 degree in the edit window) for both x and y (z is ignored)}}&lt;br /&gt;
{{#vardefine:p_hole_size_desc|x ranges from 0.05 to 1.0; y ranges from 0.05 (large hole) to 0.50 (no hole)}}&lt;br /&gt;
&lt;br /&gt;
{{#vardefine:p_top_size_hover|ranges from 0.0 (top fully tapered) to 1.0 (no tapering) for both x and y (z is ignored); see Caveats about the differences between the client and scripting range for this value}}&lt;br /&gt;
{{#vardefine:p_top_size_desc|ranges from {{HoverText|0.0|Top fully tapered}} to {{HoverText|1.0|No tapering}} for both x and y (z is ignored)[[#z_taper|&amp;lt;span style=&amp;quot;color:red;&amp;quot; title=&amp;quot;The values for in the client and scripting are different!&amp;quot;&amp;gt;!&amp;lt;/span&amp;gt;]]}}&lt;br /&gt;
{{#vardefine:p_z_taper_hover|ranges from 0.0 (top fully tapered) to 1.0 (no tapering) to 2.0 (bottom fully tapered) for both x and y (z is ignored); see Caveats about the differences between the client and scripting range for this value}}&lt;br /&gt;
{{#vardefine:p_z_taper_desc|ranges from {{HoverText|0.0|Top fully tapered}} to {{HoverText|1.0|No tapering}} to {{HoverText|2.0|Bottom fully tapered}} for both x and y (z is ignored)[[#z_taper|&amp;lt;span style=&amp;quot;color:red;&amp;quot; title=&amp;quot;The values for in the client and scripting are different!&amp;quot;&amp;gt;!&amp;lt;/span&amp;gt;]]}}&lt;br /&gt;
&lt;br /&gt;
{{#vardefine:p_top_shear_desc|ranges from -0.5 to 0.5 for both x and y (z is ignored)}}&lt;br /&gt;
{{#vardefine:p_taper_desc|ranges from -1.0 to 1.0 for both x and y (z is ignored)}}&lt;br /&gt;
{{#vardefine:p_revolutions_desc|ranges from 1.0 to 4.00}}&lt;br /&gt;
{{#vardefine:p_radius_offset_desc|depends on holesize.y and revolutions}}&lt;br /&gt;
{{#vardefine:p_skew_desc|ranges from -1.0 to 1.0}}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;!-- The old PRIM_TYPE (PRIM_TYPE_LEGACY) variables --&amp;gt;&lt;br /&gt;
{{#vardefine:p_twist_end_desc|ranges from -0.5 (-180 degree in the edit window) to 0.5 (+180 degree in the edit window)}}&lt;br /&gt;
{{#vardefine:p_hole_size_y_desc|ranges from 0.05 (large hole) to 0.50 (no hole)}}&lt;br /&gt;
{{#vardefine:p_topshear_x_desc|ranges from 0.05 to 0.50}}&lt;br /&gt;
&lt;br /&gt;
{{#vardefine:type_const|{{LSL Const|PRIM_TYPE|integer|9|c=Used to {{GetSet|{{{1|}}}|get|set|/}} the the type of prim.}}}}&lt;br /&gt;
&lt;br /&gt;
{{#vardefine:caveats-set|{{#var:caveats-set}}&lt;br /&gt;
* {{#var:type_const}} can only be used with [[LINK_SET]] if the object contains 10 or fewer prims. It can only be used with [[LINK_ALL_OTHERS]] or [[LINK_ALL_CHILDREN]] if the object contains 11 or fewer prims. If there are more prims, the operation will fail and an error will be shouted to [[DEBUG_CHANNEL]]. Work around this by looping through the prims with [[llSetLinkPrimitiveParamsFast]].&lt;br /&gt;
* {{#var:type_const}} will silently fail when executed by a script placed inside a mesh, whether the affect object is the mesh or not (in linksets for example),use a normal prim as your root prim.&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
{{#switch:{{{1|}}}&lt;br /&gt;
|get={{#vardefine:caveats|{{#var:caveats}}&lt;br /&gt;
{{#var:caveats-get}}{{#vardefine:caveats-get}}}}&lt;br /&gt;
|set={{#vardefine:caveats|{{#var:caveats}}&lt;br /&gt;
{{#var:caveats-set}}{{#vardefine:caveats-set}}}}&lt;br /&gt;
&lt;br /&gt;
}}&lt;br /&gt;
&lt;br /&gt;
}}&amp;lt;/onlyinclude&amp;gt;{{#if:&lt;br /&gt;
&lt;br /&gt;
{{:PRIM_TYPE_SCULPT|{{{1|}}}}}&lt;br /&gt;
&lt;br /&gt;
}}{{LSL Constant&lt;br /&gt;
|inject-2={{LSL PrimitiveParam Categorize|Prim}}&lt;br /&gt;
|name=PRIM_TYPE&lt;br /&gt;
|type=integer&lt;br /&gt;
|value=9&lt;br /&gt;
|desc=Gets or sets the {{LSLP|type_flag|type}} of the prim and associated type {{LSLP|type_parameters|parameters}}.&lt;br /&gt;
|examples&lt;br /&gt;
|pa={{LSL Constant/List|i_front=[&amp;amp;#32;{{#var:type_const}},&amp;amp;#32;|i_end=&amp;amp;nbsp;]&amp;amp;nbsp;+ {{LSLPT|type_parameters|flag_parameters}}&lt;br /&gt;
|text=Used with [[llSetPrimitiveParams]] &amp;amp; [[llSetLinkPrimitiveParams]].&lt;br /&gt;
&lt;br /&gt;
The values needed for {{LSLP|type_parameters|flag_parameters}} is dependent on {{LSLP|type_flag|flag}}, please refer to the individual PRIM_TYPE_* articles for additional information.&lt;br /&gt;
{{LSL Generic/Caveats|caveats={{#var:caveats-set}}|title=*}}&lt;br /&gt;
|toc=llSetPrimitiveParams&lt;br /&gt;
|i1_type=integer|i1_name=type_flag|i1_disp=flag&lt;br /&gt;
}}&lt;br /&gt;
|pb={{LSL Constant/List|i_front=[[llGetPrimitiveParams]]([&amp;amp;nbsp;{{#var:type_const}}|i_end=&amp;amp;nbsp;]);|&lt;br /&gt;
|r_front=Returns the list &amp;lt;code&amp;gt;[&amp;amp;nbsp;|r_end=&amp;amp;nbsp;] + {{LSL Param|type_parameters|flag_parameters}}&amp;lt;/code&amp;gt;&lt;br /&gt;
|text=The values that follow after {{LSLP|type_flag|flag}}, the {{LSLP|type_parameters|flag_parameters}}, are dependent on the value of {{LSLP|flag}}, please refer to the individual PRIM_TYPE_* articles for further information.&lt;br /&gt;
&lt;br /&gt;
|toc=llGetPrimitiveParams&lt;br /&gt;
|r1_type=integer|r1_name=type_flag|r1_disp=flag&lt;br /&gt;
}}&lt;br /&gt;
|pc=&lt;br /&gt;
{{LSL_Constants/PrimitiveParams/type|table=*|simple=*|sortable=*|style=margin-top:0; margin-right:0;|{{LSLPT|type_parameters|flag_parameters}}}}&lt;br /&gt;
{{LSL Constants/PrimitiveParams/hole shape|table=*|simple=*|sortable=*|style=margin-top:0; margin-right:0;}}&lt;br /&gt;
|constants=&lt;br /&gt;
{{LSL ConstRow|CHANGED_SHAPE}}&lt;br /&gt;
|functions=&lt;br /&gt;
{{LSL DefineRow||[[llSetPrimitiveParams]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llSetLinkPrimitiveParams]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llGetPrimitiveParams]]|}}&lt;br /&gt;
|events=&lt;br /&gt;
{{LSL DefineRow||[[changed]]|}}&lt;br /&gt;
|location&lt;br /&gt;
|cat1&lt;br /&gt;
|cat2&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Darien Caldwell</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LSL_Alternate_Editors&amp;diff=1183784</id>
		<title>LSL Alternate Editors</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LSL_Alternate_Editors&amp;diff=1183784"/>
		<updated>2013-11-22T21:07:25Z</updated>

		<summary type="html">&lt;p&gt;Darien Caldwell: /* Notepad++ */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header|ml=*}}&lt;br /&gt;
&lt;br /&gt;
There are several off-world editors available for free or purchase.  Some have syntax highlighting for LSL that will make your code easier to follow.  At least two will compile and execute a large subset of LSL. Below are some of the more popular editors for use with LSL.  &lt;br /&gt;
&lt;br /&gt;
If you have a favorite that is missing from the list, &#039;&#039;&#039;please&#039;&#039;&#039; feel free to add it.&lt;br /&gt;
&lt;br /&gt;
==Why use an alternate editor?==&lt;br /&gt;
&lt;br /&gt;
Alternate editors with syntax highlighting color the code you write based on its syntax, some even let you use the colors used in the Second Life viewer. This greatly improves the readability of your code (for yourself!) and helps you to quickly scan the code for a particular part during review.&lt;br /&gt;
&lt;br /&gt;
But these editors don&#039;t just help you with code review, but with writing code. Autocompletion lets you write scripts faster, with less typos and greatly improves readability by preformatting your code with the snippets you use.&lt;br /&gt;
&lt;br /&gt;
Below is a screen cast that shows syntax highlighting and autocompletion.&lt;br /&gt;
&lt;br /&gt;
[[File:Pareto_principle_scripting.gif|thumb|700px|center|Not only writing, but especially fixing scripts takes time and effort. &#039;&#039;&#039;Readability is key to being more productive!&#039;&#039;&#039; Shown above is Sublime Text.]]&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Colors used in the Second Life viewer by Linden Lab:==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;br&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;font-size: 85%; text-align: center; width: auto; border=1px;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;part of LSL grammar&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;hexadecimal triple&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;RGB Decimal&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;RGB Percentage&#039;&#039;&#039;&lt;br /&gt;
|- style=&amp;quot;background:#000000;color:#ffffff&amp;quot;&lt;br /&gt;
| default text&lt;br /&gt;
| #000000&lt;br /&gt;
| 0, 0, 0&lt;br /&gt;
| 0, 0, 0&lt;br /&gt;
|- style=&amp;quot;background:#cd4d26;color:#ffffff&amp;quot;&lt;br /&gt;
| comments&lt;br /&gt;
| #cd4d26&lt;br /&gt;
| 205, 77, 38&lt;br /&gt;
| 0.804, 0.302, 0.149&lt;br /&gt;
|- style=&amp;quot;background:#801a4d;color:#ffffff&amp;quot;&lt;br /&gt;
| states&lt;br /&gt;
| #801a4d&lt;br /&gt;
| 128, 26, 77&lt;br /&gt;
| 0.502, 0.102, 0.302&lt;br /&gt;
|- style=&amp;quot;background:#004d80;color:#ffffff&amp;quot;&lt;br /&gt;
| events&lt;br /&gt;
| #004d80&lt;br /&gt;
| 0, 77, 128&lt;br /&gt;
| 0, 0.302, 0.502&lt;br /&gt;
|- style=&amp;quot;background:#820124;color:#ffffff&amp;quot;&lt;br /&gt;
| functions&lt;br /&gt;
| #820124&lt;br /&gt;
| 130, 1, 36&lt;br /&gt;
| 0.510, 0.004, 0.141&lt;br /&gt;
|- style=&amp;quot;background:#1a1a80;color:#ffffff&amp;quot;&lt;br /&gt;
| integer constants&lt;br /&gt;
| #1a1a80&lt;br /&gt;
| 26, 26, 128&lt;br /&gt;
| 0.102, 0.102, 0.502&lt;br /&gt;
|- style=&amp;quot;background:#1a4d80;color:#ffffff&amp;quot;&lt;br /&gt;
| string constants&lt;br /&gt;
| #1a4d80&lt;br /&gt;
| 26, 77, 128&lt;br /&gt;
| 0.102, 0.302, 0.502&lt;br /&gt;
|- style=&amp;quot;background:#4d1a80;color:#ffffff&amp;quot;&lt;br /&gt;
| float constants&lt;br /&gt;
| #4d1a80&lt;br /&gt;
| 77, 26, 128&lt;br /&gt;
| 0.302, 0.102, 0.502&lt;br /&gt;
|- style=&amp;quot;background:#663366;color:#ffffff&amp;quot;&lt;br /&gt;
| vector &amp;amp; rotation constants&lt;br /&gt;
| #663366&lt;br /&gt;
| 102, 51, 102&lt;br /&gt;
| 0.400, 0.200, 0.400&lt;br /&gt;
|- style=&amp;quot;background:#000000;color:#ffffff&amp;quot;&lt;br /&gt;
| operators&lt;br /&gt;
| #000000&lt;br /&gt;
| 0, 0, 0&lt;br /&gt;
| 0, 0, 0&lt;br /&gt;
|- style=&amp;quot;background:#1a4d1a;color:#ffffff&amp;quot;&lt;br /&gt;
| storage type&lt;br /&gt;
| #1a4d1a&lt;br /&gt;
| 26, 77, 26&lt;br /&gt;
| 0.102, 0.302, 0.102&lt;br /&gt;
|- style=&amp;quot;background:#003300;color:#ffffff&amp;quot;&lt;br /&gt;
| strings&lt;br /&gt;
| #003300&lt;br /&gt;
| 0, 51, 0&lt;br /&gt;
| 0, 0.200, 0&lt;br /&gt;
|- style=&amp;quot;background:#ff0000;color:#ffffff&amp;quot;&lt;br /&gt;
| numbers&lt;br /&gt;
| #ff0000&lt;br /&gt;
| 255, 0, 0&lt;br /&gt;
| 1, 0, 0&lt;br /&gt;
|- style=&amp;quot;background:#0000cd;color:#ffffff&amp;quot;&lt;br /&gt;
| keywords&lt;br /&gt;
| #0000cd&lt;br /&gt;
| 0, 0, 205&lt;br /&gt;
| 0, 0, 0.804&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== Online LSL Generators ==&lt;br /&gt;
Online LSL generators create and edit LSL scripts via a website, some may have syntax highlighting for better reading.&lt;br /&gt;
Sites are multi-platform editors without downloads:&lt;br /&gt;
*[http://conwylie.co.uk/ScriptGenerator/ Con Wylie&#039;s LSL Script Generator]&lt;br /&gt;
&lt;br /&gt;
== Syntax Highlighting Files ==&lt;br /&gt;
These projects may have more current LSL highlighting files:&lt;br /&gt;
*[http://adammarker.org/shill Shill project]&lt;br /&gt;
*[http://hilitelsl.googlecode.com HiLiteLSL.GoogleCode.com]&lt;br /&gt;
&lt;br /&gt;
== Syntax highlighting and code completion files by the [http://www.buildersbrewery.com Builder&#039;s Brewery]: ==&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;font-size: 85%; text-align: center; width: auto; border=1px;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! &#039;&#039;&#039;Software:&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Commercial software:&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Windows:&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Mac:&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Linux:&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Browser&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Direct URL:&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Issue tracker:&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Autocomplete:&#039;&#039;&#039;&lt;br /&gt;
! &#039;&#039;&#039;Syntax highlight:&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
| [http://ace.c9.io Ace Editor for the web]&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{maybe|requires a browser}}&lt;br /&gt;
| {{maybe|requires a browser}}&lt;br /&gt;
| {{maybe|requires a browser}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| [https://github.com/ajaxorg/ace/ Ace Editor for the web]&lt;br /&gt;
| [https://github.com/ajaxorg/ace/issues/ Issue tracker]&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{maybe|yes, doesn&#039;t include LL viewer theme}}&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.contexteditor.org/ ConTEXT Text Editor]&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| [https://github.com/buildersbrewery/lsl-for-context/ Files for ConTEXT]&lt;br /&gt;
| [https://github.com/buildersbrewery/lsl-for-context/issues/ Issue tracker]&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
|-&lt;br /&gt;
| [http://projects.gnome.org/gedit/ gedit Text Editor]&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{maybe|for GNOME}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| [https://github.com/buildersbrewery/lsl-for-gedit/ Files for gedit]&lt;br /&gt;
| [https://github.com/buildersbrewery/lsl-for-gedit/issues/ Issue tracker]&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.mediawiki.org/wiki/Extension:SyntaxHighlight_GeSHi GeSHi SyntaxHighlight - wikimedia extension]&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{maybe|requires a browser}}&lt;br /&gt;
| {{maybe|requires a browser}}&lt;br /&gt;
| {{maybe|requires a browser}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| [https://github.com/buildersbrewery/lsl-for-geshi/ Files for GeSHi]&lt;br /&gt;
| [https://github.com/buildersbrewery/lsl-for-geshi/issues/ Issue tracker]&lt;br /&gt;
| {{no|no, static web view only}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.jedit.org/ jEdit]&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{maybe|requires JavaVM}}&lt;br /&gt;
| {{maybe|requires JavaVM}}&lt;br /&gt;
| {{maybe|requires JavaVM}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| [https://github.com/buildersbrewery/lsl-for-jedit/ Files for jEdit]&lt;br /&gt;
| [https://github.com/buildersbrewery/lsl-for-jedit/issues/ Issue tracker]&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{maybe|yes, doesn&#039;t include LL viewer theme}}&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.kate-editor.org/ Kate Editor]&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{maybe|via KDE for Windows}}&lt;br /&gt;
| {{maybe|via KDE for Mac}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| [https://github.com/buildersbrewery/lsl-for-kate-editor/ Files for Kate Editor]&lt;br /&gt;
| [https://github.com/buildersbrewery/lsl-for-kate-editor/issues/ Issue tracker]&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.notepad-plus-plus.org/ Notepad++]&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| [https://github.com/buildersbrewery/lsl-for-notepadplusplus/ Files for Notepad++]&lt;br /&gt;
| [https://github.com/buildersbrewery/lsl-for-notepadplusplus/ Issue tracker]&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.codingmonkeys.de/subethaedit/ SubEthaEdit]&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| [https://github.com/buildersbrewery/lsl-for-subethaedit/ Files for SubEthaEdit]&lt;br /&gt;
| [https://github.com/buildersbrewery/lsl-for-subethaedit/issues/ Issue tracker]&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.ultraedit.com/ UltraEdit]&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| [https://github.com/buildersbrewery/lsl-for-ultraedit/ Files for UltraEdit]&lt;br /&gt;
| [https://github.com/buildersbrewery/lsl-for-ultraedit/issues/ Issue tracker]&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
|-&lt;br /&gt;
| [http://www.vim.org/ Vim Text Editor]&lt;br /&gt;
| {{no}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
| [https://github.com/buildersbrewery/lsl-for-vim/ Files for Vim]&lt;br /&gt;
| [https://github.com/buildersbrewery/lsl-for-vim/issues/ Issue tracker]&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{maybe|yes, doesn&#039;t include LL viewer theme}}&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
==LSL Integrated Development Environments (coding and testing environments) ==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===[[Con-Wylies-Script-Generator]]===&lt;br /&gt;
&lt;br /&gt;
*[http://conwylie.co.uk/ScriptGenerator/ Con Wylie&#039;s LSL Script Generator] has been ported from a website into a free downloadable program, anyone can use the program as it is very easy to use.&lt;br /&gt;
&lt;br /&gt;
Con Wylie&#039;s LSL program is multi-platform on Windows, Linux and Mac. The generator, editor and compiler has been build from the ground up to give the user ease of use.&lt;br /&gt;
&lt;br /&gt;
===[[LslPre]]===&lt;br /&gt;
* [http://lsl.dreamjammers.net http://lsl.dreamjammers.net]&lt;br /&gt;
LslPre is a full featured LSL script editor, preprocessor and optimiser for windows.&lt;br /&gt;
&lt;br /&gt;
===[[LSL Editor Community Edition]]===&lt;br /&gt;
&lt;br /&gt;
LSL Editor Community Edition &#039;&#039;&#039;for Windows&#039;&#039;&#039; is a standalone LSL script &#039;&#039;&#039;editor, compiler and debugger&#039;&#039;&#039;. Binary and Source as of 2013-03-14.&lt;br /&gt;
&lt;br /&gt;
Its compiler and debugger are already now reasonably accurate. Please blog any LSL-Editor bugs you find into such places as our [[LSLEditorBugs|LSL-Editor Bugs]] article or via the project&#039;s SourceForge bug tracker located at: [http://sourceforge.net/tracker/?group_id=319248 Bug Tracker].&lt;br /&gt;
&lt;br /&gt;
*  Alphons van der Heijden, author of LSLEditor, the great off-line editor and debugging tool for scripting in Second Life, has donated his opus magnum to the free and open source community where it can grow and keep pace with the SL platform!&lt;br /&gt;
&lt;br /&gt;
*Details, executable and source can be found at [http://sourceforge.net/projects/lsleditor/ http://sourceforge.net/projects/lsleditor/] &lt;br /&gt;
&lt;br /&gt;
Development of LSL-Editor was originally done by Alphons van der Heijden at [http://www.lsleditor.org/ http://www.lsleditor.org/].&lt;br /&gt;
&lt;br /&gt;
=== [[LSL-Plus]] ===&lt;br /&gt;
&lt;br /&gt;
[http://lslplus.sourceforge.net/ LSL PLus Eclipse Plugin]&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;For Windows, Mac, and Linux&#039;&#039;&#039;, the LSL Plus Eclipse plugin is a Editor/Unit Test environment for LSL implemented in Eclipse. It is a FLOSS project (Free/Libre Open Source Software). The latest release (0.13.0 - 2010-01-06) features multi-script execution with &#039;&#039;&#039;source level debugging&#039;&#039;&#039; (setting breakpoints, single stepping through code, examining variables on the call stack, etc.), making it unique among LSL IDEs.  It now supports both multi-script execution in a simulated environment (with avatars, prims, inventory, (limited) physics, etc.) and &#039;&#039;&#039;unit&#039;&#039;&#039; testing - allowing you to test individual handlers and functions by precisely controlling the setup/teardown and interaction with the execution environment (including support for &#039;mocking&#039; the LL function call that interact with the script environment).  It also has some additional code management features that encourage code re-use without having to cut-and-paste, as well as code &#039;&#039;&#039;optimization&#039;&#039;&#039; (inlining, constant folding).&lt;br /&gt;
&lt;br /&gt;
By using the Eclipse IDE you get features such as integration with source code control systems like CVS or Subversion, task management, integration with 3rd party bug tracking software, and so on.  It supports development on Windows, Mac, and Linux platforms.&lt;br /&gt;
* Missing bracket matching and certain highlighting features.&lt;br /&gt;
&lt;br /&gt;
=== [[LSLForge]] ===&lt;br /&gt;
&lt;br /&gt;
[http://code.google.com/p/lslforge/ LSLForge Eclipse]&lt;br /&gt;
&#039;&#039;&#039;For Windows/Linux/OS X&#039;&#039;&#039;, LSLForge is a derivative of [[LSL-Plus]], forked in September 2011.  LSLForge aims to further advance and mature the LSL-Plus project and support the Eclipse LSL developer community.&lt;br /&gt;
&lt;br /&gt;
=== [[MiceOnABeam Visual Scripting Tool]] [{{HoverText|&#039;&#039;C&#039;&#039;|Commercial Software}}]===&lt;br /&gt;
&lt;br /&gt;
* [http://www.miceonabeam.com/ MiceOnABeam Visual Scripting Tool]&lt;br /&gt;
MiceOnABeam is a visual programming tool that generates LSL scripts for SL. You choose among graphical modeling components to specify the program flow of your script in terms of states and the events that transition between the states. You can then use the built-in LSL Action Wizard or insert your own LSL code to specify what happens when an event occurs. The program then generates the LSL code for the model to form a complete script for the SL environment. Check out the demo video &#039;&#039;&#039;[http://bit.ly/ihCqyf here]&#039;&#039;&#039; or on &#039;&#039;&#039;[http://www.youtube.com/watch?v=LBA8wvoA9EI YouTube]&#039;&#039;&#039;. A Free version can be downloaded from &#039;&#039;&#039;[http://www.miceonabeam.com here]&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
==Off-world syntax checker==&lt;br /&gt;
You can build a syntax checker yourself and hook it into whatever editor you fancy if you have the viewer source installed and compiled on your machine. The C++ source to build one yourself is [[User:JB_Kraft#Offline_LSL_Syntax_Checker|here (JB Kraft)]].&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Multi-platform Editors==&lt;br /&gt;
&lt;br /&gt;
===ByronStar SL===&lt;br /&gt;
Based on [http://eclipse.org Eclipse], the [http://byronstar-sl.sourceforge.net/ ByronStar SL IDE] includes most modern program editor features.  It also includes custom features for LSL, such as variable checking, error markers, and code formatting.  Eclipse is available for Macintosh, Linux, Windows, and many UNIX flavors.&lt;br /&gt;
* No longer maintained.&lt;br /&gt;
&lt;br /&gt;
===Emacs===&lt;br /&gt;
There&#039;s an [[Emacs LSL Mode]] available on this wiki, which provides syntax highlighting and indentation features.  If you want some tips on writing LSL in emacs, read [http://xahlee.org/sl/ls-emacs.html Xah Lee&#039;s page].  Emacs is available for many Unix flavors, Macintosh and Windows.&lt;br /&gt;
&lt;br /&gt;
You may come across (and attempt to use) Gary Evan&#039;s [http://www.cs.iastate.edu/~leavens/emacs/lsl-mode.el LSL major mode]. It won&#039;t work with the Linden Scripting Language, as Gary wrote it for the [http://www.cs.iastate.edu/larch-faq-webboy.html Larch Shared Language].&lt;br /&gt;
&lt;br /&gt;
===vim===&lt;br /&gt;
[http://www.vim.org/ vim:] vi improved. A multi-platform evolution of the most classical of the editors: vi. GPL code.&lt;br /&gt;
&amp;lt;br&amp;gt;[http://www.secondlifelab.it/index.php?option=com_remository&amp;amp;Itemid=77&amp;amp;func=select&amp;amp;id=7 Plugins for VIM] for install the syntax, autocompletion, autoident for LSL script into vim&lt;br /&gt;
&lt;br /&gt;
===JOE===&lt;br /&gt;
[http://joe-editor.sourceforge.net/ Joe&#039;s Own Editor (a.k.a. Joe)] is a comand line editor for unixoid systems. See [[User:Zai Lynch/LSL highlighting in Joe]] for a manual and syntax file download.&lt;br /&gt;
&lt;br /&gt;
===SciTE===&lt;br /&gt;
Easy to use, features syntax highlighting, folding, auto complete, help that opens the appropriate wiki page, and is setup to use the c preprocessor, and lslint.&amp;lt;br&amp;gt;&lt;br /&gt;
Windows only [https://sdfjkl.org/hack/scite-ez/]&amp;lt;br&amp;gt;&lt;br /&gt;
&amp;lt;!-- old side ( http://sl.sdfjkl.org/secondlife/scite/ ) not longer possible --&amp;gt;&lt;br /&gt;
Files for Linux or Windows [http://forums.secondlife.com/showthread.php?t=209219 Forum thread] [http://dimension128.homelinux.net/scite_lsl.tar.gz scite_lsl.tar.gz]&lt;br /&gt;
&lt;br /&gt;
===jEdit===&lt;br /&gt;
Developed in Java, this mature, cross-platform editor runs on any operating system with a Java 2 version 1.3 or higher virtual machine. It has all the features you&#039;d expect from a full-GUI text editor. Syntax highlighting and tailored editing behavior is supported through &amp;quot;modes.&amp;quot; (You can get the LSL &#039;modes&#039; file [https://gist.github.com/GitSkunk/5327522 here] {{WFont|fstyle=italic|color=orange|text=updated 18-Apr-13}}.) The editor supports a rich plug-in API; many third-party plug-ins exist to facility editing, formatting, communications, etc.&amp;lt;br&amp;gt;&lt;br /&gt;
You can find jEdit [http://www.jedit.org/ here].&lt;br /&gt;
&lt;br /&gt;
===Shill - LSL syntax files for a variety of editors===&lt;br /&gt;
The [http://adammarker.org/shill Shill project] provides up-to-date syntax files for many LSL editors.  You might find files there that are more current than those here on the wiki.  Last update:  19Aug09 for Second Life 1.23.4.  New in this release:  lslint&lt;br /&gt;
&lt;br /&gt;
===Midnight Commander===&lt;br /&gt;
[http://www.midnight-commander.org/ GNU Midnight Commander (mc)] is a free cross-platform orthodox file manager and a clone of Norton Commander.&amp;lt;br&amp;gt;&lt;br /&gt;
Midnight Commander is a console application with a text user interface.&amp;lt;br&amp;gt;&lt;br /&gt;
OS: Unix-like, Microsoft Windows&amp;lt;br&amp;gt;&lt;br /&gt;
For Linux see [[User:Kuraiko_Yoshikawa/sandbox/LSL_Goodies/mc]] for a manual and syntax file download.&lt;br /&gt;
&lt;br /&gt;
===UltraEdit-32/UEStudio [{{HoverText|&#039;&#039;C&#039;&#039;|Commercial Software}}]===&lt;br /&gt;
[http://www.ultraedit.com/ UltraEdit-32/UEStudio] is a powerful text, HTML, and HEX editor.  It is a commercial editor with a 30 day trial version available at the website.  Important features:&lt;br /&gt;
* column/block mode editing&lt;br /&gt;
* brackets/braces matching&lt;br /&gt;
* code-folding&lt;br /&gt;
* configurable syntax highlighting via custom  [http://www.ultraedit.com/index.php?name=Content&amp;amp;pa=showpage&amp;amp;pid=40#wordfiles wordfiles]&lt;br /&gt;
* autocomplete (using keywords defined in the wordfile)&lt;br /&gt;
* bookmarks, incremental searching, CTAG support&lt;br /&gt;
* automatic conversion between Unix/Dos/MAC/UTF-8, etc&lt;br /&gt;
* built-in FTP/SFTP client&lt;br /&gt;
&lt;br /&gt;
OS: Linux, Mac and Windows. &lt;br /&gt;
&lt;br /&gt;
The following syntax files are available for UltraEdit&lt;br /&gt;
* [[User:Lum Pfohl/LSL Syntax Highlighting For UltraEdit]] Last updated November 28th, 2007.&lt;br /&gt;
&lt;br /&gt;
===Sublime Text [{{HoverText|&#039;&#039;C&#039;&#039;|Commercial Software}}]===&lt;br /&gt;
[http://www.sublimetext.com/ Sublime Text] is a sophisticated text editor for code, markup and prose.&lt;br /&gt;
You&#039;ll love the slick user interface, extraordinary features and amazing performance. Key Bindings, Menus, Snippets, Macros, Completions and more - just about everything in Sublime Text is customizable with simple JSON files. This system gives you flexibility as settings can be specified on a per-file type and per-project basis. Sublime Text uses a custom UI toolkit, optimized for speed and beauty, while taking advantage of native functionality on each platform. &lt;br /&gt;
&lt;br /&gt;
Sublime Text may be downloaded and evaluated for free, however a license must be purchased for continued use. There is no enforced time limit for the evaluation. &lt;br /&gt;
&lt;br /&gt;
The following syntax highlighting files are available for Sublime Text.&lt;br /&gt;
* [https://github.com/JKolya/sublime-text-2-lsl Sublime Text 2 LSL Syntex] Last updated October 28, 2012.&lt;br /&gt;
&lt;br /&gt;
What you will get via Package Control is the following. Simply go &amp;quot;Package Control: Install Package&amp;quot; and search for &amp;quot;LSL&amp;quot;.&amp;lt;br/&amp;gt;(including not only syntax highlighting, but also smooth LSL functions/events/constants completions, lslint as build system, and inworld editor look-and-feel theme)&lt;br /&gt;
* [https://github.com/Makopo/sublime-text-lsl LSL Bundle for Sublime Text 2] Active as of June 21, 2013.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Sublime Text is available for OS X, Windows and Linux.&lt;br /&gt;
&lt;br /&gt;
==Windows Editors==&lt;br /&gt;
&amp;lt;!-- Add your text editors in the following format --&amp;gt;&lt;br /&gt;
===e===&lt;br /&gt;
The [http://www.e-texteditor.com/ e Editor] is a port of TextMate to Windows, and can use the TextMate LSL bundle listed below.&lt;br /&gt;
===Notepad++===&lt;br /&gt;
[http://notepad-plus.sourceforge.net/uk/site.htm Notepad++] is probably one of the best Windows editor around. Packed with features, extremely powerful and easy to use for beginners too. Best of all, it is GPL code.&lt;br /&gt;
&lt;br /&gt;
Shan Bright&#039;s Notepad++ LSL syntax file &#039;BrightLSL&#039; is at the Bright Corporation website: [http://www.brightcorporation.net/brightlsl BrightLSL] (Updated December 10, 2010)&lt;br /&gt;
&lt;br /&gt;
Nexii Malthus&#039;s Notepad++ LSL syntax file, includes latest functions and constants [http://c438644.r44.cf2.rackcdn.com/userDefineLang.xml] (3rd December, 2011)&lt;br /&gt;
&lt;br /&gt;
WhiteStar Magic&#039;s Notepad++ LSL syntax file is being updated regularly, and is available on Github: [https://github.com/WhiteStar-Magic/NotePad---userdef/archives/master NotePad---userdef] (Last Update: May.03.2012)&lt;br /&gt;
&lt;br /&gt;
Gwen Setzer&#039;s Notepad++ (6.3 and above) LSL Syntax Files: (Generated from Firestorm 4.4.0)&lt;br /&gt;
Language description: [http://pastebin.com/2AsRuKjh lslLanguage.xml] (Language-&amp;gt;Define your Language-&amp;gt;Import)&lt;br /&gt;
Autocompletion support: [http://pastebin.com/FcjNVDyb lsl.xml] (Copy the file lsl.xml in the API plugin directory of Notepad++. ex: C:\Program Files\Notepad++\plugins\APIs, I also recommend enabling Settings-&amp;gt;Preferences-&amp;gt;Autocompletion-&amp;gt;Function parameters hint on input)&lt;br /&gt;
&lt;br /&gt;
Dari&#039;s Better Highlighting for Notepad++ (6.3 and above): [http://home.comcast.net/~volfin/LSL.XML LSL.XML] (updated 11/22/2013) [[User:Darien Caldwell|Darien Caldwell]] 12:11, 9 July 2013 (PDT)&lt;br /&gt;
&lt;br /&gt;
Hint: to ensure code folding works properly, change line endings to Windows style if they are not already set as such. (Edit / EOL conversion / Windows format)&lt;br /&gt;
&lt;br /&gt;
===ConTEXT===&lt;br /&gt;
[http://www.context.cx/component/option,com_frontpage/Itemid,1/ ConTEXT] is a small, fast and powerful freeware text editor, developed mainly to serve as secondary tool for software developers.&lt;br /&gt;
&lt;br /&gt;
The following syntax files are available for ConTEXT.&lt;br /&gt;
* [http://blogic14.blogspot.com/ Last Activity] July 2012&lt;br /&gt;
* [http://archive.is/Wm3B Last Announcement by developer of ConTEXT] Friday, 07 September 2007&lt;br /&gt;
* [http://www.contexteditor.org/ Site and Newsletter Sign Up - &#039;&#039;&#039;DOWNLOAD&#039;&#039;&#039;] September 2007&lt;br /&gt;
* [http://forum.context.cx/index.php?action=dlattach;topic=1775.0;id=359 Shyan Graves] Last updated March 01, 2007.&lt;br /&gt;
* [http://adammarker.org/shill/context/lsl.chl Sir.Grelling] Last updated July 10, 2006.&lt;br /&gt;
&lt;br /&gt;
===Crimson Editor===&lt;br /&gt;
[http://www.crimsoneditor.com/ Crimson Editor] is a professional source code editor for Windows.&lt;br /&gt;
The following syntax files are available for Crimson Editor.&lt;br /&gt;
&amp;lt;!--* [http://www.crimsoneditor.com/english/board/CrazyWWWBoard.cgi?db=file3&amp;amp;mode=read&amp;amp;num=1791 Broken Link - Aakanaar] Last updated September 10, 2006 for Second Life version 1.10.0. --&amp;gt;&lt;br /&gt;
* Aakanaar - Last updated September 10, 2006 for Second Life version 1.10.0.&lt;br /&gt;
* [http://sourceforge.net/projects/emeraldeditor/files/crimsoneditor/ Emerald Editor] &#039;&#039;&#039;2011&#039;&#039;&#039; Open Source version of Crimson Editor&lt;br /&gt;
&lt;br /&gt;
===[[LSL-Editor]]===&lt;br /&gt;
&lt;br /&gt;
* [http://www.lsleditor.org/ http://www.lsleditor.org/]&lt;br /&gt;
&lt;br /&gt;
[[LSL-Editor]] is a standalone Windows LSL  &#039;&#039;&#039;editor, compiler and debugger&#039;&#039;&#039;.&lt;br /&gt;
All the usual editing, plus you can compile and execute.&lt;br /&gt;
* This project is no longer maintained at LSLEditor.org. See below.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===LSL Editor Community Addition===&lt;br /&gt;
&lt;br /&gt;
* [http://sourceforge.net/projects/lsleditor/ Source Forge: LSL Editor]&lt;br /&gt;
&lt;br /&gt;
[[LSL-Editor]] is the &#039;&#039;&#039;frequently&#039;&#039;&#039; updated version of the LSL Editor with editing, compiling, and debugging abilities.&lt;br /&gt;
When the path to the editor is added to the viewer&#039;s Debug Setting: &#039;&#039;ExternalEditor&#039;&#039; one can have a nice round trip external editor. See the LSL-Editor entry just above, above in the Integrated section, and the wiki page [[LSL-Editor]] for more information.&lt;br /&gt;
&lt;br /&gt;
===TextPad [{{HoverText|&#039;&#039;C&#039;&#039;|Commercial Software}}]===&lt;br /&gt;
[http://www.textpad.com/products/textpad/index.html TextPad] is a powerful, but easy to use general purpose text editor.  It is a commercial product, but there is a 30 day trial version available for free on the website.&lt;br /&gt;
&lt;br /&gt;
The following syntax files are available for TextPad.&lt;br /&gt;
* [[LSL_Editor_TextPad_ClipBook_Events | Events ClipBook]] Last updated March 5, 2007.  Based on the LSL Portal event entries.&lt;br /&gt;
* [[LSL_Editor_TextPad_Syntax | Prodigal Maeterlinck &amp;amp; Patrick2 Chama]] Last updated February 20, 2007.  Extracted from the Second Life viewer source code.&lt;br /&gt;
* [http://www.textpad.com/add-ons/files/syntax/lsl_.zip Ben Gray] Last updated August 23, 2006. As of version 1.12.0, with the deprecated functions in a separate keyword list.&lt;br /&gt;
* [http://www.textpad.com/add-ons/files/syntax/lsl.zip Matthias Huber] Last updated September 23, 2004.&lt;br /&gt;
&lt;br /&gt;
===EditPad Pro [{{HoverText|&#039;&#039;C&#039;&#039;|Commercial Software}}]===&lt;br /&gt;
[http://www.editpadpro.com/ EditPad Pro] is a text editor with many great features for programming. It is a commercial program, with a demo version available. There is also a Lite version, but that has no syntax-highlighting support.&lt;br /&gt;
&lt;br /&gt;
There is an LSL syntax file available for download from inside the program. However, it is from October 2006 so some new features may not be available.&lt;br /&gt;
&lt;br /&gt;
==Macintosh Editors==&lt;br /&gt;
===TextMate [{{HoverText|&#039;&#039;C&#039;&#039;|Commercial Software}}]===&lt;br /&gt;
&lt;br /&gt;
TextMate is a commercial text/program editor from [http://macromates.com/ Macromates] (30 day trial available). You can find details about Piero Padar&#039;s well-maintained LSL bundle in the [http://forums-archive.secondlife.com/54/ae/89389/1.html Scripting Tips forum archive].&lt;br /&gt;
&lt;br /&gt;
===SubEthaEdit [{{HoverText|&#039;&#039;C&#039;&#039;|Commercial Software}}]===&lt;br /&gt;
This a great text editor with extensible language support.  It also happens to be an incredible collaborative editor. Info at: http://www.subethaedit.net/&lt;br /&gt;
&lt;br /&gt;
There is a contributed LSL mode by Zarf Vantongerloo.  The mode is a little out of date and could use some love.  But in general works great, doing syntax hilighting of LSL funcitons and adding a pop-up menu of all functions, states and event handlers to the top of the window.&lt;br /&gt;
&lt;br /&gt;
An updated LSL mode by Mark Lentczner is available now from the SubEthaEditor [http://www.subethaedit.net/modes.html User contributed modes Repository].&lt;br /&gt;
&lt;br /&gt;
An updated (but still out of date) version of Mark Lentczner&#039;s mode is available on Solo Mornington&#039;s Github: https://github.com/SoloMornington/LSL_mode Note that this mode was developed for Coda 1.&lt;br /&gt;
&lt;br /&gt;
===Coda [{{HoverText|&#039;&#039;C&#039;&#039;|Commercial Software}}]===&lt;br /&gt;
&lt;br /&gt;
Coda is &#039;one-window web development,&#039; but it&#039;s a very pleasing text editor for a wide variety of uses. You can set up &#039;sites&#039; which are web sites, but can represent any remote filesystem, which is echoed locally through ftp and/or subversion.&lt;br /&gt;
&lt;br /&gt;
Coda can use SubEthaEdit syntax coloring &#039;modes,&#039; so LSL is supported. Also available is a plug-in editor which lets you run arbitrary scripts on the selection or document.&lt;br /&gt;
&lt;br /&gt;
http://www.panic.com/coda/&lt;br /&gt;
&lt;br /&gt;
===BBEdit and TextWrangler ===&lt;br /&gt;
&lt;br /&gt;
You can get an LSL language plugin for all versions of BBEdit and TextWrangler at [http://blog.elitecoderz.net/lsl-linden-script-language-plugin-for-bbedit/2008/12/ Erik Scholtz&#039; Blog]&lt;br /&gt;
&lt;br /&gt;
For older versions of BBEdit (7.0 or less) and TextWrangler (1.0 only), there is a module available at [http://adammarker.org/bbedit http://adammarker.org/bbedit]&lt;br /&gt;
&lt;br /&gt;
==Linux Editors==&lt;br /&gt;
===Kate===&lt;br /&gt;
[http://kate-editor.org/ Kate] is an advanced text editor for KDE. Usually included in all KDE based distributions.&amp;lt;br&amp;gt;&lt;br /&gt;
A [[Kate LSL Mode]] is available on this wiki.&lt;br /&gt;
===Gedit===&lt;br /&gt;
[http://www.gnome.org/projects/gedit/ Gedit] is an advanced text editor for GNOME.&amp;lt;br&amp;gt;&lt;br /&gt;
See [[User:Kuraiko_Yoshikawa/sandbox/LSL_Goodies/gedit]] for a manual, syntax file and Color Theme download. &lt;br /&gt;
===Nano===&lt;br /&gt;
Nano is a curses-based text editor for Unix and Unix-like systems.&amp;lt;br&amp;gt;&lt;br /&gt;
Since February 2001, nano is an official part of the GNU Project.&amp;lt;br&amp;gt;&lt;br /&gt;
See [[User:Kuraiko_Yoshikawa/sandbox/LSL_Goodies/nano]] for a manual and syntax file download.&lt;br /&gt;
===Vim===&lt;br /&gt;
Based on the vi editor common to Unix-like systems, [http://vim.sourceforge.net/ Vim] is designed for use both from a command line interface and as a standalone application in a graphical user interface.&amp;lt;br&amp;gt;&lt;br /&gt;
Vim comes standard with LSL hilighting support.&lt;br /&gt;
&lt;br /&gt;
== Features Table ==&lt;br /&gt;
&amp;lt;!-- Needs to be in alpha order --&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable sortable&amp;quot; style=&amp;quot;font-size: 85%; text-align: center; width: auto; border=1px;&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Name&lt;br /&gt;
! Integrated development environment&lt;br /&gt;
! Platforms&lt;br /&gt;
! Code Completion&lt;br /&gt;
! Highlighting&lt;br /&gt;
! Actively Maintained&lt;br /&gt;
|-&lt;br /&gt;
! [[LSL_Alternate_Editors#Con-Wylies-Script-Generator|Con-Wylies-Script-Generator]]&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| Windows/Linux/Mac&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{Yes}}&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! [[LSL_Alternate_Editors#LSL-Plus|LSL-Plus]]&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| Multi-Platform&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{no}}&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! [[LSL_Alternate_Editors#LSLForge|LSLForge]]&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| Windows/Linux/OS X&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{Yes}}&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! [[LSL_Alternate_Editors#LSL Editor Community Edition|LSL Editor Community Edition]]&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| Windows-Only&lt;br /&gt;
| {{yes | Custom Vars and Functions also}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! [[LSL_Alternate_Editors#LslPre|LslPre]]&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| Windows(.Net)&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
|-&lt;br /&gt;
|-&lt;br /&gt;
! [[LSL_Alternate_Editors#MiceOnABeam Visual Scripting Tool|MiceOnABeam Visual Scripting Tool]]&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| Windows(.Net)&lt;br /&gt;
| {{yes | Custom Vars and Functions also}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
| {{yes}}&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;/div&gt;</summary>
		<author><name>Darien Caldwell</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User_talk:Darien_Caldwell&amp;diff=1183783</id>
		<title>User talk:Darien Caldwell</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User_talk:Darien_Caldwell&amp;diff=1183783"/>
		<updated>2013-11-22T21:03:00Z</updated>

		<summary type="html">&lt;p&gt;Darien Caldwell: /* Oh, and... */&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== URL(En|De)code ==&lt;br /&gt;
&lt;br /&gt;
I like your idea of referencing similar functions from other languages. Maybe an optional collapsible table (collapsed by default) in the Summary section with function names as links for the other languages? An added bonus of this feature is that it would allow people to search the documentation for LSL functionality based on the names from other languages. Thoughts? -- &#039;&#039;&#039;[[User:Strife_Onizuka|Strife]]&#039;&#039;&#039; &amp;lt;sup&amp;gt;&amp;lt;small&amp;gt;([[User talk:Strife_Onizuka|talk]]|[[Special:Contributions/Strife_Onizuka|contribs]])&amp;lt;/small&amp;gt;&amp;lt;/sup&amp;gt; 13:23, 23 August 2012 (PDT)&lt;br /&gt;
&lt;br /&gt;
Yes I don&#039;t think it needs to be prominent. You hit upon the exact idea behind it, as every time I want to find the two functions mentioned, I&#039;m always looking for llURLEncode() llURLDecode(), It&#039;s just exactly what I expect from other languages. Then I spend a lot of time trying to remember what LL calls them. I figured referencing the common function name would help people like me who often confuse with other languages. So I think your idea is a fine one. [[User:Darien Caldwell|Darien Caldwell]] 22:43, 23 August 2012 (PDT)&lt;br /&gt;
&lt;br /&gt;
I don&#039;t have a good idea as to how this should be templatized (not to mention the entire template &amp;amp; information sprawl issue does gnaw upon me, and I don&#039;t have a good solution for that, and I&#039;m sorry for it). I&#039;m thinking includable subtemplates like the Signature section. Has potential, I&#039;ll do a mockup tomorrow (or when I have time). -- &#039;&#039;&#039;[[User:Strife_Onizuka|Strife]]&#039;&#039;&#039; &amp;lt;sup&amp;gt;&amp;lt;small&amp;gt;([[User talk:Strife_Onizuka|talk]]|[[Special:Contributions/Strife_Onizuka|contribs]])&amp;lt;/small&amp;gt;&amp;lt;/sup&amp;gt; 23:00, 23 August 2012 (PDT)&lt;br /&gt;
&lt;br /&gt;
Take a gander at [[Template:LSL_Other_Languages]]. I&#039;ll transclude it when if you think it&#039;s ready. Do you think it&#039;s important that this is in the Summary section? From a users perspective knowing it&#039;s similar to a function you already know really speeds up learning about it, but only if you know of the function. So having the most popular alternate names visible helps, but having the full table of names does does not. It should be compact and informative at the same time. As a stop gap solution, it is currently showing the first three other function names in the text. -- &#039;&#039;&#039;[[User:Strife_Onizuka|Strife]]&#039;&#039;&#039; &amp;lt;sup&amp;gt;&amp;lt;small&amp;gt;([[User talk:Strife_Onizuka|talk]]|[[Special:Contributions/Strife_Onizuka|contribs]])&amp;lt;/small&amp;gt;&amp;lt;/sup&amp;gt; 09:22, 24 August 2012 (PDT)&lt;br /&gt;
&lt;br /&gt;
:To answer my own question, yes I think it&#039;s important enough to be in the summary section. -- &#039;&#039;&#039;[[User:Strife_Onizuka|Strife]]&#039;&#039;&#039; &amp;lt;sup&amp;gt;&amp;lt;small&amp;gt;([[User talk:Strife_Onizuka|talk]]|[[Special:Contributions/Strife_Onizuka|contribs]])&amp;lt;/small&amp;gt;&amp;lt;/sup&amp;gt; 09:30, 24 August 2012 (PDT)&lt;br /&gt;
&lt;br /&gt;
Yes I think that&#039;s perfect. As long as the search can index the whole table, showing only a few makes sense.  Ship it, I say. :)  [[User:Darien Caldwell|Darien Caldwell]] 11:11, 24 August 2012 (PDT)&lt;br /&gt;
&lt;br /&gt;
== PRIM_LINK_TARGET ==&lt;br /&gt;
&lt;br /&gt;
I didn&#039;t know you could use [[PRIM_LINK_TARGET]] with [[llGetPrimitiveParams]]. That is cool. -- &#039;&#039;&#039;[[User:Strife_Onizuka|Strife]]&#039;&#039;&#039; &amp;lt;sup&amp;gt;&amp;lt;small&amp;gt;([[User talk:Strife_Onizuka|talk]]|[[Special:Contributions/Strife_Onizuka|contribs]])&amp;lt;/small&amp;gt;&amp;lt;/sup&amp;gt; 20:54, 28 August 2012 (PDT)&lt;br /&gt;
&lt;br /&gt;
Yeah i needed it today, and wasn&#039;t sure myself. But it worked. :) [[User:Darien Caldwell|Darien Caldwell]] 00:13, 29 August 2012 (PDT)&lt;br /&gt;
&lt;br /&gt;
== Animation Length Limit Update ==&lt;br /&gt;
&lt;br /&gt;
Thank you for your update to the [[Animation Length Limit]] article I wrote.  I wrote several articles linked in [[Talk:How to create animations]].  I still keep an eye on them.  I hope no others are out of date.&lt;br /&gt;
&lt;br /&gt;
I hope someday all the bugs with the animation system will be fixed, and someone will update the information on that.  I even submitted patches for some, but to my knowledge, they are still unapplied.&lt;br /&gt;
&lt;br /&gt;
[[User:Coaldust Numbers|Coaldust Numbers]] 05:43, 30 June 2013 (PDT)&lt;br /&gt;
&lt;br /&gt;
== Template:LSL Constants/ReturnError ==&lt;br /&gt;
&lt;br /&gt;
I don&#039;t know what I was channeling when I wrote those descriptions. With ERR_GENERIC, I think I started channeling Zork. Which lead me to lookup and then recompose some of the haiku that you will find in the HTML comments in the table. I&#039;m thinking about writing one for each constant. Does that make me insane? -- &#039;&#039;&#039;[[User:Strife_Onizuka|Strife]]&#039;&#039;&#039; &amp;lt;sup&amp;gt;&amp;lt;small&amp;gt;([[User talk:Strife_Onizuka|talk]]|[[Special:Contributions/Strife_Onizuka|contribs]])&amp;lt;/small&amp;gt;&amp;lt;/sup&amp;gt; 22:02, 9 July 2013 (PDT)&lt;br /&gt;
&lt;br /&gt;
LOL, I think it just means you have a sense of humor. :) I shall have to peruse these works.  Are you sure you saved it? The template seems to be unmodified, even from source view.[[User:Darien Caldwell|Darien Caldwell]] 18:12, 10 July 2013 (PDT)&lt;/div&gt;</summary>
		<author><name>Darien Caldwell</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User_talk:Darien_Caldwell&amp;diff=1182219</id>
		<title>User talk:Darien Caldwell</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User_talk:Darien_Caldwell&amp;diff=1182219"/>
		<updated>2013-10-06T20:51:27Z</updated>

		<summary type="html">&lt;p&gt;Darien Caldwell: Fixed, thanks ;)&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;== URL(En|De)code ==&lt;br /&gt;
&lt;br /&gt;
I like your idea of referencing similar functions from other languages. Maybe an optional collapsible table (collapsed by default) in the Summary section with function names as links for the other languages? An added bonus of this feature is that it would allow people to search the documentation for LSL functionality based on the names from other languages. Thoughts? -- &#039;&#039;&#039;[[User:Strife_Onizuka|Strife]]&#039;&#039;&#039; &amp;lt;sup&amp;gt;&amp;lt;small&amp;gt;([[User talk:Strife_Onizuka|talk]]|[[Special:Contributions/Strife_Onizuka|contribs]])&amp;lt;/small&amp;gt;&amp;lt;/sup&amp;gt; 13:23, 23 August 2012 (PDT)&lt;br /&gt;
&lt;br /&gt;
Yes I don&#039;t think it needs to be prominent. You hit upon the exact idea behind it, as every time I want to find the two functions mentioned, I&#039;m always looking for llURLEncode() llURLDecode(), It&#039;s just exactly what I expect from other languages. Then I spend a lot of time trying to remember what LL calls them. I figured referencing the common function name would help people like me who often confuse with other languages. So I think your idea is a fine one. [[User:Darien Caldwell|Darien Caldwell]] 22:43, 23 August 2012 (PDT)&lt;br /&gt;
&lt;br /&gt;
I don&#039;t have a good idea as to how this should be templatized (not to mention the entire template &amp;amp; information sprawl issue does gnaw upon me, and I don&#039;t have a good solution for that, and I&#039;m sorry for it). I&#039;m thinking includable subtemplates like the Signature section. Has potential, I&#039;ll do a mockup tomorrow (or when I have time). -- &#039;&#039;&#039;[[User:Strife_Onizuka|Strife]]&#039;&#039;&#039; &amp;lt;sup&amp;gt;&amp;lt;small&amp;gt;([[User talk:Strife_Onizuka|talk]]|[[Special:Contributions/Strife_Onizuka|contribs]])&amp;lt;/small&amp;gt;&amp;lt;/sup&amp;gt; 23:00, 23 August 2012 (PDT)&lt;br /&gt;
&lt;br /&gt;
Take a gander at [[Template:LSL_Other_Languages]]. I&#039;ll transclude it when if you think it&#039;s ready. Do you think it&#039;s important that this is in the Summary section? From a users perspective knowing it&#039;s similar to a function you already know really speeds up learning about it, but only if you know of the function. So having the most popular alternate names visible helps, but having the full table of names does does not. It should be compact and informative at the same time. As a stop gap solution, it is currently showing the first three other function names in the text. -- &#039;&#039;&#039;[[User:Strife_Onizuka|Strife]]&#039;&#039;&#039; &amp;lt;sup&amp;gt;&amp;lt;small&amp;gt;([[User talk:Strife_Onizuka|talk]]|[[Special:Contributions/Strife_Onizuka|contribs]])&amp;lt;/small&amp;gt;&amp;lt;/sup&amp;gt; 09:22, 24 August 2012 (PDT)&lt;br /&gt;
&lt;br /&gt;
:To answer my own question, yes I think it&#039;s important enough to be in the summary section. -- &#039;&#039;&#039;[[User:Strife_Onizuka|Strife]]&#039;&#039;&#039; &amp;lt;sup&amp;gt;&amp;lt;small&amp;gt;([[User talk:Strife_Onizuka|talk]]|[[Special:Contributions/Strife_Onizuka|contribs]])&amp;lt;/small&amp;gt;&amp;lt;/sup&amp;gt; 09:30, 24 August 2012 (PDT)&lt;br /&gt;
&lt;br /&gt;
Yes I think that&#039;s perfect. As long as the search can index the whole table, showing only a few makes sense.  Ship it, I say. :)  [[User:Darien Caldwell|Darien Caldwell]] 11:11, 24 August 2012 (PDT)&lt;br /&gt;
&lt;br /&gt;
== PRIM_LINK_TARGET ==&lt;br /&gt;
&lt;br /&gt;
I didn&#039;t know you could use [[PRIM_LINK_TARGET]] with [[llGetPrimitiveParams]]. That is cool. -- &#039;&#039;&#039;[[User:Strife_Onizuka|Strife]]&#039;&#039;&#039; &amp;lt;sup&amp;gt;&amp;lt;small&amp;gt;([[User talk:Strife_Onizuka|talk]]|[[Special:Contributions/Strife_Onizuka|contribs]])&amp;lt;/small&amp;gt;&amp;lt;/sup&amp;gt; 20:54, 28 August 2012 (PDT)&lt;br /&gt;
&lt;br /&gt;
Yeah i needed it today, and wasn&#039;t sure myself. But it worked. :) [[User:Darien Caldwell|Darien Caldwell]] 00:13, 29 August 2012 (PDT)&lt;br /&gt;
&lt;br /&gt;
== Animation Length Limit Update ==&lt;br /&gt;
&lt;br /&gt;
Thank you for your update to the [[Animation Length Limit]] article I wrote.  I wrote several articles linked in [[Talk:How to create animations]].  I still keep an eye on them.  I hope no others are out of date.&lt;br /&gt;
&lt;br /&gt;
I hope someday all the bugs with the animation system will be fixed, and someone will update the information on that.  I even submitted patches for some, but to my knowledge, they are still unapplied.&lt;br /&gt;
&lt;br /&gt;
[[User:Coaldust Numbers|Coaldust Numbers]] 05:43, 30 June 2013 (PDT)&lt;br /&gt;
&lt;br /&gt;
== Template:LSL Constants/ReturnError ==&lt;br /&gt;
&lt;br /&gt;
I don&#039;t know what I was channeling when I wrote those descriptions. With ERR_GENERIC, I think I started channeling Zork. Which lead me to lookup and then recompose some of the haiku that you will find in the HTML comments in the table. I&#039;m thinking about writing one for each constant. Does that make me insane? -- &#039;&#039;&#039;[[User:Strife_Onizuka|Strife]]&#039;&#039;&#039; &amp;lt;sup&amp;gt;&amp;lt;small&amp;gt;([[User talk:Strife_Onizuka|talk]]|[[Special:Contributions/Strife_Onizuka|contribs]])&amp;lt;/small&amp;gt;&amp;lt;/sup&amp;gt; 22:02, 9 July 2013 (PDT)&lt;br /&gt;
&lt;br /&gt;
LOL, I think it just means you have a sense of humor. :) I shall have to peruse these works.  Are you sure you saved it? The template seems to be unmodified, even from source view.[[User:Darien Caldwell|Darien Caldwell]] 18:12, 10 July 2013 (PDT)&lt;/div&gt;</summary>
		<author><name>Darien Caldwell</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Mesh/Avatar_Shape_XML_Format&amp;diff=1181416</id>
		<title>Mesh/Avatar Shape XML Format</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Mesh/Avatar_Shape_XML_Format&amp;diff=1181416"/>
		<updated>2013-09-07T18:29:47Z</updated>

		<summary type="html">&lt;p&gt;Darien Caldwell: &lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Navbox/Mesh|tech}}&lt;br /&gt;
== History ==&lt;br /&gt;
The Shape XML format has been ingrained in the viewer since the early days, long before mesh existed. However, with the addition of rigged mesh and customized clothing, the file has become invaluable to creators. Sometimes called an &amp;quot;archetype file&amp;quot; due to it&#039;s default name &amp;quot;new_archetype.xml&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
With the release of [[Project_Sunshine-Server_Side_Appearance|Server Side Appearance]] in Early 2013, The XML format has inherited additional information. However, it&#039;s XML version number is still 1.0, and it is still backward compatible with the original terse format. The additions will be outlined separately in the SSA Extensions section.&lt;br /&gt;
&lt;br /&gt;
== Header ==&lt;br /&gt;
The file is standard XML, with 3 parameters:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;US-ASCII&amp;quot; standalone=&amp;quot;yes&amp;quot;?&amp;gt;&lt;br /&gt;
** The &#039;version&#039; parameter sets the version of the XML markup. (should always be 1.0)&lt;br /&gt;
** The &#039;encoding&#039; parameter sets the character encoding for the file. (should always be US-ASCII)&lt;br /&gt;
** The &#039;standaline&#039; parameter informs that the file is self-containted, and not dependent on any external files. (should always be yes)&lt;br /&gt;
  (note that some viewers set standalone=&amp;quot;true&amp;quot;.  This is technically incorrect via the XML standard. It should be &amp;quot;yes&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
== Root Node ==&lt;br /&gt;
The root node is of type &#039;linden_genepool&#039; witih 1 parameter:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;linden_genepool version=&amp;quot;1.0&amp;quot;&amp;gt;&lt;br /&gt;
** The &#039;version&#039; parameter sets the version of the data contained in the node. Currently LL&#039;s data is version 1.0. Future revisions may increment this version, so any implementation should check this version number before using the data.&lt;br /&gt;
&lt;br /&gt;
== Data Body ==&lt;br /&gt;
The Root node contains one node of type &#039;archetype&#039; with one parameter.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;archetype name=&amp;quot;???&amp;quot;&amp;gt;&lt;br /&gt;
** The &#039;name&#039; parameter is a information parameter, and can contain anything, or nothing. Most commonly populated with 3 question marks.&lt;br /&gt;
&lt;br /&gt;
== The Data ==&lt;br /&gt;
The data inside is a list of parameters and textures associated with the Avatar&#039;s appearance. These can be broken up into 4 categories:&lt;br /&gt;
&lt;br /&gt;
* Shape&lt;br /&gt;
* Skin&lt;br /&gt;
* Hair&lt;br /&gt;
* Eyes&lt;br /&gt;
&lt;br /&gt;
Each category will have several &amp;quot;param&amp;quot; nodes and possibly &amp;quot;texture&amp;quot; nodes included. More about these nodes in the next section.&lt;br /&gt;
&lt;br /&gt;
== Param Nodes ==&lt;br /&gt;
&amp;quot;param&amp;quot; nodes correspond to sliders in the appearance pane. Each has 3 parameters:&lt;br /&gt;
*Example: &amp;lt;param id=&amp;quot;649&amp;quot; name=&amp;quot;torso muscles&amp;quot; value=&amp;quot;0.500&amp;quot;/&amp;gt;&lt;br /&gt;
** The &#039;id&#039; parameter corresponds to an internal viewer table of possible sliders. These numbers are guaranteed to be unique, and always correspond to the same slider.&lt;br /&gt;
** The &#039;name&#039; parameter corresponds to internal &#039;driving elements&#039; in the viewer. This can vary depending on the type of param. For shapes, it&#039;s often the name of the morph being controlled. For skins or eyes, it&#039;s usually a material that&#039;s being changed (color etc).  For hair, a combination of both are present. These are *not* always unique. For example, there are two parameters called &amp;quot;torso muscles&amp;quot;, with different IDs (one for male, one for female).&lt;br /&gt;
** The &#039;value&#039; parameter is the value of the slider. It is however in the internally used format, not the 0-100 value seen by Residents. Calculating what these values mean requires finding the Minimum and Maximum of that value from other sources, such as the [[Avatar_Appearance#Linden_avatar_definition_file|Linden Avatar Definition File]] (avatar_lad.xml)&lt;br /&gt;
&lt;br /&gt;
== Texture Nodes ==&lt;br /&gt;
&amp;quot;texture&amp;quot; nodes correspond to textures applied via the appearance pane. Each has 2 parameters:&lt;br /&gt;
*Example: &amp;lt;texture te=&amp;quot;3&amp;quot; uuid=&amp;quot;00000000-0000-0000-0000-000000000000&amp;quot;/&amp;gt;&lt;br /&gt;
** The &#039;te&#039; parameter corresponds to an internal viewer table of possible textures. These numbers are guaranteed to be unique.&lt;br /&gt;
** The &#039;uuid&#039; parameter corresponds to the UUID of the texture applied at the time of the XML creation.&lt;br /&gt;
  Note that &#039;texture&#039; nodes are optional and not guaranteed to be present. Especially when the file is generated from 3rd party sources.&lt;br /&gt;
&lt;br /&gt;
== Comments ==&lt;br /&gt;
Comments are styled in the standard HTML style, with the string &amp;lt;html4strict&amp;gt;&amp;lt;!--&amp;lt;/html4strict&amp;gt; denoting the start of a comment, and &amp;lt;html4strict&amp;gt;--&amp;gt;&amp;lt;/html4strict&amp;gt; denoting the end of a comment. This is per the XML specification.&lt;br /&gt;
*Example: &amp;lt;html4strict&amp;gt;&amp;lt;!-- wearable: shape --&amp;gt;&amp;lt;/html4strict&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== File Termination ==&lt;br /&gt;
The file is terminated by the closing of the &#039;archetype&#039; and &#039;linden_genepool&#039; nodes:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;/archetype&amp;gt;&amp;lt;/linden_genepool&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== SSA Extensions ==&lt;br /&gt;
The Two main changes with SSA are the addition of *many* new &#039;Param&#039; nodes , and the inclusion of new data in all &#039;Param&#039; nodes.&lt;br /&gt;
*The additional &#039;param&#039; nodes now cover more than just the avatar&#039;s body shape and texture. Now, there is data for every possible avatar appearance modifier, including all clothes layers, alpha layers, tattoo layers, all internal morphs, and all settings for these items. In short there is every bit of data needed to completely recreate the entire avatar&#039;s &#039;look&#039;.&lt;br /&gt;
*The new parameters included in the &#039;Param&#039; nodes is *in addition to* the original parameters. All of the originally available parameters are still provided. The new parameters are as follows:&lt;br /&gt;
**The &#039;u8&#039; parameter is a short integer normalized representation of the displayed slider value. Whereas before some complex math was necessary to determine what 0-100 slider value was indicated by the morph value in the &#039;value&#039; parameter, now you can simply take the u8 value, divide it by 255, then multiply that value by 100. That will give you the displayed slider values.  255 would be a slider value of 100, 128 would be a slider value of 50, and 0 would of course be 0.&lt;br /&gt;
**The &#039;type&#039; parameter is a rough indication of what kind of data the &#039;param&#039; entry is associated with. There seem to be 5 distinct values, which likely correspond to entries in the [[Avatar_Appearance#Linden_avatar_definition_file|Linden Avatar Definition File]] (avatar_lad.xml)&lt;br /&gt;
*** param_morph, param_driver, param_skeleton, param_color, param_alpha&lt;br /&gt;
** The &#039;wearable&#039; parameter further groups &#039;param&#039; entries into distinct groups. These clearly indicate what avatar component the &#039;param&#039; node is associated with. There seem to be 16 distinct values:&lt;br /&gt;
*** shape, hair, invalid, gloves, eyes, skin, pants, shoes, shirt, jacket, socks, underpants, undershirt, skirt, tattoo, physics&lt;br /&gt;
** The &#039;invalid&#039; wearable indicates a morph.&lt;/div&gt;</summary>
		<author><name>Darien Caldwell</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Mesh/Avatar_Shape_XML_Format&amp;diff=1181415</id>
		<title>Mesh/Avatar Shape XML Format</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Mesh/Avatar_Shape_XML_Format&amp;diff=1181415"/>
		<updated>2013-09-07T18:06:10Z</updated>

		<summary type="html">&lt;p&gt;Darien Caldwell: /* History */  Adding info about SSA expansion of format&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Navbox/Mesh|tech}}&lt;br /&gt;
== History ==&lt;br /&gt;
The Shape XML format has been ingrained in the viewer since the early days, long before mesh existed. However, with the addition of rigged mesh and customized clothing, the file has become invaluable to creators. Sometimes called an &amp;quot;archetype file&amp;quot; due to it&#039;s default name &amp;quot;new_archetype.xml&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
With the release of [[Project_Sunshine-Server_Side_Appearance|Server Side Appearance]] in Early 2013, The XML format has inherited additional information. However, it&#039;s XML version number is still 1.0, and it is still backward compatible with the original terse format. The additions will be outlined separately in the SSA Extensions section.&lt;br /&gt;
&lt;br /&gt;
== Header ==&lt;br /&gt;
The file is standard XML, with 3 parameters:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;?xml version=&amp;quot;1.0&amp;quot; encoding=&amp;quot;US-ASCII&amp;quot; standalone=&amp;quot;yes&amp;quot;?&amp;gt;&lt;br /&gt;
** The &#039;version&#039; parameter sets the version of the XML markup. (should always be 1.0)&lt;br /&gt;
** The &#039;encoding&#039; parameter sets the character encoding for the file. (should always be US-ASCII)&lt;br /&gt;
** The &#039;standaline&#039; parameter informs that the file is self-containted, and not dependent on any external files. (should always be yes)&lt;br /&gt;
  (note that some viewers set standalone=&amp;quot;true&amp;quot;.  This is technically incorrect via the XML standard. It should be &amp;quot;yes&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
== Root Node ==&lt;br /&gt;
The root node is of type &#039;linden_genepool&#039; witih 1 parameter:&lt;br /&gt;
&lt;br /&gt;
* &amp;lt;linden_genepool version=&amp;quot;1.0&amp;quot;&amp;gt;&lt;br /&gt;
** The &#039;version&#039; parameter sets the version of the data contained in the node. Currently LL&#039;s data is version 1.0. Future revisions may increment this version, so any implementation should check this version number before using the data.&lt;br /&gt;
&lt;br /&gt;
== Data Body ==&lt;br /&gt;
The Root node contains one node of type &#039;archetype&#039; with one parameter.&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;archetype name=&amp;quot;???&amp;quot;&amp;gt;&lt;br /&gt;
** The &#039;name&#039; parameter is a information parameter, and can contain anything, or nothing. Most commonly populated with 3 question marks.&lt;br /&gt;
&lt;br /&gt;
== The Data ==&lt;br /&gt;
The data inside is a list of parameters and textures associated with the Avatar&#039;s appearance. These can be broken up into 4 categories:&lt;br /&gt;
&lt;br /&gt;
* Shape&lt;br /&gt;
* Skin&lt;br /&gt;
* Hair&lt;br /&gt;
* Eyes&lt;br /&gt;
&lt;br /&gt;
Each category will have several &amp;quot;param&amp;quot; nodes and possibly &amp;quot;texture&amp;quot; nodes included. More about these nodes in the next section.&lt;br /&gt;
&lt;br /&gt;
== Param Nodes ==&lt;br /&gt;
&amp;quot;param&amp;quot; nodes correspond to sliders in the appearance pane. Each has 3 parameters:&lt;br /&gt;
*Example: &amp;lt;param id=&amp;quot;649&amp;quot; name=&amp;quot;torso muscles&amp;quot; value=&amp;quot;0.500&amp;quot;/&amp;gt;&lt;br /&gt;
** The &#039;id&#039; parameter corresponds to an internal viewer table of possible sliders. These numbers are guaranteed to be unique, and always correspond to the same slider.&lt;br /&gt;
** The &#039;name&#039; parameter corresponds to internal &#039;driving elements&#039; in the viewer. This can vary depending on the type of param. For shapes, it&#039;s often the name of the morph being controlled. For skins or eyes, it&#039;s usually a material that&#039;s being changed (color etc).  For hair, a combination of both are present. These are *not* always unique. For example, there are two parameters called &amp;quot;torso muscles&amp;quot;, with different IDs (one for male, one for female).&lt;br /&gt;
** The &#039;value&#039; parameter is the value of the slider. It is however in the internally used format, not the 0-100 value seen by Residents. Calculating what these values mean requires finding the Minimum and Maximum of that value from other sources, such as the [[Avatar_Appearance#Linden_avatar_definition_file|Linden Avatar Definition File]] (avatar_lad.xml)&lt;br /&gt;
&lt;br /&gt;
== Texture Nodes ==&lt;br /&gt;
&amp;quot;texture&amp;quot; nodes correspond to textures applied via the appearance pane. Each has 2 parameters:&lt;br /&gt;
*Example: &amp;lt;texture te=&amp;quot;3&amp;quot; uuid=&amp;quot;00000000-0000-0000-0000-000000000000&amp;quot;/&amp;gt;&lt;br /&gt;
** The &#039;te&#039; parameter corresponds to an internal viewer table of possible textures. These numbers are guaranteed to be unique.&lt;br /&gt;
** The &#039;uuid&#039; parameter corresponds to the UUID of the texture applied at the time of the XML creation.&lt;br /&gt;
  Note that &#039;texture&#039; nodes are optional and not guaranteed to be present. Especially when the file is generated from 3rd party sources.&lt;br /&gt;
&lt;br /&gt;
== Comments ==&lt;br /&gt;
Comments are styled in the standard HTML style, with the string &amp;lt;html4strict&amp;gt;&amp;lt;!--&amp;lt;/html4strict&amp;gt; denoting the start of a comment, and &amp;lt;html4strict&amp;gt;--&amp;gt;&amp;lt;/html4strict&amp;gt; denoting the end of a comment. This is per the XML specification.&lt;br /&gt;
*Example: &amp;lt;html4strict&amp;gt;&amp;lt;!-- wearable: shape --&amp;gt;&amp;lt;/html4strict&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== File Termination ==&lt;br /&gt;
The file is terminated by the closing of the &#039;archetype&#039; and &#039;linden_genepool&#039; nodes:&lt;br /&gt;
&lt;br /&gt;
*&amp;lt;/archetype&amp;gt;&amp;lt;/linden_genepool&amp;gt;&lt;/div&gt;</summary>
		<author><name>Darien Caldwell</name></author>
	</entry>
</feed>