ページ

2009/05/27

長距離テレポータースクリプト

// 長距離用の高速テレポーター
vector dest;
vector pos;

default
{
state_entry()
{
llSitTarget(<0.2,0,0.55>, ZERO_ROTATION); // 座る位置
dest=llGetPos(); // 現在位置の座標を目的地に設定
llOwnerSay("Destination = "+(string)dest);
}

changed(integer change)
{
if (change & CHANGED_LINK) { // リンクが変わったとき
key id=llAvatarOnSitTarget(); // 乗ってるアバターのキー
if (id) {
if (pos) return; // 出発地座標が設定されてるとき(動作中)はリターン
pos=llGetPos(); // 現在位置を出発地の座標に設定
vector v=dest-pos; // 目的地と出発地のベクトルの差
float f=llVecDist(dest,pos); // 移動する距離
list l; // llSetPrimitiveParams用のリスト
integer i;
integer j=llCeil(llFabs(f/10)); // 移動距離を10mで何分割になるか計算
vector p=v/j; // 1回に移動させるベクトル値
for (i=0; i <= j; i++) { // 分割した回数分ループ l+=[PRIM_POSITION,pos+p*i]; // 分割した座標をリストアップ } llSetPrimitiveParams(l); // テレポート開始 llUnSit(id); // 目的地でアバターを降ろす l=[]; // リストをクリア for (i=j; i >= 0; i--)
{ // 行きと逆順のリストにする
l+=[PRIM_POSITION,pos+p*i];
}
llSetPrimitiveParams(l); // テレポーターを出発地に戻す
pos=ZERO_VECTOR; // 出発地の座標をクリア
}
}
}
}
目的地に置いてリセット→スタート地へ置く

スクリプト参照