LlGetOwner/ja

From Second Life Wiki
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.

要約

関数: key llGetOwner( );

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

警告

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

サンプル

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

特記事項

Search JIRA for related Issues

Signature

function key llGetOwner();
この翻訳は 原文 と比べて古いですか?間違いがありますか?読みにくいですか?みんなで 修正 していきましょう! (手順はこちら)
この項目はあなたにとって参考にならない項目ですか?もしかしたらLSL Wikiの関連した項目が参考になるかもしれません。