Difference between revisions of "Link message"

From Second Life Wiki
Jump to navigation Jump to search
m (The two code examples had conflicting styles. I adjusted the oddball to the style used on most of the other LSL pages.)
(Added description for 3rd parameter)
(6 intermediate revisions by 4 users not shown)
Line 1: Line 1:
{{LSL_Event|event_id=29|event_delay|event=link_message
{{LSL_Event|event_id=29|event_delay|event=link_message
|p1_type=integer|p1_name=sender_num|p1_desc=The link number of the prim that contained the script that called [[llMessageLinked]].
|p1_type=integer|p1_subtype=link|p1_name=sender_num|p1_desc=The link number of the prim that contained the script that called [[llMessageLinked]].
|p2_type=integer|p2_name=num|p2_desc=Second parameter of the llMessageLinked call.
|p2_type=integer|p2_name=num|p2_desc=Second parameter of the llMessageLinked call.
|p3_type=string|p3_name=str|p3_desc=Third parameter of the llMessageLinked call.
|p3_type=string|p3_name=str|p3_desc= The message that was sent from the script that called [[llMessageLinked]].
|p4_type=key|p4_name=id|p4_desc=Fourth parameter of the llMessageLinked call.
|p4_type=key|p4_name=id|p4_desc=Fourth parameter of the llMessageLinked call.
|event_desc=Triggered when the script receives a link message that was sent by a call to [[llMessageLinked]]. llMessageLinked is used to send messages from one script to another.
|event_desc=Triggered when the script receives a link message that was sent by a call to [[llMessageLinked]]. llMessageLinked is used to send messages from one script to another.
Line 12: Line 12:
*If '''str''' and '''id''' are bigger than available memory the script will crash with a Stack-Heap Collision.
*If '''str''' and '''id''' are bigger than available memory the script will crash with a Stack-Heap Collision.
|examples=
|examples=
<lsl>
<source lang="lsl2">
//This is just an example script, you shouldn't handle touches within single script this way.
//This is just an example script, you shouldn't handle touches within single script this way.


default
default
{
{
     touch_start(integer c)
     touch_start(integer num_detected)
     {
     {
         llMessageLinked(LINK_THIS, 0, llDetectedName(0), llDetectedKey(0));
         llMessageLinked(LINK_THIS, 0, llDetectedName(0), llDetectedKey(0));
     }
     }
     link_message(integer source, integer num, string str, key id)
     link_message(integer source, integer num, string str, key id)
     {
     {
Line 26: Line 27:
     }
     }
}
}
</lsl>
</source>
|helpers=
|helpers=
<lsl>
<source lang="lsl2">
// This is just an example script, you shouldn't handle link message within single script this way.
// This is just an example script, you shouldn't handle link message within single script this way.


default
default
{       // To propagate an unlimited number of arguments of any type.
{
// Presumed, the separator string isn't used in any source string!
    // To propagate an unlimited number of arguments of any type.
    // Presumed, the separator string isn't used in any source string!
 
     state_entry()  
     state_entry()  
     {     
     {     
         list my_list = [1, 2.0, "a string", <1, 2, 3>, <1, 2, 3, 4>, llGetOwner()];   
         list my_list = [1, 2.0, "a string", <1, 2, 3>, <1, 2, 3, 4>, llGetOwner()];   
         string list_parameter = llDumpList2String(my_list, "|"); // Typecast list to a string
         string list_parameter = llDumpList2String(my_list, "|"); // Produce a | delimited string from the list
         llMessageLinked(LINK_THIS, 0, list_parameter, NULL_KEY)
         llMessageLinked(LINK_THIS, 0, list_parameter, NULL_KEY);
     }
     }


     link_message(integer sender_num, integer num, string list_argument, key id)  
     link_message(integer sender_num, integer num, string list_argument, key id)  
     {
     {
         list re_list = llParseString2List(list_argument, ["|"], [""]); // Typecast string back to a list
         list re_list = llParseString2List(list_argument, ["|"], [""]); // Convert the string back to a list
     }     
     }     
}
}
</lsl>
</source>
|also_header
|also_header
|also_events
|also_events
Line 52: Line 55:
|also_articles
|also_articles
|also_footer
|also_footer
|notes=A script can hear its own link messages.
|notes={{LSL Tip|A script can hear its own link messages.}}
|mode
|mode
|cat1=Link
|cat1=Link

Revision as of 21:02, 19 January 2016

Description

Event: link_message( integer sender_num, integer num, string str, key id ){ ; }

Triggered when the script receives a link message that was sent by a call to llMessageLinked. llMessageLinked is used to send messages from one script to another.

• integer sender_num The link number of the prim that contained the script that called llMessageLinked.
• integer num Second parameter of the llMessageLinked call.
• string str The message that was sent from the script that called llMessageLinked.
• key id Fourth parameter of the llMessageLinked call.

id is often used as a second string field (in LSL the key type is implemented as a string with just custom operators). Typecasting between string and key types has no effect on the data contained. The sizes of str and id are only limited by available script memory.

Caveats

  • 64 link_message events can queue, past that, they are silently dropped! Don't do too much in the event if they might be coming in fast.
  • sender_num does not reflect how a message was sent, there is no way to know if it was sent with a LINK_* flag or the specific link number.
  • If str and id are bigger than available memory the script will crash with a Stack-Heap Collision.
All Issues ~ Search JIRA for related Bugs

Examples

//This is just an example script, you shouldn't handle touches within single script this way.

default
{
    touch_start(integer num_detected)
    {
        llMessageLinked(LINK_THIS, 0, llDetectedName(0), llDetectedKey(0));
    }

    link_message(integer source, integer num, string str, key id)
    {
        llWhisper(0, str + " (" + (string)id + ") touched me!");
    }
}

Useful Snippets

// This is just an example script, you shouldn't handle link message within single script this way.

default
{
     // To propagate an unlimited number of arguments of any type.
     // Presumed, the separator string isn't used in any source string!

    state_entry() 
    {    
        list my_list = [1, 2.0, "a string", <1, 2, 3>, <1, 2, 3, 4>, llGetOwner()];  
        string list_parameter = llDumpList2String(my_list, "|");	// Produce a | delimited string from the list
        llMessageLinked(LINK_THIS, 0, list_parameter, NULL_KEY);
    }

    link_message(integer sender_num, integer num, string list_argument, key id) 
    {
        list re_list = llParseString2List(list_argument, ["|"], [""]);	// Convert the string back to a list
    }    
}

Notes

KBcaution.png Important: A script can hear its own link messages.

See Also

Functions

•  llMessageLinked

Deep Notes

Signature

event void link_message( integer sender_num, integer num, string str, key id );