【プール機能拡張】でちょっと書いた「更衣室のドア」。「内カギ」ではありませんが、更衣室(試着室)のように、閉めるのは誰でもOKだけど、開けられるのは「閉めた人」とオーナーだけにしました。
基本的な動作は
【ドアとスライドする窓を作る】と
Makapu【鍵をかける】と同じです。
出来上がりがこちらの写真。写真左が閉じている状態の時、写真右が開いている状態の時です。開いている時はフローティングテキストで説明を出しています。
以下スクリプト。
// floating text
string ft = "Touch! Close the curtain.";
// close
vector close_scale = <4.8, 6.2, 0.1>;
vector close_pos = <-2.2, 0.0, 0.0>;
// open
vector open_scale;
vector open_pos;
// open timer(minutes)
integer timers = 60;
// lock key
key lock=NULL_KEY;
default {
state_entry() {
open_scale = llGetScale();
open_pos = llGetPos();
llSetText(ft,<1.0,1.0,1.0>, 1.0);
state open;
}
}
state open {
state_entry() {
// unlock
lock = NULL_KEY;
llSetScale(open_scale);
llSetPos(open_pos);
llSetText(ft,<1.0,1.0,1.0>, 1.0);
}
touch_start(integer total_number) {
lock = llDetectedKey(0);
state close;
}
}
state close {
state_entry() {
llSetScale(close_scale);
llSetPos(open_pos+close_pos);
llSetText(ft,<1.0,1.0,1.0>, 0.0);
llSetTimerEvent(timers*60);
}
touch_start(integer detected) {
if (llDetectedKey(0) == llGetOwner()) { // Owner
state open;
} else if (llDetectedKey(0) == lock) { // touch close user
state open;
}
}
timer() {
llSetTimerEvent(0);
state open;
}
}
Touch! Close the curtain.は、開いている時に表示するフローティングテキストです。
vector close_scale = <4.8, 6.2, 0.1>;の右辺は閉じている時のプリムの大きさです。
vector close_pos =
<-2.2, 0.0, 0.0>;の右辺は閉じている時と開いている時の座標の差分の値です。
integer timers = 60;は自動でカーテンがあくまでの時間を「分」で入れています。
スクリプトの流れはこんな感じです。
「カーテンが開いているとき」
誰かがタッチしたら、その人のUUIDを変数lockに格納。
↓
「カーテンを閉じる」
サイズと位置を変更して、フローティングテキストを消去(厳密には透明にする)。
変数timersで設定した時間後、カーテンを開けるイベントが発生するようにする。
↓
「カーテンが閉じているときに誰かがタッチした」
・触った人がオーナー:変数lockを空にしてカーテンを開ける。
・オーナー以外の場合:タッチした人のUUIDと変数lockを比較、同じであればカーテンを閉じる。
↓
「カーテンが開く」
最初に置いた時のサイズ・位置に戻して、フローティングテキストを表示して変数lockを空にする。
なんだか長くなりましたが、これ大丈夫だと思います。・・・多分^^
ただ、先の記事にも書きましたが、カメラワーク次第では中をのぞかれてしまいます。まぁ、その辺はセカンドライフの仕様なので、どうしようもありませんが・・・