セカンドライフでは、
自分のアバターも他人のアバターも固有のkeyで管理しています。
そのkey情報を使って、いろいろな情報を取得できます。
というわけで、さっそくスクリプトです。
情報別に関数に分けて使いやすい形にしてみました。
下記のスクリプトは、設置するとstartGetAvatorが呼ばれて、
半径10メートルにいるアバターの情報を取得します。
アバターの情報が取得できたら、addSensorAvatorでアバターのkeyをlistへ追加して、
testMessage2で、実際にkey情報から各情報を取得します。
背の高さを取得するときは、llGetAgentSizeもあるのですが、
アバター以外の高さも測れるようにお馴染みのバウンディングボックスの高さから取得してます。
integer i;
key key_my_object = NULL_KEY;
key key_owner = NULL_KEY;
integer is_get_avator = FALSE;
integer list_get_avatar_length = 0;
list list_get_avator = [];
string getName(key key_target) {
string name_display_name = llGetDisplayName(key_target);
return(name_display_name);
}
float getHeight(key key_target) {
list box = llGetBoundingBox(key_target);
if(llGetListLength(box) == 0) {
return(0);
}
vector min_corner = llList2Vector(box, 0);
vector max_corner = llList2Vector(box, 1);
return(max_corner.z - min_corner.z);
}
vector getPosition(key key_target) {
list list_details = llGetObjectDetails(key_target, [ OBJECT_POS ]);
if(llGetListLength(list_details) == 0) {
return(<0, 0, 0>);
}
return(llList2Vector(list_details, 0));
}
rotation getRotation(key key_target) {
list list_details = llGetObjectDetails(key_target, [ OBJECT_ROT ]);
if(llGetListLength(list_details) == 0) {
return(<0, 0, 0, 1>);
}
return(llList2Rot(list_details, 0));
}
vector getVelocity(key key_target) {
list list_details = llGetObjectDetails(key_target, [ OBJECT_VELOCITY ]);
if(llGetListLength(list_details) == 0) {
return(<0, 0, 0>);
}
return(llList2Vector(list_details, 0));
}
testMessage(key key_target) {
llOwnerSay((string)key_target);
llOwnerSay((string)getName(key_target));
llOwnerSay((string)getHeight(key_target));
llOwnerSay((string)getPosition(key_target));
llOwnerSay((string)getRotation(key_target));
llOwnerSay((string)getVelocity(key_target));
}
testMessage2() {
for(i = 0; i < list_get_avatar_length; i++) {
key key_target = llList2Key(list_get_avator, i);
testMessage(key_target);
}
}
startGetAvator() {
llOwnerSay("start sensor");
llSensor( "", NULL_KEY, AGENT, 10.0, PI );
}
addSensorAvator(integer num_detected) {
list_get_avator = [];
list_get_avatar_length = 0;
is_get_avator = TRUE;
for(i = 0; i < num_detected; i++) {
key key_detected = llDetectedKey(i);
list_get_avator += key_detected;
list_get_avatar_length++;
}
}
test() {
startGetAvator();
}
default {
state_entry() {
key_my_object = llGetKey();
key_owner = llGetOwnerKey(key_my_object); // llGetOwner
}
timer() {
}
touch_start(integer num_detected) {
test();
}
on_rez(integer start) {
test();
}
sensor(integer num_detected) {
addSensorAvator(num_detected);
testMessage2();
}
}
あと、今回の話とは関係ありませんが、
クリックすると跳ねあがるスクリプトのサンプルつくりました。
忘れないように
key sound_1 = "168f3100-42f7-f1b7-214e-44f135924886";
default {
state_entry() {
}
touch_start(integer num_detected) {
llPlaySound(sound_1, 1.0);
vector offset = llGetLocalPos();
vector new_position = offset + <0, 0, 0.3>;
llSetPos(new_position);
llSleep(0.1);
llSetPos(offset);
}
}
さらに、他のサンプルスクリプトとして、
長い音声を流すスクリプトサンプルも作ったので、忘れないようにここにメモメモ。
各10秒間、6つの音声のkeyを上で設定して、Rezすると再生されます。
key m1 = "";
key m2 = "";
key m3 = "";
key m4 = "";
key m5 = "";
key m6 = "";
list soundlist = [];
float size = 10.0;
integer pos = 0;
integer length = 0;
startObject() {
soundlist = [
m1, m2, m3, m4, m5, m6
];
length = llGetListLength(soundlist);
integer i;
for(i = 0; i < length; i++) {
key sound = llList2Key(soundlist, i);
llPreloadSound(sound);
}
llSetTimerEvent(size);
}
default {
state_entry() {
startObject();
}
timer() {
llPlaySound(llList2Key(soundlist, pos), 1.0);
pos++;
if(pos == length) {
llSetTimerEvent(0);
}
}
on_rez(integer num) {
llResetScript();
}
}
タッチした面の面番号を取得。
default {
state_entry() {
}
touch_start(integer total_number) {
llOwnerSay((string)llDetectedTouchFace(0));
}
}





コメント