/tellraw 文本组件:click_event、hover_event,以及为什么你的消息什么都没显示
一个括号写错,tellraw 就不会向任何目标发送任何内容。下面介绍组件的结构、聊天中真正可用的点击与悬停操作、大多数人都会忽略的转义规则,以及 1.21.5 将 clickEvent 改名为 click_event 的变化。
/tellraw 接受一个文本组件,而它的失败方式很不友好:格式错误的组件会不给任何目标发送消息——唯一的报错只会发给执行命令的人,或者进入命令方块的输出里,而那里没人会看。下面所有内容都是关于如何一次就把结构写对。
三种有效结构
"plain string"
{"text":"one component"}
["joined ",{"text":"list","color":"gold"}]
列表形式才是用来做任何有趣事情的形式,因为每个元素都可以携带自己的格式。第一个元素的格式会被其余元素继承,除非它们自己覆盖——这就是为什么人们会莫名其妙地得到一整条金色的消息。用空字符串开头可以避免这种情况:
/tellraw @a ["",{"text":"Warning: ","color":"red"},{"text":"low health"}]
点击操作
click_event 接受一个操作,外加该操作自己的字段——并不存在共用的 value:
| 操作 | 字段 | 说明 |
|---|---|---|
run_command | command: "/spawn" | 以玩家身份、按其权限等级执行 |
suggest_command | command: "/msg Steve " | 填入聊天框,但不发送 |
open_url | url: "https://…" | 打开前会先询问 |
copy_to_clipboard | value: "any text" | 分享坐标时最友好的一种 |
change_page | page: 2 | 仅限成书 |
run_command 有一个陷阱:它以点击的玩家的权限执行,而不是命令方块的权限。一个调用 /gamemode creative 的菜单对普通玩家来说什么都不会做。
悬停操作
"hover_event":{"action":"show_text","value":["Click to teleport"]}
show_text、show_item 和 show_entity。注意这些名称——较旧的指南使用 hoverEvent、clickEvent 和 contents,而 1.21.5 用 hover_event、click_event 以及(针对 show_text 的)value 取代了它们。这次改名解释了大量从教程里抄来却失效的悬停提示。
转义才是出错的地方
整个组件是一个命令参数,所以里面的引号必须能通过命令解析器。在命令方块里,直接输入即可。在函数文件里,不需要反斜杠转义。在 /give 成书中,页面也是文本组件,以 SNBT 书写——自 1.21.5 起不再需要字符串套字符串的转义,而仍然写成转义 JSON 字符串的页面现在会显示为带引号的字面文本。
经验法则:如果你要在物品组件里嵌套文本组件,用工具来构建,而不是手写。
文本中的选择器
{"selector":"@p","separator":{"text":", "}}
会在发送时解析为玩家名称。{"score":{"name":"@s","objective":"Kills"}} 会取出记分板数值。两者都比你自己尝试拼接数值要好。
翻译键可跨语言生效
{"translate":"block.minecraft.crafting_table"}
会以每个玩家自己的语言渲染——韩语客户端显示 제작대,日语客户端显示 作業台。对于多语言服务器来说,这绝对比硬编码英文更好。
在文本与显示命令生成器中构建并预览文本和显示命令。