<?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=Inusaito+Kanya</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=Inusaito+Kanya"/>
	<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/wiki/Special:Contributions/Inusaito_Kanya"/>
	<updated>2026-07-31T21:26:42Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Limits&amp;diff=1183160</id>
		<title>Limits</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Limits&amp;diff=1183160"/>
		<updated>2013-10-30T02:33:16Z</updated>

		<summary type="html">&lt;p&gt;Inusaito Kanya: /* Sound */&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;Take Off&#039;&#039;&#039; &amp;gt; &#039;&#039;&#039;HUD&#039;&#039;&#039; or &#039;&#039;&#039;Detach&#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 per slot&#039;&#039;&#039; - 5 (this includes alpha and Tattoo Layers)&lt;br /&gt;
* &#039;&#039;&#039;Max Clothing Texture&#039;&#039;&#039; - 512x512px - Server Side Appearance will downsize larger textures. &amp;lt;!--per Nyx Linden 9/23/2013 Contenet 7 Mesh Meeting--&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Max. unassisted fly height&#039;&#039;&#039; - Stable hover at 5064m.&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;&lt;br /&gt;
** &#039;&#039;&#039;Server 1.27.1&#039;&#039;&#039; - 10 teleports per 15 seconds&lt;br /&gt;
** &#039;&#039;&#039;Server 1.27.0&#039;&#039;&#039; - 3 teleports per 15 seconds&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;Category&#039;&#039;&#039;&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;
||[[Animation]]&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;
||[[Animation]]&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&lt;br /&gt;
| n/a&lt;br /&gt;
&lt;br /&gt;
|-&lt;br /&gt;
||[[Animation]]&lt;br /&gt;
||animation priority&lt;br /&gt;
| {{no|0}}&lt;br /&gt;
| {{no|4, with custom tools 5}}&lt;br /&gt;
| n/a&lt;br /&gt;
| [[Animation_Priority]]&lt;br /&gt;
|-&lt;br /&gt;
||[[Animation]]&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;
== 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;Category&#039;&#039;&#039;&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;
||&#039;&#039;&#039;BUILDING&#039;&#039;&#039;&lt;br /&gt;
||[[Prim]] dimensions&lt;br /&gt;
| {{no|&amp;lt;0.01, 0.01, 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]] and [[PRIM_SIZE]] and [[Megaprim]]&lt;br /&gt;
|-&lt;br /&gt;
||&#039;&#039;&#039;BUILDING&#039;&#039;&#039;&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;
||&#039;&#039;&#039;BUILDING&#039;&#039;&#039;&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;
||&#039;&#039;&#039;BUILDING&#039;&#039;&#039;&lt;br /&gt;
||Physics weight 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;
| n/a&lt;br /&gt;
|-&lt;br /&gt;
||&#039;&#039;&#039;BUILDING&#039;&#039;&#039;&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;
||&#039;&#039;&#039;BUILDING&#039;&#039;&#039;&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;
||&#039;&#039;&#039;BUILDING&#039;&#039;&#039;&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;
||&#039;&#039;&#039;BUILDING&#039;&#039;&#039;&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;
||&#039;&#039;&#039;BUILDING&#039;&#039;&#039;&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;
||&#039;&#039;&#039;BUILDING&#039;&#039;&#039;&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;Category&#039;&#039;&#039;&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;
||[[Communication]]&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;
||[[Communication]]&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.&lt;br /&gt;
| n/a&lt;br /&gt;
|-&lt;br /&gt;
||[[Communication]]&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;
||[[Communication]]&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 1180 bytes or single-byte characters. This is true as of 2012-08-13.&lt;br /&gt;
| [[llInstantMessage]]&lt;br /&gt;
|-&lt;br /&gt;
||[[Communication]]&lt;br /&gt;
||Number of offline messages&lt;br /&gt;
| n/a&lt;br /&gt;
| {{no|Capped at 25 messages.}}&lt;br /&gt;
| Number of offline messages (involving [[IM|IMs]], inventory offers, group notices, group invitations) received before messages get capped.&lt;br /&gt;
| [[IM]]&lt;br /&gt;
|-&lt;br /&gt;
||[[Communication]]&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;
||[[Communication]]&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;
||[[Communication]]&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;
||[[Communication]]&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;Category&#039;&#039;&#039;&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;
||[[Gesture]]&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 [[Viewer_2_Quick_Start_Guide/Appendix_-_Keyboard_Shortcuts]]&lt;br /&gt;
|-&lt;br /&gt;
||[[Gesture]]&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;
||[[Gesture]]&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 an Inventory Folder:&#039;&#039;&#039; Approximately 10,000.&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;
&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/Q/128/128/24 Q].&lt;br /&gt;
* &#039;&#039;&#039;Maximum &amp;quot;NO ENTRY&amp;quot; ban line height:&#039;&#039;&#039; is for all options 80 meter. Only the option &#039;Banned Residents&#039; (named) has a 5020 meter ban line high, which is visible up to a high of 800 meter above the terrain mesh.&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, Blumfield, Boardman, Brown, De Haro, Nautilus City Regions, Nova Albion Regions, Shermerville Regions, and West Haven.&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 (mainland limit), 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;Mainland maximum number of agents&#039;&#039;&#039;&lt;br /&gt;
** Full region: 100 (Historically set to 40 by LL 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;Island maximum number of agents:&#039;&#039;&#039;&lt;br /&gt;
** Full region: 100&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;
* &#039;&#039;&#039;[[Classic clouds]] layer:&#039;&#039;&#039; Approximately 150-225 meters, although the edges of particles can appear to exceed that.&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;Category&#039;&#039;&#039;&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;
||[[Mesh]]&lt;br /&gt;
||Number of vertices&lt;br /&gt;
| n/a&lt;br /&gt;
| {{no|65536 vertices per LOD for each [[mesh]]}}&lt;br /&gt;
| n/a&lt;br /&gt;
| n/a&lt;br /&gt;
|-&lt;br /&gt;
||[[Mesh]]&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;
||[[Mesh]]&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;
||[[Mesh]]&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;
||[[Mesh]]&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;
||[[Mesh]]&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 a bug. (2/2013)&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; 2147483583&lt;br /&gt;
** This is lower than the &#039;&#039;Absolute height limit&#039;&#039; above probably because of precision issues. Any value higher than 2147483583 would be rounded up to something beyond 2147483647 and thus cause an [http://en.wikipedia.org/wiki/Arithmetic_overflow overflow], while 2147483583 will still be rounded down to 2147483520 (see below).&lt;br /&gt;
* &#039;&#039;&#039;Highest altitude you can teleport to with an SLurl:&#039;&#039;&#039; 2147483520 meters&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 Help menu &amp;gt; Lag Meter, or for more advanced usage, see View menu &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]] ==&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 continue to remain active when you fly down or enter a no-script parcel.&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 memory size of Mono scripts can be reduced with [[LlSetMemoryLimit]]).&lt;br /&gt;
* &#039;&#039;&#039;Maximum activ listener 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, &#039;&#039;local chat&#039;&#039; 0  &#039;&#039;and&#039;&#039; [[DEBUG_CHANNEL]].&lt;br /&gt;
* For specific scripting limits, lookup 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;Category&#039;&#039;&#039;&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]]&lt;br /&gt;
||Sound length&lt;br /&gt;
| n/a&lt;br /&gt;
| {{no|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;
=== 1.x Series Viewers ===&lt;br /&gt;
&lt;br /&gt;
(official Viewer up to 1.23.5, most [[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;
=== 2.x Series Viewers ===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;Search &amp;gt; Classifieds thumbnail&#039;&#039;&#039; - 4:3 (60&amp;amp;times;45 pixels)&lt;br /&gt;
* &#039;&#039;&#039;Search &amp;gt; Classifieds expanded&#039;&#039;&#039; - ~4:3 (252&amp;amp;times;188 pixels)&lt;br /&gt;
* &#039;&#039;&#039;Search &amp;gt; Classifieds expanded &amp;gt; Details&#039;&#039;&#039; - 17:7 (272&amp;amp;times;112 pixels)&lt;br /&gt;
* &#039;&#039;&#039;Search &amp;gt; People&#039;&#039;&#039; - 4:3 (188&amp;amp;times;141 pixels)&lt;br /&gt;
* &#039;&#039;&#039;Search &amp;gt; Destination Guide thumbnail&#039;&#039;&#039; - ~4:3 (45&amp;amp;times;34 pixels)&lt;br /&gt;
* &#039;&#039;&#039;Search &amp;gt; Destination Guide expanded&#039;&#039;&#039; - 5:3 (250&amp;amp;times;150 pixels)&lt;br /&gt;
* &#039;&#039;&#039;Profile &amp;gt; 2nd Life tab&#039;&#039;&#039; - ~1:1 (100&amp;amp;times;99 pixels)&lt;br /&gt;
* &#039;&#039;&#039;Profile &amp;gt; Picks thumbnail&#039;&#039;&#039; - 8:5 (88&amp;amp;times;55 pixels)&lt;br /&gt;
* &#039;&#039;&#039;Profile &amp;gt; Pick expanded&#039;&#039;&#039; - ~5:3 (285&amp;amp;times;172 pixels)&lt;br /&gt;
* &#039;&#039;&#039;About Land &amp;gt; Options tab&#039;&#039;&#039; - ~20:13 (193&amp;amp;times;125 pixels)&lt;br /&gt;
* &#039;&#039;&#039;Places &amp;gt; More information&#039;&#039;&#039; - ~11:7 (272&amp;amp;times;173 pixels)&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>Inusaito Kanya</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Viewer_2_Microsoft_Windows_Builds&amp;diff=1170692</id>
		<title>Viewer 2 Microsoft Windows Builds</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Viewer_2_Microsoft_Windows_Builds&amp;diff=1170692"/>
		<updated>2012-07-17T23:47:56Z</updated>

		<summary type="html">&lt;p&gt;Inusaito Kanya: Make the top of the page look more proper&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{multi-lang}}&lt;br /&gt;
&lt;br /&gt;
Philosophy: to keep it brief, this page should only include steps we KNOW ARE NEEDED, not random hints.  Extra details or open issues can go on the talk page.&lt;br /&gt;
&lt;br /&gt;
{{KBnote|Following this recipe will probably take 6 to 12 hours of wall-clock time, and 2 to 6 hours of your time, if you&#039;re starting from a fresh Windows XP/Vista/7 system.}}&lt;br /&gt;
&lt;br /&gt;
{{KBcaution|If you want alter the build instructions please try to have a discussion with at least one person on [irc://irc.freenode.net/opensl #opensl on Freenode].  There are language and stylistic conventions we try to follow and we want to make sure any change to these instructions is tested in a number of build environments before being published here.}}&lt;br /&gt;
{{CompileNav}} &lt;br /&gt;
&lt;br /&gt;
== Establish your programming environment ==&lt;br /&gt;
&lt;br /&gt;
This is needed for compiling any viewer based on the LL open source code and only needs to be done once.&lt;br /&gt;
&lt;br /&gt;
=== Install and update Visual Studio and SDKs ===&lt;br /&gt;
&lt;br /&gt;
*Install [http://www.microsoft.com/visualstudio/en-us/products/2010-editions/visual-cpp-express Visual C++ 2010 Express] (Web install) or [http://go.microsoft.com/?linkid=9709969 Visual C++ 2010 Express] (ISO)&lt;br /&gt;
*Install [http://www.microsoft.com/downloads/en/details.aspx?FamilyID=a7b7a05e-6de6-4d3a-a423-37bf0912db84&amp;amp;displaylang=en Microsoft Visual C++ 2010 Redistributable Package]&lt;br /&gt;
*Install [http://www.microsoft.com/downloads/en/details.aspx?FamilyID=6B6C21D2-2006-4AFA-9702-529FA782D63B Windows SDK for Windows 7 and .NET Framework 4] (Web install) [Note: uncheck the Redistributable Package option to prevent installation failure] or [http://www.microsoft.com/downloads/en/details.aspx?FamilyID=35aeda01-421d-4ba5-b44b-543dc8c33a20 Windows SDK for Windows 7 and .NET Framework 4] (ISO)&lt;br /&gt;
*Install  [http://www.microsoft.com/downloads/en/details.aspx?displaylang=en&amp;amp;FamilyID=3021d52b-514e-41d3-ad02-438a3ba730ba DirectX SDK (June 2010)]&lt;br /&gt;
*Run [http://www.update.microsoft.com/microsoftupdate/v6 Microsoft Update], and keep running it until no updates are needed. This may take 6~8 iterations on older versions of windows.&lt;br /&gt;
** For Windows Vista and Windows 7, you need to select &amp;quot;Get updates from other Microsoft products&amp;quot; to get the updates for Visual Studio. &lt;br /&gt;
** For Windows XP, use the provided link above.  The Windows Update menu item on your computer is not the correct updater to use.&lt;br /&gt;
** During the update cycles make sure you have picked up   [http://www.microsoft.com/downloads/en/confirmation.aspx?FamilyID=75568aa6-8107-475d-948a-ef22627e57a5  Microsoft Visual Studio 2010 Service Pack 1] (Web install) or [http://go.microsoft.com/fwlink/?LinkId=210710 Microsoft Visual Studio 2010 Service Pack 1] (ISO)&lt;br /&gt;
*If you are running VS2010 under anything older than Windows 7, then you might need to install the &amp;quot;Windows Automation&amp;quot; library to avoid seeing VS2010&#039;s UI crawl like a tortoise. [http://support.microsoft.com/kb/981741 Here is the relevant MS support article].&lt;br /&gt;
&lt;br /&gt;
=== Install required development tools ===&lt;br /&gt;
&lt;br /&gt;
{{KBnote|The order of the following installations should not matter.}}&lt;br /&gt;
{{KBnote|If the installer for a particular package does not update your PATH environment variable you will have to do this manually.}}&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;CMake&#039;&#039;&#039; ([http://www.cmake.org/HTML/Download.html download CMake])&lt;br /&gt;
** This should be version 2.8.4 (or above in the 2.8.x series).&lt;br /&gt;
**Add the &amp;lt;code&amp;gt;\bin&amp;lt;/code&amp;gt; directory to your path.&lt;br /&gt;
* &#039;&#039;&#039;Python&#039;&#039;&#039; (either [http://www.python.org/download/ Standard Python] or [http://www.activestate.com/activepython/downloads ActivePython])&lt;br /&gt;
** Version 2.7.1 works with the build scripts.&lt;br /&gt;
* &#039;&#039;&#039;Mercurial&#039;&#039;&#039; (either [http://tortoisehg.bitbucket.org/ TortoiseHg] or [http://mercurial.selenic.com/ Mercurial Hg])&lt;br /&gt;
**Create a new file &amp;lt;code&amp;gt;%USERPROFILE%\Mercurial.ini&amp;lt;/code&amp;gt; and in it put your Second Life name and optionally your email address:&lt;br /&gt;
 [ui]&lt;br /&gt;
 username = John Doe &amp;lt;john@example.com&amp;gt;&lt;br /&gt;
* &#039;&#039;&#039;Cygwin&#039;&#039;&#039; ([http://www.cygwin.com/ download Cygwin])&lt;br /&gt;
** When you run the cygwin setup utility make sure you have selected to install &#039;&#039;&#039;unzip&#039;&#039;&#039; (under &amp;quot;Archives&amp;quot;), &#039;&#039;&#039;bison&#039;&#039;&#039;, &#039;&#039;&#039;flex&#039;&#039;&#039;, &#039;&#039;&#039;patchutils&#039;&#039;&#039; (all located under &amp;quot;devel&amp;quot;), and &#039;&#039;&#039;curl&#039;&#039;&#039; (under &amp;quot;Web&amp;quot;), which are not part of the default install. Do not install Cygwin Python or Mercurial.  You won&#039;t need to use the Cygwin shell for anything.&lt;br /&gt;
**Add  the &amp;lt;code&amp;gt;cygwin\bin&amp;lt;/code&amp;gt; directory to the &#039;&#039;&#039;very end&#039;&#039;&#039; of your path and make sure it stays that way.&lt;br /&gt;
&lt;br /&gt;
=== Install optional development tools ===&lt;br /&gt;
&lt;br /&gt;
* [http://code.google.com/p/unsis/downloads/list Unicode NSIS (Nullsoft Scriptable Install System)]&lt;br /&gt;
** This is the package installer used to build &amp;lt;code&amp;gt;Second_Life_&amp;lt;version-code&amp;gt;_LindenDeveloper_Setup.exe&amp;lt;/code&amp;gt;. You only need this package if you are going to distribute the viewer you compile or if you want to install it locally.&lt;br /&gt;
*: In the [[#Configuring_the_Viewer|Configure VS2010 step]] below you will need to add a line in the &#039;&#039;&#039;Executable Directories&#039;&#039;&#039; section:&lt;br /&gt;
*:* 64 bit systems use &amp;lt;code&amp;gt;%ProgramFiles(x86)%\NSIS\Unicode&amp;lt;/code&amp;gt;&lt;br /&gt;
*:* 32 bit systems use &amp;lt;code&amp;gt;%ProgramFiles%\NSIS\Unicode&amp;lt;/code&amp;gt;&lt;br /&gt;
* [http://notepadplusplus.org/ Notepad++]&lt;br /&gt;
** You need to use an editor that conforms to the [[Coding Standard]]. In particular, you must not check in files with DOS line endings except in very limited circumstances; see [[How to avoid DOS line endings in Windows tools]].&lt;br /&gt;
* [[Mercurial_Tools]] (strongly recommended)&lt;br /&gt;
** When you are following these instructions you will be updating the &amp;lt;code&amp;gt;%USERPROFILE%\Mercurial.ini&amp;lt;/code&amp;gt; file you created when you installed Mercurial.&lt;br /&gt;
&lt;br /&gt;
=== Install Autobuild ===&lt;br /&gt;
* Follow the directions at [[Autobuild#Getting_Autobuild|Getting Autobuild]] to install Autobuild.&lt;br /&gt;
&lt;br /&gt;
* Add an environment variable, so that autobuild doesn&#039;t default to using (or trying) older compiler versions:&lt;br /&gt;
** Right-click &amp;quot;My Computer&amp;quot; and select &#039;&#039;&#039;Properties&#039;&#039;&#039; or press the windows logo key and the pause key at the same time.&lt;br /&gt;
** For XP, when the Properties dialog opens, click the &#039;&#039;&#039;Advanced&#039;&#039;&#039; tab followed by the &#039;&#039;&#039;Environmental Variables&#039;&#039;&#039; button. This will open a new window with a list of System and User variables. For Vista and later, when the System Properties window opens, click the &#039;&#039;&#039;Advanced system settings&#039;&#039;&#039; on the left column, then click &#039;&#039;&#039;Environment Variables...&#039;&#039;&#039;&lt;br /&gt;
** In the User section, click &#039;&#039;&#039;New&#039;&#039;&#039;. Set &#039;&#039;&#039;Variable Name&#039;&#039;&#039; to AUTOBUILD_VSVER and set &#039;&#039;&#039;Variable Value&#039;&#039;&#039; to 100.&lt;br /&gt;
** Click the OK/Close buttons to close all the windows.&lt;br /&gt;
&lt;br /&gt;
=== Configure VC2010 ===&lt;br /&gt;
While you may choose to use autobuild for all your compiling you still need to establish certain settings internal to VC2010.&lt;br /&gt;
&lt;br /&gt;
*Start the IDE.&lt;br /&gt;
&lt;br /&gt;
*Navigate to &#039;&#039;&#039;Tools&#039;&#039;&#039; &amp;gt; &#039;&#039;&#039;Options&#039;&#039;&#039; &amp;gt; &#039;&#039;&#039;Projects and Solutions&#039;&#039;&#039; &amp;gt; &#039;&#039;&#039;Build and Run&#039;&#039;&#039; and set &#039;&#039;&#039;maximum number of parallel projects builds&#039;&#039;&#039; to &amp;lt;code&amp;gt;1&amp;lt;/code&amp;gt;.&lt;br /&gt;
*(VC Express only) Enable Tools &amp;gt; Settings &amp;gt; Expert Settings to get the Build (and other) menus. If you already have a &#039;&#039;&#039;Build&#039;&#039;&#039; menu you do not need to perform this step.&lt;br /&gt;
&lt;br /&gt;
{{KBnote|The following steps require an open visual studio project.  It does not matter which project you use, as you will only change some global settings used by all projects when they are opened.  The open project itself won&#039;t be changed.}}&lt;br /&gt;
&lt;br /&gt;
You will need to set a number of paths. &lt;br /&gt;
* Open any existing project you may have or make a New Project.&lt;br /&gt;
&lt;br /&gt;
* Navigate to &#039;&#039;&#039;View&#039;&#039;&#039; ( &amp;gt; &#039;&#039;&#039;Other Windows&#039;&#039;&#039; ) &amp;gt; &#039;&#039;&#039;Property Manager&#039;&#039;&#039;. You will see Property Manager as a pane on the left side.&lt;br /&gt;
&lt;br /&gt;
At the bottom on the Solution Explorer you will see three tabs.&lt;br /&gt;
&lt;br /&gt;
*Click the one on the right labeled &#039;&#039;&#039;Property Manager&#039;&#039;&#039;. (The name may be somewhat truncated.)&lt;br /&gt;
&lt;br /&gt;
[[File:VS2010_Property_Manager.PNG|100px]]&lt;br /&gt;
[[:File:VS2010_Property_Manager.PNG|Example image]]&lt;br /&gt;
&lt;br /&gt;
*On the left side click to expand any project and then click again to expand the &#039;&#039;&#039;Release&#039;&#039;&#039; folder.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2010_Project_Config.PNG|100px]]&lt;br /&gt;
[[:File:VS2010_Project_Config.PNG|Example image]]&lt;br /&gt;
&lt;br /&gt;
*Right click on &#039;&#039;&#039;Microsoft.Cpp.Win32.user&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
*Pick &#039;&#039;&#039;General&#039;&#039;&#039;&lt;br /&gt;
Set &#039;&#039;&#039;Enable Managed Incremental Build&#039;&#039;&#039; to &amp;lt;code&amp;gt;Yes&amp;lt;/code&amp;gt;.&lt;br /&gt;
&lt;br /&gt;
*Pick &#039;&#039;&#039;VC++ Directories&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
This is where the build environment is pulled together into a functional VC2010 build system and also where much hand wringing, hair pulling, and fist pounding frustration takes place.&lt;br /&gt;
&lt;br /&gt;
*Set &#039;&#039;&#039;Executable Directories&#039;&#039;&#039; to:&lt;br /&gt;
&lt;br /&gt;
 $(ExecutablePath)&lt;br /&gt;
 $(DXSDK_DIR)&lt;br /&gt;
 $(WindowsSdkDir)\Bin&lt;br /&gt;
 C:\cygwin\bin&lt;br /&gt;
 $(SystemRoot)&lt;br /&gt;
&lt;br /&gt;
[[File:32BitExecutableDirectories.png|100px]]&lt;br /&gt;
[[:File:32BitExecutableDirectories.png|32 bit Executable Directories example image]]&lt;br /&gt;
&lt;br /&gt;
*Set &#039;&#039;&#039;Include Directories&#039;&#039;&#039; to:&lt;br /&gt;
&lt;br /&gt;
 $(WindowsSdkDir)\Include&lt;br /&gt;
 $(WindowsSdkDir)\Include\gl&lt;br /&gt;
 $(DXSDK_DIR)\Include&lt;br /&gt;
&lt;br /&gt;
[[File:32BitIncludeDirectories.png|100px]]&lt;br /&gt;
[[:File:32BitIncludeDirectories.png|32 bit Include Directories example image]]&lt;br /&gt;
&lt;br /&gt;
*Set &#039;&#039;&#039;Library Directories&#039;&#039;&#039; to:&lt;br /&gt;
&lt;br /&gt;
 $(WindowsSdkDir)\Lib&lt;br /&gt;
 $(DXSDK_DIR)&lt;br /&gt;
&lt;br /&gt;
[[File:32BitLibraryDirectories.png|100px]]&lt;br /&gt;
[[:File:32BitLibraryDirectories.png|32 bit Library Directories example image]]&lt;br /&gt;
&lt;br /&gt;
== Set up your source code tree ==&lt;br /&gt;
&lt;br /&gt;
Plan your directory structure ahead of time.  If you are going to be producing changes or patches you will be cloning a copy of an unaltered source code tree for every change or patch you make, so you might want to have all this work stored in it&#039;s own directory.&lt;br /&gt;
&lt;br /&gt;
To get a copy of the source code tree:&lt;br /&gt;
* Open up a DOS Command window&lt;br /&gt;
* CD to where you want to install viewer-release.  Do not have any spaces in this path.&lt;br /&gt;
* Do:&lt;br /&gt;
 hg clone &amp;lt;nowiki&amp;gt;http://hg.secondlife.com/viewer-release&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Let&#039;s say some time has gone by since you have performed the previous steps and now you want to develop a change or work on a jira.  You will update your clean local repository with all the changes committed to viewer-release since you last synchronized your files:&lt;br /&gt;
* CD into &amp;lt;code&amp;gt;viewer-release&amp;lt;/code&amp;gt;&lt;br /&gt;
* Do:&lt;br /&gt;
 hg pull -u&lt;br /&gt;
&lt;br /&gt;
* Move up one level from &amp;lt;code&amp;gt;viewer-release&amp;lt;/code&amp;gt;&lt;br /&gt;
* Do:&lt;br /&gt;
 hg clone viewer-release VWR-nnnnn&lt;br /&gt;
Note: &amp;lt;code&amp;gt;nnnnn&amp;lt;/code&amp;gt; is the jira number.  You can also clone to a name of your choosing if you are making changes not associated with the LL jira system.&lt;br /&gt;
&lt;br /&gt;
== Prepare third party libraries ==&lt;br /&gt;
Most third party libraries needed to build the viewer will be automatically downloaded for you and installed into the build directory within your source tree during the [[#Configuring_the_Viewer|configuration step]] below. Some few need to be manually set up, though, when using an open source developer configuration (&amp;lt;code&amp;gt;Release&#039;&#039;&#039;OS&#039;&#039;&#039;&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;RelWithDebInfo&#039;&#039;&#039;OS&#039;&#039;&#039;&amp;lt;/code&amp;gt; or &amp;lt;code&amp;gt;Debug&#039;&#039;&#039;OS&#039;&#039;&#039;&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
=== Fmod ===&lt;br /&gt;
&lt;br /&gt;
{{KBcaution|If you are just starting out building the viewer or if you do not care for sound skip these FMOD steps.  You will save some time and it is less confusing to make a non-FMOD build.}}&lt;br /&gt;
&lt;br /&gt;
CD to where you want to install the 3p-fmod repository and do:&lt;br /&gt;
 hg clone &amp;lt;nowiki&amp;gt;https://bitbucket.org/lindenlab/3p-fmod&amp;lt;/nowiki&amp;gt;&lt;br /&gt;
&lt;br /&gt;
CD into the &amp;lt;code&amp;gt;3p-fmod&amp;lt;/code&amp;gt; directory you created and build it:&lt;br /&gt;
 autobuild build --all&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;If the above command fails, you might have the version of bash packaged with Git in your PATH.&#039;&#039;&#039; Please edit your path and ensure that the Git path (e.g &#039;C:\Program Files (x86)\Git\cmd&#039;), if it exists, appears AFTER &#039;c:\cygwin\bin&#039;.&lt;br /&gt;
&lt;br /&gt;
Package the results:&lt;br /&gt;
 autobuild package &lt;br /&gt;
&lt;br /&gt;
Update autobuild with the filename and hash just displayed.  CD to the directory where you cloned viewer-release and do:&lt;br /&gt;
&lt;br /&gt;
 copy autobuild.xml my_autobuild.xml&lt;br /&gt;
 set AUTOBUILD_CONFIG_FILE=my_autobuild.xml&lt;br /&gt;
 autobuild installables edit fmod platform=windows hash=&amp;lt;hash&amp;gt; url=file:///&amp;lt;fmod-filespec&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Example:&lt;br /&gt;
 &lt;br /&gt;
 copy autobuild.xml my_autobuild.xml&lt;br /&gt;
 autobuild installables edit fmod platform=windows hash=0f196f00e7dff49f22252efb68525658 url=file:///C:/3p-fmod/fmod-3.75-windows-20110531.tar.bz2&lt;br /&gt;
&lt;br /&gt;
{{KBnote|Having to copy &amp;lt;code&amp;gt;autobuild.xml&amp;lt;/code&amp;gt; and modify the copy from within a cloned repository is a lot of work for every repository you make, but this is the only way to guarantee you pick up upstream changes to &amp;lt;code&amp;gt;autobuild.xml&amp;lt;/code&amp;gt; and do not send up a modified &amp;lt;code&amp;gt;autobuild.xml&amp;lt;/code&amp;gt; when you do an hg push.}}&lt;br /&gt;
&lt;br /&gt;
== Configuring the Viewer Build ==&lt;br /&gt;
&lt;br /&gt;
Fmod is the audio library the viewer uses. If you are compiling with Fmod you will need to do:&lt;br /&gt;
&lt;br /&gt;
 set AUTOBUILD_CONFIG_FILE=my_autobuild.xml&lt;br /&gt;
&lt;br /&gt;
The environment variable &amp;lt;nowiki&amp;gt;AUTOBUILD_INSTALLABLE_CACHE&amp;lt;/nowiki&amp;gt; controls the placement of library files downloaded as part of the configure process. If you do not want the library files downloaded as part of the configure process going into your Windows &amp;lt;nowiki&amp;gt;%TEMP%&amp;lt;/nowiki&amp;gt; directory define the environment variable to point to some other location you have established:&lt;br /&gt;
&lt;br /&gt;
 set AUTOBUILD_INSTALLABLE_CACHE=E:\SSfiles\Libraries&lt;br /&gt;
&lt;br /&gt;
At the command line in the source tree&#039;s root directory, presumably in your cloned repository (e.g. &amp;lt;nowiki&amp;gt;C:\linden\VWR-12345\&amp;lt;/nowiki&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
If you did not configure for FMOD:&lt;br /&gt;
 autobuild configure -c [CONFIGURATION]&lt;br /&gt;
&lt;br /&gt;
If you did configure for FMOD:&lt;br /&gt;
 autobuild configure --config-file my_autobuild.xml -c [CONFIGURATION] -- -DFMOD:BOOL=TRUE&lt;br /&gt;
&lt;br /&gt;
where &amp;lt;code&amp;gt;[CONFIGURATION]&amp;lt;/code&amp;gt; is one of those listed at [[Building the Viewer with Autobuild#Build a desired configuration]] (&amp;lt;code&amp;gt;ReleaseOS&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;RelWithDebInfoOS&amp;lt;/code&amp;gt;, &amp;lt;code&amp;gt;DebugOS&amp;lt;/code&amp;gt;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
=== Configuration Switches ===&lt;br /&gt;
There are a number of switches you can use to modify the configuration process.  The name of each switch is followed by its type and then by the value you want to set.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;FMOD&#039;&#039;&#039; (bool) controls if the Fmod package is incorporated into the viewer.  You must have performed the Fmod installation steps in [[Viewer_2_Microsoft_Windows_Builds#Fmod]] for this to work.&lt;br /&gt;
* &#039;&#039;&#039;LL_TESTS&#039;&#039;&#039; (bool) controls if the tests are compiled and run.  There are quite a lot of them so excluding them is recommended unless you have some reason to need one or more of them.&lt;br /&gt;
* &#039;&#039;&#039;PACKAGE&#039;&#039;&#039; (bool) controls if the package step is run.  You must have installed NSIS described in [[Viewer_2_Microsoft_Windows_Builds#Install_optional_development_tools]] for this to work.&lt;br /&gt;
&lt;br /&gt;
{{KBnote|&#039;&#039;&#039;OFF&#039;&#039;&#039; and &#039;&#039;&#039;NO&#039;&#039;&#039; are the same as &#039;&#039;&#039;FALSE&#039;&#039;&#039;; anything else is considered to be &#039;&#039;&#039;TRUE&#039;&#039;&#039;.}}&lt;br /&gt;
&lt;br /&gt;
Example without FMOD:&lt;br /&gt;
 autobuild configure -c ReleaseOS -- -DLL_TESTS:BOOL=FALSE -DPACKAGE:BOOL=FALSE&lt;br /&gt;
&lt;br /&gt;
Example with FMOD:&lt;br /&gt;
 autobuild configure --config-file my_autobuild.xml -c ReleaseOS -- -DLL_TESTS:BOOL=FALSE -DPACKAGE:BOOL=FALSE -DFMOD:BOOL=TRUE&lt;br /&gt;
&lt;br /&gt;
== Compiling the Viewer ==&lt;br /&gt;
&lt;br /&gt;
{{KBnote|Do not be alarmed if you see groups of messages with &#039;&#039;&#039;warning LNK4099: PDB&#039;&#039;&#039; in them.}}&lt;br /&gt;
&lt;br /&gt;
=== Compiling the viewer with autobuild ===&lt;br /&gt;
You can compile the viewer with either autobuild (the encouraged/supported method) or with the VS IDE.&lt;br /&gt;
&lt;br /&gt;
When compiling with autobuild you will have the best chance of success if you work from within a preconfigured Command Prompt window.  Depending on how your computer has been set up there are two possible ways to open this window and you need to find which works in your particular case:&lt;br /&gt;
*Method 1&lt;br /&gt;
**From &#039;&#039;&#039;All Programs&#039;&#039;&#039; Navigate into the &#039;&#039;&#039;Microsoft Visual Studio 2010&#039;&#039;&#039; program menu&lt;br /&gt;
**Click on &#039;&#039;&#039;Microsoft Visual Studio Command Prompt (2010)&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
*Method 2&lt;br /&gt;
**From &#039;&#039;&#039;All Programs&#039;&#039;&#039; Navigate into the &#039;&#039;&#039;Microsoft Windows SDK V7.1&#039;&#039;&#039; program menu&lt;br /&gt;
**Click on &#039;&#039;&#039;Windows SDK 7.1 Command Prompt&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
{{KBcaution|If you are building with Fmod and have followed the previous Fmod setup instructions AND you are now using a new command window you will need to redo the &amp;lt;code&amp;gt;set AUTOBUILD_CONFIG_FILE{{=}}my_autobuild.xml&amp;lt;/code&amp;gt;.}}&lt;br /&gt;
&lt;br /&gt;
*Run:&lt;br /&gt;
&lt;br /&gt;
Without FMOD:&lt;br /&gt;
 autobuild build -c [CONFIGURATION] --no-configure&lt;br /&gt;
&lt;br /&gt;
With FMOD:&lt;br /&gt;
 autobuild build --config-file my_autobuild.xml -c [CONFIGURATION] --no-configure&lt;br /&gt;
&lt;br /&gt;
There are some useful switches to know about, so your commands may look like this:&lt;br /&gt;
&lt;br /&gt;
Example without FMOD:&lt;br /&gt;
 autobuild configure -c ReleaseOS -- -DLL_TESTS:BOOL=FALSE -DPACKAGE:BOOL=FALSE&lt;br /&gt;
 autobuild build -c ReleaseOS --no-configure&lt;br /&gt;
&lt;br /&gt;
Example with FMOD:&lt;br /&gt;
 autobuild configure --config-file my_autobuild.xml -c ReleaseOS -- -DLL_TESTS:BOOL=FALSE -DPACKAGE:BOOL=FALSE -DFMOD:BOOL=TRUE&lt;br /&gt;
 autobuild build --config-file my_autobuild.xml -c ReleaseOS --no-configure&lt;br /&gt;
&lt;br /&gt;
{{KBnote|It is possible to use autobuild to do both the configure step (only needed once) and the build step with one command.  I find it is clearer and saves a bit of time if these steps are done separately.}}&lt;br /&gt;
&lt;br /&gt;
=== Compiling the viewer with the IDE ===&lt;br /&gt;
&lt;br /&gt;
The autobuild configure step created the &amp;lt;code&amp;gt;\build-vc100&amp;lt;/code&amp;gt; directory at the root of the source tree.  In here is the &amp;lt;code&amp;gt;SecondLife.sln&amp;lt;/code&amp;gt; solution file.&lt;br /&gt;
&lt;br /&gt;
Start the IDE and open this solution.&lt;br /&gt;
&lt;br /&gt;
You might want to change the build type in the drop-down located in the toolbar from &#039;&#039;&#039;Debug&#039;&#039;&#039; to &#039;&#039;&#039;Release&#039;&#039;&#039; or &#039;&#039;&#039;RelWithDebInfo&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
[[File:VS2010BuildType.png|100px]]&lt;br /&gt;
[[:File:VS2010BuildType.png|Changing build type example image]]&lt;br /&gt;
&lt;br /&gt;
You need to adjust the Platform Toolset setting.&lt;br /&gt;
* Select all the projects in the Solution Explorer list on the left of the screen.&lt;br /&gt;
** Click on the first project and scroll to the bottom of this list and {{K|shift}}-click on the last project.&lt;br /&gt;
* Right click on the selected list&lt;br /&gt;
* Navigate to &#039;&#039;&#039;Properties&#039;&#039;&#039; &amp;gt; &#039;&#039;&#039;Configuration Properties&#039;&#039;&#039; &amp;gt; &#039;&#039;&#039;General&#039;&#039;&#039; &amp;gt; &#039;&#039;&#039;Platform Toolset&#039;&#039;&#039;&lt;br /&gt;
* Change this value to &amp;lt;code&amp;gt;Windows7.1SDK&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Push {{K|F7}} to start the compiler.&lt;br /&gt;
&lt;br /&gt;
== Running your newly built viewer ==&lt;br /&gt;
=== Running from a desktop shortcut ===&lt;br /&gt;
* Make a desktop shortcut for &amp;lt;code&amp;gt;Drive:\your-path\build-vc100\newview\Release\secondlife-bin.exe&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
* Right-click the shortcut&lt;br /&gt;
* Select &#039;&#039;&#039;Properties&#039;&#039;&#039;&lt;br /&gt;
* Set &#039;&#039;&#039;Start in:&#039;&#039;&#039; to &amp;lt;code&amp;gt;Drive:\your-path\indra\newview&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Running from within the IDE ===&lt;br /&gt;
* In the Solution Explorer pane right click on &#039;&#039;&#039;secondlife-bin&#039;&#039;&#039;&lt;br /&gt;
** Click &#039;&#039;&#039;Set as StartUp Project&#039;&#039;&#039;&lt;br /&gt;
** Pick &#039;&#039;&#039;Properties&#039;&#039;&#039; &amp;gt; &#039;&#039;&#039;Configuration Properties&#039;&#039;&#039; &amp;gt; &#039;&#039;&#039;Debugging&#039;&#039;&#039;&lt;br /&gt;
*** Set &#039;&#039;&#039;Command&#039;&#039;&#039; to &amp;lt;code&amp;gt;Drive:\your-path\build-vc100\newview\Release\secondlife-bin.exe&amp;lt;/code&amp;gt; (adjust &amp;lt;code&amp;gt;Release&amp;lt;/code&amp;gt; to the type of build you are doing, e.g. &amp;lt;code&amp;gt;RelWithDebInfo&amp;lt;/code&amp;gt;)&lt;br /&gt;
*** Set &#039;&#039;&#039;Working Directory&#039;&#039;&#039; to &amp;lt;code&amp;gt;..\..\indra\newview&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== Handling Problems ==&lt;br /&gt;
&lt;br /&gt;
If you encounter errors or run into problems following the instructions above, please first check whether someone else already had the same issue. A solution might be known already. See the [[#Common_Issues.2FBugs.2FGlitches_And_Solutions|issue list below]], check [[{{TALKPAGENAME}}|the talk page]] (and report useful experiences there) and search our [[issue tracker]]. Even when no description of your problem has been written down yet, someone might know about it, so get in touch with the community to [[#Getting_help|get help]].&lt;br /&gt;
&lt;br /&gt;
=== Getting help ===&lt;br /&gt;
* Subscribe to [[OpenSource-Dev|OpenSource-Dev Mailing List]] ([https://lists.secondlife.com/cgi-bin/mailman/listinfo/opensource-dev subscribe]) and post your question there.&lt;br /&gt;
* For faster response, join the general open source viewer discussion and development [[IRC]] channel [irc://irc.freenode.org/opensl #opensl on freenode].  Hopefully a helpful person is online when you ask your question.&lt;br /&gt;
&lt;br /&gt;
=== Common Issues/Bugs/Glitches And Solutions ===&lt;br /&gt;
&lt;br /&gt;
==== Not being able to find objidl.h in the Microsoft Windows SDK, when compiling llwindow ====&lt;br /&gt;
https://lists.secondlife.com/pipermail/opensource-dev/2011-April/006562.html&lt;br /&gt;
* Can be caused by path problems or some installation conflicts with the DirectX SDK.&lt;br /&gt;
&lt;br /&gt;
==== stdint.h typedef conflicts between Quicktime and VS2010 ====&lt;br /&gt;
https://lists.secondlife.com/pipermail/opensource-dev/2011-April/006565.html&lt;br /&gt;
*: Can be solved by some small edits to header files to make sure the two don&#039;t bash on each other.&lt;br /&gt;
&lt;br /&gt;
==== Eliminate deprecated switches, messages, and use memory more efficiently ====&lt;br /&gt;
&lt;br /&gt;
The VS2010 compiler uses a lot of memory while compiling the viewer.  If you run out of memory you will start to page heavily and your compile time will become much longer.  The /Zm1000 switch affects compiler memory usage.&lt;br /&gt;
&lt;br /&gt;
You may see this message while compiling:&lt;br /&gt;
 use &#039;EHsc&#039; instead of &#039;GX&#039;&lt;br /&gt;
&lt;br /&gt;
Here is how to free up some memory the compiler allocates and to eliminate these messages:&lt;br /&gt;
&lt;br /&gt;
*Edit &amp;lt;code&amp;gt;\CMake 2.8\share\cmake-2.8\Modules\Platform\Windows-cl.cmake&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
*Replace line 156 with:&lt;br /&gt;
  IF(MSVC10)&lt;br /&gt;
    SET(CMAKE_CXX_FLAGS_INIT &amp;quot;/DWIN32 /D_WINDOWS /W3 /EHsc /GR&amp;quot;)&lt;br /&gt;
  ELSEIF(NOT MSVC10)&lt;br /&gt;
    SET(CMAKE_CXX_FLAGS_INIT &amp;quot;/DWIN32 /D_WINDOWS /W3 /Zm1000 /EHsc /GR&amp;quot;)&lt;br /&gt;
  ENDIF(MSVC10)&lt;br /&gt;
&lt;br /&gt;
*Replace line 172 with:  &lt;br /&gt;
  IF(MSVC10)&lt;br /&gt;
    SET(CMAKE_CXX_FLAGS_INIT &amp;quot;/DWIN32 /D_WINDOWS /W3 /EHsc /GR&amp;quot;)&lt;br /&gt;
  ELSEIF(NOT MSVC10)&lt;br /&gt;
    SET(CMAKE_CXX_FLAGS_INIT &amp;quot;/DWIN32 /D_WINDOWS /W3 /Zm1000 /GX /GR&amp;quot;)&lt;br /&gt;
  ENDIF(MSVC10)&lt;br /&gt;
&lt;br /&gt;
*Replace line 184 with:&lt;br /&gt;
  IF(MSVC10)&lt;br /&gt;
    SET(CMAKE_CXX_FLAGS_INIT &amp;quot;/DWIN32 /D_WINDOWS /W3 /EHsc /GR&amp;quot;)&lt;br /&gt;
  ELSEIF(NOT MSVC10)&lt;br /&gt;
    SET(CMAKE_CXX_FLAGS_INIT &amp;quot;/DWIN32 /D_WINDOWS /W3 /Zm1000 /GX /GR&amp;quot;)&lt;br /&gt;
  ENDIF(MSVC10)&lt;br /&gt;
&lt;br /&gt;
== References ==&lt;br /&gt;
&lt;br /&gt;
Tip of the hat to Nicky_Perian for [[User:Nicky_Perian/Visual_Studio_10_Autobuild]]&lt;br /&gt;
&lt;br /&gt;
[[Category:Compiling viewer]]&lt;/div&gt;</summary>
		<author><name>Inusaito Kanya</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Stereoscopic_Mode&amp;diff=1169794</id>
		<title>Stereoscopic Mode</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Stereoscopic_Mode&amp;diff=1169794"/>
		<updated>2012-06-26T20:20:19Z</updated>

		<summary type="html">&lt;p&gt;Inusaito Kanya: There are 4, not 3, ways... Since the 20:16, 13 July 2008 change&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;A desired feature for Second Life is the ability to view the world in Stereoscopic Mode. There are few ways this can be accomplished. &lt;br /&gt;
&lt;br /&gt;
The University of Michigan has submitted patches (see {{jira|VWR-2972}}) to make this work, but changes to the drawing code have since broken the patches. &lt;br /&gt;
&lt;br /&gt;
The patch allows a user to go into &#039;&#039;&#039;Preferences&#039;&#039;&#039; &amp;gt; &#039;&#039;&#039;Advanced Graphics&#039;&#039;&#039; and enable stereoscopic mode. Once this is done, there are 4 ways in which it may work:&lt;br /&gt;
&lt;br /&gt;
; Anaglyph : which uses glasses with lenses that are Red and Cyan. &lt;br /&gt;
; Passive : Requires either two projectors with polarized filters or page-flipping goggles, like the [http://3dvisor.com Z800] or other Head Mounted Displays (HMD).&lt;br /&gt;
; Shutter glasses : requires shutter glasses. &lt;br /&gt;
; Cross-eyed auto-stereogram : requires no additional hardware, but just a split screen and some practice.&lt;br /&gt;
&lt;br /&gt;
More information about these modes and where to get the required hardware is here: http://sl.daleglass.net/#stereo&lt;br /&gt;
&lt;br /&gt;
With Second Life running in Stereoscopic mode and the proper device and stereoscopic driver, the user can perceive the actual depth of objects in world, the world should appear as if it is actually in 3D. Without the proper device, this type of rendering looks visibly different and is not possible for use.&lt;br /&gt;
&lt;br /&gt;
[https://wiki.secondlife.com/wiki/Features Back to Features]&lt;/div&gt;</summary>
		<author><name>Inusaito Kanya</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LSL_Protocol/RestrainedLoveAPI&amp;diff=1167394</id>
		<title>LSL Protocol/RestrainedLoveAPI</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LSL_Protocol/RestrainedLoveAPI&amp;diff=1167394"/>
		<updated>2012-05-17T02:59:23Z</updated>

		<summary type="html">&lt;p&gt;Inusaito Kanya: /* For your information */ Fix red link&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header|ml=*}}&lt;br /&gt;
=Restrained Love viewer v2.8.1 Specification=&lt;br /&gt;
&lt;br /&gt;
By [[User:Marine Kelley|Marine Kelley]]&lt;br /&gt;
&lt;br /&gt;
==Audience==&lt;br /&gt;
&lt;br /&gt;
This document is for people who wish to modify or create their own [[LSL]] scripts to use the features of the [http://realrestraint.blogspot.com RestrainedLove viewer]. It does not explain [[LSL]] concepts such as messages and events, nor universal concepts such as [[UUID]]s.&lt;br /&gt;
&lt;br /&gt;
This document contains the specification for RestrainedLove viewer itself. If you need information about the RestrainedLove viewer relay(RLV relay), please see the [[LSL_Protocol/Restrained_Love_Relay/Specification|RLV relay specification]]&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
The [http://realrestraint.blogspot.com RestrainedLove viewer] executes certain behaviours when receiving special messages from scripts in-world. These messages are mostly calls to the [[llOwnerSay]]() [[LSL]] function.&lt;br /&gt;
&lt;br /&gt;
==Architecture==&lt;br /&gt;
&lt;br /&gt;
The [http://realrestraint.blogspot.com RestrainedLove viewer] intercepts every [[llOwnerSay]] message sent to the viewer.  Lines that begin with an at-sign (&#039;&#039;&#039;&#039;@&#039;&#039;&#039;&#039;) are parsed as RLV commands.  Other lines are forwarded to the user in the Local Chat window, as usual. For instance, a call to [[llOwnerSay]] (&amp;quot;@detach=n&amp;quot;) sends the &#039;&#039;detach&#039;&#039; command with parameter &#039;&#039;n&#039;&#039; to the viewer on behalf of the object running the script.&lt;br /&gt;
&lt;br /&gt;
The syntax of a message is:&lt;br /&gt;
&lt;br /&gt;
: &amp;lt;code&amp;gt;@&amp;lt;command1&amp;gt;[:option1]=&amp;lt;param1&amp;gt;,&amp;lt;command2&amp;gt;[:option2]=&amp;lt;param2&amp;gt;,...,&amp;lt;commandN&amp;gt;[:optionN]=&amp;lt;paramN&amp;gt;&amp;lt;/code&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Note that there is only one &#039;@&#039; sign, placed at the beginning of the message. The viewer interprets this as &amp;quot;this entire [[llOwnerSay]]() message contains one or more commands to execute&amp;quot;.  For documentation purposes, commands are always presented with the leading &#039;&#039;&#039;&#039;@&#039;&#039;&#039;&#039;.  However, it is an error to put the &#039;&#039;&#039;&#039;@&#039;&#039;&#039;&#039; in front of each command within a multi-command message, and the subsequent commands will fail.&lt;br /&gt;
&lt;br /&gt;
: Historical Note: Prior to Version &#039;&#039;&#039;1.10&#039;&#039;&#039;, RLV only allowed one command per message.  Version &#039;&#039;&#039;1.10&#039;&#039;&#039; added the ability to include multiple commands in one message, to avoid spamming users who are not using this viewer.&lt;br /&gt;
&lt;br /&gt;
If at least one command fails (e.g. a typo), the viewer says &amp;quot;... fails command : ... &amp;quot; and prints the entire message. However, correct commands are still parsed and executed, only the incorrect ones are ignored.&lt;br /&gt;
&lt;br /&gt;
Many of these commands determine the subsequent &#039;&#039;behaviour&#039;&#039; of the object or avatar.  For example, the &#039;&#039;&#039;@detach=n&#039;&#039;&#039; command locks the given object, making it undetachable.  Some commands set &#039;&#039;global behaviours&#039;&#039;, which aren&#039;t limited to the object sending the command.  For example, the &#039;&#039;&#039;@sendchat=n&#039;&#039;&#039; command will prevent the user from talking in local chat.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;NOTE&#039;&#039;&#039; about commands with exceptions, such as @sendim or @sendchannel... @(rule):(exception)=n actually (and counter-intuitively) &#039;&#039;&#039;adds an exception&#039;&#039;&#039; for the given rule.  @sendchannel:1=n, for example, &#039;&#039;&#039;allows&#039;&#039;&#039; chat on channel 1.  This has been the source of at least two scripters&#039; confusion.  =add (which means the same as =n) and =rem (which means =y) exist for the purpose of adding and removing exceptions, respectively.  Use them.&lt;br /&gt;
&lt;br /&gt;
{{hint|mode=warning|desc=These behaviours are &#039;&#039;&#039;not&#039;&#039;&#039; persistent between sessions.  Since an object changes its [[UUID]] every time it [[rez]]zes, the object &#039;&#039;must&#039;&#039; resend its status (undetachable, preventing IMs...) in the [[on_rez]]() event as well as whenever it changes its status.}}&lt;br /&gt;
&lt;br /&gt;
==List of commands==&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; These commands are not case-sensitive but are spacing-sensitive. In other words, &amp;quot;@detach = n&amp;quot; will &#039;&#039;&#039;not&#039;&#039;&#039; work.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Notation convention:&#039;&#039;&#039; Parameters in [square brackets] are optional parameters that can be omitted. The pipe | and slash / signs separate options from which one must be used. &amp;lt;angle brackets&amp;gt; enclose parameters that are mandatory.&lt;br /&gt;
&lt;br /&gt;
===Version Checking===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Automated version checking&#039;&#039;&#039;&#039;&#039; : &amp;quot;@version=&amp;lt;channel_number&amp;gt;&amp;quot;&lt;br /&gt;
&#039;&#039;Implemented in v1.0b&#039;&#039;&lt;br /&gt;
Makes the viewer automatically say the version of the RLV API it implements, immediately on the chat channel number &amp;lt;channel_number&amp;gt; that the script can listen to. Always use a positive integer. Remember that regular viewers do not answer anything at all so remove the listener after a timeout.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Warning&#039;&#039;&#039; : when logging in, the [[on_rez]] event of all the attachments occurs way before the avatar can actually send chat messages (about half the way through the login progress bar). This means the timeout should be long enough, like 30 seconds to one minute in order to receive the automatic reply from the viewer.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Warning 2&#039;&#039;&#039; : On 02/22/2010, Linden Lab has released their Third Party Viewer policy which forbids using the term &amp;quot;Life&amp;quot; in the name of Third Party Viewers. Therefore &amp;quot;Restrained Life&amp;quot; had to be renamed to &amp;quot;Restrained Love&amp;quot;. However, for compatibility purposes, this @version command still works and will keep working, however you are encouraged to &#039;&#039;&#039;not&#039;&#039;&#039; use it in new scripts, and to &#039;&#039;&#039;not&#039;&#039;&#039; show the terms &amp;quot;Restrained Life&amp;quot; to the user anywhere. For new scripts, please use @versionnew below instead.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Automated version checking&#039;&#039;&#039;&#039;&#039; : &amp;quot;@versionnew=&amp;lt;channel_number&amp;gt;&amp;quot;&lt;br /&gt;
&#039;&#039;Implemented in v1.23&#039;&#039;&lt;br /&gt;
Makes the viewer automatically say the version of the RLV API it implements, immediately on the chat channel number &amp;lt;channel_number&amp;gt; that the script can listen to. Always use a positive integer. Remember that regular viewers do not answer anything at all so remove the listener after a timeout.&lt;br /&gt;
&lt;br /&gt;
This command is the successor of @version and replaces it, although @version is kept for ascending compatibility purposes. It returns &amp;quot;RestrainedLove viewer v... (SL ...)&amp;quot; (&amp;quot;RestrainedLove&amp;quot; is in one word).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Warning&#039;&#039;&#039; : when logging in, the [[on_rez]] event of all the attachments occurs way before the avatar can actually send chat messages (about half the way through the login progress bar). This means the timeout should be long enough, like 30 seconds to one minute in order to receive the automatic reply from the viewer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Automated version number checking&#039;&#039;&#039;&#039;&#039; : &amp;quot;@versionnum=&amp;lt;channel_number&amp;gt;&amp;quot;&lt;br /&gt;
&#039;&#039;Implemented in v1.21&#039;&#039;&lt;br /&gt;
Makes the viewer automatically say the version number of the RLV API it implements (please note that this is different from the version of the viewer, which the scripts should not have to care about), immediately on the chat channel number &amp;lt;channel_number&amp;gt; that the script can listen to. Always use a positive integer. Remember that regular viewers do not answer anything at all so remove the listener after a timeout. This command is less cumbersome than @version, since the script does not have to parse the response, it gets the version number immediately.&lt;br /&gt;
&lt;br /&gt;
The version number is a mere integer that represents the version of the API. If the version is X.Y.Z.P, then the number will be X.10^6 + Y.10^4 + Z.10^2 + P. For example, 1.21.1 would be 1210100.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Automated version checking, second way&#039;&#039;&#039;&#039;&#039; : llGetAgentLanguage (key id) &#039;&#039;&#039;&#039;&#039;DEPRECATED: DO NOT USE !&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
&#039;&#039;Implemented in v1.16&#039;&#039;&lt;br /&gt;
When calling this LSL function, the result is obtained immediately (no need to use a listener and a timer), is exactly equal to the one given by &amp;quot;@version&amp;quot; and cannot be hidden by the user. This string takes the place of the language returned by the regular SL viewer, which could answer values like &amp;quot;en-us&amp;quot;, &amp;quot;fr&amp;quot;, &amp;quot;ko&amp;quot; etc. Or nothing at all, if the user chose to hide their language setting. Being optional in the regular viewer, it cannot be trusted by a script, so &amp;quot;hijacking&amp;quot; this feature for the much more useful synchronous version checking in the RLV makes sense. IMPORTANT NOTE: this feature cannot be implemented in viewers prior to v1.21, even when they do implement RestrainedLove v1.16, so make sure you do fall back to the @version method whenever llGetAgentLanguage() returns an empty string. ALSO NOTE: In RestrainedLove 1.16, llGetAgentLanguage() will return an empty string when called by on_rez during login unless the call is delayed by several seconds (how many seconds may vary). FINAL NOTE: This feature was removed from v1.16.1 (and v1.16b, for the Cool SL Viewer).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Manual version checking&#039;&#039;&#039;&#039;&#039; : &amp;quot;@version&amp;quot;&lt;br /&gt;
&#039;&#039;Implemented in v1.0a&#039;&#039;&lt;br /&gt;
This command must be sent in IM from an avatar to the user (will not work from objects). The viewer automatically answers its version to the sender in IM, but neither the message nor the answer appears in the user&#039;s IM window, so it&#039;s totally stealthy.&lt;br /&gt;
&lt;br /&gt;
===Blacklist handling===&lt;br /&gt;
&lt;br /&gt;
The blacklist (implemented in v2.8) is a list of RLV commands that the viewer is meant to ignore. It is modifiable at any time, but a restart is needed to take the changes into account. When a command is issued and it is part of the blacklist, the RLV will simply ignore it. Modifying the blacklist won&#039;t clear existing restrictions though, once they are issued, a restart is needed. When a command is received, a positive acknowledgement is sent to the script, whether the command was actually accepted or not. This way scripts that wait for notifications won&#039;t break if they can&#039;t handle a denial.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Automated version number checking, followed by the blacklist&#039;&#039;&#039;&#039;&#039; : &amp;quot;@versionnumbl=&amp;lt;channel_number&amp;gt;&amp;quot;&lt;br /&gt;
&#039;&#039;Implemented in v2.8&#039;&#039;&lt;br /&gt;
Makes the viewer automatically say the version number of the RLV API it implements (please note that this is different from the version of the viewer, which the scripts should not have to care about), followed by a comma (&amp;quot;,&amp;quot;) and the contents of the blacklist, immediately on the chat channel number &amp;lt;channel_number&amp;gt; that the script can listen to. Always use a positive integer. Remember that regular viewers do not answer anything at all so remove the listener after a timeout. This command is less cumbersome than @version followed by @getblacklist, since the script does not have to parse the response, it gets the version number immediately, and it does not have to send a second asynchronous request after the response to the first.&lt;br /&gt;
&lt;br /&gt;
For example, &amp;quot;@versionnumbl=2222&amp;quot; will answer &amp;quot;2080000,sendim,recvim&amp;quot; if the blacklist is currently &amp;quot;sendim,recvim&amp;quot;. LSL allows for casting such a string into an integer without any trouble, it would return 2080000, discarding the first comma and all that is after it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Get the contents of the blacklist, with a filter&#039;&#039;&#039;&#039;&#039; : &amp;quot;@getblacklist[:filter]=&amp;lt;channel_number&amp;gt;&amp;quot;&lt;br /&gt;
&#039;&#039;Implemented in v2.8&#039;&#039;&lt;br /&gt;
Makes the viewer automatically reply with the contents of the blacklist (if a filter is present, then only the commands containing that text will be part of the reply), immediately on the chat channel number &amp;lt;channel_number&amp;gt; that the script can listen to. Always use a positive integer. Remember that regular viewers do not answer anything at all so remove the listener after a timeout.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Manual blacklist checking&#039;&#039;&#039;&#039;&#039; : &amp;quot;@getblacklist&amp;quot;&lt;br /&gt;
&#039;&#039;Implemented in v2.8&#039;&#039;&lt;br /&gt;
This command must be sent in IM from an avatar to the user (will not work from objects). The viewer automatically answers the contents of its blacklist to the sender in IM, but neither the message nor the answer appears in the user&#039;s IM window, so it&#039;s totally stealthy.&lt;br /&gt;
&lt;br /&gt;
===Miscellaneous===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Start/stop notifications on a private channel&#039;&#039;&#039;&#039;&#039; : &amp;quot;@notify:&amp;lt;channel_number&amp;gt;[;word]=&amp;lt;rem/add&amp;gt;&amp;quot;&lt;br /&gt;
&#039;&#039;Implemented in v1.20, improved in v2.2 (and v1.24)&#039;&#039;&lt;br /&gt;
Makes the viewer automatically repeat any restriction it adds or removes on the specified channel, or only the restrictions which name contains the word specified after the semicolon (&amp;quot;;&amp;quot;) character. The response on the private channel &amp;lt;channel_number&amp;gt; is preceded with a slash (&amp;quot;/&amp;quot;) to avoid making the avatar send commands to other scripts without knowing it, and followed by an equal sign (&amp;quot;=&amp;quot;) and &amp;quot;n&amp;quot; or &amp;quot;y&amp;quot; according to whether the restriction is applied or lifted respectively. The &amp;quot;@clear&amp;quot; command will not add an equal sign. There is no way to know what object issued the restriction or lifted it, to avoid disclosing too much information about foreign scripts. It does not repeat one-shot commands either (force commands). For example, &amp;quot;@notify:2222;detach=add&amp;quot; will send &amp;quot;/detach=n&amp;quot; whenever an object is locked, and &amp;quot;/detach=y&amp;quot; whenever an object is unlocked, on channel 2222 to which the script will listen to.&lt;br /&gt;
&lt;br /&gt;
Note : Since v2.2 (and v1.24) you can also set a notification for inventory offers. When your object gives an item or a folder, the avatar using a RLV v2.2 (and v1.24) or higher will respond automatically on the given channel one of the following :&lt;br /&gt;
&lt;br /&gt;
 - /accepted_in_rlv inv_offer &amp;lt;folder&amp;gt; : The folder has been accepted and is now available under #RLV (don&#039;t forget that the viewer renames it, removing the &amp;quot;#RLV/&amp;quot; prefix).&lt;br /&gt;
&lt;br /&gt;
 - /accepted_in_inv inv_offer &amp;lt;folder&amp;gt; : The folder has been accepted but is not shared.&lt;br /&gt;
&lt;br /&gt;
 - /declined inv_offer &amp;lt;folder&amp;gt; : The folder has been declined and/or the user has pressed &amp;quot;Block&amp;quot; (formerly &amp;quot;Mute&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
Where &amp;lt;folder&amp;gt; is the full path of the folder or item given. For example, #RLV/~MyCuffs. There is a space before &amp;quot;inv_offer&amp;quot;, which is a token chosen in a way that it is easy to set a notification for it. If you just want to know whether your folder named #RLV/~MyCuffs has been accepted in the #RLV folder, issue a &amp;quot;@notify:2222;accepted_in_rlv inv_offer #RLV/~MyCuffs=add&amp;quot; command. If you just want to know whether the avatar has received something, issue a simple &amp;quot;@notify:2222;inv_offer=add&amp;quot; command.&lt;br /&gt;
&lt;br /&gt;
Note 2 : Since v2.5 the viewer also sends notifications when wearing outfits :&lt;br /&gt;
&lt;br /&gt;
 - /worn legally &amp;lt;layer&amp;gt; : The avatar has just worn a piece of clothing on the indicated layer.&lt;br /&gt;
&lt;br /&gt;
 - /unworn legally &amp;lt;layer&amp;gt; : The avatar has just removed a piece of clothing from the indicated layer.&lt;br /&gt;
&lt;br /&gt;
 - /attached legally &amp;lt;attach_point_name&amp;gt; : The avatar has just attached an object to the indicated attachment point.&lt;br /&gt;
&lt;br /&gt;
 - /attached illegally &amp;lt;attach_point_name&amp;gt; : The avatar has just attached an object to the indicated attachment point, but was not allowed to (probably a script attached it automatically), and it will be detached in a few seconds.&lt;br /&gt;
&lt;br /&gt;
 - /detached legally &amp;lt;attach_point_name&amp;gt; : The avatar has just detached an object from the indicated attachment point.&lt;br /&gt;
&lt;br /&gt;
 - /detached illegally &amp;lt;attach_point_name&amp;gt; : The avatar has just detached an object from the indicated attachment point, but was not allowed to (probably a script kicked it off), and it will be re-attached in a few seconds.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Allow/deny permissive exceptions&#039;&#039;&#039;&#039;&#039; : &amp;quot;@permissive=&amp;lt;y/n&amp;gt;&amp;quot;&lt;br /&gt;
&#039;&#039;Implemented in v1.21&#039;&#039;&lt;br /&gt;
When denied, all restrictions turn into their &amp;quot;secure&amp;quot; counterparts (if any). This means an exception to a restriction will be ignored if it is not issued by the same object that issued the restriction. Using non-secure restrictions (the original ones, like @sendim, @recvim etc) and not using @permissive allow the avatar to benefit from exceptions issued by different objects.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Warning&#039;&#039;&#039; : Using this command (or any secure version of the original commands) may silently discard exceptions issued by different objects (it is even its primary purpose), hence some products may appear to cease working while this restriction is in effect. For example, a product that allows the avatar to always be able to send IMs a particular friend will not be able to overcome a @sendim_sec or a @permissive command sent by another object, and will look like it is broken. Therefore, use with caution and make the user aware of how secure your own product is !&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Clear all the rules tied to an object&#039;&#039;&#039;&#039;&#039; : &amp;quot;@clear&amp;quot;&lt;br /&gt;
&#039;&#039;Implemented in v1.0a, but working only since v1.04a&#039;&#039;&lt;br /&gt;
This command clears all the restrictions and exceptions tied to a particular [[UUID]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Warning&#039;&#039;&#039; : when triggered on detach by default, this might prevent the automatic reattach when @defaultwear is active, as @clear will also lift @detach=n, thus the viewer thinks the item that gets detached by accident by a default-wear-action is unlocked and will not reattach it.&lt;br /&gt;
&lt;br /&gt;
Possible workarounds:&lt;br /&gt;
::* only lift the exact restrictions you added with @clear=&amp;lt;pattern&amp;gt; &lt;br /&gt;
::* only trigger @clear on detach when you are sure the attachment is not locked&lt;br /&gt;
::* don&#039;t trigger @clear on detach at all and wait for the viewer to lift the set restrictions&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Clear a subset of the rules tied to an object&#039;&#039;&#039;&#039;&#039; : &amp;quot;@clear=&amp;lt;string&amp;gt;&amp;quot;&lt;br /&gt;
&#039;&#039;Implemented in v1.0a, but working only since v1.04a&#039;&#039;&lt;br /&gt;
This command clears all the restrictions and exceptions tied to a particular [[UUID]] which name contains &amp;lt;string&amp;gt;. A good example would be &amp;quot;@clear=tp&amp;quot; which clears all the [[teleport]] restrictions and exceptions tied to that object, whereas &amp;quot;@clear=tplure:&amp;quot; would only clear the exceptions to the &amp;quot;teleport-by-friend&amp;quot; restriction&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Get the list of restrictions the avatar is currently submitted to&#039;&#039;&#039;&#039;&#039; : @getstatus[:&amp;lt;part_of_rule&amp;gt;[;&amp;lt;custom_separator&amp;gt;]]=&amp;lt;channel&amp;gt;&lt;br /&gt;
&#039;&#039;Implemented in v1.10, slightly tweaked in v1.16 and v2.8&#039;&#039;&lt;br /&gt;
Makes the viewer automatically answer the list of rules the avatar is currently under, which would only contains the restrictions issued by the object that sends this command, immediately on the chat channel number &amp;lt;channel_number&amp;gt; that the script can listen to. Always use a positive integer. Remember that regular viewers do not answer anything at all so remove the listener after a timeout. The answer is a list of rules, separated by slashes (&#039;/&#039;) or by any other separator if specified. Attention : since v1.16 a slash is prepended at the beginning of the string. This does not confuse llParseString2List() calls, but does confuse llParseStringKeepNulls() calls !&lt;br /&gt;
&lt;br /&gt;
Since v2.8, if &amp;lt;custom_separator&amp;gt; is specified, it will replace the slash (&#039;/&#039;) with the provided separator. Attention, the option part must be present, therefore there must be a colon (&#039;:&#039;) before the semicolon (&#039;;&#039;), even if &amp;lt;part_of_rule&amp;gt; is absent.&lt;br /&gt;
&lt;br /&gt;
This command is useful for people who write scripts that may conflict with other scripts in the same object (for instance : third-party plugins). Conflicts do not occur in different objects, that&#039;s why this command only replies the restrictions issued by the object calling it.&lt;br /&gt;
&lt;br /&gt;
&amp;lt;part_of_rule&amp;gt; is the name of a rule, or a part of it, useful if the script only needs to know about a certain restriction.&lt;br /&gt;
&lt;br /&gt;
 Example : If the avatar is under tploc, tplure, tplm and sittp, here is what the script would get :&lt;br /&gt;
 @getstatus=2222  =&amp;gt;  /tploc/tplure/tplm/sittp&lt;br /&gt;
 @getstatus:sittp=2222  =&amp;gt;  /sittp&lt;br /&gt;
 @getstatus:tpl=2222  =&amp;gt;  /tploc/tplure/tplm  (because &amp;quot;tpl&amp;quot; is part of &amp;quot;tploc&amp;quot;, &amp;quot;tplure&amp;quot; and &amp;quot;tplm&amp;quot; but not &amp;quot;sittp&amp;quot;)&lt;br /&gt;
 @getstatus:tpl;#=2222  =&amp;gt;  #tploc#tplure#tplm  (because &amp;quot;tpl&amp;quot; is part of &amp;quot;tploc&amp;quot;, &amp;quot;tplure&amp;quot; and &amp;quot;tplm&amp;quot; but not &amp;quot;sittp&amp;quot;, and the specified separator is &amp;quot;#&amp;quot;)&lt;br /&gt;
 @getstatus:;#=2222  =&amp;gt;  #tploc#tplure#tplm#sittp  (because the specified separator is &amp;quot;#&amp;quot;)&lt;br /&gt;
 @getstatus:;=2222  =&amp;gt;  /tploc/tplure/tplm/sittp  (because the specified separator is empty, so it defaults to &amp;quot;/&amp;quot;)&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Get the list of all the restrictions the avatar is currently submitted to&#039;&#039;&#039;&#039;&#039; : @getstatusall[:&amp;lt;part_of_rule&amp;gt;[;&amp;lt;custom_separator&amp;gt;]]=&amp;lt;channel&amp;gt;&lt;br /&gt;
&#039;&#039;Implemented in v1.15, slightly tweaked in v1.16 and v2.8&#039;&#039;&lt;br /&gt;
Makes the viewer automatically answer the list of rules the avatar is currently under, for all the objects regardless of their UUID, contrary to @getstatus, immediately on the chat channel number &amp;lt;channel_number&amp;gt; that the script can listen to. Always use a positive integer. Remember that regular viewers do not answer anything at all so remove the listener after a timeout. The answer is a list of rules, separated by slashes (&#039;/&#039;) or by any other separator if specified. Attention : since v1.16 a slash is prepended at the beginning of the string. This does not confuse llParseString2List() calls, but does confuse llParseStringKeepNulls() calls !&lt;br /&gt;
&lt;br /&gt;
Since v2.8, if &amp;lt;custom_separator&amp;gt; is specified, it will replace the slash (&#039;/&#039;) with the provided separator. Attention, the option part must be present, therefore there must be a colon (&#039;:&#039;) before the semicolon (&#039;;&#039;), even if &amp;lt;part_of_rule&amp;gt; is absent.&lt;br /&gt;
&lt;br /&gt;
===Movement===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Allow/prevent flying&#039;&#039;&#039;&#039;&#039; : @fly=&amp;lt;y/n&amp;gt;&lt;br /&gt;
&#039;&#039;Implemented in v1.12.2&#039;&#039;&lt;br /&gt;
When prevented, the user is unable to fly.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Allow/prevent running by double-tapping an arrow key&#039;&#039;&#039;&#039;&#039; : @temprun=&amp;lt;y/n&amp;gt;&lt;br /&gt;
&#039;&#039;Implemented in v2.7&#039;&#039;&lt;br /&gt;
When prevented, the user is unable to run by double-tapping an arrow key. If you want to prevent the user from running at all, you must also use @alwaysrun.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Allow/prevent always running&#039;&#039;&#039;&#039;&#039; : @alwaysrun=&amp;lt;y/n&amp;gt;&lt;br /&gt;
&#039;&#039;Implemented in v2.7&#039;&#039;&lt;br /&gt;
When prevented, the user is unable to switch running mode on by pressing Ctrl-R. If you want to prevent the user from running at all, you must also use @temprun. This command is useful when you want to force the user to accelerate before running, rather than running all the time, for example during combats or sports games.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Force rotate the avatar to a set direction&#039;&#039;&#039;&#039;&#039; : @setrot:&amp;lt;angle_in_radians&amp;gt;=force&lt;br /&gt;
&#039;&#039;Implemented in v1.17&#039;&#039;&lt;br /&gt;
Forces the avatar to rotate towards a direction set by an angle in radians from the north. Note that this command is not very precise, nor will do anything if the action attempts to rotate the avatar by less than 10° (experimental value, it has been mentioned somewhere that 6° was the minimum). In other words, it is best to either check with a llGetRot() first, or to make the avatar turn twice, first 180° plus the desired angle, then by the angle we need. It isn&#039;t very elegant but it works.&lt;br /&gt;
 &lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Change the height of the avatar&#039;&#039;&#039;&#039;&#039; : @adjustheight:&amp;lt;distance_pelvis_to_foot_in_meters&amp;gt;;&amp;lt;factor&amp;gt;[;delta_in_meters]=force&lt;br /&gt;
&#039;&#039;Implemented in v2.5&#039;&#039;&lt;br /&gt;
Forces the avatar to modify its &amp;quot;Z-offset&amp;quot;, in other words its altitude. This value can already be changed through a debug setting in most third party viewers, this command allows to automate the change according to the animation.&lt;br /&gt;
&lt;br /&gt;
Rather than explaining it in full here, please go to this link for further info : [http://sldev.free.fr/forum/viewtopic.php?f=7&amp;amp;t=447]&lt;br /&gt;
&lt;br /&gt;
===Chat, Emotes and Instant Messages===&lt;br /&gt;
====Chat====&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Allow/prevent sending chat messages&#039;&#039;&#039;&#039;&#039; : &amp;quot;@sendchat=&amp;lt;y/n&amp;gt;&amp;quot;&lt;br /&gt;
&#039;&#039;Implemented in v1.0b&#039;&#039;&lt;br /&gt;
When prevented, everything typed on [[channel]] 0 will be discarded. However, emotes and messages beginning with a slash (&#039;/&#039;) will go through, truncated to strings of 30 and 15 characters long respectively (likely to change later). Messages with special signs like ()&amp;quot;-*=_^ are prohibited, and will be discarded. When a period (&#039;.&#039;) is present, the rest of the message is discarded.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Allow/prevent shouting&#039;&#039;&#039;&#039;&#039; : &amp;quot;@chatshout=&amp;lt;y/n&amp;gt;&amp;quot;&lt;br /&gt;
&#039;&#039;Implemented in v1.15&#039;&#039;&lt;br /&gt;
When prevented, the avatar will chat normally even when the user tries to shout. This does not change the message in any way, only its range.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Allow/prevent chatting at normal volume&#039;&#039;&#039;&#039;&#039; : &amp;quot;@chatnormal=&amp;lt;y/n&amp;gt;&amp;quot;&lt;br /&gt;
&#039;&#039;Implemented in v1.15&#039;&#039;&lt;br /&gt;
When prevented, the avatar will whisper even when the user tries to shout or chat normally. This does not change the message in any way, only its range.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Allow/prevent whispering&#039;&#039;&#039;&#039;&#039; : &amp;quot;@chatwhisper=&amp;lt;y/n&amp;gt;&amp;quot;&lt;br /&gt;
&#039;&#039;Implemented in v1.15&#039;&#039;&lt;br /&gt;
When prevented, the avatar will chat normally even when the user tries to whisper. This does not change the message in any way, only its range.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Redirect public chat to private channels&#039;&#039;&#039;&#039;&#039; : &amp;quot;@redirchat:&amp;lt;channel_number&amp;gt;=&amp;lt;rem/add&amp;gt;&amp;quot;&lt;br /&gt;
&#039;&#039;Implemented in v1.16&#039;&#039;&lt;br /&gt;
When active, this restriction redirects whatever the user says on the public channel (&amp;quot;/0&amp;quot;) to the private channel provided in the option field. If several redirections are issued, the chat message will be redirected to each channel. It does not apply to emotes, and will not trigger any animation (typing start, typing stop, nodding) when talking. This restriction does not supercede @sendchannel.&lt;br /&gt;
&#039;&#039;&#039;NOTE:&#039;&#039;&#039; As of RLV v1.22.1 / RLVa 1.1.0, it had a bug that @redirchat also truncates emotes on channel 0. An additional @emote=add works around this side-effect. This bug was fixed in the Cool VL Viewer starting with v1.22g (but Marine&#039;s RLV v1.23 still had this bug) and RLV v2.0 (it is safe to assume it was fixed in all viewers starting with v1.24 and v2.0).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Allow/prevent receiving chat messages&#039;&#039;&#039;&#039;&#039; : &amp;quot;@recvchat=&amp;lt;y/n&amp;gt;&amp;quot;&lt;br /&gt;
&#039;&#039;Implemented in v1.0b&#039;&#039;&lt;br /&gt;
When prevented, everything heard in public chat will be discarded except emotes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Allow/prevent receiving chat messages, secure way&#039;&#039;&#039;&#039;&#039; : &amp;quot;@recvchat_sec=&amp;lt;y/n&amp;gt;&amp;quot;&lt;br /&gt;
&#039;&#039;Implemented in v1.21&#039;&#039;&lt;br /&gt;
When prevented, everything heard in public chat will be discarded except emotes. This particular command accepts exceptions issued from the same object only, opposed to the non-secure way that accepts exceptions from any object.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Remove/add exceptions to the chat message receiving prevention&#039;&#039;&#039;&#039;&#039; : &amp;quot;@recvchat:&amp;lt;UUID&amp;gt;=&amp;lt;rem/add&amp;gt;&amp;quot;&lt;br /&gt;
&#039;&#039;Implemented in v1.01&#039;&#039;&lt;br /&gt;
When adding an exception, the user can hear chat messages from the sender whose [[UUID]] is specified in the command. This overrides the prevention for this avatar only (there is no limit to the number of exceptions), don&#039;t forget to remove it when it becomes obsolete.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Allow/prevent receiving chat messages from someone in particular&#039;&#039;&#039;&#039;&#039; : &amp;quot;@recvchatfrom:&amp;lt;UUID&amp;gt;=&amp;lt;y/n&amp;gt;&amp;quot;&lt;br /&gt;
&#039;&#039;Implemented in v2.3 and v1.25&#039;&#039;&lt;br /&gt;
When prevented, everything heard in public chat from the specified avatar will be discarded except emotes.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Emotes====&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Remove/add an exception to the emote truncation above&#039;&#039;&#039;&#039;&#039; : &amp;quot;@emote=&amp;lt;rem/add&amp;gt;&amp;quot;&lt;br /&gt;
&#039;&#039;Implemented in v1.01&#039;&#039;&lt;br /&gt;
When adding this exception, the emotes are not truncated anymore (however, special signs will still discard the message).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Redirect public emotes to private channels&#039;&#039;&#039;&#039;&#039; : &amp;quot;@rediremote:&amp;lt;channel_number&amp;gt;=&amp;lt;rem/add&amp;gt;&amp;quot;&lt;br /&gt;
&#039;&#039;Implemented in v1.19&#039;&#039;&lt;br /&gt;
When active, this restriction redirects whatever emote the user says on the public channel (&amp;quot;/0&amp;quot;) to the private channel provided in the option field. If several redirections are issued, the emote will be redirected to each channel.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Allow/prevent seeing emotes&#039;&#039;&#039;&#039;&#039; : &amp;quot;@recvemote=&amp;lt;y/n&amp;gt;&amp;quot;&lt;br /&gt;
&#039;&#039;Implemented in v1.19&#039;&#039;&lt;br /&gt;
When prevented, every emote seen in public chat will be discarded.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Allow/prevent receiving emotes seen in public chat from someone in particular&#039;&#039;&#039;&#039;&#039; : &amp;quot;@recvemotefrom:&amp;lt;UUID&amp;gt;=&amp;lt;y/n&amp;gt;&amp;quot;&lt;br /&gt;
&#039;&#039;Implemented in v2.4&#039;&#039;&lt;br /&gt;
When prevented, everything emote seen in public chat from the specified avatar will be discarded.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Allow/prevent seeing emotes, secure way&#039;&#039;&#039;&#039;&#039; : &amp;quot;@recvemote_sec=&amp;lt;y/n&amp;gt;&amp;quot;&lt;br /&gt;
&#039;&#039;Implemented in v1.21&#039;&#039;&lt;br /&gt;
When prevented, every emote seen in public chat will be discarded. This particular command accepts exceptions issued from the same object only, opposed to the non-secure way that accepts exceptions from any object.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Remove/add exceptions to the emote seeing prevention&#039;&#039;&#039;&#039;&#039; : &amp;quot;@recvemote:&amp;lt;UUID&amp;gt;=&amp;lt;rem/add&amp;gt;&amp;quot;&lt;br /&gt;
&#039;&#039;Implemented in v1.19&#039;&#039;&lt;br /&gt;
When adding an exception, the user can see emotes from the sender whose [[UUID]] is specified in the command. This overrides the prevention for this avatar only (there is no limit to the number of exceptions), don&#039;t forget to remove it when it becomes obsolete.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Private Channels====&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Allow/prevent using any chat channel but certain channels&#039;&#039;&#039;&#039;&#039; : @sendchannel[:&amp;lt;channel&amp;gt;]=&amp;lt;y/n&amp;gt;&lt;br /&gt;
&#039;&#039;Implemented in v1.10&#039;&#039;&lt;br /&gt;
Complimentary of @sendchat, this command prevents the user from sending messages on non-public [[channel]]s. If channel is specified, it becomes an exception to the aforementioned restriction (then it is better to use &amp;quot;rem&amp;quot; or &amp;quot;add&amp;quot; instead of &amp;quot;y&amp;quot; or &amp;quot;n&amp;quot; respectively). It does not prevent the viewer automatic replies like @version=nnnn, @getstatus=nnnn etc.  &lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Allow/prevent using any chat channel but certain channels, secure way&#039;&#039;&#039;&#039;&#039; : @sendchannel_sec[:&amp;lt;channel&amp;gt;]=&amp;lt;y/n&amp;gt;&lt;br /&gt;
&#039;&#039;Implemented in v1.10&#039;&#039;&lt;br /&gt;
Complimentary of @sendchat, this command prevents the user from sending messages on non-public [[channel]]s. If channel is specified, it becomes an exception to the aforementioned restriction (then it is better to use &amp;quot;rem&amp;quot; or &amp;quot;add&amp;quot; instead of &amp;quot;y&amp;quot; or &amp;quot;n&amp;quot; respectively). It does not prevent the viewer automatic replies like @version=nnnn, @getstatus=nnnn etc. This particular command only accepts exceptions issued from the same object, opposed to its non-secure version which accepts exceptions from any other object.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
====Instant Messages====&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Allow/prevent sending instant messages&#039;&#039;&#039;&#039;&#039; : &amp;quot;@sendim=&amp;lt;y/n&amp;gt;&amp;quot;&lt;br /&gt;
&#039;&#039;Implemented in v1.0b&#039;&#039;&lt;br /&gt;
When prevented, everything typed in IM will be discarded and a bogus message will be sent to the receiver instead.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Allow/prevent sending instant messages, secure way&#039;&#039;&#039;&#039;&#039; : &amp;quot;@sendim_sec=&amp;lt;y/n&amp;gt;&amp;quot;&lt;br /&gt;
&#039;&#039;Implemented in v1.21&#039;&#039;&lt;br /&gt;
When prevented, everything typed in IM will be discarded and a bogus message will be sent to the receiver instead. This particular command accepts exceptions issued from the same object only, opposed to the non-secure way that accepts exceptions from any object.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Remove/add exceptions to the instant message sending prevention&#039;&#039;&#039;&#039;&#039; : &amp;quot;@sendim:&amp;lt;UUID&amp;gt;=&amp;lt;rem/add&amp;gt;&amp;quot;&lt;br /&gt;
&#039;&#039;Implemented in v1.01&#039;&#039;&lt;br /&gt;
When adding an exception, the user can send IMs to the receiver whose [[UUID]] is specified in the command. This overrides the prevention for this avatar only (there is no limit to the number of exceptions), don&#039;t forget to remove it when it becomes obsolete.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Allow/prevent sending instant messages to someone in particular&#039;&#039;&#039;&#039;&#039; : &amp;quot;@sendimto:&amp;lt;UUID&amp;gt;=&amp;lt;y/n&amp;gt;&amp;quot;&lt;br /&gt;
&#039;&#039;Implemented in v2.3 and v1.25&#039;&#039;&lt;br /&gt;
When prevented, everything typed in IM to the specified avatar will be discarded and a bogus message will be sent instead.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Allow/prevent starting an IM session with anyone&#039;&#039;&#039;&#039;&#039; : &amp;quot;@startim=&amp;lt;y/n&amp;gt;&amp;quot;&lt;br /&gt;
&#039;&#039;Implemented in v2.6&#039;&#039;&lt;br /&gt;
When prevented, the user is unable to start an IM session with anyone. Sessions that are already open are not impacted though.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Remove/add exceptions to the IM session start prevention&#039;&#039;&#039;&#039;&#039; : &amp;quot;@startim:&amp;lt;UUID&amp;gt;=&amp;lt;rem/add&amp;gt;&amp;quot;&lt;br /&gt;
&#039;&#039;Implemented in v2.6&#039;&#039;&lt;br /&gt;
When adding an exception, the user can start an IM session with the receiver whose [[UUID]] is specified in the command. This overrides the prevention for this avatar only (there is no limit to the number of exceptions), don&#039;t forget to remove it when it becomes obsolete.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Allow/prevent starting an IM session with someone in particular&#039;&#039;&#039;&#039;&#039; : &amp;quot;@startimto:&amp;lt;UUID&amp;gt;=&amp;lt;y/n&amp;gt;&amp;quot;&lt;br /&gt;
&#039;&#039;Implemented in v2.6&#039;&#039;&lt;br /&gt;
When prevented, the user is unable to start an IM session with that person. Sessions that are already open are not impacted though.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Allow/prevent receiving instant messages&#039;&#039;&#039;&#039;&#039; : &amp;quot;@recvim=&amp;lt;y/n&amp;gt;&amp;quot;&lt;br /&gt;
&#039;&#039;Implemented in v1.0b&#039;&#039;&lt;br /&gt;
When prevented, every incoming IM will be discarded and the sender will be notified that the user cannot read them.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Allow/prevent receiving instant messages, secure way&#039;&#039;&#039;&#039;&#039; : &amp;quot;@recvim_sec=&amp;lt;y/n&amp;gt;&amp;quot;&lt;br /&gt;
&#039;&#039;Implemented in v1.21&#039;&#039;&lt;br /&gt;
When prevented, every incoming IM will be discarded and the sender will be notified that the user cannot read them. This particular command accepts exceptions issued from the same object only, opposed to the non-secure way that accepts exceptions from any object.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Remove/add exceptions to the instant message receiving prevention&#039;&#039;&#039;&#039;&#039; : &amp;quot;@recvim:&amp;lt;UUID&amp;gt;=&amp;lt;rem/add&amp;gt;&amp;quot;&lt;br /&gt;
&#039;&#039;Implemented in v1.01&#039;&#039;&lt;br /&gt;
When adding an exception, the user can read instant messages from the sender whose [[UUID]] is specified in the command. This overrides the prevention for this avatar only (there is no limit to the number of exceptions), don&#039;t forget to remove it when it becomes obsolete.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Allow/prevent receiving instant messages from someone in particular&#039;&#039;&#039;&#039;&#039; : &amp;quot;@recvimfrom:&amp;lt;UUID&amp;gt;=&amp;lt;y/n&amp;gt;&amp;quot;&lt;br /&gt;
&#039;&#039;Implemented in v2.3 and v1.25&#039;&#039;&lt;br /&gt;
When prevented, every IM received from the the specified avatar will be discarded and the sender will be notified that the user cannot read them.&lt;br /&gt;
&lt;br /&gt;
===Teleportation===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Allow/prevent teleporting to a landmark&#039;&#039;&#039;&#039;&#039; : &amp;quot;@tplm=&amp;lt;y/n&amp;gt;&amp;quot;&lt;br /&gt;
&#039;&#039;Implemented in v1.0&#039;&#039;&lt;br /&gt;
When prevented, the user cannot use a [[landmark]], pick or any other preset location to [[teleport]] there.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Allow/prevent teleporting to a location&#039;&#039;&#039;&#039;&#039; : &amp;quot;@tploc=&amp;lt;y/n&amp;gt;&amp;quot;&lt;br /&gt;
&#039;&#039;Implemented in v1.0&#039;&#039;&lt;br /&gt;
When prevented, the user cannot use [[teleport]] to a coordinate by using the [[map]] and such.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Allow/prevent teleporting by a friend&#039;&#039;&#039;&#039;&#039; : &amp;quot;@tplure=&amp;lt;y/n&amp;gt;&amp;quot;&lt;br /&gt;
&#039;&#039;Implemented in v1.0&#039;&#039;&lt;br /&gt;
When prevented, the user automatically discards any [[teleport]] offer, and the avatar who initiated the offer is notified.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Allow/prevent teleporting by a friend, secure way&#039;&#039;&#039;&#039;&#039; : &amp;quot;@tplure_sec=&amp;lt;y/n&amp;gt;&amp;quot;&lt;br /&gt;
&#039;&#039;Implemented in v1.21&#039;&#039;&lt;br /&gt;
When prevented, the user automatically discards any [[teleport]] offer, and the avatar who initiated the offer is notified. This particular command accepts exceptions issued from the same object only, opposed to the non-secure way that accepts exceptions from any object.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Remove/add exceptions to the friend teleport prevention&#039;&#039;&#039;&#039;&#039; : &amp;quot;@tplure:&amp;lt;UUID&amp;gt;=&amp;lt;rem/add&amp;gt;&amp;quot;&lt;br /&gt;
&#039;&#039;Implemented in v1.0&#039;&#039;&lt;br /&gt;
When adding an exception, the user can be teleported by the avatar whose [[UUID]] is specified in the command. This overrides the prevention for this avatar only (there is no limit to the number of exceptions), don&#039;t forget to remove it when it becomes obsolete.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Unlimit/limit sit-tp&#039;&#039;&#039;&#039;&#039; : &amp;quot;@sittp=&amp;lt;y/n&amp;gt;&amp;quot;&lt;br /&gt;
&#039;&#039;Implemented in v1.0&#039;&#039;&lt;br /&gt;
When limited, the avatar cannot sit on a [[prim]] unless it is closer than 1.5 m. This allows cages to be secure, preventing the avatar from warping its position through the walls (unless the prim is too close).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Allow/prevent standing up at a different location than where we sat down&#039;&#039;&#039;&#039;&#039; : @standtp=&amp;lt;y/n&amp;gt;&lt;br /&gt;
&#039;&#039;Implemented in v2.1.2 and v1.24&#039;&#039;&lt;br /&gt;
When this restriction is active and the avatar stands up, it is automatically teleported back to the location where it initially sat down. Please note that the &amp;quot;last standing location&amp;quot; is also stored when the restriction is issued, so this won&#039;t be a problem for grabbers and the like, that sit the victim, then move them inside a cell, which issues its restrictions, and then unsits them. In this case the avatar will stay in the cell.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Force-Teleport the user&#039;&#039;&#039;&#039;&#039; : @tpto:&amp;lt;X&amp;gt;/&amp;lt;Y&amp;gt;/&amp;lt;Z&amp;gt;=force (*)&lt;br /&gt;
&#039;&#039;Implemented in v1.12&#039;&#039;&lt;br /&gt;
This command forces the avatar to teleport to the indicated coordinates. Note that these coordinates are always &#039;&#039;&#039;global&#039;&#039;&#039;, hence the script that calls this command will not be trivial. Moreso, if the destination contains a telehub or a landing point, the user will land there instead of the desired point. This is a SL limitation. Also keep in mind that @tpto is inhibited by @tploc=n, and from v1.15 and above, by @unsit too.&lt;br /&gt;
&lt;br /&gt;
Here is a sample code to call that command properly :&lt;br /&gt;
&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
// FORCE TELEPORT EXAMPLE&lt;br /&gt;
// Listens on channel 4 for local coordinates and a sim name&lt;br /&gt;
// and tells your viewer to teleport you there.&lt;br /&gt;
//&lt;br /&gt;
// By Marine Kelley 2008-08-26&lt;br /&gt;
// RLV version required : 1.12 and above&lt;br /&gt;
//&lt;br /&gt;
// HOW TO USE :&lt;br /&gt;
//   * Create a script inside a box&lt;br /&gt;
//   * Overwrite the contents of the script with this one&lt;br /&gt;
//   * Wear the box&lt;br /&gt;
//   * Say the destination coords Region/X/Y/Z on channel 4 :&lt;br /&gt;
//     Example : /4 Help Island Public/128/128/50&lt;br /&gt;
&lt;br /&gt;
key kRequestHandle; // UUID of the dataserver request&lt;br /&gt;
vector vLocalPos;   // local position extracted from the&lt;br /&gt;
&lt;br /&gt;
Init () {&lt;br /&gt;
  kRequestHandle = NULL_KEY;&lt;br /&gt;
  llListen (4, &amp;quot;&amp;quot;, llGetOwner (), &amp;quot;&amp;quot;);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
  state_entry () {&lt;br /&gt;
    Init ();&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  on_rez(integer start_param) {&lt;br /&gt;
    Init ();&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  listen(integer channel, string name, key id, string message) {&lt;br /&gt;
    list tokens = llParseString2List (message, [&amp;quot;/&amp;quot;], []);&lt;br /&gt;
    integer L = llGetListLength (tokens);&lt;br /&gt;
&lt;br /&gt;
    if (L==4) {&lt;br /&gt;
      // Extract local X, Y and Z&lt;br /&gt;
      vLocalPos.x = llList2Float (tokens, 1);&lt;br /&gt;
      vLocalPos.y = llList2Float (tokens, 2);&lt;br /&gt;
      vLocalPos.z = llList2Float (tokens, 3);&lt;br /&gt;
&lt;br /&gt;
      // Request info about the sim&lt;br /&gt;
      kRequestHandle=llRequestSimulatorData (llList2String (tokens, 0), DATA_SIM_POS);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
  dataserver(key queryid, string data) {&lt;br /&gt;
    if (queryid == kRequestHandle) {&lt;br /&gt;
      // Parse the dataserver response (it is a vector cast to a string)&lt;br /&gt;
      list tokens = llParseString2List (data, [&amp;quot;&amp;lt;&amp;quot;, &amp;quot;,&amp;quot;, &amp;quot;&amp;gt;&amp;quot;], []);&lt;br /&gt;
      string pos_str = &amp;quot;&amp;quot;;&lt;br /&gt;
      vector global_pos;&lt;br /&gt;
&lt;br /&gt;
      // The coordinates given by the dataserver are the ones of the&lt;br /&gt;
      // South-West corner of this sim&lt;br /&gt;
      // =&amp;gt; offset with the specified local coordinates&lt;br /&gt;
      global_pos.x = llList2Float (tokens, 0);&lt;br /&gt;
      global_pos.y = llList2Float (tokens, 1);&lt;br /&gt;
      global_pos.z = llList2Float (tokens, 2);&lt;br /&gt;
      global_pos += vLocalPos;&lt;br /&gt;
&lt;br /&gt;
      // Build the command&lt;br /&gt;
      pos_str =      (string)((integer)global_pos.x)&lt;br /&gt;
                +&amp;quot;/&amp;quot;+(string)((integer)global_pos.y)&lt;br /&gt;
                +&amp;quot;/&amp;quot;+(string)((integer)global_pos.z);&lt;br /&gt;
      llOwnerSay (&amp;quot;Global position : &amp;quot;+(string)pos_str); // Debug purposes&lt;br /&gt;
&lt;br /&gt;
      // Fire !&lt;br /&gt;
      llOwnerSay (&amp;quot;@tpto:&amp;quot;+pos_str+&amp;quot;=force&amp;quot;);&lt;br /&gt;
    }&lt;br /&gt;
  }&lt;br /&gt;
  &lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Remove/add auto-accept teleport offers from a particular avatar&#039;&#039;&#039;&#039;&#039; : &amp;quot;@accepttp[:&amp;lt;UUID&amp;gt;]=&amp;lt;rem/add&amp;gt;&amp;quot;&lt;br /&gt;
&#039;&#039;Implemented in v1.15, slightly improved in v1.16&#039;&#039;&lt;br /&gt;
Adding this rule will make the user automatically accept any teleport offer from the avatar which key is &amp;lt;UUID&amp;gt;, exactly like if that avatar was a Linden (no confirmation box, no message, no Cancel button). This rule does not supercede nor deprecate @tpto because the former teleports to someone, while the latter teleports to an arbitrary location. Attention : in v1.16 the UUID becomes optional, which means that @accepttp=add will force the user to accept teleport offers from anyone ! Use with caution !&lt;br /&gt;
&lt;br /&gt;
===Inventory, Editing and Rezzing===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Allow/prevent using inventory&#039;&#039;&#039;&#039;&#039; : @showinv=&amp;lt;y/n&amp;gt;&lt;br /&gt;
&#039;&#039;Implemented in v1.10&#039;&#039;&lt;br /&gt;
Forces the [[inventory]] windows to close and stay closed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Allow/prevent reading notecards&#039;&#039;&#039;&#039;&#039; : @viewnote=&amp;lt;y/n&amp;gt;&lt;br /&gt;
&#039;&#039;Implemented in v1.10&#039;&#039;&lt;br /&gt;
Prevents from opening [[notecards]] but does not close the ones already open.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Allow/prevent opening scripts&#039;&#039;&#039;&#039;&#039; : @viewscript=&amp;lt;y/n&amp;gt;&lt;br /&gt;
&#039;&#039;Implemented in v1.22&#039;&#039;&lt;br /&gt;
Prevents from opening [[scripts]] but does not close the ones already open.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Allow/prevent opening textures&#039;&#039;&#039;&#039;&#039; : @viewtexture=&amp;lt;y/n&amp;gt;&lt;br /&gt;
&#039;&#039;Implemented in v1.22&#039;&#039;&lt;br /&gt;
Prevents from opening [[textures]] (and snapshots) but does not close the ones already open.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Allow/prevent editing objects&#039;&#039;&#039;&#039;&#039; : &amp;quot;@edit=&amp;lt;y/n&amp;gt;&amp;quot;&lt;br /&gt;
&#039;&#039;Implemented in v1.03&#039;&#039;&lt;br /&gt;
When prevented from editing and opening objects, the Build &amp;amp; Edit window will refuse to open.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Remove/add exceptions to the edit prevention&#039;&#039;&#039;&#039;&#039; : &amp;quot;@edit:&amp;lt;UUID&amp;gt;=&amp;lt;rem/add&amp;gt;&amp;quot;&lt;br /&gt;
&#039;&#039;Implemented in v2.3 and v1.25&#039;&#039;&lt;br /&gt;
When adding an exception, the user can edit or open this object in particular.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Allow/prevent rezzing inventory&#039;&#039;&#039;&#039;&#039; : &amp;quot;@rez=&amp;lt;y/n&amp;gt;&amp;quot;&lt;br /&gt;
&#039;&#039;Implemented in v1.03&#039;&#039;&lt;br /&gt;
When prevented from [[rez]]zing stuff, creating and deleting objects, drag-dropping from inventory and dropping attachments will fail.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Allow/prevent editing particular objects&#039;&#039;&#039;&#039;&#039; : &amp;quot;@editobj:&amp;lt;UUID&amp;gt;=&amp;lt;y/n&amp;gt;&amp;quot;&lt;br /&gt;
&#039;&#039;Implemented in v2.3 and v1.25&#039;&#039;&lt;br /&gt;
When prevented, the Build &amp;amp; Edit window will refuse to open when trying to edit or open the specified object.&lt;br /&gt;
&lt;br /&gt;
===Sitting===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Allow/prevent standing up&#039;&#039;&#039;&#039;&#039; : @unsit=&amp;lt;y/n&amp;gt;&lt;br /&gt;
&#039;&#039;Implemented in v1.10, modified in v1.15 to prevent teleporting as well&#039;&#039;&lt;br /&gt;
Hides the Stand up button. From v1.15 it also prevents teleporting, which was a way to stand up.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Force sit on an object&#039;&#039;&#039;&#039;&#039; : @sit:&amp;lt;UUID&amp;gt;=force (*)&lt;br /&gt;
&#039;&#039;Implemented in v1.10&#039;&#039;&lt;br /&gt;
Does not work if the user is prevented from sit-tping and further than 1.5 meters away, or when prevented from unsitting.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Get the UUID of the object the avatar is sitting on&#039;&#039;&#039;&#039;&#039; : @getsitid=&amp;lt;channel_number&amp;gt;&lt;br /&gt;
&#039;&#039;Implemented in v1.12.4 but broken in all versions older than v1.24 and v2.2 (was reporting the UUID of the last object any avatar within draw distance sat upon)&#039;&#039;&lt;br /&gt;
Makes the viewer automatically answer the UUID of the object the avatar is currently sitting on, or NULL_KEY if they are not sitting.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Force unsit&#039;&#039;&#039;&#039;&#039; : @unsit=force (*)&lt;br /&gt;
&#039;&#039;Implemented in v1.10&#039;&#039;&lt;br /&gt;
Self-explanatory but for some reason it randomly fails, so don&#039;t rely on it for now. Further testing is needed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Allow/prevent sitting down&#039;&#039;&#039;&#039;&#039; : @sit=&amp;lt;y/n&amp;gt;&lt;br /&gt;
&#039;&#039;Implemented in v1.16.2&#039;&#039;&lt;br /&gt;
Prevents the user from sitting on anything, including with @sit:UUID=force.&lt;br /&gt;
&lt;br /&gt;
===Clothing and Attachments===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Render an object detachable/nondetachable&#039;&#039;&#039;&#039;&#039; : &amp;quot;@detach=&amp;lt;y/n&amp;gt;&amp;quot;&lt;br /&gt;
&#039;&#039;Implemented in v1.0a&#039;&#039;&lt;br /&gt;
When called with the &amp;quot;n&amp;quot; option, the object sending this message (which must be an attachment) will be made nondetachable. It can be detached again when the &amp;quot;y&amp;quot; option is called.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Unlock/Lock an attachment point&#039;&#039;&#039;&#039;&#039; : &amp;quot;@detach:&amp;lt;attach_point_name&amp;gt;=&amp;lt;y/n&amp;gt;&amp;quot;&lt;br /&gt;
&#039;&#039;Implemented in v1.20&#039;&#039;&lt;br /&gt;
When called with the &amp;quot;n&amp;quot; option, the attachment point of name &amp;lt;attach_point_name&amp;gt; will be locked either full (if it is occupied by an object at that time) or empty (if not). Any object that is occupying this point when the restriction is issued will be considered as undetachable, exactly like if it had issued a &amp;quot;@detach=n&amp;quot; command itself. If the point is empty it will stay that way, no item will be able to be attached there, and llAttachToAvatar() calls will fail (the object will be attached, then detached right away).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Unlock/Lock an attachment point empty&#039;&#039;&#039;&#039;&#039; : &amp;quot;@addattach[:&amp;lt;attach_point_name&amp;gt;]=&amp;lt;y/n&amp;gt;&amp;quot;&lt;br /&gt;
&#039;&#039;Implemented in v1.22&#039;&#039;&lt;br /&gt;
When called with the &amp;quot;n&amp;quot; option, the attachment point of name &amp;lt;attach_point_name&amp;gt; will be locked empty. Any object that is occupying this point when the restriction is issued can be detached, but nothing can be attached there. If the point is empty it will stay that way, no item will be able to be attached there, and llAttachToAvatar() calls will fail (the object will be attached, then detached right away). If &amp;lt;attach_point_name&amp;gt; is not specified, then all the attachment points will be concerned. This command is the counterpart to @addoutfit, for attachments.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Unlock/Lock an attachment point full&#039;&#039;&#039;&#039;&#039; : &amp;quot;@remattach[:&amp;lt;attach_point_name&amp;gt;]=&amp;lt;y/n&amp;gt;&amp;quot;&lt;br /&gt;
&#039;&#039;Implemented in v1.22&#039;&#039;&lt;br /&gt;
When called with the &amp;quot;n&amp;quot; option, the attachment point of name &amp;lt;attach_point_name&amp;gt; will be locked full. Any object that is occupying this point when the restriction is issued will be rendered undetachable. If the point is empty it will allow the user to wear something, but then that object will become undetachable too, no item will be able to replace it, and llAttachToAvatar() calls will fail (the object will be attached, then detached right away).  If &amp;lt;attach_point_name&amp;gt; is not specified, then all the attachment points will be concerned. This command is the counterpart to @remoutfit, for attachments.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Allow/deny the &amp;quot;Wear&amp;quot; contextual menu&#039;&#039;&#039;&#039;&#039; : &amp;quot;@defaultwear=&amp;lt;y/n&amp;gt;&lt;br /&gt;
&#039;&#039;Implemented in v1.21&#039;&#039;&lt;br /&gt;
When allowed, the user is always able to choose the &amp;quot;Wear&amp;quot;command on the contextual menu of the inventory, even when an object is locked on their avatar. This holds the risk of kicking that locked object, but it will be reattached automatically within 5 seconds (and successive locked objects every second until there is nothing left to reattach). However some objects may be scripted in a way that they drop their restrictions when detached, or simply not take into account the fact that even a locked object can be detached when using the RLV.&lt;br /&gt;
&lt;br /&gt;
Therefore, using this command with the &amp;quot;n&amp;quot; option will suppress this comman, but it will still be available for objects that contain the target attachment point in their name or in the name of their parent folder, exactly like pre-1.21 RLV. This is a little less user-friendly but more secure when it comes to make sure no locked object may be detached accidentally.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Force removing attachments&#039;&#039;&#039;&#039;&#039; : @detach[:attachpt]=force (*) &lt;br /&gt;
&#039;&#039;Implemented in v1.10&#039;&#039;&lt;br /&gt;
Where part is :&lt;br /&gt;
 chest|skull|left shoulder|right shoulder|left hand|right hand|left foot|right foot|spine|&lt;br /&gt;
 pelvis|mouth|chin|left ear|right ear|left eyeball|right eyeball|nose|r upper arm|r forearm|&lt;br /&gt;
 l upper arm|l forearm|right hip|r upper leg|r lower leg|left hip|l upper leg|l lower leg|stomach|left pec|&lt;br /&gt;
 right pec|center 2|top right|top|top left|center|bottom left|bottom|bottom right|neck|root&lt;br /&gt;
If part is not specified, removes everything.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Force removing attachments (alias)&#039;&#039;&#039;&#039;&#039; : @remattach[:attachpt]=force (*) &lt;br /&gt;
&#039;&#039;Implemented in v1.22&#039;&#039;&lt;br /&gt;
This command is an alias to @detach[:attachpt]=force (to keep things consistent).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Allow/prevent wearing clothes&#039;&#039;&#039;&#039;&#039; : @addoutfit[:&amp;lt;part&amp;gt;]=&amp;lt;y/n&amp;gt;&lt;br /&gt;
&#039;&#039;Implemented in v1.10, added skin hair and eyes in v1.10.1, added physics in 2.6.1&#039;&#039;&lt;br /&gt;
Where part is :&lt;br /&gt;
 gloves|jacket|pants|shirt|shoes|skirt|socks|underpants|undershirt|skin|eyes|hair|shape|alpha|tattoo|physics&lt;br /&gt;
If part is not specified, prevents from wearing anything beyond what the avatar is already wearing.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Since the release of Viewer 2.0 there are two new avatar skin layers: Tattoo and Avatar Transparency Mask. The alpha and tattoo layers will only be supported by RLV compliant viewers that implement the new Viewer 2.0 features.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Allow/prevent removing clothes&#039;&#039;&#039;&#039;&#039; : @remoutfit[:&amp;lt;part&amp;gt;]=&amp;lt;y/n&amp;gt; (underpants and undershirt are kept for teens)&lt;br /&gt;
&#039;&#039;Implemented in v1.10, added skin hair and eyes in v1.10.1, added physics in 2.6.1&#039;&#039;&lt;br /&gt;
Where part is :&lt;br /&gt;
 gloves|jacket|pants|shirt|shoes|skirt|socks|underpants|undershirt|skin|eyes|hair|shape|alpha|tattoo|physics&lt;br /&gt;
If part is not specified, prevents from removing anything in what the avatar is wearing.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Since the release of Viewer 2.0 there are two new avatar skin layers: Tattoo and Avatar Transparency Mask. The alpha and tattoo layers will only be supported by RLV compliant viewers that implement the new Viewer 2.0 features.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Force removing clothes&#039;&#039;&#039;&#039;&#039; : @remoutfit[:&amp;lt;part&amp;gt;]=force (*) (teens can&#039;t be forced to remove underpants and undershirt)&lt;br /&gt;
&#039;&#039;Implemented in v1.10&#039;&#039;&lt;br /&gt;
Where part is :&lt;br /&gt;
 gloves|jacket|pants|shirt|shoes|skirt|socks|underpants|undershirt|alpha|tattoo|physics&lt;br /&gt;
If part is not specified, removes everything.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; Since the release of Viewer 2.0 there are two new avatar skin layers: Tattoo and Avatar Transparency Mask. The alpha and tattoo layers will only be supported by RLV compliant viewers that implement the new Viewer 2.0 features.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; skin, shape, eyes and hair cannot be removed since they are body parts (and removing any would result in an unrezzed avatar).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Get the list of worn clothes&#039;&#039;&#039;&#039;&#039; : @getoutfit[:part]=&amp;lt;channel_number&amp;gt;&lt;br /&gt;
&#039;&#039;Implemented in v1.10, added skin hair and eyes in v1.10.1, added physics in 2.6.1&#039;&#039;&lt;br /&gt;
Makes the viewer automatically answer the current occupation of clothes layers as a list of 0s (empty) and 1s (occupied) immediately on the chat channel number &amp;lt;channel_number&amp;gt; that the script can listen to. Always use a positive integer. Remember that regular viewers do not answer anything at all so remove the listener after a timeout.&lt;br /&gt;
&lt;br /&gt;
The list of 0s and 1s corresponds to :&lt;br /&gt;
 gloves,jacket,pants,shirt,shoes,skirt,socks,underpants,undershirt,skin,eyes,hair,shape&lt;br /&gt;
in that order.&lt;br /&gt;
&lt;br /&gt;
If a part is specified, answers a single 0 (empty) or 1 (occupied) corresponding to the part.&lt;br /&gt;
 Ex 1 : @getoutfit=2222 =&amp;gt; &amp;quot;0011000111&amp;quot; =&amp;gt; avatar is wearing pants, shirt, underpants and undershirt, and of course a skin.&lt;br /&gt;
 Ex 2 : @getoutfit:socks=2222 =&amp;gt; &amp;quot;0&amp;quot; =&amp;gt; the avatar is not wearing socks.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Note:&#039;&#039;&#039; For viewers that implement the new Viewer 2.0 features, the list is:&lt;br /&gt;
&lt;br /&gt;
gloves,jacket,pants,shirt,shoes,skirt,socks,underpants,undershirt,skin,eyes,hair,shape,alpha,tattoo&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Get the list of worn attachments&#039;&#039;&#039;&#039;&#039; : @getattach[:attachpt]=&amp;lt;channel_number&amp;gt;&lt;br /&gt;
&#039;&#039;Implemented in v1.10&#039;&#039;&lt;br /&gt;
Makes the viewer automatically answer the current occupation of attachment points as a list of 0s (empty) and 1s (occupied) immediately on the chat channel number &amp;lt;channel_number&amp;gt; that the script can listen to. Always use a positive integer. Remember that regular viewers do not answer anything at all so remove the listener after a timeout.&lt;br /&gt;
&lt;br /&gt;
The list of 0s and 1s corresponds to :&lt;br /&gt;
 none,chest,skull,left shoulder,right shoulder,left hand,right hand,left foot,right foot,spine,&lt;br /&gt;
 pelvis,mouth,chin,left ear,right ear,left eyeball,right eyeball,nose,r upper arm,r forearm,&lt;br /&gt;
 l upper arm,l forearm,right hip,r upper leg,r lower leg,left hip,l upper leg,l lower leg,stomach,left pec,&lt;br /&gt;
 right pec,center 2,top right,top,top left,center,bottom left,bottom,bottom right,neck,root&lt;br /&gt;
in that order.&lt;br /&gt;
&lt;br /&gt;
If an attachment point is specified, answers a single 0 (empty) or 1 (occupied) corresponding to the point.&lt;br /&gt;
 Ex 1 : @getattach=2222 =&amp;gt; &amp;quot;011000011010000000000000100100000000101&amp;quot; =&amp;gt; avatar is wearing attachments on &lt;br /&gt;
 chest, skull, left and right foot, pelvis, l and r lower leg, HUD bottom left and HUD bottom right.&lt;br /&gt;
 Ex 2 : @getattach:chest=2222 =&amp;gt; &amp;quot;1&amp;quot; =&amp;gt; avatar is wearing something on the chest.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;Note&#039;&#039; : The first character (&amp;quot;none&amp;quot;) is always &#039;0&#039;, so the index of each attach point in the string is &#039;&#039;&#039;exactly equal&#039;&#039;&#039; to the corresponding ATTACH_* macro in LSL. For instance, the index 9 in the string is ATTACH_BACK (which means &amp;quot;spine&amp;quot;). Remember the indices start at zero.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Force the viewer to automatically accept attach and take control permission requests&#039;&#039;&#039;&#039;&#039; : @acceptpermission=&amp;lt;rem/add&amp;gt;&lt;br /&gt;
&#039;&#039;Implemented in v1.16&#039;&#039;&lt;br /&gt;
Forces the avatar to automatically accept attach and take control permission requests. The dialog box doesn&#039;t even show up. This command does not supercede @denypermission, of course.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Allow/prevent accepting attach and take control permissions&#039;&#039;&#039;&#039;&#039; : @denypermission=&amp;lt;rem/add&amp;gt;&lt;br /&gt;
&#039;&#039;Implemented in v1.16, DEPRECATED in v1.16.2&#039;&#039;&lt;br /&gt;
When prevented, all attach and take control permission requests are automatically declined, without even showing the dialog box. Due to the extreme annoyance it was making, and because locked objects automatically reattach themselves since v1.16.1, this command is NOW DEPRECATED, DON&#039;T USE IT !&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Force detach an item&#039;&#039;&#039;&#039;&#039; : @detachme=force (*)&lt;br /&gt;
&#039;&#039;Implemented in v1.16.2&#039;&#039;&lt;br /&gt;
This command forces the object that issues it to detach itself from the avatar. It is there as a convenience to avoid a race condition when calling @clear then llDetachFromAvatar(), sometimes the object could detach itself before clearing its restrictions, making it reattach automatically after a while. With this command one can issue a @clear,detachme=force to be sure @clear is executed first.&lt;br /&gt;
&lt;br /&gt;
===Clothing and Attachments (Shared Folders)===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Allow/prevent wearing clothes and attachments that are not part of the #RLV folder&#039;&#039;&#039;&#039;&#039; : @unsharedwear=&amp;lt;y/n&amp;gt;&lt;br /&gt;
&#039;&#039;Implemented in v2.5&#039;&#039;&lt;br /&gt;
When prevented, no object, piece of clothing or bodypart can be worn unless it is part of the #RLV folder (i.e. &amp;quot;shared&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Allow/prevent removing clothes and attachments that are not part of the #RLV folder&#039;&#039;&#039;&#039;&#039; : @unsharedunwear=&amp;lt;y/n&amp;gt;&lt;br /&gt;
&#039;&#039;Implemented in v2.5&#039;&#039;&lt;br /&gt;
When prevented, no object, piece of clothing or bodypart can be removed from the avatar unless it is part of the #RLV folder (i.e. &amp;quot;shared&amp;quot;).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Get the list of shared folders in the avatar&#039;s inventory&#039;&#039;&#039;&#039;&#039; : @getinv[:folder1/.../folderN]=&amp;lt;channel_number&amp;gt;&lt;br /&gt;
&#039;&#039;Implemented in v1.11, added sub-folders in v1.13&#039;&#039;&lt;br /&gt;
Makes the viewer automatically answer the list of folders contained into the folder named &amp;quot;#RLV&amp;quot; (if it exists), immediately on the chat channel number &amp;lt;channel_number&amp;gt; that the script can listen to. If folders are specified, it will give the list of sub-folders contained into the folder located at that path instead of the shared root (example : &amp;quot;@getinv:Restraints/Leather cuffs/Arms=2222&amp;quot;). Always use a positive integer. Remember that regular viewers do not answer anything at all so remove the listener after a timeout.&lt;br /&gt;
&lt;br /&gt;
The answer is a list of names, separated by commas (&amp;quot;,&amp;quot;). Folders which names begin with a dot (&amp;quot;.&amp;quot;) will be ignored.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Get the list of shared folders in the avatar&#039;s inventory, with information about worn items&#039;&#039;&#039;&#039;&#039; : @getinvworn[:folder1/.../folderN]=&amp;lt;channel_number&amp;gt;&lt;br /&gt;
&#039;&#039;Implemented in v1.15&#039;&#039;&lt;br /&gt;
Makes the viewer automatically answer the list of folders contained into the folder named &amp;quot;#RLV&amp;quot; (if it exists), immediately on the chat channel number &amp;lt;channel_number&amp;gt; that the script can listen to. If folders are specified, it will give the list of sub-folders contained into the folder located at that path instead of the shared root (example : &amp;quot;@getinvworn:Restraints/Leather cuffs/Arms=2222&amp;quot;). Always use a positive integer. Remember that regular viewers do not answer anything at all so remove the listener after a timeout.&lt;br /&gt;
&lt;br /&gt;
The answer is a comma-separated list of names, each one followed with a pipe (&amp;quot;|&amp;quot;) and two digits. The current folder is put in first position (as opposed to @getinv which does not show the current folder, obviously), but without a name, only the pipe and the two digits.&lt;br /&gt;
&lt;br /&gt;
 Object : &amp;quot;@getinvworn:Restraints/Leather cuffs=2222&amp;quot;&lt;br /&gt;
 Viewer : &amp;quot;|02,Arms|30,Legs|10&amp;quot;&lt;br /&gt;
&lt;br /&gt;
Folders which names begin with a dot (&amp;quot;.&amp;quot;) will be ignored. The two digits are calculated as follows :&lt;br /&gt;
&lt;br /&gt;
First digit : Proportion of items worn in the corresponding folder (including no-mod items). In this example, the &amp;quot;3&amp;quot; of &amp;quot;30&amp;quot; means &amp;quot;all the items in the &amp;quot;Arms&amp;quot; folder are currently worn, while the &amp;quot;1&amp;quot; of &amp;quot;10&amp;quot; means &amp;quot;no item in the Legs folder is currently worn, but there are items to wear&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Second digit : Proportion of items globally worn in all the folders contained inside the corresponding folder. In this example, the &amp;quot;2&amp;quot; of &amp;quot;02&amp;quot; means &amp;quot;some items are worn in some of the folders contained into &amp;quot;Leather cuffs&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The digits, comprised between 0 and 3 included, have the following meaning :&lt;br /&gt;
&lt;br /&gt;
* 0 : No item is present in that folder&lt;br /&gt;
* 1 : Some items are present in that folder, but none of them is worn&lt;br /&gt;
* 2 : Some items are present in that folder, and some of them are worn&lt;br /&gt;
* 3 : Some items are present in that folder, and all of them are worn&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Get the path to a shared folder by giving a search criterion&#039;&#039;&#039;&#039;&#039; : @findfolder:part1[&amp;amp;&amp;amp;...&amp;amp;&amp;amp;partN]=&amp;lt;channel_number&amp;gt;&lt;br /&gt;
&#039;&#039;Implemented in v1.13.1&#039;&#039;&lt;br /&gt;
Makes the viewer automatically answer the path to the first shared folder which name contains &amp;lt;part1&amp;gt; and &amp;lt;part2&amp;gt; and ... and &amp;lt;partN&amp;gt;, immediately on the chat channel number &amp;lt;channel_number&amp;gt; that the script can listen to. The search is in depth first, notice the separator which is &amp;quot;&amp;amp;&amp;amp;&amp;quot; like &amp;quot;and&amp;quot;. Always use a positive integer. Remember that regular viewers do not answer anything at all so remove the listener after a timeout. It does not take disabled folders into account (folders which name begins with a dot &amp;quot;.&amp;quot;), nor folders which name begins with a tilde (&amp;quot;~&amp;quot;). The answer is a list of folders, separated by slashes (&#039;/&#039;).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Force attach items contained inside a shared folder&#039;&#039;&#039;&#039;&#039; : @attach:&amp;lt;folder1/.../folderN&amp;gt;=force (*)&lt;br /&gt;
&#039;&#039;Implemented in v1.11, added no-mod items in v1.12, added sub-folders in v1.13&#039;&#039;&lt;br /&gt;
Forces the viewer to attach every object and wear every piece of clothing contained inside the folder located at the specified path (which must be under &amp;quot;#RLV&amp;quot;). Objects names &#039;&#039;&#039;must&#039;&#039;&#039; contain the name of their target attachment point or they won&#039;t be attached. Each no-modify object &#039;&#039;&#039;must&#039;&#039;&#039; be contained inside a folder (one object per folder), which name contains the name of its target attachment point since it can&#039;t be renamed. Names cannot begin with a dot (&amp;quot;.&amp;quot;) since such folders are invisible to the scripts.&lt;br /&gt;
&lt;br /&gt;
Attachment point names are the same as the ones contained into the &amp;quot;Attach To&amp;quot; submenu : &amp;quot;skull&amp;quot;, &amp;quot;chest&amp;quot;, &amp;quot;l forearm&amp;quot;...&lt;br /&gt;
&lt;br /&gt;
Note 1 : Folder names &#039;&#039;&#039;can&#039;&#039;&#039; contain slashes, and will be chosen in priority when able (for instance, if &amp;quot;@attach:Restraints/cuffs=force&amp;quot; is issued, the &amp;quot;Restraints/cuffs&amp;quot; folder will be chosen before a &amp;quot;cuffs&amp;quot; folder contained inside a &amp;quot;Restraints&amp;quot; parent folder.&lt;br /&gt;
&lt;br /&gt;
Note 2 : If the name of a folder begins with a plus sign (&amp;quot;+&amp;quot;), then this command will act exactly like @attachover. This rule can be changed through the use of the &amp;quot;RestrainedLoveStackWhenFolderBeginsWith&amp;quot; debug setting.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Attention&#039;&#039;&#039; : This command will likely change in the future, to revert back to how it used to behave in version 1.x, i.e. never add an object if the target attachment point is already taken, but rather replace the old object. The current behaviour is intended to be ensured by @attachoverorreplace and its derivatives. For now @attachoverorreplace is a synonym to @attach, but this won&#039;t always be the case. In other words, if you intend to make your script always replace existing attachments when attaching new ones, use @attach. If you want your script to always make attachments stack, use @attachover. If you want to give the user the choice through the name of the folder (as indicated above, by prepending the name by a &amp;quot;+&amp;quot; sign by default), use @attachoverorreplace.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Force attach items contained inside a shared folder, without replacing what is already being worn&#039;&#039;&#039;&#039;&#039; : @attachover:&amp;lt;folder1/.../folderN&amp;gt;=force (*)&lt;br /&gt;
&#039;&#039;Implemented in v2.1.2 and v1.24&#039;&#039;&lt;br /&gt;
This command works exactly like @attach described hereabove, except that it won&#039;t kick objects and pieces of clothing that are already being worn.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Force attach items contained inside a shared folder&#039;&#039;&#039;&#039;&#039; : @attachoverorreplace:&amp;lt;folder1/.../folderN&amp;gt;=force (*)&lt;br /&gt;
&#039;&#039;Implemented in v2.5&#039;&#039;&lt;br /&gt;
This command works exactly like @attach described hereabove, it is a synonym.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Force attach items contained inside a shared folder, and its children recursively&#039;&#039;&#039;&#039;&#039; : @attachall:&amp;lt;folder1/.../folderN&amp;gt;=force (*)&lt;br /&gt;
&#039;&#039;Implemented in v1.15&#039;&#039;&lt;br /&gt;
This command works exactly like @attach described hereabove, but also attaches whatever is contained into children folders.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Force attach items contained inside a shared folder, and its children recursively, without replacing what is already being worn&#039;&#039;&#039;&#039;&#039; : @attachallover:&amp;lt;folder1/.../folderN&amp;gt;=force (*)&lt;br /&gt;
&#039;&#039;Implemented in v2.1.2 and v1.24&#039;&#039;&lt;br /&gt;
This command works exactly like @attachall described hereabove, except that it won&#039;t kick objects and pieces of clothing that are already being worn.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Force attach items contained inside a shared folder, and its children recursively&#039;&#039;&#039;&#039;&#039; : @attachalloverorreplace:&amp;lt;folder1/.../folderN&amp;gt;=force (*)&lt;br /&gt;
&#039;&#039;Implemented in v2.5&#039;&#039;&lt;br /&gt;
This command works exactly like @attachall described hereabove, it is a synonym.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Force detach items contained inside a shared folder&#039;&#039;&#039;&#039;&#039; : @detach:&amp;lt;folder_name&amp;gt;=force (*)&lt;br /&gt;
&#039;&#039;Implemented in v1.11&#039;&#039;&lt;br /&gt;
Forces the viewer to detach every object and unwear every piece of clothing contained inside &amp;lt;folder_name&amp;gt;(which must be directly under &amp;quot;#RLV&amp;quot;). If &amp;quot;@detach&amp;quot; is used with an attachment point name (skull, pelvis... see above), it takes priority over this way of detaching since it is the same command.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Force detach items contained inside a shared folder, and its children recursively&#039;&#039;&#039;&#039;&#039; : @detachall:&amp;lt;folder1/.../folderN&amp;gt;=force (*)&lt;br /&gt;
&#039;&#039;Implemented in v1.15&#039;&#039;&lt;br /&gt;
This command works exactly like @detach described hereabove, but also detaches whatever is contained into children folders.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Get the path to the shared folder containing a particular object/clothing worn on a point&#039;&#039;&#039;&#039;&#039; : @getpath[:&amp;lt;attachpt&amp;gt; or &amp;lt;clothing_layer&amp;gt;]=&amp;lt;channel_number&amp;gt;&lt;br /&gt;
&#039;&#039;Implemented in v1.16&#039;&#039;&lt;br /&gt;
Makes the viewer automatically answer the path to the shared folder containing the item that :&lt;br /&gt;
** issues this command if no option is set&lt;br /&gt;
** is attached on the attach point provided in the option field, ex : @getpath:spine=2222 =&amp;gt; &amp;quot;Restraints/Collar&amp;quot;&lt;br /&gt;
** is worn on the clothing layer provided in the option field, ex : @getpath:pants=2222 =&amp;gt; &amp;quot;Casual/Jeans/Tight&amp;quot;&lt;br /&gt;
Always use a positive integer. Remember that regular viewers do not answer anything at all so remove the listener after a timeout. It does not take disabled folders into account (folders which name begins with a dot &amp;quot;.&amp;quot;). The answer is a list of folders, separated by slashes (&#039;/&#039;).&lt;br /&gt;
&lt;br /&gt;
Please note : As version 1.40.4 is now live on the main grid, wearing several objects on the same attachment point is now possible. Therefore this command does not make much sense anymore since it can only respond with one folder, while the several objects could belong to several folders. Therefore it is better to use @getpathnew, since @getpath will slowly become deprecated as more and more users switch to 2.1 and beyond.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Get the all paths to the shared folders containing the objects/clothing worn on a point&#039;&#039;&#039;&#039;&#039; : @getpathnew[:&amp;lt;attachpt&amp;gt; or &amp;lt;clothing_layer&amp;gt;]=&amp;lt;channel_number&amp;gt;&lt;br /&gt;
&#039;&#039;Implemented in v2.1 and v1.24&#039;&#039;&lt;br /&gt;
Makes the viewer automatically answer the paths to the shared folders containing the item(s) that :&lt;br /&gt;
** issues this command if no option is set&lt;br /&gt;
** are attached on the attach point provided in the option field, ex : @getpathnew:spine=2222 =&amp;gt; &amp;quot;Restraints/Collar,Jewelry/Cute necklace&amp;quot;&lt;br /&gt;
** is worn on the clothing layer provided in the option field, ex : @getpathnew:pants=2222 =&amp;gt; &amp;quot;Casual/Jeans/Tight&amp;quot;&lt;br /&gt;
Always use a positive integer. Remember that regular viewers do not answer anything at all so remove the listener after a timeout. It does not take disabled folders into account (folders which name begins with a dot &amp;quot;.&amp;quot;). The answer is a list of folders, separated by slashes (&#039;/&#039;), if several paths must be returned because several outfits are concerned, they are organized in a list of strings separated by commas (&#039;,&#039;).&lt;br /&gt;
&lt;br /&gt;
This command has been added to replace @getpath, since in 2.1 several objects can be worn on the same attachment point.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Force attach items contained into a shared folder that contains a particular object/clothing&#039;&#039;&#039;&#039;&#039; : @attachthis[:&amp;lt;attachpt&amp;gt; or &amp;lt;clothing_layer&amp;gt;]=force (*)&lt;br /&gt;
&#039;&#039;Implemented in v1.16&#039;&#039;&lt;br /&gt;
This command is a shortcut for a @getpath followed with an @attach command (this saves a listener and a timeout).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Force attach items contained inside a shared folder, without replacing what is already being worn&#039;&#039;&#039;&#039;&#039; : @attachthisover[:&amp;lt;attachpt&amp;gt; or &amp;lt;clothing_layer&amp;gt;]=force (*)&lt;br /&gt;
&#039;&#039;Implemented in v2.1.2 and v1.24&#039;&#039;&lt;br /&gt;
This command works exactly like @attachthis described hereabove, except that it won&#039;t kick objects and pieces of clothing that are already being worn.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Force attach items contained inside a shared folder&#039;&#039;&#039;&#039;&#039; : @attachthisoverorreplace[:&amp;lt;attachpt&amp;gt; or &amp;lt;clothing_layer&amp;gt;]=force (*)&lt;br /&gt;
&#039;&#039;Implemented in v2.5&#039;&#039;&lt;br /&gt;
This command works exactly like @attachthis described hereabove, it is a synonym.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Force attach items contained into a shared folder that contains a particular object/clothing, and its children folders&#039;&#039;&#039;&#039;&#039; : @attachallthis[:&amp;lt;attachpt&amp;gt; or &amp;lt;clothing_layer&amp;gt;]=force (*)&lt;br /&gt;
&#039;&#039;Implemented in v1.16&#039;&#039;&lt;br /&gt;
This command is a shortcut for a @getpath followed with an @attachall command (this saves a listener and a timeout).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Force attach items contained inside a shared folder, without replacing what is already being worn&#039;&#039;&#039;&#039;&#039; : @attachallthisover[:&amp;lt;attachpt&amp;gt; or &amp;lt;clothing_layer&amp;gt;]=force (*)&lt;br /&gt;
&#039;&#039;Implemented in v2.1.2 and v1.24&#039;&#039;&lt;br /&gt;
This command works exactly like @attachallthis described hereabove, except that it won&#039;t kick objects and pieces of clothing that are already being worn.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Force attach items contained inside a shared folder&#039;&#039;&#039;&#039;&#039; : @attachallthisoverorreplace[:&amp;lt;attachpt&amp;gt; or &amp;lt;clothing_layer&amp;gt;]=force (*)&lt;br /&gt;
&#039;&#039;Implemented in v2.5&#039;&#039;&lt;br /&gt;
This command works exactly like @attachallthis described hereabove, it is a synonym.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Force detach items contained into a shared folder that contains a particular object/clothing&#039;&#039;&#039;&#039;&#039; : @detachthis[:&amp;lt;attachpt&amp;gt; or &amp;lt;clothing_layer&amp;gt;]=force (*)&lt;br /&gt;
&#039;&#039;Implemented in v1.16&#039;&#039;&lt;br /&gt;
This command is a shortcut for a @getpath followed with a @detach command (this saves a listener and a timeout).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Force detach items contained into a shared folder that contains a particular object/clothing, and its children folders&#039;&#039;&#039;&#039;&#039; : @detachallthis[:&amp;lt;attachpt&amp;gt; or &amp;lt;clothing_layer&amp;gt;]=force (*)&lt;br /&gt;
&#039;&#039;Implemented in v1.16&#039;&#039;&lt;br /&gt;
This command is a shortcut for a @getpath followed with a @detachall command (this saves a listener and a timeout).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Allow/prevent removing some folders&#039;&#039;&#039;&#039;&#039; : @detachthis[:&amp;lt;layer&amp;gt;|&amp;lt;attachpt&amp;gt;|&amp;lt;path_to_folder&amp;gt;]=&amp;lt;y/n&amp;gt;&lt;br /&gt;
&#039;&#039;Implemented in v2.3 and v1.25&#039;&#039;&lt;br /&gt;
When prevented, the user is unable to remove a folder if either of these conditions is filled :&lt;br /&gt;
- no option is specified and the folder contains the object that issues this restriction&lt;br /&gt;
- the &amp;quot;layer&amp;quot; option is set (shirt, pants...) and the folder contains a piece of clothing that is worn on this layer&lt;br /&gt;
- the &amp;quot;attachpt&amp;quot; option is set (l forearm, spine...) and the folder contains an attachment that is worn on this point&lt;br /&gt;
- the &amp;quot;path_to_folder&amp;quot; option is set and the folder corresponds to this location&lt;br /&gt;
&lt;br /&gt;
Moreso, this folder or these folders cannot be renamed, moved, deleted or modified.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Allow/prevent removing some folders and their children&#039;&#039;&#039;&#039;&#039; : @detachallthis[:&amp;lt;layer&amp;gt;|&amp;lt;attachpt&amp;gt;|&amp;lt;path_to_folder&amp;gt;]=&amp;lt;y/n&amp;gt;&lt;br /&gt;
&#039;&#039;Implemented in v2.3 and v1.25&#039;&#039;&lt;br /&gt;
These commands do exactly like @detachthis, but also apply to their children folders recursively.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Allow/prevent wearing some folders&#039;&#039;&#039;&#039;&#039; : @attachthis:&amp;lt;layer&amp;gt;|&amp;lt;attachpt&amp;gt;|&amp;lt;path_to_folder&amp;gt;=&amp;lt;y/n&amp;gt;&lt;br /&gt;
&#039;&#039;Implemented in v2.3 and v1.25&#039;&#039;&lt;br /&gt;
When prevented, the user is unable to attach a folder if either of these conditions is filled :&lt;br /&gt;
- the &amp;quot;layer&amp;quot; option is set (shirt, pants...) and the folder contains a piece of clothing that is meant to be worn on this layer&lt;br /&gt;
- the &amp;quot;attachpt&amp;quot; option is set (l forearm, spine...) and the folder contains an attachment that is meant to be worn on this point&lt;br /&gt;
- the &amp;quot;path_to_folder&amp;quot; option is set and the folder corresponds to this location&lt;br /&gt;
&lt;br /&gt;
Moreso, this folder or these folders cannot be renamed, moved, deleted or modified.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Allow/prevent wearing some folders and their children&#039;&#039;&#039;&#039;&#039; : @attachallthis[:&amp;lt;layer&amp;gt;|&amp;lt;attachpt&amp;gt;|&amp;lt;path_to_folder&amp;gt;]=&amp;lt;y/n&amp;gt;&lt;br /&gt;
&#039;&#039;Implemented in v2.3 and v1.25&#039;&#039;&lt;br /&gt;
These commands do exactly like @attachthis, but also apply to their children folders recursively.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Remove/add exceptions to the detachallthis restriction, for one folder only&#039;&#039;&#039;&#039;&#039; : &amp;quot;@detachthis_except:&amp;lt;folder&amp;gt;=&amp;lt;rem/add&amp;gt;&amp;quot;&lt;br /&gt;
&#039;&#039;Implemented in v2.5&#039;&#039;&lt;br /&gt;
When adding an exception, the user can remove the items contained into the indicated folder.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Remove/add exceptions to the detachallthis restriction, for one folder and its children&#039;&#039;&#039;&#039;&#039; : &amp;quot;@detachallthis_except:&amp;lt;folder&amp;gt;=&amp;lt;rem/add&amp;gt;&amp;quot;&lt;br /&gt;
&#039;&#039;Implemented in v2.5&#039;&#039;&lt;br /&gt;
When adding an exception, the user can remove the items contained into the indicated folder, or in any of its children.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Remove/add exceptions to the attachallthis restriction, for one folder only&#039;&#039;&#039;&#039;&#039; : &amp;quot;@attachthis_except:&amp;lt;folder&amp;gt;=&amp;lt;rem/add&amp;gt;&amp;quot;&lt;br /&gt;
&#039;&#039;Implemented in v2.5&#039;&#039;&lt;br /&gt;
When adding an exception, the user can wear the items contained into the indicated folder.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Remove/add exceptions to the attachallthis restriction, for one folder and its children&#039;&#039;&#039;&#039;&#039; : &amp;quot;@attachallthis_except:&amp;lt;folder&amp;gt;=&amp;lt;rem/add&amp;gt;&amp;quot;&lt;br /&gt;
&#039;&#039;Implemented in v2.5&#039;&#039;&lt;br /&gt;
When adding an exception, the user can wear the items contained into the indicated folder, or in any of its children.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
Note : These exceptions will be taken into account only for the restrictions that have been issued by the &#039;&#039;&#039;same object&#039;&#039;&#039;, you cannot put such an exception to a restriction issued by another object.&lt;br /&gt;
&lt;br /&gt;
Note : The viewer checks which exception or restriction is the &amp;quot;closest parent&amp;quot; in the folders hierarchy to the folder that the user is trying to wear or remove. If the closest is an @attach[all]this_except or a @detach[all]this_except exception , then the folder can be worn or removed respectively. If the closest is an @attach[all]this or a @detach[all]this restriction, then the folder is locked, no matter how many exceptions are pointing on the folders that are parent to this one.&lt;br /&gt;
&lt;br /&gt;
Example :&lt;br /&gt;
 A script issues a @attachallthis:=n restriction, preventing the whole #RLV folder and its children from being attached. It also issues a @detachallthis:=n restriction, preventing the whole #RLV folder and its children from being removed as well.&lt;br /&gt;
 Therefore the #RLV folder is now completely frozen.&lt;br /&gt;
&lt;br /&gt;
 However, the same object issues a @attachallthis:Jewelry/Gold=add exception, then a @detachallthis:Jewelry/Gold=add one, making the Jewelry/Gold folder available for wearing and removing.&lt;br /&gt;
 Finally, it issues a @attachallthis:Jewelry/Gold/Watch=n restriction followed by a @detachallthis:Jewelry/Gold/Watch=n restriction.&lt;br /&gt;
 As a result, the user can wear and remove only what is contained inside the Jewelry/Gold folder, except what is in Jewelry/Gold/Watch, and the rest is out of reach.&lt;br /&gt;
&lt;br /&gt;
===Touch===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Allow/prevent touching objects located further than 1.5 meters away from the avatar&#039;&#039;&#039;&#039;&#039; : @fartouch=&amp;lt;y/n&amp;gt;&lt;br /&gt;
&#039;&#039;Implemented in v1.11&#039;&#039;&lt;br /&gt;
When prevented, the avatar is unable to touch/grab objects from more than 1.5 m away, this command makes restraints more realistic since the avatar litterally has to press against the object in order to click on it.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Allow/prevent touching objects located further than 1.5 meters away from the avatar&#039;&#039;&#039;&#039;&#039; : @touchfar=&amp;lt;y/n&amp;gt;&lt;br /&gt;
&#039;&#039;Implemented in v2.4&#039;&#039;&lt;br /&gt;
This command is a synonym of @fartouch&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Allow/prevent touching any objects&#039;&#039;&#039;&#039;&#039; : @touchall=&amp;lt;y/n&amp;gt;&lt;br /&gt;
&#039;&#039;Implemented in v2.4&#039;&#039;&lt;br /&gt;
When prevented, the avatar is unable to touch/grab any object and attachment. This does not apply to HUDs.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Allow/prevent touching objects in-world&#039;&#039;&#039;&#039;&#039; : @touchworld=&amp;lt;y/n&amp;gt;&lt;br /&gt;
&#039;&#039;Implemented in v2.4&#039;&#039;&lt;br /&gt;
When prevented, the avatar is unable to touch/grab objects rezzed in-world, i.e. not attachments and HUDs.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Remove/add exceptions to the touchworld prevention&#039;&#039;&#039;&#039;&#039; : &amp;quot;@touchworld:&amp;lt;UUID&amp;gt;=&amp;lt;rem/add&amp;gt;&amp;quot;&lt;br /&gt;
&#039;&#039;Implemented in v2.5&#039;&#039;&lt;br /&gt;
When adding an exception, the user can touch this object in particular.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Allow/prevent touching one object in particular&#039;&#039;&#039;&#039;&#039; : @touchthis:&amp;lt;UUID&amp;gt;=&amp;lt;rem/add&amp;gt;&lt;br /&gt;
&#039;&#039;Implemented in v2.5&#039;&#039;&lt;br /&gt;
When prevented, the avatar is unable to touch/grab the object which UUID corresponds to the one specified in the command.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Remove/add an exception to the touch* preventions, for one object only&#039;&#039;&#039;&#039;&#039; : &amp;quot;@touchme=&amp;lt;rem/add&amp;gt;&amp;quot;&lt;br /&gt;
&#039;&#039;Implemented in v2.6&#039;&#039;&lt;br /&gt;
When adding such an exception, the user can touch this object in particular.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Allow/prevent touching attachments&#039;&#039;&#039;&#039;&#039; : @touchattach=&amp;lt;y/n&amp;gt;&lt;br /&gt;
&#039;&#039;Implemented in v2.4&#039;&#039;&lt;br /&gt;
When prevented, the avatar is unable to touch attachments (theirs and other avatars&#039;), but this does not apply to HUDs.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Allow/prevent touching one&#039;s attachments&#039;&#039;&#039;&#039;&#039; : @touchattachself=&amp;lt;y/n&amp;gt;&lt;br /&gt;
&#039;&#039;Implemented in v2.4&#039;&#039;&lt;br /&gt;
When prevented, the avatar is unable to touch their own attachments (theirs but can touch other people&#039;s), but this does not apply to HUDs.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Allow/prevent touching other people&#039;s attachments&#039;&#039;&#039;&#039;&#039; : @touchattachother=&amp;lt;y/n&amp;gt;&lt;br /&gt;
&#039;&#039;Implemented in v2.4&#039;&#039;&lt;br /&gt;
When prevented, the avatar is unable to touch other people&#039;s attachments (but they can touch their owns). This does not apply to HUDs.&lt;br /&gt;
&lt;br /&gt;
===Location===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Allow/prevent viewing the world map&#039;&#039;&#039;&#039;&#039; : @showworldmap=&amp;lt;y/n&amp;gt;&lt;br /&gt;
&#039;&#039;Implemented in v1.11&#039;&#039;&lt;br /&gt;
When prevented, the avatar is unable to view the world map, and it closes if it is open when the restriction becomes active.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Allow/prevent viewing the mini map&#039;&#039;&#039;&#039;&#039; : @showminimap=&amp;lt;y/n&amp;gt;&lt;br /&gt;
&#039;&#039;Implemented in v1.11&#039;&#039;&lt;br /&gt;
When prevented, the avatar is unable to view the mini map, and it closes if it is open when the restriction becomes active.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Allow/prevent knowing the current location&#039;&#039;&#039;&#039;&#039; : @showloc=&amp;lt;y/n&amp;gt;&lt;br /&gt;
&#039;&#039;Implemented in v1.12&#039;&#039;&lt;br /&gt;
When prevented, the user is unable to know where they are : the world map is hidden, the parcel and region name on the top menubar are hidden, they can&#039;t create landmarks, nor buy the land, nor see what land they have just left after a teleport, nor see the location in the About box, and even system and object messages are obfuscated if they contain the name of the region and/or the name of the parcel. However, [[llOwnerSay]] calls are &#039;&#039;not&#039;&#039; obfuscated so radars &#039;&#039;will&#039;&#039; still work (and RL commands as well).&lt;br /&gt;
&lt;br /&gt;
===Name Tags and Hovertext===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Allow/prevent seeing the names of the people around&#039;&#039;&#039;&#039;&#039; : @shownames=&amp;lt;y/n&amp;gt;&lt;br /&gt;
&#039;&#039;Implemented in v1.12.2, added more dummy names in v1.16&#039;&#039;&lt;br /&gt;
When prevented, the user is unable to know who is around. The names don&#039;t show on the screen, the names on the chat are replaced by &amp;quot;dummy&amp;quot; names such as &amp;quot;Someone&amp;quot;, &amp;quot;A resident&amp;quot;, the tooltips are hidden, the pie menu is almost useless so the user can&#039;t get the profile directly etc.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Allow/prevent seeing all the hovertexts&#039;&#039;&#039;&#039;&#039; : @showhovertextall=&amp;lt;y/n&amp;gt;&lt;br /&gt;
&#039;&#039;Implemented in v1.19&#039;&#039;&lt;br /&gt;
When prevented, the user is unable to read any hovertext (2D text floating above some prims).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Allow/prevent seeing one hovertext in particular&#039;&#039;&#039;&#039;&#039; : @showhovertext:&amp;lt;UUID&amp;gt;=&amp;lt;y/n&amp;gt;&lt;br /&gt;
&#039;&#039;Implemented in v1.19&#039;&#039;&lt;br /&gt;
When prevented, the user is unable to read the hovertext floating above the prim which id is UUID. This is made that way so that the restriction can be issued on an object, by another one (unlike @detach which can only set this restriction on itself).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Allow/prevent seeing the hovertexts on the HUD of the user&#039;&#039;&#039;&#039;&#039; : @showhovertexthud=&amp;lt;y/n&amp;gt;&lt;br /&gt;
&#039;&#039;Implemented in v1.19&#039;&#039;&lt;br /&gt;
When prevented, the user is unable to read any hovertext showing over their HUD objects, but will be able to see the ones in-world.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Allow/prevent seeing the hovertexts in-world&#039;&#039;&#039;&#039;&#039; : @showhovertextworld=&amp;lt;y/n&amp;gt;&lt;br /&gt;
&#039;&#039;Implemented in v1.19&#039;&#039;&lt;br /&gt;
When prevented, the user is unable to read any hovertext showing over their in-world objects, but will be able to see the ones over their HUD.&lt;br /&gt;
&lt;br /&gt;
===Group===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Force the agent to change the active group&#039;&#039;&#039;&#039;&#039; : @setgroup:&amp;lt;group_name&amp;gt;=force&lt;br /&gt;
&#039;&#039;Implemented in v2.5&#039;&#039;&lt;br /&gt;
Forces the agent to change the active group, to the specified one. Of course, they must already be a member of this group. If &amp;lt;group_name&amp;gt; is &amp;quot;none&amp;quot;, then the agent will deactivate the current group and not show any group tag at all.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Allow/prevent activating a group&#039;&#039;&#039;&#039;&#039; : @setgroup=&amp;lt;y/n&amp;gt;&lt;br /&gt;
&#039;&#039;Implemented in v2.5&#039;&#039;&lt;br /&gt;
When prevented, the user is unable to change the active group.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Get the name of the active group&#039;&#039;&#039;&#039;&#039; : @getgroup=&amp;lt;channel_number&amp;gt;&lt;br /&gt;
&#039;&#039;Implemented in v2.5&#039;&#039;&lt;br /&gt;
Makes the viewer automatically answer the name of the currently active group, immediately on the chat channel number &amp;lt;channel_number&amp;gt; that the script can listen to. Always use a positive integer. Remember that regular viewers do not answer anything at all so remove the listener after a timeout. The answer will simply be &amp;quot;none&amp;quot; if no group is active at the time. Please note that there is no way to obtain the UUID of the group, only the name.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Viewer Control===&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Allow/prevent changing some debug settings&#039;&#039;&#039;&#039;&#039; : @setdebug=&amp;lt;y/n&amp;gt;&lt;br /&gt;
&#039;&#039;Implemented in v1.16&#039;&#039;&lt;br /&gt;
When prevented, the user is unable to change some viewer debug settings (Advanced &amp;gt; Debug Settings). As most debug settings are either useless or critical to the user&#039;s experience, a whitelist approach is taken : only a few debug settings are locked, the others are always available and untouched. At the time of this writing, the allowed debug settings are :&lt;br /&gt;
** AvatarSex (0 : Female, 1 : Male) : gender of the avatar at creation.&lt;br /&gt;
** RenderResolutionDivisor (1 -&amp;gt; ...) : &amp;quot;blurriness&amp;quot; of the screen. Combined to clever @setenv commands, can simulate nice effects. Note: renderresolutiondivisor is a Windlight only option (Basic Shaders must be enabled in graphics preferences) and as such, is not available in v1.19.0.5 or older viewers.&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Force change a debug setting&#039;&#039;&#039;&#039;&#039; : @setdebug_&amp;lt;setting&amp;gt;:&amp;lt;value&amp;gt;=force (*)&lt;br /&gt;
&#039;&#039;Implemented in v1.16&#039;&#039;&lt;br /&gt;
Forces the viewer to change a particular debug setting and set it to &amp;lt;value&amp;gt;. This command is actually a package of many sub-commands, that are regrouped under &amp;quot;@setdebug_...&amp;quot;, for instance &amp;quot;@setdebug_avatarsex:0=force&amp;quot;, &amp;quot;@setdebug_renderresolutiondivisor:64=force&amp;quot; etc.&lt;br /&gt;
&lt;br /&gt;
See the list of allowed debug settings in the @setdebug command hereabove.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Get the value of a debug setting&#039;&#039;&#039;&#039;&#039; : @getdebug_&amp;lt;setting&amp;gt;=&amp;lt;channel_number&amp;gt;&lt;br /&gt;
&#039;&#039;Implemented in v1.16&#039;&#039;&lt;br /&gt;
Makes the viewer automatically answer the value of a debug setting, immediately on the chat channel number &amp;lt;channel_number&amp;gt; that the script can listen to. Always use a positive integer. Remember that regular viewers do not answer anything at all so remove the listener after a timeout. The answer is the value that has been set with the &amp;lt;setting&amp;gt; part of the matching @setdebug command, or by hand.&lt;br /&gt;
&lt;br /&gt;
See the list of allowed debug settings in the @setdebug command hereabove.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Allow/prevent changing the environment settings&#039;&#039;&#039;&#039;&#039; : @setenv=&amp;lt;y/n&amp;gt;&lt;br /&gt;
&#039;&#039;Implemented in v1.14&#039;&#039;&lt;br /&gt;
When prevented, the user is unable to change the viewer environment settings (World &amp;gt; Environment Settings &amp;gt; Sunrise/Midday/Sunset/Midnight/Revert to region default/Environment editor are all locked out).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Force change an environment setting&#039;&#039;&#039;&#039;&#039; : @setenv_&amp;lt;setting&amp;gt;:&amp;lt;value&amp;gt;=force (*)&lt;br /&gt;
&#039;&#039;Implemented in v1.14&#039;&#039;&lt;br /&gt;
Forces the viewer to change a particular environment setting (time of day or Windlight) and set it to &amp;lt;value&amp;gt;. This command is actually a package of many sub-commands, that are regrouped under &amp;quot;@setenv_...&amp;quot;, for instance &amp;quot;@setenv_daytime:0.5=force&amp;quot;, &amp;quot;@setenv_bluehorizonr:0.21=force&amp;quot; etc.&lt;br /&gt;
&lt;br /&gt;
This command (like any other &amp;quot;force&amp;quot; command) is silently discarded if the corresponding restriction has been set, here &amp;quot;@setenv&amp;quot;, but in this case the restriction is ignored if the change is issued from the object that has created it. In other words, a collar can restrict environment changes, yet force a change by itself, while another object could not do it until the collar lifts the restriction.&lt;br /&gt;
&lt;br /&gt;
Although a range is specified for every value, no check is made in the viewer so a script can do what the UI can&#039;t do, for interesting effects. Use at your own risk, though. The ranges indicated here are merely the ones available on the sliders on the Environment Editor, for reference.&lt;br /&gt;
&lt;br /&gt;
Each particular sub-command works as follows (the names are chosen to be as close to the Windlight panels of the viewer as possible) :&lt;br /&gt;
&lt;br /&gt;
{| border=&amp;quot;1&amp;quot; cellpadding=&amp;quot;5&amp;quot;&lt;br /&gt;
|  &#039;&#039;&#039;@setenv_XXX:&amp;lt;value&amp;gt;=force where XXX is...&#039;&#039;&#039;      ||   &#039;&#039;&#039;&amp;lt;value&amp;gt; range&#039;&#039;&#039;            ||   &#039;&#039;&#039;Sets...&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|   daytime       ||   0.0-1.0 and &amp;lt;0         ||   Time of day (sunrise:0.25, midday:0.567, sunset:0.75, midnight:0.0, set back to region default:&amp;lt;0). &#039;&#039;&#039;Attention, resets all other Windlight parameters&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|   preset        ||   String                 ||   A Preset environment, e.g. Gelatto, Foggy. &#039;&#039;&#039;Attention, loading a Preset is heavy on the viewer and can slow it down for a short while, don&#039;t do it every second&#039;&#039;&#039;&lt;br /&gt;
|-&lt;br /&gt;
|   ambientr      ||   0.0-1.0                ||   Ambient light, Red channel&lt;br /&gt;
|-&lt;br /&gt;
|   ambientg      ||   0.0-1.0                ||   Ambient light, Green channel&lt;br /&gt;
|-&lt;br /&gt;
|   ambientb      ||   0.0-1.0                ||   Ambient light, Blue channel&lt;br /&gt;
|-&lt;br /&gt;
|   ambienti      ||   0.0-1.0                ||   Ambient light, Intensity&lt;br /&gt;
|-&lt;br /&gt;
|   bluedensityr  ||   0.0-1.0                ||   Blue Density, Red channel&lt;br /&gt;
|-&lt;br /&gt;
|   bluedensityg  ||   0.0-1.0                ||   Blue Density, Green channel&lt;br /&gt;
|-&lt;br /&gt;
|   bluedensityb  ||   0.0-1.0                ||   Blue Density, Blue channel&lt;br /&gt;
|-&lt;br /&gt;
|   bluedensityi  ||   0.0-1.0                ||   Blue Density, Intensity&lt;br /&gt;
|-&lt;br /&gt;
|   bluehorizonr  ||   0.0-1.0                ||   Blue Horizon, Red channel&lt;br /&gt;
|-&lt;br /&gt;
|   bluehorizong  ||   0.0-1.0                ||   Blue Horizon, Green channel&lt;br /&gt;
|-&lt;br /&gt;
|   bluehorizonb  ||   0.0-1.0                ||   Blue Horizon, Blue channel&lt;br /&gt;
|-&lt;br /&gt;
|   bluehorizoni  ||   0.0-1.0                ||   Blue Horizon, Intensity&lt;br /&gt;
|-&lt;br /&gt;
|   cloudcolorr   ||   0.0-1.0                ||   Cloud color, Red channel&lt;br /&gt;
|-&lt;br /&gt;
|   cloudcolorg   ||   0.0-1.0                ||   Cloud color, Green channel&lt;br /&gt;
|-&lt;br /&gt;
|   cloudcolorb   ||   0.0-1.0                ||   Cloud color, Blue channel&lt;br /&gt;
|-&lt;br /&gt;
|   cloudcolori   ||   0.0-1.0                ||   Cloud color, Intensity&lt;br /&gt;
|-&lt;br /&gt;
|   cloudcoverage ||   0.0-1.0                ||   Cloud coverage&lt;br /&gt;
|-&lt;br /&gt;
|   cloudx        ||   0.0-1.0                ||   Cloud offset X&lt;br /&gt;
|-&lt;br /&gt;
|   cloudy        ||   0.0-1.0                ||   Cloud offset Y&lt;br /&gt;
|-&lt;br /&gt;
|   cloudd        ||   0.0-1.0                ||   Cloud density&lt;br /&gt;
|-&lt;br /&gt;
|   clouddetailx  ||   0.0-1.0                ||   Cloud detail X&lt;br /&gt;
|-&lt;br /&gt;
|   clouddetaily  ||   0.0-1.0                ||   Cloud detail Y&lt;br /&gt;
|-&lt;br /&gt;
|   clouddetaild  ||   0.0-1.0                ||   Cloud detail density&lt;br /&gt;
|-&lt;br /&gt;
|   cloudscale    ||   0.0-1.0                ||   Cloud scale&lt;br /&gt;
|-&lt;br /&gt;
|   cloudscrollx  ||   0.0-1.0                ||   Cloud scroll X&lt;br /&gt;
|-&lt;br /&gt;
|   cloudscrolly  ||   0.0-1.0                ||   Cloud scroll Y&lt;br /&gt;
|-&lt;br /&gt;
|   densitymultiplier    ||   0.0-0.9         ||   Density multiplier of the fog&lt;br /&gt;
|-&lt;br /&gt;
|   distancemultiplier   ||   0.0-100.0       ||   Distance multiplier of the fog&lt;br /&gt;
|-&lt;br /&gt;
|   eastangle            ||   0.0-1.0               ||   Position of the east, 0.0 is normal&lt;br /&gt;
|-&lt;br /&gt;
|   hazedensity   ||   0.0-1.0                ||   Density of the haze&lt;br /&gt;
|-&lt;br /&gt;
|   hazehorizon   ||   0.0-1.0                ||   Haze at the horizon&lt;br /&gt;
|-&lt;br /&gt;
|   maxaltitude   ||   0.0-4000.0       ||   Maximum altitude of the fog&lt;br /&gt;
|-&lt;br /&gt;
|   scenegamma    ||   0.0-10.0               ||   Overall gamma, 1.0 is normal&lt;br /&gt;
|-&lt;br /&gt;
|   starbrightness||   0.0-2.0                ||   Brightness of the stars&lt;br /&gt;
|-&lt;br /&gt;
|   sunglowfocus  ||   0.0-0.5                ||   Focus of the glow of the sun&lt;br /&gt;
|-&lt;br /&gt;
|   sunglowsize   ||   1.0-2.0                ||   Size of the glow of the sun&lt;br /&gt;
|-&lt;br /&gt;
|   sunmooncolorr ||   0.0-1.0                ||   Sun and moon, Red channel&lt;br /&gt;
|-&lt;br /&gt;
|   sunmooncolorg ||   0.0-1.0                ||   Sun and moon, Green channel&lt;br /&gt;
|-&lt;br /&gt;
|   sunmooncolorb ||   0.0-1.0                ||   Sun and moon, Blue channel&lt;br /&gt;
|-&lt;br /&gt;
|   sunmooncolori ||   0.0-1.0                ||   Sun and moon, Intensity&lt;br /&gt;
|-&lt;br /&gt;
|   sunmoonposition      ||   0.0-1.0         ||   Position of the sun/moon, different from &amp;quot;daytime&amp;quot;, &#039;&#039;&#039;use this to set the apparent sunlight after loading a Preset&#039;&#039;&#039;&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Note: from the above settings, only the &amp;quot;daytime&amp;quot; one is supported by v1.19.0 (or older) viewers implementing RestrainedLove v1.14 and later. The other settings are ignored. This is because these viewers do not implement the Windlight renderer.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
(*) Silently discarded if the user is prevented from doing so by the corresponding restriction. This is on purpose.&lt;br /&gt;
    Ex : Force detach won&#039;t work if the object is undetachable. Force undress won&#039;t work if the user is prevented from undressing.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
* &#039;&#039;&#039;&#039;&#039;Get the value of an environment setting&#039;&#039;&#039;&#039;&#039; : @getenv_&amp;lt;setting&amp;gt;=&amp;lt;channel_number&amp;gt;&lt;br /&gt;
&#039;&#039;Implemented in v1.15&#039;&#039;&lt;br /&gt;
Makes the viewer automatically answer the value of an environment setting, immediately on the chat channel number &amp;lt;channel_number&amp;gt; that the script can listen to. Always use a positive integer. Remember that regular viewers do not answer anything at all so remove the listener after a timeout. The answer is the value that has been set with the &amp;lt;setting&amp;gt; part of the matching @setenv command, or by hand. See the table hereabove for a list of settings.&amp;lt;br /&amp;gt;&lt;br /&gt;
Note: only @getenv_daytime is supported by v1.19.0 (or older, i.e. non Windlight) viewers implementing RestrainedLove v1.15 and later.&lt;br /&gt;
&lt;br /&gt;
==Important note about the global behaviours such as sendchat==&lt;br /&gt;
Such behaviours are global, which means they don&#039;t depend on a particular object. However, they are triggered by objects with a set [[UUID]] which can change, and several objects can add the same behaviour, which will be stored several times as the [[UUID]]s are different. &lt;br /&gt;
&lt;br /&gt;
This has a nice side effect : when wearing 2 locked devices that prevent chat, it is necessary to unlock them both to be able to chat again. But it has a nasty side effect, too : if the item changes [[UUID]] (for instance it was derezzed and rezzed again), and it doesn&#039;t allow chat beforehand, then the user will have to wait a short moment because the rule stays &amp;quot;orphaned&amp;quot; (its [[UUID]] is defunct) until the &#039;&#039;&#039;garbage collector&#039;&#039;&#039; kicks in.&lt;br /&gt;
&lt;br /&gt;
Please note : Since 1.16.1 any locked object that is kicked off by any mean (llAttachToAvatar for example) will be reattached automatically by the viewer after a few seconds. This means that calling @clear on detaching will actually unlock the object, which will have to be relocked after being reattached. It is therefore not recommended anymore to call @clear on detach, as opposed to pre-1.16.1 versions.&lt;br /&gt;
&lt;br /&gt;
==Shared Folders==&lt;br /&gt;
&lt;br /&gt;
Since v1.11, the viewer can &amp;quot;share&amp;quot; some of your items with scripts in world in order to let them force you to attach, detach and list what you have shared.&lt;br /&gt;
&lt;br /&gt;
&amp;quot;Share&amp;quot; does NOT mean they will be taken by other people if they want to (some of the items may be no-transfer anyway), but only that they can force YOU to wear/unwear them at will through the use of a script YOUR restraints contain. They will remain in your inventory. In fact, this feature would be best named &amp;quot;Exposed folder&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
To do this :&lt;br /&gt;
* Create a folder named &amp;quot;#RLV&amp;quot; (without the quotes) directly under &amp;quot;My Inventory&amp;quot; (right-click on &amp;quot;My Inventory&amp;quot;, select &amp;quot;New Folder&amp;quot;). We&#039;ll call this folder the &amp;quot;shared root&amp;quot;.&lt;br /&gt;
* Move a folder containing restraints or other attachments directly into this new folder.&lt;br /&gt;
* Wear the contents of that folder, that&#039;s it !&lt;br /&gt;
&lt;br /&gt;
So it would look like this :&lt;br /&gt;
&lt;br /&gt;
 My Inventory&lt;br /&gt;
 |- #RLV&lt;br /&gt;
 |  |- cuffs&lt;br /&gt;
 |  |  |- left cuff (l forearm)   (no copy)&lt;br /&gt;
 |  |  \- right cuff (r forearm)   (no copy)&lt;br /&gt;
 |  \- gag&lt;br /&gt;
 |     \- gag (mouth)   (no copy)&lt;br /&gt;
 |- Animations&lt;br /&gt;
 |- Body Parts&lt;br /&gt;
 .&lt;br /&gt;
 .&lt;br /&gt;
 .&lt;br /&gt;
&lt;br /&gt;
For example : If you&#039;re owning a set of RR Straps and want to share them, just move the folder &amp;quot;Straps BOXED&amp;quot; under the shared root.&lt;br /&gt;
&lt;br /&gt;
Either wear all the items of the folders you have just moved (one folder at a time !) or rename your items yourself, so that each item name contains the name of the target attachment point. For example : &amp;quot;left cuff (l forearm)&amp;quot;, &amp;quot;right ankle cuff (r lower leg)&amp;quot;. Please note that no-modify items are a bit more complex to share, because they cannot be renamed either by you or by the viewer. More on that below.&lt;br /&gt;
&lt;br /&gt;
The attachment point name is the same as the one you find in the &amp;quot;Attach To&amp;quot; menu of your inventory, and is case insensitive (for example : &amp;quot;chest&amp;quot;, &amp;quot;skull&amp;quot;, &amp;quot;stomach&amp;quot;, &amp;quot;left ear&amp;quot;, &amp;quot;r upper arm&amp;quot;...). If you wear the item without renaming it first it will be renamed automatically, but only if it is in a shared folder, and does not contain any attachment point name already, and is mod. If you want to wear it on another attachment point, you&#039;ll need to rename it by hand first.&lt;br /&gt;
&lt;br /&gt;
Pieces of clothing are treated exactly the same way (in fact they can even be put in the folder of a set of restraints and be worn with the same command). Shoes, for instance, are a good example of mixed outfits : some attachments and the Shoes layer. Clothes are NOT renamed automatically when worn, since their very type decides where they are to be worn (skirt, jacket, undershirt...).&lt;br /&gt;
&lt;br /&gt;
HOW TO SHARE NO-MODIFY ITEMS :&lt;br /&gt;
As you already know, no-mod items cannot be renamed so the technique is a bit more complex. Create a sub-folder inside the outfit folder (such as &amp;quot;cuffs&amp;quot; in the example above), put ONE no-modify item in it. When wearing the object, you&#039;ll see the folder itself be renamed (that&#039;s why you must not put more than one object inside it). So if your outfit contains several no-mod objects, you&#039;ll need to create as many folders and put the no-mod objects in them, one in each folder.&lt;br /&gt;
&lt;br /&gt;
Example with no-modify shoes :&lt;br /&gt;
&lt;br /&gt;
 My Inventory&lt;br /&gt;
 |- #RLV&lt;br /&gt;
 |  \- shoes&lt;br /&gt;
 |     |- left shoe (left foot)&lt;br /&gt;
 |     |  \- left shoe   (no modify) (no transfer)  &amp;lt;-- no-mod object&lt;br /&gt;
 |     |- right shoe (right foot)&lt;br /&gt;
 |     |  \- right shoe   (no modify) (no transfer) &amp;lt;-- no-mod object&lt;br /&gt;
 |     \- shoe base   (no modify) (no transfer)     &amp;lt;-- this is not an object&lt;br /&gt;
 |- Animations&lt;br /&gt;
 |- Body Parts&lt;br /&gt;
 .&lt;br /&gt;
 .&lt;br /&gt;
 .&lt;br /&gt;
&lt;br /&gt;
GOTCHAS :&lt;br /&gt;
* Do NOT put a comma (&#039;,&#039;) in the name of the folders under the shared root or it would screw the list up.&lt;br /&gt;
* Don&#039;t forget to rename the items in the shared folders (or to wear these items at least once to have them be renamed automatically) or the force attach command will appear to do nothing at all.&lt;br /&gt;
* Avoid cluttering the shared root with many folders, since some scripts may rely on the list they got with the @getinv command and chat messages are limited to 1023 characters. Choose wisely, and use short names. But with 9 characters per folder name average, you can expect to have about 100 folders available.&lt;br /&gt;
* Remember to put no-modify items in sub-folders, one each, so their names can be used by the viewer do find out where to attach them. They can&#039;t be shared like modify items since they can&#039;t be renamed, and the outfit folder itself will not be renamed (since it contains several items).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;Accept sub-folders given via llGiveInventoryList() into the shared folder&#039;&#039;&#039;&#039;&#039; :&lt;br /&gt;
&lt;br /&gt;
Starting with RestrainedLove v1.16.2, you may give a list of items to a victim and have them stored as a sub-folder inside the #RLV folder (thus allowing you to @attach the given items later).&lt;br /&gt;
&lt;br /&gt;
Issuing a llGiveInventoryList(victim_id, &amp;quot;#RLV/~subfolder_name&amp;quot;, list_of_stuff) command in a script makes a standard Keep/Discard/Mute dialog appear in the viewer of the victim (the avatar which key is victim_id).&lt;br /&gt;
&lt;br /&gt;
Should the victim accept the offer, the list_of_stuff items are put into a new sub-folder of the #RLV folder. The name of this sub-folder is &amp;quot;~subfolder_name&amp;quot; (it is the scripter&#039;s responsibility to use unique sub-folder names: if the name is the same as an existing sub-folder, two sub-folders with the same name will appear in the #RLV folder).&lt;br /&gt;
&lt;br /&gt;
Note that the tilde character *must* be used as the first character for the name of the sub-folder (this is so that the victim can easily spot any sub-folder given to them in this way, and so that such sub-folder names appear last in the #RLV folder).&lt;br /&gt;
&lt;br /&gt;
Note also that this feature may be disabled by the user, (by setting the RestrainedLoveForbidGiveToRLV debug setting to TRUE): in this case the given items are put into a folder named &amp;quot;#RLV/~subfolder_name&amp;quot; at the root of the inventory instead of inside the #RLV folder.&lt;br /&gt;
&lt;br /&gt;
Since the user may either refuse the offer or have the feature disabled in their viewer, and since SL may take quite some time to perform the actual transfer of the objects on laggy days, you must check that the given folder is present (with @getinv), before attempting to @attach the given objects.&lt;br /&gt;
&lt;br /&gt;
==For your information==&lt;br /&gt;
Here is how it works internally, for a better understanding of the gotchas you may encounter :&lt;br /&gt;
* Each command is parsed into a &#039;&#039;&#039;Behaviour&#039;&#039;&#039; (ex: &amp;quot;remoutfit&amp;quot;), an &#039;&#039;&#039;Option&#039;&#039;&#039; (ex: &amp;quot;shirt&amp;quot;) and a &#039;&#039;&#039;Param&#039;&#039;&#039; (ex: &amp;quot;force&amp;quot;) and comes from an [[UUID]] (the unique identifier of the emitting object).&lt;br /&gt;
&lt;br /&gt;
* There are two types of commands : &#039;&#039;&#039;one-shot&#039;&#039;&#039; commands (those which Param is &amp;quot;force&amp;quot; and those which Param is a number such as the channel number of a &amp;quot;version&amp;quot; call) and &#039;&#039;&#039;rules&#039;&#039;&#039; (those which Param is &amp;quot;y&amp;quot;, &amp;quot;n&amp;quot;, &amp;quot;add&amp;quot; or &amp;quot;rem&amp;quot;). &amp;quot;clear&amp;quot; is special but can be seen as a one-shot command.&lt;br /&gt;
&lt;br /&gt;
* When the command takes a channel number, this number may be either strictly positive or (for RestrainedLove v1.23a (@versionnum = 1230001) and above) strictly negative. Using channel 0 is not allowed. Note that RestrainedLove can send a maximum of 255 characters on negative channels, while it can send up to 1023 characters on positive channels. Negative channels are useful to prevent the user from cheating, for example when asking for the @versionnum (since the user could use a non-RestrainedLove viewer and make the RestrainedLove devices believe they run within a RestrainedLove viewer by spoofing the reply to the version command on a positive channel, which they can&#039;t do on negative channels). Positive channels are best used for commands that may return large reply strings (@getpath, for example).&lt;br /&gt;
&lt;br /&gt;
* Parameters &amp;quot;n&amp;quot; and &amp;quot;add&amp;quot; are &#039;&#039;&#039;exactly equal&#039;&#039;&#039; and are treated &#039;&#039;&#039;exactly the same way&#039;&#039;&#039;, they are just &#039;&#039;&#039;synonyms&#039;&#039;&#039;. Same goes for &amp;quot;y&amp;quot; and &amp;quot;rem&amp;quot;. The only purpose is to distinguish rules (&amp;quot;sendchannel=n&amp;quot;) from exceptions (&amp;quot;sendchannel:8=add&amp;quot;) in a script for clarity.&lt;br /&gt;
&lt;br /&gt;
* Rules are stored inside a table linking the [[UUID]] of the emitter to the rule itself. They are &#039;&#039;&#039;added&#039;&#039;&#039; when receiving a &amp;quot;n&amp;quot;/&amp;quot;add&amp;quot; Param, and &#039;&#039;&#039;removed&#039;&#039;&#039; when receiving a &amp;quot;y&amp;quot;/&amp;quot;rem&amp;quot; Param.&lt;br /&gt;
If &#039;&#039;&#039;&#039;&#039;UUID1&#039;&#039;&#039;&#039;&#039; is a collar and &#039;&#039;&#039;&#039;&#039;UUID2&#039;&#039;&#039;&#039;&#039; is a gag :&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;UUID1&#039;&#039;&#039;&#039;&#039; =&amp;gt; detach, tploc, tplm, tplure, sittp&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;UUID2&#039;&#039;&#039;&#039;&#039; =&amp;gt; detach, sendim, sendim:(keyholder)&lt;br /&gt;
&lt;br /&gt;
Those two rules mean that the user cannot send IMs except to their keyholder, and cannot TP at all. Those two items are not detachable. Now if the collar sends &amp;quot;@sendim=n&amp;quot;, the table becomes :&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;UUID1&#039;&#039;&#039;&#039;&#039; =&amp;gt; detach, tploc, tplm, tplure, sittp, sendim&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;&#039;&#039;UUID2&#039;&#039;&#039;&#039;&#039; =&amp;gt; detach, sendim, sendim:(keyholder)&lt;br /&gt;
&lt;br /&gt;
If it sends &amp;quot;@sendim=n&amp;quot; a second time nothing changes, as there is a check for its existence prior to adding it. If the gag is unlocked and detached, either it sends a &amp;quot;@clear&amp;quot; or the garbage collector kicks in so the rules linked to &#039;&#039;&#039;&#039;&#039;UUID2&#039;&#039;&#039;&#039;&#039; disappear. However, the avatar is still unable to send IMs even to their keyholder, as the exception has disappeared as well. This is because rules linked to one object don&#039;t conflict with rules linked to another one.&lt;br /&gt;
&lt;br /&gt;
* One-shot commands, on the other hand, are executed on-the-fly and are not stored.&lt;br /&gt;
&lt;br /&gt;
* When logging on, the avatar stays non-operational (cannot chat, cannot move) for some time, while the user sees the progress bar. However, worn scripted objects [[rez]] in the meantime and start sending rules and commands before the viewer can execute them. Therefore it stores them in a buffer and executes them only when the user is given controls (when the progress bar disappears).&lt;br /&gt;
&lt;br /&gt;
* The viewer periodically (every N seconds) checks all its rules and removes the ones linked to an [[UUID]] that does not exist around anymore (&amp;quot;garbage collector&amp;quot;). This means that rules issued by an &#039;&#039;&#039;unworn&#039;&#039;&#039; owned object will be discarded as soon as the avatar [[teleport|teleports]] elsewhere.&lt;br /&gt;
&lt;br /&gt;
[[Category:Third Party Client]]&lt;br /&gt;
[[Category:RestrainedLove]]&lt;/div&gt;</summary>
		<author><name>Inusaito Kanya</name></author>
	</entry>
</feed>