LlGetOwner/ja

From Second Life Wiki

メインページ > LlGetOwner > LlGetOwner/ja
Jump to: navigation, search

関数: key llGetOwner( );

オブジェクトのオーナーのUUIDのkey値を返します。


警告

  • オブジェクトのオーナーが変わった場合、この関数の戻り値に依存したコードもそれに合わせて自動的にアップデートされたり再評価されるわけではありません。
    • すなわち新しいオーナーについて改めてlistenおよびパーミション要求を行なう必要があります。
      • これはlistenとパーミションに限った話でなく、戻り値を保持するあらゆる処理にあてはまります。この制約に関わる処理を書くプログラマ次第です。
    • オーナーの変更を検知するには、changedイベントでCHANGED_OWNERフラグを用いるか(2番目の例を参照)、以前の値を保存しておき、折に触れて(例えばon_rezイベント時)にそれが変更されたか調べます。どちらの手法も有効ですが、後者はオブジェクトが手渡しでなく "オリジナルとして販売" された場合に検知できません。

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の関連した項目が参考になるかもしれません。
Personal tools
In other languages