2010年6月10日木曜日

食べ物や飲み物用のサーバーに使えるスクリプト

この前、あるショッピングモールの近くにあったバーカウンターで飲み物をもらったんですが、その場所はスクリプト禁止になってたので装着しても飲めませんでした^^;

さて今回はドリンクサーバーとかアイスクリームやスナック菓子とかのカート(ワゴンみたいなベンダー?)みたいに、タッチしたらメニューが出て選んだアイテムがもらえるスクリプトです^^

オブジェクトをコンテンツに入れたら自動的にメニューに追加されるようにしました。まあ選んだオブジェクトを渡すだけのスクリプトなので飲食物じゃなくてもいいんですが、是非おいしそうなアイテムを作って入れてくださいね♪
// オブジェクト選択メニュー (max 12)
list item;  // オブジェクト名リスト
list menu;  // メニューボタン用リスト
string text;  // メニューのテキスト用
integer CHANNEL;
integer listen_handle;

init()
{
    item=[];
    menu=[];
    string name;
    integer i;
    integer j=llGetInventoryNumber(INVENTORY_OBJECT);  // コンテンツ内のオブジェクト数
    if (j > 12) j=12;  // 12より多かったら12にする
    if (j > 0) text="Choose one";
    else text="Error! Object not found";  // オブジェクトが入ってないとき
    for (i=0; i < j; i++) {
        name=llGetInventoryName(INVENTORY_OBJECT,i);  // オブジェクト名取得
        item+=[name];  // リストアップ
        if (llStringLength(name) > 24) name=llGetSubString(name,0,23);  // 長いときはカットして
        menu+=[name];  // メニューボタンに追加
    }
}

default
{
    state_entry()
    {
        CHANNEL=llCeil(llFrand(2147483646));  // チャンネルをランダムに決める
        init();  // initへ
    }

    on_rez(integer start_param)
    {  // 持ち物から出したときリセット
        llResetScript();
    }

    changed(integer change)
    {
        if (change & CHANGED_INVENTORY)
        {  // コンテンツ内が変わったら
            init();  // initへ
        }
    }

    touch_start(integer total_number)
    {
        key id=llDetectedKey(0);  // タッチしたアバターのキー
        if (id) {
            llListenRemove(listen_handle);
            listen_handle=llListen(CHANNEL,"",NULL_KEY,"");  // リッスン開始
            llSetTimerEvent(600);  // タイマー10分
            llDialog(id,text,menu,CHANNEL);  // ダイアログ
        }
    }

    timer()
    {
        llSetTimerEvent(0);  // タイマー停止
        llListenRemove(listen_handle);  // リッスン中止
    }

    listen(integer channel, string name, key id, string msg)
    {
        if (channel == CHANNEL)
        {
            integer i=llListFindList(menu,[msg]);  // 押されたボタンをチェックして
            if (~i) {  // オブジェクトを渡す
                llGiveInventory(id,llList2String(item,i));
            }
        }
    }
}

入れられるオブジェクトはメニューボタンの都合で12個までです。llDialogでエラーにならないようオブジェクト名が長いものは切り詰めるようにしましたが、ボタンのラベルが被ってしまうアイテムは見分けられないと思います。
それからバイト数じゃなく文字数でカットしてるだけなので、日本語とかのオブジェクト名には対応してません。(文字化けると思うしw)

0 件のコメント:

コメントを投稿