LlRequestExperiencePermissions/ja

From Second Life Wiki
Jump to navigation Jump to search

要約

関数: llRequestExperiencePermissions( key agent, string name );

エージェントに、スクリプトの Experience に参加する権限を要求します。

• key agent 権限を要求するエージェントのキー
• string name 廃止されました。もう使用されません。

この要求は、PERMISSION_TAKE_CONTROLS, PERMISSION_TRIGGER_ANIMATION, PERMISSION_ATTACH, PERMISSION_TRACK_CAMERA, PERMISSION_CONTROL_CAMERA および PERMISSION_TELEPORT の全ての権限を持つ llRequestPermissions に似ています。ただし、llRequestPermissions とは異なり、リクエストを許可またはブロックするかどうかは永続的で、グリッド全体の体験を使用するすべてのスクリプトに適用されます。

体験内のスクリプトからの llRequestExperiencePermissions へのその後の呼び出しでは、ユーザーの操作無しで自動的に同じ応答を受け取ります。

この呼び出しに応じて、experience_permissions または experience_permissions_denied のいずれかが生成されます。エージェントから応答が無い場合、要求は少なくとも 5 分後にタイムアウトします。スクリプトは一度に一人のエージェントに対してのみ権限を持つことができますが、このタイムアウト中に同じスクリプトによって複数の要求を行なうことが出来ます。

エージェントがゴッドモードの場合は、体験が以前に承認されていた場合も、常に権限のダイアログを表示します。

スクリプトがインワールドから消去されたり、別の地域に移動したり、リセットされたりすると、未解決の許可要求は失われます。

警告

  • 以前に体験に関連付けられていたスクリプトを体験のコンパイル機能を持たないクライアントで再コンパイルすると、スクリプトは関連する体験を失います。

サンプル

これは、HUD 配布機の骨組みです。アバターがコリジョンイベントで検出されると、体験のアクセス許可を要求しアバターにアタッチするオブジェクトを Rez します。

default
{
    state_entry()
    {
        llVolumeDetect(TRUE);
    }
    
    collision_start(integer NumberOfCollisions)
    {
        integer i = 0;
        for(; i < NumberOfCollisions; i++)
        {
            integer channel = llRound(llFrand(-1000));
            key give_to = llDetectedKey(i);
            llSay(0, "Rezzing HUD for " + (string)give_to + " using channel " + (string)channel);
            llRezObject(llGetInventoryName(INVENTORY_OBJECT, 0), llGetPos(), ZERO_VECTOR, ZERO_ROTATION, channel);
            llRegionSay(channel, "ATTACH|" + (string)give_to);
        }
    }
}


このスクリプトは、Rez されるオブジェクト用です。体験のアクセス許可を要求し、自身をアバターに装着します。その際、アクセス許可が拒否されたり、装着に失敗した場合などの様々な失敗をチェックする必要があります。エラーが発生した場合は、自身を削除します。

// LSL Experience Tools での装着物のサンプルスクリプト

// このスクリプトは、インワールドで Rez されたオブジェクトで動作し、
// 体験の権限を取得してアバターに装着されます。

integer listener;
integer msg_channel;

integer log_spam_channel = 0;       // ここを変更するか、llSay() コマンドを削除してください

default
{
    on_rez(integer start_parameter)
    {   // Rezzer からのメッセージを受信開始します
        msg_channel = start_parameter;
        llSay(log_spam_channel, "Test HUD has been rezzed");
        listener = llListen(start_parameter, "", NULL_KEY, "");
    }
    
    listen(integer channel, string name, key id, string text)
    {   // Rezzer からのメッセージを、対象となるエージェントのキーを使用して受信します
        if (channel == msg_channel)
        {   // 体験の権限を要求
            list msg = llParseString2List(text, ["|"], []);
            llSay(log_spam_channel, "Trying experience permissions request to " + llList2String(msg, 1));
            llRequestExperiencePermissions((key)llList2String(msg, 1), "");
            llListenRemove(listener);
            llSetTimerEvent(60.0);
        }
    }

    experience_permissions(key target_id)
    {   // 権限が許可された場合、アバターへ装着します
        llSay(log_spam_channel, "Trying llAttachToAvatarTemp()");
        llAttachToAvatarTemp(ATTACH_HUD_CENTER_1);
        llSay(log_spam_channel, "After llAttachToAvatarTemp() with llGetAttached() returning " + (string)llGetAttached());
        llSetTimerEvent(0.0);
        if (llGetAttached() == 0)
        {   // 装着に失敗した場合
            llDie();
        }
    }
    
    experience_permissions_denied( key agent_id, integer reason )
    {   // 権限が拒否された場合、消えます
        llSay(log_spam_channel, "Denied experience permissions for " + (string)agent_id + " due to reason #" + (string) reason);
        llDie();
    }
    
    attach( key id )
    {   // アバターに装着された、または装着解除された場合
        if (id)
        {
            llSetTimerEvent(0.0);
            llSay(log_spam_channel, "Now attached with a key " + (string)id + " and llGetAttached() returning " + (string)llGetAttached());
            // この時点から、オブジェクトは必要な処理を開始出来ます
            state running;
        }
        else
        {
            llSay(log_spam_channel, "No longer attached");
            llDie();
        }
    }
    
    timer()
    {   // タイマーを使用して、タイムアウトを検出します
        llSay(log_spam_channel, "Permissions timer expired");
        llDie();
    }
}

// この状態は、アクセス許可が与えられ、オブジェクトが正しく装着された場合に開始されます
state running
{
    state_entry()
    {
        llSay(log_spam_channel, "off and running!");
    }
    
    attach(key id)
    {
        if (id == NULL_KEY)
        {   // もしオブジェクトが装着されていない場合は、自身を削除します
            llSay(log_spam_channel, "No longer attached");
            llDie();
        }
    }
}

注意点

コンパイル

スクリプトが Experience に関連するようにするには...

  • 体験をサポートしたクライアントでコンパイルされている必要があります
  • "体験を使用" チェックボックスをチェックする
  • 体験キーの一つを選択する
KBcaution.png 重要 すべての TPV にこの機能があるわけではありません。

特記事項

Search JIRA for related Issues

Signature

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