ソラマメブログ

2008年02月23日

【講座】誰でもできるLSL Listen

こんにちは、jvnです。

昨日は久しぶりに夜更かしして眠いです。
Zzzzz


LSL 講座 リンク

サンプルソース




default{
state_entry(){
llListen(1, "", llGetOwner(), "");
llListen(3, "", llGetOwner(), "");
llListen(5, "", llGetOwner(), "");
}
listen(integer channel, string name, key id, string message){
if(channel == 1){
llWhisper(0,message);
}else if(channel == 3){
llSay(0,message);
}else if(channel == 5){
llShout(0,message);
}
}
}



復習



理解できているか確認しましょう。


  • 処理の流れがわかるか

  • if文の条件式の意味




今日学ぶこと




  • オブジェクトでチャットを受信開始する方法

  • 受信したチャットを使う方法

  • オブジェクトで話す方法




チャット受信セット



llListen でチャットの受信を開始できます。
なんでもかんでも受信したら大変なので、
フィルタをかけることができます。

引数は全部フィルタのかけかたを示しています。
ひとつひとつの意味を調べましょう。

channel チャンネル。
チャットにはチャンネルがあります。
ふつうの会話は チャンネル0 です。
−2,147,483,648 〜 +2,147,483,647
が指定できます。

+の値は、クライアント画面からチャットで発言することができます。
は 「/1 あいうえお」 と発言すると、そのチャンネルで話せます。
よく市販のスクリプト入りオブジェクトで使われていますね。

-の値は、LSLからしか発言できないので、
プリム同士の会話に使われます。


name 名前。
発言者の名前です。
誰の発言を取得するか セットすることができます。


id UUID
発言者の UUID です。
キーで だれの発言を取得するか指定できます。
ここでは llGetOwner で オブジェクトの所有者をセットしています。


string msg
発言内容でフィルタを書けます。
これは あまりつかうことはないですね。
特定のコマンドを指定する場合なんかに使えそうです。

以上です。

サンプルでは3つのリッスンをセットしています。
1スクリプトは最大65までリッスンを受信できます。

なお、リッスンで 0チャンネルのフィルタ無しを指定するのはやめましょう。
これはだめ

llListen(0,"",NULL_KEY,"");

近くにいる人全員のチャットを拾ってしまうので、サーバーに負荷をかけます。
スクリプターの掟です。絶対にやめましょう。

また、フィルターがあっても
リッスンイベントの内部にたくさんの処理がかかれていると
負荷をかける、という話しもあります。

必要なときだけ リッスンするように心がけましょう。

短時間リッスンを使いたい場合は、次のように
リッスンを止める処理を書きましょう。


touch_start(integer num)
{
integer HANDLE_LISTEN;
touch_start(integer num){
HANDLE_LISTEN = llListen(0,"",NULL_KEY,"");
llSay(0,"発言してください 私は聞きます");
}
listen(integer channel, string name, key id, string message){

// 何か処理を行う

llListenRemove(HANDLE_LISTEN);
}
}



default
{
integer HANDLE_LISTEN;
touch_start(integer num){
HANDLE_LISTEN = llListen(0,"",NULL_KEY,"");
llSay(0,"10秒以内に発言してください 私ちょっと忙しいの");
llSetTimerEvent(10);
}
timer(){
llSay(0,"リッスンを終了します");
llListenRemove(HANDLE_LISTEN);
}
}


これらのように、確実にリッスンを止める処理を書くならば、
フィルターなしのリッスンを使っても問題はないでしょう。


以前私が働いているBARの自動ドアは
リッスンでコマンドを受ける高機能自動ドアでした。
しかし、常時リッスンが動きっぱなしでした。
ある日お客さんたちと騒いでいたら、長い発言を受信してドアが壊れてしまいました^^;
運が悪くマスターが長期お休み中だったので1週間ドアがつかえずえらく不便だったのを覚えています。

LSL覚え始めだったのですが、この仕様はおかしい、と怒って
リッスンを使わない(あともうひとつ工夫をして)自動ドアを作ってマスターに差し替えてもらいました。
スクリプト覚えたてで苦労したのも、今はいい想い出です。

こういうスクリプトを書いて、平気であちこちで売るスクリプターには
怒りすら覚えます。

知らないで人に迷惑をかけないように気をつけましょう。

横道にそれましたが、フィルター無しのリッスン、開きっぱなしのリッスンはやめましょう。


受信の仕方



リッスンイベントを使います。


listen(integer channel, string name, key id, string message){
}


イベントに引数が設定されてますね?
これは、イベントを引き起こしたものが
何なのかがセットされています。

どのチャンネルで
なんて名前の人で
なんてキーをもっている人が
どんなメッセージを送ったのか

がすべてこれらの変数に入っています。
今回のサンプルスクリプトでは、チャンネルで発言の範囲を変えています。


条件式




listen(integer channel, string name, key id, string message){
if(channel == 1){
llWhisper(0,message);
}else if(channel == 3){
llSay(0,message);
}else if(channel == 5){
llShout(0,message);
}
}


先日説明したときは、
条件式は一回変数に結果を入れてからつかっていましたが、
このように条件式を直接書くこともできます。

むしろ、ふつうはこのように書くので
この形で覚えましょう。

チャンネルが
 1の場合 llWhisper
 3の場合 llSay
 5の場合 llShout
で、発言してますね。

第一引数が 今日覚えたチャンネルです。

マイナスチャンネルはスクリプトから発言する以外に
発言方法はない、とさきほど書きましたが
ここにマイナスをセットすると、
マイナスチャンネルで会話ができます。

まとめ



チャットのリッスンの仕方を覚えました。
チャンネルの指定方法は新しい概念だったと思います。
開きっぱなしのリッスン、フィルター無しのリッスンはやめましょう。
リッスンを止める処理を書くようにしましょう。

リッスンの受信は、引数に発言内容が入ってきました。
ふつうの変数として使うことができます。

おまけで、IF文の条件式を直接書く方法も学びました。

チャット関係の関数は、ほかにも少しあります。
IncSearch で [chat]で検索してみましょう。

今日学んだ内容が頭に入っていれば、他の関数も使えると思いますよ^^


次回予告




list NAMES_l;
default
{
touch_start(integer num)
{
if(llDetectedKey(0) == llgetOwner()){
llSay(0,"君はオーナーだ");
}

list name_l = [llDetectedName(0)];
if(llListFindList(NAMES_l, name_l)>-1){
NAMES += name_l;
}
}
}


タッチした人の情報を得る llDetectedXXX 系の関数を学びます。
それから、リストという型について学びましょう。
リストが使えると、情報をためることができてこれまた便利です。

みなさま、よい週末を^^

LSL 講座 リンク

タグ :LSL初級

この記事へのトラックバックURL

http://jvn.slmame.com/t151275