list aimpoint = [<120,130,26>,<130,130,26>,<130,120,26>];//目的地座標のリスト vector defaultpos;//デフォルトの座標 rotation defaultrot;//デフォルトの位置 key sid; float timerspan = 0.1; float distancespan = 0.5; integer checkpointnum = 0;//現在向かっているチェックポイントの通し番号 integer routenum = 0;//現在向かっているチェックポイントまでの距離 vector nowvec; rotation nowrot; integer nowstep; //次の目的地を取得 getNextParams(vector vecfrom , vector vecto , float dspan) { vector vecnext = vecto-vecfrom; float dist = llVecMag(vecnext); //次のポイントまでの距離 integer snext = (integer)(dist / dspan); if(snext <= 0) //距離が0のとき { snext=1; } vector vnext = (vecnext / snext); rotation rnext=llAxisAngle2Rot(<0,0,1>,llAtan2(vecnext.y,vecnext.x)); nowvec = vnext; nowstep = snext; nowrot = rnext; } setPosAndRot(vector pos , rotation rot)//位置と回転を変更 { if(rot!=llGetRot()) { llSetRot(rot); } if(pos!=llGetPos()) { llSetPos(pos); } } integer reachPoint()//各ポイント到達時の処理 { checkpointnum++; if(checkpointnum>=llGetListLength(aimpoint))//最終ポイント=ツアー終了 { return TRUE; } else {//まだポイントが残っている getNextParams(llList2Vector(aimpoint,checkpointnum - 1), llList2Vector(aimpoint,checkpointnum),distancespan); return FALSE; } } endTour()//ライドの終了 { //llForceMouselook(0); llSay(0,"Thank you for riding!"); llUnSit(sid); //スタート地点に戻る setPosAndRot(llList2Vector(aimpoint,0) , defaultrot); } default { state_entry() //or on_rez() { llOwnerSay("***default mode"); defaultpos = llGetPos(); defaultrot = llGetRot(); llSetText("tour ride" , <1,1,1>,1.0); llSetSitText("start tour"); llSitTarget(<0,0,0.1> , ZERO_ROTATION); } on_rez(integer num) { llResetScript(); } changed(integer change) { if (change & CHANGED_LINK){ sid = llAvatarOnSitTarget(); if (sid != NULL_KEY) { state tourling; } } } } state tourling { state_entry() { llOwnerSay("***tourling mode"); llSetText("" , <1,1,1>,1.0); checkpointnum = 0; //llForceMouselook(1); llSetCameraAtOffset(<5,0,1>); getNextParams(llGetPos(),llList2Vector(aimpoint,0),distancespan); llSetTimerEvent(timerspan); } timer() { nowstep --; setPosAndRot(llList2Vector(aimpoint,checkpointnum) - (nowvec * nowstep) , nowrot); if (nowstep<=0) { integer isend = reachPoint(); if(isend) { endTour(); state backtour; } } } changed(integer change) { if (change & CHANGED_LINK){ sid = llAvatarOnSitTarget(); if (sid == NULL_KEY) { endTour(); state backtour; } } } } state backtour //ツアー終了or中断時にスタート地点に戻す { state_entry() { getNextParams(llGetPos() , defaultpos , 10.0); llSetTimerEvent(0.1); } timer() { nowstep --; setPosAndRot(defaultpos - (nowvec * nowstep) , defaultrot); if (nowstep<=0) { setPosAndRot(defaultpos , defaultrot); //端数を調整 state default; } } }