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

Действия

Автор меню

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

НазваниеТип данныхОписание
openMenuStringОткрыть меню с указанным именем
openMenuCtxStringТо же, что openMenu, но передаёт контекст от активатора предыдущего меню
closeMenuBoolean или NumberЗакрыть текущее меню. Если вместо boolean указано число, меню закроется после задержки в указанных тиках
refreshMenuBoolean или NumberОбновить всё содержимое меню кроме заголовка. Если вместо boolean указано число, меню обновится после задержки в указанных тиках
messageObject или StringОтправить сообщение игроку. Можно отправить простой текст, JSON, title и др.
broadcastObject или StringОтправить сообщение всем игрокам на сервере. Формат как у message
miniMessageString(Устарело. MiniMessage теперь поддерживается стандартными message-действиями) Отправить сообщение через mini-message
playerChatСписок строкОтправить сообщение от лица игрока, который открыл меню
printStringВывести сообщение в консоль. Полезно для отладки
commandObjectВыполнить список команд от лица игрока или сервера
inputChatObjectЗапросить у игрока ввод текста в чат и сохранить результат в переменную
teleportObjectТелепортировать игрока в локацию
itemAddСписок объектовВыдать игроку любые предметы
itemRemoveСписок объектовУдалить предметы из инвентаря игрока. Сравнение по указанным свойствам или просто по номеру слота
itemClearСписок объектовУдалить предметы из инвентаря игрока так же, как itemRemove, но без учёта размера стака. Свойство count здесь не работает
inventoryClearBooleanПолностью очистить инвентарь игрока
bungeeConnectStringПодключить игрока к другому BungeeCord-серверу
giveMoneyNumber или ObjectНачислить деньги.
takeMoneyNumber или ObjectСнять деньги.
givePermissionСписок строк или ObjectВыдать право.
removePermissionСписок строк или ObjectОтозвать право.
addGroupString или ObjectДобавить в группу прав.
removeGroupString или ObjectУбрать из группы прав.
lpMetaSetObjectТолько для LuckPerms: задать meta-значения (metaList). Если активный провайдер прав не LuckPerms - пишет warning и пропускает.
lpMetaRemoveСписок строкТолько для LuckPerms: удалить meta-ключи. Если активный провайдер прав не LuckPerms - пишет warning и пропускает.
setGamemodeStringУстановить новый режим игры. Все имена режимов здесь
setHealthNumberУстановить здоровье игрока
setFoodLevelNumberУстановить уровень еды игрока
giveXpNumber или ObjectВыдать XP.
takeXpNumber или ObjectСнять XP.
giveLevelNumber или ObjectПовысить уровень.
takeLevelNumber или ObjectПонизить уровень.
soundObjectПроиграть звук
customSoundObjectПроиграть кастомный звук из ресурспака
potionEffectСписок объектовНаложить на игрока эффект зелья
removePotionEffectСписок строкСнять с игрока эффект зелья
openBookObjectСоздать и открыть игроку книгу
setPropertyObjectЗадать новые или перезаписать существующие свойства предмета меню
remPropertyСписок объектовУдалить указанные свойства у предмета меню
refreshItemMultipleОбновить только один предмет меню без обновления всего меню
setSkinObjectПоставить скин.
resetSkinBooleanСбросить скин.
addRecipeСписок объектовДобавить новые кастомные рецепты крафта
setButtonСписок объектовДобавить новую кнопку в открытое меню
removeButtonSlot (число, диапазон, матрица)Удалить кнопку из открытого меню (см. drag-and-drop)
placeItemСписок объектовДля drag-and-drop. Положить перетаскиваемый предмет в перетаскиваемый слот (см. drag-and-drop)
removePlacedSlot или ObjectУдалить перетаскиваемый предмет из меню (см. drag-and-drop)
Глобальные переменные
setVarСписок объектов, Список строкСоздать или заменить глобальную переменную
removeVarСписок объектов, Список строкУдалить глобальную переменную
incVarСписок объектов, Список строкПрибавить к глобальной числовой переменной
decVarСписок объектов, Список строкВычесть из глобальной числовой переменной
mulVarСписок объектов, Список строкУмножить глобальную числовую переменную
divVarСписок объектов, Список строкРазделить глобальную числовую переменную
Персональные переменные
setVarpСписок объектов, Список строкСоздать или заменить персональную переменную
removeVarpСписок объектов, Список строкУдалить персональную переменную
incVarpСписок объектов, Список строкПрибавить к персональной числовой переменной
decVarpСписок объектов, Список строкВычесть из персональной числовой переменной
mulVarpСписок объектов, Список строкУмножить персональную числовую переменную
divVarpСписок объектов, Список строкРазделить персональную числовую переменную
Специальные действия
delayObjectОбернуть блок действий, чтобы выполнить их с задержкой
bulkСписок объектовВыполнить несколько действий, в том числе одного типа
randActionsСписок объектовВыполнить случайный блок действий из списка
playerScopeObjectВыполнить действия для другого игрока
Для генерируемых меню
pagePrevNumberПереключить на одну из предыдущих страниц. Работает только с генерируемыми меню
pageNextNumberПереключить на одну из следующих страниц. Работает только с генерируемыми меню

Действия с деньгами, уровнями, правами и скинами идут через систему провайдеров AbstractMenus. Из коробки за деньги и права отвечает Vault, за группы - LuckPerms, за уровни - ванильный XP, за скины - SkinsRestorer.

Если у вас экономика не на Vault, а на чём-то ещё (например, PlayerPoints), есть два варианта: поставить готовый аддон-мост вроде PlayerPointsAddon, либо написать свой аддон, который зарегистрирует нужный плагин как провайдера. Получите вторую (или третью) экономику на том же сервере, между которыми меню переключаются по полю provider:.

В одной категории может быть зарегистрировано несколько провайдеров одновременно. Например, в секции экономики живут Vault (встроенный) и PlayerPoints (через аддон). Каждый провайдер при регистрации указывает свой id и приоритет (число): встроенные провайдеры идут с приоритетом 50, аддонные обычно с 100.

В config.conf providers.<секция> по умолчанию стоит "auto". Это значит: AbstractMenus сам выбирает провайдера с самым высоким приоритетом среди зарегистрированных в этой секции. На сервере, где стоят и Vault, и PlayerPointsAddon, при economy = "auto" AbstractMenus возьмёт PlayerPoints (приоритет 100 побеждает 50).

Если хочется зафиксировать конкретный плагин, вместо "auto" пишется его id - "vault", "playerpoints" или любой другой зарегистрированный. Тогда даже если придёт аддон с более высоким приоритетом, AbstractMenus продолжит ходить туда, куда сказал оператор.

Эту настройку можно переопределить ещё и для отдельного действия (provider: "..." внутри действия) - см. примеры ниже.

takeMoney: 100

Идёт через config.conf providers.economy. Если стоит "auto" (по умолчанию), плагин возьмёт провайдера с наивысшим приоритетом. Поставь конкретный id вроде "vault" или "playerpoints", чтобы зафиксировать выбор.

Объектная форма позволяет явно назвать провайдера. Удобно, когда в одном меню смешаны валюты - монеты для покупки предметов, очки для лотереи:

actions {
click: [
{ type: takeMoney, amount: 100, provider: "vault" } // экономика сервера
{ type: giveMoney, amount: 5, provider: "playerpoints" } // донат-токены
]
}

Если все меню должны использовать PlayerPoints, отредактируй plugins/AbstractMenus/config.conf:

providers {
economy = "playerpoints"
}

Теперь скалярная форма (takeMoney: 100) автоматически идёт через PlayerPoints.

Когда AbstractMenus запускает действие с деньгами/уровнями/правами, хендлер выбирается так:

  1. provider: "..." в самом действии - если указан, выигрывает всегда.
  2. config.conf providers.<section> - применяется, если стоит не auto.
  3. По приоритету - побеждает провайдер с наивысшим приоритетом. У встроенных он 50, у аддонов обычно 100 - значит аддон выигрывает, пока в конфиге явно не указан Vault.

Тот же формат работает для giveLevel/takeLevel (уровни), givePermission/removePermission/addGroup/removeGroup (права) и setSkin/resetSkin (скины). Просто меняй economy на нужную секцию в config.conf.

Как написать своего провайдера, см. Хендлеры провайдеров.

Отправить игроку текст. Например:

message {
chat: [
"Строка 1",
"Строка 2"
]
title: "Заголовок"
subtitle: "Подзаголовок"
fadeIn: 10
stay: 20
fadeOut: 10
actionbar: "&aПривет"
json: "{'text'='Привет'}"
}

У блока много параметров, и каждый можно использовать сам по себе.

НазваниеТип данныхОписание
chatСписок строкОтправить личное сообщение в чат
actionbarStringОтправить текст в action bar игрока
jsonStringОтправить личное JSON-сообщение в чат. Работает на MC 1.9+
Параметры title
titleStringОтправить title
subtitleStringОтправить subtitle
fadeInNumberВремя появления в тиках
stayNumberВремя отображения в тиках
fadeOutNumberВремя исчезновения в тиках

message можно задать и просто строкой - тогда действие пошлёт сообщение в чат.

message: "Одиночное сообщение"

JSON-сообщение можно задать не строкой, а прямо HOCON-синтаксисом. Пример:

message {
json {
text: "&aКакой-то текст"
hoverEvent {
action: "show_text"
value: "&eКакой-то текст"
}
}
}

Этот блок эквивалентен такому JSON-сообщению:

message {
json: "{'text':'&aКакой-то текст', 'hoverEvent':{'action':'show_text', 'value':'&eКакой-то текст'}}"
}

Выполнить команду от лица игрока или от сервера. Пример:

command {
player: [
"command 1",
"command 2"
]
console: [
"command 1",
"command 2"
]
}

Здесь /command 1 и /command 2 выполнятся и от игрока, и от сервера.

Можно отправить только от игрока или только от сервера:

command { player: "command 1" }

То же самое с блоком console.

По умолчанию во всех командах плейсхолдеры подставляются перед отправкой. Поставь ignorePlaceholder: true, чтобы отправить строку как есть - удобно, когда в команде буквально нужны символы %.

command {
console: "lp user %player_name% permission set foo.bar true"
ignorePlaceholder: false // по умолчанию; подставляет %player_name%
}

Закрывает меню и просит игрока написать что-нибудь в чат. Введённый текст плагин сохранит в переменную.

Подробнее - на странице Chat input.

Телепортирует игрока в указанную точку. Пример:

teleport {
world: "world"
x: 0.0
y: 100.0
z: 0.0
yaw: 0.0
pitch: 0.0
}

У действия есть короткая версия:

teleport: "world, 0.0, 100.0, 0.0, 0.0, 0.0"

Выдаёт игроку один или несколько предметов. Формат предмета - на странице формат предмета. Пример:

itemAdd: [
{
slot: 0
material: STONE
name: "Мой камень"
},
{
material: CAKE
name: "Мой кекс"
}
]

Предметы без slot лягут в первый свободный слот инвентаря.

Зеркало itemAdd: предметы удаляются. Если задан slot - удаляется именно из него. Без slot - по совпадению с указанными свойствами. Пример:

itemRemove: [
{
slot: 0
material: STONE
name: "Мой камень"
},
{
material: CAKE
name: "Мой кекс"
}
]

Проигрывает звук. Все параметры:

sound {
name: "SOUND_NAME"
volume: 1.0
pitch: 1.0
public: false
location {
world: "world"
x: 0.0
y: 0.0
z: 0.0
}
}

Обязательный только name, остальные - опциональные.

  • name - имя звука из Bukkit. Все имена - здесь.

  • volume - громкость, от 0.0 до 1.0.

  • pitch - pitch, от 0.0 до 10.0.

  • public - будут ли звук слышать игроки рядом.

  • location - где проиграть звук. Формат локации - как в teleport.

Есть и короткий формат:

sound: "SOUND_NAME"

Тогда звук проиграет только самому игроку, в его текущей локации.

То же, что sound, только имя звука берётся из ресурспака. Пример:

customSound: "name.songs_sound"

В объектной форме принимает всё то же, что sound, плюс category:

customSound: {
name: "name.songs_sound"
category: RECORDS
volume: 1.0
pitch: 1.0
public: false
location {
world: "world"
x: 0.0
y: 0.0
z: 0.0
}
}
  • name - имя звука из ресурспака (например, name.songs_sound). Обязательно.
  • category - одно из значений из этого списка. По умолчанию MASTER.
  • volume - громкость. По умолчанию 1.0.
  • pitch - pitch. По умолчанию 1.0.
  • public - если true, звук слышат и игроки рядом. По умолчанию false.
  • location - где проиграть звук. Формат - как в teleport. По умолчанию - текущая локация игрока.

Накладывает на игрока эффект зелья.

potionEffect: [
{
effectType: FAST_DIGGING
duration: 100
amplifier: 1
}
]

Формат такой же, как у свойства предмета potionData.

Снимает с игрока эффекты зелий. Пример:

removePotionEffect: [
FAST_DIGGING,
SPEED
]

Снимет с игрока сразу два эффекта.

Открывает игроку книгу. Формат повторяет свойство предмета bookData.

openBook {
author: "Питер Пайпер"
title: "&e&lСупер заголовок"
pages: [
"Содержимое первой страницы",
"Содержимое второй страницы",
"..."
]
}

Действия для чтения и записи meta-значений пользователя в LuckPerms. Идут через активный провайдер прав и срабатывают, только когда этот провайдер - LuckPerms. Если нет, плагин пишет warning и пропускает действие.

lpMetaSet {
ignorePlaceholder: false
metaList: [
{ key: "prefix", value: "&7[Участник]" }
{ key: "suffix", value: "&8[%player_world%]" }
]
}
  • metaList - список пар { key, value }. value проходит через подстановку плейсхолдеров, если ignorePlaceholder не true.
  • ignorePlaceholder - если true, value отправляется как есть. По умолчанию false.

Удаляет meta-ключи. Принимает строку или список:

lpMetaRemove: "prefix"
lpMetaRemove: [ "prefix", "suffix" ]

Эта группа действий создаёт, обновляет, удаляет переменные и считает арифметику над ними.

У каждого действия с переменными две версии - глобальная и персональная. Например, setVar для глобальных и setVarp для персональных.

Действия для глобальных переменных.

Создаёт или обновляет глобальную переменную. Один из форматов:

setVar: "<var_name>::<value>"
setVar: "<var_name>::<value>::<time>"
setVar: "<var_name>::<value>::<replace>"
setVar: "<var_name>::<value>::<time>::<replace>"

Где:

<var_name>
имя переменной

<value>
значение - строка или число

<time>
опционально, время жизни переменной

<replace>
опционально. Если false и переменная уже есть, новое значение не запишется. По умолчанию true

Простой пример:

setVar: "my_var::Какие-то данные"

Создаст глобальную переменную my_var со строковым значением Какие-то данные.

Можно сделать переменную с временем жизни - по истечении срока она удалится сама. Время жизни задаётся параметром time. Пример:

setVar: "my_var::Какие-то данные::10m"

Здесь у my_var время жизни - 10 минут. Указывать его можно в секундах (s), минутах (m), часах (h) и днях (d), форматы можно комбинировать. Например:

1d 12h
1 день (24 часа) и 12 часов

2h 30m
2 часа и 30 минут

10s 10h
10 часов и 10 секунд

Чтобы переменную нельзя было затереть, используй последний аргумент <replace>:

setVar: "my_var::Какие-то данные::false"

false здесь - это <replace>, а не <time>. Если третий аргумент - boolean и аргументов ровно три, плагин считает его <replace>. И учти: это не спасает от перезаписи другим действием, у которого replace: true.

Удаляет глобальную переменную. Пример:

removeVar: "my_var_name"

У действия один аргумент - имя глобальной переменной.

Действия для арифметики над переменными:

  • incVar - прибавить

  • decVar - вычесть

  • mulVar - умножить

  • divVar - разделить

Если переменной с таким именем нет, плагин создаст её с указанным значением.

Пример с incVar:

incVar: "my_var::2"

Увеличит my_var на 2.

У остальных арифметических действий формат такой же. Примеры:

decVar: "my_var::10"
mulVar: "my_var::3"
divVar: "my_var::2"

У всех действий с переменными есть полный объектный формат. Например, у setVar:

ПараметрТипОписаниеОбязателен
nameStringУникальное имя переменнойtrue
valueStringЗначение переменнойtrue
timeStringВремя жизни переменнойfalse
replaceBooleanЕсли false и переменная уже есть, новое значение не запишется. По умолчанию truefalse
playerStringСоздать персональную переменную конкретному игроку. Устаревшее поле - используй отдельные действия для персональных переменныхfalse

Пример:

setVar {
name: "myvar"
value: "Привет, мир"
}

У остальных действий (removeVar, арифметические) формат такой же.

Объектная форма остаётся ради обратной совместимости и удобства, когда в значение нужно положить большую сложную строку.

Действия для персональных переменных.

setVarp создаёт персональную переменную для того, кто открыл меню. Формат такой же, как у глобального setVar.

Пример:

setVarp: "myvar::Привет, мир"

То же, что в Временная переменная для глобальных, только через setVarp.

То же, что в Защита от перезаписи для глобальных, только через setVarp.

Чтобы удалить персональную переменную, бери removeVarp. Формат такой же, как у глобальных:

removeVarp: "my_var_name"

Арифметика над персональными переменными:

  • incVarp - прибавить

  • decVarp - вычесть

  • mulVarp - умножить

  • divVarp - разделить

Аргументы и использование - как у Math actions для глобальных.

incVarp: "myvar::2"

Если нужно создать, удалить или поменять сразу несколько переменных, любое такое действие можно оформить списком. Пример:

Пример 1. Создать несколько глобальных переменных.

setVar: [
"variable_1::Значение переменной 1",
"variable_3::Значение переменной 2",
"variable_3::Значение переменной 3"
]

Пример 2. Удалить несколько глобальных переменных.

removeVar: [
"variable_1",
"variable_3",
"variable_3"
]

Пример 3. Прибавить к нескольким персональным переменным.

incVarp: [
"var_1::2",
"var_3::5",
"var_3::8"
]

Обёртка над другими действиями. Два параметра:

  • delay - задержка в тиках перед запуском actions.

  • actions - обычный блок действий. Всё внутри выполнится через delay тиков.

Пример для блока click:

click {
message: "Привет!"
delay {
delay: 20
actions {
itemAdd {
material: CAKE
name: "&bТвой кекс"
}
}
}
closeMenu: true
}

Порядок выполнения:

  1. Отправляется сообщение “&aПривет!”.
  2. Меню закрывается.
  3. Через 20 тиков игроку в инвентарь падает кекс.

Обёртка, которая запускает несколько групп действий по очереди. Удобна, когда нужно несколько действий с одинаковым именем подряд.

bulk: [
{
message: "Привет!"
sound: ENTITY_VILLAGER_NO
},
{
sound: ENTITY_VILLAGER_YES
},
{
sound: BLOCK_NOTE_BLOCK_PLING
}
]

Каждый элемент списка - отдельная группа действий, как обычный блок actions. Разбиение на группы и даёт повторять одно и то же действие несколько раз.

Обёртка, которая запускает один случайный блок из списка. Когда дело доходит до randActions, плагин выбирает один блок наугад. Пример:

randActions: [
{
message: "Действие 1"
},
{
message: "Действие 2"
},
{
message: "Действие 3"
}
]

При нескольких срабатываниях игрок будет видеть разные сообщения.

Если действия нужно выполнить от имени другого игрока, бери обёртку playerScope. Пример:

playerScope {
name: "%player_name_placeholder%"
actions {
message: "Привет, %player_name_placeholder%"
}
}

Сообщение внутри actions отправится игроку, которого нашли по имени из name.

actions тут - обычный блок действий, но все действия и правила в нём относятся к найденному игроку. Пример с дополнительными правилами:

playerScope {
name: "%player_name_placeholder%"
actions {
rules {
gamemode: SURVIVAL
}
actions {
message: "Привет, %player_name_placeholder%"
}
}
}

Блок rules тут тоже проверяется на найденного игрока, а не на том, кто открыл меню.

Для работы со скинами AbstractMenus использует SkinsRestorer.

Чтобы поставить игроку скин, нужны его texture и signature. Их можно получить, например, через загрузку картинки на MineSkin. Скопируй значения “Texture Data” и “Texture Signature” в соответствующие поля setSkin.

setSkin {
texture: "ewogICJ0aW1lc3RhbXAiIDogMTU4ODQxODUwNjMzOSwKICAicHJvZmlsZUlkIiA6ICJiMGQ0YjI4YmMxZDc0ODg5YWYwZTg2NjFjZWU5NmFhYiIsCiAgInByb2ZpbGVOYW1lIiA6ICJNaW5lU2tpbl9vcmciLAogICJzaWduYXR1cmVSZXF1aXJlZCIgOiB0cnVlLAogICJ0ZXh0dXJlcyIgOiB7CiAgICAiU0tJTiIgOiB7CiAgICAgICJ1cmwiIDogImh0dHA6Ly90ZXh0dXJlcy5taW5lY3JhZnQubmV0L3RleHR1cmUvMmQxNWQxNmE5OTU3NmRiZGE5NWIxMjA3ZmU1NGQ0MjE0Njg4MGMzNzkwNTMwOWViOTg4ODIxMDRhYzcwZjFkNSIKICAgIH0KICB9Cn0="
signature: "dHlo+kNagxVCC5CscZrQB5iyQvCBSvG+onsB+cl2qSChe+mILMLWdLi8+stVYo7+X4mjJ9n6F7REW0ndf4fYR72x8xOdOhqgwwtFaA7dyb+NI5AtTQNoch0Tz91FqKWznTWVHBaRQB/eiBpjQz6X1H/dJDAvuN5O6gVLvHcBoBNnQ/ZLVYGrVoK3vOykbEW9NECVCu62bsroVZ0mRMaK35wVP6Wh7srkXGOoyiWuX/gqFf1W/Gpum2SsBx06166Itbu1DNs99ST+Uqx3Vv2THA+CKEpYG7tXPZZ1JSw7Pgk6KzIKyQKmIgL3SphEbzNT6XcUQlpsdzp8q3LECeWLqqk1rQwNqWmduUdsbIiRT4YSwNLyFeClE3NcPGxrPgWXCSfg+u5kHt4+n+u3s469R6DdTGXmtz+Tx06iUzwAgBAd4iNN/rDTranVZ9JokOgrNOQc/uUV4HFxYbrDAh4/LnFP4m/V7HSp5VGZye/Z1yzHtECKZFhId4iTQacckD9HT6vzvT7kH7aM7pkOzG12WkVPYBJBObgXoBUTYlAbCj18DUerT7Fx3m0vi0ThWU/fYmj8XqUFOgmzUFXeq165I0wQhpAv3JiCA0+tVCpndzD6J4MQloBRFHS1gJmI9XYGlK8G24FP8GLljW5RLfHDc672UVzdwI3m4vuFeraLjl4="
}

Выдаёт игроку рецепт. Принимает список объектов, один объект на рецепт.

addRecipe: [
{
key: "my_recipe"
shape: [
" A ",
"ABA",
" A "
]
ingredients {
A: STONE
B: GRASS
}
result {
material: EMERALD
name: "Super emerald"
}
}
]

Обязательные параметры:

  • key - уникальный id (имя) рецепта.

  • shape - сетка верстака. Показывает, как разложить предметы.

  • ingredients - ингредиенты в формате <key>: <material>. A и B - буквы из shape. Поддерживаются только материалы.

  • result - предмет, который игрок получит на выходе.

Итого, чтобы скрафтить нужный предмет, надо разложить ингредиенты по ячейкам как на картинке.

Workbench content

Добавляет или меняет свойство у предмета меню. Пример:

items: [
{
slot: 0
material: STONE
name: "Тест свойств"
click {
setProperty {
glow: true
}
}
}
]

После клика предмет начнёт светиться.

Через это действие можно менять и свойства других предметов в открытом меню - для этого укажи слот, в котором они лежат. Пример:

items: [
{
slot: 0
material: STONE
name: "Кнопка 1"
click {
setProperty {
slot: 1 // Слот другой кнопки
glow: true
lore: "Ты кликнул по Кнопке 1"
}
}
},
{
slot: 1
material: STONE
name: "Кнопка 2"
}
]

Удаляет у предмета меню перечисленные свойства - просто перечисли их имена списком. Как и setProperty, действует только на конкретную сессию меню у игрока, в исходные данные не лезет.

items: [
{
slot: 0
material: STONE
name: "Кнопка 1"
glow: true
click {
remProperty: [
"glow",
"name"
]
}
},
]

После клика у предмета останется только material. Удалённые свойства вернутся, если меню переоткрыть.

Можно удалять свойства и у другого предмета в открытом меню - для этого remProperty оформляется как объект с двумя полями: slot и список properties.

items: [
{
slot: 0
material: STONE
name: "Кнопка 1"
click {
remProperty {
slot: 1
properties: [
"glow",
"lore"
]
}
}
},
{
slot: 1
material: STONE
name: "Кнопка 2"
glow: true
lore: [
"Это кнопка 2"
]
}
]

Теперь клик по Кнопке 1 убирает glow и lore у Кнопки 2.

Обновить один конкретный предмет, а не всё меню. Это сильно экономит ресурсы: вместо перерисовки всех предметов плагин трогает только один.

У действия три режима.

Обновляет тот предмет, на котором висит действие. Пример:

items: [
{
slot: 0
material: STONE
name: "Опыт: %player_xp%"
click {
giveXp: 100
refreshItem: true
}
},
]

Обновляет текущий предмет через указанное число тиков.

items: [
{
slot: 0
material: STONE
name: "Опыт: %player_xp%"
click {
giveXp: 100
refreshItem: 20 // Тики вместо 'true'
}
}
]

Обновляет предмет в указанном слоте. Можно задать задержку.

items: [
{
slot: 0
material: STONE
name: "Кнопка"
click {
giveXp: 100
refreshItem {
slot: 1
delay: 20 // Опционально
}
}
},
{
slot: 1
material: STONE
name: "Опыт: %player_xp%"
},
]

Добавляет в меню интерактивный предмет. Пример:

setButton {
slot: 4
material: CAKE
name: "Новая кнопка"
click {
message: "&aПривет!"
}
}

После выполнения кнопка появится в слоте 4. Если в слоте уже что-то было - заменится.

Убирает кнопку из открытого меню. Принимает слот в любом из доступных форматов. Пример:

removeButton: 4

Удалит предмет в слоте 4, если он там есть. Можно задавать слот и другими форматами:

removeButton: "0-8"

Удалит предметы из слотов 0, 1, 2, ..., 8.