Site search

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

2009年3月24日火曜日

売上分配ベンダーのスクリプト

コンテンツ内のスクリプト名を変更しようとしたら、手がすべって削除してしまって、うわああああって発狂しそうになった千尋です。書いたばかりのスクリプトで、まだバックアップしてなかったんですよ。同じミスで削除しちゃったのこれで2回目です;;

今回は売り上げを分配する簡単なベンダーのスクリプトです。お友達と共同で作ったアイテムの売り上げを分配したりとか、売り上げ金の何%か手数料を支払う条件で出品できるフリーマーケットみたいなのにいいんじゃないでしょうかね^^

商品価格はノートカードを1つ入れて、そのノートカード名を L$20 って感じで金額に変更すれば設定できるようにしてみました。ノートの内容は空っぽでオッケーですw
アイテムは複数入れることができ、売れたら全部をフォルダで渡します。フォルダ名はベンダーのオブジェクト名になるようにしました。


分配するアバターのUUIDキーを記入して、お好みの分配率に変えてください。スクリプトを保存すると、そのアバターのプロフィールのリンクをオーナーにチャットしますので、チャット履歴からクリックでアバターを確認できます。そして、タッチで口座引落しを許可して、商品の価格を名前にしたノートカードを忘れないように入れてくださいね。
// 売り上げ分配ベンダー
key av="00000000-0000-0000-0000-000000000000";  // 分配するアバターのキー
float percent=5;  // 分配率(%)
integer price;
list items;

init()
{
    items=[];  // アイテムリスト初期化
    string str;
    integer i;
    integer j=llGetInventoryNumber(INVENTORY_ALL);  // コンテンツ内のアイテム数
    for (i=0; i < j; i++) {  // アイテムをチェック
        str=llGetInventoryName(INVENTORY_ALL,i);  // アイテム名取得
        if (llGetInventoryType(str) == INVENTORY_NOTECARD && llGetSubString(str,0,1) == "L$") {  // 名前がL$○○になってるノートのとき
            price=(integer)llGetSubString(str,2,-1); // ノート名から価格を設定
        }
        else if (str != llGetScriptName()) items+=[str];  // その他は、このスクリプト以外をリストアップ
    }
    if (llGetPermissions() & PERMISSION_DEBIT) llSetPayPrice(PAY_HIDE,[price,PAY_HIDE,PAY_HIDE,PAY_HIDE]);
}

default
{
    state_entry()
    {
        llSetPayPrice(PAY_HIDE,[PAY_HIDE,PAY_HIDE,PAY_HIDE,PAY_HIDE]);  // 支払い不可に設定
        llSetClickAction(CLICK_ACTION_TOUCH);  // クリックでタッチに設定
        init();  // initでコンテンツ内チェック
       
        if (av != "") llOwnerSay("Split money with secondlife:///app/agent/"+(string)av+"/about ?");  // 分配するアバターのプロフ
    }

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

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

    touch_start(integer total_number)
    {
        if (llDetectedKey(0) == llGetOwner()) {  // オーナーがタッチしたとき口座引落し許可のリクエスト
            llRequestPermissions(llGetOwner(), PERMISSION_DEBIT);
        }
    }

    run_time_permissions(integer perm)
    {
        if (perm & PERMISSION_DEBIT)
        {  // 口座引落し許可されたら
            llSetPayPrice(PAY_HIDE,[price,PAY_HIDE,PAY_HIDE,PAY_HIDE]);  // 支払いダイアログに金額を設定
            llSetClickAction(CLICK_ACTION_PAY);  // クリックで支払いに設定
        }
    }

    money(key id, integer amount)
    {  // 売れたら
        if (amount == price) {  // 金額のチェック
            llGiveInventoryList(id,llGetObjectName(),items);  // リストのアイテムを渡す
            llInstantMessage(id,"Thank you for your purchase.");
            integer i=(integer)(amount*percent/100);  // 分配額を計算
            if (i > 0) llGiveMoney(av,i);  // 分配額が0でなければ送金
        }
        else {  // 金額が一致しないとき
            llGiveMoney(id,amount);  // 返金
            llWhisper(0,"Error - illegal amount.");  // エラー
        }
    }
}

アバター名からアバターのキーはLSLのみで割り出せないと思うので http://search.secondlife.com/ とかで調べてくださいね。


2011年5月14日追記: 支払い金額のチェックが入ってなかったので追加しました。それから http://search.secondlife.com/ からはアバターのキーは調べられなくなっています。

3 件のコメント:

  1. はじめまして。
    ちひろさんのスクリプトはちょくちょく使わせていただいております。
    ありがとうございます。
    今回、このスクリプトを使用しようとしたのですが、
    購入しようとするところまではいくのですが、
    ダイアログに支払い金額が表示されなく、購入することができませんでした。
    金額は割り切れるパーセントにしました。
    どこか、気をつけたほうがよい点などありましたら教えていただけませんか?

    返信削除
  2. はじめまして。ご利用ありがとうございます。
    スクリプトを最初にスタートさせたときやベンダーを持ち物から出したときに、一度オーナーがタッチして口座引落しリクエスト(黄色いダイアログ)を許可して頂かないと支払いダイアログの金額が出ないようにしています。。。て、これ説明ぬけてますね。すみません><
    または、価格設定用のノートカード名が「L$+数字」になっていないときや、L$0のときも金額は出ません。
    たぶん上記のいずれかだと思いますのでご確認ください。金額、分配率はきっちり割り切れる数値じゃなくても四捨五入されるので大丈夫だと思います。

    返信削除
  3. さっそくのお返事ありがとうございます。
    ご指摘どおり、ノートカードに数字のみを入れており、L$を忘れていました。
    イージーミスで御迷惑をおかけして、すみませんでした。
    なおしたところ、無事、金額が表示され、購入することができました。
    ありがとうございました。

    返信削除