LSL(Linden Script Language)スクリプトTips集

リモートロード(llSetRemoteScriptAccessPin,llRemoteLoadScriptPin関数)

同じスクリプトのオブジェクトを複数作成し、設置しているケースなどで
設置後にスクリプトの内容を修正したくなったことはありませんか?
数が多ければ多いほど、これらの更新作業は面倒ですね。
例えば、キャンプを複数設置していて、キャンプでもらえるリンデンドルのレートを一括で変更したくなったときなど・・・。
そんな時、LSLにはスクリプトのリモートロード機能があり、
これを使えばスクリプトの追加や修正が一括でできて便利です。

まずロード先のプリムを準備します。
ロードされるには、このプリムのkey(UUID)とPin(暗証番号みたいなもの)が必要になりますので、
下記のスクリプトを使います。このプリムをタッチ(Touch)するとUUIDが表示されます。
このUUIDは後ほどロード元のスクリプトで使います。

integer pin = 123;
default
{
  state_entry()
  {
      llSetRemoteScriptAccessPin(pin);
  }
  touch_start(integer total_number)
  {
      llSay(0,llGetKey());
  }

}
llSetRemoteScriptAccessPin関数:llSetRemoteScriptAccessPin(integer pin)
一番目のパラメータ : スクリプトをリモートロードするかどうか、
照合する為に使用する暗証番号みたいなもの(0はだめ)
※llSetRemoteScriptAccessPin関数は0.2秒間の遅れが生じます。
llGetKey関数:llGetKey()
UUIDを取得します。


次にロード元のプリムを準備します。
今回はllSetTextSampleという名前のオブジェクトの上に文字を表示するスクリプトをロードすることにします。
下記のスクリプトを使います。このプリムをタッチ(Touch)すると、ロードが開始され、
llSetTextSampleという名前のスクリプトがロード先にコピーされます。
完了すると「Complete!」と表示されます。

integer pin = 123;
default
{
  touch_start(integer total_number)
  {
      llRemoteLoadScriptPin("ddd7d753-7d90-1985-a9f2-8f55760b7c25","llSetTextSample", pin, TRUE, 0);
      llSay(0, "Complete!" );
  }
}
llRemoteLoadScriptPin関数:llRemoteLoadScriptPin(key target, string name, integer pin, integer running, integer start_param)
一番目のパラメータ : ロード先のプリムのkey(UUID)ロード先のプリムをTouchすると表示されますのでそれを指定してください。
ニ番目のパラメータ : ロードするスクリプトの名前
三番目のパラメータ : ロード先のllSetRemoteScriptAccessPin関数で設定したPin(暗証番号みたいなもの)
四番目のパラメータ : TRUEまたはFALSE。TRUEの場合ロードが完了した後、スクリプトが実行中の場合はstate_entryイベントが発生します。
五番目のパラメータ : ここで指定した値はstate_entryイベントでllGetStartParameter関数を使うと取得できます。値を渡す必要がない場合は、0でいいです。
※llRemoteLoadScriptPin関数は3秒間の遅れが生じます。

ロード先のプリムを見てみると、llSetTextSampleスクリプトができており、 プリムの上に文字が表示されるようになったと思います。

<補足>
ロード元とロード先のオブジェクトが同一SIM内になければ、ロードされません。
また、オーナーがロード先の変更権限(modify)を持っていない場合は、ロードされません。
ロード先にスクリプトが存在しない場合には作成され、存在する場合には上書きされます。

同一SIM内でなくてもロードできたら、ものすごく便利なんだけどなぁ。。。