2009年10月23日金曜日

テレポート元を記録するスクリプト

テレポート履歴を記録するスクリプトみたいなテレポート先じゃなくて、テレポートしたらビューワーの機能でチャット履歴に
Teleport completed from http://slurl.com/secondlife/Artsebarsky/236/185/23
みたいに表示されるリンクありますよね。そのテレポート元アドレスを履歴として記録できる機能を持ったHUDか何かが、前どこかで売られてるのを見たことがあったと思うんですよ。

その時は、そういうのもあるんだって思ったんですけど、今回はそのテレポート元を記録するスクリプトを考えてみました^^

一定時間毎に現在位置をチェックするようにして、テレポートした直後にタイマーを止めてテレポート前の位置データを記録させます。ただ、これだけだとタイミングによってテレポート直後の位置データが記録されちゃうことがあるので、一時リストに何件か保存しておいて、テレポート直後のデータと比較して違ってたら履歴リストに記録するようにしました。

// テレポート元を記録
list tp;  // テレポート元履歴用リスト
integer max=20;  // 最大記録数
list tmp;  // 現在位置一時記録用リスト
float time=1;  // チェックする間隔

string get_pos()
{
    vector v=llGetPos();  // 現在位置取得
    // リージョン名を取得して現在位置をRegion/x/y/zにする
    return llEscapeURL(llGetRegionName())+"/"+(string)((integer)v.x)+"/"+(string)((integer)v.y)+"/"+(string)((integer)v.z);
}

default
{
    state_entry()
    {
        llSetTimerEvent(time);  // タイマーをセット
    }

    timer()
    {
        tmp+=[get_pos()];  // 現在の位置データを一時的に記録
        if (llGetListLength(tmp) > 10) tmp=llList2List(tmp,-10,-1);  // tmpの記録数を10件に調整
    }

    changed(integer change)
    {
        if (change & CHANGED_TELEPORT)
        {  // テレポートしたとき
            llSetTimerEvent(0);  // タイマー停止
            string here=get_pos();  // 現在の位置データ取得
            string str=here;
            integer i;
            integer j=llGetListLength(tmp);
            for (i=0; here == str && i < j; i++)
            {  // 現在の位置データと比較して一時記録リストからテレポート直前の位置データを取得
                str=llList2String(tmp,i);
            }
            i=llGetListLength(tp);  // 履歴リストの長さ
            if (i >= max) tp=llList2List(tp,-max,-1);  // 履歴リストの長さを調整
            tp+=[str];  // テレポート元を履歴リストに加える
            llSetTimerEvent(time);  // タイマー開始
        }
    }

    touch_start(integer total_number)
    {
        if (llDetectedKey(0) == llGetOwner())
        {  // オーナーがタッチするとSLURLにして履歴リストを表示
            integer i;
            integer j=llGetListLength(tp);
            llOwnerSay("** TP from location history **");
            for (i=0; i < j; i++) llOwnerSay("http://slurl.com/secondlife/"+llList2String(tp,i));
        }
    }
}


2010年4月2日追記: ビューワー2.0.0からスペースの入ったSIM名のリンクがおかしくなるのでURLエンコード追加しました。

0 件のコメント:

コメントを投稿