LlRequestExperiencePermissions

来自人工智能助力教育知识百科
Mkx讨论 | 贡献2020年8月3日 (一) 03:53的版本 (创建页面,内容为“{{LSL Header|ml=*}}{{LSLC|Keywords}}{{LSLC|Flow Control}}{{LSLC|}} {{函数详情 |函数名 = Function: llRequestExperiencePermissions( key agent, string name );…”)
(差异) ←上一版本 | 最后版本 (差异) | 下一版本→ (差异)
跳转至: 导航搜索

Template:Needs Translation/


函数名
Function: llRequestExperiencePermissions( key agent, string name );
参数:• key agent – 要向其请求权限的代理的密钥

• string name – 已废弃,不再使用

返回值:请求代理同意参与剧本的体验。

这个请求类似于具有以下所有权限的llRequestPermissions: PERMISSION_TAKE_CONTROLSPERMISSION_TRIGGER_ANIMATIONPERMISSION_ATTACHPERMISSION_TRACK_CAMERAPERMISSION_CONTROL_CAMERAPERMISSION_TELEPORT。然而,与llRequestPermissions不同的是,允许或阻止请求的决定是持久的,并且适用于使用经验网格范围的所有脚本。

经验中的脚本对llRequestExperiencePermissions的后续调用将自动收到相同的响应,而不需要用户交互。

为响应此调用,将生成experience_permissionsexperience_permissions_denied。如果代理没有给出响应,请求将在至少5分钟后超时。在此期间,同一脚本可以发出多个请求,但该脚本一次只能对一个代理拥有权限。

“上帝”模式下的代理总是会看到权限对话框,即使之前的经验已经被批准。

如果脚本被重新配置、移动到另一个区域或重新设置,未完成的权限请求将丢失。

要使此函数工作,必须将脚本编译成Experience

注意事项
如果您重新编译一个以前与经验相关联的脚本,但在这样做的客户端缺乏将脚本编译成经验的能力,那么脚本将丢失相关的经验。
示例
这是一个外壳的HUD分配器。它通过碰撞事件检测AV,然后重新启动一个对象,该对象将请求经验许可并附加到化身上
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);
        }
    }
}

这个脚本用于被rezzed的对象。它请求体验权限,然后将自己附加到化身上。它必须检查各种失败,如被拒绝的权限和未能附加,并在出现错误时删除自己。

// Example script for LSL Experience Tools attachment
 
// This script runs on an object that is rezzed in-world which gets
// an Experience permissions and then attaches to an AV.
 
integer listener;
integer msg_channel;
 
integer log_spam_channel = 0;       // Change this or remove llSay() commands
 
default
{
    on_rez(integer start_parameter)
    {   // Start listening for a message from 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)
    {   // Listen for the message from the rezzer with the target agent key
        if (channel == msg_channel)
        {   // Ask for the experience permission
            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)
    {   // Permissions granted, so attach to the AV
        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)
        {   // Attaching failed
            llDie();
        }
    }
 
    experience_permissions_denied( key agent_id, integer reason )
    {   // Permissions denied, so go away
        llSay(log_spam_channel, "Denied experience permissions for " + (string)agent_id + " due to reason #" + (string) reason);
        llDie();
    }
 
    attach( key id )
    {   // Attached or detached from the avatar
        if (id)
        {
            llSetTimerEvent(0.0);
            llSay(log_spam_channel, "Now attached with a key " + (string)id + " and llGetAttached() returning " + (string)llGetAttached());
            // From this point, the object can start doing whatever it needs to do.
            state running;
        }
        else
        {
            llSay(log_spam_channel, "No longer attached");
            llDie();
        }
    }
 
    timer()
    {   // Use a timer to catch no permissions response
        llSay(log_spam_channel, "Permissions timer expired");
        llDie();
    }
}
 
// This state starts when permissions are granted and the object is properly attached
state running
{
    state_entry()
    {
        llSay(log_spam_channel, "off and running!");
    }
 
    attach(key id)
    {
        if (id == NULL_KEY)
        {   // if the object ever un-attaches, make sure it deletes itself
            llSay(log_spam_channel, "No longer attached");
            llDie();
        }
    }
}
相关函数
相关事件
experience_permissions_denied

experience_permissions