忍者ブログ
This is an official blog of Orange Forest who is the aircraft developer in the Secondlife virtual world.

[PR]

×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。

「何でこんなに空きプリム少ないの?」な人向けスクリプト

ごぶさたしております。ミューズです。
みなさまお元気ですか?

photo01
::: Ahaaaaa... Where is my object? :::

オレンジフォレストは最近プリム不足病で、いつの間にか空きプリムが無くなっていて「何でこんなに空きプリム少ないのー?」な叫びが頻繁にコダマシテマスw
そんなこんなで今日は区画内に存在するオブジェクトをリストアップするスクリプトを作成したので、同じ悩みを抱える方々にそっと公開します。

使用方法は下記で紹介するスクリプトを入れたプリムを体の適当な場所にアタッチします。するとプリムを着用した場所と同じ土地区画の中のオブジェクトの検索とカウントアップを開始してチャットメッセージで表示します。

LSLのセンサーの仕様上、探知範囲と、1回で検出できるオブジェクトの総数に限りがあるため、このスクリプトでは探知範囲を半径40mにしています。このカウンター着用後、自分の土地の中をくまなく飛び回ってオブジェクトをセンサーに引っ掛けて行きます。


::: List objects in the current parcel :::

チャットメッセージのフォーマットは、
検出番号, プリム数, オブジェクト名, 位置, トータルプリム数
です。

ここで、"show 検出番号" とチャットすると、その検出番号のオブジェクトに向けて矢印パーティクルが一定時間飛んで場所を特定できます。


::: Point the detected object :::

ここからはスクリプトです。
いつも通り御利用は改変自由&自己責任でお願い致します。
バグ指摘、もっと楽な方法ありましたらやんわり教えて下さいね~w


//==================================================================
// Parcel prim counter
// $Id: primcount.lsl 701 2010-08-09 06:33:29Z myuse $
//==================================================================
list gObjIds;
integer gTotalPrims;
key gTgtParcelId;
integer gTimerCount;
float gTimerInterval = 0.97;
float gBeamTimeout = 30.0;
float gBeamRest;
integer gListenHndl = -1;

// 位置情報の簡略表示
string makePosString (vector pos) {
return "<" + (string)((integer)pos.x) + ", " +
(string)((integer)pos.y) + ", " +
(string)((integer)pos.z) + ">";
}

default {
// ユーザーがプリムカウンターを脱着した
attach (key id) {
list parcelParams;

// システム初期化
llParticleSystem([]);
llSetTimerEvent(0.0);
if (gListenHndl >= 0) {
llListenRemove(gListenHndl);
}

if (id == llGetOwner()) {
   // ユーザーがプリムカウンターを着用
// 計測開始
gObjIds = [];
gTotalPrims = 0;
gTimerCount = 0;
parcelParams = llGetParcelDetails(llGetPos(),
[PARCEL_DETAILS_ID, PARCEL_DETAILS_NAME]);
gTgtParcelId = llList2Key(parcelParams, 0);
llOwnerSay("Start counting object for this parcel (" +
llList2String(parcelParams, 1) + ").");
llListen(0, "", llGetOwner(), "");
llSetTimerEvent(gTimerInterval);
}
else {
// 計測終了
llSetTimerEvent(0.0);
}
}

// センサーでオブジェクトを探索
// 1イベント毎に scripted, non-scripted を交互に検索
timer() {
if (gBeamRest > 0.0) {
gBeamRest -= gTimerInterval;
if (gBeamRest <= 0.0) {
llParticleSystem([]);
}
}

gTimerCount = 1 - gTimerCount;
if (gTimerCount) {
llSensor("", NULL_KEY, PASSIVE, 40.0, PI);
}
else {
llSensor("", NULL_KEY, PASSIVE | SCRIPTED, 40.0, PI);
}
}

// ユーザーが指定したオブジェクトに矢印パーティクルを指し示す
listen (integer ch, string name, key id, string mes) {
list words = llParseString2List(mes, [" "], []);
key tgt;

if ((llList2String(words, 0) == "show") && (llGetListLength(words) == 2)) {
tgt = llList2Key(gObjIds, (integer) llList2String(words, 1));

if (tgt == NULL_KEY) {
llOwnerSay("ERROR : Unknown object number.");
return;
}

gBeamRest = gBeamTimeout;
llParticleSystem([PSYS_SRC_PATTERN, PSYS_SRC_PATTERN_DROP,
PSYS_SRC_TARGET_KEY, tgt,
PSYS_PART_START_COLOR, <1.0, 1.0, 1.0>,
PSYS_PART_START_ALPHA, 1.0,
PSYS_PART_START_SCALE, <0.5, 1.0, 0.0>,
PSYS_PART_MAX_AGE, 9.0,
PSYS_SRC_BURST_RATE, 0.6,
PSYS_SRC_TEXTURE, "a990f9a1-ab01-5071-444e-552b0f3f4983",
PSYS_SRC_BURST_PART_COUNT, 1,
PSYS_PART_FLAGS,
PSYS_PART_TARGET_POS_MASK |
PSYS_PART_EMISSIVE_MASK |
PSYS_PART_FOLLOW_VELOCITY_MASK ]);
}
}

// センサー、検出したオブジェクトの判定
// 一度検出したオブジェクトはスキップ
sensor (integer numDetected) {
integer n;
key id;
vector pos;
string name;
integer prim;

for (n=0; n<numDetected; n+=1) {
id = llDetectedKey(n);
pos = llDetectedPos(n);
if (llList2Key(llGetParcelDetails(pos, [PARCEL_DETAILS_ID]), 0)==gTgtParcelId) {
if (llListFindList(gObjIds, [id]) < 0) {
gObjIds += [id];
prim = llGetObjectPrimCount(id);
name = llDetectedName(n);
gTotalPrims += prim;
if (llGetOwnerKey(id) == llGetOwner()) {
// Your object
llOwnerSay("@ No." + (string) llGetListLength(gObjIds) +
", " + (string) prim + "prim, " +
name + " " + makePosString(pos) +
", total " + (string) gTotalPrims + "prims");
}
else {
// Not your's
llOwnerSay(" No." + (string) llGetListLength(gObjIds) +
", " + (string) prim + "prim, " +
name + " " + makePosString(pos) +
", total " + (string) gTotalPrims + "prims");
}
}
}
}
}
}

で、結局、空きプリムが少ない原因は未知の巨大オブジェクトじゃなくてミューズのプリム浪費癖が悪かっただけってことが判明しましたとさ
orz 超ガックシ

ではでは
おそまつでした~
PR