on_rez


on_rez(integer start_param)


それが別のオブジェクトによって、または、インベントリーからか、装着品としてrezzedされるときはいつも、所有者がそれを装着しているいる間に、ログインするか、またはインベントリーから装着品を装着した時に、オブジェクトの中で引き起こされます。
オブジェクトがテレポートの後にrezzedされるときには、on_rezは引き起こされません。
そのためには、代わりにchange()イベントを使用してください。
"start_param"はこのオブジェクトをrezしたスクリプトの中でllRezObjectかllRezAtRootによって供給された引数の値です。
エージェントによってREZされた場合はstart_paramの値は常に0になります。
スクリプトの中のどこからでもllGetStartParameterを使用することによって、start_paramの値は取得できます。

注意:
on_rezもまたステートの規則に従っています。
実行中のスクリプトは持ち物にTAKEされるときにそれらのステートを保存し、それらがインワールドに戻されたときにはスクリプトはリセットされず、単にプロセスが
再開されることを忘れないでください。
言い換えると、スクリプトのステートにかかわらず特定の機能を実行させるためには、on_rezはすべてのステートの中になければなりません。
これは、llListenがon_rezイベントにあれば古い1番目を削除するのではなく、それが新しいリスナーから始めるだろうということを意味します..
on_rez(あるいはllListenRemoveを最初に使用する場合にも)にllListenを入れないようにしてください。

Example:
// this example can be used
// in a bullet that is rezzed by a gun
// if rezzed by the gun, 
// supply a value != 0 to llRezObject
default {
   on_rez(integer start_param) {
       if (start_param != 0) {
           // if rezzed by gun
           llSetTimerEvent(5.0);
           // set die timer
       }  
// otherwise do not die after timeout,
//   so we can still be rezzed for editing
   }
   [[timer]]() {
       llDie(); // delete this object
   }
}
注意:
しかしながら、アタッチ前ににオブジェクトをデタッチする時にすべてを実行する適切な時間がない場合、「デタッチする」部分は、on_rezイベントに先立って実行されるでしょう。

default {
   on_rez(integer start_param) {
       llSay(0, "on_rez");
   }
   [[attach]](key id) {
       llSleep(10.0);
       llSay(0, "attach");
   }
}

object_rez(それは、llRezObjectを使用して、rezを行うオブジェクトに生じる)とon_rezを混同しないでください。


Q: on_rezイベントはオブジェクトとのどんなインワールド相互作用が発生した場合でもその前に完了することを保証されますか?
例えば、スクリプトがon_rez()の内のいくつかの呼び出しを持っていた場合、オブジェクトに対する他のアクションは、物理学イベントのように、イベントが完了する前にオブジェクトに影響を与えることができますか?
REZされた後に物理的な状態を変更された弾丸は、まだllRezObject()関数に渡された力によって推進されるように見えます。
弾丸オブジェクトの中のon_rezイベントで衝撃がGUNスクリプトによって適用される前に、物理が有効にされたことを示しているように見えます。


A: 恐らく、起こっているのは、適用された力が生きる時間を与えられるということです、また、この時間を超過したら、力は無効化されます。オブジェクトがrezされている場合、イベントが既に実行されていれば、on_rez()イベントはキューされるでしょう。

A2: 通常、初速度付きでrezされる必要のあるオブジェクトはrezするオブジェクトのインベントリに格納された時点で物理状態をオンにします。

Q:シフトコピーを使って手動でオブジェクトを複写する場合、on_rezは起きますか?私は、それが以前そうしたことを思い出したのですが、しかし、それは全く(それほど)行っていません。下記のスクリプトはシフトコピーで働きさえしませんでした。

on_rez(integer bla)
{
 llOwnerSay("I've been rezzed");
}

A: スクリプトがリセットされるので、あなたが変更コピーを行う場合、これは起こります。
最初に新しいオブジェクトがRezされた後に、その中に含まれていたスクリプトが開始されるからです。
スクリプトがスタートする時にオブジェクトが既に存在したので、state_entryが呼ばれます。
オブジェクトがTAKEされ、所有者が、それについてのコピー許可を持っており、次にスクリプトによって、あるいはインベントリからそのオブジェクトをrezすれば、それはスクリプト許可を含めて、それが得られた時と同じスクリプト状態を持つでしょう。.


Q: オブジェクトが削除されるか、インベントリーにTAKEされる場合、実行されるイベントはありますか?
A:いいえ。アタッチしたオブジェクトをデタッチする時、attach()のイベントは起きるでしょうが、それだけです。ある種の自動消滅機能を作成したいか、使用後にオブジェクトを無効にしたい場合は、on_rez()とある種のカウンタを使用してください。

Q: このオブジェクトをrezさせたオブジェクトかエージェントのキーを得る方法はありますか?
A:いいえ、直接的にはありません。
そのもっとも簡単な方法はllRezObject()を実行した後にREZするオブジェクトがなにかキーワードをSayしなければならず、レズさせるオブジェクトがチャットチャンネルを聞き取るスクリプトを持たなければなりません。
レズするオブジェクトのIDはレズされるオブジェクトのListenイベントハンドラーが引数を通じて受け渡されます。
もし(レズされるオブジェクトの)スクリプトがレズするオブジェクトの声を聞き取れない場合は、レズするオブジェクトにllSleep()を使ってほんの短い遅延処理を加える必要があります。


Q:llResetScriptを避けている場合、どのように、私は私の変数のすべての値を保持し、llGetOwner()を更新することができますか?
A: llGetOwner()でllListenを削除しセットする、新しい関数を作りましょう。
この関数をstate_entry()イベントとon_rez()イベントで参照してください。
これはリスナーに新しい所有者を割り当てますが、データをリセットするllResetScriptと異なりデータを削除しません。。
最終更新:2008年10月01日 07:57