2022/01/30

簡単テレポの設定も簡単に

何年か前に作った簡単テレポ/ジャンプ(参照:階段を昇らずにジャンプ)ですが タッチだけでジャンプ先を設定するには 体の向きなどちょっとしたコツがいります。
それに離れた場所を設定するにはタッチは向いてません。(300メートル先まで設定はできるのですが…)

そこでプリムの説明のところに行先データを書いておけば それを読んで設定できるというスクリプトを書きました。

スクリプトの中に直接データを書くのは もし間違えたとき何が起こるかわからないので ちょっとどきどきですが それよりはずっと気楽に書けます。
説明に書き込むにはプリムの編集権限も必要なので 知らない間に誰かが間違って変えてしまう心配もないでしょう。

読む部分のスクリプトはこちら:

list getDestination(string data)
{ // data: " head : <pos.x, pos.y, pos.z>, look"
  // return [(string)head,(vector)pos,(float)look]
  integer i = llSubStringIndex(data,":"); // ":" がデータを書いてある印
  if (i<0) return [];
  string head = ""; // ":" が先頭(i==0)のとき頭は空
  if (0<i) head = llGetSubString(data,0,i-1); // ":" より前(頭)はデータ以外の説明に
  head = llStringTrim(head,STRING_TRIM); // 前後の空白は取っておく
  string body = llDeleteSubString(data,0,i); // ":" の後ろがデータ
  list info = llParseString2List(body,["<",">",","," "],[]); // 数字の書き方は気楽に
  vector pos = ZERO_VECTOR; // 行先の位置情報
  pos.x = (float)llList2String(info,0); // X座標(東西 メートル)
  pos.y = (float)llList2String(info,1); // Y(南北)
  pos.z = (float)llList2String(info,2); // Z(高さ)
  if (llVecMag(pos)<0.1) return []; // ほとんどゼロ座標だったら行先データではないはず
  float look = (float)llList2String(info,3); // 向き(角度 0度:東, 90度:北)
  return [head,pos,look];
}

写真の遊覧飛行船ドックでは案内看板と乗船デッキへの斜路に同じ仕組みを使ってます。
実際はもう少し複雑ですがそれは省略…(^^)