Меню GUI инвентаря
На этой странице мы шаг за шагом создадим простое меню GUI инвентаря в Denizen. Подразумевается, что вы уже прошли разделы «Первые шаги» и «Основы», потому что здесь мы будем использовать инструменты, описанные в тех разделах.
В частности, нам понадобятся: команда /ex, world-скрипты, мета-документация и item-скрипты.
Введение
GUI-инвентари — один из самых распространённых способов сделать простые меню на Minecraft-серверах. Обычно это обычный сундучный интерфейс Minecraft, в котором лежат предметы, по клику на которые активируются какие-то опции.

GUI-меню инвентаря в Denizen можно сделать несколькими способами, и самый простой из них — использовать для этого специальный инструмент: контейнер скрипта inventory.
Начальный пример
Вот как выглядит базовый inventory-скрипт:
my_inventory_script:
type: inventory
inventory: chest
title: <&9><bold>My Inventory GUI Sample
gui: true
slots:
- [] [] [] [] [] [] [] [] []
- [] [] [] [] [stone] [] [] [] []
- [] [] [] [] [] [] [] [] []
По сути, это просто контейнер inventory, как он описан в мета-документации, с важной пометкой: обязательно задайте gui: true.
Для интерфейсов на базе chest слоты идут рядами по 9 штук. Обратите внимание, что каждый слот заключён в [ и ], например [stone] в центральном слоте примера, а пустые слоты — это просто []. Можно также написать [air].
Как это открыть?
Открыть только что созданное меню можно командой inventory с подкомандой open и параметром destination, в котором указан скрипт инвентаря.
На практике через команду /ex это выглядит так: /ex inventory open d:my_inventory_script.
Когда вы выполните эту команду в игре, сразу же должно открыться окно сундука: 3 ряда по 9 слотов, и в самом центре лежит 1 булыжник. По клику на булыжник пока что ничего не произойдёт, перетащить его нельзя, и свои предметы в этот инвентарь положить тоже нельзя. Это всё благодаря ключу gui: true в скрипте.
Но мне нужны кнопки меню, а не булыжники!
Обычно в меню нужны кнопки, а не просто какие-то предметы… но кнопка — это всего лишь чуть более хитрый предмет. Как вы помните, инструмент для «более хитрых предметов» — это, конечно же, item-скрипты! Смотрим обновлённый пример с ними:
my_inventory_script:
type: inventory
inventory: chest
title: <&9><bold>My Inventory GUI Sample
gui: true
slots:
- [] [] [] [] [] [] [] [] []
- [] [] [] [] [big_button_item] [] [] [] []
- [] [] [] [] [] [] [] [] [my_inv_gui_cancel_item]
big_button_item:
type: item
material: beacon
display name: <&2>The Big Button
lore:
- <&7>Click here to press the button.
my_inv_gui_cancel_item:
type: item
material: barrier
display name: <&c>Cancel
lore:
- <&7>Click here to not press the button.
Когда вы откроете этот inventory-скрипт через /ex, вы увидите интерфейс с двумя уникальными кнопками. Правда, они по-прежнему ничего не делают.
Так как же заставить кнопки что-то делать?
Чтобы кнопки действительно что-то делали, нужен ещё один важный инструмент: world-скрипт с событием player clicks <item> in <inventory>.
У этого world-события два параметра для заполнения: предмет и инвентарь. Догадаться, как их заполнить, наверное, несложно. В качестве <inventory> используйте имя вашего inventory-скрипта (в нашем примере — my_inventory_script), а в качестве <item> — имя вашего item-скрипта (в нашем примере — big_button_item и my_inv_gui_cancel_item).
Вот рабочий world-скрипт для примера выше:
my_inventory_gui_world:
type: world
events:
after player clicks big_button_item in my_inventory_script:
- narrate "<&[base]>Wow! You pressed the button!"
after player clicks my_inv_gui_cancel_item in my_inventory_script:
- inventory close
В этом world-скрипте зарегистрированы два события — по одному на каждую «кнопку» в инвентаре. После загрузки скрипта при открытии вашего inventory-скрипта вы сможете кликнуть по маяку, чтобы получить narrate-сообщение, или по барьеру, чтобы закрыть инвентарь (используется подкоманда close команды inventory).
И это всё?
Ага, всё так просто! Этого действительно хватит, чтобы собрать собственные GUI-меню. Поэкспериментируйте с разными опциями — как выглядит меню с разными предметами или разной раскладкой? Что если изменить число рядов или взять другой интерфейс, вроде hopper? А что если у вас несколько inventory-скриптов, и кнопка в одном меню открывает inventory open для другого?
Шаг дальше
Чтобы ваши меню выглядели по-настоящему эффектно, можно пойти дальше и использовать ресурспаки, чтобы получить полностью уникальный внешний вид для кнопок или даже для всего меню целиком. Распространённый трюк — взять картинку с целым кастомным фоном интерфейса, привязать её к символу кастомного шрифта, а затем использовать этот символ в заголовке инвентаря, чтобы заменить стандартный фон меню на вашу картинку.
Другие способы
В начале раздела я упомянул, что GUI-меню инвентаря можно сделать разными способами. Несколько альтернатив:
Заменить
gui: trueна связкуon player clicks in my_inventory_script:+- determine cancelledи то же самое для событияdrags. Так делали раньше, до появления опцииgui.Заменить контейнер скрипта
inventoryна динамически собранный обычный инвентарь.Заменить
item-скрипты на inline-определённые предметы, вродеstone[display=<&c>Button;lore=<&7>Click me!]Заменить предметы на динамически генерируемые, например в скрипте магазина, который наполняет инвентарь актуальным наличием товара.
Использовать
noteинвентарей, чтобы заранее собрать одно общее/глобальное меню, которое потом можно менять на лету.Список можно продолжать. Можно даже уйти за пределы инвентарей и использовать меню на основе чата, книг, сущностей, или…
Связанная техническая документация
Если хотите почитать подробнее про инструменты для GUI-инвентарей, вот несколько технических руководств: