LlMessageLinked/ja

From Second Life Wiki
Jump to navigation Jump to search

要約

関数: llMessageLinked( integer linknum, integer num, string str, key id );

グループ内のnumstrそしてidパラメータ、又はlinknumのリンクとlink_messageで作動します。

• integer linknum リンクナンバーあるいはLINK_* フラグ。
• integer num
• string str
• key id

idを2つ目のstringフィールドのように使うことができます(LSLでは、keyは慣用的演算子としてstringのように実行されます)。stringとkey間での型変更は、含まれているデータへの影響はありません。
フラグ 説明
LINK_ROOT 1 リンクセットの中のルートプリムに送ります
LINK_SET -1 全プリムに送ります
LINK_ALL_OTHERS -2 自分以外の全プリムに送ります
フラグ 説明
LINK_ALL_CHILDREN -3 (ルートプリム以外の全ての)子プリムに送ります
LINK_THIS -4 スクリプトの入った自プリムに送ります

警告

  • スクリプトは、linknumLINK_SETもしくはLINK_THISで設定されている場合に自身にリンクされたメッセージを聞くことができます。これは無限ループの可能性をもちます(よくないことです)。どんなメッセージが平行してハンドル、通過するのかよく注意しましょう。
  • 幾つかのユーザはメッセージを、LINK_SETとLINK_ALL_OTHERSとLINK_ALL_CHILDRENを使用している異なるプリム内で、大きなリンク番号を受け取っているスクリプトに送っているときに、リンクされたメッセージが失敗する原因を留意していました(例えば、全てのプリムがメッセージを受け取らない、など)。もしこの問題に遭遇している場合、回避方法は単一プリム内のスクリプトを全ての子プリムに置くことであり、プリム内に前もって存在していたスクリプトを編集して、llSetLinkPrimitiveParamsのような対象とされる関数を使用し、彼らのアドレスへ単一のリンクメッセージを使います。Void Singer
All Issues ~ Search JIRA for related Bugs

サンプル

<lsl>default{ // assumptions // object name: LSLWiki // script name: _lslwiki

   state_entry() {
       llMessageLinked(LINK_THIS, 0, llGetScriptName(), "");
   }
   link_message(integer sender_num, integer num, string msg, key id) {
       llOwnerSay(msg);
       // the owner of object LSLWiki will hear
       // LSLWiki:_lslwiki
   }    
}</lsl>

便利なスニペット

<lsl>default { // Quick and dirty debugging link_messages

   link_message(integer sender_num, integer num, string msg, key id) {
       llSay(DEBUG_CHANNEL, llList2CSV([sender_num, num, msg, id]));
   }

}</lsl> <lsl>// This is just an example script, you shouldn't handle link message within single script this way.

default{ // To propagate an unlimted number of arguments of any type. // Presumed, the separator string isn't used in any source string!

   state_entry() {    
       list my_list = [1, 2.0, "a string", <1, 2, 3>, <1, 2, 3, 4>, llGetOwner()];  
       string list_parameter = llDumpList2String(my_list, "

注意点

リンク番号

オブジェクトを構成するそれぞれのプリムにはアドレスがあります。それがリンク番号です。オブジェクトの特定のプリムにアクセスするには、そのプリムのリンク番号を知らなければなりません。リンク番号はプリムに振られますが、オブジェクトに座っているアバターにも振られます。

  • オブジェクトが単一のプリムで構成されていて、アバターが座っていないとき、(ルート)プリムのリンク番号は 0 です。
  • しかし、オブジェクトが複数のプリムで構成されていたり、オブジェクトに座っているアバターがいたりすると、ルートプリムのリンク番号は 1 となります。

アバターがオブジェクトに座ると、リンクセットの末尾に追加され、いちばん大きなリンク番号が振られることになります。さらに、アバターがオブジェクトに座っている場合、アバターを立たせないと、プリムのリンク・リンク解除ができません。

プリムやアバターの数え方

オブジェクトのプリムや、プリムに座っているアバターの数を調べるのに、2つの関数があります。

  • llGetNumberOfPrims() - プリムと座っているアバターの数を返します。
  • llGetObjectPrimCount(llGetKey()) - オブジェクトのプリムの数だけを返しますが、アタッチメントとなっている場合は 0 を返します。
integer GetPrimCount() { //常にプリムの数だけを返します。
    if(llGetAttached())//装着されているか?
        return llGetNumberOfPrims();//アバターとプリムの数を返しますが、アタッチメントの上には座れないのでこれでいいです。
    return llGetObjectPrimCount(llGetKey());//プリムの数だけを返しますが、アタッチメントの場合ここは通りません。
}
  • 単一プリムのオブジェクト内でllMessageLinkedを使うのは、スクリプトの協同と動作の同期の間で、機能性が分散するいくつかのLSLの限界を和らげる開発の支えになります。これを行なう時は、典型的な上記のような無限ループを作らないように十分に注意しましょう。
  • strとidのサイズは有効なスクリプトのメモリ量を限界とする、と思います。--RJ Thibaud 13:27, 23 December 2007 (PST)

関連項目

イベント

•  link_message

関数

•  llGetLinkNumber スクリプトが入っているプリムのリンク番号を取得します。

特記事項

Search JIRA for related Issues

Signature

function void llMessageLinked( integer linknum, integer num, string str, key id );
この翻訳は 原文 と比べて古いですか?間違いがありますか?読みにくいですか?みんなで 修正 していきましょう! (手順はこちら)
この項目はあなたにとって参考にならない項目ですか?もしかしたらLSL Wikiの関連した項目が参考になるかもしれません。