<?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=Batche+Manen</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=Batche+Manen"/>
	<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/wiki/Special:Contributions/Batche_Manen"/>
	<updated>2026-06-28T21:30:11Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.42.1</generator>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=PRIM_SIZE&amp;diff=1160420</id>
		<title>PRIM SIZE</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=PRIM_SIZE&amp;diff=1160420"/>
		<updated>2012-01-03T07:02:38Z</updated>

		<summary type="html">&lt;p&gt;Batche Manen: Update for 64m prim scale allowance&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;&amp;lt;onlyinclude&amp;gt;{{#if:&lt;br /&gt;
&lt;br /&gt;
{{#vardefine:size_const|{{LSL Const|PRIM_SIZE|integer|7|c=Used to {{GetSet|{{{1|}}}|get|set|/}} the prim&#039;s size}}}}&lt;br /&gt;
&lt;br /&gt;
{{#vardefine:p_size_desc|ranges from 0.01 to 64.0 for x, y and z}}&lt;br /&gt;
&lt;br /&gt;
}}&amp;lt;/onlyinclude&amp;gt;{{#if:&lt;br /&gt;
&lt;br /&gt;
}}{{LSL Constant&lt;br /&gt;
|name=PRIM_SIZE&lt;br /&gt;
|type=integer&lt;br /&gt;
|value=7&lt;br /&gt;
|desc=Returns or sets the prim&#039;s size. &lt;br /&gt;
|pa={{LSL Constant/List|i_front=[&amp;amp;#32;{{#var:size_const}},&amp;amp;#32;|i_end=&amp;amp;nbsp;]&lt;br /&gt;
|text=When used with [[llSetPrimitiveParams]] &amp;amp; [[llSetLinkPrimitiveParams]]&lt;br /&gt;
|i1_type=vector|i1_name=size&lt;br /&gt;
|toc=llSetPrimitiveParams&lt;br /&gt;
}}&lt;br /&gt;
|pb={{LSL Constant/List|i_front=[[llGetPrimitiveParams]]([&amp;amp;nbsp;{{#var:size_const}}|i_end=&amp;amp;nbsp;]);|&lt;br /&gt;
|r_front=Returns the list [&amp;amp;nbsp;|r_end=&amp;amp;nbsp;]&lt;br /&gt;
|text&lt;br /&gt;
|r1_type=vector|r1_name=size&lt;br /&gt;
|toc=llGetPrimitiveParams&lt;br /&gt;
}}&lt;br /&gt;
|examples=&lt;br /&gt;
&amp;lt;lsl&amp;gt;//Changing the prim size and rotation&lt;br /&gt;
default&lt;br /&gt;
{&lt;br /&gt;
  touch_start(integer total_number)&lt;br /&gt;
  {&lt;br /&gt;
    llSetPrimitiveParams([&lt;br /&gt;
        PRIM_SIZE, &amp;lt;0.25,0.5,1.0&amp;gt;,&lt;br /&gt;
        PRIM_ROTATION, &amp;lt;1.0, 0.0, 0.0, 0.0&amp;gt;&lt;br /&gt;
      ]);&lt;br /&gt;
  }&lt;br /&gt;
} &amp;lt;/lsl&amp;gt;&lt;br /&gt;
|constants=&lt;br /&gt;
|functions=&lt;br /&gt;
{{LSL DefineRow||[[llGetPrimitiveParams]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llSetPrimitiveParams]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llSetLinkPrimitiveParams]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llGetScale]]|}}&lt;br /&gt;
{{LSL DefineRow||[[llSetScale]]|}}&lt;br /&gt;
|events=&lt;br /&gt;
|location&lt;br /&gt;
|cat1=Prim&lt;br /&gt;
|cat2&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Batche Manen</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LlSetScale&amp;diff=1160419</id>
		<title>LlSetScale</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LlSetScale&amp;diff=1160419"/>
		<updated>2012-01-03T07:00:10Z</updated>

		<summary type="html">&lt;p&gt;Batche Manen: Update for 64m prim scale allowance&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Function&lt;br /&gt;
|func_id=47|func_sleep=0.0|func_energy=10.0&lt;br /&gt;
|func=llSetScale&lt;br /&gt;
|p1_type=vector|p1_name=size|p1_desc&lt;br /&gt;
|func_desc=Sets the size of the prim according to &#039;&#039;&#039;{{LSL Param|size}}&#039;&#039;&#039;&lt;br /&gt;
|func_footnote=The components of &#039;&#039;&#039;{{LSL Param|size}}&#039;&#039;&#039; (&#039;&#039;&#039;x&#039;&#039;&#039;, &#039;&#039;&#039;y&#039;&#039;&#039; &amp;amp; &#039;&#039;&#039;z&#039;&#039;&#039;) each need to be in the range {{Interval|center=component|gte=0.01|lte=64.0}}{{Footnote|handle=interval}}, if they are out of the range they are rounded to the nearest endpoint.&lt;br /&gt;
|spec&lt;br /&gt;
|caveats=&lt;br /&gt;
*This function only changes the size of the &#039;&#039;prim&#039;&#039; that the script is in. &#039;&#039;&#039;Not&#039;&#039;&#039; the entire object.&lt;br /&gt;
*If the prim is part of a link set, rescaling will fail if the new size is too large or small to satisfy the [[Linkability Rules|linkability rules]].&lt;br /&gt;
*Does not work on [[STATUS_PHYSICS|physical]] prims.&lt;br /&gt;
|constants&lt;br /&gt;
|examples=&lt;br /&gt;
&amp;lt;lsl&amp;gt;&lt;br /&gt;
//A basic door that opens and closes when an avatar collides with it.&lt;br /&gt;
//Not very effective, as it would be better to use llSetStatus(STATUS_PHANTOM, 1)...&lt;br /&gt;
//But, it works.&lt;br /&gt;
vector startingSize;&lt;br /&gt;
default {&lt;br /&gt;
     state_entry() {&lt;br /&gt;
          startingSize = llGetScale();&lt;br /&gt;
     }&lt;br /&gt;
     collision_start(integer i) {&lt;br /&gt;
          llSetScale(&amp;lt;0.1, 0.1, 0.1&amp;gt;); //Shrink&lt;br /&gt;
          llSetPos(llGetPos() + &amp;lt;0.0,0.0,10.0&amp;gt;); //Hide us&lt;br /&gt;
          llSetTimerEvent(3.0);&lt;br /&gt;
     }&lt;br /&gt;
     timer() {&lt;br /&gt;
          llSetTimerEvent(0.0);&lt;br /&gt;
          llSetScale(startingSize); //Go back to normal size&lt;br /&gt;
          llSetPos(llGetPos() - &amp;lt;0.0,0.0,10.0&amp;gt;); //And where we started&lt;br /&gt;
     }&lt;br /&gt;
} //Code by Xaviar Czervik.&lt;br /&gt;
&amp;lt;/lsl&amp;gt;&lt;br /&gt;
|helpers&lt;br /&gt;
|also_functions={{LSL DefineRow||[[llGetScale]]|Gets the prims size}}&lt;br /&gt;
{{LSL DefineRow||[[llSetPrimitiveParams]]|Sets prims attributes}}&lt;br /&gt;
{{LSL DefineRow||[[llGetPrimitiveParams]]|Gets prims attributes}}&lt;br /&gt;
|also_tests&lt;br /&gt;
|also_events&lt;br /&gt;
|also_articles&lt;br /&gt;
|notes&lt;br /&gt;
|cat1=Prim&lt;br /&gt;
|cat2&lt;br /&gt;
|cat3&lt;br /&gt;
|cat4&lt;br /&gt;
|}}&lt;/div&gt;</summary>
		<author><name>Batche Manen</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LSL_Protocol/Restrained_Love_Relay/Specification&amp;diff=1014512</id>
		<title>LSL Protocol/Restrained Love Relay/Specification</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=LSL_Protocol/Restrained_Love_Relay/Specification&amp;diff=1014512"/>
		<updated>2010-08-22T11:30:58Z</updated>

		<summary type="html">&lt;p&gt;Batche Manen: Removed leftover !vision or !visionclear from Messages from in-world object to Relay (Formal Requirements), actual explanation of them was removed 17th April &amp;#039;09&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{Restrained Love Relay Specs TOC}}&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;VERSION 1.100&#039;&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
Written and maintained by {{User|Marine Kelley}}.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Audience==&lt;br /&gt;
&lt;br /&gt;
This document is meant for people who want to create or modify &#039;&#039;&#039;in-world objects&#039;&#039;&#039; to use the features of someone else&#039;s [http://realrestraint.blogspot.com RestrainedLove viewer], typically &#039;&#039;&#039;cages&#039;&#039;&#039; and &#039;&#039;&#039;pieces of furniture&#039;&#039;&#039;, which per definition are usually not owned by that person.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Introduction==&lt;br /&gt;
&lt;br /&gt;
The [http://realrestraint.blogspot.com RestrainedLove viewer] only executes commands issued through [[llOwnerSay]] () messages. Therefore, in order to issue commands to someone using the viewer who does not own the object, that person must wear an attachment that &#039;&#039;&#039;relays&#039;&#039;&#039; commands after some &#039;&#039;&#039;security checks&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Why this spec ?==&lt;br /&gt;
&lt;br /&gt;
Many cages and furniture creators are interested in using its features such as sit, outfit, tp etc. These objects can be found in public places, or owned by friends... but as they are usually not owned by the user, the relay has to implement some basic security in order to avoid [[griefing]]. On top of it, the user does not want to be forced to switch to another relay when going to the next piece of furniture.&lt;br /&gt;
&lt;br /&gt;
This is the purpose of this specification: To lay common rules so all the relays implementing it are compatible with all the furnitures implementing it too. Without such a specification, one cage/furniture would talk to the relay specifically made to operate with it and that&#039;s all, eventually making the creator stay behind because people rather use standard objects than proprietary closed ones.&lt;br /&gt;
&lt;br /&gt;
==Basic principle==&lt;br /&gt;
&lt;br /&gt;
Here is a sample use case:&lt;br /&gt;
&lt;br /&gt;
# User is wearing a Relay&lt;br /&gt;
# User enters a cage in a public area&lt;br /&gt;
# Cage sends a chat message on a known private channel (for instance &amp;quot;@tploc=n&amp;quot;)&lt;br /&gt;
# Relay receives the message, decides to repeat the command to the user and blocks their ability to teleport from the map with an [[llOwnerSay]] (&amp;quot;@tploc=n&amp;quot;);&lt;br /&gt;
# User is allowed to get out after some time, the cage issues a &amp;quot;!release&amp;quot; command&lt;br /&gt;
&lt;br /&gt;
Without the relay, the cage could never prevent the user from teleporting since it doesn&#039;t belong to them.&lt;br /&gt;
&lt;br /&gt;
==Requirements==&lt;br /&gt;
&lt;br /&gt;
Here are the informal requirements for a relay (formal requirements below).&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Security===&lt;br /&gt;
Any object sending commands over the channel the relay listens to is likely to harm the user if there is no security implemented in the former. For instance, one could [[rez]] an object that sends a &amp;quot;@remoutfit=force&amp;quot; command over the chat channel to force an avatar to get naked in front of everyone without a warning. Of course nobody wants that, so basic security is needed.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===User-friendliness===&lt;br /&gt;
Security often implies control (access lists, switch, permissions...) so the user must be given some basic control over what kind of objects are allowed to issue commands.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Versatility===&lt;br /&gt;
Some users will prefer wearing a dedicated attachment that they can unwear any time they want, others will be required to have the relay locked on them so they cannot detach them, others will want the script only... It is important to keep those differences in mind when deciding about the permissions of the relay. However, it is the user&#039;s responsibility to choose the relay that suits their needs best.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Licensing===&lt;br /&gt;
According to the level of complexity and support of the relay, the creator is allowed to either provide it for free (open/close source) or to sell it, as long as it implements all the formal requirements.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
==Common questions==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===How hard is it to implement such a specification?===&lt;br /&gt;
That depends on what you do. Furniture/cage makers will find it very easy for it only comes down to sending commands over a chat channel and getting feedback. Relay makers will find it harder but then again, that depends on the level of security and user-friendliness they wish to offer. But make no mistake, the relay is what does almost all the job (along with the viewer), because there will be many more kinds of furnitures and cages than relays around.&lt;br /&gt;
&lt;br /&gt;
===Why do other people need to write such a relay?===&lt;br /&gt;
Couldn&#039;t you write it yourself and publish it?&lt;br /&gt;
&lt;br /&gt;
Of course I could, and there is even a working code for a basic relay at [[LSL Protocol/Restrained Love Relay/Reference Implementation|Reference Implementation]]. However:&lt;br /&gt;
* The protocol is likely to improve because nobody sees the future&lt;br /&gt;
* One object only would not suit everyone&#039;s needs&lt;br /&gt;
* It would have to implement perfect security and perfect user-friendliness, in all cases&lt;br /&gt;
* It would of course have to be perfectly scripted, without any bug whatsoever&lt;br /&gt;
&lt;br /&gt;
The security and user-friendliness are the key parts here. Some users will prefer to be safe from [[griefing]], others will prefer a good user interface, others will like a lot of features, others will want to move the script elsewhere... Everyone has their own tastes so there can be no one-size-fits-all relay.&lt;br /&gt;
&lt;br /&gt;
==Protocol==&lt;br /&gt;
&lt;br /&gt;
In-world objects send chat message over a channel (common to every relay and furniture), that the relay(s) acknowledges or not. If the message is a correct command and passes whatever security checks the relay implements, the latter repeats it as an [[llOwnerSay]] ().&lt;br /&gt;
&lt;br /&gt;
When the session ends, possibly after several relogs, the object clears all the restrictions it has put the user under.&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Example===&lt;br /&gt;
&lt;br /&gt;
Here is a basic example of messages exchanged between an avatar (id &amp;quot;9213...&amp;quot;) and a world object (id &amp;quot;7adf...&amp;quot;) :&lt;br /&gt;
&lt;br /&gt;
 Object : CmdTest,9213f69a-ed7d-4a70-907a-7dba88c8831a,@tploc=n&lt;br /&gt;
 Relay executes llOwnerSay (&amp;quot;@tploc=n&amp;quot;);&lt;br /&gt;
 Relay  : CmdTest,7adf6218-ab26-8566-8387-660133840794,@tploc=n,ok&lt;br /&gt;
&lt;br /&gt;
 Object : BunchoCommands,9213f69a-ed7d-4a70-907a-7dba88c8831a,@tploc=n|@tplm=n|@tplure=n|@remoutfit:shoes=force&lt;br /&gt;
 Relay executes llOwnerSay (&amp;quot;@tploc=n&amp;quot;);&lt;br /&gt;
 Relay executes llOwnerSay (&amp;quot;@tplm=n&amp;quot;);&lt;br /&gt;
 Relay executes llOwnerSay (&amp;quot;@tplure=n&amp;quot;);&lt;br /&gt;
 Relay  : BunchoCommands,7adf6218-ab26-8566-8387-660133840794,@tploc=n,ok&lt;br /&gt;
 Relay  : BunchoCommands,7adf6218-ab26-8566-8387-660133840794,@tplm=n,ok&lt;br /&gt;
 Relay  : BunchoCommands,7adf6218-ab26-8566-8387-660133840794,@tplure=n,ok&lt;br /&gt;
 Relay  : BunchoCommands,7adf6218-ab26-8566-8387-660133840794,@remoutfit:shoes=force,ok&lt;br /&gt;
&lt;br /&gt;
 After a relog :&lt;br /&gt;
 Relay  : ping,7adf6218-ab26-8566-8387-660133840794,ping,ping&lt;br /&gt;
 Object : ping,9213f69a-ed7d-4a70-907a-7dba88c8831a,!pong   (UUID found with llGetOwnerKey(id), where id is the sender-parameter of the listen-event)&lt;br /&gt;
&lt;br /&gt;
==Formal requirements==&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
===Common requirements to the Relay and the in-world object===&lt;br /&gt;
&lt;br /&gt;
* The chat channel used by both the Relay and the in-world object is &#039;&#039;&#039;-1812221819&#039;&#039;&#039;. That&#039;s &amp;quot;RLVRS&amp;quot; (&amp;quot;RestrainedLove Viewer Relay Script&amp;quot;) translated from alphabet to numbers.&lt;br /&gt;
&lt;br /&gt;
* Messages on the channel are described here in a pseudo [http://en.wikipedia.org/wiki/Backus-Naur_form Backus-Naur Form] :&lt;br /&gt;
&lt;br /&gt;
** &#039;&#039;&#039;&#039;&#039;Messages from in-world object to Relay (3 tokens) :&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
*** &#039;&#039;message&#039;&#039;            ::= &amp;amp;lt;cmd_name&amp;amp;gt;&#039;&#039;&#039;,&#039;&#039;&#039;&amp;amp;lt;user_uuid&amp;amp;gt;&#039;&#039;&#039;,&#039;&#039;&#039;&amp;amp;lt;list_of_commands&amp;amp;gt;&lt;br /&gt;
*** &#039;&#039;list_of_commands&#039;&#039;   ::= &amp;amp;lt;command&amp;amp;gt;[&#039;&#039;&#039;|&#039;&#039;&#039;&amp;amp;lt;list_of_commands&amp;amp;gt;]  (list_of_commands is *lowercase*)&lt;br /&gt;
*** &#039;&#039;command&#039;&#039;            ::= &amp;amp;lt;rl_command&amp;amp;gt; or &amp;amp;lt;metacommand&amp;gt;&lt;br /&gt;
*** &#039;&#039;rl_command&#039;&#039;         ::= &#039;&#039;&#039;@&#039;&#039;&#039;behav[&#039;&#039;&#039;:&#039;&#039;&#039;option][&#039;&#039;&#039;=&#039;&#039;&#039;param]&lt;br /&gt;
*** &#039;&#039;metacommand&#039;&#039;        ::= &#039;&#039;&#039;!version&#039;&#039;&#039; or &#039;&#039;&#039;!release&#039;&#039;&#039; or &#039;&#039;&#039;!pong&#039;&#039;&#039; or &#039;&#039;&#039;!implversion&#039;&#039;&#039; or &#039;&#039;&#039;!handover/&#039;&#039;&#039;&amp;amp;lt;handoverparameter&amp;amp;gt; or &#039;&#039;&#039;!who/&#039;&#039;&#039;&amp;amp;lt;whoparameter&amp;amp;gt;&lt;br /&gt;
&lt;br /&gt;
** &#039;&#039;&#039;&#039;&#039;Messages from Relay to in-world object (4 tokens) :&#039;&#039;&#039;&#039;&#039;&lt;br /&gt;
*** &#039;&#039;message&#039;&#039;            ::= &amp;amp;lt;cmd_name&amp;amp;gt;&#039;&#039;&#039;,&#039;&#039;&#039;&amp;amp;lt;object_uuid&amp;amp;gt;&#039;&#039;&#039;,&#039;&#039;&#039;&amp;amp;lt;command&amp;amp;gt;&#039;&#039;&#039;,&#039;&#039;&#039;&amp;amp;lt;reply&amp;amp;gt;    (cmd_name is equal to the one in the incoming message)&lt;br /&gt;
*** &#039;&#039;reply&#039;&#039;              ::= &#039;&#039;&#039;ok&#039;&#039;&#039; or &#039;&#039;&#039;ko&#039;&#039;&#039; or &#039;&#039;&#039;ping&#039;&#039;&#039; or &amp;amp;lt;protocol_version&amp;amp;gt; or &amp;amp;lt;implementation_version&amp;amp;gt;&lt;br /&gt;
*** &#039;&#039;protocol_version&#039;&#039;   ::= integer  (it is the version of the &#039;&#039;specification&#039;&#039;, not of the script)&lt;br /&gt;
&lt;br /&gt;
* The effect of the &amp;quot;!release&amp;quot; metacommand is to wipe out all the restrictions issued by the object which sends it.&lt;br /&gt;
* The effect of the &amp;quot;!version&amp;quot; metacommand is to send the version of the protocol the Relay implements. See below.&lt;br /&gt;
* The effect of the &amp;quot;ping&amp;quot; message from the Relay to the object is to check the latter is still available. If not, release the user to avoid having orphaned rules.&lt;br /&gt;
* Notice that acknowledgments do not apply to the list of commands but to one command only. Therefore a list of N commands gives N acknowledgment messages in return (at most).&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;In plain English :&#039;&#039;&#039;&lt;br /&gt;
* &amp;lt;cmd_name&amp;gt; is the name of the command, decided by the object. It will be used to find out which command has been acknowledged, therefore it must be repeated &#039;&#039;&#039;exactly&#039;&#039;&#039; by the Relay (without changing its case). An exception to the freedom of choice of the &amp;lt;cmd_name&amp;gt; token is the &amp;quot;ping&amp;quot; reserved name, see below.&lt;br /&gt;
* &amp;lt;user_uuid&amp;gt; is the [[UUID]] of the &#039;&#039;&#039;avatar&#039;&#039;&#039; owning the Relay.&lt;br /&gt;
* &amp;lt;object_uuid&amp;gt; is the [[UUID]] of the &#039;&#039;&#039;in-world object&#039;&#039;&#039;. Notice that we never need the [[UUID]] of the Relay as it&#039;s usually an attachment, prone to change its id after each relog.&lt;br /&gt;
* &amp;lt;list_of_commands&amp;gt; is a list of RL commands separated by pipes (&#039;|&#039;). It can be a single command (meaning no pipe present).&lt;br /&gt;
* &amp;lt;command&amp;gt; is either a regular RL command (@behav:option=param) or a metacommand, aimed at the Relay itself (!version, !release and !pong)&lt;br /&gt;
* Commands are separated by pipes (&#039;|&#039;) here, but if they must be sent in the same [[llOwnerSay]] to the viewer they must be separated by commas (&#039;,&#039;) and with only one &#039;&#039;&#039;&#039;@&#039;&#039;&#039;&#039; sign at the beginning of the whole message. This is on purpose, to force the Relay to parse them and check them one by one, as well as facilitate the parsing of the whole message coming from the in-world object.&lt;br /&gt;
* Everyone listening on the relay channel must have enough script memory available to handle a complete chat message which is limited to 1,000 character (2,000 bytes + processing).&lt;br /&gt;
&lt;br /&gt;
====&amp;quot;!release&amp;quot; metacommand====&lt;br /&gt;
* This metacommand is meant to make the Relay clear all the restrictions linked to the object issuing it. It is better to use it than to issue &amp;quot;counter-commands&amp;quot; to lift every restriction one by one without forgetting any.&lt;br /&gt;
* If the relay cancels an active session (for example because of a safeword being called), it has to send a !release,ok message.&lt;br /&gt;
&lt;br /&gt;
====&amp;quot;!version&amp;quot; metacommand====&lt;br /&gt;
* When receiving this metacommand, the Relay must send a special acknowledgment that contains the version of the &#039;&#039;protocol&#039;&#039; it implements, on &#039;&#039;&#039;4 digits&#039;&#039;&#039;. This number must be an integer, equal to the version of this specification, written just after the title on this very page, times 1000. For instance, &amp;quot;1.120&amp;quot; would translate to &amp;quot;1120&amp;quot;. It makes it easier to compare versions without fear of losing information with a float cast to a string and back to a float.&lt;br /&gt;
* Do not mistake the version of the &#039;&#039;protocol&#039;&#039; with the version (@version) of the &#039;&#039;viewer&#039;&#039; or the version of the &#039;&#039;scripts&#039;&#039; (!implversion).&lt;br /&gt;
&lt;br /&gt;
====&amp;quot;ping&amp;quot; relay message and &amp;quot;!pong&amp;quot; object metacommand====&lt;br /&gt;
* When logging on, the relay will reapply all the stored restrictions but it only makes sense if the in-world object is still around and available for use. It could have been reset, crashed, or used by someone else while the primary user was offline. To let the relay apply the restrictions would therefore make no sense. That&#039;s why the relay has to ask the object if it&#039;s still around and available, and if no appropriate answer is received in a timely fashion then it must lift all the restrictions issued by it before, in order to start fresh again. Notice that &amp;quot;ping&amp;quot; is a simple word (to stay consistent with &amp;quot;ok&amp;quot; and &amp;quot;ko&amp;quot;) while &amp;quot;!pong&amp;quot; is a metacommand.&lt;br /&gt;
&lt;br /&gt;
The relay message must be &amp;quot;ping,&amp;amp;lt;object_uuid&amp;amp;gt;,ping,ping&amp;quot; and the object message must be &amp;quot;ping,&amp;amp;lt;user_uuid&amp;amp;gt;,!pong&amp;quot;. This allows the object to keep a listener open with a static filter, to reduce lag. &amp;amp;lt;user_uuid&amp;amp;gt; can be retrieved by a [[llGetOwnerKey]]() call.&lt;br /&gt;
&lt;br /&gt;
===Other metacommands===&lt;br /&gt;
The following metacommands are deemed &amp;quot;optional&amp;quot; and relays do not have to implement them to be considered RLV compliant. They are mostly tied to the specific implementation of a particular relay that a particular furniture needs to interrogate. Furniture must not rely on the implementation of any of these commands to work.&lt;br /&gt;
&lt;br /&gt;
=====&amp;quot;!implversion&amp;quot; metacommand=====&lt;br /&gt;
* The relay &#039;&#039;implementation&#039;&#039; should identify itself with a string.&lt;br /&gt;
* The is just like !version with the exception that !implversion is not about the &#039;&#039;protocol&#039;&#039; but about the implementation of it and may contain a string&lt;br /&gt;
* This version string is not intended for automatic checks but to help debugging problems&lt;br /&gt;
* Think of this as the signature of that particular relay&lt;br /&gt;
* The string must not contain any &amp;quot;,&amp;quot; or &amp;quot;!&amp;quot; characters&lt;br /&gt;
&lt;br /&gt;
===Deprecated metacommands===&lt;br /&gt;
The following metacommands used to belong to the specification without much discussion and without permission. They are mentioned here for reference but never meant to be part of the specification. They might be reinstated one day if they prove themselves useful, but at the time of this writing it would make no sense to consider a relay to be out of spec if it didn&#039;t implement those metacommands.&lt;br /&gt;
&lt;br /&gt;
=====&amp;quot;!who&amp;quot; metacommand=====&lt;br /&gt;
* Syntax: !who/&amp;amp;lt;uuid&amp;amp;gt;&lt;br /&gt;
* This is an information message from the world telling the relay which avatar is controlling it.&lt;br /&gt;
* Traps that are automatically triggered by the victim should use the uuid of the victim instead of the person who has setup the trap, perhaps hours ago&lt;br /&gt;
* 00000000-0000-0000-0000-000000000000 (NULL_KEY) is valid, meaning an unkown avatar&lt;br /&gt;
* Note: The content of this message is obviously only as trustworthy as the world object is&lt;br /&gt;
&#039;&#039;Note from Marine : This metacommand may be designed to check the avatar operating the object to make griefing harder... but if this command is only as trustworthy as the object is, I don&#039;t see that as an improvement security-wise. Otherwise the idea has merit.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
=====&amp;quot;!handover&amp;quot; metacommand=====&lt;br /&gt;
* Syntax: !handover/&amp;amp;lt;key&amp;amp;gt;/&amp;amp;lt;type&amp;amp;gt;&lt;br /&gt;
* Allows one world object to tell the relay it should accept commands from another world object instead without asking for permissions again. (For example a kidnapper object may do a force tpto to another sim where an other world object is waiting for the victim.&lt;br /&gt;
** (key) is the id of the target object &lt;br /&gt;
** (type) : 0 lift all restrictions of the source object, 1 keep them, it is the responsibility of the target object to keep them in mind &lt;br /&gt;
* The relay must ignore further &amp;quot;/&amp;quot;-parameters for future extension of the command. &lt;br /&gt;
* The relay must ignore any following commands on the same chat line&lt;br /&gt;
* The source object should send !handover/(key)/(type)|!release, so that relays that don&#039;t support !handover will release the restrictions and the next object can start normally.&lt;br /&gt;
* The relay must ensure with the !ping meachnism that the target object is available.&lt;br /&gt;
* The target object, however, might not be able to see the ping: For example because of a slow intersim teleport. In this case the target object must send a !pong on arrival of the victim anyway. &lt;br /&gt;
&#039;&#039;Note from Marine : This metacommand is particularly interesting, and is likely to go to the Other Metacommands section in the future, or even in the main spec. It needs to be designed thoroughly first, though. I don&#039;t think it needs to be so complex, but it sure needs some checking.&#039;&#039;&lt;br /&gt;
&lt;br /&gt;
===Relay requirements===&lt;br /&gt;
* Send the exact @behav:option=param part in an [[llOwnerSay]] ()&lt;br /&gt;
* Retain a list of restrictions and their sources for when the user relogs.&lt;br /&gt;
* Force sit if unsit is prevented when relogging.&lt;br /&gt;
* When relogging, send a &amp;quot;ping&amp;quot; message (see above) to check the in-world object is still available. If no message after a few seconds (not necessarily a &amp;quot;!pong&amp;quot;, any message aimed at the relay can do), release the rules linked to this object.&lt;br /&gt;
* The user must have access to the version of the specification and the version of the implemenation (dialog, message, object name...) to check everything works correctly.&lt;br /&gt;
* The relay must silently ignore commands to remove non-existing restrictions without spamming the user with pointless &amp;quot;ask for permission dialogs&amp;quot;&lt;br /&gt;
* Relays must accept !release even if the world object is out of range.&lt;br /&gt;
* Relays must send a !release,ok if they cancel an active session (for example because of an safeword)&lt;br /&gt;
* Relays must ensure that it preserves the order of commands. For example: If a restriction is queued in the Ask-dialog, the lifting of the restriction must not be executed immediately unless the pending restriction in the ask-dialog-queue is removed, too.&lt;br /&gt;
&lt;br /&gt;
===In-world object requirements===&lt;br /&gt;
* If a world object sent any restrictions, it must end the session with !release even if the relay did not respond with &amp;quot;ok&amp;quot; unless all commands have been &amp;quot;ko&amp;quot;-ed. The relay may have delayed the execution to ask permission from the user who may confirm them after the session has already ended&lt;br /&gt;
* When receiving a &amp;quot;ping&amp;quot; message from a relay, reply with a &amp;quot;!pong&amp;quot; message (as described above) aimed at the avatar owning it, provided they are still restricted by the object.&lt;br /&gt;
* Never rely on an answer from the Relay, requests can be denied silently, the Relay can be unworn, the avatar can TP out or crash... =&amp;gt; use timeouts.&lt;br /&gt;
* Don&#039;t poll the [[dataserver]] for online status, the Relay takes care of the relog part.&lt;br /&gt;
* World objects should not spam the relay channel. For example: Querying every minute the relay version of every person near although nobody shows any signs to actually use the object.&lt;br /&gt;
&lt;br /&gt;
== History ==&lt;br /&gt;
&lt;br /&gt;
You can find the change history of this specification at [[LSL Protocol/Restrained Love Relay/Change History|Change History]],&lt;br /&gt;
&lt;br /&gt;
[[Category:RestrainedLove]]&lt;/div&gt;</summary>
		<author><name>Batche Manen</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LSL_Protocol/RestrainedLoveAPI&amp;diff=989812</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=989812"/>
		<updated>2010-07-29T14:30:31Z</updated>

		<summary type="html">&lt;p&gt;Batche Manen: Updated the example under @getstatus to actually be correct for RLV post- v1.16 when the return was changed to prepended itself with a /&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header|ml=*}}&lt;br /&gt;
=Restrained Love viewer v1.23 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 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;
&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 its version 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 its version 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 its version number 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 viewer. 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;
&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;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&#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;
&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;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;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 @redirchat also truncates emotes on channel 0. It&#039;s not clear if this is a bug or a missing note in the API. An additional @emote=add works around this side-effect. &#039;&#039;&#039;Addendum by {{User|Henri Beauchamp}}&#039;&#039;&#039;: as someone who worked together with Marine on the reference implementation, this is &#039;&#039;&#039;clearly&#039;&#039;&#039; a bug and plain unintended. It appeared during some code refactoring, but as always specified before in the API, @redirchat should *not* affect emotes at all. If you want to affect emotes as well, please use @rediremote. This bug was fixed in the [http://sldev.free.fr/ Cool VL Viewer].&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 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 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 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 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;
* &#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 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/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;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;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 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&#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&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&#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&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&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;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&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;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&#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&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;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 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;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;
&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. 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. 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;
* &#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;channel&amp;gt;&lt;br /&gt;
&#039;&#039;Implemented in v1.10, slightly tweaked in v1.16&#039;&#039;&lt;br /&gt;
Makes the viewer automatically answer the list of rules the avatar is currently under, only for the object containing the script issuing that 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;). 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;
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 applies to 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;
&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;channel&amp;gt;&lt;br /&gt;
&#039;&#039;Implemented in v1.15, slightly tweaked in v1.16&#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;). 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;
&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 : 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;
&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 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&#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;
&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 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 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;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;
&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 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;
&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;
&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;
&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;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&#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 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;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;
&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 5 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.&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;
* 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 [[teleports]] elsewhere.&lt;br /&gt;
&lt;br /&gt;
[[Category:Third Party Client]]&lt;br /&gt;
[[Category:RestrainedLove]]&lt;/div&gt;</summary>
		<author><name>Batche Manen</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=User:Batche_Manen&amp;diff=964592</id>
		<title>User:Batche Manen</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=User:Batche_Manen&amp;diff=964592"/>
		<updated>2010-07-12T11:53:12Z</updated>

		<summary type="html">&lt;p&gt;Batche Manen: :3&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;Om nom nom. :3&lt;/div&gt;</summary>
		<author><name>Batche Manen</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=LSL_Protocol/RestrainedLoveAPI&amp;diff=964582</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=964582"/>
		<updated>2010-07-12T11:52:13Z</updated>

		<summary type="html">&lt;p&gt;Batche Manen: Corrected the @recvim exception header claiming it added exceptions to the &amp;quot;chat message receiving prevention&amp;quot;&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{LSL Header|ml=*}}&lt;br /&gt;
=Restrained Love viewer v1.23 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 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;
&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 its version 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 its version 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 its version number 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 viewer. 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;
&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;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&#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;
&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;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;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 @redirchat also truncates emotes on channel 0. It&#039;s not clear if this is a bug or a missing note in the API. An additional @emote=add works around this side-effect. &#039;&#039;&#039;Addendum by {{User|Henri Beauchamp}}&#039;&#039;&#039;: as someone who worked together with Marine on the reference implementation, this is &#039;&#039;&#039;clearly&#039;&#039;&#039; a bug and plain unintended. It appeared during some code refactoring, but as always specified before in the API, @redirchat should *not* affect emotes at all. If you want to affect emotes as well, please use @rediremote. This bug was fixed in the [http://sldev.free.fr/ Cool VL Viewer].&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 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 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 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 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;
* &#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 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/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;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;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 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&#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&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&#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&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&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;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&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;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&#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&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;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 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;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;
&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. 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. 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;
* &#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;channel&amp;gt;&lt;br /&gt;
&#039;&#039;Implemented in v1.10, slightly tweaked in v1.16&#039;&#039;&lt;br /&gt;
Makes the viewer automatically answer the list of rules the avatar is currently under, only for the object containing the script issuing that 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;). 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;
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 applies to 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;
&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;channel&amp;gt;&lt;br /&gt;
&#039;&#039;Implemented in v1.15, slightly tweaked in v1.16&#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;). 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;
&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 : 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;
&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 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&#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;
&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 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 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;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;
&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 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;
&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;
&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;
&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;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&#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 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;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;
&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 5 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.&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;
* 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 [[teleports]] elsewhere.&lt;br /&gt;
&lt;br /&gt;
[[Category:Third Party Client]]&lt;br /&gt;
[[Category:RestrainedLove]]&lt;/div&gt;</summary>
		<author><name>Batche Manen</name></author>
	</entry>
	<entry>
		<id>https://wiki.secondlife.com/w/index.php?title=Template:LSL_Function/ParticleSystem&amp;diff=923762</id>
		<title>Template:LSL Function/ParticleSystem</title>
		<link rel="alternate" type="text/html" href="https://wiki.secondlife.com/w/index.php?title=Template:LSL_Function/ParticleSystem&amp;diff=923762"/>
		<updated>2010-05-22T23:27:38Z</updated>

		<summary type="html">&lt;p&gt;Batche Manen: Quick clarification PSYS_SRC_ACCEL works with negative values, constant&amp;#039;s comment is a bit misleading&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;{{#if:&lt;br /&gt;
&lt;br /&gt;
&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{#vardefine:self|*}}&lt;br /&gt;
{{#vardefine:moded|stp}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&amp;lt;includeonly&amp;gt;&lt;br /&gt;
{{#vardefine:header|{{#var:header}}{{LSLC|Effects}}{{LSLC|Light}}{{LSLC|Particles}}{{LSLC|Prim}}{{LSLC|Stop}}}}&lt;br /&gt;
&amp;lt;/includeonly&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{{LSL Function/color}}&lt;br /&gt;
{{LSL Function/alpha}}&lt;br /&gt;
&lt;br /&gt;
{{#vardefine:p_rules_desc|Particle system rules list in the format [ rule1, data1, rule2, data2 . . . rule&#039;&#039;&#039;n&#039;&#039;&#039;, data&#039;&#039;&#039;n&#039;&#039;&#039; ]}}&lt;br /&gt;
{{#vardefine:p_rules_hover|Particle system rules list in the format [ rule1, data1, rule2, data2 . . . rulen, datan ]}}&lt;br /&gt;
&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
===spec===&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;{{#if:&lt;br /&gt;
{{#vardefine:spec|&lt;br /&gt;
Defines a particle system that sets the state of the [[particle emitter]] within the [[primitive|prim]] which the [[script]] is contained. Any other scripts in the same prim which call this function will modify the state of the same particle emitter. As such, the particle system defined by this function is a [[primitive property|prim property]], just like its size, shape, color, et cetera.&lt;br /&gt;
Each prim has only &#039;&#039;&#039;one (1)&#039;&#039;&#039; particle emitter, located at its [[geometric center]], and aligned along the prim&#039;s [[Viewer coordinate frames#Local|local]] Z-axis, pointing in the positive Z direction.&lt;br /&gt;
&lt;br /&gt;
This is the only function which alters the state of the prim&#039;s particle emitter; thus, if you wish to change the emitter to a different state (i.e., emitting a different particle system entirely, or shut off the emitter completely), just call this same function with the parameters of the new particle system you wish to render instead. Specifying an empty list (i.e., &amp;lt;code&amp;gt;{{{1}}}&amp;lt;/code&amp;gt;; ) turns the emitter off.&lt;br /&gt;
&lt;br /&gt;
Particles are essentially 2D {{Wikipedia|Sprite_(computer_graphics)|sprites}} and are always rendered facing the viewer&#039;s camera.&lt;br /&gt;
&lt;br /&gt;
The  rule / data values are defined below.&lt;br /&gt;
{{#var:spec}}}}&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{#var:spec}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;{{#if:&lt;br /&gt;
&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
===caveats===&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;{{#if:&lt;br /&gt;
{{#vardefine:caveats|&lt;br /&gt;
# When using particle systems that have a non-zero emitter age (PSYS_SRC_MAX_AGE) setting, you may notice that the particle system may restart without any scripted trigger going off. This is due to a bug which causes the emitter to &amp;quot;reset&amp;quot; when any of the prim properties are updated or otherwise sent to the viewer. As a result, you may have to use a [[timer]] or a forced [[llSleep|sleep]] and then clear the particle system once the age has expired. Debbie Trilling has posted a work-around here: http://forums.secondlife.com/showpost.php?p=1996465&amp;amp;postcount=6&lt;br /&gt;
# The spin defined by PSYS_SRC_OMEGA is relative to the [[Viewer coordinate frames#Region|region]] coordinate system, NOT the prim&#039;s [[Viewer coordinate frames#Local|local]] coordinate system.&lt;br /&gt;
# When freshly created a prims emitter is set to ZERO_ROTATION within the prim. If whilst designing a particle display you use PSYS_SRC_OMEGA the emitter will be rotated. If then you change the PSYS_SRC_OMEGA vector the emitter will not be reset to ZERO_ROTATION but will remain rotated to whatever axis it was at when stopped or altered. This can result in particles being displayed quite differently in the corrupted prim than they would be using the same script in a fresh prim (with a fresh emitter).&lt;br /&gt;
# Particles moving towards a humanoid avatar, specified by PSYS_SRC_TARGET_KEY rule and setting the PSYS_PART_TARGET_POS_MASK flag, will end up at the geometric center of the avatar&#039;s bounding box which, unfortunately, make them appear to be striking the person in the groin area. If you want them to end up at another point on a target avatar, you instead have to place a target prim that is moved to the position where you wish them to end up, and use the key of that prim for the value of the PSYS_SRC_TARGET_KEY rule.&lt;br /&gt;
# The Second Life viewer uses optimizations in culling objects which are too small to see at certain distances. If your emitter is very small, and is culled due to distance, the particle system associated with it will not be rendered either.&lt;br /&gt;
{{#var:caveats}}}}&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{#var:caveats}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;{{#if:&lt;br /&gt;
&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
===notes===&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;{{#if:&lt;br /&gt;
{{#vardefine:notes|&lt;br /&gt;
* The default particle count for the client is normally set at 4096. That is the max particle count the client will render for ALL active particle systems within view range. Good particle system design is key to avoid &amp;quot;spamming&amp;quot; everyone with your particles, and starving out other people&#039;s particle systems. As such, if you are experiencing trouble getting your particle emitter to emit as many particles as you like, it may be the victim of particle starvation. Client/viewer lag (low frame rates) can also cause this issue, as particles are a rather low priority for rendering. The best solution for this is to move to a less laggy environment relatively free of other particle systems when designing and testing your own.&lt;br /&gt;
* Once particles are emitted, their direction of motion can only be affected by PSYS_SRC_ACCEL, the PSYS_PART_TARGET_POS_MASK flag, or the PSYS_PART_FOLLOW_SRC_MASK flag. As such, there is no good way to create the &amp;quot;swirling vortex&amp;quot; effect (like the one used in the viewer to indicate an object talking, begin derezzed, or when an avatar leaves the sim/grid). The effect can be created with a moving particle source (E.G. An orbiting script.)&lt;br /&gt;
{{#var:notes}}}}&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{#var:notes}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;{{#if:&lt;br /&gt;
&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
===helpers===&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;{{#if:&lt;br /&gt;
{{#vardefine:helpers|&lt;br /&gt;
&#039;&#039;&#039;Useful functions for storing/retrieving color and alpha values to/from integers:&#039;&#039;&#039;&amp;lt;br /&amp;gt;&lt;br /&gt;
&amp;lt;lsl&amp;gt;integer ColorAlphatoRGBA(vector color, float alpha) {&lt;br /&gt;
    return (((integer)(alpha   * 255.0) &amp;amp; 0xFF) &amp;lt;&amp;lt; 24) |&lt;br /&gt;
           (((integer)(color.x * 255.0) &amp;amp; 0xFF) &amp;lt;&amp;lt; 16) |&lt;br /&gt;
           (((integer)(color.y * 255.0) &amp;amp; 0xFF) &amp;lt;&amp;lt;  8) |&lt;br /&gt;
            ((integer)(color.z * 255.0) &amp;amp; 0xFF);&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
vector RGBAtoColor(integer rgba) {&lt;br /&gt;
    return &amp;lt; ((rgba &amp;gt;&amp;gt; 16) &amp;amp; 0xFF) / 255.0, ((rgba &amp;gt;&amp;gt; 8) &amp;amp; 0xFF) / 255.0, (rgba &amp;amp; 0xFF) / 255.0 &amp;gt;;&lt;br /&gt;
}&lt;br /&gt;
&lt;br /&gt;
float RGBAtoAlpha(integer rgba) {&lt;br /&gt;
    return ((rgba &amp;gt;&amp;gt; 24) &amp;amp; 0xFF) / 255.0;&lt;br /&gt;
}&amp;lt;/lsl&amp;gt;&lt;br /&gt;
{{#var:helpers}}}}&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{#var:helpers}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;{{#if:&lt;br /&gt;
&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
===constants_nb===&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;{{#if:&lt;br /&gt;
{{#vardefine:constants_nb|{{#var:constants_nb}}&lt;br /&gt;
{{{!}} {{prettytable|style=margin-top:0; margin-right:0;}}&lt;br /&gt;
{{!}}-{{Hl2}}&lt;br /&gt;
{{!!}} &lt;br /&gt;
{{!!}} Rule / Value Constant&lt;br /&gt;
{{!!}} Rule Parameter&lt;br /&gt;
{{!!}} Description&lt;br /&gt;
{{!!}} Value&lt;br /&gt;
{{!}}- style=&amp;quot;background-color:#ccffcc;&amp;quot;&lt;br /&gt;
{{!}} colspan=&amp;quot;5&amp;quot; align=&amp;quot;left&amp;quot;{{!}}&#039;&#039;&#039;System Behavior&#039;&#039;&#039;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}}colspan=&amp;quot;2&amp;quot;{{!}}PSYS_PART_FLAGS&lt;br /&gt;
{{!!}}[[integer]] {{LSL Param|flags}}&lt;br /&gt;
{{!!}}Various flags controlling the behavior of the particle system. The value may be specified as an integer in decimal or [[hexadecimal|hex]] format, or by ORing together (using the &amp;lt;nowiki&amp;gt;|&amp;lt;/nowiki&amp;gt; operator) one or more of the following flag constants:&lt;br /&gt;
{{!}}align=&amp;quot;center&amp;quot;{{!}}0&lt;br /&gt;
{{!}}- style=&amp;quot;background-color:#e0e0e0;&amp;quot;&lt;br /&gt;
{{!}}rowspan=&amp;quot;15&amp;quot; style=&amp;quot;background-color:#c0c0c0;&amp;quot; align=&amp;quot;center&amp;quot; valign=&amp;quot;center&amp;quot;{{!}}&#039;&#039;&#039;V&amp;lt;br /&amp;gt;a&amp;lt;br /&amp;gt;l&amp;lt;br /&amp;gt;u&amp;lt;br /&amp;gt;e&amp;lt;br /&amp;gt;s&#039;&#039;&#039;&lt;br /&gt;
{{!}}colspan=&amp;quot;2&amp;quot;{{!}}PSYS_PART_BOUNCE_MASK&lt;br /&gt;
{{!!}}When set, specifies particles will bounce off a plane at the [[Viewer coordinate frames#Region|region]] Z height of the emitter. On &amp;quot;bounce&amp;quot;, each particle reverses velocity and angle. This only works for particles above the plane falling down on it.&lt;br /&gt;
{{!}}align=&amp;quot;center&amp;quot;{{!}}{{LSL_Hex|0x004|4}}&lt;br /&gt;
{{!}}- style=&amp;quot;background-color:#e0e0e0;&amp;quot;&lt;br /&gt;
{{!}} colspan=&amp;quot;2&amp;quot;{{!}}PSYS_PART_EMISSIVE_MASK&lt;br /&gt;
{{!!}}When set, particles are full-bright and are unaffected by global lighting (sunlight). Otherwise, particles will be lit depending on the current global lighting conditions. Note that point lights &#039;&#039;&#039;do&#039;&#039;&#039; illuminate non-emissive particles.&lt;br /&gt;
{{!}}align=&amp;quot;center&amp;quot;{{!}}{{LSL_Hex|0x100|256}}&lt;br /&gt;
{{!}}- style=&amp;quot;background-color:#e0e0e0;&amp;quot;&lt;br /&gt;
{{!}} colspan=&amp;quot;2&amp;quot;{{!}}PSYS_PART_FOLLOW_SRC_MASK&lt;br /&gt;
{{!!}}When set, particles move relative to the position of the emitter. Otherwise, particle position and movement are unaffected by the position/movement of the emitter. This flag disables the PSYS_SRC_BURST_RADIUS rule.&lt;br /&gt;
{{!}}align=&amp;quot;center&amp;quot;{{!}}{{LSL_Hex|0x010|16}}&lt;br /&gt;
{{!}}- style=&amp;quot;background-color:#e0e0e0;&amp;quot;&lt;br /&gt;
{{!}} colspan=&amp;quot;2&amp;quot;{{!}}PSYS_PART_FOLLOW_VELOCITY_MASK&lt;br /&gt;
{{!!}}When set, particles rotate to orient their &amp;quot;top&amp;quot; towards the direction of movement or emission. Otherwise, particles are oriented vertically as their textures would appear (top of texture at top, left at left).&lt;br /&gt;
{{!}}align=&amp;quot;center&amp;quot;{{!}}{{LSL_Hex|0x020|32}}&lt;br /&gt;
{{!}}- style=&amp;quot;background-color:#e0e0e0;&amp;quot;&lt;br /&gt;
{{!}} colspan=&amp;quot;2&amp;quot;{{!}}PSYS_PART_INTERP_COLOR_MASK&lt;br /&gt;
{{!!}}When set, particle color and alpha transition from their START settings to their END settings during the particle&#039;s lifetime. The transition is a smooth interpolation.&lt;br /&gt;
{{!}}align=&amp;quot;center&amp;quot;{{!}}{{LSL_Hex|0x001|1}}&lt;br /&gt;
{{!}}- style=&amp;quot;background-color:#e0e0e0;&amp;quot;&lt;br /&gt;
{{!}} colspan=&amp;quot;2&amp;quot;{{!}}PSYS_PART_INTERP_SCALE_MASK&lt;br /&gt;
{{!!}}When set, particle size/scale transitions from its START setting to its END setting during the particle&#039;s lifetime.&lt;br /&gt;
{{!}}align=&amp;quot;center&amp;quot;{{!}}{{LSL_Hex|0x002|2}}&lt;br /&gt;
{{!}}- style=&amp;quot;background-color:#e0e0e0;&amp;quot;&lt;br /&gt;
{{!}} colspan=&amp;quot;2&amp;quot;{{!}}PSYS_PART_TARGET_LINEAR_MASK&lt;br /&gt;
{{!!}} When set, emitted particles move in a straight line towards the target specified by the PSYS_SRC_TARGET_KEY rule. In this mode, PSYS_SRC_ACCEL, PSYS_SRC_BURST_RADIUS, and possibly other rules are ignored.&lt;br /&gt;
{{!}}align=&amp;quot;center&amp;quot;{{!}}{{LSL_Hex|0x080|128}}&lt;br /&gt;
{{!}}- style=&amp;quot;background-color:#e0e0e0;&amp;quot;&lt;br /&gt;
{{!}} colspan=&amp;quot;2&amp;quot;{{!}}PSYS_PART_TARGET_POS_MASK&lt;br /&gt;
{{!!}}When set, emitted particles change course during their lifetime, attempting to move towards the target specified by the PSYS_SRC_TARGET_KEY rule by the time they expire. Note that if no target is specified, the target moves out of range, or an invalid target is specified, the particles target the prim itself.&lt;br /&gt;
{{!}}align=&amp;quot;center&amp;quot;{{!}}{{LSL_Hex|0x040|64}}&lt;br /&gt;
{{!}}- style=&amp;quot;background-color:#e0e0e0;&amp;quot;&lt;br /&gt;
{{!}} colspan=&amp;quot;2&amp;quot;{{!}}PSYS_PART_WIND_MASK&lt;br /&gt;
{{!!}}When set, particle movement is affected by the [[llWind|wind]]. It is applied as a secondary force on the particles.&lt;br /&gt;
{{!}}align=&amp;quot;center&amp;quot;{{!}}{{LSL_Hex|0x008|8}}&lt;br /&gt;
{{!}}-&lt;br /&gt;
&lt;br /&gt;
{{!}}- style=&amp;quot;background-color:#e0e0e0;&amp;quot;&lt;br /&gt;
{{!}} colspan=&amp;quot;2&amp;quot;{{!}}&amp;lt;s&amp;gt;PSYS_PART_BEAM_MASK&amp;lt;/s&amp;gt;&lt;br /&gt;
{{!!}}(&#039;&#039;unimplemented&#039;&#039;) mask but in the enum &lt;br /&gt;
{{!}}align=&amp;quot;center&amp;quot;{{!}}{{LSL_Hex|0x200|}}&lt;br /&gt;
{{!}}-&lt;br /&gt;
&lt;br /&gt;
{{!}}- style=&amp;quot;background-color:#e0e0e0;&amp;quot;&lt;br /&gt;
{{!}} colspan=&amp;quot;2&amp;quot;{{!}}&amp;lt;s&amp;gt;LL_PART_HUD&amp;lt;/s&amp;gt;&lt;br /&gt;
{{!!}}Used by the viewer to keep HUD and World particle sources separate.&lt;br /&gt;
{{!}}align=&amp;quot;center&amp;quot;{{!}}{{LSL_Hex|0x40000000|}}&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}}- style=&amp;quot;background-color:#e0e0e0;&amp;quot;&lt;br /&gt;
{{!}} colspan=&amp;quot;2&amp;quot;{{!}}&amp;lt;s&amp;gt;LL_PART_DEAD_MASK&amp;lt;/s&amp;gt;&lt;br /&gt;
{{!!}}Removes particles, not compatible with any other PSYS_PART_*_MASK&lt;br /&gt;
{{!}}align=&amp;quot;center&amp;quot;{{!}}{{LSL_Hex|0x80000000|}}&lt;br /&gt;
{{!}}-&lt;br /&gt;
&lt;br /&gt;
{{!}}- style=&amp;quot;background-color:#e0e0e0;&amp;quot;&lt;br /&gt;
{{!}} colspan=&amp;quot;2&amp;quot;{{!}}&amp;lt;s style=&amp;quot;color:darkred;&amp;quot;&amp;gt;LL_PART_RANDOM_ACCEL_MASK&amp;lt;/s&amp;gt;&lt;br /&gt;
{{!!}}(&#039;&#039;unimplemented &amp;amp; commented out&#039;&#039;) Presumed to be used to apply random acceleration to the particles.&lt;br /&gt;
{{!}}align=&amp;quot;center&amp;quot;{{!}} -&lt;br /&gt;
{{!}}-&lt;br /&gt;
&lt;br /&gt;
{{!}}- style=&amp;quot;background-color:#e0e0e0;&amp;quot;&lt;br /&gt;
{{!}} colspan=&amp;quot;2&amp;quot;{{!}}&amp;lt;s style=&amp;quot;color:darkred;&amp;quot;&amp;gt;LL_PART_RANDOM_VEL_MASK&amp;lt;/s&amp;gt;&lt;br /&gt;
{{!!}}(&#039;&#039;unimplemented &amp;amp; commented out&#039;&#039;) Presumed to be used to specify random velocity for the particles upon emission.&lt;br /&gt;
{{!}}align=&amp;quot;center&amp;quot;{{!}} -&lt;br /&gt;
{{!}}-&lt;br /&gt;
&lt;br /&gt;
{{!}}- style=&amp;quot;background-color:#e0e0e0;&amp;quot;&lt;br /&gt;
{{!}} colspan=&amp;quot;2&amp;quot;{{!}}&amp;lt;s style=&amp;quot;color:darkred;&amp;quot;&amp;gt;LL_PART_TRAIL_MASK&amp;lt;/s&amp;gt;&lt;br /&gt;
{{!!}}(&#039;&#039;unimplemented &amp;amp; commented out&#039;&#039;) Presumed to be used for implementing &amp;quot;trails&amp;quot; via emitting more particles at shorter bursts.&lt;br /&gt;
{{!}}align=&amp;quot;center&amp;quot;{{!}} -&lt;br /&gt;
{{!}}-&lt;br /&gt;
&lt;br /&gt;
{{!}}- style=&amp;quot;background-color:#ccffcc;&amp;quot;&lt;br /&gt;
{{!}} colspan=&amp;quot;5&amp;quot; align=&amp;quot;left&amp;quot;{{!}}&#039;&#039;&#039;System Presentation&#039;&#039;&#039;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} colspan=&amp;quot;2&amp;quot;{{!}}PSYS_SRC_PATTERN&lt;br /&gt;
{{!!}}[[integer]] {{LSL Param|pattern}}&lt;br /&gt;
{{!!}}Specifies the general emission pattern.&lt;br /&gt;
{{!}}align=&amp;quot;center&amp;quot;{{!}}9&lt;br /&gt;
{{!}}- style=&amp;quot;background-color:#e0e0e0;&amp;quot;&lt;br /&gt;
{{!}}rowspan=&amp;quot;5&amp;quot; style=&amp;quot;background-color:#c0c0c0;&amp;quot; align=&amp;quot;center&amp;quot; valign=&amp;quot;center&amp;quot;{{!}}&#039;&#039;&#039;V&amp;lt;br /&amp;gt;a&amp;lt;br /&amp;gt;l&amp;lt;br /&amp;gt;u&amp;lt;br /&amp;gt;e&amp;lt;br /&amp;gt;s&#039;&#039;&#039;&lt;br /&gt;
{{!}}colspan=&amp;quot;2&amp;quot;{{!}}PSYS_SRC_PATTERN_EXPLODE&lt;br /&gt;
{{!!}}Sprays particles outwards in a spherical area. The Initial velocity of each particle is determined by PSYS_SRC_BURST_SPEED_MIN and PSYS_SRC_BURST_SPEED_MAX.  The EXPLODE pattern ignores the ANGLE parameters.&lt;br /&gt;
{{!}}align=&amp;quot;center&amp;quot;{{!}}{{LSL_Hex|0x02|2}}&lt;br /&gt;
{{!}}- style=&amp;quot;background-color:#e0e0e0;&amp;quot;&lt;br /&gt;
{{!}}colspan=&amp;quot;2&amp;quot;{{!}}PSYS_SRC_PATTERN_ANGLE_CONE&lt;br /&gt;
{{!!}}Sprays particles outwards in a spherical, sub-spherical, conical or ring shaped area, as defined by the ANGLE parameters PSYS_SRC_ANGLE_BEGIN and PSYS_SRC_ANGLE_END.   The ANGLE_CONE pattern can be used to imitate the EXPLODE pattern by explicitly setting PSYS_SRC_ANGLE_BEGIN to 0.00000 and PSYS_SRC_ANGLE_END to 3.14159 (or PI) (or vice versa).&lt;br /&gt;
{{!}}align=&amp;quot;center&amp;quot;{{!}}{{LSL_Hex|0x08|8}}  &lt;br /&gt;
{{!}}- style=&amp;quot;background-color:#e0e0e0;&amp;quot;&lt;br /&gt;
{{!}} colspan=&amp;quot;2&amp;quot;{{!}}PSYS_SRC_PATTERN_ANGLE&lt;br /&gt;
{{!!}}Sprays particles outward in a flat circular, semi-circular, arc or ray shaped areas, as defined by PSYS_SRC_ANGLE_BEGIN and PSYS_SRC_ANGLE_END.  The circular pattern radiates outwards around the prim&#039;s local X axis line.  &lt;br /&gt;
{{!}}align=&amp;quot;center&amp;quot;{{!}}{{LSL_Hex|0x04|4}}&lt;br /&gt;
{{!}}- style=&amp;quot;background-color:#e0e0e0;&amp;quot;&lt;br /&gt;
{{!}}colspan=&amp;quot;2&amp;quot;{{!}}PSYS_SRC_PATTERN_DROP&lt;br /&gt;
{{!!}}Creates particles with no initial velocity.  The DROP pattern will overrides any values given for PSYS_SRC_BURST_RADIUS, PSYS_SRC_BURST_SPEED_MIN, and PSYS_SRC_BURST_SPEED_MAX, setting each to 0.00000.  (All patterns will behave like the DROP pattern, if RADIUS, SPEED_MIN and SPEED_MAX are explicitly set to 0.0000.)&lt;br /&gt;
{{!}}align=&amp;quot;center&amp;quot;{{!}}{{LSL_Hex|0x01|1}}&lt;br /&gt;
{{!}}- style=&amp;quot;background-color:#e0e0e0;&amp;quot;&lt;br /&gt;
{{!}}colspan=&amp;quot;2&amp;quot;{{!}}PSYS_SRC_PATTERN_ANGLE_CONE_EMPTY&lt;br /&gt;
{{!!}}(&#039;&#039;incomplete implementation&#039;&#039;) acts the same as the PSYS_SRC_PATTERN_DROP pattern, it is believed that the original intention for this pattern was to invert the effect of the ANGLE parameters, making them delineate an area where particles were NOT to be sprayed. (effectively the inverse or opposite of the behavior of the ANGLE_CONE pattern).&lt;br /&gt;
{{!}}align=&amp;quot;center&amp;quot;{{!}}{{LSL_Hex|0x10|16}}&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}}colspan=&amp;quot;2&amp;quot;{{!}}PSYS_SRC_BURST_RADIUS&lt;br /&gt;
{{!!}}[[float]] {{LSL Param|radius}}&lt;br /&gt;
{{!!}}Specifies the distance from the emitter where particles will be created. This rule is ignored when the PSYS_PART_FOLLOW_SRC_MASK flag is set. A test in http://forums-archive.secondlife.com/327/f5/226722/1.html indicates that the maximum value is 50.00&lt;br /&gt;
{{!}}align=&amp;quot;center&amp;quot;{{!}}16&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}}colspan=&amp;quot;2&amp;quot;{{!}}PSYS_SRC_ANGLE_BEGIN&lt;br /&gt;
{{!!}}[[float]] {{LSL Param|angle_begin}}&lt;br /&gt;
{{!!}}Specifies a half angle, in radians, of a circular or spherical &amp;quot;dimple&amp;quot; or conic section (starting from the emitter facing) within which particles will NOT be emitted. Valid values are the same as for PSYS_SRC_ANGLE_END, though the effects are reversed accordingly. If the pattern is PSYS_SRC_PATTERN_ANGLE, the presentation is a 2D flat circular section. If PSYS_SRC_PATTERN_ANGLE_CONE or PSYS_SRC_PATTERN_ANGLE_CONE_EMPTY is used, the presentation is a 3D spherical section. Note that the value of this parameter and PSYS_SRC_ANGLE_END are internally re-ordered such that this parameter gets the smaller of the two values.&lt;br /&gt;
{{!}}align=&amp;quot;center&amp;quot;{{!}}22&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}}colspan=&amp;quot;2&amp;quot;{{!}}PSYS_SRC_ANGLE_END&lt;br /&gt;
{{!!}}[[float]] {{LSL Param|angle_end}}&lt;br /&gt;
{{!!}}Specifies a half angle, in radians, of a circular or spherical &amp;quot;dimple&amp;quot; or conic section (starting from the emitter facing) within which particles will NOT be emitted. Valid values are 0.0, which will result in particles being emitted in a straight line in the direction of the emitter facing, to [[PI]], which will result in particles being emitted in a full circular or spherical arc around the emitter, not including the &amp;quot;dimple&amp;quot; or conic section defined by PSYS_SRC_ANGLE_BEGIN. If the pattern is PSYS_SRC_PATTERN_ANGLE, the presentation is a 2D flat circular section. If PSYS_SRC_PATTERN_ANGLE_CONE or PSYS_SRC_PATTERN_ANGLE_CONE_EMPTY is used, the presentation is a 3D spherical section. Note that the value of this parameter and PSYS_SRC_ANGLE_BEGIN are internally re-ordered such that this parameter gets the larger of the two values.&lt;br /&gt;
{{!}}align=&amp;quot;center&amp;quot;{{!}}23&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}}colspan=&amp;quot;2&amp;quot;{{!}}&amp;lt;del&amp;gt;PSYS_SRC_INNERANGLE&amp;lt;/del&amp;gt;&lt;br /&gt;
{{!!}}[[float]] {{LSL Param|angle_inner}}&lt;br /&gt;
{{!!}}&#039;&#039;&#039;DEPRECATED: Use PSYS_SRC_ANGLE_BEGIN instead.&#039;&#039;&#039; Works similar to its replacement rule, except the edge of the section is aligned with the emitter facing, rather than its center.&lt;br /&gt;
{{!}}align=&amp;quot;center&amp;quot;{{!}}10&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}}colspan=&amp;quot;2&amp;quot;{{!}}&amp;lt;del&amp;gt;PSYS_SRC_OUTERANGLE&amp;lt;/del&amp;gt;&lt;br /&gt;
{{!!}}[[float]] {{LSL Param|angle_outer}}&lt;br /&gt;
{{!!}}&#039;&#039;&#039;DEPRECATED: Use PSYS_SRC_ANGLE_END instead.&#039;&#039;&#039; Works similar to its replacement rule, except the edge of the section is aligned with the emitter facing, rather than the section&#039;s center.&lt;br /&gt;
{{!}}align=&amp;quot;center&amp;quot;{{!}}11&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}}colspan=&amp;quot;2&amp;quot;{{!}}PSYS_SRC_TARGET_KEY&lt;br /&gt;
{{!!}}[[key]] {{LSL Param|target}}&lt;br /&gt;
{{!!}}Specifies the key of a target object, prim, or agent towards which the particles will change course and move. They will attempt to end up at the geometric center of the target at the end of their lifetime. Requires the PSYS_PART_TARGET_POS_MASK flag be set. [[#Caveats|caveat 4]]&lt;br /&gt;
{{!}}align=&amp;quot;center&amp;quot;{{!}}20&lt;br /&gt;
{{!}}- style=&amp;quot;background-color:#ccffcc;&amp;quot;&lt;br /&gt;
{{!}}colspan=&amp;quot;5&amp;quot; align=&amp;quot;left&amp;quot;{{!}}&#039;&#039;&#039;Particle Appearance&#039;&#039;&#039;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}}colspan=&amp;quot;2&amp;quot;{{!}}PSYS_PART_START_COLOR&lt;br /&gt;
{{!!}}[[vector]] {{LSL Param|color_start}}&lt;br /&gt;
{{!!}}A vector specifying the [[color]] of the particles upon emission.&lt;br /&gt;
{{!}}align=&amp;quot;center&amp;quot;{{!}}1&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}}colspan=&amp;quot;2&amp;quot;{{!}}PSYS_PART_END_COLOR&lt;br /&gt;
{{!!}}[[vector]] {{LSL Param|color_end}}&lt;br /&gt;
{{!!}}A vector specifying the [[color]] the particles transition to during their lifetime. Only used if the PSYS_PART_INTERP_COLOR_MASK flag is set.&lt;br /&gt;
{{!}}align=&amp;quot;center&amp;quot;{{!}}3&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}}colspan=&amp;quot;2&amp;quot;{{!}}PSYS_PART_START_ALPHA&lt;br /&gt;
{{!!}}[[float]] {{LSL Param|alpha_start}}&lt;br /&gt;
{{!!}}Specifies the [[alpha]] of the particles upon emission. Valid values are in the range 0.0 to 1.0. Lower values are more transparent; higher ones are more opaque.&lt;br /&gt;
{{!}}align=&amp;quot;center&amp;quot;{{!}}2&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}}colspan=&amp;quot;2&amp;quot;{{!}}PSYS_PART_END_ALPHA&lt;br /&gt;
{{!!}}[[float]] {{LSL Param|alpha_end}}&lt;br /&gt;
{{!!}}Specifies the [[alpha]] the particles transition to during their lifetime. Only used if the PSYS_PART_INTERP_COLOR_MASK flag is set. Valid values are the same as PSYS_PART_START_ALPHA.&lt;br /&gt;
{{!}}align=&amp;quot;center&amp;quot;{{!}}4&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}}colspan=&amp;quot;2&amp;quot;{{!}}PSYS_PART_START_SCALE&lt;br /&gt;
{{!!}}[[vector]] {{LSL Param|scale_start}}&lt;br /&gt;
{{!!}}Specifies the [[scale]] or size of the particles upon emission. Valid values for each direction are 0.04 (0.03125) to 4.0, in meters. Since particles are essentially 2D sprites, the Z component of the vector is ignored and can be set to 0.0.&lt;br /&gt;
{{!}}align=&amp;quot;center&amp;quot;{{!}}5&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}}colspan=&amp;quot;2&amp;quot;{{!}}PSYS_PART_END_SCALE&lt;br /&gt;
{{!!}}[[vector]] {{LSL Param|scale_end}}&lt;br /&gt;
{{!!}}Specifies the [[scale]] or size the particles transition to during their lifetime. Only used if the PSYS_PART_INTERP_SCALE_MASK flag is set. Valid values are the same as PSYS_PART_START_SCALE.&lt;br /&gt;
{{!}}align=&amp;quot;center&amp;quot;{{!}}6&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}}colspan=&amp;quot;2&amp;quot;{{!}}PSYS_SRC_TEXTURE&lt;br /&gt;
{{!!}}[[string]] {{LSL Param|texture}}&lt;br /&gt;
{{!!}}Specifies the name of a texture in the emitter prim&#039;s inventory to use for each particle. Alternatively, you may specify an asset key [[UUID]] for a texture. If using [[llLinkParticleSystem]] and texture is not a UUID, texture must be in the emitter prim (not necessarily with the script).&lt;br /&gt;
{{!}}align=&amp;quot;center&amp;quot;{{!}}12&lt;br /&gt;
{{!}}- style=&amp;quot;background-color:#ccffcc;&amp;quot;&lt;br /&gt;
{{!}}colspan=&amp;quot;5&amp;quot; align=&amp;quot;left&amp;quot;{{!}}&#039;&#039;&#039;Particle Flow&#039;&#039;&#039;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}}colspan=&amp;quot;2&amp;quot;{{!}}PSYS_SRC_MAX_AGE&lt;br /&gt;
{{!!}}[[float]] {{LSL Param|duration_system}}&lt;br /&gt;
{{!!}}Specifies the length of time, in seconds, that the emitter will operate upon coming into view range (if the particle system is already set) or upon execution of this function (if already in view range). Upon expiration, no more particles will be emitted, except as specified above. Zero will give the particle system an infinite duration. ([[#Caveats|caveat 1]])&lt;br /&gt;
{{!}}align=&amp;quot;center&amp;quot;{{!}}19&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}}colspan=&amp;quot;2&amp;quot;{{!}}PSYS_PART_MAX_AGE&lt;br /&gt;
{{!!}}[[float]] {{LSL Param|duration_particle}}&lt;br /&gt;
{{!!}}Specifies the lifetime of each particle emitted, in seconds. Maximum is 30.0 seconds. During this time, the particle will appear, change appearance and move according to the parameters specified in the other sections, and then disappear.&lt;br /&gt;
{{!}}align=&amp;quot;center&amp;quot;{{!}}7&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}}colspan=&amp;quot;2&amp;quot;{{!}}PSYS_SRC_BURST_RATE&lt;br /&gt;
{{!!}}[[float]] {{LSL Param|burst_sleep}}&lt;br /&gt;
{{!!}}Specifies the time interval, in seconds, between &amp;quot;bursts&amp;quot; of particles being emitted. Specifying a value of 0.0 will cause the emission of particles as fast as the viewer can do so.&lt;br /&gt;
{{!}}align=&amp;quot;center&amp;quot;{{!}}13&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}}colspan=&amp;quot;2&amp;quot;{{!}}PSYS_SRC_BURST_PART_COUNT&lt;br /&gt;
{{!!}}[[integer]] {{LSL Param|burst_particle_count}}&lt;br /&gt;
{{!!}}Specifies the number of particles emitted in each &amp;quot;burst&amp;quot;.&lt;br /&gt;
{{!}}align=&amp;quot;center&amp;quot;{{!}}15&lt;br /&gt;
{{!}}- style=&amp;quot;background-color:#ccffcc;&amp;quot;&lt;br /&gt;
{{!}}colspan=&amp;quot;5&amp;quot; align=&amp;quot;left&amp;quot;{{!}}&#039;&#039;&#039;Particle Motion&#039;&#039;&#039;&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}}colspan=&amp;quot;2&amp;quot;{{!}}PSYS_SRC_ACCEL&lt;br /&gt;
{{!!}}[[vector]] {{LSL Param|acceleration}}&lt;br /&gt;
{{!!}}Specifies a directional acceleration vector applied to each particle as it is emitted, in meters per second. Valid values are 0.0 to 100.0 for each direction both positive and negative, as [[Viewer coordinate frames#Region|region]] coordinates.&lt;br /&gt;
{{!}}align=&amp;quot;center&amp;quot;{{!}}8&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}}colspan=&amp;quot;2&amp;quot;{{!}}PSYS_SRC_OMEGA&lt;br /&gt;
{{!!}}[[vector]] {{LSL Param|omega}}&lt;br /&gt;
{{!!}}Specifies the rotational spin of the emitter in radians per second along each axis. This &amp;quot;unsticks&amp;quot; the emitter facing from the prim&#039;s positive Z axis and is noticeable in directional presentations. Prim spin (via [[llTargetOmega]]) has no effect on emitter spin. ([[#Caveats|caveat 2]] and [[#Caveats|caveat 3]])&lt;br /&gt;
{{!}}align=&amp;quot;center&amp;quot;{{!}}21&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}}colspan=&amp;quot;2&amp;quot;{{!}}PSYS_SRC_BURST_SPEED_MIN&lt;br /&gt;
{{!!}}[[float]] {{LSL Param|speed_min}}&lt;br /&gt;
{{!!}}Specifies the minimum value of a random range of values which is selected for each particle in a burst as its initial speed upon emission, in meters per second. Note that the value of this parameter and PSYS_SRC_BURST_SPEED_MAX are internally re-ordered such that this parameter gets the smaller of the two values.&lt;br /&gt;
{{!}}align=&amp;quot;center&amp;quot;{{!}}17&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}}colspan=&amp;quot;2&amp;quot;{{!}}PSYS_SRC_BURST_SPEED_MAX&lt;br /&gt;
{{!!}}[[float]] {{LSL Param|speed_max}}&lt;br /&gt;
{{!!}}Specifies the maximum value of a random range of values which is selected for each particle in a burst as its initial speed upon emission, in meters per second. Note that the value of this parameter and PSYS_SRC_BURST_SPEED_MIN are internally re-ordered such that this parameter gets the larger of the two values.&lt;br /&gt;
{{!}}align=&amp;quot;center&amp;quot;{{!}}18&lt;br /&gt;
{{!}}-&lt;br /&gt;
{{!}} style=&amp;quot;font-size:80%&amp;quot; colspan=&amp;quot;5&amp;quot; {{!}} LL_PART_* constants are only found in {{SourceLink|indra/llmessage/llpartdata.h|rev=1681|line=99}}, those flags in &amp;lt;span style=&amp;quot;color:darkred;&amp;quot;&amp;gt;red&amp;lt;/span&amp;gt; have been commented out.&lt;br /&gt;
{{!}}} }}&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{#var:constants_nb}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;{{#if:&lt;br /&gt;
&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
&lt;br /&gt;
===deepnotes===&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;{{#if:&lt;br /&gt;
{{#vardefine:deepnotes|&lt;br /&gt;
===Missing 14===&lt;br /&gt;
There is a missing constant which would have the value 14, the underlying enumeration {{SourceLink|indra/llmessage/llpartdata.h|rev=1681|line=51|text=LLPSScriptFlags}} has that as {{SourceLink|indra/llmessage/llpartdata.h|rev=1681|line=70|text=LLPS_SRC_BURST_DURATION}}, the value is used nowhere else in the client source. This isn&#039;t surprising considering that the burst duration is dependent on the PSYS_SRC_BURST_PART_COUNT, PSYS_SRC_BURST_RATE.&lt;br /&gt;
{{#var:deepnotes}}}}&lt;br /&gt;
}}&amp;lt;noinclude&amp;gt;&lt;br /&gt;
{{#var:deepnotes}}&lt;br /&gt;
&amp;lt;/noinclude&amp;gt;{{#if:&lt;br /&gt;
&lt;br /&gt;
}}&lt;/div&gt;</summary>
		<author><name>Batche Manen</name></author>
	</entry>
</feed>