LlListen
Looking for the current API? Open the llListen reference →
Wiki description
Function notes
If
msg, name or id are blank (i.e. "") they are not used to filter incoming messages.Return value notes
Specification
For the listen event to be triggered it must first match the criteria set forth by the filters; only when all the criteria have been met is a listen event generated. First the message must have been transmitted on
channel. If id is both a valid key and not a null key, then the speaker's key must be equivalentIn general terms this means the matching for id is not case sensitive. See key for details on key equivalency. to id. If name is set, then the speaker's legacy name must match name exactly (case sensitive). If msg is set, then the spoken message must match msg exactly (case sensitive).Caveats
- On state change or script reset all listens are removed automatically.
- A state change can be used as a shortcut to releasing listens.
- Only 65 listens can simultaneously be open in any single script.
- If this number is exceeded Script run-time error and Too Many Listens errors occur.
- For some time, the official SL viewer and several third-party viewers can use negative channels from the chat bar directly just as any other non-zero channel. Formerly, the standard SL viewer could only send chat on negative channels through llDialog or llTextBox responses, meaning negative channels were best suited for applications that did not require direct avatar chat.
- Be aware that if you mistakenly use an integer literal bigger than the maximum or smaller than the minimum, LSL will treat it as -1, without giving any compilation error. This means that all scripts listening to an out-of-range integer will be listening to channel -1 instead, or if the number has a minus sign in front, to channel 1. A safe rule is to never use more than 9 digits. If the channel number comes from a conversion from float (for example from llFrand), if the float is out of range for an integer, it will be converted to the number -2147483648 regardless of its sign or value.
- Messages sent by script on positive and negative channels are truncated to 1024 bytes. Messages sent by chat on positive channels are truncated to 1023 bytes. Messages sent by chat from negative channels are truncated to 254 bytes.
- Once a listen is registered its filters cannot be updated, if the listen is registered to llGetOwner, the listen will remain registered to the previous owner upon owner change.
- Owner change can be detected with the changed event.
- To work around this the old listen will need to be closed and a new one opened for the new owner.
- A prim cannot hear/listen to chat it generates. It can, however, hear a linked prim.
- Chat indirectly generated (as a result of llDialog, llTextBox or from a linked prim) can be heard if in range.
Examples
Trivial example to listen to any chat from the object owner and respond once.
| Single listen handle |
|---|
|
| Two listen handles |
|---|
|
Notes
- Avoid channel zero (PUBLIC_CHANNEL) and set
nameoridwhere possible to avoid lag.llListen(0, "", NULL_KEY,"")can be laggy as it listens to all chat from everyone in chat range and so should be avoided.
- In November 2007, Kelly Linden offered this explanation to help scripters plan listeners more efficiently:
:#Chat that is said gets added to a history.
:#A script that is running and has a listen event will ask the history for a chat message during its slice of run time.
:# When the script asks the history for a chat message the checks are done in this order:
:#*
channel:#* self chat (prims can't hear themselves)
:#* distance/RegionSay
:#*
id:#*
name:#*
msg:
:The
id/name/msg checks only happen at all if those are specified of course.:
:So, the most efficient communication method is llRegionSay on a rarely used
channel.:Nowadays, llRegionSayTo is to be preferred, where appropriate.
- The integer returned can be assigned to a variable (then called a handle) and used to control the listen via llListenRemove or llListenControl. These handles are assigned sequentially starting at
+1through to+2,147,483,647, going beyond which, according to Simon Linden, will roll the returned integer over to−2,147,483,648, when positive incrementation resumes. If an llListen is repeated with the exact same filters as a currently active listener, then the same handle number is returned. If an llListen's filters do not match any currently active listener, then the next handle in sequence is allocated (it will not re-allocate a recently removed handle). - If you are using multiple listens in one script, each listen can be assigned its own handle with which to control it.
- Scripts can listen to and speak on DEBUG_CHANNEL. Script errors generated by the server are broadcast the same distance as llSay, but any chat command can be used to speak on DEBUG_CHANNEL.
- Messages received on DEBUG_CHANNEL in the viewer are hidden unless the message is sent by an object owned by the current user.
- Users may just see script errors as the hovering 'script error' icon depending on their viewer settings, and in any case will be able to read errors regardless of whether they are errors thrown by the scripting engine or your own debugging messages.
See also: functions
See also: events
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)
<noinclude>{{Multi-lang|category=LSL}}</noinclude>{{LSL Injection Test}}{{#if:
{{#vardefine:p_{{{1|none}}}_desc|{{#if:{{{pd|}}}|{{{pd|}}} }}{{#if:{{{group|1}}}|{{LSLGC|Group|group}}, }}{{LSLGC|Avatar|avatar}} or {{#if:{{{object|}}}|[[object]]|[[prim]]}} {{HoverLink|UUID|Universally Unique Identifier}} {{#if:{{{sim|}}}|that is in the same [[region]] {{#switch:{{{sim|}}}|*=|#default =  {{{sim|}}}}}
}}}}
{{#vardefine:p_{{{1|none}}}_hover|{{#if:{{{ph|}}}|{{{ph|}}} |{{#if:{{{pd|}}}|{{{pd|}}} }}}}{{#if:{{{group|1}}}|group, }}avatar or {{#if:{{{object|}}}|object|prim}} UUID {{#if:{{{sim|}}}|that is in the same region {{#switch:{{{sim|}}}|*=|#default =  {{{sim|}}}}}
}}}}
<includeonly>
{{#ifeq:{{#var:article-type}}|event||{{#if:{{#pos:{{#var:moded}}|r}}{{#pos:{{#var:moded}}|u}}||{{#vardefine:hidden-text|{{#var:hidden-text}}
{{LSLC|Avatar/As A Parameter}}
}}}}}}
</includeonly>
}}<noinclude>
{| {{Prettytable}}
|-{{Hl2}}
!var
!value
|-
|desc
|{{#var:p_{{{1|none}}}_desc}}
|-
|hover
|{{#var:p_{{{1|none}}}_hover}}
|}
</noinclude>Original shared helper source (conditional wiki logic is not evaluated)
{{LSL Injection Test}}{{#if:
<includeonly>{{#if:{{{nc|}}}||{{#vardefine:hidden-text|{{#var:hidden-text}}{{LSLC|Communications{{#var:lang}}}}}}}}</includeonly>
{{#if:{{{1|<noinclude>*</noinclude>}}}|
<includeonly>{{#if:{{{nc|}}}||{{#vardefine:hidden-text|{{#var:hidden-text}}{{LSLC|Chat{{#var:lang}}}}}}}}</includeonly>
{{#vardefine:fc-neither|{{#ifeq:{{#if:{{{np|}}}|*}}{{#if:{{{nd|}}}|*}}|**|*}}}}
{{#if:{{#var:fc-neither}}|{{LSL Constants/Chat}}|
{{#vardefine:constants_nb|{{LSL Constants/Chat|np={{{np|}}}|nd={{{nd|}}}|direct={{{direct|}}}}}
{{#var:constants_nb}}}}}}
{{#if:{{{np|}}}||{{Footnote|handle=channel_zero|Channel zero is also known as: {{#var:PUBLIC_CHANNEL}}, open chat, local chat and public chat|Channel zero is also known as: PUBLIC_CHANNEL, open chat, local chat and public chat}}}}
{{#vardefine:p_{{{1|none}}}_desc|{{#if:{{{input|}}}|input|output}} {{LSLGC|Chat|chat}} channel, any integer value {{#if:{{#var:fc-neither}}|except zero{{Footnote|handle=channel_zero}} and {{#var:DEBUG_CHANNEL}}|{{#if:{{{np|}}}|except zero{{Footnote|handle=channel_zero}}}}{{#if:{{{nd|}}}|except {{#var:DEBUG_CHANNEL}}}}}}}}
{{#vardefine:p_{{{1|none}}}_hover|{{#if:{{{input|}}}|input|output}} chat channel, any integer value {{#if:{{#var:fc-neither}}|except zero (PUBLIC_CHANNEL) and DEBUG_CHANNEL|{{#if:{{{np|}}}|except zero (PUBLIC_CHANNEL)}}{{#if:{{{nd|}}}|except DEBUG_CHANNEL}}}}}}
{{#ifeq:{{#var:fc-neither}}{{{1|<noinclude>{{{1}}}</noinclude>}}}{{{dialog|}}}|{{{1}}}|
{{#vardefine:caveats|{{#var:caveats}}
*Messages sent on {{#if:{{{np|}}}||channel zero{{Footnote|handle=channel_zero}} {{#if:{{{nd|}}}||and}}}} {{#if:{{{nd|}}}||{{#var:DEBUG_CHANNEL}}}} are throttled to a rate of <200/10sec, per region, per owner/user.
**Once the rate is exceeded, all following messages on {{#if:{{{np|}}}||channel zero {{#if:{{{nd|}}}||or}}}} {{#if:{{{nd|}}}||{{#var:DEBUG_CHANNEL}}}} will be dropped until the send rate is again below 200/10sec for the previous 10 sec. Dropped messages, despite being dropped still count against the limit.}}
}}
}}
{{#if:{{{2|<noinclude>*</noinclude>}}}|
{{#if:{{{input|}}}|
{{#vardefine:p_{{{2|none_}}}_desc|{{#if:{{{ph|}}}|{{{ph|}}}|{{{pd|}}}}} message}}
|
{{#if:{{{dialog|}}}|
{{#vardefine:p_{{{2|none_}}}_desc|message to be displayed in the {{{dialog|}}}}}
|
{{#vardefine:p_{{{2|none_}}}_desc|message to be transmitted}}
}}
}}
}}
}}<noinclude>
{| {{Prettytable}}
|-{{Hl2}}
! #var
! value
|-
{{VarPair|caveats}}
|-
{{VarPair|p_{{{1|none}}}_desc}}
|-
{{VarPair|p_{{{1|none}}}_hover}}
|-
{{VarPair|p_{{{2|none_}}}_desc}}
|-
{{VarPair|constants_nb}}
|-
{{VarPair|examples}}
|-
{{VarPairTable|footnotes}}
|}
</noinclude>Original shared helper source (conditional wiki logic is not evaluated)
{{Issues|SVC-3170|Listeners in child prims get positioned at root prim position first, then switch to child prim position after re-rez (resulting in wrong listener / whisper radius)|type=bug|resolution=fixed}}Original shared helper source (conditional wiki logic is not evaluated)
{{Issues|SVC-92|'''llTargetSay'''() - region-wide direct communication|type=nf|status=pub|resolution=fixed}}Original shared helper source (conditional wiki logic is not evaluated)
{{Issues|BUG-3291|[[llListen]] in linked objects is listening at root instead of linked object local position *after re-rezzing the linkset*|type=bug|resolution=fixed}}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.