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];
}

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

2022/01/22

繰り返しで説明文を表示

ベネチアSIMにはやはりというかいろんな国の方が来られます。

案内看板の説明が日本語だけだとなにか不親切な感じがします。
国際語の英語はもちろん ここはベネチアなのでイタリア語もほしいところ。
でもいっぺんに表示するとごちゃごちゃしてすっきりしないし 読みたいのは 3ヶ国語全部じゃなくひとつでいいはず。

というわけで 説明文を分けてそれを繰り返しで表示するスクリプトを作りました。
表示が次々変わるので 見た人の気を引く効果もありそうです。

スクリプトはこちら:

// Cycle Text v1.2
list Msgs = [
  "Tocca/Siediti al Porto del Dirigibile Turistico.",
  "Touch/Sit to Airship Sightseeing Port.",
  "タッチ/座って遊覧飛行船の出発地へ"];
float TimeCycle = 7; // 秒ごとに切り替え
integer Stride = 1; // 1度に表示する行数
integer Index = 0;

default {
  state_entry() {
    llSetText("",<1,1,1>,1);
    llSetTimerEvent(TimeCycle);
  }
  timer() {
    list lines = llList2List(Msgs,Index,Index+Stride-1); // 表示する文
    string text = llDumpList2String(lines,"\n"); // 2行以上なら改行でつなぐ
    llSetText(text,<1,1,1>,1); // テキスト表示
    Index += Stride; // 次の表示
    if (llList2String(Msgs,Index)=="") Index = 0; // 終わりなら先頭に戻る
  }
}

表示を1度に何行かまとめて出せるようにもしてあります。
Stride=1 になってますがこれを 2 にすれば2行づつ 4にすれば4行づつというわけです。

2022/01/15

小さくすると頭がつかえる?

ベネチアSIMで遊覧飛行船の準備をしてるとき 売ってる飛行船がそのままでは大きすぎて建物内で圧迫感があるので少し小さくしました。(もともとリサイズ機能つきです)
なかなかかわいくなりましたが ここで問題発生 !
降りるときにどうかすると頭が風船部分につかえて船から出れなくなったりします(TT);;;
風船部分だけファントムにする方法を試しましたが(昔の記事参照: 通り抜けできるプリム)さらに大きな問題が…いきなりランドインパクトが何百もあがってこれだけで SIM に負担がかかりそうなんです !!! 

…そこでどうしたかというと 人が乗ったら飛行船全体をファントムにすることにしました。
ファントムでも人が乗るぶんには何も問題ありません。
降りるときは船体を素通りするので空中にいたら下に落ちますがまあいいことにしましょう。
あとは飛んでるとき建物にぶつかっても船体部分が素通りしてしまいますが 今までちょっとさわっただけで船がひっくり返って大騒ぎ ! だったのがわりと平気になったのでこれもよしとしましょう。(人はファントムにならないのでもちろん素通りしません)

スクリプトはこんな感じ:

default {
  state_entry() {
    llSetPrimitiveParams([PRIM_PHANTOM,FALSE]); // ファントムじゃない
  }
  changed(integer change) {
    if (change & CHANGED_LINK) { // 人の乗り降りでリンクが変わる
      if (llGetNumberOfPrims() != llGetObjectPrimCount(llGetKey())) // 誰か乗ってる
        llSetPrimitiveParams([PRIM_PHANTOM,TRUE]); // ファントムにする
      else llSetTimerEvent(Wait); // 誰も乗ってない しばらく待つ
    }
  }
  timer() {
    llResetScript(); // リセットしてファントムでなくす
  }
}

ここで llGetNumberOfPrims() は座ってるアバターを含めたリンク数 llGetObjectPrimCount() は含まないプリムだけの数 なので比較すれば誰か座ってるかどうかがわかるしかけです。

2022/01/08

遊覧飛行船のテクスチャー

遊覧飛行船のテクスチャーはベネチアSIMのスタッフさんたちが使っているのを使わせていただきました。
これと同じテクスチャーの製品はベネチアのインワールドの売り場の箱にだけ同梱しています。(「MyShip」と「MyShip Shoulder」)
ベネチアSIMに来ていただいたお客様だけの特典です! ^^/

SLurl はこちら:
https://maps.secondlife.com/secondlife/Yumix%20Prada/189/90/22
ベネチアSIMのランディングポイントはリアルト橋にあって お店へはそこから75mです。
遊覧飛行船の案内看板がすぐ近くにあるので そこからおいでください。

2022/01/01

ベネチアSIMにお店を開きました

2022年あけましておめでとうございます。
最近あんまり活動してませんでしたが このたびベネチアSIMにお店を開くことになりました。
SLurl はこちら:
https://maps.secondlife.com/secondlife/Yumix%20Prada/189/90/22
ベネチアSIMのランディングポイントはリアルト橋にあって お店へはそこから運河沿いを海に向かって75m先 写真右下に写ってる建物の中にあります。
例の赤いビームを頼りに散策しながら来られるか または遊覧飛行船の案内看板がすぐ近くにあるので そこから一気においでください。