ログイン型チップジャー(改)

お店として機能させるにはチップジャーが不可欠かなぁと。ダンサーさんやモデルさんなんかだとMyチップジャーをアバターに装着していたりもしますが、あれはなんだか守銭奴みたいでスマートじゃない気がするんですよねw かといって備え付けで個人持ちのチップジャーだと利用者の数分、ジャーの受け皿が必要だったり、個別に受領した金額が分かってしまう事から、よからぬ摩擦を生んでしまったりで、よくない部分の方が多いかなぁと感じます。その場限りの楽しみならば、チップジャーも一時的な物の方がスマートですよね。そういう趣旨でログイン型のチップジャーがいいかなぁと。ちらっとマーケットプレイスで探してみたりしましたが安価な物だと作者がチップをピンハネするような設定になっていたりして、どうも安心感に欠けるのと、どのように動作するのか理解するのが面倒に感じて自分で作る事にしました。

幸いな事に手元に(いつ入手したのか覚えてませんが)ログイン型チップジャーの動作するフルパーミッション物があったので、それをベースにして改造するというながれで楽でした。
もともとがフルパーミッションだったので、特にライセンス条項の明記もなかったですが、たぶんBSD系なのかなぁと思い。こちらで弄ったソースも公開するという運びです。

主な変更点は
・ノートカードからdataserver経由で1行ずつ読み込む部分をノートカードの名称からダイレクトに取得するようにした
・配分が不正値のとき再処理ではなく強制的に最大値または最小値で置換するようにした
・タイマーの使い方を最大ログイン時間の判定用途ではなくオンライン確認間隔とした
・チップジャーの使用者がログインしているか、また、有効な距離内に居るかのチェックを追加した
・ほとんどのメッセージの日本語化
・IMを使う部分をRegionSayToで置き換え、ラグの発生を少なくした


設定値はノートカード記載から
ノートカードの名称そのものがパラメータとすることで
設定内容が他の人にも明確に可視となり
dataserverも使わない事から省エネです

設定値の内容は左から

金額1,金額2,金額3,金額4,グループチェックの要否,配分の割合


//LOGIN型のチップジャー for Momoiro

integer total;
float   percent;
string  tipjar_name;
string  tipjar_disp;
key     tipjar_key = NULL_KEY;
integer check_group = FALSE;



updateText(){
    string str;
    vector color = <1.0,1.0,1.0>;

    if( tipjar_key == NULL_KEY ){
        str = "\n";
    }else{
        str = tipjar_disp + " さんの Tip Jar\n";
        color = <0.0,1.0,0.0>;
    }

    if( total > 0 ){
        str+= (string)total + " donated so far.";
    }else{
        str+= "Empty";
    }
    
    if( tipjar_key == NULL_KEY && total == 0 ) str = "";

    llSetText(str, color, 1.0);
}


default{
    state_entry(){
        llRequestPermissions(llGetOwner(), PERMISSION_DEBIT );
    }

    on_rez(integer num){
        llResetScript();
    }

    run_time_permissions (integer perm){
        if(perm & PERMISSION_DEBIT){
            state wait_jar;
        }
    }
}

state wait_jar{
    on_rez(integer num){
        llResetScript();
    }
    state_entry(){
        llSetTimerEvent(0.0);

        string temp_ss = llGetInventoryName(INVENTORY_NOTECARD,0);

        if(temp_ss != ""){
            //設定内容の読み込みノートカード名から
            //書式は pay1, pay2 ,pay3, pay4 ,Groupの可否 ,支払い割合
            //pay金額に-1で当該ボタンは非表示
            list temp_list = llParseString2List (temp_ss, ["|",","], []);
            llSetPayPrice(llList2Integer(temp_list,0),[llList2Integer(temp_list,0),
                                                       llList2Integer(temp_list,1),
                                                       llList2Integer(temp_list,2),
                                                       llList2Integer(temp_list,3)]);
            temp_ss = llToLower(llStringTrim(llList2String(temp_list,4),STRING_TRIM));
            if(temp_ss == "group" || temp_ss == "true"){
                check_group = TRUE;
            }else{
                check_group = FALSE;
            }
            percent = llList2Integer(temp_list,5) / 100;
            if(percent > 1) percent = 1.0; //100%を越える設定の場合は強制的に100%にする
            if(percent < 0) percent = 0.0; //負数の割合の場合は強制的に0%にする
        }else{
            llSetPayPrice(PAY_DEFAULT,[]);
            check_group = FALSE;
            percent = 1.0;
        }


        if( tipjar_key != NULL_KEY ){
            llRegionSayTo(tipjar_key,0, "ログアウトしました。");
        }
        tipjar_key = NULL_KEY;
        tipjar_name = "";
        tipjar_disp = "";
        total = 0;
        updateText();

    }

    touch_start(integer count){
        integer success = FALSE;

        if( check_group ){
            if( llDetectedGroup(0) ) {
                success = TRUE;
            }else{
                llRegionSayTo(llDetectedKey(0),0, "現在グループモードがOnです。異なるグループでは利用できません。");
            }
        }else{
            success = TRUE;
        }

        if( success ){
            tipjar_key  = llDetectedKey(0);
            tipjar_name = llDetectedName(0);
            tipjar_disp = llGetDisplayName(tipjar_key);
            if(tipjar_disp == "") tipjar_disp = tipjar_name;
            total = 0;
            llRegionSayTo(tipjar_key,0, "ログインしました。");
            llRegionSayTo(tipjar_key,0, "チップの配分は " + (string)llRound((percent*100)) + "% を受け取れます。");
            state run_jar;
        }
    }

    money(key giver, integer amount) {
        //未ログイン時は配分無しでオーナーへ
        llSay(0, "☆。彡 "  + llGetDisplayName(giver) + " さんから " + (string)amount + "L$ いただきました♪ ありがとうございます!");
        total += amount;
        updateText();
    }
}

state run_jar{
    on_rez(integer num){
        llResetScript();
    }

    state_entry(){
        updateText();
        llSetTimerEvent(120.0);//存在チェック間隔
    }

    money(key giver, integer amount) {
        llSay(0, "☆。彡 "  + llGetDisplayName(giver) + " さんから " + (string)amount + "L$ いただきました♪ ありがとうございます!");
        total += amount;
        llGiveMoney(tipjar_key,(integer)(amount*percent));
        updateText();
    }

    touch_start(integer count) {
        if((llDetectedKey(0) == tipjar_key) ||
           (llDetectedKey(0) == llGetOwner()) )  {
            state wait_jar;
        }
    }

    timer(){
        //同一SIM内に居るか?
        if(llKey2Name(tipjar_key) != ""){
            //居る場合は距離を確認 (120m以内とする)
            if(llFloor(llVecDist(llList2Vector(llGetObjectDetails(tipjar_key,([OBJECT_POS])),0),llGetPos())) <= 120){
                return;
            }
        }
        llSetTimerEvent(0.0);
        llInstantMessage(tipjar_key, "近くに居ないため強制ログアウトします。");
        tipjar_key = NULL_KEY;
        state wait_jar;
    }

}


注記:<と>の文字がうまく書けなかったので2バイト文字化しています。コヒペする場合はお手数ですが置き換えてください。

0 件のコメント:

コメントを投稿

Popular Posts of the Month