LlListen/ja

From Second Life Wiki
Jump to: navigation, search

要約

関数: integer llListen( integer channel, string name, key id, string msg );

nameid から channel で発せられた msgコールバック を設定します。
リスナーを 停止 したり 削除 したりするのに使用する数字を integer で返します。

• integer channel 任意の有効な整数 (-2147483648 ~ 2147483647) 。
• string name 検索条件に追加する特定のプリムやアバターの名前。
• key id 検索条件に追加する特定のプリムやアバターの UUID
• string msg 検索条件に追加する特定のチャットメッセージ

msgnameid が空白の場合、入力メッセージの検索条件に使用されません。 id に不正なキーや NULL キー が指定された場合、空白が指定されたものとされます。

仕様

listen イベント を発生させるためには、まずはフィルタで指定した条件にマッチしないといけません。全ての条件が満たされているときだけ、 listen イベントが発生します。最初にメッセージは channel で指定されたチャネルで伝達されていなければなりません。 name が設定されていれば、発言元の名前は name に正確に一致していなければなりません。有効な NULL でない id が設定されていれば、発言元のキーが同一でなければなりません。 msg が設定されていれば、発言されたメッセージは msg に正確に一致していなければなりません。

Channel Constant Description
DEBUG_CHANNEL 0x7FFFFFFF Chat channel reserved for script debugging and error messages, broadcasts to all nearby users.
PUBLIC_CHANNEL 0x0 Chat channel that broadcasts to all nearby users. This channel is sometimes referred to as: open chat, local chat and public chat.

警告

  • state の変更または スクリプトでリセット されたときに、全てのリスナーは自動的に削除されます。
    • state の変更を、スクリプトのリスナーを全て解放するショートカットとして利用することもできます。
  • 1 つのスクリプトで同時に起動できるリスナーは 65 個までです。
    • この数を超えると スクリプトランタイムエラーToo Many Listens エラーが発生します。
  • クライアントはダイアログボックス以外の方法で負の数のチャネル番号でチャットできません。
    • オブジェクト間のコミュニケーションに適しています。
    • これは仮想プロトコルでなく、クライアントが課した意図的な制約です (ダイアログの回答はダイアログが受信されなくても送信することができます) 。
  • 一旦リスナーが登録されると、検索条件は更新できません。リスナーが llGetOwner で登録されると、リスナーはオーナーが変わった後も以前のオーナーで登録したままになります。
    • オーナーの変更changed イベントで検出できます。
    • これを回避するためには、以前のリスナーを停止して新しいオーナーで新しいリスナーを開始する必要があります。
  • プリムは自分自身が生成したチャットを拾うことはできません。しかし、リンクされたプリムのチャットを拾うことはできます。
All Issues ~ Search JIRA for related Bugs

サンプル

オブジェクトのオーナーのチャットを拾って 1 回返答するという、平凡な例です。ラグを減らし、周囲のユーザにスパムとならないよう、 0 以外のチャネルで Listen して、 listen イベントを他のチャネルでチャットされたときに、例えば '/5 hello' などで発生させるようにするともっと良いです。

// オーナーがメインチャットで何か発言したら、オーナーに beep と発言します。
integer listen_handle;
 
default
{
    state_entry()
    {   // 呼び出した時点でのオブジェクトのオーナーをリスナーに登録します。
        // オーナーが変更されても自動的に更新されません。
        // 0 を他の正の数字に変えて '/5 hello' のような形式のチャットを拾えるようにしましょう。
        listen_handle = llListen(0, "", llGetOwner(), "");
    }
    listen( integer channel, string name, key id, string message )
    {
        llOwnerSay("beep");
        // スクリプトがリセットされるまでリスナーを停止します。
        llListenRemove(listen_handle);
    }
    on_rez(integer param)
    {   // オブジェクトが rez されたときに発生します。オブジェクトがベンダーで売れた後などです。
        llResetScript();//rez でスクリプトをリセットして、リスナーを再登録させます。
    }
    changed(integer mask)
    {   // スクリプトの入っているオブジェクトのオーナーが変更されたときに発生します。
        if(mask & CHANGED_OWNER)
        {
            llResetScript();
        }
    }
}

注意点

  • ラグ を防止するために、チャネル 0 を避け、できる限り name か id を指定しましょう。 llListen(0,"","","") はチャットの範囲内の全ての人の全てのチャットを拾うため、大変なラグを発生させる可能性があります。全力で避けるべきです。
  • 2007 年 11 月、 Kelly Linden はスクリプターがリスナーをもっと効果的に設計できるように、 この説明 を行いました。
  1. 発言されたチャットは履歴に追加されます。
  2. 実行していて、かつ listen イベントがあるスクリプトは実行時間のスライスでチャットメッセージの履歴を問い合わせます。
  3. スクリプトがチャットメッセージの履歴を問い合わせると、以下の順序でチェックされます:
    • チャネル
    • 自分のチャット (プリムは自分自身の発言を拾えません)
    • 距離/RegionSay
    • キー
    • 名前
    • メッセージ
  4. メッセージが見つかると、イベントキューに listen イベントが追加されます。
キー・名前・メッセージのチェックはもちろん指定された場合にのみ実行されます。
このため、最も効果的な方法は llRegionSay をめったに使用しないチャネルで使うことです。

関連項目

イベント

•  listen

関数

•  llListenRemove リスナーを削除します。
•  llListenControl リスナー開始/停止します。
•  llWhisper 10 メートルに限定したチャットを送ります
•  llSay 20 メートルに限定したチャットを送ります
•  llShout 100 メートルに限定したチャットを送ります
•  llRegionSay 地域全体にチャットを送ります

特記事項

All Issues

~ Search JIRA for related Issues
   Listeners in child prims get positioned at root prim position first, then switch to child prim position after re-rez (resulting in wrong listener / whisper radius)
   llTargetSay() - region-wide direct communication
   llListen in linked objects is listening at root instead of linked object local position *after re-rezzing the linkset*

Signature

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