Руководства / Команды и данные
Текстовые компоненты /tellraw: click_event, hover_event и почему ваше сообщение ничего не показывает
Одна неверная скобка — и tellraw не отправляет ничего своим целям. Вот форма компонента, действия клика и наведения, которые действительно работают в чате, и правило экранирования, которое все упускают.
/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"}
отображается на родном языке каждого игрока — 제작대 для корейского клиента, 作業台 для японского. Для многоязычного сервера это строго лучше, чем жёстко зашитый английский.
Собирайте и просматривайте текстовые команды и команды отображения в Конструкторе текстовых и отображаемых команд.