Перейти к содержимому

Структура меню

Автор меню

Если ты уже прошёл туториал Как создать меню, эта страница углубляется в структуру меню и более полезные ключи.

Каждый файл меню может содержать одно меню или несколько связанных меню.

Файл с одним меню ты, возможно, уже видел в туториале Как создать меню. Ниже пример такого файла.

title: "&8Меню"
size: 6
activators {
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. В примере выше - два меню в одном файле.

В таблице ниже перечислены все свойства меню, которые можно указать в корне.

ИмяТип данныхОбязательноОписание
titleStringДаЗаголовок меню
sizeNumberДаВертикальный размер меню (количество рядов)
typeStringНетТип инвентаря (по умолчанию: сундук с size рядов). См. Тип инвентаря.
itemsObjects listНетПредметы меню (кнопки)
activatorsObjectНетактиваторы для открытия меню
rulesObjects listНетправила для открытия меню. Если хотя бы одно правило false, меню не откроется
preOpenActionsObjectНетдействия, выполняемые перед созданием инвентаря и открытием меню
openActionsObjectНетдействия, выполняемые перед открытием меню, но после успешной проверки правил и создания инвентаря
postOpenActionsObjectНетдействия, выполняемые после открытия меню
denyActionsObjectНетдействия, выполняемые, если хотя бы одно правило false
closeActionsObjectНетдействия, выполняемые после закрытия меню
updateActionsObjectНетдействия, выполняемые при обновлении меню по updateInterval
updateIntervalNumberНетИнтервал обновления меню в тиках. Если не указан, меню не обновляется автоматически
Для drag-and-drop
draggableФормат слотаНетЗадаёт разрешённые слоты для размещения и взятия предметов
onPlaceItemObjectНетдействия, выполняемые при размещении предмета в разрешённом слоте
onTakeItemObjectНетдействия, выполняемые при взятии предмета из разрешённого слота
onDragItemObjectНетдействия, выполняемые при размещении или взятии предмета через разрешённые слоты

Про drag-and-drop читай на странице Drag and drop (для продвинутых пользователей).

Чуть подробнее про свойство updateInterval. Если хочешь меню с авто-обновлением предметов, плейсхолдеров и любых других динамических данных, укажи интервал обновления. Например:

title: "Динамическое меню"
size: 1
updateInterval: 40
items: [
{
slot: 0
material: CAKE
name: "Игроков: %server_players%"
}
]

Меню обновится каждые 2 секунды, вместе с ним перерисуется и предмет с плейсхолдером %server_players%.

В примере использованы стандартные плейсхолдеры. Подробнее о них на странице Плейсхолдеры.

Если на каждое обновление по updateInterval нужно ещё что-то делать, добавь блок updateActions.

title: "Таймер"
size: 1
updateInterval: 20
updateActions {
incVar: "counter:1"
}

Здесь глобальная переменная counter растёт на каждом обновлении меню - в нашем случае раз в секунду (20 тиков).

Кнопка - это тот же предмет (см. формат предмета), только умеет реагировать на клики и проверять правила. Ниже параметры, которые добавляются к обычным свойствам предмета.

ИмяТип данныхОбязательноОписание
slotMultipleДаПозиция предмета
rulesObjects listНетправила отображения кнопок в меню
mrulesObjects listНетДополнительный блок правил, существующий только внутри кнопки. Эти правила не влияют на отображение кнопки. Они нужны только для независимых проверок и выполнения действий
clickObjectНетСодержит действия, выполняемые при клике игрока по предмету

Как видишь, для кнопки обязательно только свойство 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: HOPPER
activators {
command: "menu"
}
items: []

Результат:

Инвентарь Hopper

Код:

title: "Menu"
type: DISPENSER
activators {
command: "menu"
}
items: []

Результат:

Инвентарь Dispenser

Свойства кнопки можно привязывать к правилам: если игрок попадает под правила - свойство применяется. Делается это через специальное свойство 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 - применится новый лор.