2010年3月26日金曜日

1プリム定額販売用ベンダーのスクリプト

今回はこの前のアニメーションベンダーと同じで、100L$均一みたいな同じ価格の商品だけ扱えるベンダーです。色違いや柄違いの商品とかには、こういうベンダーがお手軽でいいかもですね^^

本体はチューブをパスカット(B:0.250,E:0.550ぐらい)して、カットした側がベンダー正面になるように薄くします。それで商品表示用の面の番号が5、操作パネル用の面は0になります。操作パネルは「← →」って感じのテクスチャを作って貼り付けてくださいね。。。写真のと同じでよかったら llSetTexture("2f3d3767-0c2e-b646-2ae7-c7c1a4946a46",0); をstate_entryに追加して表示させてください。

// 均一価格商品ベンダー
integer price=50;  // 価格
string item;  // 表示中の商品名用変数
string texture;  // 商品のテクスチャ用
integer number;  // アイテム数
integer cur=0;  // ポインタ用

string get_texture(string name)
{
    integer i;
    integer j=llGetInventoryNumber(INVENTORY_TEXTURE);  // テクスチャ数
    string str;
    for (i=0; i < j; i++) {
        str=llGetInventoryName(INVENTORY_TEXTURE,i);  // テクスチャ名
        if (str == name+".pic") return str;  // 商品名.picが見つかったらテクスチャ名を返す
    }
    llWhisper(0,"Texture not found.");  // 商品名.picが見つからない><
    return TEXTURE_BLANK;  // ブランクのテクスチャでリターン
}

set_item()
{
    item=llGetInventoryName(INVENTORY_OBJECT,cur);  // 選択された商品名
    if (number) {  // コンテンツ内に商品が入ってるとき(総数が0じゃない)
        llSetText(item+"\n("+(string)(cur+1)+"/"+(string)number+")",<1,1,1>,1.0);  // フローティングテキスト表示
        texture=get_texture(item);  // 商品のテクスチャ取得
    }
    else {  // 商品が入ってないとき
        llSetText("",<1,1,1>,1.0);  // フローティングテキスト消去
        texture=TEXTURE_BLANK;  // テクスチャはブランク
    }
    llSetTexture(texture,5);  // 上側(面番号5)にテクスチャを表示
}

init()
{
    llSetPayPrice(PAY_HIDE,[PAY_HIDE,PAY_HIDE,PAY_HIDE,PAY_HIDE]);  // 支払い不可にする
    number=llGetInventoryNumber(INVENTORY_OBJECT);  // コンテンツ内の商品(オブジェクト)の数
    cur=0;  // ポインタ初期化
    set_item();  // set_itemへ
    if (number) llSetPayPrice(PAY_HIDE,[price,PAY_HIDE,PAY_HIDE,PAY_HIDE]);  // 商品が入ってたら支払い金額を設定
}

default
{
    state_entry()
    {
        init();  // initへ
    }

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

    touch_start(integer total_number)
    {
        key id=llDetectedKey(0);  // タッチしたアバターのキー
        if (id) {
            integer i=llDetectedTouchFace(0);  // タッチした面番号チェック
            if (i == -1) llWhisper(0,"Sorry, your viewer not support.");  // 古いビューワーは諦めてもらう^^;
            else if (i == 0) {  // 面番号0
                vector v=llDetectedTouchUV(0);  // タッチされた位置
                if (v.x > 0.5) {  // 中央よりも右だったら次の商品
                    cur++;
                    if (cur >= number) cur=0;
                }
                else {  // そうでないときは前の商品になるようポインタをセット
                    cur--;
                    if (cur < 0) cur=number-1;
                }
                set_item();  // set_itemで商品表示
            }
        }
    }

    money(key id, integer amount)
    {  // 支払いがあったら
        if (amount == price)
        {
            llGiveInventory(id,item);  // 商品を渡す
            llInstantMessage(id,"Thank you for your purchase.");  // あざーす!!
        }
    }
}

スクリプト最初の価格のところだけ設定して、商品(オブジェクト以外は箱詰めして)とテクスチャをコンテンツに入れてくださいね。そしてテクスチャ名は「商品名.pic」になるようにしてください。

この前のアニメーションベンダーと同じく、どの商品が売れたか通知する部分や、価格を表示する部分は書いてないですが、価格は各商品のテクスチャに描き入れるかベンダーのオブジェクト名や説明に付け加えたらいいと思いますw

0 件のコメント:

コメントを投稿