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(); // 繰返しスキャンを停止
    }
  }
}