Difference between revisions of "User:Elena Bouscario/RLV"

From Second Life Wiki
Jump to navigation Jump to search
(update for 2.5 specs)
 
(40 intermediate revisions by the same user not shown)
Line 1: Line 1:
{{LSL Header}}
{{LSL Header}}


Official doc: [[LSL Protocol/RestrainedLoveAPI|here]]
Official Marine's doc: [[LSL Protocol/RestrainedLoveAPI|here]]


=version=
=Version=
* '''''Automated version checking''''' : "@version=<channel_number>"
* '''''Automated version checking''''' : "@version=<channel_number>"
''Implemented in v1.0b''
''Implemented in v1.0b''
Line 33: Line 33:
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's IM window, so it's totally stealthy.
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's IM window, so it's totally stealthy.


 
=Clear=
=clear=
* '''''Clear all the rules tied to an object''''' : "@clear"
* '''''Clear all the rules tied to an object''''' : "@clear"
''Implemented in v1.0a, but working only since v1.04a''
''Implemented in v1.0a, but working only since v1.04a''
Line 51: Line 50:
This command clears all the restrictions and exceptions tied to a particular [[UUID]] which name contains <string>. A good example would be "@clear=tp" which clears all the [[teleport]] restrictions and exceptions tied to that object, whereas "@clear=tplure:" would only clear the exceptions to the "teleport-by-friend" restriction
This command clears all the restrictions and exceptions tied to a particular [[UUID]] which name contains <string>. A good example would be "@clear=tp" which clears all the [[teleport]] restrictions and exceptions tied to that object, whereas "@clear=tplure:" would only clear the exceptions to the "teleport-by-friend" restriction


 
=Utilities=
=misc=
* '''''Get the list of restrictions the avatar is currently submitted to''''' : @getstatus[:<part_of_rule>]=<channel>
* '''''Get the list of restrictions the avatar is currently submitted to''''' : @getstatus[:<part_of_rule>]=<channel>
''Implemented in v1.10, slightly tweaked in v1.16''
''Implemented in v1.10, slightly tweaked in v1.16''
Line 77: Line 75:




* '''''Change the height of the avatar''''' : @adjustheight:<distance_pelvis_to_foot_in_meters>;<factor>[;delta_in_meters]=force
* '''''Change the height of the avatar''''' : @adjustheight:<pelvis_to_foot>;<factor>[;delta]=force
''Implemented in v2.5''
''Implemented in v2.5''
Forces the avatar to modify its "Z-offset", in other words its altitude. This value can already be changed through a debug setting in most third party viewers, this command allows to automate the change according to the animation.
Forces the avatar to modify its "Z-offset", in other words its altitude. This value can already be changed through a debug setting in most third party viewers, this command allows to automate the change according to the animation.


Rather than explaining it in full here, please go to this link for further info : [http://sldev.free.fr/forum/viewtopic.php?f=7&p=1847#p1847]
With:
** pelvis_to_foot: the pelvis to foot length (in meters) for which the animation is properly leveled with the floor.
** scalar: the multiplicator to apply to the difference between the said reference length and the current pelvis to foot length to obtain the proper avatar height adjustment offset and keep the animation leveled with the floor.
** delta: an optional additional offset (in meter, default is 0.0). It's normally unneeded, but could prove useful in some cases such as with prim-based avatars, or avatars with extremely thick or thin limbs (the thickness of the legs, for example, is not taken into account and a kneeling animation could then look badly leveled with some avatars while it's just the result of too thin (resulting in a slightly "floating" Av animation) or too thick (resulting in a slightly "sinking" Av animation) legs when compared with the reference shape that was used to find out the ref_pelvis_to_foot_length_in_meters)


The calculation done internally by @adjustheight is then:
height_adjustment = (given pelvis_to_foot - current pelvis_to_foot) * scalar + delta
and this "height_adjustment" value is added to the actual avatar height when the latter is passed to the sim server, resulting in a modification of the avatar level relatively to the floor.


* '''''Force the agent to change the active group''''' : @setgroup:<group_name>=force
Further info @ [http://sldev.free.fr/forum/viewtopic.php?f=7&t=447]
''Implemented in v2.5''
Forces the agent to change the active group, to the specified one. Of course, they must already be a member of this group. If <group_name> is "none", then the agent will deactivate the current group and not show any group tag at all.


* '''''Allow/prevent activating a group''''' : @setgroup=<y/n>
''Implemented in v2.5''
When prevented, the user is unable to change the active group.
* '''''Get the name of the active group''''' : @getgroup=<channel_number>
''Implemented in v2.5''
Makes the viewer automatically answer the name of the currently active group, immediately on the chat channel number <channel_number> that the script can listen to. Always use a positive integer. Remember that regular viewers do not answer anything at all so remove the listener after a timeout. The answer will simply be "none" if no group is active at the time. Please note that there is no way to obtain the UUID of the group, only the name.




Line 110: Line 103:
Where <folder> is the full path of the folder or item given. For example, #RLV/~MyCuffs. There is a space before "inv_offer", which is a token chosen in a way that it is easy to set a notification for it. If you just want to know whether your folder named #RLV/~MyCuffs has been accepted in the #RLV folder, issue a "@notify:2222;accepted_in_rlv inv_offer #RLV/~MyCuffs=add" command. If you just want to know whether the avatar has received something, issue a simple "@notify:2222;inv_offer=add" command.
Where <folder> is the full path of the folder or item given. For example, #RLV/~MyCuffs. There is a space before "inv_offer", which is a token chosen in a way that it is easy to set a notification for it. If you just want to know whether your folder named #RLV/~MyCuffs has been accepted in the #RLV folder, issue a "@notify:2222;accepted_in_rlv inv_offer #RLV/~MyCuffs=add" command. If you just want to know whether the avatar has received something, issue a simple "@notify:2222;inv_offer=add" command.


=perm=
=Perm=
* '''''Allow/deny the "Wear" contextual menu''''' : "@defaultwear=<y/n>
* '''''Allow/deny the "Wear" contextual menu''''' : "@defaultwear=<y/n>
''Implemented in v1.21''
''Implemented in v1.21''
Line 134: Line 127:
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'T USE IT !
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'T USE IT !


 
=Attachment=
=attachment=
* '''''Render an object detachable/nondetachable''''' : "@detach=<y/n>"
* '''''Render an object detachable/nondetachable''''' : "@detach=<y/n>"
''Implemented in v1.0a''
''Implemented in v1.0a''
Line 189: Line 181:
''Note'' : The first character ("none") is always '0', so the index of each attach point in the string is '''exactly equal''' to the corresponding ATTACH_* macro in LSL. For instance, the index 9 in the string is ATTACH_BACK (which means "spine"). Remember the indices start at zero.
''Note'' : The first character ("none") is always '0', so the index of each attach point in the string is '''exactly equal''' to the corresponding ATTACH_* macro in LSL. For instance, the index 9 in the string is ATTACH_BACK (which means "spine"). Remember the indices start at zero.


=outfit=
=Outfit=
* '''''Allow/prevent wearing clothes''''' : @addoutfit[:<part>]=<y/n>
The outfit parts are the following:
''Implemented in v1.10, added skin hair and eyes in v1.10.1''
  gloves,jacket,pants,shirt,shoes,skirt,socks,underpants,undershirt,skin,eyes,hair,shape,alpha,tattoo,physics
Where part is :
  gloves|jacket|pants|shirt|shoes|skirt|socks|underpants|undershirt|skin|eyes|hair|shape|alpha|tattoo
If part is not specified, prevents from wearing anything beyond what the avatar is already wearing.


'''Note:''' 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.
* '''''Get the list of worn clothes''''' : @getoutfit[:part]=<channel_number>
''Implemented in v1.10, added skin hair and eyes in v1.10.1, added physics in 2.6.1''


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 <channel_number> that the script can listen to.


* '''''Allow/prevent removing clothes''''' : @remoutfit[:<part>]=<y/n> (underpants and undershirt are kept for teens)
The list of 0s and 1s corresponds to the different parts here above in that order.
''Implemented in v1.10, added skin hair and eyes in v1.10.1''
Where part is :
gloves|jacket|pants|shirt|shoes|skirt|socks|underpants|undershirt|skin|eyes|hair|shape|alpha|tattoo
If part is not specified, prevents from removing anything in what the avatar is wearing.


'''Note:''' 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.
If a part is specified, answers a single 0 (empty) or 1 (occupied) corresponding to the part.
Ex 1 : @getoutfit=2222 => "0011000111" => avatar is wearing pants, shirt, underpants and undershirt, and of course a skin.
Ex 2 : @getoutfit:socks=2222 => "0" => the avatar is not wearing socks.




* '''''Force removing clothes''''' : @remoutfit[:<part>]=force (*) (teens can't be forced to remove underpants and undershirt)
* '''''Allow/prevent wearing clothes''''' : @addoutfit[:<part>]=<y/n>
''Implemented in v1.10''
''Implemented in v1.10, added skin hair and eyes in v1.10.1, added physics in 2.6.1''
Where part is :
gloves|jacket|pants|shirt|shoes|skirt|socks|underpants|undershirt|alpha|tattoo
If part is not specified, removes everything.


'''Note:''' 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.
Where ''part'' is one in the list here above.
If part is not specified, prevents from wearing anything beyond what the avatar is already wearing.


'''Note:''' skin, shape, eyes and hair cannot be removed since they are body parts (and removing any would result in an unrezzed avatar).


* '''''Allow/prevent removing clothes''''' : @remoutfit[:<part>]=<y/n> (underpants and undershirt are kept for teens)
''Implemented in v1.10, added skin hair and eyes in v1.10.1, added physics in 2.6.1''


* '''''Get the list of worn clothes''''' : @getoutfit[:part]=<channel_number>
Where ''part'' is one in the list here above.
''Implemented in v1.10, added skin hair and eyes in v1.10.1''
If part is not specified, prevents from removing anything in what the avatar is wearing.
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 <channel_number> 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 list of 0s and 1s corresponds to :
gloves,jacket,pants,shirt,shoes,skirt,socks,underpants,undershirt,skin,eyes,hair,shape
in that order.


If a part is specified, answers a single 0 (empty) or 1 (occupied) corresponding to the part.
* '''''Force removing clothes''''' : @remoutfit[:<part>]=force (*) (teens can't be forced to remove underpants and undershirt)
Ex 1 : @getoutfit=2222 => "0011000111" => avatar is wearing pants, shirt, underpants and undershirt, and of course a skin.
''Implemented in v1.10''
Ex 2 : @getoutfit:socks=2222 => "0" => the avatar is not wearing socks.


'''Note:''' For viewers that implement the new Viewer 2.0 features, the list is:
Where ''part'' is one in the list here above.
If part is not specified, removes everything.


gloves,jacket,pants,shirt,shoes,skirt,socks,underpants,undershirt,skin,eyes,hair,shape,alpha,tattoo
'''Note:''' skin, shape, eyes and hair cannot be removed since they are body parts (and removing any would result in an unrezzed avatar).


 
=Inventory=
=inventory=
==get & find==
* '''''Get the list of shared folders in the avatar's inventory''''' : @getinv[:folder1/.../folderN]=<channel_number>
* '''''Get the list of shared folders in the avatar's inventory''''' : @getinv[:folder1/.../folderN]=<channel_number>
''Implemented in v1.11, added sub-folders in v1.13''
''Implemented in v1.11, added sub-folders in v1.13''
Line 272: Line 256:




* '''''Get the path to the shared folder containing a particular object/clothing worn on a point''''' : @getpath[:<attachpt> or <clothing_layer>]=<channel_number>
''Implemented in v1.16''
Makes the viewer automatically answer the path to the shared folder containing the item that :
** issues this command if no option is set
** is attached on the attach point provided in the option field, ex : @getpath:spine=2222 => "Restraints/Collar"
** is worn on the clothing layer provided in the option field, ex : @getpath:pants=2222 => "Casual/Jeans/Tight"
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 "."). The answer is a list of folders, separated by slashes ('/').
Please note : As version 1.40.4 is now live on the main grid, wearing several objects on the same attachment point is now possible. Therefore this command does not make much sense anymore since it can only respond with one folder, while the several objects could belong to several folders. Therefore it is better to use @getpathnew, since @getpath will slowly become deprecated as more and more users switch to 2.1 and beyond.
* '''''Get the all paths to the shared folders containing the objects/clothing worn on a point''''' : @getpathnew[:<attachpt> or <clothing_layer>]=<channel_number>
''Implemented in v2.1 and v1.24''
Makes the viewer automatically answer the paths to the shared folders containing the item(s) that :
** issues this command if no option is set
** are attached on the attach point provided in the option field, ex : @getpathnew:spine=2222 => "Restraints/Collar,Jewelry/Cute necklace"
** is worn on the clothing layer provided in the option field, ex : @getpathnew:pants=2222 => "Casual/Jeans/Tight"
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 "."). The answer is a list of folders, separated by slashes ('/'), if several paths must be returned because several outfits are concerned, they are organized in a list of strings separated by commas (',').
This command has been added to replace @getpath, since in 2.1 several objects can be worn on the same attachment point.
==force attach & detach==
===base===
* '''''Force attach items contained inside a shared folder''''' : @attach:<folder1/.../folderN>=force (*)
* '''''Force attach items contained inside a shared folder''''' : @attach:<folder1/.../folderN>=force (*)
''Implemented in v1.11, added no-mod items in v1.12, added sub-folders in v1.13''
''Implemented in v1.11, added no-mod items in v1.12, added sub-folders in v1.13''
Line 296: Line 304:




* '''''Force detach items contained inside a shared folder''''' : @detach:<folder_name>=force (*)
''Implemented in v1.11''
Forces the viewer to detach every object and unwear every piece of clothing contained inside <folder_name>(which must be directly under "#RLV"). If "@detach" 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.
===all===
* '''''Force attach items contained inside a shared folder, and its children recursively''''' : @attachall:<folder1/.../folderN>=force (*)
* '''''Force attach items contained inside a shared folder, and its children recursively''''' : @attachall:<folder1/.../folderN>=force (*)
''Implemented in v1.15''
''Implemented in v1.15''
Line 309: Line 322:
''Implemented in v2.5''
''Implemented in v2.5''
This command works exactly like @attachall described hereabove, it is a synonym.
This command works exactly like @attachall described hereabove, it is a synonym.
* '''''Force detach items contained inside a shared folder''''' : @detach:<folder_name>=force (*)
''Implemented in v1.11''
Forces the viewer to detach every object and unwear every piece of clothing contained inside <folder_name>(which must be directly under "#RLV"). If "@detach" 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.




Line 321: Line 329:




* '''''Get the path to the shared folder containing a particular object/clothing worn on a point''''' : @getpath[:<attachpt> or <clothing_layer>]=<channel_number>
===this===
''Implemented in v1.16''
Makes the viewer automatically answer the path to the shared folder containing the item that :
** issues this command if no option is set
** is attached on the attach point provided in the option field, ex : @getpath:spine=2222 => "Restraints/Collar"
** is worn on the clothing layer provided in the option field, ex : @getpath:pants=2222 => "Casual/Jeans/Tight"
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 "."). The answer is a list of folders, separated by slashes ('/').
 
Please note : As version 1.40.4 is now live on the main grid, wearing several objects on the same attachment point is now possible. Therefore this command does not make much sense anymore since it can only respond with one folder, while the several objects could belong to several folders. Therefore it is better to use @getpathnew, since @getpath will slowly become deprecated as more and more users switch to 2.1 and beyond.
 
 
* '''''Get the all paths to the shared folders containing the objects/clothing worn on a point''''' : @getpathnew[:<attachpt> or <clothing_layer>]=<channel_number>
''Implemented in v2.1 and v1.24''
Makes the viewer automatically answer the paths to the shared folders containing the item(s) that :
** issues this command if no option is set
** are attached on the attach point provided in the option field, ex : @getpathnew:spine=2222 => "Restraints/Collar,Jewelry/Cute necklace"
** is worn on the clothing layer provided in the option field, ex : @getpathnew:pants=2222 => "Casual/Jeans/Tight"
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 "."). The answer is a list of folders, separated by slashes ('/'), if several paths must be returned because several outfits are concerned, they are organized in a list of strings separated by commas (',').
 
This command has been added to replace @getpath, since in 2.1 several objects can be worn on the same attachment point.
 
 
* '''''Force attach items contained into a shared folder that contains a particular object/clothing''''' : @attachthis[:<attachpt> or <clothing_layer>]=force (*)
* '''''Force attach items contained into a shared folder that contains a particular object/clothing''''' : @attachthis[:<attachpt> or <clothing_layer>]=force (*)
''Implemented in v1.16''
''Implemented in v1.16''
Line 358: Line 345:




* '''''Force detach items contained into a shared folder that contains a particular object/clothing''''' : @detachthis[:<attachpt> or <clothing_layer>]=force (*)
''Implemented in v1.16''
This command is a shortcut for a @getpath followed with a @detach command (this saves a listener and a timeout).
===allthis===
* '''''Force attach items contained into a shared folder that contains a particular object/clothing, and its children folders''''' : @attachallthis[:<attachpt> or <clothing_layer>]=force (*)
* '''''Force attach items contained into a shared folder that contains a particular object/clothing, and its children folders''''' : @attachallthis[:<attachpt> or <clothing_layer>]=force (*)
''Implemented in v1.16''
''Implemented in v1.16''
Line 371: Line 364:
''Implemented in v2.5''
''Implemented in v2.5''
This command works exactly like @attachallthis described hereabove, it is a synonym.
This command works exactly like @attachallthis described hereabove, it is a synonym.
* '''''Force detach items contained into a shared folder that contains a particular object/clothing''''' : @detachthis[:<attachpt> or <clothing_layer>]=force (*)
''Implemented in v1.16''
This command is a shortcut for a @getpath followed with a @detach command (this saves a listener and a timeout).




Line 383: Line 371:




===me===
* '''''Force detach an item''''' : @detachme=force (*)
* '''''Force detach an item''''' : @detachme=force (*)
''Implemented in v1.16.2''
''Implemented in v1.16.2''
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.
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.


 
==lock attach & detach==
* '''''Allow/prevent removing some folders''''' : @detachthis[:<layer>|<attachpt>|<path_to_folder>]=<y/n>
===this===
* '''''Allow/prevent wearing some folders''''' : @attachthis:<layer>|<attachpt>|<path_to_folder>=<y/n>
''Implemented in v2.3 and v1.25''
''Implemented in v2.3 and v1.25''
When prevented, the user is unable to remove a folder if either of these conditions is filled :
When prevented, the user is unable to attach a folder if either of these conditions is filled :
- no option is specified and the folder contains the object that issues this restriction
- the "layer" option is set (shirt, pants...) and the folder contains a piece of clothing that is meant to be worn on this layer
- the "layer" option is set (shirt, pants...) and the folder contains a piece of clothing that is worn on this layer
- the "attachpt" option is set (l forearm, spine...) and the folder contains an attachment that is meant to be worn on this point
- the "attachpt" option is set (l forearm, spine...) and the folder contains an attachment that is worn on this point
- the "path_to_folder" option is set and the folder corresponds to this location
- the "path_to_folder" option is set and the folder corresponds to this location


Line 399: Line 388:




* '''''Allow/prevent removing some folders and their children''''' : @detachallthis[:<layer>|<attachpt>|<path_to_folder>]=<y/n>
* '''''Remove/add exceptions to the attachallthis restriction, for one folder only''''' : "@attachthis_except:<folder>=<rem/add>"
''Implemented in v2.3 and v1.25''
''Implemented in v2.5''
These commands do exactly like @detachthis, but also apply to their children folders recursively.
When adding an exception, the user can wear the items contained into the indicated folder.




* '''''Allow/prevent wearing some folders''''' : @attachthis:<layer>|<attachpt>|<path_to_folder>=<y/n>
* '''''Allow/prevent removing some folders''''' : @detachthis[:<layer>|<attachpt>|<path_to_folder>]=<y/n>
''Implemented in v2.3 and v1.25''
''Implemented in v2.3 and v1.25''
When prevented, the user is unable to attach a folder if either of these conditions is filled :
When prevented, the user is unable to remove a folder if either of these conditions is filled :
- the "layer" option is set (shirt, pants...) and the folder contains a piece of clothing that is meant to be worn on this layer
- no option is specified and the folder contains the object that issues this restriction
- the "attachpt" option is set (l forearm, spine...) and the folder contains an attachment that is meant to be worn on this point
- the "layer" option is set (shirt, pants...) and the folder contains a piece of clothing that is worn on this layer
- the "attachpt" option is set (l forearm, spine...) and the folder contains an attachment that is worn on this point
- the "path_to_folder" option is set and the folder corresponds to this location
- the "path_to_folder" option is set and the folder corresponds to this location


Moreso, this folder or these folders cannot be renamed, moved, deleted or modified.
Moreso, this folder or these folders cannot be renamed, moved, deleted or modified.
* '''''Allow/prevent wearing some folders and their children''''' : @attachallthis[:<layer>|<attachpt>|<path_to_folder>]=<y/n>
''Implemented in v2.3 and v1.25''
These commands do exactly like @attachthis, but also apply to their children folders recursively.




Line 424: Line 409:




* '''''Remove/add exceptions to the detachallthis restriction, for one folder and its children''''' : "@detachallthis_except:<folder>=<rem/add>"
===allthis===
''Implemented in v2.5''
* '''''Allow/prevent wearing some folders and their children''''' : @attachallthis[:<layer>|<attachpt>|<path_to_folder>]=<y/n>
When adding an exception, the user can remove the items contained into the indicated folder, or in any of its children.
''Implemented in v2.3 and v1.25''
 
These commands do exactly like @attachthis, but also apply to their children folders recursively.
 
* '''''Remove/add exceptions to the attachallthis restriction, for one folder only''''' : "@attachthis_except:<folder>=<rem/add>"
''Implemented in v2.5''
When adding an exception, the user can wear the items contained into the indicated folder.




Line 448: Line 429:
  However, the same object issues a @attachallthis:Jewelry/Gold=add exception, then a @detachallthis:Jewelry/Gold=add one, making the Jewelry/Gold folder available for wearing and removing. Finally, it issues a @attachallthis:Jewelry/Gold/Watch=n restriction followed by a @detachallthis:Jewelry/Gold/Watch=n restriction. As a result, the user can wear and remove only what is contained inside the Jewelry/Gold folder, except what is in Jewelry/Gold/Watch, and the rest is out of reach.
  However, the same object issues a @attachallthis:Jewelry/Gold=add exception, then a @detachallthis:Jewelry/Gold=add one, making the Jewelry/Gold folder available for wearing and removing. Finally, it issues a @attachallthis:Jewelry/Gold/Watch=n restriction followed by a @detachallthis:Jewelry/Gold/Watch=n restriction. As a result, the user can wear and remove only what is contained inside the Jewelry/Gold folder, except what is in Jewelry/Gold/Watch, and the rest is out of reach.


* '''''Allow/prevent removing some folders and their children''''' : @detachallthis[:<layer>|<attachpt>|<path_to_folder>]=<y/n>
''Implemented in v2.3 and v1.25''
These commands do exactly like @detachthis, but also apply to their children folders recursively.
* '''''Remove/add exceptions to the detachallthis restriction, for one folder and its children''''' : "@detachallthis_except:<folder>=<rem/add>"
''Implemented in v2.5''
When adding an exception, the user can remove the items contained into the indicated folder, or in any of its children.


==unshared==
==unshared==
Line 459: Line 449:
When prevented, no object, piece of clothing or bodypart can be removed from the avatar unless it is part of the #RLV folder (i.e. "shared").
When prevented, no object, piece of clothing or bodypart can be removed from the avatar unless it is part of the #RLV folder (i.e. "shared").


=chat=
=Communication=
==volume==
==volume==
* '''''Allow/prevent shouting''''' : "@chatshout=<y/n>"
* '''''Allow/prevent shouting''''' : "@chatshout=<y/n>"
Line 553: Line 543:
''Implemented in v1.01''
''Implemented in v1.01''
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't forget to remove it when it becomes obsolete.
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't forget to remove it when it becomes obsolete.
* '''''Allow/prevent starting an IM session with anyone''''' : "@startim=<y/n>"
''Implemented in v2.6''
When prevented, the user is unable to start an IM session with anyone. Sessions that are already open are not impacted though.
* '''''Remove/add exceptions to the IM session start prevention''''' : "@startim:<UUID>=<rem/add>"
''Implemented in v2.6''
When adding an exception, the user can start an IM session with the receiver whose [[UUID]] is specified in the command. This overrides the prevention for this avatar only (there is no limit to the number of exceptions), don't forget to remove it when it becomes obsolete.




Line 558: Line 558:
''Implemented in v2.3 and v1.25''
''Implemented in v2.3 and v1.25''
When prevented, everything typed in IM to the specified avatar will be discarded and a bogus message will be sent instead.
When prevented, everything typed in IM to the specified avatar will be discarded and a bogus message will be sent instead.
* '''''Allow/prevent starting an IM session with someone in particular''''' : "@startimto:<UUID>=<y/n>"
''Implemented in v2.6''
When prevented, the user is unable to start an IM session with that person. Sessions that are already open are not impacted though.




Line 578: Line 583:
''Implemented in v2.3 and v1.25''
''Implemented in v2.3 and v1.25''
When prevented, every IM received from the the specified avatar will be discarded and the sender will be notified that the user cannot read them.
When prevented, every IM received from the the specified avatar will be discarded and the sender will be notified that the user cannot read them.


==channel==
==channel==
Line 590: Line 594:
Complimentary of @sendchat, this command prevents the user from sending messages on non-public [[channel]]s. If channel is specified, it becomes an exception to the aforementioned restriction (then it is better to use "rem" or "add" instead of "y" or "n" respectively). It does not prevent the viewer automatic replies like @version=nnnn, @getstatus=nnnn etc. This particular command only accepts exceptions issued from the same object, opposed to its non-secure version which accepts exceptions from any other object.
Complimentary of @sendchat, this command prevents the user from sending messages on non-public [[channel]]s. If channel is specified, it becomes an exception to the aforementioned restriction (then it is better to use "rem" or "add" instead of "y" or "n" respectively). It does not prevent the viewer automatic replies like @version=nnnn, @getstatus=nnnn etc. This particular command only accepts exceptions issued from the same object, opposed to its non-secure version which accepts exceptions from any other object.


=tp=
=TP=
* '''''Allow/prevent teleporting to a landmark''''' : "@tplm=<y/n>"
* '''''Allow/prevent teleporting to a landmark''''' : "@tplm=<y/n>"
''Implemented in v1.0''
''Implemented in v1.0''
Line 644: Line 648:
When this restriction is active and the avatar stands up, it is automatically teleported back to the location where it initially sat down. Please note that the "last standing location" is also stored when the restriction is issued, so this won't be a problem for grabbers and the like, that sit the victim, then move them inside a cell, which issues its restrictions, and then unsits them. In this case the avatar will stay in the cell.
When this restriction is active and the avatar stands up, it is automatically teleported back to the location where it initially sat down. Please note that the "last standing location" is also stored when the restriction is issued, so this won't be a problem for grabbers and the like, that sit the victim, then move them inside a cell, which issues its restrictions, and then unsits them. In this case the avatar will stay in the cell.


=sit=
=Sit=
* '''''Allow/prevent standing up''''' : @unsit=<y/n>
* '''''Allow/prevent standing up''''' : @unsit=<y/n>
''Implemented in v1.10, modified in v1.15 to prevent teleporting as well''
''Implemented in v1.10, modified in v1.15 to prevent teleporting as well''
Line 669: Line 673:
Makes the viewer automatically answer the UUID of the object the avatar is currently sitting on, or NULL_KEY if they are not sitting.
Makes the viewer automatically answer the UUID of the object the avatar is currently sitting on, or NULL_KEY if they are not sitting.


 
=Edit=
=misc restrictions=
* '''''Allow/prevent flying''''' : @fly=<y/n>
''Implemented in v1.12.2''
When prevented, the user is unable to fly.
 
 
* '''''Allow/prevent rezzing inventory''''' : "@rez=<y/n>"
''Implemented in v1.03''
When prevented from [[rez]]zing stuff, creating and deleting objects, drag-dropping from inventory and dropping attachments will fail.
 
 
=edit=
* '''''Allow/prevent editing objects''''' : "@edit=<y/n>"
* '''''Allow/prevent editing objects''''' : "@edit=<y/n>"
''Implemented in v1.03''
''Implemented in v1.03''
Line 696: Line 688:
When prevented, the Build & Edit window will refuse to open when trying to edit or open the specified object.
When prevented, the Build & Edit window will refuse to open when trying to edit or open the specified object.


 
=Touch=
=touch=
* '''''Allow/prevent touching objects located further than 1.5 meters away from the avatar''''' : @fartouch=<y/n>
* '''''Allow/prevent touching objects located further than 1.5 meters away from the avatar''''' : @fartouch=<y/n>
''Implemented in v1.11''
''Implemented in v1.11''
Line 726: Line 717:
''Implemented in v2.5''
''Implemented in v2.5''
When prevented, the avatar is unable to touch/grab the object which UUID corresponds to the one specified in the command.
When prevented, the avatar is unable to touch/grab the object which UUID corresponds to the one specified in the command.
* '''''Remove/add an exception to the touch* preventions, for one object only''''' : "@touchme=<rem/add>"
''Implemented in v2.6''
When adding such an exception, the user can touch this object in particular.




Line 742: Line 738:
When prevented, the avatar is unable to touch other people's attachments (but they can touch their owns). This does not apply to HUDs.
When prevented, the avatar is unable to touch other people's attachments (but they can touch their owns). This does not apply to HUDs.


=show & view=
=Show & view=
* '''''Allow/prevent using inventory''''' : @showinv=<y/n>
* '''''Allow/prevent using inventory''''' : @showinv=<y/n>
''Implemented in v1.10''
''Implemented in v1.10''
Line 776: Line 772:
''Implemented in v1.12''
''Implemented in v1.12''
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'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 ''not'' obfuscated so radars ''will'' still work (and RL commands as well).
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'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 ''not'' obfuscated so radars ''will'' still work (and RL commands as well).




Line 804: Line 799:




=environment & debug=
=Misc=
* '''''Allow/prevent flying''''' : @fly=<y/n>
''Implemented in v1.12.2''
When prevented, the user is unable to fly.
 
 
* '''''Allow/prevent rezzing inventory''''' : "@rez=<y/n>"
''Implemented in v1.03''
When prevented from [[rez]]zing stuff, creating and deleting objects, drag-dropping from inventory and dropping attachments will fail.
 
 
=Group=
* '''''Force the agent to change the active group''''' : @setgroup:<group_name>=force
''Implemented in v2.5''
Forces the agent to change the active group, to the specified one. Of course, they must already be a member of this group. If <group_name> is "none", then the agent will deactivate the current group and not show any group tag at all.
 
 
* '''''Allow/prevent activating a group''''' : @setgroup=<y/n>
''Implemented in v2.5''
When prevented, the user is unable to change the active group.
 
 
* '''''Get the name of the active group''''' : @getgroup=<channel_number>
''Implemented in v2.5''
Makes the viewer automatically answer the name of the currently active group, immediately on the chat channel number <channel_number> that the script can listen to. Always use a positive integer. Remember that regular viewers do not answer anything at all so remove the listener after a timeout. The answer will simply be "none" if no group is active at the time. Please note that there is no way to obtain the UUID of the group, only the name.
 
 
=Environment & debug=
* '''''Allow/prevent changing some debug settings''''' : @setdebug=<y/n>
* '''''Allow/prevent changing some debug settings''''' : @setdebug=<y/n>
''Implemented in v1.16''
''Implemented in v1.16''

Latest revision as of 11:30, 1 May 2011

Official Marine's doc: here

Version

  • Automated version checking : "@version=<channel_number>"

Implemented in v1.0b Makes the viewer automatically say the version of the RLV API it implements, immediately on the chat channel number <channel_number> 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.

Warning : 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.

Warning 2 : On 02/22/2010, Linden Lab has released their Third Party Viewer policy which forbids using the term "Life" in the name of Third Party Viewers. Therefore "Restrained Life" had to be renamed to "Restrained Love". However, for compatibility purposes, this @version command still works and will keep working, however you are encouraged to not use it in new scripts, and to not show the terms "Restrained Life" to the user anywhere. For new scripts, please use @versionnew below instead.


  • Automated version checking : "@versionnew=<channel_number>"

Implemented in v1.23 Makes the viewer automatically say the version of the RLV API it implements, immediately on the chat channel number <channel_number> 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 the successor of @version and replaces it, although @version is kept for ascending compatibility purposes. It returns "RestrainedLove viewer v... (SL ...)" ("RestrainedLove" is in one word).

Warning : 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.


  • Automated version number checking : "@versionnum=<channel_number>"

Implemented in v1.21 Makes the viewer automatically say the version number of the RLV API it implements, immediately on the chat channel number <channel_number> 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.

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.


  • Manual version checking : "@version"

Implemented in v1.0a 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's IM window, so it's totally stealthy.

Clear

  • Clear all the rules tied to an object : "@clear"

Implemented in v1.0a, but working only since v1.04a This command clears all the restrictions and exceptions tied to a particular UUID.

Warning : 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.

Possible workarounds:

  • only lift the exact restrictions you added with @clear=<pattern>
  • only trigger @clear on detach when you are sure the attachment is not locked
  • don't trigger @clear on detach at all and wait for the viewer to lift the set restrictions


  • Clear a subset of the rules tied to an object : "@clear=<string>"

Implemented in v1.0a, but working only since v1.04a This command clears all the restrictions and exceptions tied to a particular UUID which name contains <string>. A good example would be "@clear=tp" which clears all the teleport restrictions and exceptions tied to that object, whereas "@clear=tplure:" would only clear the exceptions to the "teleport-by-friend" restriction

Utilities

  • Get the list of restrictions the avatar is currently submitted to : @getstatus[:<part_of_rule>]=<channel>

Implemented in v1.10, slightly tweaked in v1.16 Makes the viewer automatically answer the list of rules the avatar is currently under, which would only contains the restrictions issued by the object that sends this command, immediately on the chat channel number <channel_number> 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 ('/'). 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 !

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's why this command only replies the restrictions issued by the object calling it.

<part_of_rule> is the name of a rule, or a part of it, useful if the script only needs to know about a certain restriction.

Example : If the avatar is under tploc, tplure, tplm and sittp, here is what the script would get :
@getstatus=2222  =>  /tploc/tplure/tplm/sittp
@getstatus:sittp=2222  =>  /sittp
@getstatus:tpl=2222  =>  /tploc/tplure/tplm  (because "tpl" is part of "tploc", "tplure" and "tplm" but not "sittp")


  • Get the list of all the restrictions the avatar is currently submitted to : @getstatusall[:<part_of_rule>]=<channel>

Implemented in v1.15, slightly tweaked in v1.16 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 <channel_number> 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 ('/'). 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 !


  • Force rotate the avatar to a set direction : @setrot:<angle_in_radians>=force

Implemented in v1.17 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't very elegant but it works.


  • Change the height of the avatar : @adjustheight:<pelvis_to_foot>;<factor>[;delta]=force

Implemented in v2.5 Forces the avatar to modify its "Z-offset", in other words its altitude. This value can already be changed through a debug setting in most third party viewers, this command allows to automate the change according to the animation.

With:

    • pelvis_to_foot: the pelvis to foot length (in meters) for which the animation is properly leveled with the floor.
    • scalar: the multiplicator to apply to the difference between the said reference length and the current pelvis to foot length to obtain the proper avatar height adjustment offset and keep the animation leveled with the floor.
    • delta: an optional additional offset (in meter, default is 0.0). It's normally unneeded, but could prove useful in some cases such as with prim-based avatars, or avatars with extremely thick or thin limbs (the thickness of the legs, for example, is not taken into account and a kneeling animation could then look badly leveled with some avatars while it's just the result of too thin (resulting in a slightly "floating" Av animation) or too thick (resulting in a slightly "sinking" Av animation) legs when compared with the reference shape that was used to find out the ref_pelvis_to_foot_length_in_meters)

The calculation done internally by @adjustheight is then: height_adjustment = (given pelvis_to_foot - current pelvis_to_foot) * scalar + delta and this "height_adjustment" value is added to the actual avatar height when the latter is passed to the sim server, resulting in a modification of the avatar level relatively to the floor.

Further info @ [1]


  • Start/stop notifications on a private channel : "@notify:<channel_number>[;word]=<rem/add>"

Implemented in v1.20, improved in v2.2 (and v1.24) 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 (";") character. The response on the private channel <channel_number> is preceded with a slash ("/") to avoid making the avatar send commands to other scripts without knowing it, and followed by an equal sign ("=") and "n" or "y" according to whether the restriction is applied or lifted respectively. The "@clear" 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, "@notify:2222;detach=add" will send "/detach=n" whenever an object is locked, and "/detach=y" whenever an object is unlocked, on channel 2222 to which the script will listen to.

Note : Since v2.2 (and v1.24) you can also set a notification for inventory offers. When your object gives an item or a folder, the avatar using a RLV v2.2 (and v1.24) or higher will respond automatically on the given channel one of the following :

- /accepted_in_rlv inv_offer <folder> : The folder has been accepted and is now available under #RLV (don't forget that the viewer renames it, removing the "#RLV/" prefix).
- /accepted_in_inv inv_offer <folder> : The folder has been accepted but is not shared.
- /declined inv_offer <folder> : The folder has been declined and/or the user has pressed "Block" (formerly "Mute").

Where <folder> is the full path of the folder or item given. For example, #RLV/~MyCuffs. There is a space before "inv_offer", which is a token chosen in a way that it is easy to set a notification for it. If you just want to know whether your folder named #RLV/~MyCuffs has been accepted in the #RLV folder, issue a "@notify:2222;accepted_in_rlv inv_offer #RLV/~MyCuffs=add" command. If you just want to know whether the avatar has received something, issue a simple "@notify:2222;inv_offer=add" command.

Perm

  • Allow/deny the "Wear" contextual menu : "@defaultwear=<y/n>

Implemented in v1.21 When allowed, the user is always able to choose the "Wear"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.

Therefore, using this command with the "n" 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.


  • Allow/deny permissive exceptions : "@permissive=<y/n>"

Implemented in v1.21 When denied, all restrictions turn into their "secure" 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.

Warning : 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 !


  • Force the viewer to automatically accept attach and take control permission requests : @acceptpermission=<rem/add>

Implemented in v1.16 Forces the avatar to automatically accept attach and take control permission requests. The dialog box doesn't even show up. This command does not supercede @denypermission, of course.


  • Allow/prevent accepting attach and take control permissions : @denypermission=<rem/add>

Implemented in v1.16, DEPRECATED in v1.16.2 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'T USE IT !

Attachment

  • Render an object detachable/nondetachable : "@detach=<y/n>"

Implemented in v1.0a When called with the "n" option, the object sending this message (which must be an attachment) will be made nondetachable. It can be detached again when the "y" option is called.


  • Unlock/Lock an attachment point : "@detach:<attach_point_name>=<y/n>"

Implemented in v1.20 When called with the "n" option, the attachment point of name <attach_point_name> 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 "@detach=n" 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).


  • Force removing attachments : @detach[:attachpt]=force (*)

Implemented in v1.10 Where part is :

chest|skull|left shoulder|right shoulder|left hand|right hand|left foot|right foot|spine|
pelvis|mouth|chin|left ear|right ear|left eyeball|right eyeball|nose|r upper arm|r forearm|
l upper arm|l forearm|right hip|r upper leg|r lower leg|left hip|l upper leg|l lower leg|stomach|left pec|
right pec|center 2|top right|top|top left|center|bottom left|bottom|bottom right

If part is not specified, removes everything.


  • Unlock/Lock an attachment point empty : "@addattach[:<attach_point_name>]=<y/n>"

Implemented in v1.22 When called with the "n" option, the attachment point of name <attach_point_name> 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 <attach_point_name> is not specified, then all the attachment points will be concerned. This command is the counterpart to @addoutfit, for attachments.


  • Unlock/Lock an attachment point full : "@remattach[:<attach_point_name>]=<y/n>"

Implemented in v1.22 When called with the "n" option, the attachment point of name <attach_point_name> 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 <attach_point_name> is not specified, then all the attachment points will be concerned. This command is the counterpart to @remoutfit, for attachments.


  • Force removing attachments (alias) : @remattach[:attachpt]=force (*)

Implemented in v1.22 This command is an alias to @detach[:attachpt]=force (to keep things consistent).


  • Get the list of worn attachments : @getattach[:attachpt]=<channel_number>

Implemented in v1.10 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 <channel_number> 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 list of 0s and 1s corresponds to :

none,chest,skull,left shoulder,right shoulder,left hand,right hand,left foot,right foot,spine,
pelvis,mouth,chin,left ear,right ear,left eyeball,right eyeball,nose,r upper arm,r forearm,
l upper arm,l forearm,right hip,r upper leg,r lower leg,left hip,l upper leg,l lower leg,stomach,left pec,
right pec,center 2,top right,top,top left,center,bottom left,bottom,bottom right

in that order.

If an attachment point is specified, answers a single 0 (empty) or 1 (occupied) corresponding to the point.

Ex 1 : @getattach=2222 => "011000011010000000000000100100000000101" => avatar is wearing attachments on 
chest, skull, left and right foot, pelvis, l and r lower leg, HUD bottom left and HUD bottom right.
Ex 2 : @getattach:chest=2222 => "1" => avatar is wearing something on the chest.

Note : The first character ("none") is always '0', so the index of each attach point in the string is exactly equal to the corresponding ATTACH_* macro in LSL. For instance, the index 9 in the string is ATTACH_BACK (which means "spine"). Remember the indices start at zero.

Outfit

The outfit parts are the following:

gloves,jacket,pants,shirt,shoes,skirt,socks,underpants,undershirt,skin,eyes,hair,shape,alpha,tattoo,physics
  • Get the list of worn clothes : @getoutfit[:part]=<channel_number>

Implemented in v1.10, added skin hair and eyes in v1.10.1, added physics in 2.6.1

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 <channel_number> that the script can listen to.

The list of 0s and 1s corresponds to the different parts here above in that order.

If a part is specified, answers a single 0 (empty) or 1 (occupied) corresponding to the part.

Ex 1 : @getoutfit=2222 => "0011000111" => avatar is wearing pants, shirt, underpants and undershirt, and of course a skin.
Ex 2 : @getoutfit:socks=2222 => "0" => the avatar is not wearing socks.


  • Allow/prevent wearing clothes : @addoutfit[:<part>]=<y/n>

Implemented in v1.10, added skin hair and eyes in v1.10.1, added physics in 2.6.1

Where part is one in the list here above. If part is not specified, prevents from wearing anything beyond what the avatar is already wearing.


  • Allow/prevent removing clothes : @remoutfit[:<part>]=<y/n> (underpants and undershirt are kept for teens)

Implemented in v1.10, added skin hair and eyes in v1.10.1, added physics in 2.6.1

Where part is one in the list here above. If part is not specified, prevents from removing anything in what the avatar is wearing.


  • Force removing clothes : @remoutfit[:<part>]=force (*) (teens can't be forced to remove underpants and undershirt)

Implemented in v1.10

Where part is one in the list here above. If part is not specified, removes everything.

Note: skin, shape, eyes and hair cannot be removed since they are body parts (and removing any would result in an unrezzed avatar).

Inventory

get & find

  • Get the list of shared folders in the avatar's inventory : @getinv[:folder1/.../folderN]=<channel_number>

Implemented in v1.11, added sub-folders in v1.13 Makes the viewer automatically answer the list of folders contained into the folder named "#RLV" (if it exists), immediately on the chat channel number <channel_number> 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 : "@getinv:Restraints/Leather cuffs/Arms=2222"). 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 names, separated by commas (","). Folders which names begin with a dot (".") will be ignored.


  • Get the list of shared folders in the avatar's inventory, with information about worn items : @getinvworn[:folder1/.../folderN]=<channel_number>

Implemented in v1.15 Makes the viewer automatically answer the list of folders contained into the folder named "#RLV" (if it exists), immediately on the chat channel number <channel_number> 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 : "@getinvworn:Restraints/Leather cuffs/Arms=2222"). 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 comma-separated list of names, each one followed with a pipe ("|") 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.

Object : "@getinvworn:Restraints/Leather cuffs=2222"
Viewer : "|02,Arms|30,Legs|10"

Folders which names begin with a dot (".") will be ignored. The two digits are calculated as follows :

First digit : Proportion of items worn in the corresponding folder (including no-mod items). In this example, the "3" of "30" means "all the items in the "Arms" folder are currently worn, while the "1" of "10" means "no item in the Legs folder is currently worn, but there are items to wear".

Second digit : Proportion of items globally worn in all the folders contained inside the corresponding folder. In this example, the "2" of "02" means "some items are worn in some of the folders contained into "Leather cuffs".

The digits, comprised between 0 and 3 included, have the following meaning :

  • 0 : No item is present in that folder
  • 1 : Some items are present in that folder, but none of them is worn
  • 2 : Some items are present in that folder, and some of them are worn
  • 3 : Some items are present in that folder, and all of them are worn


  • Get the path to a shared folder by giving a search criterion : @findfolder:part1[&&...&&partN]=<channel_number>

Implemented in v1.13.1 Makes the viewer automatically answer the path to the first shared folder which name contains <part1> and <part2> and ... and <partN>, immediately on the chat channel number <channel_number> that the script can listen to. The search is in depth first, notice the separator which is "&&" like "and". 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 "."), nor folders which name begins with a tilde ("~"). The answer is a list of folders, separated by slashes ('/').


  • Get the path to the shared folder containing a particular object/clothing worn on a point : @getpath[:<attachpt> or <clothing_layer>]=<channel_number>

Implemented in v1.16 Makes the viewer automatically answer the path to the shared folder containing the item that :

    • issues this command if no option is set
    • is attached on the attach point provided in the option field, ex : @getpath:spine=2222 => "Restraints/Collar"
    • is worn on the clothing layer provided in the option field, ex : @getpath:pants=2222 => "Casual/Jeans/Tight"

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 "."). The answer is a list of folders, separated by slashes ('/').

Please note : As version 1.40.4 is now live on the main grid, wearing several objects on the same attachment point is now possible. Therefore this command does not make much sense anymore since it can only respond with one folder, while the several objects could belong to several folders. Therefore it is better to use @getpathnew, since @getpath will slowly become deprecated as more and more users switch to 2.1 and beyond.


  • Get the all paths to the shared folders containing the objects/clothing worn on a point : @getpathnew[:<attachpt> or <clothing_layer>]=<channel_number>

Implemented in v2.1 and v1.24 Makes the viewer automatically answer the paths to the shared folders containing the item(s) that :

    • issues this command if no option is set
    • are attached on the attach point provided in the option field, ex : @getpathnew:spine=2222 => "Restraints/Collar,Jewelry/Cute necklace"
    • is worn on the clothing layer provided in the option field, ex : @getpathnew:pants=2222 => "Casual/Jeans/Tight"

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 "."). The answer is a list of folders, separated by slashes ('/'), if several paths must be returned because several outfits are concerned, they are organized in a list of strings separated by commas (',').

This command has been added to replace @getpath, since in 2.1 several objects can be worn on the same attachment point.


force attach & detach

base

  • Force attach items contained inside a shared folder : @attach:<folder1/.../folderN>=force (*)

Implemented in v1.11, added no-mod items in v1.12, added sub-folders in v1.13 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 "#RLV"). Objects names must contain the name of their target attachment point or they won't be attached. Each no-modify object must be contained inside a folder (one object per folder), which name contains the name of its target attachment point since it can't be renamed. Names cannot begin with a dot (".") since such folders are invisible to the scripts.

Attachment point names are the same as the ones contained into the "Attach To" submenu : "skull", "chest", "l forearm"...

Note 1 : Folder names can contain slashes, and will be chosen in priority when able (for instance, if "@attach:Restraints/cuffs=force" is issued, the "Restraints/cuffs" folder will be chosen before a "cuffs" folder contained inside a "Restraints" parent folder.

Note 2 : If the name of a folder begins with a plus sign ("+"), then this command will act exactly like @attachover. This rule can be changed through the use of the "RestrainedLoveStackWhenFolderBeginsWith" debug setting.


Attention : This command will likely change in the future, to revert back to how it used to behave in version 1.x, i.e. never add an object if the target attachment point is already taken, but rather replace the old object. The current behaviour is intended to be ensured by @attachoverorreplace and its derivatives. For now @attachoverorreplace is a synonym to @attach, but this won't always be the case. In other words, if you intend to make your script always replace existing attachments when attaching new ones, use @attach. If you want your script to always make attachments stack, use @attachover. If you want to give the user the choice through the name of the folder (as indicated above, by prepending the name by a "+" sign by default), use @attachoverorreplace.


  • Force attach items contained inside a shared folder, without replacing what is already being worn : @attachover:<folder1/.../folderN>=force (*)

Implemented in v2.1.2 and v1.24 This command works exactly like @attach described hereabove, except that it won't kick objects and pieces of clothing that are already being worn.


  • Force attach items contained inside a shared folder : @attachoverorreplace:<folder1/.../folderN>=force (*)

Implemented in v2.5 This command works exactly like @attach described hereabove, it is a synonym.


  • Force detach items contained inside a shared folder : @detach:<folder_name>=force (*)

Implemented in v1.11 Forces the viewer to detach every object and unwear every piece of clothing contained inside <folder_name>(which must be directly under "#RLV"). If "@detach" 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.

all

  • Force attach items contained inside a shared folder, and its children recursively : @attachall:<folder1/.../folderN>=force (*)

Implemented in v1.15 This command works exactly like @attach described hereabove, but also attaches whatever is contained into children folders.


  • Force attach items contained inside a shared folder, and its children recursively, without replacing what is already being worn : @attachallover:<folder1/.../folderN>=force (*)

Implemented in v2.1.2 and v1.24 This command works exactly like @attachall described hereabove, except that it won't kick objects and pieces of clothing that are already being worn.


  • Force attach items contained inside a shared folder, and its children recursively : @attachalloverorreplace:<folder1/.../folderN>=force (*)

Implemented in v2.5 This command works exactly like @attachall described hereabove, it is a synonym.


  • Force detach items contained inside a shared folder, and its children recursively : @detachall:<folder1/.../folderN>=force (*)

Implemented in v1.15 This command works exactly like @detach described hereabove, but also detaches whatever is contained into children folders.


this

  • Force attach items contained into a shared folder that contains a particular object/clothing : @attachthis[:<attachpt> or <clothing_layer>]=force (*)

Implemented in v1.16 This command is a shortcut for a @getpath followed with an @attach command (this saves a listener and a timeout).


  • Force attach items contained inside a shared folder, without replacing what is already being worn : @attachthisover[:<attachpt> or <clothing_layer>]=force (*)

Implemented in v2.1.2 and v1.24 This command works exactly like @attachthis described hereabove, except that it won't kick objects and pieces of clothing that are already being worn.


  • Force attach items contained inside a shared folder : @attachthisoverorreplace[:<attachpt> or <clothing_layer>]=force (*)

Implemented in v2.5 This command works exactly like @attachthis described hereabove, it is a synonym.


  • Force detach items contained into a shared folder that contains a particular object/clothing : @detachthis[:<attachpt> or <clothing_layer>]=force (*)

Implemented in v1.16 This command is a shortcut for a @getpath followed with a @detach command (this saves a listener and a timeout).


allthis

  • Force attach items contained into a shared folder that contains a particular object/clothing, and its children folders : @attachallthis[:<attachpt> or <clothing_layer>]=force (*)

Implemented in v1.16 This command is a shortcut for a @getpath followed with an @attachall command (this saves a listener and a timeout).


  • Force attach items contained inside a shared folder, without replacing what is already being worn : @attachallthisover[:<attachpt> or <clothing_layer>]=force (*)

Implemented in v2.1.2 and v1.24 This command works exactly like @attachallthis described hereabove, except that it won't kick objects and pieces of clothing that are already being worn.


  • Force attach items contained inside a shared folder : @attachallthisoverorreplace[:<attachpt> or <clothing_layer>]=force (*)

Implemented in v2.5 This command works exactly like @attachallthis described hereabove, it is a synonym.


  • Force detach items contained into a shared folder that contains a particular object/clothing, and its children folders : @detachallthis[:<attachpt> or <clothing_layer>]=force (*)

Implemented in v1.16 This command is a shortcut for a @getpath followed with a @detachall command (this saves a listener and a timeout).


me

  • Force detach an item : @detachme=force (*)

Implemented in v1.16.2 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.

lock attach & detach

this

  • Allow/prevent wearing some folders : @attachthis:<layer>|<attachpt>|<path_to_folder>=<y/n>

Implemented in v2.3 and v1.25 When prevented, the user is unable to attach a folder if either of these conditions is filled : - the "layer" option is set (shirt, pants...) and the folder contains a piece of clothing that is meant to be worn on this layer - the "attachpt" option is set (l forearm, spine...) and the folder contains an attachment that is meant to be worn on this point - the "path_to_folder" option is set and the folder corresponds to this location

Moreso, this folder or these folders cannot be renamed, moved, deleted or modified.


  • Remove/add exceptions to the attachallthis restriction, for one folder only : "@attachthis_except:<folder>=<rem/add>"

Implemented in v2.5 When adding an exception, the user can wear the items contained into the indicated folder.


  • Allow/prevent removing some folders : @detachthis[:<layer>|<attachpt>|<path_to_folder>]=<y/n>

Implemented in v2.3 and v1.25 When prevented, the user is unable to remove a folder if either of these conditions is filled : - no option is specified and the folder contains the object that issues this restriction - the "layer" option is set (shirt, pants...) and the folder contains a piece of clothing that is worn on this layer - the "attachpt" option is set (l forearm, spine...) and the folder contains an attachment that is worn on this point - the "path_to_folder" option is set and the folder corresponds to this location

Moreso, this folder or these folders cannot be renamed, moved, deleted or modified.


  • Remove/add exceptions to the detachallthis restriction, for one folder only : "@detachthis_except:<folder>=<rem/add>"

Implemented in v2.5 When adding an exception, the user can remove the items contained into the indicated folder.


allthis

  • Allow/prevent wearing some folders and their children : @attachallthis[:<layer>|<attachpt>|<path_to_folder>]=<y/n>

Implemented in v2.3 and v1.25 These commands do exactly like @attachthis, but also apply to their children folders recursively.


  • Remove/add exceptions to the attachallthis restriction, for one folder and its children : "@attachallthis_except:<folder>=<rem/add>"

Implemented in v2.5 When adding an exception, the user can wear the items contained into the indicated folder, or in any of its children.


Note : These exceptions will be taken into account only for the restrictions that have been issued by the same object, you cannot put such an exception to a restriction issued by another object.

Note : The viewer checks which exception or restriction is the "closest parent" in the folders hierarchy to the folder that the user is trying to wear or remove. If the closest is an @attach[all]this_except or a @detach[all]this_except exception , then the folder can be worn or removed respectively. If the closest is an @attach[all]this or a @detach[all]this restriction, then the folder is locked, no matter how many exceptions are pointing on the folders that are parent to this one.

Example :

A script issues a @attachallthis:=n restriction, preventing the whole #RLV folder and its children from being attached. It also issues a @detachallthis:=n restriction, preventing the whole #RLV folder and its children from being removed as well. Therefore the #RLV folder is now completely frozen.
However, the same object issues a @attachallthis:Jewelry/Gold=add exception, then a @detachallthis:Jewelry/Gold=add one, making the Jewelry/Gold folder available for wearing and removing. Finally, it issues a @attachallthis:Jewelry/Gold/Watch=n restriction followed by a @detachallthis:Jewelry/Gold/Watch=n restriction. As a result, the user can wear and remove only what is contained inside the Jewelry/Gold folder, except what is in Jewelry/Gold/Watch, and the rest is out of reach.


  • Allow/prevent removing some folders and their children : @detachallthis[:<layer>|<attachpt>|<path_to_folder>]=<y/n>

Implemented in v2.3 and v1.25 These commands do exactly like @detachthis, but also apply to their children folders recursively.


  • Remove/add exceptions to the detachallthis restriction, for one folder and its children : "@detachallthis_except:<folder>=<rem/add>"

Implemented in v2.5 When adding an exception, the user can remove the items contained into the indicated folder, or in any of its children.

unshared

  • Allow/prevent wearing clothes and attachments that are not part of the #RLV folder : @unsharedwear=<y/n>

Implemented in v2.5 When prevented, no object, piece of clothing or bodypart can be worn unless it is part of the #RLV folder (i.e. "shared").


  • Allow/prevent removing clothes and attachments that are not part of the #RLV folder : @unsharedunwear=<y/n>

Implemented in v2.5 When prevented, no object, piece of clothing or bodypart can be removed from the avatar unless it is part of the #RLV folder (i.e. "shared").

Communication

volume

  • Allow/prevent shouting : "@chatshout=<y/n>"

Implemented in v1.15 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.


  • Allow/prevent chatting at normal volume : "@chatnormal=<y/n>"

Implemented in v1.15 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.


  • Allow/prevent whispering : "@chatwhisper=<y/n>"

Implemented in v1.15 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.


chat

  • Allow/prevent sending chat messages : "@sendchat=<y/n>"

Implemented in v1.0b When prevented, everything typed on channel 0 will be discarded. However, emotes and messages beginning with a slash ('/') will go through, truncated to strings of 30 and 15 characters long respectively (likely to change later). Messages with special signs like ()"-*=_^ are prohibited, and will be discarded. When a period ('.') is present, the rest of the message is discarded.


  • Allow/prevent receiving chat messages : "@recvchat=<y/n>"

Implemented in v1.0b When prevented, everything heard in public chat will be discarded except emotes.


  • Allow/prevent receiving chat messages, secure way : "@recvchat_sec=<y/n>"

Implemented in v1.21 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.


  • Remove/add exceptions to the chat message receiving prevention : "@recvchat:<UUID>=<rem/add>"

Implemented in v1.01 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't forget to remove it when it becomes obsolete.


  • Allow/prevent receiving chat messages from someone in particular : "@recvchatfrom:<UUID>=<y/n>"

Implemented in v2.3 and v1.25 When prevented, everything heard in public chat from the specified avatar will be discarded except emotes.


  • Redirect public chat to private channels : "@redirchat:<channel_number>=<rem/add>"

Implemented in v1.16 When active, this restriction redirects whatever the user says on the public channel ("/0") 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.

NOTE: As of RLV v1.22.1 / RLVa 1.1.0, it had a bug that @redirchat also truncates emotes on channel 0. An additional @emote=add works around this side-effect. This bug was fixed in the Cool VL Viewer starting with v1.22g (but Marine's RLV v1.23 still had this bug) and RLV v2.0 (it is safe to assume it was fixed in all viewers starting with v1.24 and v2.0).

emote

  • Remove/add an exception to the @sendchat emote truncation : "@emote=<rem/add>"

Implemented in v1.01 When adding this exception, the emotes are not truncated anymore (however, special signs will still discard the message).


  • Redirect public emotes to private channels : "@rediremote:<channel_number>=<rem/add>"

Implemented in v1.19 When active, this restriction redirects whatever emote the user says on the public channel ("/0") to the private channel provided in the option field. If several redirections are issued, the emote will be redirected to each channel.


  • Allow/prevent seeing emotes : "@recvemote=<y/n>"

Implemented in v1.19 When prevented, every emote seen in public chat will be discarded.


  • Allow/prevent receiving emotes seen in public chat from someone in particular : "@recvemotefrom:<UUID>=<y/n>"

Implemented in v2.4 When prevented, everything emote seen in public chat from the specified avatar will be discarded.


  • Allow/prevent seeing emotes, secure way : "@recvemote_sec=<y/n>"

Implemented in v1.21 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.


  • Remove/add exceptions to the emote seeing prevention : "@recvemote:<UUID>=<rem/add>"

Implemented in v1.19 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't forget to remove it when it becomes obsolete.


IM

  • Allow/prevent sending instant messages : "@sendim=<y/n>"

Implemented in v1.0b When prevented, everything typed in IM will be discarded and a bogus message will be sent to the receiver instead.


  • Allow/prevent sending instant messages, secure way : "@sendim_sec=<y/n>"

Implemented in v1.21 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.


  • Remove/add exceptions to the instant message sending prevention : "@sendim:<UUID>=<rem/add>"

Implemented in v1.01 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't forget to remove it when it becomes obsolete.


  • Allow/prevent starting an IM session with anyone : "@startim=<y/n>"

Implemented in v2.6 When prevented, the user is unable to start an IM session with anyone. Sessions that are already open are not impacted though.


  • Remove/add exceptions to the IM session start prevention : "@startim:<UUID>=<rem/add>"

Implemented in v2.6 When adding an exception, the user can start an IM session with the receiver whose UUID is specified in the command. This overrides the prevention for this avatar only (there is no limit to the number of exceptions), don't forget to remove it when it becomes obsolete.


  • Allow/prevent sending instant messages to someone in particular : "@sendimto:<UUID>=<y/n>"

Implemented in v2.3 and v1.25 When prevented, everything typed in IM to the specified avatar will be discarded and a bogus message will be sent instead.


  • Allow/prevent starting an IM session with someone in particular : "@startimto:<UUID>=<y/n>"

Implemented in v2.6 When prevented, the user is unable to start an IM session with that person. Sessions that are already open are not impacted though.


  • Allow/prevent receiving instant messages : "@recvim=<y/n>"

Implemented in v1.0b When prevented, every incoming IM will be discarded and the sender will be notified that the user cannot read them.


  • Allow/prevent receiving instant messages, secure way : "@recvim_sec=<y/n>"

Implemented in v1.21 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.


  • Remove/add exceptions to the instant message receiving prevention : "@recvim:<UUID>=<rem/add>"

Implemented in v1.01 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't forget to remove it when it becomes obsolete.


  • Allow/prevent receiving instant messages from someone in particular : "@recvimfrom:<UUID>=<y/n>"

Implemented in v2.3 and v1.25 When prevented, every IM received from the the specified avatar will be discarded and the sender will be notified that the user cannot read them.

channel

  • Allow/prevent using any chat channel but certain channels : @sendchannel[:<channel>]=<y/n>

Implemented in v1.10 Complimentary of @sendchat, this command prevents the user from sending messages on non-public channels. If channel is specified, it becomes an exception to the aforementioned restriction (then it is better to use "rem" or "add" instead of "y" or "n" respectively). It does not prevent the viewer automatic replies like @version=nnnn, @getstatus=nnnn etc.


  • Allow/prevent using any chat channel but certain channels, secure way : @sendchannel_sec[:<channel>]=<y/n>

Implemented in v1.10 Complimentary of @sendchat, this command prevents the user from sending messages on non-public channels. If channel is specified, it becomes an exception to the aforementioned restriction (then it is better to use "rem" or "add" instead of "y" or "n" respectively). It does not prevent the viewer automatic replies like @version=nnnn, @getstatus=nnnn etc. This particular command only accepts exceptions issued from the same object, opposed to its non-secure version which accepts exceptions from any other object.

TP

  • Allow/prevent teleporting to a landmark : "@tplm=<y/n>"

Implemented in v1.0 When prevented, the user cannot use a landmark, pick or any other preset location to teleport there.


  • Allow/prevent teleporting to a location : "@tploc=<y/n>"

Implemented in v1.0 When prevented, the user cannot use teleport to a coordinate by using the map and such.


  • Allow/prevent teleporting by a friend : "@tplure=<y/n>"

Implemented in v1.0 When prevented, the user automatically discards any teleport offer, and the avatar who initiated the offer is notified.


  • Allow/prevent teleporting by a friend, secure way : "@tplure_sec=<y/n>"

Implemented in v1.21 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.


  • Remove/add exceptions to the friend teleport prevention : "@tplure:<UUID>=<rem/add>"

Implemented in v1.0 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't forget to remove it when it becomes obsolete.


  • Force-Teleport the user : @tpto:<X>/<Y>/<Z>=force (*)

Implemented in v1.12 This command forces the avatar to teleport to the indicated coordinates. Note that these coordinates are always global, 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 @unsit.

Note: @tpto seems to be imune by @tploc=n restriction issued by the same oject.


  • Remove/add auto-accept teleport offers from anyone : "@accepttp=<rem/add>"

Implemented in v1.16 Adding this rule will make the user automatically accept any teleport offer from anybody, 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.


  • Remove/add auto-accept teleport offers from a particular avatar : "@accepttp[:<UUID>]=<rem/add>"

Implemented in v1.15 Adding this rule will make the user automatically accept any teleport offer from the avatar which key is <UUID>, 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.


  • Unlimit/limit sit-tp : "@sittp=<y/n>"

Implemented in v1.0 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).


  • Allow/prevent standing up at a different location than where we sat down : @standtp=<y/n>

Implemented in v2.1.2 and v1.24 When this restriction is active and the avatar stands up, it is automatically teleported back to the location where it initially sat down. Please note that the "last standing location" is also stored when the restriction is issued, so this won't be a problem for grabbers and the like, that sit the victim, then move them inside a cell, which issues its restrictions, and then unsits them. In this case the avatar will stay in the cell.

Sit

  • Allow/prevent standing up : @unsit=<y/n>

Implemented in v1.10, modified in v1.15 to prevent teleporting as well Hides the Stand up button. From v1.15 it also prevents teleporting, which was a way to stand up.


  • Force sit on an object : @sit:<UUID>=force (*)

Implemented in v1.10 Does not work if the user is prevented from sit-tping and further than 1.5 meters away, or when prevented from unsitting.


  • Force unsit : @unsit=force (*)

Implemented in v1.10 Self-explanatory but for some reason it randomly fails, so don't rely on it for now. Further testing is needed.


  • Allow/prevent sitting down : @sit=<y/n>

Implemented in v1.16.2 Prevents the user from sitting on anything, including with @sit:UUID=force.


  • Get the UUID of the object the avatar is sitting on : @getsitid=<channel_number>

Implemented in v1.12.4 but broken in all versions older than v1.24 and v2.2 (was reporting the UUID of the last object any avatar within draw distance sat upon) Makes the viewer automatically answer the UUID of the object the avatar is currently sitting on, or NULL_KEY if they are not sitting.

Edit

  • Allow/prevent editing objects : "@edit=<y/n>"

Implemented in v1.03 When prevented from editing and opening objects, the Build & Edit window will refuse to open.


  • Remove/add exceptions to the edit prevention : "@edit:<UUID>=<rem/add>"

Implemented in v2.3 and v1.25 When adding an exception, the user can edit or open this object in particular.


  • Allow/prevent editing particular objects : "@editobj:<UUID>=<y/n>"

Implemented in v2.3 and v1.25 When prevented, the Build & Edit window will refuse to open when trying to edit or open the specified object.

Touch

  • Allow/prevent touching objects located further than 1.5 meters away from the avatar : @fartouch=<y/n>

Implemented in v1.11 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.


  • Allow/prevent touching objects located further than 1.5 meters away from the avatar : @touchfar=<y/n>

Implemented in v2.4 This command is a synonym of @fartouch


  • Allow/prevent touching any objects : @touchall=<y/n>

Implemented in v2.4 When prevented, the avatar is unable to touch/grab any object and attachment. This does not apply to HUDs.


  • Allow/prevent touching objects in-world : @touchworld=<y/n>

Implemented in v2.4 When prevented, the avatar is unable to touch/grab objects rezzed in-world, i.e. not attachments and HUDs.


  • Remove/add exceptions to the touchworld prevention : "@touchworld:<UUID>=<rem/add>"

Implemented in v2.5 When adding an exception, the user can touch this object in particular.


  • Allow/prevent touching one object in particular : @touchthis:<UUID>=<rem/add>

Implemented in v2.5 When prevented, the avatar is unable to touch/grab the object which UUID corresponds to the one specified in the command.


  • Remove/add an exception to the touch* preventions, for one object only : "@touchme=<rem/add>"

Implemented in v2.6 When adding such an exception, the user can touch this object in particular.


  • Allow/prevent touching attachments : @touchattach=<y/n>

Implemented in v2.4 When prevented, the avatar is unable to touch attachments (theirs and other avatars'), but this does not apply to HUDs.


  • Allow/prevent touching one's attachments : @touchattachself=<y/n>

Implemented in v2.4 When prevented, the avatar is unable to touch their own attachments (theirs but can touch other people's), but this does not apply to HUDs.


  • Allow/prevent touching other people's attachments : @touchattachother=<y/n>

Implemented in v2.4 When prevented, the avatar is unable to touch other people's attachments (but they can touch their owns). This does not apply to HUDs.

Show & view

  • Allow/prevent using inventory : @showinv=<y/n>

Implemented in v1.10 Forces the inventory windows to close and stay closed.


  • Allow/prevent reading notecards : @viewnote=<y/n>

Implemented in v1.10 Prevents from opening notecards but does not close the ones already open.


  • Allow/prevent opening scripts : @viewscript=<y/n>

Implemented in v1.22 Prevents from opening scripts but does not close the ones already open.


  • Allow/prevent opening textures : @viewtexture=<y/n>

Implemented in v1.22 Prevents from opening textures (and snapshots) but does not close the ones already open.


  • Allow/prevent viewing the world map : @showworldmap=<y/n>

Implemented in v1.11 When prevented, the avatar is unable to view the world map, and it closes if it is open when the restriction becomes active.


  • Allow/prevent viewing the mini map : @showminimap=<y/n>

Implemented in v1.11 When prevented, the avatar is unable to view the mini map, and it closes if it is open when the restriction becomes active.


  • Allow/prevent knowing the current location : @showloc=<y/n>

Implemented in v1.12 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'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 not obfuscated so radars will still work (and RL commands as well).


  • Allow/prevent seeing the names of the people around : @shownames=<y/n>

Implemented in v1.12.2, added more dummy names in v1.16 When prevented, the user is unable to know who is around. The names don't show on the screen, the names on the chat are replaced by "dummy" names such as "Someone", "A resident", the tooltips are hidden, the pie menu is almost useless so the user can't get the profile directly etc.


  • Allow/prevent seeing all the hovertexts : @showhovertextall=<y/n>

Implemented in v1.19 When prevented, the user is unable to read any hovertext (2D text floating above some prims).


  • Allow/prevent seeing one hovertext in particular : @showhovertext:<UUID>=<y/n>

Implemented in v1.19 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).


  • Allow/prevent seeing the hovertexts on the HUD of the user : @showhovertexthud=<y/n>

Implemented in v1.19 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.


  • Allow/prevent seeing the hovertexts in-world : @showhovertextworld=<y/n>

Implemented in v1.19 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.


Misc

  • Allow/prevent flying : @fly=<y/n>

Implemented in v1.12.2 When prevented, the user is unable to fly.


  • Allow/prevent rezzing inventory : "@rez=<y/n>"

Implemented in v1.03 When prevented from rezzing stuff, creating and deleting objects, drag-dropping from inventory and dropping attachments will fail.


Group

  • Force the agent to change the active group : @setgroup:<group_name>=force

Implemented in v2.5 Forces the agent to change the active group, to the specified one. Of course, they must already be a member of this group. If <group_name> is "none", then the agent will deactivate the current group and not show any group tag at all.


  • Allow/prevent activating a group : @setgroup=<y/n>

Implemented in v2.5 When prevented, the user is unable to change the active group.


  • Get the name of the active group : @getgroup=<channel_number>

Implemented in v2.5 Makes the viewer automatically answer the name of the currently active group, immediately on the chat channel number <channel_number> that the script can listen to. Always use a positive integer. Remember that regular viewers do not answer anything at all so remove the listener after a timeout. The answer will simply be "none" if no group is active at the time. Please note that there is no way to obtain the UUID of the group, only the name.


Environment & debug

  • Allow/prevent changing some debug settings : @setdebug=<y/n>

Implemented in v1.16 When prevented, the user is unable to change some viewer debug settings (Advanced > Debug Settings). As most debug settings are either useless or critical to the user'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 :

    • AvatarSex (0 : Female, 1 : Male) : gender of the avatar at creation.
    • RenderResolutionDivisor (1 -> ...) : "blurriness" 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.


  • Force change a debug setting : @setdebug_<setting>:<value>=force (*)

Implemented in v1.16 Forces the viewer to change a particular debug setting and set it to <value>. This command is actually a package of many sub-commands, that are regrouped under "@setdebug_...", for instance "@setdebug_avatarsex:0=force", "@setdebug_renderresolutiondivisor:64=force" etc.

See the list of allowed debug settings in the @setdebug command hereabove.


  • Get the value of a debug setting : @getdebug_<setting>=<channel_number>

Implemented in v1.16 Makes the viewer automatically answer the value of a debug setting, immediately on the chat channel number <channel_number> 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 <setting> part of the matching @setdebug command, or by hand.

See the list of allowed debug settings in the @setdebug command hereabove.


  • Get the value of an environment setting : @getenv_<setting>=<channel_number>

Implemented in v1.15 Makes the viewer automatically answer the value of an environment setting, immediately on the chat channel number <channel_number> 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 <setting> part of the matching @setenv command, or by hand. See the table hereabove for a list of settings.
Note: only @getenv_daytime is supported by v1.19.0 (or older, i.e. non Windlight) viewers implementing RestrainedLove v1.15 and later.


  • Allow/prevent changing the environment settings : @setenv=<y/n>

Implemented in v1.14 When prevented, the user is unable to change the viewer environment settings (World > Environment Settings > Sunrise/Midday/Sunset/Midnight/Revert to region default/Environment editor are all locked out).


  • Force change an environment setting : @setenv_<setting>:<value>=force (*)

Implemented in v1.14 Forces the viewer to change a particular environment setting (time of day or Windlight) and set it to <value>. This command is actually a package of many sub-commands, that are regrouped under "@setenv_...", for instance "@setenv_daytime:0.5=force", "@setenv_bluehorizonr:0.21=force" etc.

This command (like any other "force" command) is silently discarded if the corresponding restriction has been set, here "@setenv", 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.

Although a range is specified for every value, no check is made in the viewer so a script can do what the UI can'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.

Each particular sub-command works as follows (the names are chosen to be as close to the Windlight panels of the viewer as possible) :

@setenv_XXX:<value>=force where XXX is... <value> range Sets...
daytime 0.0-1.0 and <0 Time of day (sunrise:0.25, midday:0.567, sunset:0.75, midnight:0.0, set back to region default:<0). Attention, resets all other Windlight parameters
preset String A Preset environment, e.g. Gelatto, Foggy. Attention, loading a Preset is heavy on the viewer and can slow it down for a short while, don't do it every second
ambientr 0.0-1.0 Ambient light, Red channel
ambientg 0.0-1.0 Ambient light, Green channel
ambientb 0.0-1.0 Ambient light, Blue channel
ambienti 0.0-1.0 Ambient light, Intensity
bluedensityr 0.0-1.0 Blue Density, Red channel
bluedensityg 0.0-1.0 Blue Density, Green channel
bluedensityb 0.0-1.0 Blue Density, Blue channel
bluedensityi 0.0-1.0 Blue Density, Intensity
bluehorizonr 0.0-1.0 Blue Horizon, Red channel
bluehorizong 0.0-1.0 Blue Horizon, Green channel
bluehorizonb 0.0-1.0 Blue Horizon, Blue channel
bluehorizoni 0.0-1.0 Blue Horizon, Intensity
cloudcolorr 0.0-1.0 Cloud color, Red channel
cloudcolorg 0.0-1.0 Cloud color, Green channel
cloudcolorb 0.0-1.0 Cloud color, Blue channel
cloudcolori 0.0-1.0 Cloud color, Intensity
cloudcoverage 0.0-1.0 Cloud coverage
cloudx 0.0-1.0 Cloud offset X
cloudy 0.0-1.0 Cloud offset Y
cloudd 0.0-1.0 Cloud density
clouddetailx 0.0-1.0 Cloud detail X
clouddetaily 0.0-1.0 Cloud detail Y
clouddetaild 0.0-1.0 Cloud detail density
cloudscale 0.0-1.0 Cloud scale
cloudscrollx 0.0-1.0 Cloud scroll X
cloudscrolly 0.0-1.0 Cloud scroll Y
densitymultiplier 0.0-0.9 Density multiplier of the fog
distancemultiplier 0.0-100.0 Distance multiplier of the fog
eastangle 0.0-1.0 Position of the east, 0.0 is normal
hazedensity 0.0-1.0 Density of the haze
hazehorizon 0.0-1.0 Haze at the horizon
maxaltitude 0.0-4000.0 Maximum altitude of the fog
scenegamma 0.0-10.0 Overall gamma, 1.0 is normal
starbrightness 0.0-2.0 Brightness of the stars
sunglowfocus 0.0-0.5 Focus of the glow of the sun
sunglowsize 1.0-2.0 Size of the glow of the sun
sunmooncolorr 0.0-1.0 Sun and moon, Red channel
sunmooncolorg 0.0-1.0 Sun and moon, Green channel
sunmooncolorb 0.0-1.0 Sun and moon, Blue channel
sunmooncolori 0.0-1.0 Sun and moon, Intensity
sunmoonposition 0.0-1.0 Position of the sun/moon, different from "daytime", use this to set the apparent sunlight after loading a Preset

Note: from the above settings, only the "daytime" 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.


(*) Silently discarded if the user is prevented from doing so by the corresponding restriction. This is on purpose.

   Ex : Force detach won't work if the object is undetachable. Force undress won't work if the user is prevented from undressing.