ソラマメブログ
< 2025年04月 >
S M T W T F S
    1 2 3 4 5
6 7 8 9 10 11 12
13 14 15 16 17 18 19
20 21 22 23 24 25 26
27 28 29 30      

2008年02月18日

プリムカウンター(リンデンスクリプト Tips)

 土地に存在するプリム数をカウントするスクリプトです。
その土地のMAXプリム数及び現在の使用プリム数、残りの利用可能プリム数を表示します。
また、オブジェクトのオーナー毎のプリム数(上位5人まで)を表示します。表示は、10秒毎に
更新されます。プリム数を土地情報から毎回確認する必要がないので便利です。不審なプリ
ムもすぐに気付くことができますw
プリムカウンター(リンデンスクリプト Tips)
 * 注1:このスクリプトの実行には、その土地のオーナー権限が必要です。
  * 注2:土地にグループ所有のオブジェクトがある場合、正常に動作しません。
 * 注3:土地に一時オブジェクトがある場合、数値(prims available)が土地情報の数値と異なる結果になります。

* グループ別や一時プリムの数値を調べたいときは、こちらを参考下さい。
「スクリプト内容」
//
//    SHOP ZERO Tips22 PrimCounter Script   v1.0
//
//                   Created by Zero2000 Kid     2008/02/18
//                   

float cycle=10;
integer read_count;
integer maxprims;
integer total;
integer owner_count;
list primlist;
string mes;

default
{
    state_entry() {
        llSetText("", <1,1,1>, 1);
        maxprims=llGetParcelMaxPrims(llGetPos(),FALSE);
        llSetTimerEvent(cycle);
    }
    
    on_rez(integer int) {
        llResetScript(); 
    }

    timer() {
        list tmplist =llGetParcelPrimOwners(llGetPos());
        owner_count=llGetListLength(tmplist)/2;
        integer i;
        primlist=[];
        for (i=0; i < owner_count; i++) {
            primlist+=llList2Integer(tmplist,2*i+1);
            primlist+=llList2Key(tmplist,2*i);
        }
        primlist=llListSort(primlist,2,FALSE);
        if (owner_count>4) owner_count=5;
        read_count=0;
        total=0;
        mes="";
        llRequestAgentData(llList2Key(primlist,1), DATA_NAME);
    }
    
    dataserver(key queryid, string data) {
        string OwnerName=data;
        string primcount=llList2String(primlist,2*read_count);
        mes+="No."+(string)(read_count+1)+" "+OwnerName+"("+primcount+")\n";
        total+=(integer)primcount;
        read_count++;
        if (read_count < owner_count) {
            llRequestAgentData(llList2Key(primlist,2*read_count+1), DATA_NAME);
        } else {
            mes+="-------------------------\n";
            mes+="total:"+(string)total+"/"+(string)maxprims+"\n";
            mes+=(string)(maxprims-total)+" prims available.";
            llSetText(mes, <1,1,1>, 1);
        }
    }
}


「スクリプトの説明」
全体の流れとしては、タイマーイベントを利用して、10秒サイクルでllGetParcelPrimOwnersを
実行し、プリム数をチェックしています。

1. まず最初に、state_entryが呼び出され以下の3つのコマンドが実行されます。

    // フローティングテキストの初期化。
    llSetText("", <1,1,1>, 1); 
    // その土地で許される最大プリム数を取得します。
    maxprims=llGetParcelMaxPrims(llGetPos(),FALSE); 
    // タイマーイベントの開始。
    llSetTimerEvent(cycle); 

2. タイマーイベント(timer)の呼び出し
  タイマーイベントの中では、まず土地に存在するプリムのオーナーリスト(オーナーUUIDと所有プ
  リム数)を取得し、そのリストを昇順にソートしています。オーナーリストの取得には、llGetParcel
  PrimOwnersというコマンドを利用します。

    list tmplist =llGetParcelPrimOwners(llGetPos()); 

 このコマンドは、指定した座標の土地に存在するプリムの内訳をオーナー毎にリスト形式で返します。
 具体的には、[ オーナー1のUUID,オーナー1のプリム数,  オーナー2のUUID,オーナー2のプリム数, ... ]
 という感じです。詳しくは、llGetParcelPrimOwnersを参照ください。
 
    owner_count=llGetListLength(tmplist)/2;  // プリムオーナー数を取得します。
    integer i;  // 変数定義
    primlist=[];  // リスト変数初期化
    
    // ソートコマンドが使用できるように、オーナーリストの偶数番目(オーナーKEY)と奇数番目(プリム数)の
    // 要素を入れ替えます。
    for (i=0; i < owner_count; i++) {
      primlist+=llList2Integer(tmplist,2*i+1);
      primlist+=llList2Key(tmplist,2*i);
    }
    // ソートコマンドで、プリム数の昇順にオーナーリストを並び替えます。
         // ソートコマンドについては、llListSortを参照ください。
    primlist=llListSort(primlist,2,FALSE);
         //  プリムオーナー数が5名以上の場合は、5名を上限とする。(表示制限)
    if (owner_count>4) owner_count=5;

3. オーナー名称の取得
  llGetParcelPrimOwnersで得られるオーナーの情報は、名称ではなくUUIDです。分かりやすいようにUUID
 から名称に変換します。UUIDから名称に変換するコマンドは、2種類あります。llKey2NamellGetAgentInfoです。
 llKey2Nameに関しては、アバターが同一SIM内に存在していなければ名前を取得できないので、今回は、
 llGetAgentInfoを使用します。

    // アバターのUUIDを元に、アバターの名称を要求します。
    llRequestAgentData(llList2Key(primlist,1), DATA_NAME);

 llRequestAgentDataが実行されるとdataserverイベントが発生します。dataserverイベントの中では、所有
 オーナーの数だけllRequestAgentDataを繰り返し、名称変換及びプリム数の加算を行います。全てのリクエストが
 終了すると最後にフローティングテキストで結果を表示します。

リンデンスクリプト Tips Intexへ






同じカテゴリー(リンデンスクリプトTips)の記事画像
サウンド再生スクリプト(リンデンスクリプト Tips)
カメラコントロール(リンデンスクリプト Tips)
標準時間表示スクリプト(リンデンスクリプト Tips)
プリムカウンター2(リンデンスクリプト Tips)
土地情報チェッカー(リンデンスクリプト Tips)
SIM負荷チェッカー(リンデンスクリプト Tips)
同じカテゴリー(リンデンスクリプトTips)の記事
 サウンド再生スクリプト(リンデンスクリプト Tips) (2009-12-16 20:13)
 カメラコントロール(リンデンスクリプト Tips) (2009-11-21 21:26)
 標準時間表示スクリプト(リンデンスクリプト Tips) (2009-11-02 00:34)
 プリムカウンター2(リンデンスクリプト Tips) (2009-10-12 20:40)
 土地情報チェッカー(リンデンスクリプト Tips) (2009-10-11 21:33)
 SIM負荷チェッカー(リンデンスクリプト Tips) (2009-08-09 20:26)
この記事へのコメント
相変わらず。。。

見ても意味不wwww

うちのWEB担当者が

参考にこのブログみてるぞおおおwww
Posted by take at 2008年02月19日 13:47
どんどん参考にしてくれw
Posted by ZEROZERO at 2008年02月20日 00:33
あ、これいいですね^^
さっそくやってみます,(^o^)m
Posted by rino schnyder at 2008年05月30日 21:04
いつも参考にさせてもらってます^^
質問なのですがグループ所有のオブジェクトが土地内にある場合表示されない(おそらく土地情報が読み込めない)のですがなぜでしょうか?
Posted by yoppy runo at 2008年09月04日 12:14
解決しました^^
UUIDを名前に変換するときグループ所有物は変換できないため表示しないのですね^^
お騒がせしました。
Posted by yoppy runo at 2008年09月04日 17:11
ありがとう
Posted by wedding dresses at 2011年09月19日 15:51
 
<ご注意>
書き込まれた内容は公開され、ブログの持ち主だけが削除できます。