LlRemoteLoadScriptPin
首页 | 函数 | 事件 | 类型 | 操作符 | 常数 | Flow Control | Script Library | Categorized Library | Tutorials |
函数名 |
---|
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中重置另一个脚本 |
相关事件 |
---|
无 |