2014/09/14

デモ機を自動で出す(Rez)

築地のデモ用飛行船ですが、遊覧飛行に出かけると、あとに新しいのを自動で出す(Rez)ようになってます。
デモ機のほうは一時オブジェクトになって遊覧飛行のあと降りると消えるので、もとの場所に戻す必要がない、とても親切な設計ですね(^^)

このしかけは、デモが始まるとき、デモ機はキーワード "Demo Start" を言うので、これをきっかけに周辺をスキャンしてデモ機がいるかどうか調べ、いなくなったら、中に保管してある新しいデモ機を出す(Rez)のです。
どこに出すかは、あらかじめ所定の位置に置いたデモ機を一度スキャンして調べます。

築地のお店では、このしかけを飛行船に昇る階段(踏み板)に仕込んであります。
薄~い踏み板の中に、この大きさのデモ飛行船を保管しているわけですね~(^^)
default {
  state_entry() {
    Object = llGetInventoryName(INVENTORY_OBJECT,0);
    if (Object) { // 中に保管しているオブジェクト(デモ機)の名前で
      llListen(Channel,Object,NULL_KEY,"Demo Start"); // キーワードを待つ
      llSensor(Object,NULL_KEY,SCRIPTED,Range,PI); // 位置記録のため一度スキャン
    }
  }
  listen(integer chan,string name,key id,string msg) { // キーワードを聞いたら
    llSensorRepeat(Object,NULL_KEY,SCRIPTED,Range,PI,Cycle); // 繰返しスキャン
  }
  sensor(integer num) { // スキャン範囲内にオブジェクトがあって
    if (Pos==ZERO_VECTOR) { // 位置の記録がまだないとき(最初のスキャン)
      Pos = llDetectedPos(0); // 位置と回転を記録
      Rot = llDetectedRot(0);
    } // (繰返しスキャン中、近くにいるときは何もしない)
  }
  no_sensor() { // スキャン範囲からいなくなったら
    if (Pos) {
      llRezAtRoot(Object,Pos,ZERO_VECTOR,Rot,0); // オブジェクトをRez
      llSensorRemove(); // 繰返しスキャンを停止
    }
  }
}

2014/09/13

階段を昇らずにジャンプ

SL内の階段やはしごには、歩いて昇るのが面倒な省エネタイプの人のために、簡単なジャンプをしかけておくと親切です。
このジャンプは「座る」位置を設定して、誰か座った人を目的の場所に立たせるようにします。
省エネの徹底には「メニューから選ぶ」のも省きたいので、「(左)クリックで座る」設定にします。

目的位置の設定も簡単にするため、所有者がそこに立ってタッチするとその位置を記録するようにします。
もしすでに設定済みの場合、普通のタッチ(左クリック)では座ってしまうので、右クリックでメニューを開いてタッチを選び、リセットで全部解除してから、もう一度目的位置に立ってタッチしなおします。

llSitTarget() で位置と向き(回転)を設定しますが、プリムから見た相対的(ローカル)な位置と回転にするため、タッチしたアバターの位置からプリムの位置を差し引き、プリムの回転で割ります。(回転は「引く」のでなく「割る」のだそうです)
default {
  state_entry() {
    llSitTarget(ZERO_VECTOR,ZERO_ROTATION); // 座る位置設定解除
    llSetClickAction(CLICK_ACTION_NONE); // 左クリックの動作設定解除
  }
  touch_start(integer num) {
    if (llDetectedKey(0)==llGetOwner()) { // 所有者だけが設定できる
      if (Target) llResetScript(); // 設定済みならリセット
      vector pos = llDetectedPos(0); // 位置
      rotation rot = llDetectedRot(0); // 回転(向き)
      pos = (pos-llGetPos())/llGetRot(); // ローカル座標に変換
      rot /= llGetRot();
      llSitTarget(pos,rot); // 座る位置と回転を設定
      llSetClickAction(CLICK_ACTION_SIT); // 左クリックの動作「座る」
      Target = TRUE; // 設定が済んだしるし
    }
  }
  changed(integer change) {
    if (change & CHANGED_LINK) { // 座るとリンクが変わる
      key id = llAvatarOnSitTarget();
      if (id) { // アバターが座ったら
        llSleep(0.7); // 落ち着くまで待って
        llUnSit(id); // 立たせる
      }
    }
  }
}

2014/09/05

お店をぐらっと傾けて?

いつもどおりヒマ~な築地のお店なので、気分転換にちょっと模様替えをしました。
床しかなくて全然店っぽくなかったので、レンガの壁を立てると…、いまいち普通っぽすぎるので、それをぐらっと傾けて…。
やっぱり店っぽくならないです…(^^;

築地場外市場(SLurl)
http://slurl.com/secondlife/TSUKIJI/80/55/22/