2010年1月6日水曜日

乗り物用Rezzerのスクリプト

乗り物の運転は何か苦手でよく周りにぶつけ回ってる千尋です^^;

自由に乗って移動できるようになってる1人用の乗り物で、それに乗ったら同じ乗り物がまた現れて、次の人が乗れるようになってる乗り物ってありますよね。それで降りたら自動的に消滅するんですよ。ジェットスキーとかで乗ったことあるんですが、バイクや車なんかもあるんでしょうかね?

今回はそんな感じで乗り捨てできる乗り物用のRezzerを書いてみました。写真の車の車内に見えてるボックスが本体です。実際はサイズを小さくして乗り物に隠れるようにしてくださいねw

まずRezzer本体のスクリプトです。乗り物をRezしたとき邪魔になるのでファントムにします。
// 乗り物Rezzer(Rezzer本体用)
integer ch=-123456;  // 送受信用チャットチャンネル

rez_obj()
{
    string obj=llGetInventoryName(INVENTORY_OBJECT,0);  // コンテンツ内のオブジェクト
    if (obj) llRezAtRoot(obj,llGetPos(),ZERO_VECTOR,llGetRot(),ch);  // オブジェクトが入ってたらRez
    else llWhisper(0,"I have not a vehicle.");  // 入ってないときエラー表示
}

default
{
    state_entry()
    {
        llSetStatus(STATUS_PHANTOM,TRUE);  // ファントムに設定
        llListen(ch,"",NULL_KEY,"");  // リッスン開始
    }

    touch_start(integer total_number)
    {
        key id=llDetectedKey(0);
        if (id == llGetOwner()) {  // オーナーがタッチしたら
            llWhisper(ch,"die");  // 既にrezされてる乗り物にdieを送信
            rez_obj();  // rez_objへ
        }
    }

    listen(integer channel, string name, key id, string msg)
    {
        if (channel == ch && llGetOwnerKey(id) == llGetOwner())
        {  // オーナー所有物からの受信
            if (msg == "rez") rez_obj();  // rezを受信したらrez_objへ
        }
    }
}


続いて乗り物に入れるスクリプトです。こちらも次の乗り物がRezされたら邪魔になるので、乗るまではファントムになるようにします。
// 乗り物TRezzer(乗り物用)
integer ch;  // チャット用チャンネル
integer listen_handle;

default
{
    state_entry()
    {
        llSetStatus(STATUS_PHANTOM,TRUE);  // ファントムに設定
    }

    on_rez(integer start_param)
    {  // Rezされたとき
        ch=start_param;  // チャットチャンネルを取得
        listen_handle=llListen(ch,"",NULL_KEY,"");  // リッスン開始
    }

    changed(integer change)
    {
        if (change & CHANGED_LINK) {
            if (llAvatarOnSitTarget()) {  // アバターが乗ったら
                llSetStatus(STATUS_PHANTOM,FALSE);  // ファントム解除
                llListenRemove(listen_handle);  // リッスン解除
                llWhisper(ch,"rez");  // 次の乗り物用にrezを送信
            }
            else llDie();  // 乗り物から降りたら消滅
        }
    }

    listen(integer channel, string name, key id, string msg)
    {
        if (channel == ch && llGetOwnerKey(id) == llGetOwner())
        {
            if (msg == "die") llDie();  // dieを受信したら消滅
        }
    }
}

このスクリプトを乗り物に追加して、Rezzerのコンテンツにその乗り物を入れます。そして、オーナーがタッチで最初の乗り物がRezされて、以後は乗る度に新しい乗り物が出てきます^^

4月18日追記: 乗り物はオーナーに限定されてない(誰でも運転可能な)ものを使ってくださいね。

0 件のコメント:

コメントを投稿