Site search

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

2009年4月20日月曜日

お誕生日を調べるスクリプト

今回はアバターの生まれた日。。。Rez dayを調べるスクリプトです。

// 誕生日を表示
key query;

default
{
    touch_start(integer total_number)
    {
        key id=llDetectedKey(0);  // タッチしたアバターのキー取得
        query=llRequestAgentData(id,DATA_BORN);  // データサーバーに誕生日を問い合わせ
    }

    dataserver(key id, string data)
    {  // データを受け取ったら
        if (id == query) {
            llWhisper(0,data);  // 表示
        }
    }
}

まあ誕生日を表示するだけだとこんな感じでllRequestAgentDataを使って簡単に調べられるんですが、dataserverイベントでデータをもらうので、タッチしたアバターのキーと誕生日を使って何か処理をするときは、2人以上同時にタッチしたときキーが他の人のと入れ替わって誤動作しないよう考えておかないといけないでしょうねw

マネーツリーとかのニュービー限定機能みたいに、生まれて1年以内のアバター限定でアイテムを渡すスクリプトを考えてみました^^


キー型の変数avがNULL_KEYのときだけ処理するようにして、数人同時のタッチがあったとき最初の1人以外は無視するようにロックしてます。それからデータサーバーが調子悪いとき反応が返ってこないってこともありそうなので一応タイマーで10秒待っても反応ないときはロック解除するようにしてみましたw
// 生まれて1年以内だったらアイテム渡す
key query;
key av=NULL_KEY;

string del_minus(string date)
{  // 日付からマイナス記号を取り除く
    string y=llGetSubString(date,0,3);  // 年
    string m=llGetSubString(date,5,6);  // 月
    string d=llGetSubString(date,8,9);  // 日
    return y+m+d;
}

default
{
    touch_start(integer total_number)
    {
        if (av == NULL_KEY) {  // 動作中でなかったら
            key id=llDetectedKey(0);  // タッチしたアバターのキー
            av=id;  // avにキーを保存
            query=llRequestAgentData(id,DATA_BORN);  // データサーバーに誕生日を問い合わせ
            llSetTimerEvent(10);  // タイマー10秒
        }
    }

    timer()
    {
        llSetTimerEvent(0); // タイマー停止
        av=NULL_KEY;  // avにヌルキーを設定
    }

    dataserver(key id, string data)
    {  // データを受け取ったら
        if (id == query) {
            integer born=(integer)del_minus(data);  // 誕生日を数値に変換
            integer today=(integer)del_minus(llGetDate());  // 今日の日付を数値に変換
            integer diff=today-born;  // 誕生日と今日の差
            if (diff <= 10000) {  // 差が10000以下だったら1年以内
                // コンテンツ内の1つ目のオブジェクトを渡す
                string str=llGetInventoryName(INVENTORY_OBJECT,0);
                llGiveInventory(av,str);
            }
            else {  // そうでないときは1年過ぎてる
                llInstantMessage(av,"Sorry, you are over 1 year.");
            }
            llSetTimerEvent(0);  // タイマー停止
            av=NULL_KEY;  // avにヌルキーを設定
        }
    }
}

誕生から1年以内の判定ですけど、日付は2009-04-20のような文字列なので、これを数字だけ取り出して20090420にして計算します。それで誕生日と今日の差が10000以下だったら1年以内になるんですね。。。何かちょっとややこしいですけど^^;
1ヶ月限定にするときは差が100以下で1ヶ月以内ってことになるんですが、年が変わると差が大きくなるので差を出した後、8800以上だったら8800減らしてから if (diff <= 100) { って感じで判定するようにしたらいいかなって思います。
if (diff >= 8800) diff-=8800; // 1ヶ月限定は差が8800以上だったら8800減らす
あと今日の日付はllGetDateそのまま使ってるのでちょっとアバウトですねw(SL時間と時差あります)

0 件のコメント:

コメントを投稿