👋 Привет! Этот канал посвящен аддонам, а точнее их разработке.
⚙ На этом канале вы сможете найти: примеры кода, публикации с обьяснениями некоторых моментов в скриптах и другое.
❗Если у вас есть предложения для публикации канала, или хотите предоставить свой код для примера, милостью прошу обратиться к одному из админов, а именно:
📑 Документации и учебники:
⚙ На этом канале вы сможете найти: примеры кода, публикации с обьяснениями некоторых моментов в скриптах и другое.
❗Если у вас есть предложения для публикации канала, или хотите предоставить свой код для примера, милостью прошу обратиться к одному из админов, а именно:
@qspkp @NoHaijeSo1o @shonestew
📑 Документации и учебники:
Script API(то, что используется для создания скриптов);
JavaScript(язык программирования, на котором пишутся скрипты);
bedrock.dev(документация к аддонам),
wiki.bedrock.dev(некий учебник и документация к аддонам, также там есть туториалы по скриптам).
👍9❤1🔥1🤔1
Мы уже добавили чат, заходите, задавайте вопросы и просто общайтесь!
👍8❤1🔥1👏1
Мы уже готовим для вас посты, на какую тему вы бы хотели поговорить?
Final Results
62%
Структура аддонов
11%
Что такое «слушатели событий»
27%
Какой проводник лучше исользовать
👍17🤔4👌4🥰2❤1🔥1🎉1🤩1
Команда разработчиков
Мы уже готовим для вас посты, на какую тему вы бы хотели поговорить?
Да, и давайте сразу договоримся, ставьте много реакций, ведь много реакций - много актива!
🔥33❤2🥰2👌2👍1🎉1🤩1
Команда разработчиков
Мы уже готовим для вас посты, на какую тему вы бы хотели поговорить?
Опрос подходит к концу, и вы выбрали тему «структура аддонов», мы уже готовим для вас подробный пост, ждите!
Ну а пока вы ждёте, можете поддержать наш канал: https://t.me/boost/developers_command
Ну а пока вы ждёте, можете поддержать наш канал: https://t.me/boost/developers_command
Telegram
Команда разработчиков.
Проголосуйте за канал, чтобы он получил больше возможностей.
❤2🔥1
📂 Структура аддонов
❓Как устроены аддоны?
📄 Файл manifest.json
🗂 Структорирование в аддонах
Написал пост - @Shonestew
Доброго дня, в этой публикации будет расказываться об структуре аддонов, как они устроены и т.д. Погнали!
❓Как устроены аддоны?
Аддоны внутренне устроены следующим образом - в директории(папка) аддона есть две другие директории - это ресурспак, там лежат текстуры предметов, мобов, настройки интерфейса и т.п., и набор параметров - там лежит файлы, которые обьявляют новый предмет, мобов и т.п. а также описывают им свойства(к примеру, у предметов это прочность, текстура и т.д.).
Каждый пак(набор параметров и ресурспаки обобщено) обьявляют главным файлом manifest.json, которые идентифицируют пак, его название, описание а также подключенные внутри него модули. К примеру, чтобы идентифицировать ресурспак, надо написать в манифест(manifest.json) следующее:
{
"format_version": 2,
"header": {
"name": "Пример манифеста ресурспака",
"description": "Ресурспак",
"uuid": "b603f596-e272-40df-ae7c-05a1dcc610d6",
"version": [1, 0, 0],
"min_engine_version": [1, 20, 0]
},
"modules": [
{
"description": "Модуль для ресурспака",
"type": "resources",
"uuid": "4b71209a-6927-4e29-b297-f8e551cb8ea2",
"version": [1, 0, 0]
}
]
}📄 Файл manifest.json
Давайте же разберём этот код, и поймем какие опции за что отвечают:
format_version - версия формата, для скин-паков - это 1, для ресурспаков и набором параметров - 2.
header - секция заголовка аддона, куда указывается его название, описание, uuid(дальше разберем что это), версия аддона и минимальная версия клиента/сервера, при котором можно ещё установить пак. Его опции:
name - название аддона,
description - его описание,
uuid - 16-байтный идентификатор аддона, позволяет отличать паки. Сгенерировать его можно тут.
version - версия аддона, и кстати - при импорте того же аддона, но с версией, указанной выше заменяется сам аддон и его файлы на версию новее.
min_engine_version - минимальная версия клиента/сервера, при котором можно ещё установить пак.
modules - секция для подключения модулей. В неё можно подключать модули для работы клиентских скриптов, ресурспаков и наборов параметров. Строение подключенного модуля:
description - описание модуля,
type - тип подключаемого модуля, для ресурспаков - resources, для наборов параметров - data,
uuid - идентификатор модуля,
version - версия модуля.
Все эти опции являются обязательными, и без них манифест, и соответственно сам пак, не импортируется в игру. Также есть и другие, необязательные опции, которые можно тоже применять в манифесте, для дополнительной идентификации пака. Для того, чтобы сделать манифест для набора параметров, надо изменить тип подключаемого модуля на data. Подробнее читать про это здесь.
🗂 Структорирование в аддонах
Теперь, когда мы разобрались в строении манифест, можно начать разбираться, как составлять директории в паках.
Для ресурспаков лучшее всего делать расположение директории так:
my_resource_pack/
├── textures/
│ ├── items/
│ │ ├── item1.png
│ │ ├── item2.png
│ │ └── item3.png
│ └── blocks/
│ │ ├── block1.png
│ │ ├── block2.png
│ │ └── block3.png
├── manifest.json
└── pack_icon.png
Это одна из распространенных видов структурирования директории и файлов аддона. В наборе параметров в основном всё так:
my_behavior_pack/
├── items/
│ └── item1.json
│ └── item2.json
│ └── item3.json
├── blocks/
│ └── block1.json
│ └── block2.json
│ └── block3.json
├── manifest.json
└── pack_icon.png
Такие виды структурирования паков очень распространены. Они более удобны для ориентировки по исходникам аддона, и позволяют удобнее делать обновление аддонам в будущем. Но как структурировать аддон остается во многом за вами, но один момент который является обязательным - manifest должен быть в самой главной по иерархии директорией(то есть, в примере это my_resource_pack или my_behavior_pack).
Написал пост - @Shonestew
👍23🔥16🎉12❤11👏2
Команда разработчиков
📂 Структура аддонов Доброго дня, в этой публикации будет расказываться об структуре аддонов, как они устроены и т.д. Погнали! ❓Как устроены аддоны? Аддоны внутренне устроены следующим образом - в директории(папка) аддона есть две другие директории - это ресурспак…
Easy-addon.zip
2.8 KB
Ну а кто не понял, вот вам шаблон для вашего аддона!
[!] Не забудьте заменить uuid.
[!] Не забудьте заменить uuid.
❤9🔥3🤔2👍1
⚙️ Инструменты разработки
🗂 Первая группа: архиваторы и файловые менеджеры.
✍️ Вторая группа: редакторы кода.
➕ И само дополнение, как и писалось в самом начале:
Написал пост - @Shonestew
Как вы знаете, для разработки аддонов требуются некоторые приложения(если у вас смартфон) или программы(если у вас ПК/ноутбук).
В этой публикации будет 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, к примеру ScriptEventCommandMessage поддерживает только afterEvents.
Вот как можно использовать событие которое происходит до сообщения в чате:
Написал пост - @NoHaijeSo1o.
События, к примеру это может быть разрушение блока, использование чего либо, вход игрока, спавн игрока, и т.д.
Основные события находятся здесь в разделе 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: что это и с чем его едят?
📦 Модули в Script API
👨💻Начальная подготовка
P.S. от редактора: извиняюсь за долгое отсутствие постом, были проблемы в жизни, так что я только сейчас смог написать пост
Для начала стоит понять что такое вообще 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. от редактора: извиняюсь за долгое отсутствие постом, были проблемы в жизни, так что я только сейчас смог написать пост
🔥4❤1
📦 Глава "Модули". Модуль @minecraft/server.
⚙️ Класс "World"
⚙️ Класс "Entity"
В прошлой публикации мы обьясняли про модули в 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. Будет либо сегодня либо завтра.
Передавая исходники/код ваших аддонов, вы соглашаетесь что переданное вами становиться свободным для использования
Насчёт новой публикации, оно будет на тему модуля server-ui. Будет либо сегодня либо завтра.
Передавая исходники/код ваших аддонов, вы соглашаетесь что переданное вами становиться свободным для использования
👍4
Dzien dobry!
Давненько ещё наткнулся на архив документации по Script API с 1.19.50 до текущей на момент написания поста(1.21.51), вот само документация:
Выбираете нужную версию на странице, листаете ниже и выбираете нужный модуль и по поиску находите нужный вам класс, функцию или слушатель события. Это полезно тем разработчикам, что всё еще пишут скрипты к примеру на 1.20.5x. Так что советую посмотреть
Давненько ещё наткнулся на архив документации по Script API с 1.19.50 до текущей на момент написания поста(1.21.51), вот само документация:
https://jaylydev.github.io/scriptapi-docs/
Выбираете нужную версию на странице, листаете ниже и выбираете нужный модуль и по поиску находите нужный вам класс, функцию или слушатель события. Это полезно тем разработчикам, что всё еще пишут скрипты к примеру на 1.20.5x. Так что советую посмотреть
jaylydev.github.io
Script API References | JaylyMC
Landing page for Minecraft Bedrock Script API Reference, containing documentation related to experimental and stable Minecraft Script APIs to interact with a Minecraft world programmatically.
👍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".
⚙️ Класс "ActionFormData"
⚙️ Класс "MessageFormData"
В прошлой части мы разбирали основной модуль, требуемый для взаимодействия с миром во многих случаях. Сегодня же мы будем разбирать модуль для отправки формы, дабы таким образом получать информацию.
Такую форму к примеру можно наблюдать при регистрации или входе на сайт. В Майнкрафте же оно выглядет примерно так.
В самом модуле существуют 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"
Публикация на этом заканчивается! Не забывайте оставлять отклики в виде комментариев и реакциями. А мы ещё свидимся
Помогите :3
Это форма, которую отличает от других разные виды ввода данных, а именно: текстовые поля, ползунки(слайдеры), выпадающий список и переключатель. В них можно также как и в других вводить заголовок формы, его тело, но вместо кнопок тут другие виды ввода данных, описанные выше. Пример кода ниже:
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
👍9❤2🔥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
Вот кстами сами видео:
• 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
YouTube
CREATING CUSTOM UI'S WITH JSON UI (Minecraft Bedrock Scripting API and JSON UI)
In this video, I demonstrate how to use JSON UI in combination with the scripting api in the Minecraft Bedrock Edition
🔗Links :
Like What I Am Doing? Concider Supporting Me! : https://ko-fi.com/dingsel
Join my Discord! : https://discord.gg/tzrmH56JXC
My…
🔗Links :
Like What I Am Doing? Concider Supporting Me! : https://ko-fi.com/dingsel
Join my Discord! : https://discord.gg/tzrmH56JXC
My…
👍2
whitedevices.mcpack
3.6 KB
Что-то давно в канале не было публикации. Забыл про него и иногда времени не было. Как-то так, так что вот, держите от меня аддон с открытыми исходниками.
Сам аддон проверяет девайс с которого зашёл игрок, и если в конфиге оно запрещено - кикает. Конфиг в исполняемом файле(index.js)
Сам аддон проверяет девайс с которого зашёл игрок, и если в конфиге оно запрещено - кикает. Конфиг в исполняемом файле(index.js)
👍2