LlGetOwner/ja

From Second Life Wiki
Jump to navigation Jump to 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

特記事項

Search JIRA for related Issues

Signature

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