Difference between revisions of "LlListen/ja"

From Second Life Wiki
Jump to navigation Jump to search
m (Undo revision 848932 by Mako Nozaki (Talk))
 
(2 intermediate revisions by 2 users not shown)
Line 1: Line 1:
{{LSL_Function/ja
{{LSL_Function/ja
|inject-2={{LSL_Function/uuid/ja}}{{Issues/SVC-3170}}{{Issues/SVC-92}}{{Issues/BUG-3291}}
|func=llListen
|func=llListen
|sort=Listen
|sort=Listen
|func_id=25|func_sleep=0.0|func_energy=10.0
|func_id=25|func_sleep=0.0|func_energy=10.0
|return_type=integer
|return_type=integer
|return_text=listenを無効か除去可能
|return_text=リスナーを {{LSLG/ja|llListenControl|停止}} したり {{LSLG/ja|llListenRemove|削除}} したりするのに使用する数字
|p1_type=integer|p1_name=channel|p1_desc=any valid integer, positive or negative.
|p1_type=integer|p1_name=channel|p1_desc=任意の有効な整数 (-2147483648 ~ 2147483647) 。
|p2_type=string|p2_name=name
|p2_type=string|p2_name=name|p2_desc=検索条件に追加する特定のプリムやアバターの名前。
|p3_type=key|p3_name=id
|p3_type=key|p3_name=id|p3_desc=検索条件に追加する特定のプリムやアバターの {{LSLG/ja|UUID}} 。
|p4_type=string|p4_name=msg
|p4_type=string|p4_name=msg|p4_desc=検索条件に追加する特定のチャットメッセージ
|func_desc='''name''''''id'''から'''channel'''上に'''msg'''のコールバックが設定されます。
|func_desc='''name''' '''id''' から '''channel''' で発せられた '''msg''' の [http://e-words.jp/w/E382B3E383BCE383ABE38390E38383E382AFE996A2E695B0.html コールバック] を設定します。
|func_footnote='''msg'''、'''name''''''id'''が空の場合は、入ってくるメッセージはフィルタにかかりません。
|func_footnote='''msg''' 、'''name''' '''id''' が空白の場合、入力メッセージの検索条件に使用されません。
'''id'''が無効か、[[NULL_KEY/ja|null key]]の場合、空とみなされます。<br/>
'''id''' に不正なキーや {{LSLG/ja|NULL_KEY|NULL キー}} が指定された場合、空白が指定されたものとされます。<br/>
|spec=[[listen/ja|listen]][[event/ja|イベント]]が作動されるため、主要に判定する基準をフィルタで強く設定すべきです。すべての基準はlistenイベントが生成したものを一致させつづけるだけです。最初に、メッセージはチャンネル'''channel'''上で伝送されつづけます。'''name'''が設定されている場合、話し手の名前を'''name'''と正確に一致すべきです。'''id'''が有効な場合、[[NULL_KEY|null]]ではないkeyは話し手のkeyと同等にすべきです。'''msg'''が設定されている場合、話し手のメッセージと'''msg'''を正確に一致すべきです。
|spec={{LSLG/ja|listen}} {{LSLG/ja|event|イベント}} を発生させるためには、まずはフィルタで指定した条件にマッチしないといけません。全ての条件が満たされているときだけ、 listen イベントが発生します。最初にメッセージは '''channel''' で指定されたチャネルで伝達されていなければなりません。 '''name''' が設定されていれば、発言元の名前は '''name''' に正確に一致していなければなりません。有効な {{LSLG/ja|NULL_KEY|NULL}} でない '''id''' が設定されていれば、発言元のキーが同一でなければなりません。 '''msg''' が設定されていれば、発言されたメッセージは '''msg''' に正確に一致していなければなりません。
|also_functions={{LSL DefineRow||[[llListenRemove/ja|llListenRemove]]|listenを解除します}}
|also_functions={{LSL DefineRow||{{LSLG/ja|llListenRemove}}|リスナーを削除します。}}
{{LSL DefineRow||[[llListenControl/ja|llListenControl]]|listenを有効(無効)にします}}
{{LSL DefineRow||{{LSLG/ja|llListenControl}}|リスナー開始/停止します。}}
{{LSL DefineRow||[[llWhisper/ja|llWhisper]]|10メートルを限度としてチャットを送信します}}
{{LSL DefineRow||{{LSLG/ja|llWhisper}}|10 メートルに限定したチャットを送ります}}
{{LSL DefineRow||[[llSay/ja|llSay]]|20メートルを限度としてチャットを送信します}}
{{LSL DefineRow||{{LSLG/ja|llSay}}|20 メートルに限定したチャットを送ります}}
{{LSL DefineRow||[[llShout/ja|llShout]]|100メートルを限度としてチャットを送信します}}
{{LSL DefineRow||{{LSLG/ja|llShout}}|100 メートルに限定したチャットを送ります}}
{{LSL DefineRow||[[llRegionSay/ja|llRegionSay]]|現在のSimを限度としてチャットを送信します}}
{{LSL DefineRow||{{LSLG/ja|llRegionSay}}|地域全体にチャットを送ります}}
|also_events={{LSL DefineRow||[[listen/ja|listen]]|}}
|also_events={{LSL DefineRow||{{LSLG/ja|listen}}|}}
|also_tests
|also_tests
|also_articles
|also_articles
|notes=チャンネル0は避けて、避ける可能性のあるnameやidを設定します([http://rpgstats.com/wiki/index.php?title=Lag Lag])。llListen(0,"","","")はチャット範囲の皆からのチャットを聞くため確実にラグとなりやすく、それらのコストは回避すべきです。
|notes=*[http://rpgstats.com/wiki/index.php?title=Lag ラグ] を防止するために、チャネル 0 を避け、できる限り name か id を指定しましょう。 llListen(0,"","","") はチャットの範囲内の全ての人の全てのチャットを拾うため、大変なラグを発生させる可能性があります。全力で避けるべきです。
|constants={{LSL Constants/Chat/ja}}
 
|caveats=*[[state/ja|ステート]]変更あるいは[[llResetScript/ja|スクリプトリセット]]で、すべてのlistenは自動で除去されます。
*2007 年 11 月、 Kelly Linden はスクリプターがリスナーをもっと効果的に設計できるように、 [https://lists.secondlife.com/pipermail/secondlifescripters/2007-November/001993.html この説明] を行いました。
**ステート変更はlistenの開放のショートカットのように使えます。
:#発言されたチャットは履歴に追加されます。
*65listenまでが何らかの単独スクリプトで同時に開くことができます。
:#実行していて、かつ listen イベントがあるスクリプトは実行時間のスライスでチャットメッセージの履歴を問い合わせます。
**この数を超えた場合、''Script run-time error''と''Too Many Listens''エラーを引き起こします。
:# スクリプトがチャットメッセージの履歴を問い合わせると、以下の順序でチェックされます:
*マイナス域のチャットナンバーでチャットは、クライアントのダイアログボックスを除いて出力することはできません。
:#* チャネル
**これはオブジェクト同士のコミュニケーションの典型的なつくりです。
:#* 自分のチャット (プリムは自分自身の発言を拾えません)
**これはクライアント上に置かれた人為的な限度かもしれず、プロトコルによるものではありません。
:#* 距離/RegionSay
:#* キー
:#* 名前
:#* メッセージ
:# メッセージが見つかると、イベントキューに listen イベントが追加されます。
:
:キー・名前・メッセージのチェックはもちろん指定された場合にのみ実行されます。
:
:このため、最も効果的な方法は llRegionSay をめったに使用しないチャネルで使うことです。
 
|constants={{LSL Constants/Chat}}
|caveats=* {{LSLG/ja|state}} の変更または {{LSLG/ja|llResetScript|スクリプトでリセット}} されたときに、全てのリスナーは自動的に削除されます。
**state の変更を、スクリプトのリスナーを全て解放するショートカットとして利用することもできます。
*1 つのスクリプトで同時に起動できるリスナーは 65 個までです。
**この数を超えると ''スクリプトランタイムエラー'' と ''Too Many Listens'' エラーが発生します。
*クライアントはダイアログボックス以外の方法で負の数のチャネル番号でチャットできません。
**オブジェクト間のコミュニケーションに適しています。
**これは仮想プロトコルでなく、クライアントが課した意図的な制約です (ダイアログの回答はダイアログが受信されなくても送信することができます) 。
*一旦リスナーが登録されると、検索条件は更新できません。リスナーが {{LSLG/ja|llGetOwner}} で登録されると、リスナーはオーナーが変わった後も以前のオーナーで登録したままになります。
**{{LSLG/ja|CHANGED_OWNER|オーナーの変更}} は {{LSLG/ja|changed}} イベントで検出できます。
**これを回避するためには、以前のリスナーを停止して新しいオーナーで新しいリスナーを開始する必要があります。
*プリムは自分自身が生成したチャットを拾うことはできません。しかし、リンクされたプリムのチャットを拾うことはできます。
|examples=
|examples=
オブジェクトオーナからの何らかのチャットを聞き、一度だけ返答する、些細な例です。ラグの削減と周囲のユーザのスパムを回避するため、0以外の広範囲チャンネルから選んでlistenすることと、'/5 hello'のような、選択チャンネル上でのチャットによるlistenイベントで作動することです。
オブジェクトのオーナーのチャットを拾って 1 回返答するという、平凡な例です。ラグを減らし、周囲のユーザにスパムとならないよう、 0 以外のチャネルで Listen して、 listen イベントを他のチャネルでチャットされたときに、例えば '/5 hello' などで発生させるようにするともっと良いです。
<lsl>// says beep to owner the first time owner says something in main chat;
<source lang="lsl2">// オーナーがメインチャットで何か発言したら、オーナーに beep と発言します。
integer listen_handle;
integer listen_handle;


Line 39: Line 61:
{
{
     state_entry()
     state_entry()
     {  //Registers the listen to the owner of the object at the moment of the call.
     {  // 呼び出した時点でのオブジェクトのオーナーをリスナーに登録します。
         // This does not automatically update when the owner changes.
         // オーナーが変更されても自動的に更新されません。
         // Change 0 to another positive number to listen for '/5 hello' style of chat.
         // 0 を他の正の数字に変えて '/5 hello' のような形式のチャットを拾えるようにしましょう。
         listen_handle = llListen(0, "", llGetOwner(), "");
         listen_handle = llListen(0, "", llGetOwner(), "");
     }
     }
Line 47: Line 69:
     {
     {
         llOwnerSay("beep");
         llOwnerSay("beep");
         // Stop listening until script is reset
         // スクリプトがリセットされるまでリスナーを停止します。
         llListenRemove(listen_handle);
         llListenRemove(listen_handle);
     }
     }
     on_rez(integer param)
     on_rez(integer param)
     {  //Triggered when the object is rezed, like after the object had been sold from a vendor
     {  // オブジェクトが rez されたときに発生します。オブジェクトがベンダーで売れた後などです。
         llResetScript();//By resetting the script on rez it forces the listen to re-register.
         llResetScript();//rez でスクリプトをリセットして、リスナーを再登録させます。
     }
     }
     changed(integer mask)
     changed(integer mask)
     {  //Triggered when the object containing this script changes owner.
     {  // スクリプトの入っているオブジェクトのオーナーが変更されたときに発生します。
         if(mask & CHANGED_OWNER)
         if(mask & CHANGED_OWNER)
         {
         {
Line 61: Line 83:
         }
         }
     }
     }
}</lsl>
}</source>
|cat1=Communications
|cat1=Communications
|cat2=Chat
|cat2=Chat

Latest revision as of 03:44, 25 February 2016

要約

関数: 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の関連した項目が参考になるかもしれません。