Difference between revisions of "LlGetOwner/ja"
m (Apply LSLG Template) |
m (Undo partically) |
||
Line 8: | Line 8: | ||
|spec | |spec | ||
|caveats=*オブジェクトのオーナーが変わった場合、この関数の戻り値に依存したコードもそれに合わせて自動的にアップデートされたり再評価されるわけではありません。 | |caveats=*オブジェクトのオーナーが変わった場合、この関数の戻り値に依存したコードもそれに合わせて自動的にアップデートされたり再評価されるわけではありません。 | ||
**すなわち新しいオーナーについて改めて | **すなわち新しいオーナーについて改めて[[llListen/ja|listen]]および[[llRequestPermissions/ja|パーミション要求]]を行なう必要があります。 | ||
***これはlistenとパーミションに限った話でなく、戻り値を保持するあらゆる処理にあてはまります。この制約に関わる処理を書くプログラマ次第です。 | ***これはlistenとパーミションに限った話でなく、戻り値を保持するあらゆる処理にあてはまります。この制約に関わる処理を書くプログラマ次第です。 | ||
**オーナーの変更を検知するには、{{LSLG/ja|changed}}イベントで{{LSLG/ja|CHANGED_OWNER}}フラグを用いるか(2番目の例を参照)、以前の値を保存しておき、折に触れて(例えば{{LSLG/ja|on_rez}}イベント時)にそれが変更されたか調べます。どちらの手法も有効ですが、後者はオブジェクトが手渡しでなく "オリジナルとして販売" された場合に検知できません。 | **オーナーの変更を検知するには、{{LSLG/ja|changed}}イベントで{{LSLG/ja|CHANGED_OWNER}}フラグを用いるか(2番目の例を参照)、以前の値を保存しておき、折に触れて(例えば{{LSLG/ja|on_rez}}イベント時)にそれが変更されたか調べます。どちらの手法も有効ですが、後者はオブジェクトが手渡しでなく "オリジナルとして販売" された場合に検知できません。 |
Revision as of 03:37, 13 April 2009
LSL ポータル | 関数 | イベント | 型 | 演算子 | 定数 | 実行制御 | スクリプトライブラリ | カテゴリ別スクリプトライブラリ | チュートリアル |
警告
- オブジェクトのオーナーが変わった場合、この関数の戻り値に依存したコードもそれに合わせて自動的にアップデートされたり再評価されるわけではありません。
- すなわち新しいオーナーについて改めてlistenおよびパーミション要求を行なう必要があります。
- これはlistenとパーミションに限った話でなく、戻り値を保持するあらゆる処理にあてはまります。この制約に関わる処理を書くプログラマ次第です。
- オーナーの変更を検知するには、changedイベントでCHANGED_OWNERフラグを用いるか(2番目の例を参照)、以前の値を保存しておき、折に触れて(例えばon_rezイベント時)にそれが変更されたか調べます。どちらの手法も有効ですが、後者はオブジェクトが手渡しでなく "オリジナルとして販売" された場合に検知できません。
- すなわち新しいオーナーについて改めてlistenおよびパーミション要求を行なう必要があります。
サンプル
<lsl>llOwnerSay( (string)llGetOwner()); // アバターの "key" (UUID) をチャットで話す。 llOwnerSay( llKey2Name(llGetOwner())); // オーナーが SIM 内に居るならば、その名前をチャットで話す。</lsl>
<lsl>default {
state_entry() { llInstantMessage(llGetOwner(), "この声はあなたしか聞こえない。薄気味悪いでしょ。"); }
changed(integer change) { if (change & CHANGED_OWNER) llResetScript(); }}</lsl>
注意点
オーナー名を取得する場合、オーナーが同じリージョンに居る場合はllKey2Nameを、リージョンに居ない場合はllRequestAgentDataを使います。
多くのプログラマが直面する問題の一つは、オーナーを参照する駆動済みのイベントが、オーナーの変更に自動的に対応しない点です。典型的なのは、オーナーを Listen していると現在のオーナーでなく前のオーナーを Listen し続けるというケースです。これは llGetOwner 関数や llListen 関数の不具合と誤解される事がありますが、そうでなく仕様の一部です。この問題を回避するいくつかの方法があります。簡単なのはオーナーが変わったり rez された時にスクリプトをリセットする事です。尤も、簡単な解決法が常に正しい解決法とは限りません。
オーナーの変更を検知するには2つの方法があり、より信頼できるのは changed イベントを利用することです。 <lsl>changed(integer change) {
if (change & CHANGED_OWNER)//オーナが変わったら、スクリプトをリセットする。 llResetScript();
}</lsl>
オブジェクトが rez される時にスクリプトをリセットするというのは、多くのアプリケーションで妥当かつ簡単な解決方法です。 <lsl>on_rez(integer start_param) { //オブジェクトが rez されたら、スクリプトをリセットする。
llResetScript();
}</lsl>
オーナーが変更される時にも変数の値を保持する必要があったり、スクリプトの起動に時間がかかるという場合、スクリプトをリセットする手法は適切でありません。そうした場合は、例えば誰にアニメーションを適用するかといったオーナー依存のコードと同様、新しいオーナーの key を listen 関数に入れ直す必要があるでしょう。
オブジェクトが rez されたりオーナーが変更される都度、オーナー依存のコードを強制的に初期化するために、on_rez イベントと changed イベントを利用できます。
<lsl>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"); } }
}</lsl>
関連項目
関数
• | llGetCreator | |||
• | llGetOwnerKey | |||
• | llDetectedOwner |