Dialog Menu
Обзор
Dialog Menu открывает нативные диалоговые окна Minecraft 1.21.6 и новее через API диалогов Paper. Диалог — это окно в центре экрана с заголовком, текстовой частью, необязательным предметом, кнопками и полями ввода. Ему не нужен ни ресурспак, ни кастомный инвентарь.
Весь диалог собирается в одной записи-действии Paper Dialog. Каждая кнопка либо выполняет команду от имени игрока, либо запускает другие записи TypeWriter. Поля ввода (текст, переключатель, выбор, ползунок) считываются, когда игрок подтверждает диалог, а их значения подставляются в команду через $(key).
Возможности
- Нативные диалоги — ванильное диалоговое окно, открываемое через API диалогов Paper.
- Три раскладки — сетка кнопок, подтверждение «да/нет» или уведомление с одной кнопкой.
- Кнопки действий — выполняют команду от имени игрока, при необходимости от имени OP.
- Кнопки-триггеры — напрямую запускают записи TypeWriter, без команды.
- Поля ввода — текстовое поле (в том числе многострочное), переключатель, множественный выбор и числовой ползунок.
- Значения полей в командах — используйте
$(key)в команде, чтобы подставить то, что игрок ввёл или выбрал. - Динамический текст — заголовки, сообщения и подписи поддерживают MiniMessage и плейсхолдеры PlaceholderAPI.
- Предмет в тексте диалога — покажите предмет в теле диалога.
- Поведение после действия — закрыть диалог, оставить его открытым или дождаться ответа сервера.
- Плейсхолдер — проверка того, открыт ли у игрока сейчас диалог.
Установка
- Запустите Paper (или форк, например Folia) версии 1.21.6 или новее: в более старых версиях API диалогов нет.
- Убедитесь, что установлено расширение Basic для TypeWriter (см. документацию TypeWriter).
- По желанию: установите PlaceholderAPI, чтобы использовать плейсхолдеры в текстах.
- Поместите JAR-файл Dialog Menu в
plugins/Typewriter/extensions/и перезапустите сервер.
Начало работы
Покажите окно подтверждения перед телепортацией игрока:
- В веб-панели TypeWriter откройте страницу sequence и добавьте запись Paper Dialog.
- Задайте
displayNameравным<gold>Travel to the spawn?, аmessage— текстом тела диалога. - Задайте
dialogTypeравнымCONFIRMATION. - В
buttonsдобавьте кнопку действия. Задайте еёlabelравнымYes, аcommandравнымspawn. - В
exitButtonзадайтеlabelравнымNo. Оставьтеcommandпустым: тогда кнопка только закрывает диалог. - Свяжите запись с тем, что должно её открывать: взаимодействием с NPC, командой или вариантом ответа в диалоге.
- Опубликуйте и запустите запись в игре.
Чтобы получить значение от игрока, добавьте в buttons текстовое поле: задайте key равным name, buttonLabel равным Send, а command равным rename $(name). Когда игрок нажмёт кнопку, введённый текст подставится вместо $(name).
asOp выполняет команду с временными правами оператора. Используйте его только для команд, которые вы полностью контролируете, и никогда не подставляйте в такую команду произвольный текст игрока.
Как это работает
Когда действие выполняется, диалог собирается из записи и показывается игроку, который его запустил. Кнопка одноразовая: после клика её действие выполняется один раз для этого диалога. Диалог закрывается или остаётся открытым в соответствии с afterAction.
Все текстовые поля поддерживают MiniMessage и плейсхолдеры. Если displayName пуст, используется название записи.
Меню
Раскладка диалога зависит от dialogType:
| Тип | Раскладка |
|---|---|
MULTI_ACTION | Сетка кнопок с columns столбцами, плюс кнопка выхода, если включён showExitButton. |
CONFIRMATION | Ванильное окно «да/нет»: первая кнопка подтверждает, кнопка выхода отклоняет. В этом режиме кнопка выхода создаётся всегда. |
NOTICE | Окно с одной кнопкой, использующее первую кнопку или, если её нет, кнопку выхода. |
Типы кнопок, которые можно добавить в buttons:
| Тип | Поля | Макрос в команде |
|---|---|---|
| Кнопка действия | label, command, asOp | нет |
| Кнопка-триггер | label, triggers | нет |
| Текстовое поле | label, key (по умолчанию input), buttonLabel, command, asOp, width, labelVisible, initial, maxLength, maxLines, height | $(input) |
| Булев переключатель | label, key (по умолчанию boolean), initial, onTrue, onFalse, buttonLabel, command, asOp | $(boolean), заменяется на onTrue или onFalse |
| Множественный выбор | label, key (по умолчанию choice), options, buttonLabel, command, asOp | $(choice) |
| Числовой диапазон | label, key (по умолчанию value), start, end, initial, step, buttonLabel, command, asOp | $(value), округляется до целого числа |
Поля ввода показываются над кнопками. Каждая кнопка с полем ввода также добавляет собственную кнопку подтверждения с текстом buttonLabel; команда может использовать $(key) любого поля ввода из того же диалога. Кнопка выхода настраивается отдельно в exitButton.
Для множественного выбора записывайте options списком через запятую и добавляйте * после варианта, который должен быть выбран изначально, например Easy,Normal*,Hard.
Плейсхолдеры
Плейсхолдеры PlaceholderAPI, предоставляемые расширением typewriter.
| Плейсхолдер | Возвращает |
|---|---|
%typewriter_inmenudialog% | 1, если у игрока открыт диалог из этого расширения, иначе 0. |
%typewriter_inmenudialog_<name>% | 1, если открытый диалог — это запись Paper Dialog с таким названием записи. %typewriter_inmenudialog:<name>% тоже работает. |
Состояние сбрасывается при клике по кнопке, при выходе игрока и при перезагрузке TypeWriter. Оно не сбрасывается, если игрок закрывает диалог клавишей Escape.
Записи
Записей: 1, сгенерированы из исходного кода расширения.
Действия1
- Paper DialogDisplay a customizable dialog
Устранение неполадок
При выполнении действия ничего не показывается. Диалогам нужен Paper 1.21.6 или новее. На более старом сервере API диалогов не существует, и действие завершается ошибкой. Также проверьте, выполняются ли criteria записи.
Кнопка ничего не делает. Кнопки команд с пустым command только закрывают диалог. В остальных случаях команда выполняется от имени игрока: если у игрока нет на неё права, она молча не срабатывает, а сбой записывается в лог как Dialog command '…' failed. Сначала проверьте команду в чате.
$(key) остаётся в команде или заменяется пустотой. key поля ввода и макрос должны совпадать точно. Макрос, не соответствующий ни одному полю, заменяется пустым текстом. Для переключателей макрос возвращает значение onTrue или onFalse, а не true или false.
Кнопки перестают работать после первого клика. Каждая кнопка одноразовая для каждого открытого диалога. Если afterAction равен NONE или WAIT_FOR_RESPONSE, окно может оставаться на экране, но его кнопки больше не реагируют. Запустите действие снова, чтобы открыть новый диалог.
%typewriter_inmenudialog% остаётся равным 1. Игрок закрыл диалог клавишей Escape, которая не сбрасывает состояние. Оно сбрасывается при следующем клике по кнопке, при выходе игрока или при перезагрузке.
Связанные расширения
- Companion — открывайте диалог, когда игрок кликает по своему компаньону.