ページ

2009/08/15

1プリムに複数座れるスクリ

// 1プリムの定位置に2人座れる
list pos=[<0.4,-0.5,0.4>, <0.4,0.5,0.4>]; // 座る位置のリスト(1人目、2人目)
list av; // 座ってるアバターのキーリスト用
vector ang=<0,0,0>; // 座った角度

default
{
state_entry()
{
llSitTarget(<0,0,0.5>, llEuler2Rot(ang*DEG_TO_RAD)); // 座る位置の初期値
integer i;
for (i=0; i < llGetListLength(pos); i++) { // キーリストに座席分のNULL_KEYを設定 av+=[NULL_KEY]; } } changed(integer change) { if (change & CHANGED_LINK) { // リンクが変化したら integer i=llGetNumberOfPrims(); // リンクしてるプリムの数 key id=llGetLinkKey(i); // 座った(リンクした)アバターのキー取得 if (id) { integer j=llListFindList(av,[NULL_KEY]); // 空席チェック if (~j) { // 空いてたら av=llListReplaceList(av,[id],j,j); // アバターのキーをセット vector v=llList2Vector(pos,j); // 空いてた席の座る位置 v.z+=0.35; // Z方向に0.35加算 // 座った位置を移動 llSetLinkPrimitiveParams(i,[PRIM_POSITION,v, PRIM_ROTATION,ZERO_ROTATION/llGetRot()*llEuler2Rot(ang*DEG_TO_RAD)]); } else { // 空席がないとき if (llListFindList(av,[id]) < 0) llUnSit(id); // キーリストになかったら立たせる } } list l; for (i; i > 1; i--) { // 子プリムのキーをリストアップ
l+=[llGetLinkKey(i)];
}
for (i=0; i < llGetListLength(av); i++) { // 座ってるアバターのキーリストと比較して、一致しないキーをリストから削除 id=llList2Key(av,i); if (llListFindList(l,[id]) < 0) av=llListReplaceList(av,[NULL_KEY],i,i); } } } }




人数を増やす場合は
list pos=[<0.4,-0.5,0.4>, <0.4,0.5,0.4>]; の部分に座標を追加

スクリプト参照
http://beta.slmame.com/e707587.html