Команда разработчиков
100 subscribers
2 files
16 links
Именно тут мы научим вас создавать аддоны, объясним что и как использовать, и будем помогать вам, удачи в разработке!

По поводу рекламы - @NoHaijeSo1o
Если у вас есть какие либо предложения то можете написать нам:
@ShoneStew
@qspkp
Download Telegram
⚙️ Инструменты разработки
Как вы знаете, для разработки аддонов требуются некоторые приложения(если у вас смартфон) или программы(если у вас ПК/ноутбук).
В этой публикации будет 2 группы приложении/программ для разработки аддонов и 1 дополнение. Поехали!


🗂 Первая группа: архиваторы и файловые менеджеры.
Приложения и программы из этой группы нужны для создания структуры аддона, его внутренних файлов и папок, а также архивирование файлов аддона и его изменения расширения, для импорта в игру.

Файловый менеджер - замечательный файловый менеджер, подходит для управлениями файлов.
Cx проводник - тоже, замечательный файловый менеджер, более популярный.
RAR - для архивации файлов аддонов, но можно использовать его как файловый менеджер.
7-zip - древний архиватор на Windows, с открытым исходным кодом.


✍️ Вторая группа: редакторы кода.
Надо же как-то редактировать файл, дабы туда записать код. Так вот, редакторы кода с этим вам помогут. Администраторы канала советуют вам несколько приложении и программ для редактирования кода, а именно:

QuickEdit - простой редактор кода, подойдет для написания мелких аддонов, прост и понятен.
Acode - более продвинутый, подойдет для написания более крупных аддонов, поддерживаем плагины и выводит подсказки.
Visual Studio Code - очень популярный редактор кода на Windows, Linux и macOS , плагинов уйма и подходит не только для написания аддонов, а и для программ, чат ботов и так далее.
Subline Text - очень легкий редактор кода на Windows, Linux и macOS, тоже подходит для написания аддонов.

И само дополнение, как и писалось в самом начале:
JaylyBot - бот для дебаггинга кода, можно не заходя в игру проверять работоспособность кода, на сайте бота написано и показано как его использовать.


Написал пост - @Shonestew
👍4
👂 Слушатели событий:
События, к примеру это может быть разрушение блока, использование чего либо, вход игрока, спавн игрока, и т.д.

Основные события находятся здесь в разделе classes.

Есть 2 типа событий:
AfterEvents (после)
Это происходит после их выполнения, к примеру после ломания блока, после сообщения в чате, и т.д, событие которое произойдёт «после» нельзя отменить.
BeforeEvents (до)
Это происходит до их выполнения, к примеру сообщение в чате, ломание блока, и т.д, событие которое происходит «до» можно отменить.


[ ! ] Важно учитывать, что не все события поддерживают AfterEvents, или beforeEvents, к примеру ScriptEventCommandMessage поддерживает только afterEvents.


Вот как можно использовать событие которое происходит до сообщения в чате:
world.beforeEvents.chatSend.subscribe((event) => {
const player = event.sender; // Игрок который отправил сообщение
const message = event.message; // Сообщение которое отправил игрок

if (message === "#rtp") { // Если сообщение равно #rtp
event.cancel = true; // Отменяем отправку сообщения в чат
player.sendMessage("Подождите, происходит телепортация..."); // Отправляем сообщение игроку
RTP(player); // Функция для ртп
}
});


Написал пост - @NoHaijeSo1o.
👍5
Это все посты которые мы написали, пишите свои идеи для следующего поста в комментарии.
👍5
⚙️ Script API: что это и с чем его едят?
Для начала стоит понять что такое вообще API.
API - это набор способов и правил, по которым различные программы общаются между собой и обмениваются данными. В нашем же случае, между собой общаются не скорее программы, а скриптом и мир/сервер (дальше будет просто мир).
Сам же Script API (ранее назывался как GameTest Framework) - это такой же набор способов и правил (или функции), с которым происходит общение скрипта с миром, позволяя создавать сценарии действии при определенных событии. Про события и их прослушивания было в прошлой статье.


📦 Модули в Script API
В Script API есть модули, которые импортируются через манифест (в публикации про один из модулей разберем подробнее), которые отвечают за свои функции. Все основные модули:
@minecraft/server - основной модуль для написания скриптов, нужен в 99% случаях,
@minecraft/server-ui - необходим для создания форм(см. фото), которые можно использовать для взаимодействия с игроком через удобные формы,
@minecraft/server-net - модуль для отправки HTTP-запросов методами GET, POST, DELETE, HEAD и PUT,
Также есть и доп. модули, но разбирать их не требуется, пригодяться они очень редко.


👨‍💻Начальная подготовка
Для написания скриптов требуется базовое знание JavaScript. В частности: переменные, циклы for/while, условия if else, базовые математические операторы, функции, стрелочные функции, switch/case и др. Кроме этого, нужен инструментарии в лице любого редактора кода. Какой выбрать - мы уже расписывали в этом посту. А изучить JavaScript можно на прекрасном сайте learn.javascript.ru.


P.S. от редактора: извиняюсь за долгое отсутствие постом, были проблемы в жизни, так что я только сейчас смог написать пост
🔥41
📦 Глава "Модули". Модуль @minecraft/server.
В прошлой публикации мы обьясняли про модули в Script API. И при разборе основных модулей был упомянут основной модуль - @minecraft/server. Оно является самым главным при написании скрипта и нужен в 90% случаях. Сам модуль состоит из 5 классов для взаимодействия с игрой - World, Block, Entity, Dimension и ItemStack. Они все состоят из разных функции, нужные для взаимодействии. В этой же публикации мы будем разбирать классы World и Entity. Если вы хотите публикацию про другие классы - пишите комментарии в качестве обратной связи. Итак, начнём


⚙️ Класс "World"
Ключевой класс в основном модуле, содержит в себе функции для взаимодействия с миром, к примеру исполнения команд, выдачи эффектов и прослушивания событии. К примеру, если мы хотим чтобы каждые 20 тиков(1 секунда) отправлялось сообщение в чат, то делаем это так:

import { world, system } from "@minecraft/server";

system.runInterval(() => {
world.sendMessage("Привет, мир!");
});

Здесь мы сначало импортируем класс world и system, после через system задаем интервал срабатывания кода в 20 тиков(1 секунду). Внутри функции интервала находиться функция отправки сообщения sendMessage, в который аргументом вписываем строку с текстом "Привет, мир!", всё.
Также обратившись к классу world можно прослушивать события 2 функциями - afterEvents и beforeEvents. Их отличия заключается в том, что первая нужна для прописания логики после события (к примеру, игрок нанес урон и ему за это выдается яблоко), а второе нужна для прописывания логики до выполнения события (к примеру, игрок нанес урон, но событие было отменено). К примеру, используем функцию beforeEvents:

import { world } from "@minecraft/server";

world.beforeEvents.chatSend.subscribe((ev) => {
let player = ev.sender;
let msg = ev.message;
if (msg == "!test") {
ev.cancel = true;
player.runCommandAsync("give @s apple");
player.sendMessage("Вы получили яблоко!");
};
});

В этом примере мы прослушиваем событие отправки сообщение, и если игрок отправил сообщение "!test" - отменяем событие отправки сообщения, после игроку выдается яблоко и пишется ему что ему было выдано яблоко. Также в классе world есть и другие функции, которые можно посмотреть здесь. В дальнейшем мы снова вернемся к слушателям событии и будем разбирать исходники некоторых аддонов.


⚙️ Класс "Entity"
Этот класс представляет из себя сборник функции, с которым можно получить информацию об сущности(игрока тоже), к примеру его координаты и т.д. Давайте же напишем скрипт, который при вписывании команды "!health" будет выводить здоровье игрока в чат:

import { world, EntityComponentTypes } from "@minecraft/server";

world.beforeEvents.chatSend.subscribe((ev) => {
let player = ev.sender;
let msg = ev.message;
if (msg == "!health") {
ev.cancel = true;
let healthCount = player.getComponent(EntityComponentTypes.Health);
player.sendMessage(`У вас ${healthCount} здоровья!`);
};
});

Тут как выше - при отправке сообщении, если это была команда health - через доп. класс EntityComponentTypes извлекаем количество здоровья и выводим в чат. Подробнее про другие функции можно почитать здесь.
На этом всё. В следующих публикациях будет разбор модуля @minecraft/server-ui. Когда оно будет - я незнаю, так что ждите.
👍4🔥2🤔1
Здравствуйте👋! Обращаюсь к вам с просьбой предоставить исходники ваших скриптов(или простыми словами код) в ваших аддонах, дабы мы могли в этом канале их разобрать с целью понять как они работают и помочь начинающим скриптерам в их трудном пути.
Насчёт новой публикации, оно будет на тему модуля server-ui. Будет либо сегодня либо завтра.


Передавая исходники/код ваших аддонов, вы соглашаетесь что переданное вами становиться свободным для использования
👍4
Dzien dobry!
Давненько ещё наткнулся на архив документации по Script API с 1.19.50 до текущей на момент написания поста(1.21.51), вот само документация:

https://jaylydev.github.io/scriptapi-docs/

Выбираете нужную версию на странице, листаете ниже и выбираете нужный модуль и по поиску находите нужный вам класс, функцию или слушатель события. Это полезно тем разработчикам, что всё еще пишут скрипты к примеру на 1.20.5x. Так что советую посмотреть
👍4🤔2
Команда разработчиков
📂 Структура аддонов Доброго дня, в этой публикации будет расказываться об структуре аддонов, как они устроены и т.д. Погнали! Как устроены аддоны? Аддоны внутренне устроены следующим образом - в директории(папка) аддона есть две другие директории - это ресурспак…
Совсем забыл скинуть манифест для скриптов ниже. Вот сам манифест:
{
"format_version": 2,
"header": {
"name": "Bedrock Add-ons",
"description": "Script API Template",
"uuid": "<UUID>",
"version": [0, 1, 0],
"min_engine_version": [1, 20, 0]
},
"modules": [
{
"type": "script",
"language": "javascript",
"uuid": "<UUID>",
"entry": "scripts/main.js",
"version": [0, 1, 0]
}
],
"dependencies": [
{
"module_name": "@minecraft/server",
"version": "1.8.0-beta"
},
{
"module_name": "@minecraft/server-ui",
"version": "1.3.0"
}
]
}
👍3🤔2
Сегодня выйдет пост. Предупреждаю, оно будет в 2 частях, так как сам пост получился длинным. В скором времени ожидайте его.
👍3
📦 Глава "Модули". Часть 2. Модуль "@minecraft/server-ui".
В прошлой части мы разбирали основной модуль, требуемый для взаимодействия с миром во многих случаях. Сегодня же мы будем разбирать модуль для отправки формы, дабы таким образом получать информацию.

Такую форму к примеру можно наблюдать при регистрации или входе на сайт. В Майнкрафте же оно выглядет примерно так.

В самом модуле существуют 8 форм, но мы разберем 3 основных класса для вывода 3 видов формы - ActionFormData (обычная форма, можно выводить только текст и кнопки), MessageFormData (форма, который содержит заголовок, основной текст и 2 кнопки), ModalFormData (форма с текстовыми полями, ползунками и т.д.)


⚙️ Класс "ActionFormData"
Это форма в большинстве подходит для интерфейсов магазина, выбора мини-игр и т.д. Для его использования логично надо сначало импортировать, после создать экземпляр. А дальше все в коде:

import { world } from "@minecraft/server";
import { ActionFormData } from "@minecraft/server-ui";

world.beforeEvents.itemUse.subscribe((ev) => {
const player = ev.source;

let form = new ActionFormData();
form.title("Заголовок формы");
form.body("Тело формы, тоесть текст в форме");
form.button("Кнопка 1");
form.button("Кнопка 2", "textures/items/stick.png");

form.show(player).then((res) => {
if (res.canceled) return;

if (res.selection === 0) {
player.sendMessage("Это кнопка 1 вывело сообщение");
return;
} else if (res.selection === 1) {
player.sendMessage("Это кнопка 2 с текстуркой палочки вывело сообщение");
return;
};
});
});

Тут мы слушаем событие использование любого предмета, если используют предмет - создается экземпляр формы, в котором мы можем ввести 3 параметра - параметры заголовка, тела формы и их кнопок. В нашем случае мы изменили заголовок, тело формы и создали 2 кнопок. У второй кнопки же мы вводим в доп. параметры текстурки палки. И да - вместо палки можно вставить любую текстурку, и даже свою. Главное укажите путь до файла.

После создания экземпляра и ввода параметров мы его выводим через функцию show, указывая игрока, дабы ему вывести форму. После через then получаем результаты отправки форума, и если игрок нажал на крестик(находиться сверху справа), то форма закрывается посредством возвратной функции return, или же выполняем в нём инструкцию отправки сообщения если игрок не закрывал форму. И тут есть один момент - первая кнопка начинается по счету с 0, вторая - 1 и так далее.


⚙️ Класс "MessageFormData"
Это класс для вывода формы, в экземпляр которого можно записать только заголовок, тело формы и 2 кнопки(без указания текстурки). Пример его использования:

import { world } from "@minecraft/server";
import { MessageFormData } from "@minecraft/server-ui";

world.beforeEvents.itemUse.subscribe((ev) => {
const player = ev.source;

let form = new MessageFormData();
form.title("Заголовок формы");
form.body("Вы хотите пиццу?");
form.button1("Да");
form.button2("Нет");

form.show(player).then((res) => {
if (res.canceled) return;

if (res.selection === 0) {
player.sendMessage("А нет, у меня так-то пиццы нету :3");
return;
} else if (res.selection === 1) {
player.sendMessage("Ладно, у меня итак пиццы не было :3");
return;
};
});
});

Здесь также, как и в прошлом коде, только стоит учитывать что тут не просто button, а только button1 и button2. Только выводимый текст немного другой.
👍3
⚙️ Класс "ModalFormData"
Это форма, которую отличает от других разные виды ввода данных, а именно: текстовые поля, ползунки(слайдеры), выпадающий список и переключатель. В них можно также как и в других вводить заголовок формы, его тело, но вместо кнопок тут другие виды ввода данных, описанные выше. Пример кода ниже:

import { world } from "@minecraft/server";
import { ModalFormData } from "@minecraft/server-ui";

world.beforeEvents.itemUse.subscribe((ev) => {
const player = ev.source;

let form = new ModalFormData();
form.title("Заголовок формы");
form.textField("Введите сюда ваше имя для заказа", "Андрей");
form.dropdown("Выберите пиццу:", ["Моцарелла", "Пеперонни", "Ещё я не придумал"]);
form.slider("Выберите диаметр пиццы(в сантиметрах)", 25, 30, 40);
form.toggle("Хотите в подарок стринги?");

form.show(player).then((res) => {
const [ textField, dropdown, slider, toggle ] = res.formValues;

if (res.canceled) return;

player.sendMessage(`Вы заказали пиццу "${dropdown}" на имя ${textField}, размер пиццы - ${slider} сантиметров, стринги в подарок - ${toggle}`);
});
});

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


Публикация на этом заканчивается! Не забывайте оставлять отклики в виде комментариев и реакциями. А мы ещё свидимся

Помогите :3
👍92🔥2🥰1
На днях наткнутся на видео по созданию кастомного интерфейса в формах(его мы обсуждали в прошлой публикации), правда оно на английском, но я планирую сделать его перевод на русский, и все 5 частей вместить в 1 статью

Вот кстами сами видео:
• 1 часть - https://youtu.be/QhJkCDIZ-NU
• 2 часть - https://youtu.be/CWm-KU5ALOQ
• 3 часть - https://youtu.be/zWecyvsbKHY
• 4 часть - https://youtu.be/Hrpp2Ihg8lU
• 5 часть - https://youtu.be/E21eNDjtAow
👍2
whitedevices.mcpack
3.6 KB
Что-то давно в канале не было публикации. Забыл про него и иногда времени не было. Как-то так, так что вот, держите от меня аддон с открытыми исходниками.
Сам аддон проверяет девайс с которого зашёл игрок, и если в конфиге оно запрещено - кикает. Конфиг в исполняемом файле(index.js)
👍2
Команда разработчиков
whitedevices.mcpack
// Исходники аддона по своей сути являются общественными. Делайте что с ними хотите, хоть украдите и выдавайте за своё.
// По желанию отмечайте меня, автора @shonestew.

// Конфиг, по умолчанию можно зайти со всех 3 платформ. Напишите в строку true - разрешается, false - запрещается.
const allowed_platform = {
allow_desktop: true,
allow_mobile: true,
allow_console: true,
};

// Список игроков, которые попадают под исключение, и не буду кикнуты с запрещенной платформы.
// Проще говоря - вайтлист.
const whiteListPlayers = [
"Notch", "Avogadro",
];

// Причины для кика игрока, зашедшего с запрещенной на сервере платформы.
// Если хотите для всех платформ одинаковую причину, удалите все строки кроме "default_reason".
const reasons = {
desktop_reason: "Вы зашли с запрещенной на сервере платформы,\nИз-за этого вы были кикнуты!",
mobile_reason: "Вы зашли с запрещенной на сервере платформы,\nИз-за этого вы были кикнуты!",
console_reason: "Вы зашли с запрещенной на сервере платформы,\nИз-за этого вы были кикнуты!",
default_reason: "Вы зашли с запрещенной на сервере платформы,\nИз-за этого вы были кикнуты!",
};

console.log("Загружено!");

// Основной код. Как писалось выше, изменяйте как хотите или пиздите исходники, мне по барабану
import { world } from "@minecraft/server";

world.afterEvents.playerSpawn.subscribe((ev) => {
const player = ev.player;
const platform = player.clientSystemInfo.platformType;

if (whiteListPlayers.includes(player.name)) return;

if (platform === "Desktop" && !allowed_platform.allow_desktop) {
world.runCommandAsync(`kick ${player.name} ${reasons.desktop_reason || reasons.default_reason}`);
return;
} else if (platform === "Mobile" && !allowed_platform.allow_mobile) {
world.runCommandAsync(`kick ${player.name} ${reasons.mobile_reason || reasons.default_reason}`);
return;
} else if (platform === "Console" && !allowed_platform.allow_console) {
world.runCommandAsync(`kick ${player.name} ${reasons.console_reason || reasons.default_reason}`);
return;
};
});

Код исполняемого файла(если лень открыть архив)
👍2🤩1
Код для аддона на промокод. Полностью свободный для использования, как обычно :3
const promocodes = [
{
"promocode": "NEWYEAR2007",
"command": "give @s apple"
},
];

import { world, system } from "@minecraft/server";
import { ModalFormData } from "@minecraft/server-ui";

world.beforeEvents.itemUse.subscribe((ev) => {
const player = ev.source;

let form = new ModalFormData();
form.title("Заголовок формы");
form.textField("Введите в текстовое поле ниже промокод", "");

system.run(() => {
form.show(player).then((res) => {
const [ textField ] = res.formValues;

if (res.canceled) return;

promocodes.forEach((data) => {
if (textField === data.promocode) {
player.runCommandAsync(data.command);
return;
} else {
player.runCommandAsync('tellraw @s {"rawtext":[{"text":"Такого промокода не существует!"}]}');
return;
};
});
});
});
});
👍1
🛠 Инструменты разработки: JavaScript
Мне сегодня один подписчик писал. И в ходе разговора он упомянул что он изучал JS и хотел бы видить на канале руководство по JS. Я долго не хотел этого делать, и не собираюсь делать. Но обьяснить что это за ЯП(язык программирования) все таки стоило бы. Итак, начнём!


⬆️ Введение
JavaScript - ЯП, что изначально задумывался как ЯП для веб-разработки. Но его начали использовать как скриптовый язык для написания, к примеру, серверной части проекта(NodeJS в помощь) или даже мобильных приложении(React Native позволяет). Но многие тут JavaScript используют для написания скриптов в аддонах для Майнкрафт Бедрока.


⁉️ Как изучать JavaScript?
Немного теории и много практики! Сам я именно так изучал JavaScript более полгода назад и продолжаю +- также изучать. Но совет может не для всех работать, это чисто индивидуально. Но попробовать стоит.
А насчет ресурсов и руководств - само руководство по JavaScript, можете только 1 главу читать, а остальное после гуглить при необходимости. Также есть другое руководство, от MDN Web Docs. Выбирайте по желанию, но лично я изучал JS по тому первому руководству. Так что вот.


Публикация вышла маленькая, но я попытался некоторые вещички обкашлить, что задавали ребята под комментариями. Повторюсь - полностью изучать JavaScript на этом канале не будем и не собираемся, есть руководства и видео, на котором понятнее чем если бы мы описывали своими словами. Но некоторые функции в ЯП на канале будут изучены. Как-то так
👍1
🆕 Новая релизная версия 1.21.60!
Какие-то фиксы баков и тому подобное. Но тут будет описано только изменения в Script API. А именно:


API Обновление
- Числовые JavaScript-перечисления теперь корректно обрабатывают и поддерживают обратное отображение значений.
- Исправлен баг, из-за которого вызов

Player.hideAllExcept мог вызывать сбой сервера.

InputPermissions

- Следующие значения перечисления InputPermissionCategory перенесены в 1.17.0:
- LateralMovement, Sneak, Jump, Mount, Dismount, MoveForward, MoveBackward, MoveLeft, MoveRight.
- Следующие методы PlayerInputPermissions перенесены в 1.17.0:
- isPermissionCategoryEnabled(permissionCategory: InputPermissionCategory): boolean;
- setPermissionCategory(permissionCategory: InputPermissionCategory, isEnabled: boolean): void;
- Удалено свойство compostingChance из API ItemStack. Теперь шанс компостирования для ванильных предметов доступен через CompostableItemComponent->compostingChance в Item Component API.
- Исправлены редкие случаи, когда ModalFormData автоматически прокручивался вниз при открытии UI.

Новые классы в бета-модуле 1.17.0

- Добавлены скриптовые привязки в бета-версию для функции Aim-Assist:
- class AimAssistCategory
- class AimAssistCategorySettings
- class AimAssistPreset
- class AimAssistPresetSettings
- class AimAssistRegistry
- enum AimAssistTargetMode
- interface PlayerAimAssistSettings
- class PlayerAimAssist
- Метод Player.getAimAssist для изменения настроек Aim-Assist у игрока
- Метод World.getAimAssist для добавления предустановок и категорий Aim-Assist

Ошибки и аргументы

- Добавлено перечисление InvalidArgumentErrorType, предоставляющее дополнительный контекст об ошибках недопустимых аргументов.
- Добавлено свойство type в InvalidArgumentError для проверки типа ошибки аргумента.

Перенесено из бета-модуля в 1.17.0

- Block::isWaterlogged
- Block::setWaterlogged
👍1
Нашёл репозитории с примерами кода. Уже давно про него знал, но не додумался до этого момента его скинуть. Вот сам репозитории:
https://github.com/JaylyDev/ScriptAPI/tree/stable/scripts
👍3
Раз в неделю или того хуже в канале появляется пост))
Так вот, хотел бы с вами поделиться одной мелкой деталью, лично у меня оно возникло час или около того назад.
При попытке отмены события отправки сообщения(ChatSendBeforeEvent) у меня не получается, если эта инструкция отмены находится в
system.run.
Тоесть:

// События, другой код и т.д...
system.run(() => {
ev.cancel = true; // Пытаемся отменить событие, но не получается
// Другой код...
});

Если что, вызовы через system.run мне нужны были для тех команд, которые запрашивали привилегии(в события типа BeforeEvents это частое явление).
Будьте бдительны, и делитесь с такими мелочами под этим постом
👍1
На ChestUI вышло обновление, которое добавляет возможность создать интерфейс в стиле печки через класс FurnaceFormData.
Параметры класса FurnaceFormData:

declare class FurnaceFormData {
/**
* @param isLit Указывает, включена ли печь в пользовательском интерфейсе.
*/
constructor(isLit?: boolean);
/**
* @remarks Количество слотов в интерфейсе печи.
*/
public slotCount: number;
/**
* @remarks Этот метод устанавливает заголовок для интерфейса печи.
* @param text Текст заголовка для интерфейса печи.
*/
title(text: string | RawMessage): FurnaceFormData;
/**
* @remarks Добавляет кнопку в интерфейс печи с иконкой из ресурспака.
* @param slot Слот, в котором будет отображаться предмет. Значение ограничено от 0 до 2.
* @param itemName Название предмета, которое будет отображаться.
* @param itemDesc Описание (лора) предмета, которое будет отображаться.
* @param texture ID типа или путь к текстуре. **НЕОБХОДИМО УКАЗАТЬ ПРЕФИКС ПРЕДМЕТА!** Для ванильных предметов это `minecraft:`. Смотрите `typeIds.js` для действительных предметов и значений данных.
* @param stackAmount Размер стака предмета. Ограничено значениями от 1 до 99.
* @param durability Прочность предмета. По умолчанию 0. Ограничено значениями от 1 до 99.
* @param enchanted Если предмет зачарован, укажите true.
*/
button(slot: number, itemName?: string | RawMessage, itemDesc?: (string | RawMessage)[], texture?: string, stackAmount?: number, durability?: number, enchanted?: boolean): FurnaceFormData;
/**
* @remarks
* Создает и отображает всплывающее окно. Возвращает результат
* асинхронно, когда игрок подтверждает или отменяет
* диалог.
*
* Этот метод не может быть вызван в режиме только для чтения.
*
* @param player
* Игрок, для которого будет отображен этот диалог.
*/
show(player: Player): Promise<ActionFormResponse>;
};

Как-то так. По туториалу на ChestUI - его не будет, скорее всего.
1👍1