Site search

Google
WWW を検索 backup-beta.blogspot.com を検索

2008年9月20日土曜日

数量限定で配布するスクリプト

今回はアイテムを限定何個とか決めて配布するためのスクリプトです^^

配布をカウントして限定数に達したら終了って感じですけど、一人のアバターに何度もゲットされないようリストアップしとく必要がありますねw

リストを使うのであまり限定数をたくさんに設定すると、リストが増えてきたときに
[7:48] Object [script:New Script]: Script run-time error
[7:48] Object [script:New Script]: Stack-Heap Collision

こうゆうエラーになります^^;
テストでは150~160くらいでエラー出ました。環境によって前後しそうなので、余裕みて120くらいまでにしとくと安全かな?って思います。


配布するオブジェクトを1個入れてくださいね。コンテンツ内に変化があったときカウントが初期化されるようにしてます。
// 個数限定で配布
integer limit=30;  // 限定数
integer count=0;
list av_list;  // 渡したアバターのリスト用
string object;

init()
{
    count=0;  // カウント初期化
    av_list=[];  // リスト初期化
    // コンテンツ内のオブジェクトを取得
    object=llGetInventoryName(INVENTORY_OBJECT,0);
    // オブジェクトが入ってないときはカウントを最大数に限定数に上げる
    if (llGetInventoryType(object) == INVENTORY_NONE) count=limit;
    else {  // そうでないときは限定数表示
        llWhisper(0,"Limit "+(string)limit+" item(s).");
    }
}

default
{
    state_entry()
    {  // 最初はinitへ
        init();
    }

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

    touch_start(integer total_number)
    {
        key agent=llDetectedKey(0);  // タッチしたアバターのキー
        integer i=llListFindList(av_list,[agent]);  // リストと照合
        if (i < 0 && count < limit) {  // リストに載ってなくて限定超えてない
            count++;  // カウント加算
            av_list+=[agent];  // リストに登録
            llSay(0,"Distributed "+(string)count+" of "+(string)limit);  // 配布数表示
            llGiveInventory(agent,object);  // 渡す
        }
        else if (i < 0) llSay(0,"Sorry, sold out.");  // ごめんね品切れ
        else llSay(0,"Sorry. One person, one item.");  // ひとり1個ね
    }
}

0 件のコメント:

コメントを投稿