2008年02月18日
プリムカウンター(リンデンスクリプト Tips)
土地に存在するプリム数をカウントするスクリプトです。 その土地のMAXプリム数及び現在の使用プリム数、残りの利用可能プリム数を表示します。 また、オブジェクトのオーナー毎のプリム数(上位5人まで)を表示します。表示は、10秒毎に 更新されます。プリム数を土地情報から毎回確認する必要がないので便利です。不審なプリ ムもすぐに気付くことができますw* 注:このスクリプトの実行には、その土地のオーナー権限が必要です。 * 投稿時点において、アップミスによりスクリプト全体の内容が正常に表示されていませんでした。 現在再アップ済みです。恐らく実行しても何も表示されなかったと思います。。失礼しました。
「スクリプト内容」
//
// 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種類あります。llKey2NameとllGetAgentInfoです。
llKey2Nameに関しては、アバターが同一SIM内に存在していなければ名前を取得できないので、今回は、
llGetAgentInfoを使用します。
// アバターのUUIDを元に、アバターの名称を要求します。
llRequestAgentData(llList2Key(primlist,1), DATA_NAME);
llRequestAgentDataが実行されるとdataserverイベントが発生します。dataserverイベントの中では、所有
オーナーの数だけllRequestAgentDataを繰り返し、名称変換及びプリム数の加算を行います。全てのリクエストが
終了すると最後にフローティングテキストで結果を表示します。
リンデンスクリプト Tips Intexへ
この記事へのトラックバックURL
この記事へのコメント
相変わらず。。。
見ても意味不wwww
うちのWEB担当者が
参考にこのブログみてるぞおおおwww
見ても意味不wwww
うちのWEB担当者が
参考にこのブログみてるぞおおおwww
Posted by take at 2008年02月19日 13:47
どんどん参考にしてくれw
Posted by ZERO
at 2008年02月20日 00:33
at 2008年02月20日 00:33あ、これいいですね^^
さっそくやってみます,(^o^)m
さっそくやってみます,(^o^)m
Posted by rino schnyder at 2008年05月30日 21:04



