Skip to content
lsl.devlsl.devLSL Dev

LlSay

Looking for the current API? Open the llSay reference →

Wiki description

Says the text supplied in string msg on channel supplied in integer channel. The message can be heard 20m away, usually (see caveats)

Caveats

  • msg can only be heard within 20 meters of the speaking prim (rather than the root). This is contrary to how the event listen works, where a msg can only be heard by any prim in the object if and only if the root prim is capable of hearing it.
  • Some simulators (mostly event sims or linden-owned ones) have llGetEnv("chat_range") set to a value other than 20. On these sims:
    • llSay(0, msg) can be heard in a radius of llGetEnv("chat_range")
    • llSay(any_other_channel, msg) can be heard in a radius of 20m
    • as of 2023-03-26, Hippotropolis (a linden meeting sim) has a chat range of 40m
  • msg can be a maximum of 1024 bytes. This can convey 1024 ASCII characters, or 256-512 multibyte UTF-8 characters such as á (2 bytes), ℋ (3 bytes) or 🧡 (4 bytes).
    • If a multibyte character ends up on the 1024 byte boundary, it is discarded and not split into invalid bytes.
  • A prim can not hear itself, this to prevent problems with recursion. It can however hear other prims within the same object. Use llMessageLinked instead for intra-prim messaging.

Examples

default
{
    state_entry()
    {
        llSay(0, "Hello, Avatar!");
    }
}
To avoid making your object spam its neighborhood, use llInstantMessage, llOwnerSay or llRegionSayTo.

Notes

  • Channel 0 is the PUBLIC_CHANNEL. Everyone can hear chat transmitted on this channel. All other channels are private channels (not sent to users, with the exception of DEBUG_CHANNEL).
  • Consider using llInstantMessage, llOwnerSay, or the DEBUG_CHANNEL for debugging purposes. If DEBUG_CHANNEL is used as channel, the script will say msg to the Script Warning/Error window.
    • Note, however, that when using DEBUG_CHANNEL, what you consider to be 'debugging messages' will still be seen by others as scripting errors indicated by the floating 'script error' icon.
  • If one object 'says' something to another object (e.g., a button that, when touched, turns on a lamp), it is a good idea to use a very negative channel, e.g., -5243212 but don't just use any number take a look at the User-Defined Protocols & APIs and choose one that won't interfere with other protocols. If you are going to sell your script widely, please add it to the appropriate known chat channels list so others won't interfere with your product (do keep in mind you should build your product so that it handles interference appropriately).
    llSay(-5243212,"turn on");
:From at least September 2016 (see Release Notes/Second Life Release/4.0.9.320038), viewers have been able to chat on negative channels, although chat from viewers is limited to 254 characters. (Chat from objects caps at 1024 bytes, whether the channel is negative or not). Negative channels were popular for script communications because the standard SL client was unable to chat directly on those channels (/-xxxx message would not chat message on channel -xxxx). The only way for a viewer to generate chat on negative channels prior to llTextBox was to use llDialog which was limited to 24 bytes.
  • Be aware that if you mistakenly use an integer bigger than the maximum or smaller than the minimum, SL will treat the literal number as a float and convert it implicitly to an out-of-range integer, resulting in 1, without giving a script/syntax error (since this implicit conversion is legitimate). This means that all scripts listening to an out-of-range integer will be listening to channel 1 instead! (see also llListen).
  • Objects with all-whitespace names (e.g., a space or a series of spaces) will appear as "(Unnamed)" if they emit chat via llSay, although this behaviour may vary in third-party viewers.

See also: functions

See also: events

See also: articles

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.

Template:LSL Function/chat

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 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.

From the Second Life Wiki

Community documentation adapted from LlSay, by Linden Research, Inc. and contributing residents.View contributors and history.

Built from these wiki pages, as imported:

Licensed under CC BY-SA 3.0. Last wiki edit: .Formatting and links have been adapted for this site; API metadata follows the LSL definitions.