LlRemoteLoadScriptPin
Looking for the current API? Open the llRemoteLoadScriptPin reference →
Wiki description
Function notes
Only works if the script owner can modify
target.Caveats
- If
nameis present in thetargetprim's inventory then it is silently replaced. start_paramonly lasts until the script is reset.- Only the owner of an attachment can modify it while it is being worn.
- If
targetis an attachment owned by a different user, regardless of object modify rights granted, this function will silently fail.
- If
- If
targetis owned by a different user and modify permission has been granted to the script owner via Edit, delete, or take my objects, the script owner must be connected to the sim for this function to succeed. - If
pinfails to match, the error "Task ~Prim~ trying to illegally load script onto task ~Other_Prim~!" is shouted on DEBUG_CHANNEL. "~Prim~" and "~Other_Prim~" are substituted with the applicable prim names. - If
targetis the script's parent () then "Unable to add item!" is shouted on DEBUG_CHANNEL.target== llGetKey() - If the object containing this script is deeded to a group, then script
nameneeds transfer permissions; even iftargetis deeded to the same group. - When the script is set to run (with
running, the running checkbox or llSetScriptState) state_entry will be queued.
Examples
Basic Example
Script copier
//Copy a script to the second prim
integer PIN=1341134;
default {
state_entry() {
llRemoteLoadScriptPin( llGetLinkKey(2), "some script", PIN, TRUE, 0xBEEEEEEF );
}
}Pin setter
Simple script used for setting the pin for a prim, so you can later send scripts to it with 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
Notes: There is currently no signing on the starting messages only the owner is checked.
this example rezs a prim from inventory that has a basic control file inside of it and does a basic handshake to setup the
pin and transfer the script.
after the transfert the helper script in the rezzed prim deletes itself.
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);
}
}
}
}See also: functions
History
- Added in 1.2.6
- In SL 1.25.4 this function will not copy/move any script into an attachment unless the script is full perm. (SVC-3725)
- SL 1.25.5 will allow this function to copy/move a script into an attachment so long as the target has matching (or more restrictive) copy and transfer permissions. (SVC-3738)
Shared wiki helpers
The original page also injects shared parameter notes, caveats or issue information through these helpers. Their conditional MediaWiki logic is not reproduced here; inspect the preserved helper source for additional material.
Original shared helper source (conditional wiki logic is not evaluated)
{{Issues|SVC-3321|stack trace error while running scripts after [[llRemoteLoadScriptPin]]|type=bug}}Original shared helper source (conditional wiki logic is not evaluated)
<includeonly>{{LSL Injection Test}}{{#if:
{{#vardefine:target-type|~{{#expr:{{#if:{{{avatar|}}}|1|0}}+{{#if:{{{prim|}}}{{{object|}}}|2|0}}+{{#if:{{{link|}}}|4|0}}}}}}
{{#vardefine:pcaveats|{{#var:caveats}}}}
{{#vardefine:caveats}}
{{LSL Function/{{#switch:{{#var:target-type}}|~1=avatar|~2=prim|~4=link|uuid}}|group=|object={{{object|}}}|sim={{{sim|}}}|{{{1|}}}|}}
{{LSL Function/inventory|{{{2|}}}|type={{{type|}}}|uuid={{{uuid|}}}|full={{{full|}}}|insert={{{insert|}}}|}}
{{#vardefine:caveats|{{#var:pcaveats}}{{#ifeq:{{#var:target-type}}|~4||
* If '''{{LSL Param|{{{1}}}}}''' is {{#switch:{{#var:target-type}}|~1=not the owner|~2=not owned by the same person|not the owner nor shares the same owner}}, {{#ifeq:{{{uuid|}}}|true|'''{{LSL Param|{{{2}}}}}''' is not a [[UUID]]}} and '''{{LSL Param|{{{2}}}}}''' does not have transfer permissions, an error is shouted on {{#var:DEBUG_CHANNEL}}.
{{#if:{{{copyok|}}}||
* If '''{{LSL Param|{{{2}}}}}''' {{#if:{{{full|}}}|is not {{HoverLink|:Category:LSL_Permissions/Asset|copy, mod and transfer|full permissions}}|permissions do not allow copy}}, the transfer fails and an error is shouted on {{#var:DEBUG_CHANNEL}}.{{#switch:{{#var:target-type}}
|~1=|* If '''{{LSL Param|{{{1}}}}}''' {{#ifeq:{{#var:target-type}}|~2||is a prim that}} is not in the same region an error is shouted on {{#var:DEBUG_CHANNEL}}.}}}}}}
{{#switch:{{{type|}}}|script|=* When scripts are copied or moved between inventories, their state does not survive the transfer. Memory, event queue and execution position are all discarded.|#default=}}
{{#var:caveats}}}}
{{#vardefine:pcaveats}}
}}</includeonly><noinclude>
{{Multi-lang}}
{{UpdateLink}}
{{#vardefine:caveats}}{{#vardefine:p_target_desc}}{{#vardefine:p_target_hover}}{{#vardefine:p_item_desc}}{{#vardefine:p_item_hover}}
{| {{Prettytable}} {{#vardefine:caveats}}
|+<code><nowiki>{{</nowiki>{{FULLPAGENAMEE}}<nowiki>|target|item|type=sound|uuid=true}}</nowiki></code>{{{{FULLPAGENAMEE}}|target|item|type=sound|uuid=true}}
|-{{Hl2}}
! #var
! value
|-
{{VarPair|caveats}}
|-
{{VarPair|p_target_desc}}
|-
{{VarPair|p_target_hover}}
|-
{{VarPair|p_item_desc}}
|-
{{VarPair|p_item_hover}}
|}
{{#vardefine:caveats}}{{#vardefine:p_target_desc}}{{#vardefine:p_target_hover}}{{#vardefine:p_item_desc}}{{#vardefine:p_item_hover}}
{| {{Prettytable}} {{#vardefine:caveats}}
|+<code><nowiki>{{</nowiki>{{FULLPAGENAMEE}}<nowiki>|target|item|type=sound|uuid=false}}</nowiki></code>{{{{FULLPAGENAMEE}}|target|item|type=sound|uuid=false}}
|-{{Hl2}}
! #var
! value
|-
{{VarPair|caveats}}
|-
{{VarPair|p_target_desc}}
|-
{{VarPair|p_target_hover}}
|-
{{VarPair|p_item_desc}}
|-
{{VarPair|p_item_hover}}
|}
{{#vardefine:caveats}}{{#vardefine:p_target_desc}}{{#vardefine:p_target_hover}}{{#vardefine:p_item_desc}}{{#vardefine:p_item_hover}}
{| {{Prettytable}} {{#vardefine:caveats}}
|+<code><nowiki>{{</nowiki>{{FULLPAGENAMEE}}<nowiki>|target|item|type=script|uuid=true|link=*}}</nowiki></code>{{{{FULLPAGENAMEE}}|target|item|type=script|uuid=true|link=*}}
|-{{Hl2}}
! #var
! value
|-
{{VarPair|caveats}}
|-
{{VarPair|p_target_desc}}
|-
{{VarPair|p_target_hover}}
|-
{{VarPair|p_item_desc}}
|-
{{VarPair|p_item_hover}}
|}
</noinclude>Original shared helper source (conditional wiki logic is not evaluated)
{{LSL Injection Test}}{{#if:
{{#vardefine:nbdv|{{#switch:{{uc:{{{default|}}}}}|T|TRUE=true|F|FALSE=false}}}}
{{#vardefine:p_{{{1|}}}_desc|{{#if:{{{bool|}}}|{{HoverLink|boolean{{#var:lang}}|A type that can only be true or false|boolean}},}} {{{pd|}}} {{#if:{{{bool|}}}{{{pd|}}}|{{#ifeq:{{{if|}}}|*|if|{{{if|}}}}}|{{ucfirst:{{#ifeq:{{{if|}}}|*|if|{{{if|}}}}}}}}} {{#vardefineecho:TRUE|{{LSL Const{{#var:lang}}|TRUE|integer|1}}}}{{#vardefine:FALSE|{{LSL Const{{#var:lang}}|FALSE|integer|0}}}}{{#if:{{{non-zero|}}}|{{Footnote|handle=non-zero|Any value that is not zero/{{#var:FALSE}} is treated the same as {{#var:TRUE}}. This behavior should not be depended upon.|Any value that is not zero/FALSE is treated the same as TRUE. This behavior should not be depended upon.}}}}{{#ifeq:{{#var:nbdv}}|true| ({{HoverText|default|default for new objects etc}})}} {{#if:{{{td|}}}|{{{td|}}}|enables}}, {{#ifeq:{{{if|}}}|*|if|{{{if|}}}}} {{#var:FALSE}}{{#ifeq:{{#var:nbdv}}|false| ({{HoverText|default|default for new objects etc}})}} {{#if:{{{fd|}}}|{{{fd|}}}|disables}}}}
{{#vardefine:p_{{{1|}}}_hover|{{#if:{{{bool|}}}|boolean,}} {{#if:{{{ph|}}}|{{{ph|}}}|{{{pd|}}}}} {{#if:{{{bool|}}}{{{pd|}}}{{{ph|}}}|{{#ifeq:{{{if|}}}|*|if|{{{if|}}}}}|{{ucfirst:{{#ifeq:{{{if|}}}|*|if|{{{if|}}}}}}}}} TRUE{{#ifeq:{{#var:nbdv}}|true| (default)}} {{#if:{{{th|}}}|{{{th|}}}|{{#if:{{{td|}}}|{{{td|}}}|enables}}}}, {{#ifeq:{{{if|}}}|*|if|{{{if|}}}}} FALSE{{#ifeq:{{#var:nbdv}}|false| (default)}} {{#if:{{{fh|}}}|{{{fh|}}}|{{#if:{{{fd|}}}|{{{fd|}}}|disables}}}}}}
}}<noinclude>
{| {{Prettytable}}
|+<code><nowiki>{{{{FULLPAGENAME}}|bool|bool=*|pd=1|ph=2|default=false}}</nowiki></code>{{{{FULLPAGENAME}}|bool|bool=*|pd=1|ph=2|default=false}}
|-{{Hl2}}
! #var
! value
|-
{{VarPair|p_bool_desc}}
|-
{{VarPair|p_bool_hover}}
|-
{{Footnotes}}
|}
{| {{Prettytable}}
|+<code><nowiki>{{{{FULLPAGENAME}}|bool|bool=*|pd=1|ph=2|td=3|th=4|fd=5|fh=6}}</nowiki></code>{{{{FULLPAGENAME}}|bool|bool=*|pd=1|ph=2|td=3|th=4|fd=5|fh=6}}
|-{{Hl2}}
! #var
! value
|-
{{VarPair|p_bool_desc}}
|-
{{VarPair|p_bool_hover}}
|-
{{Footnotes}}
|}
{| {{Prettytable}}
|+<code><nowiki>{{{{FULLPAGENAME}}|bool|bool=*|if=*|non-zero=*|pd=1|ph=2|td=3|th=4|fd=5|fh=6}}</nowiki></code>{{{{FULLPAGENAME}}|bool|bool=*|if=*|non-zero=*|pd=1|ph=2|td=3|th=4|fd=5|fh=6}}
|-{{Hl2}}
! #var
! value
|-
{{VarPair|p_bool_desc}}
|-
{{VarPair|p_bool_hover}}
|-
{{Footnotes}}
|}
{| {{Prettytable}}
|+<code><nowiki>{{{{FULLPAGENAME}}|bool|if=when|non-zero=*|td=3|th=4|fd=5|fh=6}}</nowiki></code>{{{{FULLPAGENAME}}|bool|if=when|non-zero=*|td=3|th=4|fd=5|fh=6}}
|-{{Hl2}}
! #var
! value
|-
{{VarPair|p_bool_desc}}
|-
{{VarPair|p_bool_hover}}
|-
{{Footnotes}}
|}
</noinclude>Original wiki source
Some wiki templates and tables need their original context. View this article on the Second Life Wiki. Technical wording and examples are retained from the source; historical guidance may differ from current behavior.