Меню GUI инвентаря

На этой странице мы шаг за шагом создадим простое меню GUI инвентаря в Denizen. Подразумевается, что вы уже прошли разделы «Первые шаги» и «Основы», потому что здесь мы будем использовать инструменты, описанные в тех разделах.

В частности, нам понадобятся: команда /ex, world-скрипты, мета-документация и item-скрипты.

Введение

GUI-инвентари — один из самых распространённых способов сделать простые меню на Minecraft-серверах. Обычно это обычный сундучный интерфейс Minecraft, в котором лежат предметы, по клику на которые активируются какие-то опции.

../../_images/inv_gui_sample.png

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 инвентарей, чтобы заранее собрать одно общее/глобальное меню, которое потом можно менять на лету.

  • Список можно продолжать. Можно даже уйти за пределы инвентарей и использовать меню на основе чата, книг, сущностей, или…