LlGetOwner/ja
Jump to navigation
Jump to search
LSL ポータル | 関数 | イベント | 型 | 演算子 | 定数 | 実行制御 | スクリプトライブラリ | カテゴリ別スクリプトライブラリ | チュートリアル |
警告
- オブジェクトのオーナーが変わった場合、この関数の戻り値に依存したコードもそれに合わせて自動的にアップデートされたり再評価されるわけではありません。
- すなわち新しいオーナーについて改めて listen および パーミション要求 を行う必要があります。
- これはlistenとパーミションに限った話でなく、戻り値を保持するあらゆる処理にあてはまります。この制約に関わる処理を書くプログラマ次第です。
- オーナーの変更を検知するには、 changed イベントで CHANGED_OWNER フラグを用いるか (2番目の例を参照) 、以前の値を保存しておき、折に触れて (例えばon_rezイベント時) にそれが変更されたか調べます。どちらの手法も有効ですが、後者はオブジェクトが手渡しでなく "オリジナルとして販売" された場合に検知できません。
- すなわち新しいオーナーについて改めて listen および パーミション要求 を行う必要があります。
サンプル
llOwnerSay( (string)llGetOwner()); // アバターの "key" (UUID) をチャットで話す。
llOwnerSay( llKey2Name(llGetOwner())); // オーナーが SIM 内に居るならば、その名前をチャットで話す。
default
{
state_entry()
{
llInstantMessage(llGetOwner(), "この声はあなたしか聞こえない。薄気味悪いでしょ。");
}
changed(integer change)
{
if (change & CHANGED_OWNER)
llResetScript();
}
}
注意点
オーナー名を取得する場合、オーナーが同じリージョンに居る場合は llKey2Name を、リージョンに居ない場合は llRequestAgentData を使います。
多くのプログラマが直面する問題の一つは、オーナーを参照する駆動済みのイベントが、オーナーの変更に自動的に対応しない点です。典型的なのは、オーナーを Listen していると現在のオーナーでなく前のオーナーを Listen し続けるというケースです。これは llGetOwner 関数や llListen 関数の不具合と誤解される事がありますが、そうでなく仕様の一部です。この問題を回避するいくつかの方法があります。簡単なのはオーナーが変わったり rez された時にスクリプトをリセットする事です。尤も、簡単な解決法が常に正しい解決法とは限りません。
オーナーの変更を検知するには2つの方法があり、より信頼できるのは changed イベントを利用することです。
changed(integer change)
{
if (change & CHANGED_OWNER)//オーナーが変わったら、スクリプトをリセットする。
llResetScript();
}
オブジェクトが rez される時にスクリプトをリセットするというのは、多くのアプリケーションで妥当かつ簡単な解決方法です。
on_rez(integer start_param)
{ //オブジェクトが rez されたら、スクリプトをリセットする。
llResetScript();
}
オーナーが変更される時にも変数の値を保持する必要があったり、スクリプトの起動に時間がかかるという場合、スクリプトをリセットする手法は適切でありません。そうした場合は、例えば誰にアニメーションを適用するかといったオーナー依存のコードと同様、新しいオーナーの key を listen 関数に入れ直す必要があるでしょう。
オブジェクトが rez されたりオーナーが変更される都度、オーナー依存のコードを強制的に初期化するために、on_rez イベントと changed イベントを利用できます。
integer listen_handle;
init()
{
key owner = llGetOwner();
llListenRemove(listen_handle);
listen_handle = llListen(0, "", owner, "");
llRequestPermissions(owner, PERMISSION_TRIGGER_ANIMATION);
}
default
{
state_entry()
{
init();
//rez されたりオーナー変更の度に実行しなくともよい、その他の初期化コードをここに追加
//例えば、ノートカードから設定情報を読み取る等
}
on_rez(integer start)
{
init();
}
changed(integer change)
{
if (change & CHANGED_OWNER)
init();
}
run_time_permissions(integer perm)
{//用心深く、llRequestPermissions と共に常に run_time_permissions イベントを使う事。
if(perm & PERMISSION_TRIGGER_ANIMATION)
{
//アニメーション制御、タイマーの開始などをここに記述。
llOwnerSay("I have animation permissions");
}
}
}
関連項目
関数
• | llGetCreator | |||
• | llGetOwnerKey | |||
• | llDetectedOwner |
特記事項
この項目はあなたにとって参考にならない項目ですか?もしかしたらLSL Wikiの関連した項目が参考になるかもしれません。