2010年3月19日金曜日

均一売りアニメーションベンダーのスクリプト

今回は全部同じ価格のポーズ・アニメーションに限り販売できる簡単なAnimation vendorのスクリプトです。価格が同じだと不正な金額の支払いが起きる心配がない(返金する仕組みがいらない)のと、リスト使わなくてもいいので、仕組みが簡単にできるんですよ^^

ベンダー本体は1プリムで作ります。プリムの面番号1の面が斜めになるようにして、その面に操作パネルのテクスチャ(左右に矢印があるようなの)を作って貼り付けてください。

// 均一価格アニメーションベンダー
integer price=10;  // 価格
string anim;  // 現在のアニメーション記憶用
string tmp;  // 一時記憶用
integer number;  // アニメーション数
integer cur=0;  // 選択されたアニメのポインタ用

set_item()
{
    tmp=anim;  // ポーズ中のアニメ
    anim=llGetInventoryName(INVENTORY_ANIMATION,cur);  // 新しく選択されたアニメ
    // フローティングテキスト表示
    if (anim) llSetText(anim+"\n("+(string)(cur+1)+"/"+(string)number+")",<1,1,1>,1.0);
    else llSetText("",<1,1,1>,1.0);
    if (llAvatarOnSitTarget()) {  // 誰か座ってたら
        if (tmp) llStopAnimation(tmp);  // ポーズ中のアニメ停止
        if (anim) llStartAnimation(anim);  // 新しいアニメ再生
    }
}

init()
{
    llSetPayPrice(PAY_HIDE,[PAY_HIDE,PAY_HIDE,PAY_HIDE,PAY_HIDE]);  // 支払い不可に
    number=llGetInventoryNumber(INVENTORY_ANIMATION);  // コンテンツ内のアニメの数
    cur=0;  // ポインタを初期化
    set_item();  // set_itemへ
    if (number) llSetPayPrice(PAY_HIDE,[price,PAY_HIDE,PAY_HIDE,PAY_HIDE]);  // アニメが入ってたら支払い金額を設定
}

default
{
    state_entry()
    {
        llSitTarget(<0,0,1.0>,llEuler2Rot(<0,0,-90>*DEG_TO_RAD));  // 座る位置、角度
        init();
    }

    changed(integer change)
    {
        if (change & CHANGED_LINK)
        {  // リンクが変化
            key id=llAvatarOnSitTarget();  // 座ってるアバターのキー
            if (id) llRequestPermissions(id,PERMISSION_TRIGGER_ANIMATION);  // アニメーション実行リクエスト
        }
        else 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 == 1) {  // 面番号1
                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へ
            }
        }
    }

    run_time_permissions(integer perm)  
    {
        if (perm & PERMISSION_TRIGGER_ANIMATION)
        {  // アニメ実行が許可されたら
            llStopAnimation("sit");  // デフォルトsit停止
            if (anim) llStartAnimation(anim);  // 現在のアニメ実行
        }
    }

    money(key id, integer amount)
    {  // 支払いがあったら
        if (amount == price)
        {
            llGiveInventory(id,anim);  // 現在のアニメを渡す
            llInstantMessage(id,"Thank you for your purchase.");  // ありがとぉおおお^^
        }
    }
}

簡略化してるのでどのアニメーションが売れたか通知する部分はありません^^;
価格は特に表示するようにしてないので、ベンダーの名前や説明に付け加えるとかしてくださいね。

操作パネルのテクスチャ作成が面倒だったら
llSetTexture("2f3d3767-0c2e-b646-2ae7-c7c1a4946a46",1);
これをstate_entry内に入れてもらったら写真と同じのが表示されます。。。手抜きなパネルですけどw

2011年8月23日追記: 不正な金額の支払いが起きる心配がないとは言っても、たぶんllSetPayPriceに縛られず任意の金額を支払えるような改造ビューワーを作ることも不可能じゃないと思うので、一応支払われた金額が一致したときだけ商品(アニメ)を渡すようにしてます。

0 件のコメント:

コメントを投稿