Site search

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

2008年12月26日金曜日

福袋のスクリプト

日本のお店はクリスマス終わったらすぐお正月の準備って感じなので大変ですねw うちはそういう飾りつけとかしてないのでのんびりしてますけどwww

今回はもうすぐお正月ってことで福袋のベンダーっていうか、支払うと設定した数だけコンテンツ内のアイテムをランダムに選んで渡すスクリプトを書いてみました^^

まあ何となくガチャガチャ http://backup-beta.blogspot.com/2008/08/blog-post_4140.htmlロト6 http://backup-beta.blogspot.com/2008/11/blog-post_6984.htmlを合わせたみたいな感じですけどねw

福袋に入れられるアイテムはオブジェクトの他、服やボディパーツ、アニメーションなどもOKです。スクリプトはちょっと長めになりましたけど、実用しやすいように次のような感じでやってみました。
○ノート、ランドマーク、スクリプトはランダムに選ぶアイテムから除く
○コンテンツ内のアイテムが設定数より少ないと動作しない
○ノート、ランドマークが各1つずつ入ってたら福袋に入れて渡す
箱に入れて渡すことはできないので福袋はフォルダになっちゃいますますけど^^;


// 福袋のベンダー
integer price=30;  // 福袋の価格
integer num=5;  // 福袋に入れるアイテム数
list item;  // アイテムリスト

init()
{
    llSetPayPrice(PAY_HIDE,[PAY_HIDE,PAY_HIDE,PAY_HIDE,PAY_HIDE]);  // 支払い不可に設定
    item=[];  // アイテムリスト初期化
    string str;
    integer type;
    integer i;
    integer j=llGetInventoryNumber(INVENTORY_ALL);  // コンテンツ内のアイテム数
    for (i=0; i < j; i++) {  // 1つずつチェック
        str=llGetInventoryName(INVENTORY_ALL,i);  // アイテム名
        type=llGetInventoryType(str);  // アイテムの種類
        // ノート、ランドマーク、スクリプト以外をアイテムリストに追加
        if (type != INVENTORY_NOTECARD && type != INVENTORY_LANDMARK && type != INVENTORY_SCRIPT) item+=[str];
    }
    // アイテムが設定した個数より多く入ってたら支払いボタンに値段を設定
    if (llGetListLength(item) > num) {
        llSetPayPrice(PAY_HIDE,[price,PAY_HIDE,PAY_HIDE,PAY_HIDE]);
        llOwnerSay("Items: "+llDumpList2String(item,", "));  // アイテムリスト表示
    }
    else llOwnerSay("設定数以上のアイテムを入れてください");
}

give(key id)
{
    list fuku;  // 福袋のリスト
    list copy=item;  // アイテムリストをコピー
    integer rand;
    integer i;
    for (i=0; i < num; i++) {  // 入れる個数分ループ
        rand=llFloor(llFrand(llGetListLength(copy)));  // 乱数発生
        fuku+=[llList2String(copy,rand)];  // 福袋に入れる
        copy=llDeleteSubList(copy,rand,rand);  // 入れたアイテムをコピーから消す
    }
    string note=llGetInventoryName(INVENTORY_NOTECARD,0);  // コンテンツ内の1番目のノート
    if (note) fuku+=[note];  // ノートがあったら福袋に入れる
    string lm=llGetInventoryName(INVENTORY_LANDMARK,0);  // コンテンツ内の1番目のランドマーク
    if (lm) fuku+=[lm];  // ランドマークがあったら福袋に入れる
    llGiveInventoryList(id,"Fukubukuro",fuku);  // フォルダ名Fukubukuroで福袋を渡す
}

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

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

    money(key id, integer amount)
    {  // 支払いがあったら
        if (amount == price) give(id);  // 支払い額が合ってたらgiveへ
        else llWhisper(0,"Error - illegal amount");  // 支払い額エラーのとき
    }
}


2011年5月19日追記: 支払い額のチェックを追加しました。

0 件のコメント:

コメントを投稿