“LlRemoteLoadScriptPin”的版本间的差异

来自人工智能助力教育知识百科
跳转至: 导航搜索
(创建页面,内容为“{{LSL Header|ml=*}}{{LSLC|Keywords}}{{LSLC|Flow Control}}{{LSLC|}} {{函数详情 |函数名 = Function: llRemoteLoadScriptPin( key target, string name, integer pi…”)
 
Mkx讨论 | 贡献
 
第73行: 第73行:
 
</pre>
 
</pre>
 
'''Rez and copy a file from a control object'''
 
'''Rez and copy a file from a control object'''
 +
 
注意:目前启动消息上没有签名,只检查了所有者。
 
注意:目前启动消息上没有签名,只检查了所有者。
 
这个示例从inventory中调用了一个prim,其中包含一个基本的控制文件,并执行了一个基本的握手操作来设置pin并传输脚本。
 
这个示例从inventory中调用了一个prim,其中包含一个基本的控制文件,并执行了一个基本的握手操作来设置pin并传输脚本。

2020年7月19日 (日) 01:42的最新版本

Template:Needs Translation/


函数名
Function: llRemoteLoadScriptPin( key target, string name, integer pin, integer running, integer start_param );
参数:• key target – 在同一区域的prim UUID

• string name – 脚本所在的prim目录中的脚本

• integer pin – 必须匹配pin设置llSetRemoteScriptAccessPin

• integer running – boolean,如果TRUE脚本设置为运行,如果FALSE脚本没有设置为运行

• integer start_param –在目标脚本中llGetStartParameter返回的值。

返回值:复制脚本名称到目标和设置为运行与start_param只有当目标的pin匹配pin

只有当脚本所有者可以修改目标时才有效。

注意事项
这个函数使脚本休眠3.0秒。

如果目标不属于同一个人,并且名称没有传输权限,则DEBUG_CHANNEL上将显示错误。

如果名称权限不允许复制,则传输失败,并在DEBUG_CHANNEL上显示错误。

如果目标不在同一区域,则在DEBUG_CHANNEL上显示错误。

当脚本在库存之间被复制或移动时,它们的状态将无法在转移中保存下来。内存、事件队列和执行位置都被丢弃。

如果名称没有出现在prim的目录中,或者它不是一个脚本,那么DEBUG_CHANNEL将显示错误。

如果名称出现在目标prim的目录中,那么它将被悄悄地替换。

start_param只持续到脚本被重置。

只有附件的拥有者才能在佩戴时修改它。

 如果目标是由不同用户拥有的附件,无论授予了什么对象修改权限,此函数都将以静默方式失败。

如果目标由不同的用户拥有,并且通过Edit, delete, or take my objects将修改权限授予脚本所有者,那么脚本所有者必须连接到sim,以便此函数成功执行。

如果pin不匹配,DEBUG_CHANNEL会显示错误“Task ~Prim~试图非法加载脚本到Task ~Other_Prim~!”“~Prim~”和“~Other_Prim~”用适用的Prim名称替换。 如果target是脚本的父(target == llGetKey()),那么在DEBUG_CHANNEL上会喊“无法添加项目!”。

如果包含此脚本的对象被转发到一个组,则脚本名需要传输权限;即使目标定约到同一组。

当脚本被设置为运行时(带有运行复选框或llSetScriptState), state_entry将被排队。

示例
Basic Example

Script copier

//将脚本复制到第二个基本物体
integer PIN=1341134;
 
default {
    state_entry() {
        llRemoteLoadScriptPin( llGetLinkKey(2), "some script", PIN, TRUE, 0xBEEEEEEF );
    }
}

Pin setter 用于为prim设置大头针的简单脚本,以便稍后可以使用llRemoteLoadScriptPin向它发送脚本。

//Child Prim PIN setter
integer PIN=1341134;
 
default {
    state_entry() {
        llOwnerSay(llGetObjectName()+" : "+(string)llGetKey()+" is ready to accept a describer script using the agreed upon PIN.");
        llSetRemoteScriptAccessPin(PIN);
    }
}

Rez and copy a file from a control object

注意:目前启动消息上没有签名,只检查了所有者。 这个示例从inventory中调用了一个prim,其中包含一个基本的控制文件,并执行了一个基本的握手操作来设置pin并传输脚本。 在转移之后,rezzed prim中的helper脚本将删除自己。 Control prim

integer controlchan = 0;
integer controlid = -1;
start()
{
    llSetTimerEvent(0);
    talkingto = NULL_KEY;
    integer a = (integer)llFrand(43);
    controlchan = a * a;
    controlchan -= controlchan * 3;
    controlid = llListen(controlchan,"","","set-connect");
    llRezObject("card",llGetPos()+<0,0,0.1>,<0,0,0>,ZERO_ROTATION,a);
    llSetTimerEvent(60);
}
key talkingto = NULL_KEY;
integer busy = FALSE;
integer accesspin = 0;
default
{
    timer()
    {
        llSetTimerEvent(0);
        llOwnerSay("Lost connection!");
        llListenRemove(controlid);
        busy = FALSE;
    }
    listen(integer chan,string name,key id,string message)
    {
        if(chan == controlchan)
        {
            if(llGetOwnerKey(id) == llGetOwner())
            {
                if(talkingto == NULL_KEY)
                {
                    if(message == "set-connect")
                    {
                        llSetTimerEvent(0);
                        talkingto = id;
                        llListenRemove(controlid);
                        controlid = llListen(controlchan,"",talkingto,"ready");
                        llRegionSayTo(id,controlchan,"auto-connect");
                        llSetTimerEvent(60);
                    }
                }   
                else if(id == talkingto)
                {
                    if(message == "ready")
                    {
                        llSetTimerEvent(0);
                        accesspin = (integer)llFrand(2345)+213;
                        llListenRemove(controlid);
                        controlid = llListen(controlchan,"",talkingto,"pinset");
                        llSleep(1);
                        llRegionSayTo(talkingto,controlchan,(string)accesspin);
                        llSetTimerEvent(60);
                    }
                    else if(message == "pinset")
                    {
                        llSetTimerEvent(0);
                        llListenRemove(controlid);
                        llRemoteLoadScriptPin(talkingto,"demo.lsl",accesspin,1,0);
                        llSleep(3);
                        llRegionSayTo(talkingto,controlchan,"finished");
                        llOwnerSay("Transfer of file finished - control file should have auto deleted itself!");
                        busy = FALSE;
                    }
                } 
            }   
        }
    }
    touch_end(integer a)
    {
        if(busy == FALSE)
        {
            busy = TRUE;
            if(llGetOwner() == llDetectedKey(0))
            {
                start();
            }
        }
    }
}

rezzed prim

integer listen_id = -1;
integer listen_chan = -1;
key details_from = NULL_KEY;
default
{
    on_rez(integer a)
    {
        if(a == 0)
        {
            llOwnerSay("- Direct rez -");
        }
        else
        {
            llOwnerSay("- Awaiting config connection -");
            listen_chan = a * a;
            listen_chan -= listen_chan * 3;
            listen_id = llListen(listen_chan,"","","auto-connect");
            llWhisper(listen_chan,"set-connect");
            llSetTimerEvent(30);
        }
    }
    timer()
    {
        llOwnerSay("Failed to connect to rezzer deleting myself!");
        llSetTimerEvent(0);
        llDie();
    }
    listen(integer chan,string name,key id,string message)
    {
        if(llGetOwnerKey(id) == llGetOwner())
        {
            if(message == "auto-connect")
            {
                llSetTimerEvent(0);
                llListenRemove(listen_id);
                listen_id = llListen(listen_chan,"",id,"");
                llRegionSayTo(id,listen_chan,"ready");
                details_from = id;
                llSetTimerEvent(30);                 
            }
            else if(details_from != NULL_KEY)
            {
                llSetTimerEvent(0);  
                if(message == "finished")
                {
                    llSetRemoteScriptAccessPin((integer)message);
                    llRemoveInventory(llGetScriptName());         
                }
                else
                {
                    llSetRemoteScriptAccessPin((integer)message);
                    llRegionSayTo(id,listen_chan,"pinset");
                } 
                llSetTimerEvent(30);  
            }
        }
    }
}
相关函数
llSetRemoteScriptAccessPin – 用于设置用于远程加载的prim

llSetScriptState – 设置脚本运行状态

llResetOtherScript – 在prim中重置另一个脚本

相关事件