Difference between revisions of "LSL Protocol/RestrainedLoveAPI/ja"

From Second Life Wiki
Jump to navigation Jump to search
(Yay!)
 
(32 intermediate revisions by the same user not shown)
Line 1: Line 1:
{{LSL Header|ml=*}}
{{LSL Header/ja|ml=*}}
=Restrained Love viewer v1.23 の仕様=
=Restrained Love viewer v2.3 の仕様=


著者 [[User:Marine Kelley|Marine Kelley]]
著者 [[User:Marine Kelley|Marine Kelley]]
Line 8: Line 8:


このドキュメントは、[http://realrestraint.blogspot.com RestrainedLove viewer]の機能を使用して独自の[[LSL]]スクリプトを作成したい方へ向けて書かれたものです。メッセージやイベントといった[[LSL]]の概念については説明していません。また、[[UUID]]などの普遍的な概念についても説明していません。
このドキュメントは、[http://realrestraint.blogspot.com RestrainedLove viewer]の機能を使用して独自の[[LSL]]スクリプトを作成したい方へ向けて書かれたものです。メッセージやイベントといった[[LSL]]の概念については説明していません。また、[[UUID]]などの普遍的な概念についても説明していません。
この文書は RestrainedLove ビューアそのものの仕様について説明されています。RestrainedLove ビューア連携 (RLV Relay) についての情報が欲しい場合は、 [[LSL_Protocol/Restrained_Love_Relay/Specification|RLV relay specification]] を参照してください。


==はじめに==
==はじめに==


[http://realrestraint.blogspot.com RestrainedLove viewer]は、インワールドのスクリプトから特定のメッセージを受け取ったときに、対応した動作をするものです。これらのメッセージは、ほとんどが[[llOwnerSay]]()と呼ばれる[[LSL]]の関数の呼び出しによって作成されます。
[http://realrestraint.blogspot.com RestrainedLove viewer]は、インワールドのスクリプトから特定のメッセージを受け取ったときに、対応した動作をするものです。これらのメッセージは、ほとんどが[[llOwnerSay/ja|llOwnerSay]]()と呼ばれる[[LSL]]の関数の呼び出しによって作成されます。


==仕組み==
==仕組み==


[http://realrestraint.blogspot.com RestrainedLove viewer]は、ビューアに送信された全ての[[llOwnerSay]] メッセージを傍受します。アットマーク(''''@'''')で始まる行は、RLV のコマンドとして解釈されます。他の行は、通常通り、ローカルチャットに転送され、ユーザが見ることができます。例えば、[[llOwnerSay]] ("@detach=n") と呼び出すと、スクリプトを実行するオブジェクトが引数 ''n'' の ''detach'' コマンドをビューアに送信することと同じことになります。
[http://realrestraint.blogspot.com RestrainedLove viewer]は、ビューアに送信された全ての[[llOwnerSay/ja|llOwnerSay]] メッセージを傍受します。アットマーク(''''@'''')で始まる行は、RLV のコマンドとして解釈されます。他の行は、通常通り、ローカルチャットに転送され、ユーザが見ることができます。例えば、[[llOwnerSay/ja|llOwnerSay]] ("@detach=n") と呼び出すと、スクリプトを実行するオブジェクトが引数 ''n'' の ''detach'' コマンドをビューアに送信することと同じことになります。


メッセージの書式は次のようになります。
メッセージの書式は次のようになります。
Line 21: Line 23:
: <code>@<command1>[:option1]=<param1>,<command2>[:option2]=<param2>,...,<commandN>[:optionN]=<paramN></code>
: <code>@<command1>[:option1]=<param1>,<command2>[:option2]=<param2>,...,<commandN>[:optionN]=<paramN></code>


'@'は、メッセージの先頭にただ一つだけ存在するようにしてください。ビューアはこれを「この [[llOwnerSay]]() メッセージの全文が、1つ以上の実行命令を含んでいる」と解釈します。記載上の都合により、コマンドは常に先頭に''''@''''がついた形で示されています。しかし、複数のコマンドを含むメッセージのそれぞれのコマンドの先頭に''''@''''をつけるのは誤りで、2個目以降のコマンドは正常に実行されません。
'@'は、メッセージの先頭にただ一つだけ存在するようにしてください。ビューアはこれを「この [[llOwnerSay/ja|llOwnerSay]]() メッセージの全文が、1つ以上の実行命令を含んでいる」と解釈します。記載上の都合により、コマンドは常に先頭に''''@''''がついた形で示されています。しかし、複数のコマンドを含むメッセージのそれぞれのコマンドの先頭に''''@''''をつけるのは誤りで、2個目以降のコマンドは正常に実行されません。


歴史的な注釈: '''1.10''' より前のバージョンでは、RLV は1つのメッセージにつきただ1つのコマンドだけを書くことができました。'''1.10''' のバージョンで、RLV に対応していないビューアを使用しているユーザにメッセージをスパムすることにならないように、1つのメッセージに複数のコマンドを書くことができるようになりました。
歴史的な注釈: '''1.10''' より前のバージョンでは、RLV は1つのメッセージにつきただ1つのコマンドだけを書くことができました。'''1.10''' のバージョンで、RLV に対応していないビューアを使用しているユーザにメッセージをスパムすることにならないように、1つのメッセージに複数のコマンドを書くことができるようになりました。
Line 31: Line 33:
'''注意''' 例外があるコマンド、例えば @sendim や @sendchannel などですが…。  @(rule):(exception)=n は正確には(かつ、単刀直入に言うと)既にあるルールに '''例外を追加します''' 。例えば、@sendchannel:1=n はチャネル1での発言を '''許可します'''。これは、スクリプターが陥る少なくとも2つの混乱の元となっていました。 =add (=n と同義) と =rem (=y と同義) は、それぞれ、例外の追加と削除のために存在します。こちらを使ってください。
'''注意''' 例外があるコマンド、例えば @sendim や @sendchannel などですが…。  @(rule):(exception)=n は正確には(かつ、単刀直入に言うと)既にあるルールに '''例外を追加します''' 。例えば、@sendchannel:1=n はチャネル1での発言を '''許可します'''。これは、スクリプターが陥る少なくとも2つの混乱の元となっていました。 =add (=n と同義) と =rem (=y と同義) は、それぞれ、例外の追加と削除のために存在します。こちらを使ってください。


{{hint|mode=warning|desc=これらの挙動はセション間で引き継がれることは '''ありません''' 。オブジェクトの [[UUID]] は [[rez]] のたびに変わるため、オブジェクトの状態(取り外し不能、IM禁止など...)が変化したときにそうするように、オブジェクトは [[on_rez]]() イベントの中で状態を再送信 ''しなければなりません'' 。}}
{{hint|mode=warning|desc=これらの挙動はセション間で引き継がれることは '''ありません''' 。オブジェクトの [[UUID]] は [[rez]] のたびに変わるため、オブジェクトの状態(取り外し不能、IM禁止など...)が変化したときにそうするように、オブジェクトは [[on_rez/ja|on_rez]]() イベントの中で状態を再送信 ''しなければなりません'' 。}}


==コマンド一覧==
==コマンド一覧==


''Note : These commands are not case-sensitive but are spacing-sensitive. In other words, "@detach = n" will '''not''' work.''
注意: これらのコマンドは大文字小文字を区別しませんが、スペースは区別します。言い換えると、"@detach = n" は動作 '''しません''' 。
 
'''表記について:''' [角括弧] のパラメタは任意指定で省略可能です。パイプ (|) やスラッシュ (/) で区切られているオプションは、どれか一つを指定しなければならないものです。<山括弧> のパラメタは必須です。
 
* '''''自動バージョンチェック''''' : "@version=<channel_number>"
''実装 v1.0b''
搭載している RLV のバージョンをビューアに <channel_number> のチャネルで直ちに発言させ、スクリプトが拾えるようにします。常に正の値を使用してください。通常のビューアは何も回答しないので、必ずタイムアウト後にリスナーを削除するようにしてください。
 
'''警告''' : ログインすると、全てのアタッチメントの [[on_rez/ja|on_rez]] イベントはアバターが実質的にチャットメッセージを送ることができるようになる前に発生します (だいたいログインのプログレスバーが半分までいったぐらいの時点です) 。このため、ビューアから自動返答を受け取るために、タイムアウトは 30 秒から 1 分ぐらいの充分に長い時間にしなければなりません。
 
'''警告2''' : 2010年2月22日、Linden Lab はサードパーティ・ビューアの指針を発表し、サードパーティ・ビューアの名前の中に "Life" という文字を使用することを禁止しました。このため "Restrained Life" は"Restrained Love" に名前を変えざるをえませんでした。しかし、互換性維持の観点から、この @version コマンドは動作しますし、今後も動作します。しかし、新しく書くスクリプトではこれを '''使用せず''' 、ユーザに "Restrained Life" という文字をどこにも '''見せない''' ようにすることを推奨します。新しく書くスクリプトには、 代わりに @versionnew を使用してくださるようお願いします。
 
 
* '''''自動バージョンチェック''''' : "@versionnew=<channel_number>"
''実装 v1.23''
搭載している RLV のバージョンをビューアに <channel_number> のチャネルで直ちに発言させ、スクリプトが拾えるようにします。常に正の値を使用してください。通常のビューアは何も回答しないので、必ずタイムアウト後にリスナーを削除するようにしてください。
 
このコマンドは @version の後継で取って代わるものです。それでも、 @version は下位互換性のために維持されています。これは "RestrainedLove viewer v... (SL ...)" と返します("RestrainedLove" は 1 語です)。
 
'''警告''' : ログインすると、全てのアタッチメントの [[on_rez/ja|on_rez]] イベントはアバターが実質的にチャットメッセージを送ることができるようになる前に発生します (だいたいログインのプログレスバーが半分までいったぐらいの時点です) 。このため、ビューアから自動返答を受け取るために、タイムアウトは 30 秒から 1 分ぐらいの充分に長い時間にしなければなりません。
 


* '''''Automated version checking''''' : "@version=<channel_number>"
* '''''自動バージョン番号チェック''''' : "@versionnum=<channel_number>"
''Implemented in v1.0b''
''実装 v1.21''
Makes the viewer automatically say its version 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.
ビューアにバージョンを <channel_number> のチャネルで直ちに発言させ、スクリプトが拾えるようにします。常に正の値を使用してください。通常のビューアは何も回答しないので、必ずタイムアウト後にリスナーを削除するようにしてください。このコマンドは @version よりは扱いやすいです。スクリプトがレスポンスを解析することがない分、番号をすぐに取得します。


'''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.
バージョン番号は純粋な integer で、ビューアのバージョンを表しています。バージョンが X.Y.Z.P ならば、番号は X.10^6 + Y.10^4 + Z.10^2 + P になります。例えば、.21.1 は 1210100 になります。


'''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.


* '''''自動バージョンチェック、第二の方法''''' : llGetAgentLanguage (key id) '''''廃止: 使用しないでください!'''''
''実装 v1.16''
この LSL 関数を呼び出すと、結果がすぐに返ります (リスナーやタイマーを使用する必要はありません)。これは、"@version" を送信した場合とまったく同じで、ユーザによって隠されることがありません。通常の SL ビューアから返される言語表記、"en-us", "fr", "ko" などはこの文字列で上書きされます。もしくはユーザが言語設定を隠すようにしている場合、何も返りません。通常のビューアではオプションとなっているため、スクリプトはこれを信用して使っていません。なので、この特性を RLV のバージョンチェックのより便利な代替手段になるように「ハイジャックする」のが理にかなっています。重要な注意点:この機能は RestrainedLove が v1.16 であっても、v1.21 以前のバージョンには実装できないため、llGetAgentLanguage() が空文字列で返ってきた場合は常に @version をあてにするようにしてください。これも注意点: RestrainedLove 1.16 では、llGetAgentLanguage() は、ログイン中に on_rez で呼ばれた場合、呼び出しが何秒か (何秒かは決まってません) 遅れることがなければ、空文字列を返します。最後の注意点: この機能はv1.16.1(とv1.16b、 Cool SL Viewerの場合) で削除されました。


* '''''Automated version checking''''' : "@versionnew=<channel_number>"
''Implemented in v1.23''
Makes the viewer automatically say its version 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).
* '''''手動バージョンチェック''''' : "@version"
''実装 v1.0a''
このコマンドはアバターからユーザに IM で送信されなければなりません (オブジェクトからはうまくいきません)。ビューアは送信者に自動的にバージョンを返答しますが、ユーザの IM 窓にはメッセージも回答も表示されないため、すごくこそこそしています。


'''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.


* '''''オブジェクトを取り外し可能/不可能にする''''' : "@detach=<y/n>"
''実装 v1.0a''
"n" オプションで呼ばれると、メッセージを送信したオブジェクト (アタッチメントである必要があります) は取り外し不可能となります。"y" オプションで呼ばれると、取り外し可能に戻ります。


* '''''Automated version number checking''''' : "@versionnum=<channel_number>"
''Implemented in v1.21''
Makes the viewer automatically say its version number 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.
* '''''装着ポイントをロック解除/ロックする''''' : "@detach:<attach_point_name>=<y/n>"
''実装 v1.20''
"n" オプションで呼ばれると、<attach_point_name> で示された装着ポイントは、full (その時点でオブジェクトが装着されている) でも empty (装着されていない) でもロックされます。制約がかかった時点でそのポイントに装着されているオブジェクトは、取り外し不能とされます。これは、"@detach=n" コマンド自体が発行されたのとちょうど同じような感じです。装着ポイントが空であればその状態のままとなり、いかなるアイテムもそこに装着することができなくなり、llAttachToAvatar() が呼び出されると失敗するようになります (オブジェクトは装着されますが、すぐに取り外されます) 。




* '''''Automated version checking, second way''''' : llGetAgentLanguage (key id) '''''DEPRECATED: DO NOT USE !'''''
* '''''装着ポイントを empty でロック解除/ロックする''''' : "@addattach[:<attach_point_name>]=<y/n>"
''Implemented in v1.16''
''実装 v1.22''
When calling this LSL function, the result is obtained immediately (no need to use a listener and a timer), is exactly equal to the one given by "@version" and cannot be hidden by the user. This string takes the place of the language returned by the regular SL viewer, which could answer values like "en-us", "fr", "ko" etc. Or nothing at all, if the user chose to hide their language setting. Being optional in the regular viewer, it cannot be trusted by a script, so "hijacking" this feature for the much more useful synchronous version checking in the RLV makes sense. IMPORTANT NOTE: this feature cannot be implemented in viewers prior to v1.21, even when they do implement RestrainedLove v1.16, so make sure you do fall back to the @version method whenever llGetAgentLanguage() returns an empty string. ALSO NOTE: In RestrainedLove 1.16, llGetAgentLanguage() will return an empty string when called by on_rez during login unless the call is delayed by several seconds (how many seconds may vary). FINAL NOTE: This feature was removed from v1.16.1 (and v1.16b, for the Cool SL Viewer).
"n" オプションで呼ばれると、<attach_point_name> で示された装着ポイントは empty でロックされます。制約がかかった時点で装着ポイントに装着されているオブジェクトは取り外し可能ですが、そこに何も装着することができません。装着ポイントが空であればその状態のままとなり、いかなるアイテムもそこに装着することができなくなり、llAttachToAvatar() が呼び出されると失敗するようになります (オブジェクトは装着されますが、すぐに取り外されます) 。<attach_point_name> の指定がない場合、全ての装着ポイントに対して作用します。このコマンドは @addoutfit の片割れで、アタッチメントに対するものです。




* '''''Manual version checking''''' : "@version"
* '''''装着ポイントを full でロック解除/ロックする''''' : "@remattach[:<attach_point_name>]=<y/n>"
''Implemented in v1.0a''
''実装 v1.22''
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.
"n" オプションで呼ばれると、<attach_point_name> で示された装着ポイントは full でロックされます。制約がかかった時点でそのポイントに装着されているオブジェクトは、取り外し不能とされます。装着ポイントが空であればユーザは何かを装着することができますが、そのオブジェクトは取り外し不能となり、いかなるアイテムに取り替えることもできなくなり、llAttachToAvatar() が呼び出されると失敗するようになります (オブジェクトは装着されますが、すぐに取り外されます) 。<attach_point_name> の指定がない場合、全ての装着ポイントに対して作用します。このコマンドは @remoutfit の片割れで、アタッチメントに対するものです。




* '''''Render an object detachable/nondetachable''''' : "@detach=<y/n>"
* '''''コンテキストメニューからの「装着」を許可/禁止する''''' : "@defaultwear=<y/n>
''Implemented in v1.0a''
''実装 v1.21''
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.
許可すると、ユーザはいつでもインベントリのコンテキストメニューから「装着」メニューを選ぶことができます。オブジェクトがアバター上でロックされていてもです。これはロックされているオブジェクトをないがしろにするリスクがありますが、5 秒以内に自動的に再装着されます (他に同じようにロックされているオブジェクトがあったら、再装着すべきものがなくなるまで、 1 秒おきに順次行われます) 。しかしながら、デタッチの際に制約を解除するようにスクリプトが組まれたオブジェクト、言い換えると、RLV を使用していればロックされているオブジェクトもデタッチされる可能性があるという事実を考慮していないものもあります。


そのため、このコマンドを "n" オプションで呼び出せばこのメニューは抑制されるものの、名前かフォルダ名に装着先ポイント名称が含まれているオブジェクトは装着できるようになっています。1.21 以前の RLV とちょうど同じように。これはユーザにはちょっと扱いにくい仕様ですが、ロックされているオブジェクトがうっかりデタッチされてしまうことのないようにしなければならないことを考えると、こちらのほうが安全です。


* '''''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).


* '''''プライベートチャネルでの通知を開始/停止する''''' : "@notify:<channel_number>[;word]=<rem/add>"
''実装 v1.20, improved in v2.2 (and v1.24)''
全ての制約、もしくはセミコロン (";") の後に指定された単語を含んだ名称をもつ制約の追加削除を、ビューアに特定のチャネルで自動的に復唱させます。<channel_number> のプライベートチャネルに返される内容は、他のスクリプトに意図しないコマンドを送ってしまわないように、先頭にスラッシュ ("/") がついています。そして、等号 ("=") の後に、 "n" か "y" がついており、それぞれ制約の追加と削除を示しています。"@clear" コマンドは等号を付加しません。他のスクリプトについての情報が無防備に開示されるのを避けるため、どのオブジェクトが制約を付加したのか撤廃したのかを知ることはできません。one-shot コマンド (force コマンド) も復唱しません。例えば、"@notify:2222;detach=add" はオブジェクトがロックされるたびに "/detach=n" を送信し、オブジェクトのロックが解除されるたびに "/detach=y" を送信します。チャネル 2222 でスクリプトがこれらを受信することになります。


* '''''Unlock/Lock an attachment point empty''''' : "@addattach[:<attach_point_name>]=<y/n>"
注意 : v2.2 (と v1.24) からは、インベントリの提供時に表示するメッセージを設定できるようになっています。オブジェクトがアイテムやフォルダを提供すると、RLV v2.2 (と v1.24) 以上を使用しているユーザは指定されたチャネルで以下のどれかで自動応答します。
''Implemented in v1.22''
- /accepted_in_rlv inv_offer <folder> : このフォルダは受け取られ、 #RLV 配下に格納されて使用可能な状態になっています (ビューアはフォルダを変名して、頭にある "#RLV/" を削除してしまいますのでご注意ください) 。
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.
- /accepted_in_inv inv_offer <folder> : このフォルダは受け取られましたが、まだ共有されていません。
- /declined inv_offer <folder> : このフォルダは受取拒否されたか、"ブロック"(かつての "ミュート") を押されたかしました。


<folder> はフォルダやアイテムの受取先のフルパスです。例えば、#RLV/~MyCuffs のようになっています。"inv_offer" の前にはスペースがあり、通知を設定しやすいようにトークンになっています。#RLV/~MyCuffs というフォルダが #RLV フォルダに受け取られたか知りたいのであれば、"@notify:2222;accepted_in_rlv inv_offer #RLV/~MyCuffs=add" というコマンドを発行してください。アバターが何か受け取ったか知りたいのであれば、"@notify:2222;inv_offer=add" とコマンドを発行すればよいです。


* '''''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.


* '''''チャットを許可/禁止する''''' : "@sendchat=<y/n>"
''実装 v1.0b''
禁止されると、チャネル 0 でタイプされたものは全て無視されます。しかし、スラッシュ ('/') で始まる emote やメッセージは、それぞれ 30 文字と 15 文字に丸められて通過します (以後変更になる可能性があります) 。()"-*=_^ のような特殊文字が入るメッセージは送信できず、読み捨てられます。ピリオド ('.') が現れると、以降のメッセージは切り捨てられます。


* '''''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.
* '''''emote の丸めを行わない/行う''''' : "@emote=<rem/add>"
''実装 v1.01''
この例外が追加されると、emote は丸められなくなります (しかし、特殊文字が読み捨てられることには変わりありません) 。




* '''''Start/stop notifications on a private channel''''' : "@notify:<channel_number>[;word]=add/rem"
* '''''shout を許可する/しない''''' : "@chatshout=<y/n>"
''Implemented in v1.20''
''実装 v1.15''
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.
禁止されると、アバターが shout したときでも、通常の範囲のチャットとなります。メッセージを変更することは全くなく、範囲だけを変更します。




* '''''Allow/prevent sending chat messages''''' : "@sendchat=<y/n>"
* '''''普通の声の大きさで話すことを許可する/しない''''' : "@chatnormal=<y/n>"
''Implemented in v1.0b''
''実装 v1.15''
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.
禁止されると、アバターが普通にチャットしたときでも、whisper となります。メッセージを変更することは全くなく、範囲だけを変更します。




* '''''Remove/add an exception to the emote truncation above''''' : "@emote=<rem/add>"
* '''''whisper を許可する/しない''''' : "@chatwhisper=<y/n>"
''Implemented in v1.01''
''実装 v1.15''
When adding this exception, the emotes are not truncated anymore (however, special signs will still discard the message).
禁止されると、アバターが whisper したときでも、通常の範囲のチャットとなります。メッセージを変更することは全くなく、範囲だけを変更します。




* '''''Allow/prevent shouting''''' : "@chatshout=<y/n>"
* '''''パブリックなチャットをプライベートチャネルにリダイレクトする''''' : "@redirchat:<channel_number>=<rem/add>"
''Implemented in v1.15''
''実装 v1.16''
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.
有効になると、この制約はパブリックチャネル ("/0") で話した内容を全てオプションで指定されたプライベートチャネルにリダイレクトします。複数の制約がかかると、チャットのメッセージはそれぞれのチャネルにリダイレクトされるようになります。これは emote には適用されず、話している時にアニメーション (タイプ開始、終了、うなずき) が実行されなくなります。この制約は @sendchannel に取って代わるものではありません。


'''注意:''' RLV v1.22.1 / RLVa 1.1.0 の時点では、@redirchat はチャネル 0 では emote が転送されなくなるというバグがありました。@emote=add を別に発行すると、これを回避できます。このバグは、v1.23.0 までに修正されたようです。


* '''''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.


* '''''オープンな emote をプライベートチャネルにリダイレクトする''''' : "@rediremote:<channel_number>=<rem/add>"
''実装 v1.19''
有効になると、この制約はブリックチャネル ("/0") で話した emote を全てオプションで指定されたプライベートチャネルにリダイレクトします。複数の制約がかかると、emote はそれぞれのチャネルにリダイレクトされるようになります。


* '''''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.


* '''''インスタントメッセージの送信を許可する/しない''''' : "@sendim=<y/n>"
''実装 v1.0b''
禁止されると、IM で入力した内容は全て破棄され、受信者には代わりにわけのわからないメッセージが送信されます。


* '''''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.


* '''''インスタントメッセージの送信を許可する/しない(セキュリティ強化)''''' : "@sendim_sec=<y/n>"
''実装 v1.21''
禁止されると、IM で入力した内容は全て破棄され、受信者には代わりにわけのわからないメッセージが送信されます。このコマンドは、先のコマンドと違い、全てのオブジェクトからでなく、同じオブジェクトから発行された例外のみ受け付けます。


* '''''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.


* '''''インスタントメッセージの送信制限の例外を追加/削除する''''' : "@sendim:<UUID>=<rem/add>"
''実装 v1.01''
例外を追加すると、コマンドで指定された [[UUID]] のユーザは 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.


* '''''指定した人へのインスタントメッセージの送信を許可/禁止する''''' : "@sendimto:<UUID>=<y/n>"
''実装 v2.3 と v1.25''
禁止されると、指定した人に IM で入力した内容は全て破棄され、受信者には代わりにわけのわからないメッセージが送信されます。


* '''''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.


* '''''チャットメッセージの受信を許可/禁止する''''' : "@recvchat=<y/n>"
''実装 v1.0b''
禁止されると、パブリックチャットで受信した内容は emote を除いて全て破棄されます。


* '''''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.


* '''''チャットメッセージの受信を許可/禁止する(セキュリティ強化)''''' : "@recvchat_sec=<y/n>"
''実装 v1.21''
禁止されると、パブリックチャットで受信した内容は emote を除いて全て破棄されます。このコマンドは、先のコマンドと違い、全てのオブジェクトからでなく、同じオブジェクトから発行された例外のみ受け付けます。


* '''''Allow/prevent receiving chat messages''''' : "@recvchat=<y/n>"
''Implemented in v1.0b''
When prevented, everything heard in public chat will be discarded except emotes.


* '''''チャットメッセージの受信制限に例外を追加/削除する''''' : "@recvchat:<UUID>=<rem/add>"
''実装 v1.01''
例外を追加すると、コマンドで指定された [[UUID]] のユーザからのチャットメッセージを聞けるようになります。当該アバターの制約のみ上書きします。
(例外の数に制限はありません) 使用しなくなったら必ず削除してください。


* '''''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.


* '''''指定した人からのチャットメッセージの受信を許可/禁止する''''' : "@recvchatfrom:<UUID>=<y/n>"
''実装 v2.3 と v1.25''
禁止されると、指定したアバターからパブリックチャットで受信した内容は emote を除いて全て破棄されます。


* '''''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.


* '''''emote の表示を許可/禁止する''''' : "@recvemote=<y/n>"
''実装 v1.19''
禁止されると、パブリックチャットでの全ての emote が破棄されます。


* '''''Allow/prevent seeing emotes''''' : "@recvemote=<y/n>"
''Implemented in v1.19''
When prevented, every emote seen in public chat will be discarded.


* '''''emote の表示を許可/禁止する(セキュリティ強化)''''' : "@recvemote_sec=<y/n>"
''実装 v1.21''
禁止されると、パブリックチャットでの全ての emote が破棄されます。このコマンドは、先のコマンドと違い、全てのオブジェクトからでなく、同じオブジェクトから発行された例外のみ受け付けます。


* '''''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.


* '''''emote の表示制限に例外を追加/削除する''''' : "@recvemote:<UUID>=<rem/add>"
''実装 v1.19''
例外を追加すると、コマンドで指定された [[UUID]] のユーザからの emote を見ることができるようになります。当該アバターの制約のみ上書きします。
(例外の数に制限はありません) 使用しなくなったら必ず削除してください。


* '''''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.


* '''''インスタントメッセージの受信を許可/禁止する''''' : "@recvim=<y/n>"
''実装 v1.0b''
禁止されると、受信した IM は全て破棄され、送信者にはメッセージを読むことのできない旨の通知が送信されます。


* '''''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.


* '''''インスタントメッセージの受信を許可/禁止する(セキュリティ強化)''''' : "@recvim_sec=<y/n>"
''実装 v1.21''
禁止されると、受信した IM は全て破棄され、送信者にはメッセージを読むことのできない旨の通知が送信されます。このコマンドは、先のコマンドと違い、全てのオブジェクトからでなく、同じオブジェクトから発行された例外のみ受け付けます。


* '''''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.


* '''''インスタントメッセージの受信制限に例外を追加/削除する''''' : "@recvim:<UUID>=<rem/add>"
''実装 v1.01''
例外を追加すると、コマンドで指定された [[UUID]] のユーザからのインスタントメッセージを読むことができるようになります。当該アバターの制約のみ上書きします。
(例外の数に制限はありません) 使用しなくなったら必ず削除してください。


* '''''Remove/add exceptions to the chat 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.


* '''''指定した人からのインスタントメッセージの受信を許可/禁止する''''' : "@recvimfrom:<UUID>=<y/n>"
''実装 v2.3 と v1.25''
禁止されると、指定した人から受信した IM は全て破棄され、送信者にはメッセージを読むことのできない旨の通知が送信されます。


* '''''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.


* '''''ランドマークへのテレポートを許可/禁止する''''' : "@tplm=<y/n>"
''実装 v1.0''
禁止されると、 ユーザはランドマーク、プロフィールの Picks、その他の手段を使って、事前に設定されている場所へテレポートすることができなくなります。


* '''''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.


* '''''場所へのテレポートを許可/禁止する''''' : "@tploc=<y/n>"
''実装 v1.0''
禁止されると、ユーザは地図やその他の手段を使った、座標指定によるテレポートができなくなります。


* '''''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.


* '''''フレンドからの呼び出しによるテレポートを許可/禁止する''''' : "@tplure=<y/n>"
''実装 v1.0''
禁止されると、ユーザは全てのテレポートの誘いを自動で拒否し、招待者に通知されます。


* '''''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.


* '''''フレンドからの呼び出しによるテレポートを許可/禁止する(セキュリティ強化)''''' : "@tplure_sec=<y/n>"
''実装 v1.21''
禁止されると、ユーザは全てのテレポートの誘いを自動で拒否し、招待者に通知されます。このコマンドは、先のコマンドと違い、全てのオブジェクトからでなく、同じオブジェクトから発行された例外のみ受け付けます。


* '''''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.


* '''''フレンドからの呼び出しによるテレポートの制限に例外を追加/削除する''''' : "@tplure:<UUID>=<rem/add>"
''実装 v1.0''
例外を追加すると、コマンドで指定された [[UUID]] のユーザから招待を受けてテレポートすることができるようになります。当該アバターの制約のみ上書きします。
(例外の数に制限はありません) 使用しなくなったら必ず削除してください。


* '''''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).


* '''''Sit によるテレポートを制限/制限解除する''''' : "@sittp=<y/n>"
''実装 v1.0''
制限されると、アバターは 1.5 m 以内に近づかないとプリムにすわれないようになります。これでアバターが壁をすり抜けられないようにすることで、檻を強固なものにすることができます(プリムがすぐそばにないことが条件です)。


* '''''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 !
* '''''座った位置と違う位置で立ち上がることを許可/禁止する''''' : @standtp=<y/n>
''実装 v2.1.2 と v1.24''
この制限が有効になっている状態でアバターが立ち上がると、座った位置に自動的に引き戻されます。この制限を有効にすると、「最後に立っていた位置」も記録されますので、ひったくりの類で、被害者を座らせて、引きずって檻の中に閉じ込め、そこで制限を有効にして、被害者を立たせた場合は、大丈夫です。この場合、アバターは檻の中にいます。




* '''''Clear all the rules tied to an object''''' : "@clear"
* '''''許可の例外を許可する/拒否する''''' : "@permissive=<y/n>"
''Implemented in v1.0a, but working only since v1.04a''
''実装 v1.21''
This command clears all the restrictions and exceptions tied to a particular [[UUID]].
拒否すると、全ての制限は(あれば)セキュリティ強化となります。つまり、制限に対する、同じオブジェクトから発行されていない例外は無視されます。
セキュリティ強化でない制限 (@sendim や @recvim などの元々のバージョン) を使っていたり、 @permissive を使っていなかったりすると、他のオブジェクトから発行された例外で当該アバターが救われるようになってしまいます。


'''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.
'''注意''' : このコマンド (または、セキュリティが強化されたコマンド) を使うと他のオブジェクトから発行された例外は (そのオブジェクトの主要な機能であっても) 何の通知もなしに破棄されます。このため、この制約が有効になっていると、製品によっては動作しなくなったように見えることもあります。例えば、指定したフレンドに常に IM を送信することのできるようにする製品は、他のオブジェクトから @sendim_sec や @permissive コマンドを送信されると、壊れたような挙動を示したりします。このため、これは気をつけて使うようにし、あなたが作った製品がどんなに堅牢かを
知ってもらうようにしましょう。


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"
''実装 v1.0a、ただし動作するのは v1.04a から''
このコマンド特定の [[UUID]] に紐づいた、全ての制約や例外を消去します。


* '''''Clear a subset of the rules tied to an object''''' : "@clear=<string>"
'''警告''' : デフォルトでデタッチの際に発動することになっていると、@defaultwear が有効の場合に自動的に再装着がされないことがあります。@clear @detach=n 制約も解除してしまうので、そのアイテムが default-wear-action によってたまたまデタッチされてしまったとビューアが思い込み、再装着しなくなるからです。
''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


考えられる回避方法:
::* @clear=<pattern> で、追加した制約だけを解除する
::* アタッチメントがロックされていないと確信できる場合にだけ、デタッチの際に @clear を発動させる
::* @clear はどんな場合も発動させず、ビューアが制約を回収するまで待つ


* '''''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.


* '''''オブジェクトに紐づいた一部のルールを消去する''''' : "@clear=<string>"
''実装 v1.0a、ただし動作するのは v1.04a から''
このコマンド特定の [[UUID]] に紐づいた、<string> という名前をもつ制約や例外を消去します。良い例として、"@clear=tp" があります。これはオブジェクトに紐づいた全ての [[teleport]] 制約と例外を消去します。一方で、"@clear=tplure" は友人によるテレポートを許可しない制約のみを消去します。


* '''''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=<y/n>"
''実装 v1.03''
オブジェクトの編集・オープンを禁止されると、建造・編集ウィンドウは開かなくなります。


* '''''Allow/prevent wearing clothes''''' : @addoutfit[:<part>]=<y/n>
''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
If part is not specified, prevents from wearing anything beyond what the avatar is already wearing.


* '''''編集制限に例外を追加/削除する''''' : "@edit:<UUID>=<rem/add>"
''実装 v2.3 と v1.25''
例外を追加すると、ユーザは指定したオブジェクトの編集・オープンができるようになります。


* '''''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''
Where part is :
gloves|jacket|pants|shirt|shoes|skirt|socks|underpants|undershirt|skin|eyes|hair|shape
If part is not specified, prevents from removing anything in what the avatar is wearing.


* '''''持ち物の rez を許可/禁止する''''' : "@rez=<y/n>"
''実装 v1.03''
持ち物の rez を禁止されると、オブジェクトの作成・削除・持ち物からのドロップ・アタッチメントのドロップは失敗します。


* '''''Force removing clothes''''' : @remoutfit[:<part>]=force (*) (teens can't be forced to remove underpants and undershirt)
''Implemented in v1.10''
Where part is :
gloves|jacket|pants|shirt|shoes|skirt|socks|underpants|undershirt|skin|eyes|hair|shape
If part is not specified, removes everything.


* '''''指定したオブジェクトの編集を許可/禁止する''''' : "@editobj:<UUID>=<y/n>"
'実装 v2.3 と v1.25''
禁止されると、指定したオブジェクトの編集・オープンしようとしても、建造・編集ウィンドウは開かなくなります。


* '''''Force removing attachments''''' : @detach[:attachpt]=force (*)  
 
''Implemented in v1.10''
* '''''服の装着を許可/禁止する''''' : @addoutfit[:<part>]=<y/n>
Where part is :
''実装 v1.10, スキン、髪、目の追加 v1.10.1''
指定できるパーツ :
gloves|jacket|pants|shirt|shoes|skirt|socks|underpants|undershirt|skin|eyes|hair|shape|alpha|tattoo
パーツの指定がない場合、現在装着しているものの他に何も装着することができなくなります。
 
'''注意:''' Viewer 2.0 から、スキンのレイヤーが2つ増えました: Tatoo (タトゥー) と Avatar Transparency Mask (透明マスク) です。arpha と tatoo のレイヤーは、Viewer 2.0 の機能を実装した RLV 対応ビューアでのみサポートします。
 
 
* '''''脱衣を許可/禁止する''''' : @remoutfit[:<part>]=<y/n> (underpants と undershirt  はティーンに許可できません)
''実装 v1.10, スキン、髪、目の追加 v1.10.1''
指定できるパーツ :
gloves|jacket|pants|shirt|shoes|skirt|socks|underpants|undershirt|skin|eyes|hair|shape|alpha|tattoo
パーツの指定がない場合、現在装着しているものは何も外すことができなくなります。
 
'''注意:''' Viewer 2.0 から、スキンのレイヤーが2つ増えました: Tatoo (タトゥー) と Avatar Transparency Mask (透明マスク) です。arpha と tatoo のレイヤーは、Viewer 2.0 の機能を実装した RLV 対応ビューアでのみサポートします。
 
 
* '''''強制的に服を脱がす''''' : @remoutfit[:<part>]=force (*) (underpants と undershirt  はティーンに脱がせることはできません)
''実装 v1.10''
指定できるパーツ :
gloves|jacket|pants|shirt|shoes|skirt|socks|underpants|undershirt|alpha|tattoo
パーツの指定がない場合、全て脱がします。
 
'''注意:''' Viewer 2.0 から、スキンのレイヤーが2つ増えました: Tatoo (タトゥー) と Avatar Transparency Mask (透明マスク) です。arpha と tatoo のレイヤーは、Viewer 2.0 の機能を実装した RLV 対応ビューアでのみサポートします。
 
'''注意:''' スキン、シェイプ、目、髪は体の一部のため、取り外すことができません。 (そして、全て脱がすということは、アバターを見えなくすることになります)
 
 
* '''''強制的にアタッチメントを取り外す''''' : @detach[:attachpt]=force (*)  
''実装 v1.10''
指定できるパーツ :
  chest|skull|left shoulder|right shoulder|left hand|right hand|left foot|right foot|spine|
  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|
  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|
  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
  right pec|center 2|top right|top|top left|center|bottom left|bottom|bottom right
If part is not specified, removes everything.
パーツの指定がない場合、全て取り外します。




* '''''Force removing attachments (alias)''''' : @remattach[:attachpt]=force (*)  
* '''''強制的にアタッチメントを取り外す (エイリアス)''''' : @remattach[:attachpt]=force (*)  
''Implemented in v1.22''
''実装 v1.22''
This command is an alias to @detach[:attachpt]=force (to keep things consistent).
このコマンドは @detach[:attachpt]=force のエイリアスです。(下位互換性維持のために存在します)




* '''''Get the list of worn clothes''''' : @getoutfit[:part]=<channel_number>
* '''''装着している服の一覧を取得する''''' : @getoutfit[:part]=<channel_number>
''Implemented in v1.10, added skin hair and eyes in v1.10.1''
''実装 v1.10, スキン、髪、目の追加 v1.10.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. Always use a positive integer. Remember that regular viewers do not answer anything at all so remove the listener after a timeout.
ビューアに自動的に現在の服のレイヤの使用状況を回答させます。結果は 0() か 1(使用中) の並びで、チャネル <channel_number> ですぐに回答され、スクリプトでそれを拾うことができます。常に正の整数を使用してください。通常のビューアは何も回答しないので、必ずタイムアウト後にリスナーを削除するようにしてください。


The list of 0s and 1s corresponds to :
0 と 1 の並びは順に次の項目に対応します。
  gloves,jacket,pants,shirt,shoes,skirt,socks,underpants,undershirt,skin,eyes,hair,shape
  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.
パーツが指定されると、パーツにより 0() 1(使用中) だけが回答されます。
  Ex 1 : @getoutfit=2222 => "0011000111" => avatar is wearing pants, shirt, underpants and undershirt, and of course a skin.
  1 : @getoutfit=2222 => "0011000111" => アバターは pants, shirt, underpants, undershirt, skin を装着しています。
  Ex 2 : @getoutfit:socks=2222 => "0" => the avatar is not wearing socks.
  2 : @getoutfit:socks=2222 => "0" => アバターは socks を履いていません。
 
'''注意:''' Viewer 2.0 の機能を実装しているビューアでは、このような並びになります:
 
gloves,jacket,pants,shirt,shoes,skirt,socks,underpants,undershirt,skin,eyes,hair,shape,alpha,tattoo




* '''''Get the list of worn attachments''''' : @getattach[:attachpt]=<channel_number>
* '''''装着しているアタッチメントの一覧を取得する''''' : @getattach[:attachpt]=<channel_number>
''Implemented in v1.10''
''実装 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.
ビューアに自動的に現在のアタッチメント装着ポイントの使用状況を回答させます。結果は 0() か 1(使用中) の並びで、チャネル <channel_number> ですぐに回答され、スクリプトでそれを拾うことができます。常に正の整数を使用してください。通常のビューアは何も回答しないので、必ずタイムアウト後にリスナーを削除するようにしてください。


The list of 0s and 1s corresponds to :
0 と 1 の並びは順に次の項目に対応します。
  none,chest,skull,left shoulder,right shoulder,left hand,right hand,left foot,right foot,spine,
  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,
  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,
  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
  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.
パーツが指定されると、パーツにより 0() 1(使用中) だけが回答されます。
  Ex 1 : @getattach=2222 => "011000011010000000000000100100000000101" => avatar is wearing attachments on
  1 : @getattach=2222 => "011000011010000000000000100100000000101" => アバターは
  chest, skull, left and right foot, pelvis, l and r lower leg, HUD bottom left and HUD bottom right.
  chest, skull, left and right foot, pelvis, l and r lower leg, HUD bottom left, HUD bottom right に装着しています。
  Ex 2 : @getattach:chest=2222 => "1" => avatar is wearing something on the chest.
  2 : @getattach:chest=2222 => "1" => アバターは chest に何か装着しています。
 
''注意'' : 最初の文字 ("none") は常に '0' なので、それぞれの装着ポイントのインデックスは LSL の対応する ATTACH_* 定数と'''完全に一致'''します。例えば、インデックス 9 を示す定数は ATTACH_BACK ("spine") となります。インデックスが 0 で始まるので気をつけてください。
 
 
* '''''ビューアにアタッチメントの受け入れとコントロール権取得の許可を出させる''''' : @acceptpermission=<rem/add>
''実装 v1.16''
アバターに自動的にアタッチメントとコントロール権取得を受け入れさせます。確認ダイアログは表示されません。もちろん、このコマンドよりも @denypermission のほうが優先度が高くなります。
 
 
* '''''アタッチメントの受け入れとコントロール権取得を許可/禁止する''''' : @denypermission=<rem/add>
''実装 v1.16, 非推奨化 v1.16.2''
禁止されると、全ての装着・コントロール権取得のリクエストが自動的に拒否されます。確認ダイアログは表示されません。
かなり迷惑をかけるのと、v1.16.1 でロックされたオブジェクトは自動的に再装着されるようになったという理由から、このコマンドは今では非推奨となりました。使用しないでください。
 
 
* '''''持ち物の使用を許可/禁止する''''' : @showinv=<y/n>
''実装 v1.10''
持ち物ウィンドウを強制的に閉じ、開かないようにします。
 
 
* '''''ノートカードの閲覧を許可/禁止する''''' : @viewnote=<y/n>
''実装 v1.10''
ノートカードを開けないようにしますが、既に開いてあるものは閉じません。
 


''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.
* '''''スクリプトの閲覧を許可/禁止する''''' : @viewscript=<y/n>
''実装 v1.22''
スクリプトを開けないようにしますが、既に開いてあるものは閉じません。




* '''''Force the viewer to automatically accept attach and take control permission requests''''' : @acceptpermission=<rem/add>
* '''''テクスチャの閲覧を許可/禁止する''''' : @viewtexture=<y/n>
''Implemented in v1.16''
''実装 v1.22''
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>
* '''''立つことを許可/禁止する''''' : @unsit=<y/n>
''Implemented in v1.16, DEPRECATED in v1.16.2''
''実装 v1.10, v1.15 でテレポートもできないように修正''
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 !
「立ち上がる」ボタンを隠します。v1.15 からは、立つ手段ともなるテレポートもできないようになっています。




* '''''Allow/prevent using inventory''''' : @showinv=<y/n>
* '''''オブジェクトに強制的に座らせる''''' : @sit:<UUID>=force (*)
''Implemented in v1.10''
''実装 v1.10''
Forces the [[inventory]] windows to close and stay closed.
ユーザが Sit によるテレポートを禁止されており、 1.5 m 以上離れている場合、または、立つことを禁止されている場合は無効となります。




* '''''Allow/prevent reading notecards''''' : @viewnote=<y/n>
* '''''強制的に立たせる''''' : @unsit=force (*)
''Implemented in v1.10''
''実装 v1.10''
Prevents from opening [[notecards]] but does not close the ones already open.
言い訳がましいですが、さまざまな事情により失敗することもありますので、今のところ信頼しないでください。もっとテストが必要です。




* '''''Allow/prevent opening scripts''''' : @viewscript=<y/n>
* '''''座ることを許可/禁止する''''' : @sit=<y/n>
''Implemented in v1.22''
''実装 v1.16.2''
Prevents from opening [[scripts]] but does not close the ones already open.
いかなるものの上にも座れないようにします。@sit:UUID=force で指定されているオブジェクトの上にでもです。




* '''''Allow/prevent opening textures''''' : @viewtexture=<y/n>
* '''''指定したチャネル以外のチャネルを使用することを許可/禁止する''''' : @sendchannel[:<channel>]=<y/n>
''Implemented in v1.22''
''実装 v1.10''
Prevents from opening [[textures]] (and snapshots) but does not close the ones already open.
@sendchat の補完コマンドです。このコマンドはユーザがメッセージをパブリックでないチャネルに送信することを禁止します。チャネルが指定されると、当該チャネルには先の制約は適用されません(このため、 "y" や "n" ではなく、"rem" や "add" を使用するほうがいいでしょう)。この制約がかかっていても、ビューアは @version=nnn や @getstatus=nnn などと自動返答することができます。




* '''''Allow/prevent standing up''''' : @unsit=<y/n>
* '''''指定したチャネル以外のチャネルを使用することを許可/禁止する(セキュリティ強化)''''' : @sendchannel_sec[:<channel>]=<y/n>
''Implemented in v1.10, modified in v1.15 to prevent teleporting as well''
''実装 v1.10''
Hides the Stand up button. From v1.15 it also prevents teleporting, which was a way to stand up.
の補完コマンドです。このコマンドはユーザがメッセージをパブリックでないチャネルに送信することを禁止します。チャネルが指定されると、当該チャネルには先の制約は適用されません(このため、 "y" や "n" ではなく、"rem" や "add" を使用するほうがいいでしょう)。この制約がかかっていても、ビューアは @version=nnn や @getstatus=nnn などと自動返答することができます。 このコマンドは、先のコマンドと違い、全てのオブジェクトからでなく、同じオブジェクトから発行された例外のみ受け付けます。




* '''''Force sit on an object''''' : @sit:<UUID>=force (*)
* '''''現在アバターに発行されている制約の一覧を取得する''''' : @getstatus[:<part_of_rule>]=<channel>
''Implemented in v1.10''
''実装 in v1.10, v1.16 でちょっとおかしくなった''
Does not work if the user is prevented from sit-tping and further than 1.5 meters away, or when prevented from unsitting.
ビューアに自動的にアバターに対する制約の適用状況を回答させます。コマンドを実行したオブジェクトが発行した制約のみ回答されます。チャネル <channel_number> ですぐに回答され、スクリプトでそれを拾うことができます。常に正の整数を使用してください。通常のビューアは何も回答しないので、必ずタイムアウト後にリスナーを削除するようにしてください。結果はスラッシュ ('/') で区切られた制約名称のリストとして返却されます。注意: v1.16 からはスラッシュは文字列の先頭であるとみなされるようになっています。llParseString2List() で処理するのであれば大丈夫ですが、llParseStringKeepNulls() で処理する場合はおかしくなります!


このコマンドは、同じオブジェクト内にある違うスクリプトが競合する制約を発行する可能性のあるようなスクリプトを作成している人にとっては役に立ちます(例: サードパーティープラグイン)。他のオブジェクトと競合することはありません。これが、このコマンドで返される制約が、呼び出し元で発行されたものに限定されている理由です。


* '''''Force unsit''''' : @unsit=force (*)
<part_of_rule> は制約名、もしくは制約名の一部です。スクリプトが特定の制約の有無だけを確認したい場合に便利です。
''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.


例 : アバターが tploc, tplure, tplm, sittp の制約下に置かれているとき、スクリプトはこのような回答を得ます:
@getstatus=2222  =>  /tploc/tplure/tplm/sittp
@getstatus:sittp=2222  =>  /sittp
@getstatus:tpl=2222  =>  /tploc/tplure/tplm  ("tpl" は "tploc"、"tplure"、"tplm"  の一部ですが、"sittp" の一部ではないため)


* '''''Allow/prevent sitting down''''' : @sit=<y/n>
''Implemented in v1.16.2''
Prevents the user from sitting on anything, including with @sit:UUID=force.


* '''''現在アバターに発行されているすべての制約の一覧を取得する''''' : @getstatusall[:<part_of_rule>]=<channel>
''実装 v1.15, v1.16 でちょっとおかしくなった''
ビューアに自動的にアバターに対する制約の適用状況を回答させます。@getstatus と異なり、UUID に関わらずすべてのオブジェクトが発行した制約が回答されます。チャネル <channel_number> ですぐに回答され、スクリプトでそれを拾うことができます。常に正の整数を使用してください。通常のビューアは何も回答しないので、必ずタイムアウト後にリスナーを削除するようにしてください。結果はスラッシュ ('/') で区切られた制約名称のリストとして返却されます。注意: v1.16 からはスラッシュは文字列の先頭であるとみなされるようになっています。llParseString2List() で処理するのであれば大丈夫ですが、llParseStringKeepNulls() で処理する場合はおかしくなります!


* '''''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 [[channel]]s. If channel is specified, it becomes an exception to the aforementioned restriction. It does not prevent the viewer automatic replies like @version=nnnn, @getstatus=nnnn etc. 


* '''''アバターの持ち物の中の共有フォルダの一覧を取得する''''' : @getinv[:folder1/.../folderN]=<channel_number>
''実装 v1.11, v1.13 でサブフォルダを追加''
ビューアに自動的に "#RLV# というフォルダの中にあるフォルダの一覧を (あれば) 回答させます。チャネル <channel_number> ですぐに回答され、スクリプトでそれを拾うことができます。フォルダが指定されると、共有フォルダのルートでなく、指定されたパスに存在するフォルダの中にあるサブフォルダのリストが返却されます (例: "@getinv:Restraints/Leather cuffs/Arms=2222")。常に正の整数を使用してください。通常のビューアは何も回答しないので、必ずタイムアウト後にリスナーを削除するようにしてください。


* '''''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 [[channel]]s. If channel is specified, it becomes an exception to the aforementioned restriction. It does not prevent the viewer automatic replies like @version=nnnn, @getstatus=nnnn etc. This particular command only accepts exceptions issued from the same object, opposed to its non-secure version which accepts exceptions from any other object.




* '''''Get the list of restrictions the avatar is currently submitted to''''' : @getstatus[:<part_of_rule>]=<channel>
* '''''アバターの持ち物の中の共有フォルダの一覧を取得する(アイテムの使用状況つき)''''' : @getinvworn[:folder1/.../folderN]=<channel_number>
''Implemented in v1.10, slightly tweaked in v1.16''
''実装 v1.15''
Makes the viewer automatically answer the list of rules the avatar is currently under, only for the object containing the script issuing that command, immediately on the chat channel number <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 !
ビューアに自動的に "#RLV# というフォルダの中にあるフォルダの一覧を (あれば) 回答させます。チャネル <channel_number> ですぐに回答され、スクリプトでそれを拾うことができます。フォルダが指定されると、共有フォルダのルートでなく、指定されたパスに存在するフォルダの中にあるサブフォルダのリストが返却されます (例: "@getinv:Restraints/Leather cuffs/Arms=2222")。常に正の整数を使用してください。通常のビューアは何も回答しないので、必ずタイムアウト後にリスナーを削除するようにしてください。


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 applies to the object calling it.
結果はカンマ (",") で区切られた、フォルダ名のリストとして返却されます。それぞれの項目の後ろにパイプ ("|") と2桁の数字がついています。(現在のフォルダを見せない @getinv とは異なり) 現在のフォルダが最初の項目にありますが、名前はなく、パイプと2桁の数字だけがついています。


<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.
オブジェクトの問い合わせ: "@getinvworn:Restraints/Leather cuffs=2222"
ビューアの回答        : "|02,Arms|30,Legs|10"


Example : If the avatar is under tploc, tplure, tplm and sittp, here is what the script would get :
ドット(".") で始まるフォルダは無視されます。2桁の数字は次のように算出されます。
@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")


1桁目: 当該フォルダ内のアイテムの装着割合(編集不可能なアイテムも含む)。この例では、"30" の "3" というのが、「Arms フォルダにある全てのアイテムが装着されている」こと、 "10" の "1" というのが、「Legs フォルダのアイテムは何も装着されていないが、装着できるアイテムはある」ことを意味します。


* '''''Get the list of all the restrictions the avatar is currently submitted to''''' : @getstatusall[:<part_of_rule>]=<channel>
2桁目: 当該フォルダのサブフォルダ全体での装着割合。この例では、"02" の "2" というのが、「Leather cuffs というフォルダに含まれるどこかのフォルダで、一部のアイテムが装着されている」ことを意味します。
''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 !


数字は 0 から 3 まであり、それぞれ次のような意味をもちます。


* '''''Get the list of shared folders in the avatar's inventory''''' : @getinv[:folder1/.../folderN]=<channel_number>
* 0 : フォルダの中にアイテムがない
''Implemented in v1.11, added sub-folders in v1.13''
* 1 : フォルダの中にアイテムがあるが、装着されているものはない
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.
* 2 : フォルダの中にアイテムがあり、一部は装着されている
* 3 : フォルダの中にアイテムがあり、全て装着されている


The answer is a list of names, separated by commas (","). Folders which names begin with a dot (".") will be ignored.


* '''''検索条件に該当する共有フォルダのパスを取得する''''' : @findfolder:part1[&&...&&partN]=<channel_number>
''実装 v1.13.1''
ビューアに自動的に<path1>, <path2>, ... <pathN> を名前の一部に含む最初の共有フォルダのパスを回答させます。チャネル <channel_number> ですぐに回答され、スクリプトでそれを拾うことができます。深さ優先探索で検索されます。 "and" のように "&&" で連結します。常に正の整数を使用してください。通常のビューアは何も回答しないので、必ずタイムアウト後にリスナーを削除するようにしてください。隠しフォルダ (ドット "." で始まるフォルダ) や、チルダ ("~") で始まるフォルダは検索されません。結果はスラッシュ ("/") で区切られたパス形式で返却されます。


* '''''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.
* '''''共有フォルダ内のアイテムを強制的に装着する''''' : @attach:<folder1/.../folderN>=force (*)
''実装 v1.11、編集不可能なアイテムについては v1.12 で対応、サブフォルダは v1.13 で対応''
ビューアに指定されたパス (#RLV の配下にある必要があります) にあるフォルダの中にある全てのオブジェクトと服を装着させます。オブジェクトの名前は '''必ず''' 装着先ポイント名を含んでいなければならず、含んでいないと装着されません。編集不可能なオブジェクトは、名称変更ができないため、 '''必ず''' それぞれ名称に装着ポイントの名称を含むフォルダの中に入っていなければなりません( 1 つのフォルダに 1 個のオブジェクト) 。名称の先頭にドット (".") があってはなりません。そのようなフォルダはスクリプトからは見えないからです。


Object : "@getinvworn:Restraints/Leather cuffs=2222"
装着ポイントの名前は、「装着先」サブメニューにある名前と同じものです。"skull", "chest", "l forearm" などなど。
Viewer : "|02,Arms|30,Legs|10"


Folders which names begin with a dot (".") will be ignored. The two digits are calculated as follows :
注意 1:フォルダの名前にスラッシュを含めることは '''可能''' です。そのときには、その名前がフォルダ名となっているものがあれば優先して選択されます。 (例えば、"@attach:Restraints/cuffs=force" が発行されると、"Restraints/cuffs" フォルダが選択され、その後に "Restraints" という親フォルダの中の "cuffs" フォルダが選択されることになります)


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".
注意 2 : フォルダの名前の頭に+記号がついているときは、@attachover と同じような挙動となります。このルールはデバッグ設定 "RestrainedLoveStackWhenFolderBeginsWith" で変更することができます。


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 :
* '''''共有フォルダ内のアイテムを強制的に装着する(既に装着されているものは変更しない)''''' : @attachover:<folder1/.../folderN>=force (*)
''実装 v2.1.2 と v1.24''
このコマンドは先ほどの @attach と全く同じように動作しますが、既に装着されているオブジェクトや服を取り替えることはしません。


* 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


* '''''共有フォルダ内のアイテムをサブフォルダも再帰的に強制的に装着する''''' : @attachall:<folder1/.../folderN>=force (*)
''実装 v1.15''
このコマンドは先ほどの @attach と全く同じように動作しますが、サブフォルダの中にあるものも全て装着します。


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


* '''''共有フォルダ内のアイテムをサブフォルダも再帰的に強制的に装着する(既に装着されているものは変更しない)''''' : @attachallover:<folder1/.../folderN>=force (*)
''実装 v2.1.2 と v1.24''
このコマンドは先ほどの @attachall と全く同じように動作しますが、既に装着されているオブジェクトや服を取り替えることはしません。


* '''''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"...
* '''''共有フォルダ内のアイテムを強制的に取り外す''''' : @detach:<folder_name>=force (*)
''実装 v1.11''
ビューアに <folder_name> (#RLV の配下にある必要があります) の中にあるオブジェクトを取り外し、服を脱ぐようにさせます。"@detach" が装着ポイントの名称 (skull, pelvis... 上記参照のこと) と一緒に使われていると、同じコマンドのため、そちらがこの方法より優先します。


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


* '''''共有フォルダ内のアイテムをサブフォルダも再帰的に強制的に取り外す''''' : @detachall:<folder1/.../folderN>=force (*)
''実装 v1.15''
このコマンドは先ほどの @detach と全く同じように動作しますが、サブフォルダの中にあるものも全て取り外します。


* '''''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.


* '''''指定した装着ポイントにあるオブジェクト・服を含む共有フォルダのパスを取得する''''' : @getpath[:<attachpt> or <clothing_layer>]=<channel_number>
''実装 v1.16''
以下の条件にあてはまるアイテムを含む共有フォルダのパスをビューアに回答させます。
** オプションを指定しない場合、コマンドを発行したアイテム。
** オプションで指定された装着ポイントに装着されているアタッチメント。 例 : @getpath:spine=2222 => "Restraints/Collar"
** オプションで指定されたレイヤに装着されている服。例 : @getpath:pants=2222 => "Casual/Jeans/Tight"
常に正の整数を使用してください。通常のビューアは何も回答しないので、必ずタイムアウト後にリスナーを削除するようにしてください。隠しフォルダ (ドット "." で始まるフォルダ) も検索されます。結果はスラッシュ ("/") で区切られたパス形式で返却されます。


* '''''Force detach items contained inside a shared folder''''' : @detach:<folder_name>=force (*)
注意: 1.40.4 がメイングリッドで稼働して、今では同じ装着ポイントに複数のオブジェクトを装着することが可能となっています。このため、このコマンドの結果はもはや大した意味をもちません。というのも、複数のフォルダに分散されていても、1 つのフォルダしか結果として返ってこないからです。このため、@getpathnew を利用するのをおすすめします。@getpath はユーザが 2.1 以上のバージョンに移行しだい、段階的に廃止していく予定です。
''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.




* '''''Force detach items contained inside a shared folder, and its children recursively''''' : @detachall:<folder1/.../folderN>=force (*)
* '''''指定した装着ポイントにあるオブジェクト・服を含む共有フォルダのパスを全て取得する''''' : @getpathnew[:<attachpt> or <clothing_layer>]=<channel_number>
''Implemented in v1.15''
''実装 v2.1 と v1.24''
This command works exactly like @detach described hereabove, but also detaches whatever is contained into children folders.
以下の条件にあてはまるアイテムを含む共有フォルダのパスをビューアに回答させます。
** オプションを指定しない場合、コマンドを発行したアイテム。
** オプションで指定された装着ポイントに装着されているアタッチメント。 例 : @getpathnew:spine=2222 => "Restraints/Collar,Jewelry/Cute necklace"
** オプションで指定されたレイヤに装着されている服。例 : @getpathnew:pants=2222 => "Casual/Jeans/Tight"
常に正の整数を使用してください。通常のビューアは何も回答しないので、必ずタイムアウト後にリスナーを削除するようにしてください。隠しフォルダ (ドット "." で始まるフォルダ) も検索されます。結果はスラッシュ ("/") で区切られたパス形式で返却されます。複数のアウトフィットが関係しているため、複数のフォルダを返却しなければならない場合は、カンマ (",") で区切ったリスト形式で返却されます。


2.1 より複数のオブジェクトが同じ装着ポイントに装着できるようになったため、このコマンドは @getpath の代替として追加されました。


* '''''Get the path to the shared folder containing a particular object/clothing''''' : @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 ('/').


* '''''指定した装着ポイントにあるオブジェクト・服を含む共有フォルダのアイテムを全て強制的に装着する''''' : @attachthis[:<attachpt> or <clothing_layer>]=force (*)
''実装 v1.16''
このコマンドは @getpath と @attach コマンドの連続発行と同じ動きをするショートカットです(リスナーやタイマーの節約になります。)


* '''''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).


* '''''指定した装着ポイントにあるオブジェクト・服を含む共有フォルダのアイテムを全て強制的に装着する(既に装着されているものは変更しない)''''' : @attachthisover[:<attachpt> or <clothing_layer>]=force (*)
''実装 v2.1.2 と v1.24''
このコマンドは先ほどの @attachthis と全く同じように動作しますが、既に装着されているオブジェクトや服を取り替えることはしません。


* '''''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).


* '''''指定した装着ポイントにあるオブジェクト・服を含む共有フォルダとサブフォルダのアイテムを全て強制的に装着する''''' : @attachallthis[:<attachpt> or <clothing_layer>]=force (*)
''実装 v1.16''
このコマンドは @getpath と @attachall コマンドの連続発行と同じ動きをするショートカットです(リスナーやタイマーの節約になります。)


* '''''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).


* '''''指定した装着ポイントにあるオブジェクト・服を含む共有フォルダのアイテムを全て強制的に取り外す''''' : @detachthis[:<attachpt> or <clothing_layer>]=force (*)
''実装 v1.16''
このコマンドは @getpath と @detach コマンドの連続発行と同じ動きをするショートカットです(リスナーやタイマーの節約になります。)


* '''''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).


* '''''指定した装着ポイントにあるオブジェクト・服を含む共有フォルダとサブフォルダのアイテムを全て強制的に取り外す''''' : @detachallthis[:<attachpt> or <clothing_layer>]=force (*)
''実装 v1.16''
このコマンドは @getpath と @detachall コマンドの連続発行と同じ動きをするショートカットです(リスナーやタイマーの節約になります。)


* '''''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.


* '''''アイテムを強制的に取り外す''''' : @detachme=force (*)
''実装 v1.16.2''
このコマンドを発行したオブジェクトをアバターから取り外します。このコマンドは @clear を呼んだ後で llDetachFromAvatar() を呼び出すときに起こる競合問題(制約をクリアする前にオブジェクトを取り外してしまい、しばらくして自動的に再装着されてしまう場合がある)を解消するためにあります。このコマンドが導入されたことにより、@clear を呼び出して、@detachme=force を呼び出すことで、必ず @clear が先に実行されるようにすることができるようになりました。


* '''''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.


* '''''フォルダ内のアイテムの取り外しを許可/禁止する''''' : @detachthis[:<layer>|<attachpt>|<path_to_folder>]=<y/n>
''実装 v2.3 と v1.25''
禁止されると、ユーザは以下の条件にあてはまるフォルダに含まれるアイテムを取り外すことができなくなります。
- オプションを指定しない場合、コマンドを発行したアイテムが含まれるフォルダ。
- オプションで指定されたレイヤに装着されている服が含まれるフォルダ。
- オプションで指定された装着ポイントに装着されているアタッチメントが含まれるフォルダ。
- オプションで指定されたパスで参照されるフォルダ。


* '''''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>
* '''''フォルダ内とそのサブフォルダ内のアイテムの取り外しを許可/禁止する''''' : @detachallthis[:<layer>|<attachpt>|<path_to_folder>]=<y/n>
''Implemented in v1.11''
''実装 v2.3 と v1.25''
When prevented, the avatar is unable to view the mini map, and it closes if it is open when the restriction becomes active.
このコマンドは @detachthis と同じように動作しますが、サブフォルダにも再帰的に適用されます。




* '''''Allow/prevent knowing the current location''''' : @showloc=<y/n>
* '''''フォルダ内のアイテムの装着を許可/禁止する''''' : @attachthis:<layer>|<attachpt>|<path_to_folder>=<y/n>
''Implemented in v1.12''
''実装 in v2.3 と v1.25''
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).
禁止されると、ユーザは以下の条件にあてはまるフォルダのアイテムを装着することができなくなります。
- オプションで指定されたレイヤに装着されるようになっている服が含まれるフォルダ。
- オプションで指定された装着ポイントに装着されるようになっているアタッチメントが含まれるフォルダ。
- オプションで指定されたパスで参照されるフォルダ。


さらに、禁止されたフォルダは名前の変更、移動、削除、編集ができなくなります。


* '''''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 from v1.15 and above, by @unsit too.


Here is a sample code to call that command properly :
* '''''フォルダ内とそのサブフォルダ内のアイテムの着用を許可/禁止する''''' : @attachallthis[:<layer>|<attachpt>|<path_to_folder>]=<y/n>
''実装 in v2.3 and v1.25''
このコマンドは @attachthis と同じように動作しますが、サブフォルダにも再帰的に適用されます。
 
 
* '''''1.5 m 以上離れたオブジェクトのタッチを許可/禁止する''''' : @fartouch=<y/n>
''実装 v1.11''
禁止されると、アバターは 1.5 m 以上はなれた場所にあるオブジェクトをタッチすることができなくなります。このコマンドでより現実的な制約をつけることができます。なぜなら、アバターはオブジェクトをクリックするためには、オブジェクトを押すことのできる状態でなければならないはずだからです。
 
 
* '''''世界地図の閲覧を許可/禁止する''''' : @showworldmap=<y/n>
''実装 v1.11''
禁止されると、アバターは世界地図を参照することができなくなり、制約が有効になった時点で開かれていた地図は閉じます。
 
 
* '''''ミニマップの閲覧を許可/禁止する''''' : @showminimap=<y/n>
''実装 v1.11''
禁止されると、アバターはミニマップを参照することができなくなり、制約が有効になった時点で開かれていたミニマップは閉じます。
 
 
* '''''現在の場所を知ることを許可/禁止する''''' : @showloc=<y/n>
''実装 v1.12''
禁止されると、当該ユーザは現在自分がどこにいるかを知ることができなくなります。つまり、世界地図は隠され、メニューバーにある区画や地域の名前は隠され、ランドマークは作成できず、土地も買うことができず、テレポートした後もどこにテレポートしたか表示されず、「Second Life について」のダイアログボックスにも場所は表示されず、システムやオブジェクトのメッセージも、地域や区画の名前が含まれていたらぼかされます。しかし、[[llOwnerSay/ja|llOwnerSay]] はありのままに表示しますので、レーダー類は正常に動作します(RLV コマンドも大丈夫です)。
 
 
* '''''ユーザを強制テレポートさせる''''' : @tpto:<X>/<Y>/<Z>=force (*)
''実装 v1.12''
このコマンドはアバターを指定した座標にテレポートさせます。ここで注意しておきたいのは、座標は常に '''グローバル''' なので、コマンドの呼び出しを簡単に考えてはいけないということです。もっと言うと、テレポート先がテレハブやテレポート・ルートを含む場合、指定された場所ではなくそちらに飛んでしまいます。これは SL の制約です。また、@tpto は @tploc=n によって打ち消され、v1.15 以上では、@unsit によっても打ち消されることを覚えておいてください。
 
このコマンドを正しく呼び出している例を示します。


<lsl>
<lsl>


// FORCE TELEPORT EXAMPLE
// 強制テレポートのサンプル
// Listens on channel 4 for local coordinates and a sim name
// チャネル 4 で ローカル座標と SIM 名を取得し、
// and tells your viewer to teleport you there.
// ビューアにそこにテレポートするように指示します
//
//
// By Marine Kelley 2008-08-26
// 作者 Marine Kelley 2008-08-26
// RLV version required : 1.12 and above
// 動作する RLV のバージョン : 1.12 以上
//
//
// HOW TO USE :
// 使い方 :
//  * Create a script inside a box
//  * 箱の中にスクリプトを作成します
//  * Overwrite the contents of the script with this one
//  * スクリプトの中身をこれに書き換えます
//  * Wear the box
//  * 箱を装着します。
//  * Say the destination coords Region/X/Y/Z on channel 4 :
//  * テレポート先をチャネル 4 で 地域/X/Y/Z のように言います
//    Example : /4 Help Island Public/128/128/50
//    例: /4 Help Island Public/128/128/50


key kRequestHandle; // UUID of the dataserver request
key kRequestHandle; // dataserver へのリクエストの UUID
vector vLocalPos;  // local position extracted from the
vector vLocalPos;  // 取得した ローカル座標


Init () {
Init () {
Line 569: Line 691:


     if (L==4) {
     if (L==4) {
       // Extract local X, Y and Z
       // ローカルの X, Y, Z 座標を取得します
       vLocalPos.x = llList2Float (tokens, 1);
       vLocalPos.x = llList2Float (tokens, 1);
       vLocalPos.y = llList2Float (tokens, 2);
       vLocalPos.y = llList2Float (tokens, 2);
       vLocalPos.z = llList2Float (tokens, 3);
       vLocalPos.z = llList2Float (tokens, 3);


       // Request info about the sim
       // SIM 情報を取得します
       kRequestHandle=llRequestSimulatorData (llList2String (tokens, 0), DATA_SIM_POS);
       kRequestHandle=llRequestSimulatorData (llList2String (tokens, 0), DATA_SIM_POS);
     }
     }
Line 581: Line 703:
   dataserver(key queryid, string data) {
   dataserver(key queryid, string data) {
     if (queryid == kRequestHandle) {
     if (queryid == kRequestHandle) {
       // Parse the dataserver response (it is a vector cast to a string)
       // dataserver の返答を解析します (vector string にキャストします)
       list tokens = llParseString2List (data, ["<", ",", ">"], []);
       list tokens = llParseString2List (data, ["<", ",", ">"], []);
       string pos_str = "";
       string pos_str = "";
       vector global_pos;
       vector global_pos;


       // The coordinates given by the dataserver are the ones of the
       // dataserver から取得した座標は、この SIM の南西端の座標です
      // South-West corner of this sim
       // => 指定された ローカル座標で補正します
       // => offset with the specified local coordinates
       global_pos.x = llList2Float (tokens, 0);
       global_pos.x = llList2Float (tokens, 0);
       global_pos.y = llList2Float (tokens, 1);
       global_pos.y = llList2Float (tokens, 1);
Line 594: Line 715:
       global_pos += vLocalPos;
       global_pos += vLocalPos;


       // Build the command
       // コマンドを構成します。
       pos_str =      (string)((integer)global_pos.x)
       pos_str =      (string)((integer)global_pos.x)
                 +"/"+(string)((integer)global_pos.y)
                 +"/"+(string)((integer)global_pos.y)
                 +"/"+(string)((integer)global_pos.z);
                 +"/"+(string)((integer)global_pos.z);
       llOwnerSay ("Global position : "+(string)pos_str); // Debug purposes
       llOwnerSay ("Global position : "+(string)pos_str); // デバッグ用


       // Fire !
       // ちゅどーん!
       llOwnerSay ("@tpto:"+pos_str+"=force");
       llOwnerSay ("@tpto:"+pos_str+"=force");
     }
     }
Line 611: Line 732:




* '''''Remove/add auto-accept teleport offers from a particular avatar''''' : "@accepttp[:<UUID>]=<rem/add>"
* '''''特定のアバターからのテレポート呼び出しの自動受諾をする/しない''''' : "@accepttp[:<UUID>]=<rem/add>"
''Implemented in v1.15, slightly improved in v1.16''
''実装 v1.15, v1.16 でちょっと改善''
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. Attention : in v1.16 the UUID becomes optional, which means that @accepttp=add will force the user to accept teleport offers from anyone ! Use with caution !
このルールを追加すると、<UUID> をキーにもつアバターからのテレポート呼び出しを全て自動的に受け入れます。ちょうど Linden からの呼び出しを受けたときと同じような感じです(確認ダイアログ、メッセージ、キャンセルボタンはありません)。このルールは @tpto より優先されるわけでもされないわけでもなく、前者の制約では誰かのもとにテレポートしても、後者の制約によりランダムな場所に飛ばされるからです。注意: v1.16 では UUID は任意となりました。@accepttp=add は誰からのテレポート呼び出しも受け入れることになります!注意して利用してください!




* '''''Allow/prevent seeing the names of the people around''''' : @shownames=<y/n>
* '''''周囲の人の名前を表示する/しない''''' : @shownames=<y/n>
''Implemented in v1.12.2, added more dummy names in v1.16''
''実装 v1.12.2, 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.
禁止されると、ユーザは周りにいる人が誰かを知ることができなくなります。名前はスクリーンに表示されず、チャットに表示される名前は "Someone" "A resident" のようなダミーの名前になり、ツールヒントは隠され、右クリックメニューはほとんど役に立たなくなり、ユーザはプロフィールを参照できなくなくなるなどします。




* '''''Allow/prevent seeing all the hovertexts''''' : @showhovertextall=<y/n>
* '''''フローティングテキストの表示をする/しない''''' : @showhovertextall=<y/n>
''Implemented in v1.19''
''実装 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>
* '''''指定されたプリムのフローティングテキストの表示をする/しない''''' : @showhovertext:<UUID>=<y/n>
''Implemented in v1.19''
''実装 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).
禁止されると、ユーザは UUID で指定されたプリムのフローティングテキストを見ることができなくなります。@detach が自分自身にだけ制約をつけられるのとは異なり、この制約は他のオブジェクトや他の人がつけることができるようになっています。




* '''''Allow/prevent seeing the hovertexts on the HUD of the user''''' : @showhovertexthud=<y/n>
* '''''HUD のフローティングテキストの表示をする/しない''''' : @showhovertexthud=<y/n>
''Implemented in v1.19''
''実装 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.
禁止されると、ユーザは HUD オブジェクトのフローティングテキストを見ることができなくなりますが、インワールドのフローティングテキストは見ることができます。




* '''''Allow/prevent seeing the hovertexts in-world''''' : @showhovertextworld=<y/n>
* '''''インワールドのフローティングテキストの表示をする/しない''''' : @showhovertextworld=<y/n>
''Implemented in v1.19''
''実装 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.
禁止されると、ユーザはインワールドのフローティングテキストを見ることができなくなりますが、HUD オブジェクトのフローティングテキストは見ることができます。




* '''''Allow/prevent flying''''' : @fly=<y/n>
* '''''飛行を許可/禁止する''''' : @fly=<y/n>
''Implemented in v1.12.2''
''実装 v1.12.2''
When prevented, the user is unable to fly.
禁止されると、ユーザは飛べなくなります。




* '''''Get the UUID of the object the avatar is sitting on''''' : @getsitid=<channel_number>
* '''''アバターが座っているオブジェクトの UUID を取得する''''' : @getsitid=<channel_number>
''Implemented in v1.12.4''
''実装 v1.12.4''
Makes the viewer automatically answer the UUID of the object the avatar is currently sitting on, or NULL_KEY if they are not sitting.
ビューアにアバターが現在座っているオブジェクトの UUID を回答させます。座っていなければ NULL_KEY が返ります。




* '''''Force rotate the avatar to a set direction''''' : @setrot:<angle_in_radians>=force
* '''''アバターを回転させ、ある方向を向かせる''''' : @setrot:<angle_in_radians>=force
''Implemented in v1.17''
''実装 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 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.
アバターを回転させます。向かせる方向は、北を基準とした角度をラジアンで指定します。このコマンドはそんなに正確でなく、回転する角度が 10° 未満となる場合は何も起こりません(経験則です。どこかで、最低ラインが と書かれていたのを見たことがあります)。つまり、llGetRot() を先に発行して確認するか、アバターを 2 回回転させ、最初は 180° で、次に向かせたい方向に角度を指定して回すといいようです。あまりエレガントな方法ではありませんが、とりあえずなんとかなります。
   
   


* '''''Allow/prevent changing some debug settings''''' : @setdebug=<y/n>
* '''''デバッグ設定の変更を許可/禁止する''''' : @setdebug=<y/n>
''Implemented in v1.16''
''実装 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 :
禁止されると、ビューアのデバッグ設定(Advanced > Debug Settings) を変更することができなくなります。ほとんどのデバッグ設定が役に立たないか、ユーザの使い勝手に重大な影響を与えるため、ホワイトリスト式となっています。つまり、限られたデバッグ設定だけがロックされ、他は常にアクセス・変更ができます。これを書いている時点で、許可されているデバッグ設定は、
** AvatarSex (0 : Female, 1 : Male) : gender of the avatar at creation.
** AvatarSex (0 : , 1 : ) : アバターの作成時の性別
** 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.
** RenderResolutionDivisor (1 -> ...) : スクリーンの "ぼやけ"@setenv コマンドと組み合わせると、すてきな効果が得られます。注意:  Note: RenderResolutionDivisor は Windlight のみで有効なオプションです。(グラフィック設定で基本シェーダを有効にする必要があります) そういうわけで、v1.19.0.5 以前のビューアでは使用できません。




* '''''Force change a debug setting''''' : @setdebug_<setting>:<value>=force (*)
* '''''デバッグ設定を強制的に変更する''''' : @setdebug_<setting>:<value>=force (*)
''Implemented in v1.16''
''実装 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.
ビューアに指定したデバッグ設定を <value> の値に変更させます。このコマンドは、"@setdebug_..." にグルーピングされる、たくさんのサブコマンドの集合となっています。例えば、"@setdebug_avatarsex:0=force""@setdebug_renderresolutiondivisor:64=force" などのようにします。


See the list of allowed debug settings in the @setdebug command hereabove.
指定可能なデバッグ設定の一覧は直前にある @setdebug コマンドの記述を参照してください。




* '''''Get the value of a debug setting''''' : @getdebug_<setting>=<channel_number>
* '''''デバッグ設定の設定値を取得する''''' : @getdebug_<setting>=<channel_number>
''Implemented in v1.16''
''実装 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.
ビューアにデバッグ設定の設定値を回答させます。常に正の値を使用してください。常に正の整数を使用してください。通常のビューアは何も回答しないので、必ずタイムアウト後にリスナーを削除するようにしてください。結果は @setdebug コマンドの対応する <setting> パートで設定した値か、手動で設定した値となります。


See the list of allowed debug settings in the @setdebug command hereabove.
指定可能なデバッグ設定の一覧は直前にある @setdebug コマンドの記述を参照してください。




* '''''Allow/prevent changing the environment settings''''' : @setenv=<y/n>
* '''''環境の設定の変更を許可/禁止する''''' : @setenv=<y/n>
''Implemented in v1.14''
''実装 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 (*)
* '''''環境の設定を強制的に変更させる''''' : @setenv_<setting>:<value>=force (*)
''Implemented in v1.14''
''実装 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.
ビューアに特定の環境の設定 (時刻や Windlight) を <value> の値に変えさせます。このコマンドの実態はたくさんのサブコマンドの集合体です。これらは "@setenv_..." の配下にグルーピングされます。例えば、"@setenv_daytime:0.5=force""@setenv_bluehorizonr:0.21=force" などです。


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.
このコマンドは (他の "force" コマンドと同じように) 既に当該制約が設定されていれば、何もせずに復帰します。しかし、 "@setenv" の場合は、制約を作成したオブジェクトから変更がかかると、その制約が無視されます。言い換えると、首輪は環境の設定の変更を強制させることができますが、それ自身によって変更することができます。しかし、他のオブジェクトは、首輪がその制約を撤廃するまでそれを変更できません。


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) :
それぞれのサブコマンドは、以下のように動作します (名前はなるべくビューアの Windlight パネルに似たものを選んでいます)


{| border="1" cellpadding="5"
{| border="1" cellpadding="5"
|  '''@setenv_XXX:<value>=force where XXX is...'''      ||  '''<value> range'''            ||  '''Sets...'''
|  '''@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'''
|  daytime      ||  0.0-1.0 and <0        ||  時間帯 (日の出:0.25, 正午:0.567, 日没:0.75, 深夜:0.0, 地域の標準設定に戻す:<0). '''注意。全ての Windlight の設定をリセットします'''
|-
|-
|  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'''
|  preset        ||  String                ||  環境の事前設定, 例えば Gelatto, Foggy など。 '''注意。事前設定をロードするのはブラウザに負担がかかり、一瞬動作が重くなるので、1秒おきに実行することのないように'''
|-
|-
|  ambientr      ||  0.0-1.0                ||  Ambient light, Red channel
|  ambientr      ||  0.0-1.0                ||  アンビエント光,
|-
|-
|  ambientg      ||  0.0-1.0                ||  Ambient light, Green channel
|  ambientg      ||  0.0-1.0                ||  アンビエント光,
|-
|-
|  ambientb      ||  0.0-1.0                ||  Ambient light, Blue channel
|  ambientb      ||  0.0-1.0                ||  アンビエント光,
|-
|-
|  ambienti      ||  0.0-1.0                ||  Ambient light, Intensity
|  ambienti      ||  0.0-1.0                ||  アンビエント光, 輝度
|-
|-
|  bluedensityr  ||  0.0-1.0                ||  Blue Density, Red channel
|  bluedensityr  ||  0.0-1.0                ||  空の配色と濃度,
|-
|-
|  bluedensityg  ||  0.0-1.0                ||  Blue Density, Green channel
|  bluedensityg  ||  0.0-1.0                ||  空の配色と濃度,
|-
|-
|  bluedensityb  ||  0.0-1.0                ||  Blue Density, Blue channel
|  bluedensityb  ||  0.0-1.0                ||  空の配色と濃度,
|-
|-
|  bluedensityi  ||  0.0-1.0                ||  Blue Density, Intensity
|  bluedensityi  ||  0.0-1.0                ||  空の配色と濃度, 輝度
|-
|-
|  bluehorizonr  ||  0.0-1.0                ||  Blue Horizon, Red channel
|  bluehorizonr  ||  0.0-1.0                ||  空の色,
|-
|-
|  bluehorizong  ||  0.0-1.0                ||  Blue Horizon, Green channel
|  bluehorizong  ||  0.0-1.0                ||  空の色,
|-
|-
|  bluehorizonb  ||  0.0-1.0                ||  Blue Horizon, Blue channel
|  bluehorizonb  ||  0.0-1.0                ||  空の色,
|-
|-
|  bluehorizoni  ||  0.0-1.0                ||  Blue Horizon, Intensity
|  bluehorizoni  ||  0.0-1.0                ||  空の色, 輝度
|-
|-
|  cloudcolorr  ||  0.0-1.0                ||  Cloud color, Red channel
|  cloudcolorr  ||  0.0-1.0                ||  雲の色,
|-
|-
|  cloudcolorg  ||  0.0-1.0                ||  Cloud color, Green channel
|  cloudcolorg  ||  0.0-1.0                ||  雲の色,
|-
|-
|  cloudcolorb  ||  0.0-1.0                ||  Cloud color, Blue channel
|  cloudcolorb  ||  0.0-1.0                ||  雲の色,
|-
|-
|  cloudcolori  ||  0.0-1.0                ||  Cloud color, Intensity
|  cloudcolori  ||  0.0-1.0                ||  雲の色, 輝度
|-
|-
|  cloudcoverage ||  0.0-1.0                ||  Cloud coverage
|  cloudcoverage ||  0.0-1.0                ||  空を覆う雲の量
|-
|-
|  cloudx        ||  0.0-1.0                ||  Cloud offset X
|  cloudx        ||  0.0-1.0                ||  雲の位置 X
|-
|-
|  cloudy        ||  0.0-1.0                ||  Cloud offset Y
|  cloudy        ||  0.0-1.0                ||  雲の位置 Y
|-
|-
|  cloudd        ||  0.0-1.0                ||  Cloud density
|  cloudd        ||  0.0-1.0                ||  雲の密度
|-
|-
|  clouddetailx  ||  0.0-1.0                ||  Cloud detail X
|  clouddetailx  ||  0.0-1.0                ||  雲の詳細 X
|-
|-
|  clouddetaily  ||  0.0-1.0                ||  Cloud detail Y
|  clouddetaily  ||  0.0-1.0                ||  雲の詳細 Y
|-
|-
|  clouddetaild  ||  0.0-1.0                ||  Cloud detail density
|  clouddetaild  ||  0.0-1.0                ||  雲の詳細 密度
|-
|-
|  cloudscale    ||  0.0-1.0                ||  Cloud scale
|  cloudscale    ||  0.0-1.0                ||  雲のスケール
|-
|-
|  cloudscrollx  ||  0.0-1.0                ||  Cloud scroll X
|  cloudscrollx  ||  0.0-1.0                ||  雲の移動速度 (X 方向)
|-
|-
|  cloudscrolly  ||  0.0-1.0                ||  Cloud scroll Y
|  cloudscrolly  ||  0.0-1.0                ||  雲の移動速度 (Y 方向)
|-
|-
|  densitymultiplier    ||  0.0-0.9        ||  Density multiplier of the fog
|  densitymultiplier    ||  0.0-0.9        ||  大気の不透明度の増幅
|-
|-
|  distancemultiplier  ||  0.0-100.0      ||  Distance multiplier of the fog
|  distancemultiplier  ||  0.0-100.0      ||  視界の増幅
|-
|-
|  eastangle            ||  0.0-1.0              ||  Position of the east, 0.0 is normal
|  eastangle            ||  0.0-1.0              ||  東の角度, 0.0 が普通
|-
|-
|  hazedensity  ||  0.0-1.0                ||  Density of the haze
|  hazedensity  ||  0.0-1.0                ||  大気の不透明度
|-
|-
|  hazehorizon  ||  0.0-1.0                ||  Haze at the horizon
|  hazehorizon  ||  0.0-1.0                ||  空と遠景の露光
|-
|-
|  maxaltitude  ||  0.0-4000.0      ||  Maximum altitude of the fog
|  maxaltitude  ||  0.0-4000.0      ||  最大高度
|-
|-
|  scenegamma    ||  0.0-10.0              ||  Overall gamma, 1.0 is normal
|  scenegamma    ||  0.0-10.0              ||  風景ガンマ, 1.0 が普通
|-
|-
|  starbrightness||  0.0-2.0                ||  Brightness of the stars
|  starbrightness||  0.0-2.0                ||  星の輝き
|-
|-
|  sunglowfocus  ||  0.0-0.5                ||  Focus of the glow of the sun
|  sunglowfocus  ||  0.0-0.5                ||  太陽の輝き フォーカス
|-
|-
|  sunglowsize  ||  1.0-2.0                ||  Size of the glow of the sun
|  sunglowsize  ||  1.0-2.0                ||  太陽の輝き サイズ
|-
|-
|  sunmooncolorr ||  0.0-1.0                ||  Sun and moon, Red channel
|  sunmooncolorr ||  0.0-1.0                ||  太陽/月の色,
|-
|-
|  sunmooncolorg ||  0.0-1.0                ||  Sun and moon, Green channel
|  sunmooncolorg ||  0.0-1.0                ||  太陽/月の色,
|-
|-
|  sunmooncolorb ||  0.0-1.0                ||  Sun and moon, Blue channel
|  sunmooncolorb ||  0.0-1.0                ||  太陽/月の色,
|-
|-
|  sunmooncolori ||  0.0-1.0                ||  Sun and moon, Intensity
|  sunmooncolori ||  0.0-1.0                ||  太陽/月の色, 輝度
|-
|-
|  sunmoonposition      ||  0.0-1.0        ||  Position of the sun/moon, different from "daytime", '''use this to set the apparent sunlight after loading a Preset'''
|  sunmoonposition      ||  0.0-1.0        ||  太陽/月の位置, 「時間帯」とは異なります。 '''事前設定をロードした後に、太陽の光を設定するのに使用してください'''
|}
|}


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.
注意: 上記の設定のうち、"daytime" のみが v1.14 以上の RestrainedLove が実装されている v1.19.0 (もしくはより古い) ビューアでサポートされています。他の設定は無視されます。これらのビューアには Windlight レンダラが実装されていないからです。




(*) 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.
     Ex : オブジェクトが取り外し不能の場合、Force detach はできません。ユーザが脱衣不能の場合、Force undress はできません。




* '''''Get the value of an environment setting''''' : @getenv_<setting>=<channel_number>
* '''''環境の設定の設定値を取得する''''' : @getenv_<setting>=<channel_number>
''Implemented in v1.15''
''実装 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.<br />
ビューアに環境の設定の設定値を自動的に回答させ、<channel_number> で指定したチャネルにすぐに載せてスクリプトが拾えるようにします。常に正の値を使用してください。通常のビューアは何も回答しないので、必ずタイムアウト後にリスナーを削除するようにしてください。復帰値は 対応する @setenv コマンドで <setting> パートにセットされた値か、手動で設定した値です。上述の設定内容一覧表を参照してください。<br />
Note: only @getenv_daytime is supported by v1.19.0 (or older, i.e. non Windlight) viewers implementing RestrainedLove v1.15 and later.
注意: @getenv_daytime だけが RestrainedLove v1.15 以上が実装されている v1.19.0 (もしくはより古い、 例えば Windlight でない) ビューアでサポートされています。


==sendchat などのグローバルな挙動に関する重要な注意点==
==sendchat などのグローバルな挙動に関する重要な注意点==
Line 805: Line 926:
バージョン 1.11 から、ビューアはインワールドのスクリプトと一部のアイテムを「共有」し、強制的に着脱させたり、共有しているものをリストで表示したりすることができるようになりました。
バージョン 1.11 から、ビューアはインワールドのスクリプトと一部のアイテムを「共有」し、強制的に着脱させたり、共有しているものをリストで表示したりすることができるようになりました。


「共有」というのは、他の人が欲しいときにそのアイテムを持っていくという意味ではなく(譲渡不能のアイテムもあるわけですから)、単に、他の人が自由自在に、アイテムを持つ本人に対する制約が含まれたスクリプトを通じて、それらの着脱を強制させることができるという意味です。これらのアイテムはインベントリに残ります。
「共有」というのは、他の人が欲しいときにそのアイテムを持っていくという意味ではなく(譲渡不能のアイテムもあるわけですから)、単に、他の人が自由自在に、アイテムを持つ本人に対する制約が含まれたスクリプトを通じて、それらの着脱を強制させることができるという意味です。これらのアイテムはインベントリに残ります。In fact, this feature would be best named "Exposed folder".


やり方:
やり方:
* 「#RLV」という名前のフォルダを「My Inventory」直下に作成します(「My Inventory」を右クリックして「New Folder」を選択)。これを以降の手順では「共有フォルダ」と呼びます。
* 「#RLV」という名前のフォルダを「My Inventory」直下に作成します(「My Inventory」を右クリックして「新しいフォルダ」を選択)。これを以降の手順では「共有フォルダ」と呼びます。
* 制約が含まれるフォルダや、その他装着するものを新しく作成したフォルダの直下に移動します。
* 制約が含まれるフォルダや、その他装着するものを新しく作成したフォルダの直下に移動します。
* あとは、フォルダの中のものを装着するだけです!
* あとは、フォルダの中のものを装着するだけです!


So it would look like this :
すると、このようなフォルダ構成になります。


  My Inventory
  My Inventory
Line 827: Line 948:
  .
  .


For example : If you're owning a set of RR Straps and want to share them, just move the folder "Straps BOXED" under the shared root.
例:RR Straps という名前の一式を持っている場合、「Straps BOXED」フォルダを共有フォルダ直下にとりあえず移動します。


Either wear all the items of the folders you have just moved (one folder at a time !) or rename your items yourself, so that each item name contains the name of the target attachment point. For example : "left cuff (l forearm)", "right ankle cuff (r lower leg)". Please note that no-modify items are a bit more complex to share, because they cannot be renamed either by you or by the viewer. More on that below.
移動したフォルダ(1度に1個のフォルダです!)の中のアイテムを全部装着するか、自分で変名して、それぞれのアイテムの名前が装着ポイントの名前を含むようにします。例えば、「left cuff (l forearm)」、「right ankle cuff (r lower leg)」のようにします。編集不能なアイテムを共有するのはちょっと難しいので注意してください。人の手でもビューアでも名前を書き換えることができないからです。これについては後ほど説明します。


The attachment point name is the same as the one you find in the "Attach To" menu of your inventory, and is case insensitive (for example : "chest", "skull", "stomach", "left ear", "r upper arm"...). If you wear the item without renaming it first it will be renamed automatically, but only if it is in a shared folder, and does not contain any attachment point name already, and is mod. If you want to wear it on another attachment point, you'll need to rename it by hand first.
装着ポイント名はインベントリのメニューの中の「装着先」から調べることができます。大文字小文字は関係ありません (例:"chest", "skull", "stomach", "left ear", "r upper arm"...)。アイテムを装着したときに、変名されていなければ最初に自動的に変名されます。ただし、共有フォルダの中にあり、装着ポイント名が含まれておらず、編集可能なアイテムに限ります。もし他の装着ポイントに装着したい場合は、まず手で変名する必要があります。


Pieces of clothing are treated exactly the same way (in fact they can even be put in the folder of a set of restraints and be worn with the same command). Shoes, for instance, are a good example of mixed outfits : some attachments and the Shoes layer. Clothes are NOT renamed automatically when worn, since their very type decides where they are to be worn (skirt, jacket, undershirt...).
服のパーツはまったく同じように扱われます(それどころか、制約フォルダに置け、同じコマンドで装着することができます)。例えば靴は、混在したアウトフィットの良い例となります。いくつかの装着パーツとレイヤ靴で構成されています。服は自動的に変名されることはありません。服のタイプと装着ポイントが対応しているからです (skirt, jacket, undershirt...)


HOW TO SHARE NO-MODIFY ITEMS :
編集不能アイテムを共有する方法:
As you already know, no-mod items cannot be renamed so the technique is a bit more complex. Create a sub-folder inside the outfit folder (such as "cuffs" in the example above), put ONE no-modify item in it. When wearing the object, you'll see the folder itself be renamed (that's why you must not put more than one object inside it). So if your outfit contains several no-mod objects, you'll need to create as many folders and put the no-mod objects in them, one in each folder.
既に説明しましたが、編集不能アイテムは変名できないため、少し複雑な方法となります。アウトフィットのフォルダ (例えば上のフォルダ構成例だと"cuffs"という名前) にサブフォルダを作成し、そこに編集不能なアイテムを 1 つだけ入れます。そのアイテムを装着すると、フォルダが変名されていることに気づくでしょう。つまり、アウトフィットの中に複数の編集不能アイテムが入っている場合、同じ数のフォルダを作成し、1 つのフォルダに 1 個ずつ編集不能のアイテムを入れていくことになります。


Example with no-modify shoes :
例えば、編集不能の靴の場合はこうなります。


  My Inventory
  My Inventory
Line 854: Line 975:
  .
  .


GOTCHAS :
バッドノウハウ:
* Do NOT put a comma (',') in the name of the folders under the shared root or it would screw the list up.
* 共有フォルダの中のフォルダの名前にカンマ (',') を含めないでください。フォルダの中がめちゃくちゃになる可能性があります。
* Don't forget to rename the items in the shared folders (or to wear these items at least once to have them be renamed automatically) or the force attach command will appear to do nothing at all.
* 共有フォルダの中のアイテムは、必ず変名(するか、少なくとも一回は装着して自動的に変名されるように)してください。そうしないと、強制装着コマンドが何もしていないように見えることになります。
* Avoid cluttering the shared root with many folders, since some scripts may rely on the list they got with the @getinv command and chat messages are limited to 1023 characters. Choose wisely, and use short names. But with 9 characters per folder name average, you can expect to have about 100 folders available.
* 共有フォルダにたくさんのフォルダを詰め込まないようにしてください。スクリプトによっては、@getinv コマンドで一覧を取得し、それを使って処理をするものがありますが、チャットによるメッセージは最大1023文字の制限があります。賢く選んで、短い名前をつけてください。しかし、平均 9 文字の名前であれば、約 100 フォルダまでもつことができます。
* Remember to put no-modify items in sub-folders, one each, so their names can be used by the viewer do find out where to attach them. They can't be shared like modify items since they can't be renamed, and the outfit folder itself will not be renamed (since it contains several items).
* ビューアが名前を頼りにどこに装着するかを判断できるようにするために、編集不能なアイテムは必ず1つずつサブフォルダに入れてください。これらのアイテムは変名不能のため、編集可能なアイテムと同じようには共有できません。また、アウトフィットのフォルダ自体は (複数のアイテムが入っているため) 変名されません。


'''''llGiveInventoryList() によって送られたサブフォルダの共有フォルダへの受け入れ''''' :


'''''Accept sub-folders given via llGiveInventoryList() into the shared folder''''' :
RestrainedLove v1.16.2 より、あなたはターゲットのアバターにアイテム一式を送り、相手の #RLV フォルダの中のサブフォルダとして持たせることができます(それにより、後でそのアイテムを @attach させることができます)


Starting with RestrainedLove v1.16.2, you may give a list of items to a victim and have them stored as a sub-folder inside the #RLV folder (thus allowing you to @attach the given items later).
llGiveInventoryList(victim_id, "#RLV/~subfolder_name", list_of_stuff) コマンドを発行すると、スクリプトは相手(victim_id と同じキーをもつアバター)のビューアに通常の 受け取る/破棄/無視リスト ダイアログを表示します。


Issuing a llGiveInventoryList(victim_id, "#RLV/~subfolder_name", list_of_stuff) command in a script makes a standard Keep/Discard/Mute dialog appear in the viewer of the victim (the avatar which key is victim_id).
相手がオファーを受け入れると、list_of_stuff で指定されたアイテムが #RLV フォルダの中の新しいサブフォルダに格納されます。このサブフォルダの名前は ~subfolder_name で指定された名前となります(スクリプターには、一意となるようなサブフォルダの名前を指定する義務があります。既にあるサブフォルダの名前と同じであった場合、2 つの同じ名前のサブフォルダが #RLV フォルダに現れることになります)


Should the victim accept the offer, the list_of_stuff items are put into a new sub-folder of the #RLV folder. The name of this sub-folder is "~subfolder_name" (it is the scripter's responsibility to use unique sub-folder names: if the name is the same as an existing sub-folder, two sub-folders with the same name will appear in the #RLV folder).
チルダ文字はサブフォルダの先頭に *必ず* つけるように留意してください (そうすることで、この方法で送られて来たサブフォルダを相手が見つけやすくなりますし、そのようなサブフォルダの名前は #RLV フォルダの中の最後尾に表示されます)


Note that the tilde character *must* be used as the first character for the name of the sub-folder (this is so that the victim can easily spot any sub-folder given to them in this way, and so that such sub-folder names appear last in the #RLV folder).
また、この機能は (Debug Setting の RestrainedLoveForbidGiveToRLV を TRUE に設定することで) ユーザが無効にできることにも注意してください。このような場合、#RLV フォルダの中には格納されず、インベントリのルート直下の"#RLV/~subfolder_name"という名前のフォルダの中に格納されます。


Note also that this feature may be disabled by the user, (by setting the RestrainedLoveForbidGiveToRLV debug setting to TRUE): in this case the given items are put into a folder named "#RLV/~subfolder_name" at the root of the inventory instead of inside the #RLV folder.
ユーザがインベントリのオファーを断ることも、ビューアで機能を無効にすることも、ラグのひどい日には SL がオブジェクトの実際の送信に時間がかかることもあることから、@attach コマンドを発行する前に、送信されたフォルダが存在するかどうかを (@getinv で) 確認しなければなりません。


Since the user may either refuse the offer or have the feature disabled in their viewer, and since SL may take quite some time to perform the actual transfer of the objects on laggy days, you must check that the given folder is present (with @getinv), before attempting to @attach the given objects.
==参考情報==
ここに、これが内部的にどのように動作するかを記します。あなたが遭遇するかもしれない暗黙仕様への理解を深めるのに役立つでしょう。
* それぞれのコマンドは '''Behaviour''' (例: "remoutfit")、'''Option''' (例: "shirt")、'''Param''' (例: "force") に解析され、[[UUID]] (発信しているオブジェクトのユニークなID) から届きます。


==参考情報==
* コマンドには 2 種類あります。'''one-shot''' コマンド (Param が "force" であり、Param が "version" 呼び出しのチャネル番号のような番号であるもの) と、 '''rules''' コマンド (Param が "y"、"n"、"add""rem" のいずれか) "clear" は特別ですが、one-shot コマンドとして捉えることができます。
Here is how it works internally, for a better understanding of the gotchas you may encounter :
* Each command is parsed into a '''Behaviour''' (ex: "remoutfit"), an '''Option''' (ex: "shirt") and a '''Param''' (ex: "force") and comes from an [[UUID]] (the unique identifier of the emitting object).


* There are two types of commands : '''one-shot''' commands (those which Param is "force" and those which Param is a number such as the channel number of a "version" call) and '''rules''' (those which Param is "y", "n", "add" or "rem"). "clear" is special but can be seen as a one-shot command.
* チャネル番号を引数に指定するコマンドでは、チャネル番号は正または (RestrainedLove v1.23a (@versionnum = 1230001) 以降の場合) 負の数でなければなりません。チャネル 0
は使用できません。RestrainedLove は負のチャネルに最大 255 文字送信できます。一方で、正のチャネルには最大 1023 文字送信できます。負のチャネルはユーザにチートされにくいという便利な点があります。例えば、@versionnum の問い合わせを行うときなどです(ユーザは RestrainedLove ビューアを使っていない可能性がありますが、バージョン問い合わせコマンドに偽の返答をして、あたかも RestrainedLove ビューアを使っているかのように見せかけることができます。負のチャネルではそういったことができません)。正のチャネルは長い返答が返ってくる可能性のある場合に良い選択肢となります(例えば @getpath)。


* Parameters "n" and "add" are '''exactly equal''' and are treated '''exactly the same way''', they are just '''synonyms'''. Same goes for "y" and "rem". The only purpose is to distinguish rules ("sendchannel=n") from exceptions ("sendchannel:8=add") in a script for clarity.
* "n" "add" '''まったく同じ''' で、'''まったく同じように''' 扱われます。これらは単なる '''シノニム''' です。同じようなことが "y" "rem" にも言えます。ルール ("sendchannel=n") と例外 ("sendchannel:8=add") をスクリプトの中ではっきり区別するためだけのものです。


* Rules are stored inside a table linking the [[UUID]] of the emitter to the rule itself. They are '''added''' when receiving a "n"/"add" Param, and '''removed''' when receiving a "y"/"rem" Param.
* ルールは、発生元の [[UUID]] をルールそのものに関連付けた形でテーブルに蓄積されます。"n"/"add" Param を受信すると '''追加''' され、"y"/"rem" Param を受信すると '''削除''' されます。
If '''''UUID1''''' is a collar and '''''UUID2''''' is a gag :
'''''UUID1''''' が首輪で '''''UUID2''''' が猿ぐつわだとします。


'''''UUID1''''' => detach, tploc, tplm, tplure, sittp
'''''UUID1''''' => detach, tploc, tplm, tplure, sittp
Line 890: Line 1,013:
'''''UUID2''''' => detach, sendim, sendim:(keyholder)
'''''UUID2''''' => detach, sendim, sendim:(keyholder)


Those two rules mean that the user cannot send IMs except to their keyholder, and cannot TP at all. Those two items are not detachable. Now if the collar sends "@sendim=n", the table becomes :
これらの 2 つのルールは、ユーザは keyholder 以外のアバターに IM を送信できず、どこにも TP ができないという意味になります。これらの 2 つのアイテムは取り外しできません。ここで、首輪が "@sendim=n" を送信したとすると、テーブルは以下のようになります。


'''''UUID1''''' => detach, tploc, tplm, tplure, sittp, sendim
'''''UUID1''''' => detach, tploc, tplm, tplure, sittp, sendim
Line 896: Line 1,019:
'''''UUID2''''' => detach, sendim, sendim:(keyholder)
'''''UUID2''''' => detach, sendim, sendim:(keyholder)


If it sends "@sendim=n" a second time nothing changes, as there is a check for its existence prior to adding it. If the gag is unlocked and detached, either it sends a "@clear" or the garbage collector kicks in so the rules linked to '''''UUID2''''' disappear. However, the avatar is still unable to send IMs even to their keyholder, as the exception has disappeared as well. This is because rules linked to one object don't conflict with rules linked to another one.
"@sendim=n" を 2 回目に送信すると何も起りません。追加する前に既に存在するかチェックがかかるからです。猿ぐつわのロックが解除され取り外されると、"@clear" が送信されるかガベージ・コレクタが開始されるかするため、'''''UUID2''''' に関連づいたルールは消滅します。ところが、例外まで消滅してしまっため、アバターは keyholder にさえも IM を送信できない状態のままとなります。オブジェクトに関連付けられたルールは、他のオブジェクトに関連付けられたルールに矛盾しないからです。


* One-shot commands, on the other hand, are executed on-the-fly and are not stored.
* One-shot コマンドは、これとは逆に、オンザフライで実行され、蓄積されません。


* When logging on, the avatar stays non-operational (cannot chat, cannot move) for some time, while the user sees the progress bar. However, worn scripted objects [[rez]] in the meantime and start sending rules and commands before the viewer can execute them. Therefore it stores them in a buffer and executes them only when the user is given controls (when the progress bar disappears).
* ログオンすると、プログレスバーが表示されている間、アバターはしばらく操作できない (チャットできない、移動できない) 状態となります。しかし、装着されているスクリプトの入ったオブジェクトはその間に [[rez]] して、ビューアが操作可能な状態になる前にルールとコマンドの送信を開始します。このために、ビューアはそれらを貯めておき、ユーザが操作可能な状態 (プログレスバーが消えたとき) になってはじめてそれらを実行します。


* The viewer periodically (every N seconds) checks all its rules and removes the ones linked to an [[UUID]] that does not exist around anymore ("garbage collector"). This means that rules issued by an '''unworn''' owned object will be discarded as soon as the avatar [[teleports]] elsewhere.
* ビューアは定期的に (N 秒ごとに) 全てのルールをチェックし、既に存在しない [[UUID]] にリンクしているものを削除します (「ガベージ・コレクタ」) 。つまり、'''装着していない''' オブジェクトから発行されたルールは、アバターが [[テレポートして]] 他の場所に行くと、すぐに破棄されます。


[[Category:Third Party Client]]
[[Category:Third Party Client]]
[[Category:RestrainedLove]]

Latest revision as of 02:01, 1 January 2011

Restrained Love viewer v2.3 の仕様

著者 Marine Kelley


みなさまへ

このドキュメントは、RestrainedLove viewerの機能を使用して独自のLSLスクリプトを作成したい方へ向けて書かれたものです。メッセージやイベントといったLSLの概念については説明していません。また、UUIDなどの普遍的な概念についても説明していません。

この文書は RestrainedLove ビューアそのものの仕様について説明されています。RestrainedLove ビューア連携 (RLV Relay) についての情報が欲しい場合は、 RLV relay specification を参照してください。

はじめに

RestrainedLove viewerは、インワールドのスクリプトから特定のメッセージを受け取ったときに、対応した動作をするものです。これらのメッセージは、ほとんどがllOwnerSay()と呼ばれるLSLの関数の呼び出しによって作成されます。

仕組み

RestrainedLove viewerは、ビューアに送信された全てのllOwnerSay メッセージを傍受します。アットマーク('@')で始まる行は、RLV のコマンドとして解釈されます。他の行は、通常通り、ローカルチャットに転送され、ユーザが見ることができます。例えば、llOwnerSay ("@detach=n") と呼び出すと、スクリプトを実行するオブジェクトが引数 ndetach コマンドをビューアに送信することと同じことになります。

メッセージの書式は次のようになります。

@<command1>[:option1]=<param1>,<command2>[:option2]=<param2>,...,<commandN>[:optionN]=<paramN>

'@'は、メッセージの先頭にただ一つだけ存在するようにしてください。ビューアはこれを「この llOwnerSay() メッセージの全文が、1つ以上の実行命令を含んでいる」と解釈します。記載上の都合により、コマンドは常に先頭に'@'がついた形で示されています。しかし、複数のコマンドを含むメッセージのそれぞれのコマンドの先頭に'@'をつけるのは誤りで、2個目以降のコマンドは正常に実行されません。

歴史的な注釈: 1.10 より前のバージョンでは、RLV は1つのメッセージにつきただ1つのコマンドだけを書くことができました。1.10 のバージョンで、RLV に対応していないビューアを使用しているユーザにメッセージをスパムすることにならないように、1つのメッセージに複数のコマンドを書くことができるようになりました。

少なくとも1つのコマンドの実行に失敗すると(例えばタイプミス)、ビューアは"... fails command : ... "というメッセージを出力し、全てのメッセージを表示します。しかし、正しいコマンドは解析と実行が行われ、誤っているものだけが無視されます。

コマンドの多くが、オブジェクトやアバターの次の「挙動」を規定します。例えば、@detach=n というコマンドは特定のオブジェクトにロックをかけ、取り外しできないようにします。コマンドの送信元オブジェクトに限定しない「グローバルな挙動」を規定するコマンドもあります。例えば、@sendchat=n というコマンドは、ユーザがローカルチャットで発言できないようにします。

注意 例外があるコマンド、例えば @sendim や @sendchannel などですが…。 @(rule):(exception)=n は正確には(かつ、単刀直入に言うと)既にあるルールに 例外を追加します 。例えば、@sendchannel:1=n はチャネル1での発言を 許可します。これは、スクリプターが陥る少なくとも2つの混乱の元となっていました。 =add (=n と同義) と =rem (=y と同義) は、それぞれ、例外の追加と削除のために存在します。こちらを使ってください。


Emblem-important-red.png Warning!

これらの挙動はセション間で引き継がれることは ありません 。オブジェクトの UUIDrez のたびに変わるため、オブジェクトの状態(取り外し不能、IM禁止など...)が変化したときにそうするように、オブジェクトは on_rez() イベントの中で状態を再送信 しなければなりません

コマンド一覧

注意: これらのコマンドは大文字小文字を区別しませんが、スペースは区別します。言い換えると、"@detach = n" は動作 しません 。

表記について: [角括弧] のパラメタは任意指定で省略可能です。パイプ (|) やスラッシュ (/) で区切られているオプションは、どれか一つを指定しなければならないものです。<山括弧> のパラメタは必須です。

  • 自動バージョンチェック : "@version=<channel_number>"

実装 v1.0b 搭載している RLV のバージョンをビューアに <channel_number> のチャネルで直ちに発言させ、スクリプトが拾えるようにします。常に正の値を使用してください。通常のビューアは何も回答しないので、必ずタイムアウト後にリスナーを削除するようにしてください。

警告 : ログインすると、全てのアタッチメントの on_rez イベントはアバターが実質的にチャットメッセージを送ることができるようになる前に発生します (だいたいログインのプログレスバーが半分までいったぐらいの時点です) 。このため、ビューアから自動返答を受け取るために、タイムアウトは 30 秒から 1 分ぐらいの充分に長い時間にしなければなりません。

警告2 : 2010年2月22日、Linden Lab はサードパーティ・ビューアの指針を発表し、サードパーティ・ビューアの名前の中に "Life" という文字を使用することを禁止しました。このため "Restrained Life" は"Restrained Love" に名前を変えざるをえませんでした。しかし、互換性維持の観点から、この @version コマンドは動作しますし、今後も動作します。しかし、新しく書くスクリプトではこれを 使用せず 、ユーザに "Restrained Life" という文字をどこにも 見せない ようにすることを推奨します。新しく書くスクリプトには、 代わりに @versionnew を使用してくださるようお願いします。


  • 自動バージョンチェック : "@versionnew=<channel_number>"

実装 v1.23 搭載している RLV のバージョンをビューアに <channel_number> のチャネルで直ちに発言させ、スクリプトが拾えるようにします。常に正の値を使用してください。通常のビューアは何も回答しないので、必ずタイムアウト後にリスナーを削除するようにしてください。

このコマンドは @version の後継で取って代わるものです。それでも、 @version は下位互換性のために維持されています。これは "RestrainedLove viewer v... (SL ...)" と返します("RestrainedLove" は 1 語です)。

警告 : ログインすると、全てのアタッチメントの on_rez イベントはアバターが実質的にチャットメッセージを送ることができるようになる前に発生します (だいたいログインのプログレスバーが半分までいったぐらいの時点です) 。このため、ビューアから自動返答を受け取るために、タイムアウトは 30 秒から 1 分ぐらいの充分に長い時間にしなければなりません。


  • 自動バージョン番号チェック : "@versionnum=<channel_number>"

実装 v1.21 ビューアにバージョンを <channel_number> のチャネルで直ちに発言させ、スクリプトが拾えるようにします。常に正の値を使用してください。通常のビューアは何も回答しないので、必ずタイムアウト後にリスナーを削除するようにしてください。このコマンドは @version よりは扱いやすいです。スクリプトがレスポンスを解析することがない分、番号をすぐに取得します。

バージョン番号は純粋な integer で、ビューアのバージョンを表しています。バージョンが X.Y.Z.P ならば、番号は X.10^6 + Y.10^4 + Z.10^2 + P になります。例えば、.21.1 は 1210100 になります。


  • 自動バージョンチェック、第二の方法 : llGetAgentLanguage (key id) 廃止: 使用しないでください!

実装 v1.16 この LSL 関数を呼び出すと、結果がすぐに返ります (リスナーやタイマーを使用する必要はありません)。これは、"@version" を送信した場合とまったく同じで、ユーザによって隠されることがありません。通常の SL ビューアから返される言語表記、"en-us", "fr", "ko" などはこの文字列で上書きされます。もしくはユーザが言語設定を隠すようにしている場合、何も返りません。通常のビューアではオプションとなっているため、スクリプトはこれを信用して使っていません。なので、この特性を RLV のバージョンチェックのより便利な代替手段になるように「ハイジャックする」のが理にかなっています。重要な注意点:この機能は RestrainedLove が v1.16 であっても、v1.21 以前のバージョンには実装できないため、llGetAgentLanguage() が空文字列で返ってきた場合は常に @version をあてにするようにしてください。これも注意点: RestrainedLove 1.16 では、llGetAgentLanguage() は、ログイン中に on_rez で呼ばれた場合、呼び出しが何秒か (何秒かは決まってません) 遅れることがなければ、空文字列を返します。最後の注意点: この機能はv1.16.1(とv1.16b、 Cool SL Viewerの場合) で削除されました。


  • 手動バージョンチェック : "@version"

実装 v1.0a このコマンドはアバターからユーザに IM で送信されなければなりません (オブジェクトからはうまくいきません)。ビューアは送信者に自動的にバージョンを返答しますが、ユーザの IM 窓にはメッセージも回答も表示されないため、すごくこそこそしています。


  • オブジェクトを取り外し可能/不可能にする : "@detach=<y/n>"

実装 v1.0a "n" オプションで呼ばれると、メッセージを送信したオブジェクト (アタッチメントである必要があります) は取り外し不可能となります。"y" オプションで呼ばれると、取り外し可能に戻ります。


  • 装着ポイントをロック解除/ロックする : "@detach:<attach_point_name>=<y/n>"

実装 v1.20 "n" オプションで呼ばれると、<attach_point_name> で示された装着ポイントは、full (その時点でオブジェクトが装着されている) でも empty (装着されていない) でもロックされます。制約がかかった時点でそのポイントに装着されているオブジェクトは、取り外し不能とされます。これは、"@detach=n" コマンド自体が発行されたのとちょうど同じような感じです。装着ポイントが空であればその状態のままとなり、いかなるアイテムもそこに装着することができなくなり、llAttachToAvatar() が呼び出されると失敗するようになります (オブジェクトは装着されますが、すぐに取り外されます) 。


  • 装着ポイントを empty でロック解除/ロックする : "@addattach[:<attach_point_name>]=<y/n>"

実装 v1.22 "n" オプションで呼ばれると、<attach_point_name> で示された装着ポイントは empty でロックされます。制約がかかった時点で装着ポイントに装着されているオブジェクトは取り外し可能ですが、そこに何も装着することができません。装着ポイントが空であればその状態のままとなり、いかなるアイテムもそこに装着することができなくなり、llAttachToAvatar() が呼び出されると失敗するようになります (オブジェクトは装着されますが、すぐに取り外されます) 。<attach_point_name> の指定がない場合、全ての装着ポイントに対して作用します。このコマンドは @addoutfit の片割れで、アタッチメントに対するものです。


  • 装着ポイントを full でロック解除/ロックする : "@remattach[:<attach_point_name>]=<y/n>"

実装 v1.22 "n" オプションで呼ばれると、<attach_point_name> で示された装着ポイントは full でロックされます。制約がかかった時点でそのポイントに装着されているオブジェクトは、取り外し不能とされます。装着ポイントが空であればユーザは何かを装着することができますが、そのオブジェクトは取り外し不能となり、いかなるアイテムに取り替えることもできなくなり、llAttachToAvatar() が呼び出されると失敗するようになります (オブジェクトは装着されますが、すぐに取り外されます) 。<attach_point_name> の指定がない場合、全ての装着ポイントに対して作用します。このコマンドは @remoutfit の片割れで、アタッチメントに対するものです。


  • コンテキストメニューからの「装着」を許可/禁止する : "@defaultwear=<y/n>

実装 v1.21 許可すると、ユーザはいつでもインベントリのコンテキストメニューから「装着」メニューを選ぶことができます。オブジェクトがアバター上でロックされていてもです。これはロックされているオブジェクトをないがしろにするリスクがありますが、5 秒以内に自動的に再装着されます (他に同じようにロックされているオブジェクトがあったら、再装着すべきものがなくなるまで、 1 秒おきに順次行われます) 。しかしながら、デタッチの際に制約を解除するようにスクリプトが組まれたオブジェクト、言い換えると、RLV を使用していればロックされているオブジェクトもデタッチされる可能性があるという事実を考慮していないものもあります。

そのため、このコマンドを "n" オプションで呼び出せばこのメニューは抑制されるものの、名前かフォルダ名に装着先ポイント名称が含まれているオブジェクトは装着できるようになっています。1.21 以前の RLV とちょうど同じように。これはユーザにはちょっと扱いにくい仕様ですが、ロックされているオブジェクトがうっかりデタッチされてしまうことのないようにしなければならないことを考えると、こちらのほうが安全です。


  • プライベートチャネルでの通知を開始/停止する : "@notify:<channel_number>[;word]=<rem/add>"

実装 v1.20, improved in v2.2 (and v1.24) 全ての制約、もしくはセミコロン (";") の後に指定された単語を含んだ名称をもつ制約の追加削除を、ビューアに特定のチャネルで自動的に復唱させます。<channel_number> のプライベートチャネルに返される内容は、他のスクリプトに意図しないコマンドを送ってしまわないように、先頭にスラッシュ ("/") がついています。そして、等号 ("=") の後に、 "n" か "y" がついており、それぞれ制約の追加と削除を示しています。"@clear" コマンドは等号を付加しません。他のスクリプトについての情報が無防備に開示されるのを避けるため、どのオブジェクトが制約を付加したのか撤廃したのかを知ることはできません。one-shot コマンド (force コマンド) も復唱しません。例えば、"@notify:2222;detach=add" はオブジェクトがロックされるたびに "/detach=n" を送信し、オブジェクトのロックが解除されるたびに "/detach=y" を送信します。チャネル 2222 でスクリプトがこれらを受信することになります。

注意 : v2.2 (と v1.24) からは、インベントリの提供時に表示するメッセージを設定できるようになっています。オブジェクトがアイテムやフォルダを提供すると、RLV v2.2 (と v1.24) 以上を使用しているユーザは指定されたチャネルで以下のどれかで自動応答します。

- /accepted_in_rlv inv_offer <folder> : このフォルダは受け取られ、 #RLV 配下に格納されて使用可能な状態になっています (ビューアはフォルダを変名して、頭にある "#RLV/" を削除してしまいますのでご注意ください) 。
- /accepted_in_inv inv_offer <folder> : このフォルダは受け取られましたが、まだ共有されていません。
- /declined inv_offer <folder> : このフォルダは受取拒否されたか、"ブロック"(かつての "ミュート") を押されたかしました。

<folder> はフォルダやアイテムの受取先のフルパスです。例えば、#RLV/~MyCuffs のようになっています。"inv_offer" の前にはスペースがあり、通知を設定しやすいようにトークンになっています。#RLV/~MyCuffs というフォルダが #RLV フォルダに受け取られたか知りたいのであれば、"@notify:2222;accepted_in_rlv inv_offer #RLV/~MyCuffs=add" というコマンドを発行してください。アバターが何か受け取ったか知りたいのであれば、"@notify:2222;inv_offer=add" とコマンドを発行すればよいです。


  • チャットを許可/禁止する : "@sendchat=<y/n>"

実装 v1.0b 禁止されると、チャネル 0 でタイプされたものは全て無視されます。しかし、スラッシュ ('/') で始まる emote やメッセージは、それぞれ 30 文字と 15 文字に丸められて通過します (以後変更になる可能性があります) 。()"-*=_^ のような特殊文字が入るメッセージは送信できず、読み捨てられます。ピリオド ('.') が現れると、以降のメッセージは切り捨てられます。


  • emote の丸めを行わない/行う : "@emote=<rem/add>"

実装 v1.01 この例外が追加されると、emote は丸められなくなります (しかし、特殊文字が読み捨てられることには変わりありません) 。


  • shout を許可する/しない : "@chatshout=<y/n>"

実装 v1.15 禁止されると、アバターが shout したときでも、通常の範囲のチャットとなります。メッセージを変更することは全くなく、範囲だけを変更します。


  • 普通の声の大きさで話すことを許可する/しない : "@chatnormal=<y/n>"

実装 v1.15 禁止されると、アバターが普通にチャットしたときでも、whisper となります。メッセージを変更することは全くなく、範囲だけを変更します。


  • whisper を許可する/しない : "@chatwhisper=<y/n>"

実装 v1.15 禁止されると、アバターが whisper したときでも、通常の範囲のチャットとなります。メッセージを変更することは全くなく、範囲だけを変更します。


  • パブリックなチャットをプライベートチャネルにリダイレクトする : "@redirchat:<channel_number>=<rem/add>"

実装 v1.16 有効になると、この制約はパブリックチャネル ("/0") で話した内容を全てオプションで指定されたプライベートチャネルにリダイレクトします。複数の制約がかかると、チャットのメッセージはそれぞれのチャネルにリダイレクトされるようになります。これは emote には適用されず、話している時にアニメーション (タイプ開始、終了、うなずき) が実行されなくなります。この制約は @sendchannel に取って代わるものではありません。

注意: RLV v1.22.1 / RLVa 1.1.0 の時点では、@redirchat はチャネル 0 では emote が転送されなくなるというバグがありました。@emote=add を別に発行すると、これを回避できます。このバグは、v1.23.0 までに修正されたようです。


  • オープンな emote をプライベートチャネルにリダイレクトする : "@rediremote:<channel_number>=<rem/add>"

実装 v1.19 有効になると、この制約はブリックチャネル ("/0") で話した emote を全てオプションで指定されたプライベートチャネルにリダイレクトします。複数の制約がかかると、emote はそれぞれのチャネルにリダイレクトされるようになります。


  • インスタントメッセージの送信を許可する/しない : "@sendim=<y/n>"

実装 v1.0b 禁止されると、IM で入力した内容は全て破棄され、受信者には代わりにわけのわからないメッセージが送信されます。


  • インスタントメッセージの送信を許可する/しない(セキュリティ強化) : "@sendim_sec=<y/n>"

実装 v1.21 禁止されると、IM で入力した内容は全て破棄され、受信者には代わりにわけのわからないメッセージが送信されます。このコマンドは、先のコマンドと違い、全てのオブジェクトからでなく、同じオブジェクトから発行された例外のみ受け付けます。


  • インスタントメッセージの送信制限の例外を追加/削除する : "@sendim:<UUID>=<rem/add>"

実装 v1.01 例外を追加すると、コマンドで指定された UUID のユーザは IM を受け取れるようになります。当該アバターの制約のみ上書きします。 (例外の数に制限はありません) 使用しなくなったら必ず削除してください。


  • 指定した人へのインスタントメッセージの送信を許可/禁止する : "@sendimto:<UUID>=<y/n>"

実装 v2.3 と v1.25 禁止されると、指定した人に IM で入力した内容は全て破棄され、受信者には代わりにわけのわからないメッセージが送信されます。


  • チャットメッセージの受信を許可/禁止する : "@recvchat=<y/n>"

実装 v1.0b 禁止されると、パブリックチャットで受信した内容は emote を除いて全て破棄されます。


  • チャットメッセージの受信を許可/禁止する(セキュリティ強化) : "@recvchat_sec=<y/n>"

実装 v1.21 禁止されると、パブリックチャットで受信した内容は emote を除いて全て破棄されます。このコマンドは、先のコマンドと違い、全てのオブジェクトからでなく、同じオブジェクトから発行された例外のみ受け付けます。


  • チャットメッセージの受信制限に例外を追加/削除する : "@recvchat:<UUID>=<rem/add>"

実装 v1.01 例外を追加すると、コマンドで指定された UUID のユーザからのチャットメッセージを聞けるようになります。当該アバターの制約のみ上書きします。 (例外の数に制限はありません) 使用しなくなったら必ず削除してください。


  • 指定した人からのチャットメッセージの受信を許可/禁止する : "@recvchatfrom:<UUID>=<y/n>"

実装 v2.3 と v1.25 禁止されると、指定したアバターからパブリックチャットで受信した内容は emote を除いて全て破棄されます。


  • emote の表示を許可/禁止する : "@recvemote=<y/n>"

実装 v1.19 禁止されると、パブリックチャットでの全ての emote が破棄されます。


  • emote の表示を許可/禁止する(セキュリティ強化) : "@recvemote_sec=<y/n>"

実装 v1.21 禁止されると、パブリックチャットでの全ての emote が破棄されます。このコマンドは、先のコマンドと違い、全てのオブジェクトからでなく、同じオブジェクトから発行された例外のみ受け付けます。


  • emote の表示制限に例外を追加/削除する : "@recvemote:<UUID>=<rem/add>"

実装 v1.19 例外を追加すると、コマンドで指定された UUID のユーザからの emote を見ることができるようになります。当該アバターの制約のみ上書きします。 (例外の数に制限はありません) 使用しなくなったら必ず削除してください。


  • インスタントメッセージの受信を許可/禁止する : "@recvim=<y/n>"

実装 v1.0b 禁止されると、受信した IM は全て破棄され、送信者にはメッセージを読むことのできない旨の通知が送信されます。


  • インスタントメッセージの受信を許可/禁止する(セキュリティ強化) : "@recvim_sec=<y/n>"

実装 v1.21 禁止されると、受信した IM は全て破棄され、送信者にはメッセージを読むことのできない旨の通知が送信されます。このコマンドは、先のコマンドと違い、全てのオブジェクトからでなく、同じオブジェクトから発行された例外のみ受け付けます。


  • インスタントメッセージの受信制限に例外を追加/削除する : "@recvim:<UUID>=<rem/add>"

実装 v1.01 例外を追加すると、コマンドで指定された UUID のユーザからのインスタントメッセージを読むことができるようになります。当該アバターの制約のみ上書きします。 (例外の数に制限はありません) 使用しなくなったら必ず削除してください。


  • 指定した人からのインスタントメッセージの受信を許可/禁止する : "@recvimfrom:<UUID>=<y/n>"

実装 v2.3 と v1.25 禁止されると、指定した人から受信した IM は全て破棄され、送信者にはメッセージを読むことのできない旨の通知が送信されます。


  • ランドマークへのテレポートを許可/禁止する : "@tplm=<y/n>"

実装 v1.0 禁止されると、 ユーザはランドマーク、プロフィールの Picks、その他の手段を使って、事前に設定されている場所へテレポートすることができなくなります。


  • 場所へのテレポートを許可/禁止する : "@tploc=<y/n>"

実装 v1.0 禁止されると、ユーザは地図やその他の手段を使った、座標指定によるテレポートができなくなります。


  • フレンドからの呼び出しによるテレポートを許可/禁止する : "@tplure=<y/n>"

実装 v1.0 禁止されると、ユーザは全てのテレポートの誘いを自動で拒否し、招待者に通知されます。


  • フレンドからの呼び出しによるテレポートを許可/禁止する(セキュリティ強化) : "@tplure_sec=<y/n>"

実装 v1.21 禁止されると、ユーザは全てのテレポートの誘いを自動で拒否し、招待者に通知されます。このコマンドは、先のコマンドと違い、全てのオブジェクトからでなく、同じオブジェクトから発行された例外のみ受け付けます。


  • フレンドからの呼び出しによるテレポートの制限に例外を追加/削除する : "@tplure:<UUID>=<rem/add>"

実装 v1.0 例外を追加すると、コマンドで指定された UUID のユーザから招待を受けてテレポートすることができるようになります。当該アバターの制約のみ上書きします。 (例外の数に制限はありません) 使用しなくなったら必ず削除してください。


  • Sit によるテレポートを制限/制限解除する : "@sittp=<y/n>"

実装 v1.0 制限されると、アバターは 1.5 m 以内に近づかないとプリムにすわれないようになります。これでアバターが壁をすり抜けられないようにすることで、檻を強固なものにすることができます(プリムがすぐそばにないことが条件です)。


  • 座った位置と違う位置で立ち上がることを許可/禁止する : @standtp=<y/n>

実装 v2.1.2 と v1.24 この制限が有効になっている状態でアバターが立ち上がると、座った位置に自動的に引き戻されます。この制限を有効にすると、「最後に立っていた位置」も記録されますので、ひったくりの類で、被害者を座らせて、引きずって檻の中に閉じ込め、そこで制限を有効にして、被害者を立たせた場合は、大丈夫です。この場合、アバターは檻の中にいます。


  • 許可の例外を許可する/拒否する : "@permissive=<y/n>"

実装 v1.21 拒否すると、全ての制限は(あれば)セキュリティ強化となります。つまり、制限に対する、同じオブジェクトから発行されていない例外は無視されます。 セキュリティ強化でない制限 (@sendim や @recvim などの元々のバージョン) を使っていたり、 @permissive を使っていなかったりすると、他のオブジェクトから発行された例外で当該アバターが救われるようになってしまいます。

注意 : このコマンド (または、セキュリティが強化されたコマンド) を使うと他のオブジェクトから発行された例外は (そのオブジェクトの主要な機能であっても) 何の通知もなしに破棄されます。このため、この制約が有効になっていると、製品によっては動作しなくなったように見えることもあります。例えば、指定したフレンドに常に IM を送信することのできるようにする製品は、他のオブジェクトから @sendim_sec や @permissive コマンドを送信されると、壊れたような挙動を示したりします。このため、これは気をつけて使うようにし、あなたが作った製品がどんなに堅牢かを 知ってもらうようにしましょう。


  • オブジェクトに紐づいた全てのルールを消去する : "@clear"

実装 v1.0a、ただし動作するのは v1.04a から このコマンド特定の UUID に紐づいた、全ての制約や例外を消去します。

警告 : デフォルトでデタッチの際に発動することになっていると、@defaultwear が有効の場合に自動的に再装着がされないことがあります。@clear は @detach=n 制約も解除してしまうので、そのアイテムが default-wear-action によってたまたまデタッチされてしまったとビューアが思い込み、再装着しなくなるからです。

考えられる回避方法:

  • @clear=<pattern> で、追加した制約だけを解除する
  • アタッチメントがロックされていないと確信できる場合にだけ、デタッチの際に @clear を発動させる
  • @clear はどんな場合も発動させず、ビューアが制約を回収するまで待つ


  • オブジェクトに紐づいた一部のルールを消去する : "@clear=<string>"

実装 v1.0a、ただし動作するのは v1.04a から このコマンド特定の UUID に紐づいた、<string> という名前をもつ制約や例外を消去します。良い例として、"@clear=tp" があります。これはオブジェクトに紐づいた全ての teleport 制約と例外を消去します。一方で、"@clear=tplure" は友人によるテレポートを許可しない制約のみを消去します。


  • オブジェクトの編集を許可/禁止する : "@edit=<y/n>"

実装 v1.03 オブジェクトの編集・オープンを禁止されると、建造・編集ウィンドウは開かなくなります。


  • 編集制限に例外を追加/削除する : "@edit:<UUID>=<rem/add>"

実装 v2.3 と v1.25 例外を追加すると、ユーザは指定したオブジェクトの編集・オープンができるようになります。


  • 持ち物の rez を許可/禁止する : "@rez=<y/n>"

実装 v1.03 持ち物の rez を禁止されると、オブジェクトの作成・削除・持ち物からのドロップ・アタッチメントのドロップは失敗します。


  • 指定したオブジェクトの編集を許可/禁止する : "@editobj:<UUID>=<y/n>"

'実装 v2.3 と v1.25 禁止されると、指定したオブジェクトの編集・オープンしようとしても、建造・編集ウィンドウは開かなくなります。


  • 服の装着を許可/禁止する : @addoutfit[:<part>]=<y/n>

実装 v1.10, スキン、髪、目の追加 v1.10.1 指定できるパーツ :

gloves|jacket|pants|shirt|shoes|skirt|socks|underpants|undershirt|skin|eyes|hair|shape|alpha|tattoo

パーツの指定がない場合、現在装着しているものの他に何も装着することができなくなります。

注意: Viewer 2.0 から、スキンのレイヤーが2つ増えました: Tatoo (タトゥー) と Avatar Transparency Mask (透明マスク) です。arpha と tatoo のレイヤーは、Viewer 2.0 の機能を実装した RLV 対応ビューアでのみサポートします。


  • 脱衣を許可/禁止する : @remoutfit[:<part>]=<y/n> (underpants と undershirt はティーンに許可できません)

実装 v1.10, スキン、髪、目の追加 v1.10.1 指定できるパーツ :

gloves|jacket|pants|shirt|shoes|skirt|socks|underpants|undershirt|skin|eyes|hair|shape|alpha|tattoo

パーツの指定がない場合、現在装着しているものは何も外すことができなくなります。

注意: Viewer 2.0 から、スキンのレイヤーが2つ増えました: Tatoo (タトゥー) と Avatar Transparency Mask (透明マスク) です。arpha と tatoo のレイヤーは、Viewer 2.0 の機能を実装した RLV 対応ビューアでのみサポートします。


  • 強制的に服を脱がす : @remoutfit[:<part>]=force (*) (underpants と undershirt はティーンに脱がせることはできません)

実装 v1.10 指定できるパーツ :

gloves|jacket|pants|shirt|shoes|skirt|socks|underpants|undershirt|alpha|tattoo

パーツの指定がない場合、全て脱がします。

注意: Viewer 2.0 から、スキンのレイヤーが2つ増えました: Tatoo (タトゥー) と Avatar Transparency Mask (透明マスク) です。arpha と tatoo のレイヤーは、Viewer 2.0 の機能を実装した RLV 対応ビューアでのみサポートします。

注意: スキン、シェイプ、目、髪は体の一部のため、取り外すことができません。 (そして、全て脱がすということは、アバターを見えなくすることになります)


  • 強制的にアタッチメントを取り外す : @detach[:attachpt]=force (*)

実装 v1.10 指定できるパーツ :

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

パーツの指定がない場合、全て取り外します。


  • 強制的にアタッチメントを取り外す (エイリアス) : @remattach[:attachpt]=force (*)

実装 v1.22 このコマンドは @detach[:attachpt]=force のエイリアスです。(下位互換性維持のために存在します)


  • 装着している服の一覧を取得する : @getoutfit[:part]=<channel_number>

実装 v1.10, スキン、髪、目の追加 v1.10.1 ビューアに自動的に現在の服のレイヤの使用状況を回答させます。結果は 0(空) か 1(使用中) の並びで、チャネル <channel_number> ですぐに回答され、スクリプトでそれを拾うことができます。常に正の整数を使用してください。通常のビューアは何も回答しないので、必ずタイムアウト後にリスナーを削除するようにしてください。

0 と 1 の並びは順に次の項目に対応します。

gloves,jacket,pants,shirt,shoes,skirt,socks,underpants,undershirt,skin,eyes,hair,shape

パーツが指定されると、パーツにより 0(空) か 1(使用中) だけが回答されます。

例 1 : @getoutfit=2222 => "0011000111" => アバターは pants, shirt, underpants, undershirt, skin を装着しています。
例 2 : @getoutfit:socks=2222 => "0" => アバターは socks を履いていません。

注意: Viewer 2.0 の機能を実装しているビューアでは、このような並びになります:

gloves,jacket,pants,shirt,shoes,skirt,socks,underpants,undershirt,skin,eyes,hair,shape,alpha,tattoo


  • 装着しているアタッチメントの一覧を取得する : @getattach[:attachpt]=<channel_number>

実装 v1.10 ビューアに自動的に現在のアタッチメント装着ポイントの使用状況を回答させます。結果は 0(空) か 1(使用中) の並びで、チャネル <channel_number> ですぐに回答され、スクリプトでそれを拾うことができます。常に正の整数を使用してください。通常のビューアは何も回答しないので、必ずタイムアウト後にリスナーを削除するようにしてください。

0 と 1 の並びは順に次の項目に対応します。

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

パーツが指定されると、パーツにより 0(空) か 1(使用中) だけが回答されます。

例 1 : @getattach=2222 => "011000011010000000000000100100000000101" => アバターは 
chest, skull, left and right foot, pelvis, l and r lower leg, HUD bottom left, HUD bottom right に装着しています。
例 2 : @getattach:chest=2222 => "1" => アバターは chest に何か装着しています。

注意 : 最初の文字 ("none") は常に '0' なので、それぞれの装着ポイントのインデックスは LSL の対応する ATTACH_* 定数と完全に一致します。例えば、インデックス 9 を示す定数は ATTACH_BACK ("spine") となります。インデックスが 0 で始まるので気をつけてください。


  • ビューアにアタッチメントの受け入れとコントロール権取得の許可を出させる : @acceptpermission=<rem/add>

実装 v1.16 アバターに自動的にアタッチメントとコントロール権取得を受け入れさせます。確認ダイアログは表示されません。もちろん、このコマンドよりも @denypermission のほうが優先度が高くなります。


  • アタッチメントの受け入れとコントロール権取得を許可/禁止する : @denypermission=<rem/add>

実装 v1.16, 非推奨化 v1.16.2 禁止されると、全ての装着・コントロール権取得のリクエストが自動的に拒否されます。確認ダイアログは表示されません。 かなり迷惑をかけるのと、v1.16.1 でロックされたオブジェクトは自動的に再装着されるようになったという理由から、このコマンドは今では非推奨となりました。使用しないでください。


  • 持ち物の使用を許可/禁止する : @showinv=<y/n>

実装 v1.10 持ち物ウィンドウを強制的に閉じ、開かないようにします。


  • ノートカードの閲覧を許可/禁止する : @viewnote=<y/n>

実装 v1.10 ノートカードを開けないようにしますが、既に開いてあるものは閉じません。


  • スクリプトの閲覧を許可/禁止する : @viewscript=<y/n>

実装 v1.22 スクリプトを開けないようにしますが、既に開いてあるものは閉じません。


  • テクスチャの閲覧を許可/禁止する : @viewtexture=<y/n>

実装 v1.22 テクスチャ(スナップショット)を開けないようにしますが、既に開いてあるものは閉じません。


  • 立つことを許可/禁止する : @unsit=<y/n>

実装 v1.10, v1.15 でテレポートもできないように修正 「立ち上がる」ボタンを隠します。v1.15 からは、立つ手段ともなるテレポートもできないようになっています。


  • オブジェクトに強制的に座らせる : @sit:<UUID>=force (*)

実装 v1.10 ユーザが Sit によるテレポートを禁止されており、 1.5 m 以上離れている場合、または、立つことを禁止されている場合は無効となります。


  • 強制的に立たせる : @unsit=force (*)

実装 v1.10 言い訳がましいですが、さまざまな事情により失敗することもありますので、今のところ信頼しないでください。もっとテストが必要です。


  • 座ることを許可/禁止する : @sit=<y/n>

実装 v1.16.2 いかなるものの上にも座れないようにします。@sit:UUID=force で指定されているオブジェクトの上にでもです。


  • 指定したチャネル以外のチャネルを使用することを許可/禁止する : @sendchannel[:<channel>]=<y/n>

実装 v1.10 @sendchat の補完コマンドです。このコマンドはユーザがメッセージをパブリックでないチャネルに送信することを禁止します。チャネルが指定されると、当該チャネルには先の制約は適用されません(このため、 "y" や "n" ではなく、"rem" や "add" を使用するほうがいいでしょう)。この制約がかかっていても、ビューアは @version=nnn や @getstatus=nnn などと自動返答することができます。


  • 指定したチャネル以外のチャネルを使用することを許可/禁止する(セキュリティ強化) : @sendchannel_sec[:<channel>]=<y/n>

実装 v1.10 の補完コマンドです。このコマンドはユーザがメッセージをパブリックでないチャネルに送信することを禁止します。チャネルが指定されると、当該チャネルには先の制約は適用されません(このため、 "y" や "n" ではなく、"rem" や "add" を使用するほうがいいでしょう)。この制約がかかっていても、ビューアは @version=nnn や @getstatus=nnn などと自動返答することができます。 このコマンドは、先のコマンドと違い、全てのオブジェクトからでなく、同じオブジェクトから発行された例外のみ受け付けます。


  • 現在アバターに発行されている制約の一覧を取得する : @getstatus[:<part_of_rule>]=<channel>

実装 in v1.10, v1.16 でちょっとおかしくなった ビューアに自動的にアバターに対する制約の適用状況を回答させます。コマンドを実行したオブジェクトが発行した制約のみ回答されます。チャネル <channel_number> ですぐに回答され、スクリプトでそれを拾うことができます。常に正の整数を使用してください。通常のビューアは何も回答しないので、必ずタイムアウト後にリスナーを削除するようにしてください。結果はスラッシュ ('/') で区切られた制約名称のリストとして返却されます。注意: v1.16 からはスラッシュは文字列の先頭であるとみなされるようになっています。llParseString2List() で処理するのであれば大丈夫ですが、llParseStringKeepNulls() で処理する場合はおかしくなります!

このコマンドは、同じオブジェクト内にある違うスクリプトが競合する制約を発行する可能性のあるようなスクリプトを作成している人にとっては役に立ちます(例: サードパーティープラグイン)。他のオブジェクトと競合することはありません。これが、このコマンドで返される制約が、呼び出し元で発行されたものに限定されている理由です。

<part_of_rule> は制約名、もしくは制約名の一部です。スクリプトが特定の制約の有無だけを確認したい場合に便利です。

例 : アバターが tploc, tplure, tplm, sittp の制約下に置かれているとき、スクリプトはこのような回答を得ます:
@getstatus=2222  =>  /tploc/tplure/tplm/sittp
@getstatus:sittp=2222  =>  /sittp
@getstatus:tpl=2222  =>  /tploc/tplure/tplm  ("tpl" は "tploc"、"tplure"、"tplm"  の一部ですが、"sittp" の一部ではないため)


  • 現在アバターに発行されているすべての制約の一覧を取得する : @getstatusall[:<part_of_rule>]=<channel>

実装 v1.15, v1.16 でちょっとおかしくなった ビューアに自動的にアバターに対する制約の適用状況を回答させます。@getstatus と異なり、UUID に関わらずすべてのオブジェクトが発行した制約が回答されます。チャネル <channel_number> ですぐに回答され、スクリプトでそれを拾うことができます。常に正の整数を使用してください。通常のビューアは何も回答しないので、必ずタイムアウト後にリスナーを削除するようにしてください。結果はスラッシュ ('/') で区切られた制約名称のリストとして返却されます。注意: v1.16 からはスラッシュは文字列の先頭であるとみなされるようになっています。llParseString2List() で処理するのであれば大丈夫ですが、llParseStringKeepNulls() で処理する場合はおかしくなります!


  • アバターの持ち物の中の共有フォルダの一覧を取得する : @getinv[:folder1/.../folderN]=<channel_number>

実装 v1.11, v1.13 でサブフォルダを追加 ビューアに自動的に "#RLV# というフォルダの中にあるフォルダの一覧を (あれば) 回答させます。チャネル <channel_number> ですぐに回答され、スクリプトでそれを拾うことができます。フォルダが指定されると、共有フォルダのルートでなく、指定されたパスに存在するフォルダの中にあるサブフォルダのリストが返却されます (例: "@getinv:Restraints/Leather cuffs/Arms=2222")。常に正の整数を使用してください。通常のビューアは何も回答しないので、必ずタイムアウト後にリスナーを削除するようにしてください。

結果はカンマ (",") で区切られた、フォルダ名のリストとして返却されます。ドット(".") で始まるフォルダは無視されます。


  • アバターの持ち物の中の共有フォルダの一覧を取得する(アイテムの使用状況つき) : @getinvworn[:folder1/.../folderN]=<channel_number>

実装 v1.15 ビューアに自動的に "#RLV# というフォルダの中にあるフォルダの一覧を (あれば) 回答させます。チャネル <channel_number> ですぐに回答され、スクリプトでそれを拾うことができます。フォルダが指定されると、共有フォルダのルートでなく、指定されたパスに存在するフォルダの中にあるサブフォルダのリストが返却されます (例: "@getinv:Restraints/Leather cuffs/Arms=2222")。常に正の整数を使用してください。通常のビューアは何も回答しないので、必ずタイムアウト後にリスナーを削除するようにしてください。

結果はカンマ (",") で区切られた、フォルダ名のリストとして返却されます。それぞれの項目の後ろにパイプ ("|") と2桁の数字がついています。(現在のフォルダを見せない @getinv とは異なり) 現在のフォルダが最初の項目にありますが、名前はなく、パイプと2桁の数字だけがついています。

オブジェクトの問い合わせ: "@getinvworn:Restraints/Leather cuffs=2222"
ビューアの回答        : "|02,Arms|30,Legs|10"

ドット(".") で始まるフォルダは無視されます。2桁の数字は次のように算出されます。

1桁目: 当該フォルダ内のアイテムの装着割合(編集不可能なアイテムも含む)。この例では、"30" の "3" というのが、「Arms フォルダにある全てのアイテムが装着されている」こと、 "10" の "1" というのが、「Legs フォルダのアイテムは何も装着されていないが、装着できるアイテムはある」ことを意味します。

2桁目: 当該フォルダのサブフォルダ全体での装着割合。この例では、"02" の "2" というのが、「Leather cuffs というフォルダに含まれるどこかのフォルダで、一部のアイテムが装着されている」ことを意味します。

数字は 0 から 3 まであり、それぞれ次のような意味をもちます。

  • 0 : フォルダの中にアイテムがない
  • 1 : フォルダの中にアイテムがあるが、装着されているものはない
  • 2 : フォルダの中にアイテムがあり、一部は装着されている
  • 3 : フォルダの中にアイテムがあり、全て装着されている


  • 検索条件に該当する共有フォルダのパスを取得する : @findfolder:part1[&&...&&partN]=<channel_number>

実装 v1.13.1 ビューアに自動的に<path1>, <path2>, ... <pathN> を名前の一部に含む最初の共有フォルダのパスを回答させます。チャネル <channel_number> ですぐに回答され、スクリプトでそれを拾うことができます。深さ優先探索で検索されます。 "and" のように "&&" で連結します。常に正の整数を使用してください。通常のビューアは何も回答しないので、必ずタイムアウト後にリスナーを削除するようにしてください。隠しフォルダ (ドット "." で始まるフォルダ) や、チルダ ("~") で始まるフォルダは検索されません。結果はスラッシュ ("/") で区切られたパス形式で返却されます。


  • 共有フォルダ内のアイテムを強制的に装着する : @attach:<folder1/.../folderN>=force (*)

実装 v1.11、編集不可能なアイテムについては v1.12 で対応、サブフォルダは v1.13 で対応 ビューアに指定されたパス (#RLV の配下にある必要があります) にあるフォルダの中にある全てのオブジェクトと服を装着させます。オブジェクトの名前は 必ず 装着先ポイント名を含んでいなければならず、含んでいないと装着されません。編集不可能なオブジェクトは、名称変更ができないため、 必ず それぞれ名称に装着ポイントの名称を含むフォルダの中に入っていなければなりません( 1 つのフォルダに 1 個のオブジェクト) 。名称の先頭にドット (".") があってはなりません。そのようなフォルダはスクリプトからは見えないからです。

装着ポイントの名前は、「装着先」サブメニューにある名前と同じものです。"skull", "chest", "l forearm" などなど。

注意 1:フォルダの名前にスラッシュを含めることは 可能 です。そのときには、その名前がフォルダ名となっているものがあれば優先して選択されます。 (例えば、"@attach:Restraints/cuffs=force" が発行されると、"Restraints/cuffs" フォルダが選択され、その後に "Restraints" という親フォルダの中の "cuffs" フォルダが選択されることになります)

注意 2 : フォルダの名前の頭に+記号がついているときは、@attachover と同じような挙動となります。このルールはデバッグ設定 "RestrainedLoveStackWhenFolderBeginsWith" で変更することができます。


  • 共有フォルダ内のアイテムを強制的に装着する(既に装着されているものは変更しない) : @attachover:<folder1/.../folderN>=force (*)

実装 v2.1.2 と v1.24 このコマンドは先ほどの @attach と全く同じように動作しますが、既に装着されているオブジェクトや服を取り替えることはしません。


  • 共有フォルダ内のアイテムをサブフォルダも再帰的に強制的に装着する : @attachall:<folder1/.../folderN>=force (*)

実装 v1.15 このコマンドは先ほどの @attach と全く同じように動作しますが、サブフォルダの中にあるものも全て装着します。


  • 共有フォルダ内のアイテムをサブフォルダも再帰的に強制的に装着する(既に装着されているものは変更しない) : @attachallover:<folder1/.../folderN>=force (*)

実装 v2.1.2 と v1.24 このコマンドは先ほどの @attachall と全く同じように動作しますが、既に装着されているオブジェクトや服を取り替えることはしません。


  • 共有フォルダ内のアイテムを強制的に取り外す : @detach:<folder_name>=force (*)

実装 v1.11 ビューアに <folder_name> (#RLV の配下にある必要があります) の中にあるオブジェクトを取り外し、服を脱ぐようにさせます。"@detach" が装着ポイントの名称 (skull, pelvis... 上記参照のこと) と一緒に使われていると、同じコマンドのため、そちらがこの方法より優先します。


  • 共有フォルダ内のアイテムをサブフォルダも再帰的に強制的に取り外す : @detachall:<folder1/.../folderN>=force (*)

実装 v1.15 このコマンドは先ほどの @detach と全く同じように動作しますが、サブフォルダの中にあるものも全て取り外します。


  • 指定した装着ポイントにあるオブジェクト・服を含む共有フォルダのパスを取得する : @getpath[:<attachpt> or <clothing_layer>]=<channel_number>

実装 v1.16 以下の条件にあてはまるアイテムを含む共有フォルダのパスをビューアに回答させます。

    • オプションを指定しない場合、コマンドを発行したアイテム。
    • オプションで指定された装着ポイントに装着されているアタッチメント。 例 : @getpath:spine=2222 => "Restraints/Collar"
    • オプションで指定されたレイヤに装着されている服。例 : @getpath:pants=2222 => "Casual/Jeans/Tight"

常に正の整数を使用してください。通常のビューアは何も回答しないので、必ずタイムアウト後にリスナーを削除するようにしてください。隠しフォルダ (ドット "." で始まるフォルダ) も検索されます。結果はスラッシュ ("/") で区切られたパス形式で返却されます。

注意: 1.40.4 がメイングリッドで稼働して、今では同じ装着ポイントに複数のオブジェクトを装着することが可能となっています。このため、このコマンドの結果はもはや大した意味をもちません。というのも、複数のフォルダに分散されていても、1 つのフォルダしか結果として返ってこないからです。このため、@getpathnew を利用するのをおすすめします。@getpath はユーザが 2.1 以上のバージョンに移行しだい、段階的に廃止していく予定です。


  • 指定した装着ポイントにあるオブジェクト・服を含む共有フォルダのパスを全て取得する : @getpathnew[:<attachpt> or <clothing_layer>]=<channel_number>

実装 v2.1 と v1.24 以下の条件にあてはまるアイテムを含む共有フォルダのパスをビューアに回答させます。

    • オプションを指定しない場合、コマンドを発行したアイテム。
    • オプションで指定された装着ポイントに装着されているアタッチメント。 例 : @getpathnew:spine=2222 => "Restraints/Collar,Jewelry/Cute necklace"
    • オプションで指定されたレイヤに装着されている服。例 : @getpathnew:pants=2222 => "Casual/Jeans/Tight"

常に正の整数を使用してください。通常のビューアは何も回答しないので、必ずタイムアウト後にリスナーを削除するようにしてください。隠しフォルダ (ドット "." で始まるフォルダ) も検索されます。結果はスラッシュ ("/") で区切られたパス形式で返却されます。複数のアウトフィットが関係しているため、複数のフォルダを返却しなければならない場合は、カンマ (",") で区切ったリスト形式で返却されます。

2.1 より複数のオブジェクトが同じ装着ポイントに装着できるようになったため、このコマンドは @getpath の代替として追加されました。


  • 指定した装着ポイントにあるオブジェクト・服を含む共有フォルダのアイテムを全て強制的に装着する : @attachthis[:<attachpt> or <clothing_layer>]=force (*)

実装 v1.16 このコマンドは @getpath と @attach コマンドの連続発行と同じ動きをするショートカットです(リスナーやタイマーの節約になります。)


  • 指定した装着ポイントにあるオブジェクト・服を含む共有フォルダのアイテムを全て強制的に装着する(既に装着されているものは変更しない) : @attachthisover[:<attachpt> or <clothing_layer>]=force (*)

実装 v2.1.2 と v1.24 このコマンドは先ほどの @attachthis と全く同じように動作しますが、既に装着されているオブジェクトや服を取り替えることはしません。


  • 指定した装着ポイントにあるオブジェクト・服を含む共有フォルダとサブフォルダのアイテムを全て強制的に装着する : @attachallthis[:<attachpt> or <clothing_layer>]=force (*)

実装 v1.16 このコマンドは @getpath と @attachall コマンドの連続発行と同じ動きをするショートカットです(リスナーやタイマーの節約になります。)


  • 指定した装着ポイントにあるオブジェクト・服を含む共有フォルダのアイテムを全て強制的に取り外す : @detachthis[:<attachpt> or <clothing_layer>]=force (*)

実装 v1.16 このコマンドは @getpath と @detach コマンドの連続発行と同じ動きをするショートカットです(リスナーやタイマーの節約になります。)


  • 指定した装着ポイントにあるオブジェクト・服を含む共有フォルダとサブフォルダのアイテムを全て強制的に取り外す : @detachallthis[:<attachpt> or <clothing_layer>]=force (*)

実装 v1.16 このコマンドは @getpath と @detachall コマンドの連続発行と同じ動きをするショートカットです(リスナーやタイマーの節約になります。)


  • アイテムを強制的に取り外す : @detachme=force (*)

実装 v1.16.2 このコマンドを発行したオブジェクトをアバターから取り外します。このコマンドは @clear を呼んだ後で llDetachFromAvatar() を呼び出すときに起こる競合問題(制約をクリアする前にオブジェクトを取り外してしまい、しばらくして自動的に再装着されてしまう場合がある)を解消するためにあります。このコマンドが導入されたことにより、@clear を呼び出して、@detachme=force を呼び出すことで、必ず @clear が先に実行されるようにすることができるようになりました。


  • フォルダ内のアイテムの取り外しを許可/禁止する : @detachthis[:<layer>|<attachpt>|<path_to_folder>]=<y/n>

実装 v2.3 と v1.25 禁止されると、ユーザは以下の条件にあてはまるフォルダに含まれるアイテムを取り外すことができなくなります。 - オプションを指定しない場合、コマンドを発行したアイテムが含まれるフォルダ。 - オプションで指定されたレイヤに装着されている服が含まれるフォルダ。 - オプションで指定された装着ポイントに装着されているアタッチメントが含まれるフォルダ。 - オプションで指定されたパスで参照されるフォルダ。

さらに、禁止されたフォルダは名前の変更、移動、削除、編集ができなくなります。


  • フォルダ内とそのサブフォルダ内のアイテムの取り外しを許可/禁止する : @detachallthis[:<layer>|<attachpt>|<path_to_folder>]=<y/n>

実装 v2.3 と v1.25 このコマンドは @detachthis と同じように動作しますが、サブフォルダにも再帰的に適用されます。


  • フォルダ内のアイテムの装着を許可/禁止する : @attachthis:<layer>|<attachpt>|<path_to_folder>=<y/n>

実装 in v2.3 と v1.25 禁止されると、ユーザは以下の条件にあてはまるフォルダのアイテムを装着することができなくなります。 - オプションで指定されたレイヤに装着されるようになっている服が含まれるフォルダ。 - オプションで指定された装着ポイントに装着されるようになっているアタッチメントが含まれるフォルダ。 - オプションで指定されたパスで参照されるフォルダ。

さらに、禁止されたフォルダは名前の変更、移動、削除、編集ができなくなります。


  • フォルダ内とそのサブフォルダ内のアイテムの着用を許可/禁止する : @attachallthis[:<layer>|<attachpt>|<path_to_folder>]=<y/n>

実装 in v2.3 and v1.25 このコマンドは @attachthis と同じように動作しますが、サブフォルダにも再帰的に適用されます。


  • 1.5 m 以上離れたオブジェクトのタッチを許可/禁止する : @fartouch=<y/n>

実装 v1.11 禁止されると、アバターは 1.5 m 以上はなれた場所にあるオブジェクトをタッチすることができなくなります。このコマンドでより現実的な制約をつけることができます。なぜなら、アバターはオブジェクトをクリックするためには、オブジェクトを押すことのできる状態でなければならないはずだからです。


  • 世界地図の閲覧を許可/禁止する : @showworldmap=<y/n>

実装 v1.11 禁止されると、アバターは世界地図を参照することができなくなり、制約が有効になった時点で開かれていた地図は閉じます。


  • ミニマップの閲覧を許可/禁止する : @showminimap=<y/n>

実装 v1.11 禁止されると、アバターはミニマップを参照することができなくなり、制約が有効になった時点で開かれていたミニマップは閉じます。


  • 現在の場所を知ることを許可/禁止する : @showloc=<y/n>

実装 v1.12 禁止されると、当該ユーザは現在自分がどこにいるかを知ることができなくなります。つまり、世界地図は隠され、メニューバーにある区画や地域の名前は隠され、ランドマークは作成できず、土地も買うことができず、テレポートした後もどこにテレポートしたか表示されず、「Second Life について」のダイアログボックスにも場所は表示されず、システムやオブジェクトのメッセージも、地域や区画の名前が含まれていたらぼかされます。しかし、llOwnerSay はありのままに表示しますので、レーダー類は正常に動作します(RLV コマンドも大丈夫です)。


  • ユーザを強制テレポートさせる : @tpto:<X>/<Y>/<Z>=force (*)

実装 v1.12 このコマンドはアバターを指定した座標にテレポートさせます。ここで注意しておきたいのは、座標は常に グローバル なので、コマンドの呼び出しを簡単に考えてはいけないということです。もっと言うと、テレポート先がテレハブやテレポート・ルートを含む場合、指定された場所ではなくそちらに飛んでしまいます。これは SL の制約です。また、@tpto は @tploc=n によって打ち消され、v1.15 以上では、@unsit によっても打ち消されることを覚えておいてください。

このコマンドを正しく呼び出している例を示します。

<lsl>

// 強制テレポートのサンプル // チャネル 4 で ローカル座標と SIM 名を取得し、 // ビューアにそこにテレポートするように指示します // // 作者 Marine Kelley 2008-08-26 // 動作する RLV のバージョン : 1.12 以上 // // 使い方 : // * 箱の中にスクリプトを作成します // * スクリプトの中身をこれに書き換えます // * 箱を装着します。 // * テレポート先をチャネル 4 で 地域/X/Y/Z のように言います // 例: /4 Help Island Public/128/128/50

key kRequestHandle; // dataserver へのリクエストの UUID vector vLocalPos; // 取得した ローカル座標

Init () {

 kRequestHandle = NULL_KEY;
 llListen (4, "", llGetOwner (), "");

}


default {

 state_entry () {
   Init ();
 }
 
 on_rez(integer start_param) {
   Init ();
 }
 
 listen(integer channel, string name, key id, string message) {
   list tokens = llParseString2List (message, ["/"], []);
   integer L = llGetListLength (tokens);
   if (L==4) {
     // ローカルの X, Y, Z 座標を取得します
     vLocalPos.x = llList2Float (tokens, 1);
     vLocalPos.y = llList2Float (tokens, 2);
     vLocalPos.z = llList2Float (tokens, 3);
     // SIM 情報を取得します
     kRequestHandle=llRequestSimulatorData (llList2String (tokens, 0), DATA_SIM_POS);
   }
 }
 
 dataserver(key queryid, string data) {
   if (queryid == kRequestHandle) {
     // dataserver の返答を解析します (vector を string にキャストします)
     list tokens = llParseString2List (data, ["<", ",", ">"], []);
     string pos_str = "";
     vector global_pos;
     // dataserver から取得した座標は、この SIM の南西端の座標です
     // => 指定された ローカル座標で補正します
     global_pos.x = llList2Float (tokens, 0);
     global_pos.y = llList2Float (tokens, 1);
     global_pos.z = llList2Float (tokens, 2);
     global_pos += vLocalPos;
     // コマンドを構成します。
     pos_str =      (string)((integer)global_pos.x)
               +"/"+(string)((integer)global_pos.y)
               +"/"+(string)((integer)global_pos.z);
     llOwnerSay ("Global position : "+(string)pos_str); // デバッグ用
     // ちゅどーん!
     llOwnerSay ("@tpto:"+pos_str+"=force");
   }
 }
 

}

</lsl>


  • 特定のアバターからのテレポート呼び出しの自動受諾をする/しない : "@accepttp[:<UUID>]=<rem/add>"

実装 v1.15, v1.16 でちょっと改善 このルールを追加すると、<UUID> をキーにもつアバターからのテレポート呼び出しを全て自動的に受け入れます。ちょうど Linden からの呼び出しを受けたときと同じような感じです(確認ダイアログ、メッセージ、キャンセルボタンはありません)。このルールは @tpto より優先されるわけでもされないわけでもなく、前者の制約では誰かのもとにテレポートしても、後者の制約によりランダムな場所に飛ばされるからです。注意: v1.16 では UUID は任意となりました。@accepttp=add は誰からのテレポート呼び出しも受け入れることになります!注意して利用してください!


  • 周囲の人の名前を表示する/しない : @shownames=<y/n>

実装 v1.12.2, v1.16 でダミーの名前のバリエーションを増やした 禁止されると、ユーザは周りにいる人が誰かを知ることができなくなります。名前はスクリーンに表示されず、チャットに表示される名前は "Someone" や "A resident" のようなダミーの名前になり、ツールヒントは隠され、右クリックメニューはほとんど役に立たなくなり、ユーザはプロフィールを参照できなくなくなるなどします。


  • フローティングテキストの表示をする/しない : @showhovertextall=<y/n>

実装 v1.19 禁止されると、ユーザはフローティングテキストを見ることができなくなります。


  • 指定されたプリムのフローティングテキストの表示をする/しない : @showhovertext:<UUID>=<y/n>

実装 v1.19 禁止されると、ユーザは UUID で指定されたプリムのフローティングテキストを見ることができなくなります。@detach が自分自身にだけ制約をつけられるのとは異なり、この制約は他のオブジェクトや他の人がつけることができるようになっています。


  • HUD のフローティングテキストの表示をする/しない : @showhovertexthud=<y/n>

実装 v1.19 禁止されると、ユーザは HUD オブジェクトのフローティングテキストを見ることができなくなりますが、インワールドのフローティングテキストは見ることができます。


  • インワールドのフローティングテキストの表示をする/しない : @showhovertextworld=<y/n>

実装 v1.19 禁止されると、ユーザはインワールドのフローティングテキストを見ることができなくなりますが、HUD オブジェクトのフローティングテキストは見ることができます。


  • 飛行を許可/禁止する : @fly=<y/n>

実装 v1.12.2 禁止されると、ユーザは飛べなくなります。


  • アバターが座っているオブジェクトの UUID を取得する : @getsitid=<channel_number>

実装 v1.12.4 ビューアにアバターが現在座っているオブジェクトの UUID を回答させます。座っていなければ NULL_KEY が返ります。


  • アバターを回転させ、ある方向を向かせる : @setrot:<angle_in_radians>=force

実装 v1.17 アバターを回転させます。向かせる方向は、北を基準とした角度をラジアンで指定します。このコマンドはそんなに正確でなく、回転する角度が 10° 未満となる場合は何も起こりません(経験則です。どこかで、最低ラインが 6° と書かれていたのを見たことがあります)。つまり、llGetRot() を先に発行して確認するか、アバターを 2 回回転させ、最初は 180° で、次に向かせたい方向に角度を指定して回すといいようです。あまりエレガントな方法ではありませんが、とりあえずなんとかなります。


  • デバッグ設定の変更を許可/禁止する : @setdebug=<y/n>

実装 v1.16 禁止されると、ビューアのデバッグ設定(Advanced > Debug Settings) を変更することができなくなります。ほとんどのデバッグ設定が役に立たないか、ユーザの使い勝手に重大な影響を与えるため、ホワイトリスト式となっています。つまり、限られたデバッグ設定だけがロックされ、他は常にアクセス・変更ができます。これを書いている時点で、許可されているデバッグ設定は、

    • AvatarSex (0 : 女, 1 : 男) : アバターの作成時の性別
    • RenderResolutionDivisor (1 -> ...) : スクリーンの "ぼやけ"。@setenv コマンドと組み合わせると、すてきな効果が得られます。注意: Note: RenderResolutionDivisor は Windlight のみで有効なオプションです。(グラフィック設定で基本シェーダを有効にする必要があります) そういうわけで、v1.19.0.5 以前のビューアでは使用できません。


  • デバッグ設定を強制的に変更する : @setdebug_<setting>:<value>=force (*)

実装 v1.16 ビューアに指定したデバッグ設定を <value> の値に変更させます。このコマンドは、"@setdebug_..." にグルーピングされる、たくさんのサブコマンドの集合となっています。例えば、"@setdebug_avatarsex:0=force"、 "@setdebug_renderresolutiondivisor:64=force" などのようにします。

指定可能なデバッグ設定の一覧は直前にある @setdebug コマンドの記述を参照してください。


  • デバッグ設定の設定値を取得する : @getdebug_<setting>=<channel_number>

実装 v1.16 ビューアにデバッグ設定の設定値を回答させます。常に正の値を使用してください。常に正の整数を使用してください。通常のビューアは何も回答しないので、必ずタイムアウト後にリスナーを削除するようにしてください。結果は @setdebug コマンドの対応する <setting> パートで設定した値か、手動で設定した値となります。

指定可能なデバッグ設定の一覧は直前にある @setdebug コマンドの記述を参照してください。


  • 環境の設定の変更を許可/禁止する : @setenv=<y/n>

実装 v1.14 禁止すると、ユーザはビューアで環境の設定を変更することができません。 (世界 > 環境の設定 > 日の出/正午/日没/深夜/地域の標準設定に戻す/環境編集は全てロックされます)。


  • 環境の設定を強制的に変更させる : @setenv_<setting>:<value>=force (*)

実装 v1.14 ビューアに特定の環境の設定 (時刻や Windlight) を <value> の値に変えさせます。このコマンドの実態はたくさんのサブコマンドの集合体です。これらは "@setenv_..." の配下にグルーピングされます。例えば、"@setenv_daytime:0.5=force"、 "@setenv_bluehorizonr:0.21=force" などです。

このコマンドは (他の "force" コマンドと同じように) 既に当該制約が設定されていれば、何もせずに復帰します。しかし、 "@setenv" の場合は、制約を作成したオブジェクトから変更がかかると、その制約が無視されます。言い換えると、首輪は環境の設定の変更を強制させることができますが、それ自身によって変更することができます。しかし、他のオブジェクトは、首輪がその制約を撤廃するまでそれを変更できません。

それぞれに指定できる値の範囲が定められていますが、ビューアではチェックされません。そのため、スクリプトではブラウザからはできないような、面白い効果を出すことができます。ただし自己責任で使ってください。ここでの範囲は、環境編集ダイアログのつまみの動かせる範囲を参考までに示しています。

それぞれのサブコマンドは、以下のように動作します (名前はなるべくビューアの Windlight パネルに似たものを選んでいます)。

@setenv_XXX:<value>=force where XXX is... <value> range Sets...
daytime 0.0-1.0 and <0 時間帯 (日の出:0.25, 正午:0.567, 日没:0.75, 深夜:0.0, 地域の標準設定に戻す:<0). 注意。全ての Windlight の設定をリセットします
preset String 環境の事前設定, 例えば Gelatto, Foggy など。 注意。事前設定をロードするのはブラウザに負担がかかり、一瞬動作が重くなるので、1秒おきに実行することのないように
ambientr 0.0-1.0 アンビエント光, 赤
ambientg 0.0-1.0 アンビエント光, 緑
ambientb 0.0-1.0 アンビエント光, 青
ambienti 0.0-1.0 アンビエント光, 輝度
bluedensityr 0.0-1.0 空の配色と濃度, 赤
bluedensityg 0.0-1.0 空の配色と濃度, 緑
bluedensityb 0.0-1.0 空の配色と濃度, 青
bluedensityi 0.0-1.0 空の配色と濃度, 輝度
bluehorizonr 0.0-1.0 空の色, 赤
bluehorizong 0.0-1.0 空の色, 緑
bluehorizonb 0.0-1.0 空の色, 青
bluehorizoni 0.0-1.0 空の色, 輝度
cloudcolorr 0.0-1.0 雲の色, 赤
cloudcolorg 0.0-1.0 雲の色, 緑
cloudcolorb 0.0-1.0 雲の色, 青
cloudcolori 0.0-1.0 雲の色, 輝度
cloudcoverage 0.0-1.0 空を覆う雲の量
cloudx 0.0-1.0 雲の位置 X
cloudy 0.0-1.0 雲の位置 Y
cloudd 0.0-1.0 雲の密度
clouddetailx 0.0-1.0 雲の詳細 X
clouddetaily 0.0-1.0 雲の詳細 Y
clouddetaild 0.0-1.0 雲の詳細 密度
cloudscale 0.0-1.0 雲のスケール
cloudscrollx 0.0-1.0 雲の移動速度 (X 方向)
cloudscrolly 0.0-1.0 雲の移動速度 (Y 方向)
densitymultiplier 0.0-0.9 大気の不透明度の増幅
distancemultiplier 0.0-100.0 視界の増幅
eastangle 0.0-1.0 東の角度, 0.0 が普通
hazedensity 0.0-1.0 大気の不透明度
hazehorizon 0.0-1.0 空と遠景の露光
maxaltitude 0.0-4000.0 最大高度
scenegamma 0.0-10.0 風景ガンマ, 1.0 が普通
starbrightness 0.0-2.0 星の輝き
sunglowfocus 0.0-0.5 太陽の輝き フォーカス
sunglowsize 1.0-2.0 太陽の輝き サイズ
sunmooncolorr 0.0-1.0 太陽/月の色, 赤
sunmooncolorg 0.0-1.0 太陽/月の色, 緑
sunmooncolorb 0.0-1.0 太陽/月の色, 青
sunmooncolori 0.0-1.0 太陽/月の色, 輝度
sunmoonposition 0.0-1.0 太陽/月の位置, 「時間帯」とは異なります。 事前設定をロードした後に、太陽の光を設定するのに使用してください

注意: 上記の設定のうち、"daytime" のみが v1.14 以上の RestrainedLove が実装されている v1.19.0 の (もしくはより古い) ビューアでサポートされています。他の設定は無視されます。これらのビューアには Windlight レンダラが実装されていないからです。


(*) 相応の制約によってユーザがそうすることができない場合は、何もせずに復帰します。これは仕様です。

   Ex : オブジェクトが取り外し不能の場合、Force detach はできません。ユーザが脱衣不能の場合、Force undress はできません。


  • 環境の設定の設定値を取得する : @getenv_<setting>=<channel_number>

実装 v1.15 ビューアに環境の設定の設定値を自動的に回答させ、<channel_number> で指定したチャネルにすぐに載せてスクリプトが拾えるようにします。常に正の値を使用してください。通常のビューアは何も回答しないので、必ずタイムアウト後にリスナーを削除するようにしてください。復帰値は 対応する @setenv コマンドで <setting> パートにセットされた値か、手動で設定した値です。上述の設定内容一覧表を参照してください。
注意: @getenv_daytime だけが RestrainedLove v1.15 以上が実装されている v1.19.0 の (もしくはより古い、 例えば Windlight でない) ビューアでサポートされています。

sendchat などのグローバルな挙動に関する重要な注意点

挙動がグローバルである、というのは、それが特定のオブジェクトに依存しないことを意味します。しかしながら、これらは可変の UUID が設定されているオブジェクトから引き起こされるものです。複数のオブジェクトが同じ挙動を追加することができます。これらは、UUID が異なることから、複数回にわたって格納されることになります。

これには嬉しい副作用があります。チャットを禁止する2つの装置を装着しているときは、両方の装置のロックを解除しないとチャットを再開することができません。しかしこれにはいやらしい副作用もあります。(例えばrezし直されたりして)アイテムの UUID が変更され、そのアイテムがチャットを許可する設定となっていなかった場合、ユーザは少しの間待たなければなりません。これは、ガベージ・コレクタ が回収するまでの間、そのルールは「不明」(UUID が現存しない)のまま残るからです。

注意:1.16.1 から、オブジェクトにロックをかけると、どのようにしてロックをかけたかに関わらず(例えばllAttachToAvatar)、そのオブジェクトは必ず 5 秒後にビューアによって自動的に再装着されます。つまり、デタッチの際に @clear を呼び出すと、確かにオブジェクトのロックは解除されますが、再装着後に再びロックをかける必要があります。このため、デタッチの際に @clear を呼び出すことは、1.16.1 より前のバージョンとは反対に、今では推奨されません。

共有フォルダ

バージョン 1.11 から、ビューアはインワールドのスクリプトと一部のアイテムを「共有」し、強制的に着脱させたり、共有しているものをリストで表示したりすることができるようになりました。

「共有」というのは、他の人が欲しいときにそのアイテムを持っていくという意味ではなく(譲渡不能のアイテムもあるわけですから)、単に、他の人が自由自在に、アイテムを持つ本人に対する制約が含まれたスクリプトを通じて、それらの着脱を強制させることができるという意味です。これらのアイテムはインベントリに残ります。In fact, this feature would be best named "Exposed folder".

やり方:

  • 「#RLV」という名前のフォルダを「My Inventory」直下に作成します(「My Inventory」を右クリックして「新しいフォルダ」を選択)。これを以降の手順では「共有フォルダ」と呼びます。
  • 制約が含まれるフォルダや、その他装着するものを新しく作成したフォルダの直下に移動します。
  • あとは、フォルダの中のものを装着するだけです!

すると、このようなフォルダ構成になります。

My Inventory
|- #RLV
|  |- cuffs
|  |  |- left cuff (l forearm)   (no copy)
|  |  \- right cuff (r forearm)   (no copy)
|  \- gag
|     \- gag (mouth)   (no copy)
|- Animations
|- Body Parts
.
.
.

例:RR Straps という名前の一式を持っている場合、「Straps BOXED」フォルダを共有フォルダ直下にとりあえず移動します。

移動したフォルダ(1度に1個のフォルダです!)の中のアイテムを全部装着するか、自分で変名して、それぞれのアイテムの名前が装着ポイントの名前を含むようにします。例えば、「left cuff (l forearm)」、「right ankle cuff (r lower leg)」のようにします。編集不能なアイテムを共有するのはちょっと難しいので注意してください。人の手でもビューアでも名前を書き換えることができないからです。これについては後ほど説明します。

装着ポイント名はインベントリのメニューの中の「装着先」から調べることができます。大文字小文字は関係ありません (例:"chest", "skull", "stomach", "left ear", "r upper arm"...)。アイテムを装着したときに、変名されていなければ最初に自動的に変名されます。ただし、共有フォルダの中にあり、装着ポイント名が含まれておらず、編集可能なアイテムに限ります。もし他の装着ポイントに装着したい場合は、まず手で変名する必要があります。

服のパーツはまったく同じように扱われます(それどころか、制約フォルダに置け、同じコマンドで装着することができます)。例えば靴は、混在したアウトフィットの良い例となります。いくつかの装着パーツとレイヤ靴で構成されています。服は自動的に変名されることはありません。服のタイプと装着ポイントが対応しているからです (skirt, jacket, undershirt...)。

編集不能アイテムを共有する方法: 既に説明しましたが、編集不能アイテムは変名できないため、少し複雑な方法となります。アウトフィットのフォルダ (例えば上のフォルダ構成例だと"cuffs"という名前) にサブフォルダを作成し、そこに編集不能なアイテムを 1 つだけ入れます。そのアイテムを装着すると、フォルダが変名されていることに気づくでしょう。つまり、アウトフィットの中に複数の編集不能アイテムが入っている場合、同じ数のフォルダを作成し、1 つのフォルダに 1 個ずつ編集不能のアイテムを入れていくことになります。

例えば、編集不能の靴の場合はこうなります。

My Inventory
|- #RLV
|  \- shoes
|     |- left shoe (left foot)
|     |  \- left shoe   (no modify) (no transfer)  <-- no-mod object
|     |- right shoe (right foot)
|     |  \- right shoe   (no modify) (no transfer) <-- no-mod object
|     \- shoe base   (no modify) (no transfer)     <-- this is not an object
|- Animations
|- Body Parts
.
.
.

バッドノウハウ:

  • 共有フォルダの中のフォルダの名前にカンマ (',') を含めないでください。フォルダの中がめちゃくちゃになる可能性があります。
  • 共有フォルダの中のアイテムは、必ず変名(するか、少なくとも一回は装着して自動的に変名されるように)してください。そうしないと、強制装着コマンドが何もしていないように見えることになります。
  • 共有フォルダにたくさんのフォルダを詰め込まないようにしてください。スクリプトによっては、@getinv コマンドで一覧を取得し、それを使って処理をするものがありますが、チャットによるメッセージは最大1023文字の制限があります。賢く選んで、短い名前をつけてください。しかし、平均 9 文字の名前であれば、約 100 フォルダまでもつことができます。
  • ビューアが名前を頼りにどこに装着するかを判断できるようにするために、編集不能なアイテムは必ず1つずつサブフォルダに入れてください。これらのアイテムは変名不能のため、編集可能なアイテムと同じようには共有できません。また、アウトフィットのフォルダ自体は (複数のアイテムが入っているため) 変名されません。

llGiveInventoryList() によって送られたサブフォルダの共有フォルダへの受け入れ :

RestrainedLove v1.16.2 より、あなたはターゲットのアバターにアイテム一式を送り、相手の #RLV フォルダの中のサブフォルダとして持たせることができます(それにより、後でそのアイテムを @attach させることができます)。

llGiveInventoryList(victim_id, "#RLV/~subfolder_name", list_of_stuff) コマンドを発行すると、スクリプトは相手(victim_id と同じキーをもつアバター)のビューアに通常の 受け取る/破棄/無視リスト ダイアログを表示します。

相手がオファーを受け入れると、list_of_stuff で指定されたアイテムが #RLV フォルダの中の新しいサブフォルダに格納されます。このサブフォルダの名前は ~subfolder_name で指定された名前となります(スクリプターには、一意となるようなサブフォルダの名前を指定する義務があります。既にあるサブフォルダの名前と同じであった場合、2 つの同じ名前のサブフォルダが #RLV フォルダに現れることになります)。

チルダ文字はサブフォルダの先頭に *必ず* つけるように留意してください (そうすることで、この方法で送られて来たサブフォルダを相手が見つけやすくなりますし、そのようなサブフォルダの名前は #RLV フォルダの中の最後尾に表示されます) 。

また、この機能は (Debug Setting の RestrainedLoveForbidGiveToRLV を TRUE に設定することで) ユーザが無効にできることにも注意してください。このような場合、#RLV フォルダの中には格納されず、インベントリのルート直下の"#RLV/~subfolder_name"という名前のフォルダの中に格納されます。

ユーザがインベントリのオファーを断ることも、ビューアで機能を無効にすることも、ラグのひどい日には SL がオブジェクトの実際の送信に時間がかかることもあることから、@attach コマンドを発行する前に、送信されたフォルダが存在するかどうかを (@getinv で) 確認しなければなりません。

参考情報

ここに、これが内部的にどのように動作するかを記します。あなたが遭遇するかもしれない暗黙仕様への理解を深めるのに役立つでしょう。

  • それぞれのコマンドは Behaviour (例: "remoutfit")、Option (例: "shirt")、Param (例: "force") に解析され、UUID (発信しているオブジェクトのユニークなID) から届きます。
  • コマンドには 2 種類あります。one-shot コマンド (Param が "force" であり、Param が "version" 呼び出しのチャネル番号のような番号であるもの) と、 rules コマンド (Param が "y"、"n"、"add"、"rem" のいずれか) 。 "clear" は特別ですが、one-shot コマンドとして捉えることができます。
  • チャネル番号を引数に指定するコマンドでは、チャネル番号は正または (RestrainedLove v1.23a (@versionnum = 1230001) 以降の場合) 負の数でなければなりません。チャネル 0

は使用できません。RestrainedLove は負のチャネルに最大 255 文字送信できます。一方で、正のチャネルには最大 1023 文字送信できます。負のチャネルはユーザにチートされにくいという便利な点があります。例えば、@versionnum の問い合わせを行うときなどです(ユーザは RestrainedLove ビューアを使っていない可能性がありますが、バージョン問い合わせコマンドに偽の返答をして、あたかも RestrainedLove ビューアを使っているかのように見せかけることができます。負のチャネルではそういったことができません)。正のチャネルは長い返答が返ってくる可能性のある場合に良い選択肢となります(例えば @getpath)。

  • "n" と "add" は まったく同じ で、まったく同じように 扱われます。これらは単なる シノニム です。同じようなことが "y" と "rem" にも言えます。ルール ("sendchannel=n") と例外 ("sendchannel:8=add") をスクリプトの中ではっきり区別するためだけのものです。
  • ルールは、発生元の UUID をルールそのものに関連付けた形でテーブルに蓄積されます。"n"/"add" の Param を受信すると 追加 され、"y"/"rem" の Param を受信すると 削除 されます。

UUID1 が首輪で UUID2 が猿ぐつわだとします。

UUID1 => detach, tploc, tplm, tplure, sittp

UUID2 => detach, sendim, sendim:(keyholder)

これらの 2 つのルールは、ユーザは keyholder 以外のアバターに IM を送信できず、どこにも TP ができないという意味になります。これらの 2 つのアイテムは取り外しできません。ここで、首輪が "@sendim=n" を送信したとすると、テーブルは以下のようになります。

UUID1 => detach, tploc, tplm, tplure, sittp, sendim

UUID2 => detach, sendim, sendim:(keyholder)

"@sendim=n" を 2 回目に送信すると何も起りません。追加する前に既に存在するかチェックがかかるからです。猿ぐつわのロックが解除され取り外されると、"@clear" が送信されるかガベージ・コレクタが開始されるかするため、UUID2 に関連づいたルールは消滅します。ところが、例外まで消滅してしまっため、アバターは keyholder にさえも IM を送信できない状態のままとなります。オブジェクトに関連付けられたルールは、他のオブジェクトに関連付けられたルールに矛盾しないからです。

  • One-shot コマンドは、これとは逆に、オンザフライで実行され、蓄積されません。
  • ログオンすると、プログレスバーが表示されている間、アバターはしばらく操作できない (チャットできない、移動できない) 状態となります。しかし、装着されているスクリプトの入ったオブジェクトはその間に rez して、ビューアが操作可能な状態になる前にルールとコマンドの送信を開始します。このために、ビューアはそれらを貯めておき、ユーザが操作可能な状態 (プログレスバーが消えたとき) になってはじめてそれらを実行します。
  • ビューアは定期的に (N 秒ごとに) 全てのルールをチェックし、既に存在しない UUID にリンクしているものを削除します (「ガベージ・コレクタ」) 。つまり、装着していない オブジェクトから発行されたルールは、アバターが テレポートして 他の場所に行くと、すぐに破棄されます。