|
|
(18 intermediate revisions by the same user not shown) |
Line 1: |
Line 1: |
− | Minecraft supports two-way '''chat''' communication via the [[Protocol#Player Chat Message|Player Chat Message]] packet, which support a variety of formatting options. Note that this system isn't exclusive to the Chat Message packet - it's used in several other places (including written books, death messages, window titles, and the like).
| + | {{Hatnote|This page previously contained documentation on text formatting features, which can now be found at [[Text formatting]].}} |
| | | |
− | {{Box
| + | This article details various aspects of Minecraft's chat system. The packets themselves are documented in [[Protocol]]. |
− | |BORDER = #BF880D
| |
− | |BACKGROUND = #F7B217
| |
− | |WIDTH = 100%
| |
− | |ICON =
| |
− | |HEADING = Heads up!
| |
− | |CONTENT = Currently out of date. 1.20.3+ encodes the JSON Chat into NBT in most cases when sent over the network (indicated via the [[Data types#Definitions:chat|Chat]] and [[Data types#Definitions:json_chat|Json Chat]] data types). How its converted in both directions needs to be documented.
| |
− | }}
| |
| | | |
− | == Current system (JSON Chat) ==
| + | == Client chat mode == |
− | | |
− | Chat data is sent in JSON. For most situations, the JSON is strictly parsed, but [https://www.javadoc.io/doc/com.google.code.gson/gson/latest/com.google.gson/com/google/gson/stream/JsonReader.html#setLenient(boolean) lenient JSON parsing] is used for the Disconnect packet and for written book text.
| |
− | | |
− | === Inheritance ===
| |
− | | |
− | Each component can have multiple child components, specified in the <code>extra</code> field. Somewhat confusingly, they may also be thought of as siblings to the ''direct content'' of their parent component, which is ordered before the children in the output. Each child component inherits properties from the style of its parent, using those styles if they are not defined in the child's own style.
| |
− | | |
− | For example, in this component:
| |
− | | |
− | <syntaxhighlight lang="javascript">
| |
− | {
| |
− | "text": "foo",
| |
− | "bold": true,
| |
− | "extra": [
| |
− | {
| |
− | "text": "bar"
| |
− | },
| |
− | {
| |
− | "text": "baz",
| |
− | "bold": false
| |
− | },
| |
− | {
| |
− | "text": "qux",
| |
− | "bold": true
| |
− | }
| |
− | ]
| |
− | }
| |
− | </syntaxhighlight>
| |
− | | |
− | The text "foo", "bar", and "qux" are all rendered as bold while "baz" is not.
| |
− | | |
− | === Schema ===
| |
− | | |
− | Each situation where a component can appear may be either a JSON object (the most common choice), an array, or a JSON primitive (which is converted to a String).
| |
− | | |
− | JSON primitives can be used for components, in which case they are implicitly converted into a String component. Note that it is invalid to have a JSON primitive as the root object, so it is '''not''' valid to merely send the text in quotes. This shorthand is useful for child lists, though.
| |
− | | |
− | It is also legal to put a JSON array where a component would go, so long as the array is not empty. The first component in the array is the parent of all of the following components. This can produce unusual behavior with style inheritance, but it is still useful shorthand.
| |
− | | |
− | The most common type of component is a JSON object; the format is as follows:
| |
− | | |
− | ==== Shared between all components ====
| |
− | | |
− | All component types have certain fields that represent the style. All of these fields may be skipped, in which case the parent's style will be inherited.
| |
− | | |
− | ;<code>color</code>
| |
− | :String - Specifies the text color, which may be a color name or a #-prefixed hexadecimal RGB specification. See [[#Colors]] below.
| |
− | ;<code>bold</code>, <code>italic</code>, <code>underlined</code>, <code>strikethrough</code>, <code>obfuscated</code>
| |
− | :Boolean - Enables or disables the given style. See [[#Styles]] below.
| |
− | ;<code>font</code>
| |
− | :String - Specifies the font. See [[#Fonts]] below. This option is only valid on 1.16+; otherwise the property is ignored.
| |
− | ;<code>insertion</code>
| |
− | :String - Specifies text to be inserted into chat at the cursor when shift-clicked. Only used for messages in chat; has no effect in other locations at this time.
| |
− | ;<code>clickEvent</code>
| |
− | :JSON object - Defines an event that occurs when this component is clicked. Contains the fields <code>action</code> and <code>value</code>, both strings.
| |
− | :<code>action</code> may be one of the following:
| |
− | :;<code>open_url</code>
| |
− | ::Opens the given URL in the default web browser. Ignored if the player has opted to disable links in chat; may open a GUI prompting the user if the setting for that is enabled. The link's protocol must be set and must be <code>http</code> or <code>https</code>, for security reasons.
| |
− | :;<s><code>open_file</code></s>
| |
− | ::<strong>Cannot be used within JSON chat</strong>. Opens a link to any protocol, but cannot be used in JSON chat for security reasons. Only exists to internally implement links for screenshots.
| |
− | :;<code>run_command</code>
| |
− | ::Runs the given command. Not required to be a command - clicking this only causes the client to send the given content as a chat message, so if not prefixed with <code>/</code>, they will say the given text instead. If used in a book GUI, the GUI is closed after clicking.
| |
− | :;<s><code>twitch_user_info</code></s>
| |
− | ::<strong>No longer supported; cannot be used within JSON chat</strong>. Only usable in 1.8 and below; twitch support was removed in 1.9. Additionally, this is only used internally by the client. On click, opens a twitch user info GUI screen. Value should be the twitch user name.
| |
− | :;<code>suggest_command</code>
| |
− | ::Only usable for messages in chat. Replaces the content of the chat box with the given text - usually a command, but it is not required to be a command (commands should be prefixed with <code>/</code>).
| |
− | :;<code>change_page</code>
| |
− | ::Only usable within written books. Changes the page of the book to the given page, starting at 1. For instance, <code>"value":"1"</code> switches the book to the first page. If the page is less than one or beyond the number of pages in the book, the event is ignored.
| |
− | :;<code>copy_to_clipboard</code>
| |
− | ::Copies the given text to the client's clipboard when clicked.
| |
− | ;<code>hoverEvent</code>
| |
− | :JSON object - Defines an event that occurs when this component hovered over. Contains the fields <code>action</code> (a string) and <code>contents</code> (dependent on <code>action</code>).
| |
− | <dd>{{Warning2|The <code>content</code> field was introduced in Minecraft 1.16, replacing the old <code>value</code> field, which is still supported by new versions for compatibility. <code>value</code> functioned similarly to <code>content</code>, but was always interpreted as a chat component, with <code>show_item</code> and <code>show_entity</code> data represented as sNBT (e.g. <code><nowiki>"value":"{id:35,Damage:5,Count:2,tag:{display:{Name:Testing}}}"</nowiki></code>).}}</dd>
| |
− | :<code>action</code> may be one of the following:
| |
− | :;<code>show_text</code>
| |
− | ::Displays a tooltip with arbitrary text. <code>contents</code> can either be a string directly (<code>"contents":"la"</code>) or a full component (<code>"contents":{"text":"la","color":"red"}</code>).
| |
− | :;<code>show_item</code>
| |
− | ::Displays a tooltip describing an item. <code>contents</code> contains the following fields:
| |
− | ::;<code>id</code>
| |
− | :::The textual identifier of the item's type. If unrecognized, defaults to <code>minecraft:air</code>.
| |
− | ::;<code>count</code>
| |
− | :::The number of items in the item stack. If omitted, defaults to 1.
| |
− | ::;<code>tag</code>
| |
− | :::The item's NBT information as an sNBT string (as would be used in <code>/give</code>) (if present).
| |
− | :;<code>show_entity</code>
| |
− | ::Displays a tooltip describing an entity. Shown only if Advanced tooltips (F3+H) is enabled. <code>contents</code> contains the following fields:
| |
− | ::;<code>type</code>
| |
− | :::The textual identifier of the entity's type. If unrecognized, defaults to <code>minecraft:pig</code>.
| |
− | ::;<code>id</code>
| |
− | :::The entity's UUID (with dashes). Does not need to correspond to an existing entity; only for display.
| |
− | ::;<code>name</code>
| |
− | :::The entity's custom name (if present).
| |
− | :;<s><code>show_achievement</code></s>
| |
− | ::<strong>No longer supported</strong>. Since 1.12, this no longer exists; advancements instead simply use <code>show_text</code>. The ID of an achievement or statistic to display. Example: <code>"value":"achievement.openInventory"</code>.
| |
− | ;<code>extra</code>
| |
− | :An array of parent components. If present, cannot be empty.
| |
− | | |
− | Beyond that, there are additional properties. Attempt to parse as each of the following in the order they are described:
| |
− | | |
− | ==== String component ====
| |
− | | |
− | A String component contains only text. If the JSON contains a <code>text</code> key, then the component is a String component. The only content of this component is its text, with no additional processing.
| |
− | | |
− | ==== Translation component ====
| |
− | | |
− | {{Need Info|Is using this with an invalid key intended or deprecated? Also, what exactly happens on invalid formats?}}
| |
− | | |
− | Translates text into the current language. If the JSON contains a <code>translate</code> key, then the component is a translation component.
| |
− | | |
− | Translation supports <code>%s</code>, <code>%n$s</code> (where <code>n</code> is an index) and <code>%%</code> format tokens. <code>%%</code> is just an escaped percent symbol. <code>%s</code> marks text to replace using content from the optional <code>with</code> tag. <code>with</code> is an array of components. <code>%n$s</code> acts like <code>%s</code> but instead will use the text component in <code>with</code> that is at the index of <code>n</code>.
| |
− | | |
− | It should be noted that when the key is not known by a language file, it will result in the translation key being the value of the text. For Example, <code>soundCategory.hostile</code> exists and will result in <code>"Hostile Creatures"</code> whereas <code>soundCategory.angry</code> (Which does not exist) will result in <code>"soundCategory.angry"</code>.
| |
− | | |
− | {{Warning2|Prior to 1.19.1 the narrator was hardcoded to replace the translation key <code>chat.type.text</code> with <code>chat.type.text.narrate</code>. This mechanism has been superseded by [[Registry Data#Chat Type|chat types]], and is no longer present in new versions.}}
| |
− | | |
− | ==== Keybind component ====
| |
− | | |
− | Displays the client's current keybind for the specified key. If the component contains a <code>keybind</code> key, then it is a keybind component. The value is named after the keys in {{Minecraft Wiki|options.txt}} (for instance, for <code>key_key.forward</code> in options.txt, <code>key.forward</code> would be used in the component and <kbd>W</kbd> would be displayed). For keys that are not known, the value provided should be displayed instead (for instance <code>key.invalid</code> would remain as <code>key.invalid</code>).
| |
− | | |
− | ==== Score component ====
| |
− | | |
− | Displays a score. If the JSON contains a <code>score</code> key, then the component is a score component.
| |
− | | |
− | The <code>score</code> JSON object contains data about the objective.
| |
− | | |
− | When being sent to the client, it must contain <code>name</code>, <code>objective</code>, and <code>value</code> keys. <code>name</code> is a player username or entity UUID (if it is a player, it is a username); <code>objective</code> is the name of the objective; <code>value</code> is the resolved value of that objective.
| |
− | | |
− | When being sent to the server, <code>value</code> is not used. <code>name</code> can be an entity selector (that selects one entity), or alternatively <code>*</code> which matches the sending player.
| |
− | | |
− | ==== Selector component ====
| |
− | | |
− | Displays the results of an entity selector. If the component contains a <code>selector</code> key, then it is a selector component.
| |
− | | |
− | {{Warning2|This component is meant for client-to-server interactions (such as commands), and '''should not''' be sent directly to the client.
| |
− | | |
− | If received by the client, it won't be resolved, and will always be displayed as the selection pattern.
| |
− | }}
| |
− | | |
− | The server resolves the list selector into a list of entities, each with an appropriate hover event (and click event if it happens to be a player).
| |
− | | |
− | Entries in the list are separated by a comma by default, but can be overriden with any component if a <code>separator</code> is specified.
| |
− | | |
− | ==== NBT component ====
| |
− | | |
− | Displays the results of a NBT query. If the component contains a <code>nbt</code> key, then it is a NBT component.
| |
− | | |
− | {{Warning2|This component is meant for client-to-server interactions (such as commands), and '''should not''' be sent directly to the client.
| |
− | | |
− | If received by the client, it won't be resolved, and will always be displayed as empty text.
| |
− | }}
| |
− | | |
− | The server constructs a list using the data found at the <code>nbt</code> path, for each entry of a given source. This source varies, and is defined by the presence of one of the three following fields:
| |
− | | |
− | * <code>block</code>, where the data comes from the block entity at the given position;
| |
− | * <code>entity</code>, where the data comes from the entities resulted from the given entity selector;
| |
− | * <code>storage</code>, where the data comes from the internal storage defined by the given Identifier.
| |
− | | |
− | Entries in the list are separated by a comma by default, but can be overriden with any component if a <code>separator</code> is specified.
| |
− | | |
− | Furthermore, if the boolean <code>interpret</code> is set to true, the server will attempt to resolve each of the data as its own component, before appending them with the separator.
| |
− | | |
− | === Examples ===
| |
− | | |
− | Here are some examples from the Notchian server for how chat formatting can be used.
| |
− | | |
− | TODO - additional examples
| |
− | | |
− | ==== Standard chat message ====
| |
− | | |
− | The normal chat message uses a translation component along with some styling.
| |
− | | |
− | {{Warning2|Since 1.19.1 the Notchian client uses the [[Registry Data#Chat Type|chat type]] mechanism, meaning chat messages are no longer sent directly like shown in this example.}}
| |
− | | |
− | <syntaxhighlight lang="javascript">
| |
− | {"translate":"chat.type.text","with":[{"text":"Herobrine","clickEvent":{"action":"suggest_command","value":"/msg Herobrine "},"hoverEvent":{"action":"show_entity","value":"{id:f84c6a79-0a4e-45e0-879b-cd49ebd4c4e2,name:Herobrine}"},"insertion":"Herobrine"},{"text":"I don't exist"}]}
| |
− | </syntaxhighlight>
| |
− | | |
− | The <code>chat.type.text</code> translation key becomes <code><nowiki><%s> %s</nowiki></code>, which is then filled in with the player's name and the actual message. Note that the player's name has a click event (which inserts text to message the player), a hover event (which shows the entity ID; also note that <code>type</code> is missing), and an insertion (for the player's name).
| |
− | | |
− | == Old system ==
| |
− | | |
− | === Control Sequences ===
| |
− | | |
− | The client treats certain two-character sequences specially. The first character must be:
| |
− | | |
− | *§ (U+00A7) for Minecraft
| |
− | *& for Minecraft Classic
| |
− | | |
− | The following character indicates a certain [[#Colors|color]] or [[#Styles|formatting]] to apply to the proceeding text.
| |
− | | |
− | e.g.: <code>This is white, but §4this is dark red. §lThis is still red, but also bold, while §rthis is neither.</code>
| |
− | | |
− | In '''Minecraft Classic''', the Notchian client expects that an escape code in a chat message will be followed by at least one character, and will otherwise crash with a StringIndexOutOfBoundsException. The server must sanitize outbound messages by removing any control characters at the end.
| |
− | | |
− | == Styling ==
| |
− | | |
− | === Colors ===
| |
− | | |
− | These correspond very roughly to the colors available in ANSI terminals.
| |
− | | |
− | [[File:Colors.png|thumb|Hex digit to color mapping]]
| |
− | | |
− | {| class="wikitable" style="text-align:center;" border="1" cellpadding="5"
| |
− | |-
| |
− | ! colspan="1" rowspan="2" width="8px"| Sample
| |
− | ! colspan="1" rowspan="2" | Common Name
| |
− | ! colspan="1" rowspan="2" | Legacy Code
| |
− | ! colspan="1" rowspan="2" | JSON Name
| |
− | ! colspan="4" | Foreground Color
| |
− | ! colspan="4" | Background Color
| |
− | |-
| |
− | ! width="30px"|R
| |
− | ! width="30px"|G
| |
− | ! width="30px"|B
| |
− | ! Hex
| |
− | ! width="30px"|R
| |
− | ! width="30px"|G
| |
− | ! width="30px"|B
| |
− | ! Hex
| |
− | |-
| |
− | {{/ColorSample|000000|000000}}
| |
− | | Black || 0 || <code>black</code> || 0 || 0 || 0 || #000000 || 0 || 0 || 0 || #000000
| |
− | |-
| |
− | {{/ColorSample|0000aa|00002a}}
| |
− | | Dark blue || 1 || <code>dark_blue</code> || 0 || 0 || 170 || #0000aa || 0 || 0 || 42 || #00002a
| |
− | |-
| |
− | {{/ColorSample|00aa00|002a00}}
| |
− | | Dark green || 2 || <code>dark_green</code> || 0 || 170 || 0 || #00aa00 || 0 || 42 || 0 || #002a00
| |
− | |-
| |
− | {{/ColorSample|00aaaa|002a2a}}
| |
− | | Dark cyan || 3 || <code>dark_aqua</code> || 0 || 170 || 170 || #00aaaa || 0 || 42 || 42 || #002a2a
| |
− | |-
| |
− | {{/ColorSample|aa0000|2a0000}}
| |
− | | Dark red || 4 || <code>dark_red</code> || 170 || 0 || 0 || #aa0000 || 42 || 0 || 0 || #2a0000
| |
− | |-
| |
− | {{/ColorSample|aa00aa|2a002a}}
| |
− | | Purple || 5 || <code>dark_purple</code> || 170 || 0 || 170 || #aa00aa || 42 || 0 || 42 || #2a002a
| |
− | |-
| |
− | {{/ColorSample|ffaa00|2a2a00}}
| |
− | | Gold || 6 || <code>gold</code> || 255 || 170 || 0 || #ffaa00 || 42 || 42 || 0 || #2a2a00
| |
− | |-
| |
− | {{/ColorSample|aaaaaa|2a2a2a}}
| |
− | | Gray || 7 || <code>gray</code> || 170 || 170 || 170 || #aaaaaa || 42 || 42 || 42 || #2a2a2a
| |
− | |-
| |
− | {{/ColorSample|555555|151515}}
| |
− | | Dark gray || 8 || <code>dark_gray</code> || 85 || 85 || 85 || #555555 || 21 || 21 || 21 || #151515
| |
− | |-
| |
− | {{/ColorSample|5555ff|15153f}}
| |
− | | Blue || 9 || <code>blue</code> || 85 || 85 || 255 || #5555ff || 21 || 21 || 63 || #15153f
| |
− | |-
| |
− | {{/ColorSample|55ff55|153f15}}
| |
− | | Bright green || a || <code>green</code> || 85 || 255 || 85 || #55ff55 || 21 || 63 || 21 || #153f15
| |
− | |-
| |
− | {{/ColorSample|55ffff|153f3f}}
| |
− | | Cyan || b || <code>aqua</code> || 85 || 255 || 255 || #55ffff || 21 || 63 || 63 || #153f3f
| |
− | |-
| |
− | {{/ColorSample|ff5555|3f1515}}
| |
− | | Red || c || <code>red</code> || 255 || 85 || 85 || #ff5555 || 63 || 21 || 21 || #3f1515
| |
− | |-
| |
− | {{/ColorSample|ff55ff|3f153f}}
| |
− | | Pink || d || <code>light_purple</code> || 255 || 85 || 255 || #ff55ff || 63 || 21 || 63 || #3f153f
| |
− | |-
| |
− | {{/ColorSample|ffff55|3f3f15}}
| |
− | | Yellow || e || <code>yellow</code> || 255 || 255 || 85 || #ffff55 || 63 || 63 || 21 || #3f3f15
| |
− | |-
| |
− | {{/ColorSample|ffffff|3f3f3f}}
| |
− | | White || f || <code>white</code> || 255 || 255 || 255 || #ffffff || 63 || 63 || 63 || #3f3f3f
| |
− | |}
| |
− | | |
− | Starting with Minecraft 1.16 the JSON <code>color</code> field may also be specified as an arbitrary RGB color in the usual hexadecimal format <code>#RRGGBB</code>. The part after # may also be shorter than 6 digits, but is then interpreted simply as the rightmost digits of the full 6-digit value, with the rest taken to be zero—there is no compacted 3-digit variant or support for transparency.
| |
− | | |
− | === Styles ===
| |
− | | |
− | The "Random" style is used for the "§kFUNKY LOL" message in /title/splashes.txt inside minecraft.jar.
| |
− | | |
− | {| class="wikitable" style="text-align:center;" border="1" cellpadding="5"
| |
− | |-
| |
− | ! colspan="1" | Sample
| |
− | ! colspan="1" | Style
| |
− | ! colspan="1" | Legacy Code
| |
− | ! colspan="1" | JSON Name
| |
− | |-
| |
− | | [[File:random_chat.gif]] || Random || k || <code>obfuscated</code>
| |
− | |-
| |
− | | [[File:bold_chat.png]] || Bold || l || <code>bold</code>
| |
− | |-
| |
− | | [[File:strikethrough_chat.png]] || Strikethrough || m || <code>strikethrough</code>
| |
− | |-
| |
− | | [[File:underlined_chat.png]] || Underlined || n || <code>underline</code>
| |
− | |-
| |
− | | [[File:italic_chat.png]] || Italic || o || <code>italic</code>
| |
− | |-
| |
− | | [[File:plain_chat.png]] || Plain White || r || <code>reset</code>
| |
− | |}
| |
− | | |
− | === Fonts ===
| |
− | | |
− | Since Minecraft 1.16 it has been possible to {{Minecraft Wiki|Resource_pack#Fonts|add custom fonts via resource packs}}, and use them in text components through the <code>font</code> field.
| |
− | | |
− | By default, the following fonts are available:
| |
− | | |
− | {| class="wikitable"
| |
− | |-
| |
− | ! Identifier
| |
− | ! Default Look
| |
− | ! Notes
| |
− | |-
| |
− | | <code>minecraft:default</code>
| |
− | | Standard Minecraft font (with Unifont fallback)
| |
− | | Default font. Hardcoded to alias <code>minecraft:uniform</code> when Force Unicode Font is enabled.
| |
− | |-
| |
− | | <code>minecraft:uniform</code>
| |
− | | [[Wikipedia:GNU Unifont|GNU Unifont]]
| |
− | | Default font when Force Unicode Font is enabled.
| |
− | |-
| |
− | | <code>minecraft:alt</code>
| |
− | | [[Wikipedia:Standard Galactic Alphabet|Standard Galactic Alphabet]]
| |
− | | Enchanting table font.
| |
− | |-
| |
− | | <code>minecraft:illageralt</code>
| |
− | | {{Minecraft Wiki|Minecraft_Dungeons:Illageralt|Illageralt from Minecraft Dungeons}}
| |
− | | Unused.
| |
− | |}
| |
− | | |
− | == Processing chat ==
| |
− | | |
− | === Client chat mode ===
| |
| | | |
| The client may use the Chat Mode field of the [[Protocol#Client Information (configuration)|Client Information]] packet to indicate that it only wants to receive some types of chat messages. | | The client may use the Chat Mode field of the [[Protocol#Client Information (configuration)|Client Information]] packet to indicate that it only wants to receive some types of chat messages. |
Line 343: |
Line 9: |
| It is the server's responsibility to not send packets if the client has the given type disabled. However, it is the client's responsibility to not send incorrect chat packets. | | It is the server's responsibility to not send packets if the client has the given type disabled. However, it is the client's responsibility to not send incorrect chat packets. |
| | | |
− | Here's a matrix comparing what packets the server should send to a clients based on their chat settings: | + | Here's a matrix comparing what packets the server should send to clients based on their chat settings: |
| | | |
| {| class="wikitable" | | {| class="wikitable" |
Line 402: |
Line 68: |
| If the client attempts to send a chat message and the server rejects it, the Notchian server will send that client a [[Protocol#System Chat Message|System Chat Message]] (non-overlay) with a red <code>chat.disabled.options</code> translation component (which becomes "Chat disabled in client options."). | | If the client attempts to send a chat message and the server rejects it, the Notchian server will send that client a [[Protocol#System Chat Message|System Chat Message]] (non-overlay) with a red <code>chat.disabled.options</code> translation component (which becomes "Chat disabled in client options."). |
| | | |
− | === Social Interactions (blocking) ===
| + | == Social Interactions (blocking) == |
| | | |
| 1.16 added a ''social interactions screen'' that lets players block chat from other players. Blocking takes place clientside by detecting whether a message is from a blocked player. | | 1.16 added a ''social interactions screen'' that lets players block chat from other players. Blocking takes place clientside by detecting whether a message is from a blocked player. |
Line 410: |
Line 76: |
| [[Protocol#Disguised Chat Message|Disguised Chat Message]] packets are never blocked. | | [[Protocol#Disguised Chat Message|Disguised Chat Message]] packets are never blocked. |
| | | |
− | [[Protocol#System Chat Message|System Chat Message]] packets (regardless of the Overlay field!) are blocked based on the first occurrence of <code><''playername''></code> anywhere in the message, including split across multiple chat components, where ''playername'' may be any text, including the empty string or whitespace. If ''playername'' is the name of a blocked player (matched case-sensitively), the message is blocked. This only occurs if Hide Matched Names is enabled in Chat Settings (the default). | + | [[Protocol#System Chat Message|System Chat Message]] packets (regardless of the Overlay field!) are blocked based on the first occurrence of <code><''playername''></code> anywhere in the message, including split across multiple text components, where ''playername'' may be any text, including the empty string or whitespace. If ''playername'' is the name of a blocked player (matched case-sensitively), the message is blocked. This only occurs if Hide Matched Names is enabled in Chat Settings (the default). |
| | | |
| == Notes == | | == Notes == |