地図・座るタイプのテレポーターです。 古いサンプルのため検証が必要です。
まずはタッチで地図を開くテレポーターです。主に他のSIMへテレポートするのに使われます。
default { touch_start(integer total_number) { llMapDestination("JapanSeychellesLand", <128,128,2>, ZERO_VECTOR); } }
このテレポートの行き先は http://slurl.com/secondlife/JapanSeychellesLand/128/128/2 になります。はい、簡単ですねー^^
9月4日追記: llMapDestinationで出るマップは高度1000mが限界みたいです。
2009年9月13日追記: llMapDestinationの高度1000mの限界はビューワー1.22で修正されてます。
座ると一瞬で移動するタイプのテレポーターです。
SIM内でのみ使用できます。
それから高さに制限があって、詳しいことは知らないんですが高度300m以下までぐらいにしか座れません
default { state_entry() { llSetSitText("Teleport"); // パイメニューのSit Hereを変更 llSitTarget(<0,10,20>, ZERO_ROTATION); // 座る位置 } changed(integer change) { if (change & CHANGED_LINK) { key agent=llAvatarOnSitTarget(); if (agent) llUnSit(agent); // アバターが座ったらすぐに立たせる } } }
これだとテレポーターからY方向へ10m、Z方向へ20m移動します。 はい、座る位置決めて、座ったら立たせてるだけなんです。 だから座る位置がテレポート先になるように、テレポーターと目的地の座標の差として計算します。 でも計算がめんどいので簡単にセットアップできるようなスクリプトにしてみましょう。
vector pos; vector dest; default { state_entry() { dest=llGetPos(); // 現在の座標を目的地用の変数に設定 llSetSitText("Teleport"); } touch_start(integer total_number) { if (llDetectedKey(0) == llGetOwner()) { // オーナーがタッチ開始すると llSetTimerEvent(0.5); // 0.5秒後にタイマーイベント } } touch_end(integer total_number) { // タイマーイベントまでにタッチを離すとタイマーキャンセル llSetTimerEvent(0); } timer() { // タイマーイベント llSetTimerEvent(0); // タイマーストップ pos=dest-llGetPos(); // 目的地と現在地の座標差 llSitTarget(pos, ZERO_ROTATION); // 座る位置設定 if (pos != <0,0,0>) llOwnerSay("Setup done."); // 差があれば設定OKですw } changed(integer change) { if (change & CHANGED_LINK) { key agent=llAvatarOnSitTarget(); if (agent) llUnSit(agent); } } }
使い方は、目的地にテレポーターを置いてスクリプトをリセットしてです。
次にテレポーターを設置する出発地に置いてタッチ長押しでセットアップ完了です。
あと、もうひとつ高度300m以上へ行けるタイプのテレポーターは乗ったらオブジェクトごと移動するんですがそれは次回書きますねw