アバター探知機(リンデンスクリプト Tips)

Zero2000 Kidd

2008年04月06日 16:10


 
 前回に引き続き探知機のオブジェクトです。今回は、オブジェクトの探知ではなくアバターの探知を
行います。アバターの名前を指定して実行するとアバターが存在する座標をIM経由で知らせます。
座標のリンクをクリックするとそのアバターの場所へテレポートします。探知範囲は、半径96mです。
大切な人のもとへすぐにでも飛んで行きたいあなたへ・・w


        
「スクリプト内容」

//
//    SHOP ZERO Tips25 AvatorDetector v1.0
//
//                   Created by Zero2000 Kid     2008/04/06
// 

integer input_ch = 34;
integer range=96;
integer handle;
string target;
string simname;


output_info (vector v , string name) {
    string pos=(string)v.x + "/" + (string)v.y + "/" + (string)v.z;
    llInstantMessage(llGetOwner(),name+"--> secondlife://"+simname+"/"+pos);
}

default {
    state_entry(){
        handle = llListen(input_ch,"",llGetOwner(),"");
    }

    on_rez(integer param){
        llResetScript();
    }
    
    listen(integer ch, string name, key id, string message) {
        target=message;
        simname=llGetRegionName();
        llInstantMessage(llGetOwner(),"Searching " + target + " ....");
        llSensor("", NULL_KEY, AGENT, range, PI);
    }
    
    sensor(integer total_number) {
        integer i;
        for (i = 0; i < total_number; i++) {
            if (llSubStringIndex(llToLower(llDetectedName(i)),llToLower(target))!=-1) {
            	output_info(llDetectedPos(i),llDetectedName(i));
            }
        }
        llInstantMessage(llGetOwner(),"Searching complete.");
    }
    
    no_sensor() {
        llInstantMessage(llGetOwner(),"Searching complete.");
    }

}


「使用方法」
1. オブジェクトを1つ作成します。(球でもボックスでも何でも構いません。)
2. オブジェクトにスクリプトをドラッグします。
3. 探知したいアバター名が、"Zero2000 Kidd" だとしたらチャット入力欄に
   /34 Zero2000 Kidd
  と入力します。
  * フルネームでなくても名前の一部(zero等)でも構いませんw
4. アバター探知が始まります。
5. アバターが見つかるとチャット欄にアバター名と座標が表示されます。
6. 座標をクリックするとそのアバターの場所へのテレポ画面が起動します。
7. テレポを実行するとアバターの場所へテレポートします。
  (距離が近すぎるとテレポに失敗するので、その場合は少し離れてみましょう)

 * 探知範囲は、最大96mなので見つからない場合は、オブジェクトを装着して
  ポイントを変えながら探すと良いかもしれませんw


「スクリプトの説明」
 今回のスクリプトのポイントは、前回同様センサーコマンドでしょうか。
大まかな流れとしましては、リッスンコマンドで、アバター名入力を監視し、名前が
入力されるとセンサーコマンドを実行し、アバターを検知します。
 最初にdefaultのstate_entry()の中の以下のコマンドが実行されます。

  handle = llListen(input_ch,"",llGetOwner(),"");

 これは、オーナーの発言を、チャットチャンネルの変数input_chで指定した番号で監視し
ます。input_chは、1行目で34と指定していますので、チャットチャンネルの34番で監視す
ることになります。llListenの詳しい内容はこちら、llListenを参照ください。
チャット入力を検知するとlistenイベントが発生します。
このイベントの中では、以下の4つのコマンドが実行されます。

  listen(integer ch, string name, key id, string message) {
        target=message; // チャット入力された文字列をグローバル変数targetに格納
        simname=llGetRegionName(); // 現在地のSIM名をグローバル変数simnameに格納
        llInstantMessage(llGetOwner(),"Searching " + target + " ...."); // メッセージ表示
        llSensor("", NULL_KEY, AGENT, range, PI);
        // オブジェクトタイプAGENTで、半径range(m),オブジェクト名targetという名前で探査する
        // rangeは、グローバル変数で、2行目で指定した96という数字が格納されています。
        // targetは、グローバル変数で、チャット入力されたアバター名称が格納されています。
        
    }

 llSensorの詳しい内容はこちら、llSensorを参照ください。
 センサーでアバターが検知されるとsensorイベントが発生します。

  sensor(integer total_number) {
        integer i;
        for (i = 0; i < total_number; i++) { // 検出されたアバターの数だけループ
      // アバター名のパターン検索(以下を参照)
            if (llSubStringIndex(llToLower(llDetectedName(i)),llToLower(target))!=-1) {
            	output_info(llDetectedPos(i),llDetectedName(i)); // 関数output_infoの呼び出し
            }
        }
        llInstantMessage(llGetOwner(),"Searching complete.");
    }
    

  この関数の中のポイントは、
            if (llSubStringIndex(llToLower(llDetectedName(i)),llToLower(target))!=-1) {
  という部分でしょうか。ここで何をやっているのかといいますと、チャットで入力されたアバター
  名のパターン検索を行っています。アバターのフルネームを入力しなくても一部の名前だけで
  検索可能にしているのがこの部分です。ポイントは、llSubStringIndexという関数です。この
  関数は、文字列の中から指定する文字列がどの位置に存在するかを検索する関数です。
  この関数に引数として渡されているのが以下の二つの文字列です。

   llToLower(llDetectedName(i))  // 検索対象の文字列(センサーで検出されたアバター名が入っている)
   llToLower(target)  // 検索文字列(チャット入力された文字列が入っている)
  
  この二つの引数から何をやっているかというと"センサーで検出されたアバター名の中からチャット
  入力されたアバター名の位置を返す"となります。なんでこの関数がパターン検索に使用されているかと
  いうと、この関数は検索対象の文字列を含んでいない場合は、-1を返すというきまりがあるからです。
  これを利用して、返値が-1でない場合は、"名前が含まれている"と判定することがきます。
  名前が含まれているとif文の中の
  	output_info(llDetectedPos(i),llDetectedName(i));
  という関数が実行されることになります。
  * llSubStringIndexの詳しい内容はこちら、llSubStringIndexを参照ください。
  * llToLowerという関数は、大文字を小文字に変換する関数です。
   この関数を実行することにより、大文字、小文字に関係なくパターン検索が可能になります。

  関数output_infoでは、以下のコマンドが実行されます。
  output_info (vector v , string name) {
    // オブジェクトの座標を< x,y,z >という表記からx/y/zという表記に変換
      string pos=(string)v.x + "/" + (string)v.y + "/" + (string)v.z;
    // IM経由でアバターの座標を通知
      llInstantMessage(llGetOwner(),name+"--> secondlife://"+simname+"/"+pos);
  }


リンデンスクリプト Tips Indexへ




_uacct = "UA-3027217-1";
urchinTracker();

                
        
リンデンスクリプトTips