2011年5月10日火曜日

グループ専用ベンダーのスクリプト

グループギフトってのはよくあると思うんですが、たまにグループメンバーだけしか商品買えないベンダーなんてのもありますよね。そこで今回は簡単なグループ専用ベンダーのスクリプトです^^

まあこのグループギフトスクリプトをPayイベントで商品を渡すようにした感じですが、商品オブジェクトのチェックは支払いが起きたときだけにしました。無料のグループギフトと違って、グループが一致しなかったら返金しないといけないので、単品を売る商品ベンダーですが口座からリンデンドル引落しの許可が必要になります。

// グループ専用ベンダー
integer price=10;  // 価格

set_pay(integer on)
{
    if (on) {  // 支払いダイアログに価格を設定する
        llSetPayPrice(PAY_HIDE,[price,PAY_HIDE,PAY_HIDE,PAY_HIDE]);
        llSetClickAction(CLICK_ACTION_PAY);  // クリックで支払い
    }
    else {  // 支払いダイアログを無効にする
        llSetPayPrice(PAY_HIDE,[PAY_HIDE,PAY_HIDE,PAY_HIDE,PAY_HIDE]);
        llSetClickAction(CLICK_ACTION_TOUCH);  // クリックでタッチ
    }
}

default
{
    state_entry()
    {
        set_pay(FALSE);  // 支払いダイアログを無効に
        llRequestPermissions(llGetOwner(),PERMISSION_DEBIT);  // 口座引落しリクエスト
    }

    touch_start(integer total_number)
    {
        key id=llDetectedKey(0);  // タッチしたアバターのキー
        if (id == llGetOwner()) {  // オーナーだったら
            // 口座引落しが許可されてなかったら再リクエスト
            if (!(llGetPermissions() & PERMISSION_DEBIT)) llRequestPermissions(id,PERMISSION_DEBIT);
        }
    }

    run_time_permissions(integer perm)
    {
        if (perm & PERMISSION_DEBIT)
        {  // 口座引落し許可されたら
            set_pay(TRUE);  // 支払いダイアログ設定
        }
    }

    money(key id, integer amount)
    {  // 支払いが発生したら
        string item=llGetInventoryName(INVENTORY_OBJECT,0);  // コンテンツ内の最初のオブジェクト
        if (llList2Key(llGetObjectDetails(llGetKey(),[OBJECT_GROUP]),0) == NULL_KEY) {  // グループ設定されてなかったら
            llGiveMoney(id,amount);  // 返金
            llWhisper(0,"Error - owner must set a group.");  // グループ未設定エラー
        }
        else if (llGetInventoryType(item) == INVENTORY_NONE) {  // オブジェクトが入ってなかったら
            llGiveMoney(id,amount);  // 返金
            llWhisper(0,"Error - object not found.");  // オブジェクトが見つからないエラー
        }
        else if (amount != price) {  // 支払い額が価格と一致しないとき
            llGiveMoney(id,amount);  // 返金
            llWhisper(0,"Error - illegal amount.");  // 不正な金額ですエラー
        }
        else {  // エラーじゃないとき
            if (llSameGroup(id)) {  // グループが同じだったら
                llGiveInventory(id,item);  // 商品を渡す
                llInstantMessage(id,"Thank you!!");  // サンキュー^^
            }
            else {  // グループが同じじゃない
                llGiveMoney(id,amount);  // 返金
                llInstantMessage(id,"Sorry, group member only.");  // グループ専用です
            }
        }
    }
}

スクリプトの価格のところだけ設定して、コンテンツ内に商品のオブジェクトを1個入れてください。オブジェクトが複数のときやオブジェクト以外のアイテムのときは箱詰めしてくださいね。そして忘れないようベンダーにグループをセットしてご使用ください。

他のグループ限定スクリプト同様、設置場所が自分名義の土地でない場合は使えないことが多いです。(異なるグループは自動返却される土地設定が多いので)

5月14日追記: 不正な額の支払いが起きたときのエラーを追加しました。

0 件のコメント:

コメントを投稿