Структура меню
Если ты уже прошёл туториал Как создать меню, эта страница углубляется в структуру меню и более полезные ключи.
Файл меню
Заголовок раздела «Файл меню»Каждый файл меню может содержать одно меню или несколько связанных меню.
Файл с одним меню
Заголовок раздела «Файл с одним меню»Файл с одним меню ты, возможно, уже видел в туториале Как создать меню. Ниже пример такого файла.
title: "&8Меню"size: 6activators { command: "menu"}items: [ { slot: 0 texture: "783db86bb86dc2ec494e2ffca77765810ed11a52efef4e5c85252ec39a26c0" name: "Фиолетовоголовый гном" lore: [ "Говорящая голова!" "" ">> Кликни, чтобы сказать \"Привет!\"" ] rules { permission: "some.permission" } click { rules { money: 100 } actions { command { player: "me Hello!" } } denyActions { message: "Недостаточно денег" sound: "ENTITY_VILLAGER_NO" } } }]На первый взгляд структура выглядит громоздко, но не пугайся - дальше по документации все эти части разложены по полочкам.
Файл с несколькими меню
Заголовок раздела «Файл с несколькими меню»Небольшие подменю удобнее держать в одном файле с основным. Плагин это поддерживает: имя меню берётся из имени блока, в котором оно описано. Пример:
menus { my_awesome_menu { // Уникальное имя меню title: "Моё меню" size: 6 items: [ ... ] } my_another_menu { title: "Моё другое меню" size: 1 items: [ ... ] }}Все меню лежат в общем блоке menus. В примере выше - два меню в одном файле.
Свойства меню
Заголовок раздела «Свойства меню»В таблице ниже перечислены все свойства меню, которые можно указать в корне.
| Имя | Тип данных | Обязательно | Описание |
|---|---|---|---|
| title | String | Да | Заголовок меню |
| size | Number | Да | Вертикальный размер меню (количество рядов) |
| type | String | Нет | Тип инвентаря (по умолчанию: сундук с size рядов). См. Тип инвентаря. |
| items | Objects list | Нет | Предметы меню (кнопки) |
| activators | Object | Нет | активаторы для открытия меню |
| rules | Objects list | Нет | правила для открытия меню. Если хотя бы одно правило false, меню не откроется |
| preOpenActions | Object | Нет | действия, выполняемые перед созданием инвентаря и открытием меню |
| openActions | Object | Нет | действия, выполняемые перед открытием меню, но после успешной проверки правил и создания инвентаря |
| postOpenActions | Object | Нет | действия, выполняемые после открытия меню |
| denyActions | Object | Нет | действия, выполняемые, если хотя бы одно правило false |
| closeActions | Object | Нет | действия, выполняемые после закрытия меню |
| updateActions | Object | Нет | действия, выполняемые при обновлении меню по updateInterval |
| updateInterval | Number | Нет | Интервал обновления меню в тиках. Если не указан, меню не обновляется автоматически |
| Для drag-and-drop | |||
| draggable | Формат слота | Нет | Задаёт разрешённые слоты для размещения и взятия предметов |
| onPlaceItem | Object | Нет | действия, выполняемые при размещении предмета в разрешённом слоте |
| onTakeItem | Object | Нет | действия, выполняемые при взятии предмета из разрешённого слота |
| onDragItem | Object | Нет | действия, выполняемые при размещении или взятии предмета через разрешённые слоты |
Про drag-and-drop читай на странице Drag and drop (для продвинутых пользователей).
Авто-обновление
Заголовок раздела «Авто-обновление»Чуть подробнее про свойство updateInterval. Если хочешь меню с авто-обновлением предметов, плейсхолдеров и любых других динамических данных, укажи интервал обновления. Например:
title: "Динамическое меню"size: 1updateInterval: 40items: [ { slot: 0 material: CAKE name: "Игроков: %server_players%" }]Меню обновится каждые 2 секунды, вместе с ним перерисуется и предмет с плейсхолдером %server_players%.
В примере использованы стандартные плейсхолдеры. Подробнее о них на странице Плейсхолдеры.
Если на каждое обновление по updateInterval нужно ещё что-то делать, добавь блок updateActions.
title: "Таймер"size: 1updateInterval: 20updateActions { incVar: "counter:1"}Здесь глобальная переменная counter растёт на каждом обновлении меню - в нашем случае раз в секунду (20 тиков).
Кнопка - это тот же предмет (см. формат предмета), только умеет реагировать на клики и проверять правила. Ниже параметры, которые добавляются к обычным свойствам предмета.
| Имя | Тип данных | Обязательно | Описание |
|---|---|---|---|
| slot | Multiple | Да | Позиция предмета |
| rules | Objects list | Нет | правила отображения кнопок в меню |
| mrules | Objects list | Нет | Дополнительный блок правил, существующий только внутри кнопки. Эти правила не влияют на отображение кнопки. Они нужны только для независимых проверок и выполнения действий |
| click | Object | Нет | Содержит действия, выполняемые при клике игрока по предмету |
Как видишь, для кнопки обязательно только свойство slot, потому что предмет меню всегда должен быть в конкретном слоте или слотах.
Правила отображения
Заголовок раздела «Правила отображения»Кнопку можно показывать всем подряд, а можно навесить правила. Если игрок под правила не подходит - кнопка скрывается.
items: [ { slot: 0 material: IRON_SWORD }, { slot: 0 material: DIAMOND_SWORD rules { permission: "some.perm" } }]В этом примере у меню два предмета. Первый (Iron Sword) всегда показывается в слоте 0. Второй (Diamond Sword) появится в слоте 0 и заменит первый только если у игрока есть право some.perm.
Обработка кликов
Заголовок раздела «Обработка кликов»Меню без обработки кликов мало чем полезно. Под это в плагине есть удобный блок click. Например:
items: [ { slot: 0 material: DIAMOND_SWORD click { left { message: "Привет" } } },]Внутри click лежит блок left - это конкретный тип клика. Действия внутри него запускаются только на левый клик. В блоке любого типа клика работают те же действия и правила, что и в click напрямую.
Все типы кликов ниже. Самые ходовые - в начале списка.
| Тип клика | Описание |
|---|---|
| LEFT | Клик левой кнопкой мыши |
| RIGHT | Клик правой кнопкой мыши |
| MIDDLE | Клик средней кнопкой мыши |
| SHIFT_LEFT | Клик левой кнопкой мыши с зажатым Shift |
| SHIFT_RIGHT | Клик правой кнопкой мыши с зажатым Shift |
| DOUBLE_CLICK | Двойной клик левой кнопкой мыши |
Любой из этих типов можно использовать внутри блока click отдельно или вместе с другими.
items: [ { slot: 0 material: STONE click { message: "Это был клик" // Покажется на любой клик right { message: "Это был ПКМ клик" // Покажется на клик ПКМ } middle { message: "Это был СКМ клик" // Покажется на клик СКМ } } }]Тип инвентаря
Заголовок раздела «Тип инвентаря»Кроме сундука можно использовать и другие типы инвентаря - через свойство type, в которое передаётся имя типа. Список имён - в Bukkit Javadoc (по последней версии Spigot).
Если используется кастомный тип инвентаря, свойство slot можно опустить.
Ниже примеры меню с кастомными типами инвентаря.
Код:
title: "Menu"type: HOPPERactivators { command: "menu"}items: []Результат:

Dispenser
Заголовок раздела «Dispenser»Код:
title: "Menu"type: DISPENSERactivators { command: "menu"}items: []Результат:

Привязка свойств кнопки к правилам
Заголовок раздела «Привязка свойств кнопки к правилам»Свойства кнопки можно привязывать к правилам: если игрок попадает под правила - свойство применяется. Делается это через специальное свойство bindings. Пример:
items: [ { slot: 0 material: CAKE bindings { props { material: LEATHER_LEGGINGS } rules { gamemode: CREATIVE } } }]В этом примере у игрока в режиме CREATIVE материал поменяется на LEATHER_LEGGINGS.
Формат блока bindings:
-
props- какие свойства применить -
rules- правила для проверки игрока
Внутри props можно указать одно или несколько свойств предмета - тот же формат, что и у самого предмета. Эти свойства подмешаются к предмету только если игрок проходит правила из rules.
В rules принимаются любые правила, как в любом другом блоке rules.
Несколько биндингов
Заголовок раздела «Несколько биндингов»К одному предмету можно добавить несколько биндингов. Для этого замени блок bindings на список объектов. Пример:
items: [ { slot: 0 material: CAKE bindings: [ { props { material: LEATHER_LEGGINGS } rules { gamemode: CREATIVE } }, { props { lore: [ "" "Ты VIP!" ] } rules { permission: "group.vip" } } ] }]Тут bindings стал списком, и в него добавлен второй биндинг. Если у игрока есть право group.vip - применится новый лор.