From fee0f35ac202a7212a2c6b9b016f7e2038609030 Mon Sep 17 00:00:00 2001 From: Mirik9724 <145905797+Mirik9724@users.noreply.github.com> Date: Fri, 4 Apr 2025 18:48:03 +1000 Subject: [PATCH 01/28] Create ua.md --- wiki/items/food/ua.md | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 wiki/items/food/ua.md diff --git a/wiki/items/food/ua.md b/wiki/items/food/ua.md new file mode 100644 index 0000000..dc3efbb --- /dev/null +++ b/wiki/items/food/ua.md @@ -0,0 +1,33 @@ +## Додавання їжі + +Цей посібник передбачає, що ви вже ознайомлені з [Створенням вашого першого предмета](first-item). + +Додавання `FoodComponent` до налаштувань предмета робить цей предмет їжею. `FoodComponent` можна створити за допомогою `FoodComponent.Builder`. Спробуйте прочитати документацію (Javadocs) цього будівельника, щоб зрозуміти, що відбувається, або читайте далі для пояснення: + +```java +public static final Item EXAMPLE_FOOD = new Item(new QuiltItemSettings().food( + new FoodComponent.Builder() + .hunger(2) + .saturationModifier(1) + .snack() + .alwaysEdible() + .meat() + .statusEffect(new StatusEffectInstance(StatusEffects.NIGHT_VISION, 10), 0.8f) + .build() +)); +``` + +Тепер, коли ви спробували використати Javadocs _кашель, кашель_, ось альтернативне пояснення: + +1. Ми створюємо новий будівельник. Завдяки цьому ми можемо налаштувати `FoodComponent`, перш ніж перетворити його на справжній `FoodComponent`. Зауважте, що всі наступні значення за замовчуванням рівні 0, false або порожні. +2. Ми встановлюємо голод на 2, що відповідає одному з 10 баранячих м'ясць у Minecraft. +3. Встановлюємо коефіцієнт насичення, який множиться на значення голоду і 2, і додається до насичення. +4. Ми робимо предмет перекусом, що означає, що він буде з'їдений швидко, як сушений водоріст. +5. Ми робимо його завжди їстівним (навіть коли голод повний), як підозріла юшка. +6. Позначаємо предмет як м'ясо, щоб вовки могли його їсти. +7. Додаємо ефект нічного бачення, який буде застосовуватися на 10 секунд з 80% шансом. +8. Нарешті, ми створюємо справжній `FoodComponent` з будівельника за допомогою методу `build`. + +## Що далі? + +Якщо ви хочете продовжити додавання предметів, дивіться [Броня](armor) або [Інструменти](tools). From 2c305eaa18aba69903fcc5a711cab577c1411287 Mon Sep 17 00:00:00 2001 From: Mirik9724 <145905797+Mirik9724@users.noreply.github.com> Date: Fri, 4 Apr 2025 18:48:27 +1000 Subject: [PATCH 02/28] Create ru.md --- wiki/items/food/ru.md | 33 +++++++++++++++++++++++++++++++++ 1 file changed, 33 insertions(+) create mode 100644 wiki/items/food/ru.md diff --git a/wiki/items/food/ru.md b/wiki/items/food/ru.md new file mode 100644 index 0000000..2f86d4b --- /dev/null +++ b/wiki/items/food/ru.md @@ -0,0 +1,33 @@ +## Добавление еды + +Этот урок предполагает, что вы уже ознакомлены с [Созданием вашего первого предмета](first-item). + +Добавление `FoodComponent` в настройки предмета превращает его в еду. `FoodComponent` можно создать с помощью `FoodComponent.Builder`. Попробуйте прочитать документацию (Javadocs) этого строителя, чтобы понять, что происходит, или продолжайте читать для объяснения: + +```java +public static final Item EXAMPLE_FOOD = new Item(new QuiltItemSettings().food( + new FoodComponent.Builder() + .hunger(2) + .saturationModifier(1) + .snack() + .alwaysEdible() + .meat() + .statusEffect(new StatusEffectInstance(StatusEffects.NIGHT_VISION, 10), 0.8f) + .build() +)); +``` + +Теперь, когда вы попробовали использовать Javadocs _кашель, кашель_, вот альтернативное объяснение: + +1. Мы создаем нового строителя. С его помощью мы можем настроить `FoodComponent`, прежде чем превратить его в настоящий `FoodComponent`. Обратите внимание, что все следующие значения по умолчанию равны 0, false или пустые. +2. Мы устанавливаем голод на 2, что соответствует одному из 10 куриных ножек в Minecraft. +3. Устанавливаем коэффициент насыщения, который умножается на значение голода и 2, и добавляется к насыщению. +4. Мы делаем предмет закуской, что означает, что он будет съеден быстро, как сушеные водоросли. +5. Мы делаем его всегда съедобным (даже когда голод полон), как подозрительный суп. +6. Отмечаем его как мясо, чтобы волки могли его есть. +7. Добавляем эффект ночного зрения, который будет длиться 10 секунд с 80% шансом. +8. Наконец, мы создаем настоящий `FoodComponent` с помощью метода `build`. + +## Что дальше? + +Если вы хотите продолжить добавление предметов, смотрите [Броню](armor) или [Инструменты](tools). From 422edcaa56823e72d019e6f838901e9dabc61f43 Mon Sep 17 00:00:00 2001 From: Mirik9724 <145905797+Mirik9724@users.noreply.github.com> Date: Fri, 4 Apr 2025 18:53:28 +1000 Subject: [PATCH 03/28] Create ua.md --- wiki/items/first-item/ua.md | 127 ++++++++++++++++++++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 wiki/items/first-item/ua.md diff --git a/wiki/items/first-item/ua.md b/wiki/items/first-item/ua.md new file mode 100644 index 0000000..c2765f9 --- /dev/null +++ b/wiki/items/first-item/ua.md @@ -0,0 +1,127 @@ +## Створення першого предмета + + + +Предмети є основою Minecraft, і майже будь-який мод буде їх використовувати. У цьому уроці ми розглянемо основні кроки для створення предмета. + +## Реєстрація предмета + +Першим кроком потрібно зареєструвати предмет, щоб гра знала, що потрібно його додати. [Реєстри](../concepts/registries) є невід'ємною частиною Minecraft (і моддингу). Блоки, сутності, предмети, звуки, частинки... всі ці аспекти використовують реєстр. + +--- + +Спочатку потрібно налаштувати місце для предметів вашого мода. Створіть новий клас з назвою `ExampleModItems`, замінивши `ExampleMod` на назву вашого мода, в тому ж пакеті, що і основний клас. Це допоможе нам підтримувати порядок, якщо ваш мод буде розширюватися за межі одного предмета. + +Далі, ми оголосимо екземпляр `net.minecraft.item.Item` з параметрами для нашого предмета. + +Теоретично, ми могли б пропустити цей крок і оголосити предмет прямо під час його реєстрації, але наявність окремої змінної дозволить нам звертатися до неї в інших частинах коду для інших цілей. + +`src/main/com/example/example_mod/ExampleModItems`: + +```java +public class ExampleModItems { + public static final Item EXAMPLE_ITEM = new Item(new QuiltItemSettings()); +} +``` + +Тут `public static final` гарантує, що ми можемо отримати доступ до предмета в інших місцях, але не можемо переназначити саму змінну, що захищає від випадкових змін. + +Новий екземпляр `Item` приймає екземпляр `QuiltItemSettings` як аргумент. Тут ми вказуємо всі налаштування для нашого предмета. Є безліч налаштувань, таких як міцність і розмір стеку, але в цьому випадку ми можемо просто використати налаштування за замовчуванням. + +--- + +Тепер, коли ми оголосили предмет, потрібно зареєструвати його, щоб додати в гру. Для цього створимо новий метод в класі предметів, який буде містити реєстрацію всіх ваших предметів. Зверніть увагу, що ми передаємо в метод `ModContainer`, щоб отримати ID мода. + +`src/main/com/example/example_mod/ExampleModItems`: + +```java +public class ExampleModItems { + // ... + public static void register(ModContainer mod) { + Registry.register(Registries.ITEM, new Identifier(mod.metadata().id(), "example_item"), EXAMPLE_ITEM); + } +} +``` + +`Registry.register()` приймає три параметри: + +- `Registry`, до якого ми хочемо додати предмет. Для предметів це завжди `Registries.ITEM`. +- `Identifier`, який використовується для предмета. Це повинно бути унікальне ім'я. Перша частина — це простір імен (ID мода), далі йде ім'я предмета. Допускаються тільки малі літери, цифри, підкреслення, дефіси, крапки та косі лінії. Щоб перетворити ім'я предмета в цей формат, пишіть все малими літерами і розділяйте слова за допомогою підкреслень. +- Предмет, який ми реєструємо. Тут ми передаємо раніше оголошений предмет. + +Нарешті, потрібно переконатися, що метод `register()` викликається при запуску гри. Для цього викликаємо метод у `ModInitializer` вашого мода ([детальніше про модифікацію ініціалізаторів дивіться тут!](../concepts/sideness#on-mod-initializers)) в методі `onInitialize`: + +`src/main/com/example/example_mod/ExampleMod`: + +```java +public class ExampleMod implements ModInitializer { + // ... + @Override + public void onInitialize(ModContainer mod) { + // ... + ExampleModItems.register(mod); + } +} +``` + +Тепер, якщо ми запустимо гру, ми зможемо видати предмет за допомогою команди: `/give @s simple_item_mod:example_item`! Але він не з'являється у творчому меню, не має текстури, і його ім'я не переведено належним чином. Як це виправити? + +## Додавання предмета до групи + +`ItemGroup` представляють вкладки в творчому меню. Через зміни у версії 1.19.3, ви не можете додавати предмети до груп тільки за допомогою [Quilt Standard Libraries](../concepts/qsl-qfapi#quilt-standard-libraries) (відтепер QSL). Проте [Fabric API](../concepts/qsl-qfapi#fabric-api) має API для цього. Завдяки [Quilted Fabric API](../concepts/qsl-qfapi#quilted-fabric-api), який шаблон мода включає і який користувачі завантажують разом з QSL, ми можемо використовувати його і на Quilt: + +`src/main/com/example/example_mod/ExampleModItems`: + +```java +public class ExampleModItems { + // ... + public static void register(ModContainer mod) { + //... + ItemGroupEvents.modifyEntriesEvent(ItemGroups.INGREDIENTS).register(entries -> { + entries.addItem(EXAMPLE_ITEM); + }); + } +} +``` + +Тут ми використовуємо API `ItemGroupEvents`. Ми отримуємо [подію](../concepts/events) для зміни групи `INGREDIENTS` і реєструємо новий слухач. [Події](../concepts/events) можуть бути використані для виконання дій, наприклад, коли блок зруйнований або навіть просто на кожному тикові. У цьому випадку ми просто додаємо предмет в кінець групи інгредієнтів. Це також додасть його до пошуку в творчому меню. + +## Текстури + +Спочатку потрібно оголосити модель для предмета. Це повідомляє грі, як рендерити предмет. + +`assets/simple_item_mod/models/item/example_item.json`: + +```json +{ + "parent": "item/generated", + "textures": { + "layer0": "simple_item_mod:item/example_item" + } +} +``` + +Для більшості предметів все, що потрібно зробити, це замінити `simple_item_mod` на ID вашого мода і `example_item` на ім'я предмета, яке ви вказали раніше. Переконайтеся, що ви замінили їх як у іменах файлів і папок, так і в самому JSON-файлі. +Текстурний файл, як вказано в моделі, має відповідати шляху, вказаному в `Identifier`. У нашому випадку це `assets/simple_item_mod/textures/item/example_item.png`. + +## Переклад на іншу мову + +Нарешті, потрібно додати переклад. Покладіть це в `assets/simple_item_mod/lang/en_us.json`, замінивши ID мода і ім'я предмета, як і раніше: + +`assets/simple_item_mod/lang/en_us.json`: + +```json +{ + "item.simple_item_mod.example_item": "Example Item" +} +``` + +Замість ID мода та імені предмета поставте ваші значення. + +І ось все! Ваш предмет повністю працює. + +## Що далі? + +Цей урок охоплює лише найбазовіші предмети. Ознайомтесь з іншими уроками по предметах для більш складних варіантів або спробуйте [Додавання простого блоку](../blocks/first-block). + +Якщо ви хочете, щоб ваш предмет мав рецепт, створіть його за допомогою [генератора рецептів від destruc7i0n](https://crafting.thedestruc7i0n.ca/) (ви можете додати предмети вашого мода за допомогою кнопки "Add Item" над списком інгредієнтів) і потім збережіть його в JSON-файл у папці `resources/data/simple_item_mod/recipes/` (замінюючи `simple_item_mod` на ID вашого мода). Деталі по рецептах предметів можна знайти на [спеціальній сторінці рецептів](../data/adding-recipes). From 4d845786a6f1afabf534cb861cb118a61d773902 Mon Sep 17 00:00:00 2001 From: Mirik9724 <145905797+Mirik9724@users.noreply.github.com> Date: Fri, 4 Apr 2025 18:56:38 +1000 Subject: [PATCH 04/28] Create ru.md --- wiki/items/first-item/ru.md | 127 ++++++++++++++++++++++++++++++++++++ 1 file changed, 127 insertions(+) create mode 100644 wiki/items/first-item/ru.md diff --git a/wiki/items/first-item/ru.md b/wiki/items/first-item/ru.md new file mode 100644 index 0000000..1826cd7 --- /dev/null +++ b/wiki/items/first-item/ru.md @@ -0,0 +1,127 @@ +## Создание первого предмета + + + +Предметы являются основой Minecraft, и почти любой мод будет их использовать. В этом уроке мы рассмотрим основные шаги по созданию предмета. + +## Регистрация предмета + +Первым делом нужно зарегистрировать предмет, чтобы игра знала, что нужно добавить его. [Реестры](../concepts/registries) — это неотъемлемая часть Minecraft (и моддинга). Блоки, сущности, предметы, звуки, частицы... все эти аспекты используют реестр. + +--- + +Сначала нужно настроить место для предметов нашего мода. Создайте новый класс под названием `ExampleModItems`, заменив `ExampleMod` на название вашего мода, в том же пакете, что и основной класс. Это поможет нам поддерживать порядок, если наш мод будет расширяться за пределы одного предмета. + +Далее, мы объявим экземпляр `net.minecraft.item.Item` с параметрами для нашего предмета. + +Теоретически, мы могли бы пропустить этот шаг и объявить предмет прямо во время его регистрации, но наличие отдельной переменной позволит нам ссылаться на нее в других частях кода для других целей. + +`src/main/com/example/example_mod/ExampleModItems`: + +```java +public class ExampleModItems { + public static final Item EXAMPLE_ITEM = new Item(new QuiltItemSettings()); +} +``` + +Здесь `public static final` гарантирует, что мы можем получить доступ к предмету в других местах, но не можем переназначить саму переменную, что защищает от случайных изменений. + +Новый экземпляр `Item` принимает экземпляр `QuiltItemSettings` как аргумент. Здесь мы указываем все настройки для нашего предмета. Существует множество настроек, таких как прочность и размер стопки, но в этом случае мы можем просто использовать настройки по умолчанию. + +--- + +Теперь, когда мы объявили предмет, нужно зарегистрировать его, чтобы добавить в игру. Для этого создадим новый метод в классе предметов, который будет содержать регистрации всех ваших предметов. Обратите внимание, что мы передаем в метод `ModContainer`, чтобы получить ID мода. + +`src/main/com/example/example_mod/ExampleModItems`: + +```java +public class ExampleModItems { + // ... + public static void register(ModContainer mod) { + Registry.register(Registries.ITEM, new Identifier(mod.metadata().id(), "example_item"), EXAMPLE_ITEM); + } +} +``` + +`Registry.register()` принимает три параметра: + +- `Registry`, в который мы хотим добавить предмет. Для предметов это всегда `Registries.ITEM`. +- `Identifier`, который используется для предмета. Это должно быть уникальное имя. Первая часть — это пространство имен (ID мода), затем имя предмета. Допускаются только строчные буквы, цифры, подчеркивания, дефисы, точки и слэши. Чтобы преобразовать имя предмета в этот формат, пишите все в нижнем регистре и разделяйте слова с помощью подчеркиваний. +- Предмет, который мы регистрируем. Здесь мы передаем ранее объявленный предмет. + +Наконец, нужно убедиться, что метод `register()` вызывается при запуске игры. Мы делаем это, вызывая метод в `ModInitializer` вашего мода ([подробнее о модификации инициализаторов см. здесь!](../concepts/sideness#on-mod-initializers)) в методе `onInitialize`: + +`src/main/com/example/example_mod/ExampleMod`: + +```java +public class ExampleMod implements ModInitializer { + // ... + @Override + public void onInitialize(ModContainer mod) { + // ... + ExampleModItems.register(mod); + } +} +``` + +Теперь, если мы запустим игру, мы сможем выдать предмет с помощью команды: `/give @s simple_item_mod:example_item`! Но он не появляется в творческом меню, не имеет текстуры и его имя не переведено правильно. Как это исправить? + +## Добавление предмета в группу + +`ItemGroup` представляют вкладки в творческом меню. Из-за изменений в версии 1.19.3 вы не можете добавлять предметы в группы только с помощью [Quilt Standard Libraries](../concepts/qsl-qfapi#quilt-standard-libraries) (отныне QSL). Однако [Fabric API](../concepts/qsl-qfapi#fabric-api) имеет API для этого. Благодаря [Quilted Fabric API](../concepts/qsl-qfapi#quilted-fabric-api), который включает в себя шаблон мода и который пользователи загружают с QSL, мы можем использовать его и на Quilt: + +`src/main/com/example/example_mod/ExampleModItems`: + +```java +public class ExampleModItems { + // ... + public static void register(ModContainer mod) { + //... + ItemGroupEvents.modifyEntriesEvent(ItemGroups.INGREDIENTS).register(entries -> { + entries.addItem(EXAMPLE_ITEM); + }); + } +} +``` + +Здесь мы используем API `ItemGroupEvents`. Мы получаем [событие](../concepts/events) для изменения группы `INGREDIENTS` и регистрируем новый слушатель. [События](../concepts/events) могут использоваться для выполнения действий, например, когда блок разрушен или даже просто на каждом тике. В данном случае мы просто добавляем предмет в конец группы ингредиентов. Это также добавит его в поиск творческого меню. + +## Текстуры + +Сначала нужно объявить модель для предмета. Это говорит игре, как рендерить предмет. + +`assets/simple_item_mod/models/item/example_item.json`: + +```json +{ + "parent": "item/generated", + "textures": { + "layer0": "simple_item_mod:item/example_item" + } +} +``` + +Для большинства предметов все, что вам нужно сделать, это заменить `simple_item_mod` на ID вашего мода и `example_item` на имя предмета, которое вы указали ранее. Убедитесь, что вы заменили их как в именах файлов и папок, так и в самом JSON-файле. +Текстурный файл, как указано в модели, должен соответствовать пути, указанному в `Identifier`. В нашем случае это `assets/simple_item_mod/textures/item/example_item.png`. + +## Перевод на другой язык + +Наконец, нужно добавить перевод. Положите это в `assets/simple_item_mod/lang/en_us.json`, заменив ID мода и имя предмета, как и раньше: + +`assets/simple_item_mod/lang/en_us.json`: + +```json +{ + "item.simple_item_mod.example_item": "Example Item" +} +``` + +Замените ID мода и имя предмета, как и раньше. + +И вот и все! Ваш предмет должен работать полноценно. + +## Что дальше? + +Этот урок охватывает только самые базовые предметы. Ознакомьтесь с другими уроками по предметам для более сложных вариантов или попробуйте [Добавление простого блока](../blocks/first-block). + +Если вы хотите, чтобы ваш предмет имел рецепт, создайте его с помощью [генератора рецептов от destruc7i0n](https://crafting.thedestruc7i0n.ca/) (вы можете добавить предметы вашего мода с помощью кнопки "Add Item" над списком ингредиентов) и затем сохраните его в JSON-файл в папке `resources/data/simple_item_mod/recipes/` (заменив `simple_item_mod` на ID вашего мода). Подробности по рецептам предметов можно найти на [специальной странице рецептов](../data/adding-recipes). From 79d361ea81cc2df21e20a31c8b1c4dc84dae17d9 Mon Sep 17 00:00:00 2001 From: Mirik9724 <145905797+Mirik9724@users.noreply.github.com> Date: Fri, 4 Apr 2025 19:09:10 +1000 Subject: [PATCH 05/28] Create ru.md --- wiki/items/armor/ru.md | 162 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 162 insertions(+) create mode 100644 wiki/items/armor/ru.md diff --git a/wiki/items/armor/ru.md b/wiki/items/armor/ru.md new file mode 100644 index 0000000..02a3a04 --- /dev/null +++ b/wiki/items/armor/ru.md @@ -0,0 +1,162 @@ +# Добавление сета брони + +Этот гайд предполагает, что вы уже знакомы с созданием своего первого предмета ([Создание первого предмета](first-item)). + +## Создание материала брони + +Чтобы добавить комплект брони, нужно начать с создания материала брони. Это определяет основные характеристики вашей брони, такие как прочность, уровень защиты или стойкость. +Для этого нужно создать новый класс материала брони: + +`src/main/com/example/example_mod/ExampleArmorMaterial`: + +```java +public class ExampleArmorMaterial implements ArmorMaterial { + //... +``` + +Замените путь на соответствующие значения для вашего мода, а название материала брони выберите согласно основному ресурсу. Например, материал брони, основанный на изумрудах, будет называться `EmeraldArmorMaterial`. Вы также можете использовать `enum`, если у вас есть несколько различных типов брони, так же как это делает Minecraft. + +--- + +Теперь давайте добавим значения прочности и защиты: + +```java +private static final int[] DURABILITY = new int[]{100,160,100,100}; +private static final int[] PROTECTION = new int[]{2,8,4,2}; +@Override +public int getDurability(ArmorItem.ArmorSlot slot) { + return DURABILITY[slot.getEquipmentSlot().getEntitySlotId()]; +} + +@Override +public int getProtection(ArmorItem.ArmorSlot slot) { + return PROTECTION[slot.getEquipmentSlot().getEntitySlotId()]; +} +``` + +Здесь мы используем удобный трюк: `slot.getEquipmentSlot().getEntitySlotId()` возвращает значение от 0 до 3 в зависимости от части брони, так что мы можем использовать эти значения как индекс для массива. +Защита соответствует значению брони. + +--- + +Далее мы определим [Enchantability](https://minecraft.wiki/w/Enchanting_mechanics#Enchantability). Это определяет, насколько хорошо чарования, полученные на столе для зачаровывания, работают. Например, броня из нетерита и золота имеет высокий [Enchantability](https://minecraft.wiki/w/Enchanting_mechanics#Enchantability). + +```java +@Override +public int getEnchantability() { + return 10; +} +``` + +--- + +Теперь время указать звук надевания. Если вы хотите добавить свой собственный звук, посмотрите на [Добавление звуков](../misc/sounds). Если хотите использовать уже существующий, можете использовать `SoundEvents.ITEM_ARMOR_EQUIP_GENERIC`, как показано в примере. + +```java +@Override +public SoundEvent getEquipSound() { + return SoundEvents.ITEM_ARMOR_EQUIP_GENERIC; +} +``` + +--- + +Теперь нужно указать ингредиенты для ремонта, в данном случае используем предмет, созданный в [Создании первого предмета](first-item): + +```java +@Override +public Ingredient getRepairIngredient() { + return Ingredient.ofItems(ExampleMod.EXAMPLE_ITEM); +} +``` + +--- + +Наконец, нужно указать имя материала брони, его стойкость и сопротивление отталкиванию. +Имя материала должно обычно соответствовать названию основного предмета, из которого изготовлена ваша броня. Стойкость помогает уменьшать получаемый урон и отталкивание, а сопротивление отталкиванию работает только для брони из нетерита в ванильном Minecraft, но было добавлено для других броневых материалов через [QSL](../concepts/qsl-qfapi). + +```java +@Override +public String getName() { + return "example_item"; +} +``` + +```java +@Override +public float getToughness() { + return 2; +} +``` + +```java +@Override +public float getKnockbackResistance() { + return 0.2f; +} +``` + +## Добавление самих предметов + +Теперь, когда мы объявили материал брони, давайте добавим сами предметы брони: + +```java +public static final ArmorMaterial EXAMPLE_ARMOR_MATERIAL = new ExampleArmorMaterial(); +public static final Item EXAMPLE_HELMET = new ArmorItem(EXAMPLE_ARMOR_MATERIAL, ArmorItem.ArmorSlot.HELMET, new QuiltItemSettings()); +public static final Item EXAMPLE_CHESTPLATE = new ArmorItem(EXAMPLE_ARMOR_MATERIAL, ArmorItem.ArmorSlot.CHESTPLATE, new QuiltItemSettings()); +public static final Item EXAMPLE_LEGGINGS = new ArmorItem(EXAMPLE_ARMOR_MATERIAL, ArmorItem.ArmorSlot.LEGGINGS, new QuiltItemSettings()); +public static final Item EXAMPLE_BOOTS = new ArmorItem(EXAMPLE_ARMOR_MATERIAL, ArmorItem.ArmorSlot.BOOTS, new QuiltItemSettings()); +``` + +Сначала мы инициализируем материал брони и сохраняем его в финальной статической переменной. Затем мы создаем сами предметы, чтобы зарегистрировать их позже. Обратите внимание, что мы создаем `ArmorItem` в каждом случае и просто передаем `ArmorItem.ArmorSlot`, чтобы указать, какой слот использовать. В конце передаем настройки, так как размер стека для брони автоматически устанавливается на 1, поэтому мы передаем стандартные настройки. + +--- + +Теперь регистрируем броню в инициализаторе мода и добавляем её в группу боевых предметов. Здесь есть два момента, на которые нужно обратить внимание: + +1. Мы называем предметы брони как имя материала + его вариант. +2. Мы добавляем их в группу предметов, используя метод `addAfter`. Так как это броня, мы хотим, чтобы она отображалась рядом с уже существующей броней, поэтому используем этот метод, который позволяет добавлять несколько предметов после уже имеющегося предмета. + +```java +Registry.register(Registries.ITEM, new Identifier(mod.metadata().id(), "example_item_helmet"), EXAMPLE_HELMET); +Registry.register(Registries.ITEM, new Identifier(mod.metadata().id(), "example_item_chestplate"), EXAMPLE_CHESTPLATE); +Registry.register(Registries.ITEM, new Identifier(mod.metadata().id(), "example_item_leggings"), EXAMPLE_LEGGINGS); +Registry.register(Registries.ITEM, new Identifier(mod.metadata().id(), "example_item_boots"), EXAMPLE_BOOTS); +ItemGroupEvents.modifyEntriesEvent(ItemGroups.COMBAT).register(entries -> { + entries.addAfter(Items.NETHERITE_BOOTS, EXAMPLE_HELMET, EXAMPLE_CHESTPLATE, EXAMPLE_LEGGINGS, EXAMPLE_BOOTS); +}); +``` + +## Добавление текстур для брони + +Теперь, когда броня зарегистрирована, осталось только добавить текстуры и переводы. +Для брони нужно предоставить две текстуры: одну для самих предметов и одну для брони, которая будет отображаться на модели игрока. + +--- + +Добавление текстуры для предмета такое же, как и для обычного предмета: вам нужно добавить модель и текстуру. Вот пример модели для шлема: + +```json +{ + "parent": "item/generated", + "textures": { + "layer0": "example_mod:item/example_item_helmet" + } +} +``` + +Повторите это для всех ваших предметов брони, заменив `example_mod` и `example_item_helmet` на ваш мод и название предмета, а также добавьте соответствующие текстуры. + +--- + +Теперь броня должна правильно отображаться в инвентаре, но когда вы её оденете, она всё равно будет показывать отсутствующую текстуру. Для того, чтобы это работало, нужно также добавить модель брони. Модель брони обычно состоит из двух текстур, организованных, как кожа игрока. Однако разные части брони рисуют разные части этой текстуры. +Ботинки, шлем и нагрудник используют текстуру `layer_1` (и имеют большее расстояние от кожи игрока), а штаны используют текстуру `layer_2`. +Если хотите, вы можете использовать этот шаблон текстуры. Разные части брони используют разные оттенки, чтобы помочь отличать их. + +`assets/minecraft/models/armor/example_item_layer_1.png`: +![Текстура брони для layer 1](path_to_example_item_layer_1.png) + +`assets/minecraft/models/armor/example_item_layer_2.png`: +![Текстура брони для layer 2](path_to_example_item_layer_2.png) + +Замените `example_item` на название вашего материала брони в пути. Важно, чтобы пути соответствовали указанным моделям. From f20d68d5c325c991119ce4b8d7c809b26ef356a5 Mon Sep 17 00:00:00 2001 From: Mirik9724 <145905797+Mirik9724@users.noreply.github.com> Date: Fri, 4 Apr 2025 19:10:47 +1000 Subject: [PATCH 06/28] Create ua.md --- wiki/items/armor/ua.md | 164 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 164 insertions(+) create mode 100644 wiki/items/armor/ua.md diff --git a/wiki/items/armor/ua.md b/wiki/items/armor/ua.md new file mode 100644 index 0000000..ca97071 --- /dev/null +++ b/wiki/items/armor/ua.md @@ -0,0 +1,164 @@ +# Додавання сета броні + +Цей посібник припускає, що ви вже розумієте, як створювати свій перший предмет ([Creating your First Item](first-item)). + +## Створення матеріалу броні + +Щоб додати комплект броні, потрібно почати з створення матеріалу броні. Це визначає основні властивості вашої броні, такі як міцність, рівень захисту або витривалість. +Для цього потрібно створити новий клас матеріалу броні: + +`src/main/com/example/example_mod/ExampleArmorMaterial`: + +```java +public class ExampleArmorMaterial implements ArmorMaterial { + //... +``` + +Замініть шлях на відповідні значення для вашого мода, а назву матеріалу броні виберіть згідно з основним ресурсом. Наприклад, матеріал броні, який базується на смарагдах, буде називатися `EmeraldArmorMaterial`. Ви також можете використовувати `enum`, якщо у вас є кілька різних типів броні, так само як це робить Minecraft. + +--- + +Тепер давайте додамо значення міцності та захисту: + +```java +private static final int[] DURABILITY = new int[]{100,160,100,100}; +private static final int[] PROTECTION = new int[]{2,8,4,2}; +@Override +public int getDurability(ArmorItem.ArmorSlot slot) { + return DURABILITY[slot.getEquipmentSlot().getEntitySlotId()]; +} + +@Override +public int getProtection(ArmorItem.ArmorSlot slot) { + return PROTECTION[slot.getEquipmentSlot().getEntitySlotId()]; +} +``` + +Тут ми використовуємо зручний трюк: `slot.getEquipmentSlot().getEntitySlotId()` повертає значення між 0 та 3 в залежності від частини броні, тому ми можемо використовувати ці значення як індекс для масиву. +Захист відповідає значенню броні. + +--- + +Далі ми визначимо [Enchantability](https://minecraft.wiki/w/Enchanting_mechanics#Enchantability). Це визначає, наскільки добре чарівності, отримані в столику для чарування, працюють. Наприклад, броня з нетеріту та золота має високу [Enchantability](https://minecraft.wiki/w/Enchanting_mechanics#Enchantability). + +```java +@Override +public int getEnchantability() { + return 10; +} +``` + +--- + +Тепер час визначити звук одягання. Якщо ви хочете додати свій власний звук, подивіться на [Додавання звуків](../misc/sounds). Якщо ви хочете використовувати існуючий звук, ви можете використати `SoundEvents.ITEM_ARMOR_EQUIP_GENERIC`, як показано в прикладі. + +```java +@Override +public SoundEvent getEquipSound() { + return SoundEvents.ITEM_ARMOR_EQUIP_GENERIC; +} +``` + +--- + +Тепер потрібно вказати інгредієнти для ремонту, в даному випадку використаємо прикладний предмет з [Creating your First Item](first-item): + +```java +@Override +public Ingredient getRepairIngredient() { + return Ingredient.ofItems(ExampleMod.EXAMPLE_ITEM); +} +``` + +--- + +Нарешті, потрібно вказати ім'я матеріалу броні, його витривалість та опір до відштовхування. +Ім'я матеріалу повинно зазвичай відповідати назві основного предмета, з якого виготовлена ваша броня. Витривалість допомагає зменшувати значний шкоди та відштовхування, а опір до відштовхування працює лише для броні з нетеріту у ванільному Minecraft, але він був доданий для інших броньових матеріалів завдяки [QSL](../concepts/qsl-qfapi). + +```java +@Override +public String getName() { + return "example_item"; +} +``` + +```java +@Override +public float getToughness() { + return 2; +} +``` + +```java +@Override +public float getKnockbackResistance() { + return 0.2f; +} +``` + +## Додавання самих предметів + +Тепер, коли ми оголосили матеріал броні, давайте додамо самі предмети броні: + +```java +public static final ArmorMaterial EXAMPLE_ARMOR_MATERIAL = new ExampleArmorMaterial(); +public static final Item EXAMPLE_HELMET = new ArmorItem(EXAMPLE_ARMOR_MATERIAL, ArmorItem.ArmorSlot.HELMET, new QuiltItemSettings()); +public static final Item EXAMPLE_CHESTPLATE = new ArmorItem(EXAMPLE_ARMOR_MATERIAL, ArmorItem.ArmorSlot.CHESTPLATE, new QuiltItemSettings()); +public static final Item EXAMPLE_LEGGINGS = new ArmorItem(EXAMPLE_ARMOR_MATERIAL, ArmorItem.ArmorSlot.LEGGINGS, new QuiltItemSettings()); +public static final Item EXAMPLE_BOOTS = new ArmorItem(EXAMPLE_ARMOR_MATERIAL, ArmorItem.ArmorSlot.BOOTS, new QuiltItemSettings()); +``` + +Спочатку ми ініціалізуємо матеріал броні та зберігаємо його в фінальній статичній змінній. Потім ми створюємо самі предмети, щоб зареєструвати їх пізніше. Зазначте, що ми створюємо `ArmorItem` у всіх випадках і просто передаємо `ArmorItem.ArmorSlot`, щоб вказати, який слот використовувати. В кінці передаємо налаштування, оскільки розмір стеку для броні автоматично встановлюється на 1, тому ми передаємо стандартні налаштування. + +--- + +Тепер реєструємо броню в ініціалізаторі мода та додаємо її до групи бою. Тут є два моменти, на які потрібно звернути увагу: + +1. Ми називаємо предмети броні як ім'я матеріалу + його варіант. +2. Ми додаємо їх до групи предметів, використовуючи метод `addAfter`. Оскільки це броня, ми хочемо, щоб вона відображалась поруч з усією ванільною бронею, тому використовуємо цей метод, який дозволяє додавати кілька предметів після вже наявного предмета. + +```java +Registry.register(Registries.ITEM, new Identifier(mod.metadata().id(), "example_item_helmet"), EXAMPLE_HELMET); +Registry.register(Registries.ITEM, new Identifier(mod.metadata().id(), "example_item_chestplate"), EXAMPLE_CHESTPLATE); +Registry.register(Registries.ITEM, new Identifier(mod.metadata().id(), "example_item_leggings"), EXAMPLE_LEGGINGS); +Registry.register(Registries.ITEM, new Identifier(mod.metadata().id(), "example_item_boots"), EXAMPLE_BOOTS); +ItemGroupEvents.modifyEntriesEvent(ItemGroups.COMBAT).register(entries -> { + entries.addAfter(Items.NETHERITE_BOOTS, EXAMPLE_HELMET, EXAMPLE_CHESTPLATE, EXAMPLE_LEGGINGS, EXAMPLE_BOOTS); +}); +``` + +## Додавання текстур для броні + +Тепер, коли броня зареєстрована, залишилося тільки додати текстури та переклади. +Для броні потрібно надати дві текстури: одну для самих предметів і одну для броні, яка буде відображатися на моделі гравця. + +--- + +Додавання текстури до предмета таке ж, як і для звичайного предмета: вам потрібно додати модель і текстуру. Ось модельний файл для прикладу шолома: + +```json +{ + "parent": "item/generated", + "textures": { + "layer0": "example_mod:item/example_item_helmet" + } +} +``` + +Повторіть це для всіх ваших предметів броні, замінивши `example_mod` та `example_item_helmet` на ваш мод і назву предмета, а також додайте відповідні текстури. + +--- + +Тепер броня повинна правильно відображатися в інвентарі, але коли ви її одягнете, вона все одно буде показувати відсутню текстуру. Для того, щоб це працювало, потрібно також додати модель броні. Модель броні зазвичай складається з двох текстур, організованих, як шкіра гравця. Однак різні частини броні малюють різні частини цієї текстури. +Черевики, шолом і нагрудник використовують текстуру `layer_1` (і мають більшу відстань від шкіри гравця), а штани використовують текстуру `layer_2`. +Якщо хочете, ви можете використовувати цей шаблон текстури. Різні частини броні використовують різні тони, щоб допомогти відрізняти їх. + +`assets/minecraft/models/armor/example_item_layer_1.png`: +![Текстура броні для layer 1](path_to_example_item_layer_1.png) + +`assets/minecraft/models/armor/example_item_layer_2.png`: +![Текстура броні для layer 2](path_to_example_item_layer_2.png) + +Замість `example_item` використовуйте назву вашого матеріалу броні в шляху. Важливо, + + щоб шляхи відповідали вказаним моделям. From c1469e1c2a16e044dbaab3f66ba5b8be984a8f03 Mon Sep 17 00:00:00 2001 From: Mirik9724 <145905797+Mirik9724@users.noreply.github.com> Date: Fri, 4 Apr 2025 19:23:53 +1000 Subject: [PATCH 07/28] Create ru.md --- wiki/introduction/setting-up/ru.md | 117 +++++++++++++++++++++++++++++ 1 file changed, 117 insertions(+) create mode 100644 wiki/introduction/setting-up/ru.md diff --git a/wiki/introduction/setting-up/ru.md b/wiki/introduction/setting-up/ru.md new file mode 100644 index 0000000..75abb8e --- /dev/null +++ b/wiki/introduction/setting-up/ru.md @@ -0,0 +1,117 @@ +# Настройка среды разработки + +Перед началом тебе понадобится несколько вещей: + +- **JDK для Java 17** (рекомендуется) или новее. + Рекомендуем использовать Temurin JDK от Adoptium: + Ссылка: + +- **Любая среда разработки для Java**, например [IntelliJ IDEA](https://www.jetbrains.com/idea/) или [Eclipse](https://www.eclipse.org/ide/). + Также можно использовать [Visual Studio Code](https://code.visualstudio.com/), но его нужно дополнительно настраивать. + - **Рекомендуем IntelliJ IDEA**, так как у неё лучшая интеграция и самый простой старт. + +Далее нужно выбрать: [скачать шаблон мода в виде ZIP](#template-mod-download-zip-file) или [использовать шаблон с GitHub](#template-mod-download-github-template). +Если ты не знаешь, как пользоваться git — выбирай первый вариант. Но всё же лучше зарегистрироваться на GitHub и освоить основы. + +--- + +## Скачивание шаблона мода (ZIP-архив) + +Шаблон мода можно скачать с репозитория [quilt-template-mod](https://github.com/QuiltMC/quilt-template-mod). + +Открой [репозиторий на GitHub](https://github.com/QuiltMC/quilt-template-mod), +нажми кнопку `< > Code`, затем — `Download ZIP`. + +Распакуй содержимое ZIP-архива в любую удобную папку на компьютере. + +--- + +## Скачивание шаблона мода (GitHub Template) + +Чтобы использовать [шаблон с GitHub](https://github.com/QuiltMC/quilt-template-mod), перейди по ссылке и нажми `Use this template`. +Создай свой репозиторий и клонируй его с помощью git. После этого можешь продолжить работу. + +--- + +## Настройка IntelliJ IDEA + +Открой IntelliJ IDEA и пройди первичную настройку. Затем открой проект: + +- Если ты скачал ZIP и распаковал его — нажми `Open` и выбери папку проекта. +- Если создал репозиторий на GitHub — используй `Get from VCS`. + +Если появится окно с вопросом, доверяешь ли ты проекту — нажми **`Trust Project`**. + +**Рекомендуется установить плагин Minecraft Development:** + + +--- + +## Обзор интерфейса IntelliJ IDEA + +После открытия проекта ты увидишь несколько панелей: + +- **Слева вверху** — кнопка с папкой открывает `Project`, где находятся файлы. +- **Слева внизу** — терминал (`Terminal`) и система контроля версий (`Version Control System`). +- **Справа** — уведомления, `Gradle`, `Run`, `Build`. + +Файлы открываются по центру. Чтобы переименовать файл или переменную — кликни правой кнопкой и выбери `Refactor > Rename`. + +--- + +## Сделай мод своим + +1. Придумай название мода, например: `Bingus Mod`. +2. Придумай ID мода: только строчные буквы и подчёркивания. Например: `bingus_mod`. +3. Укажи **maven_group** — это имя разработчика. Если у тебя есть GitHub — можно использовать, например: + `io.github.твой_ник`, заменив спецсимволы на подчёркивания. + +### Пример `gradle.properties`: + +```gradle +# Свойства Gradle +org.gradle.jvmargs = -Xmx1G +org.gradle.parallel = true + +# Свойства мода +version = 1.0.0 +maven_group = io.github.bingus +archives_base_name = bingus-mod +``` + +> В `archives_base_name` нужно использовать **дефисы (-)**, а не подчёркивания. + +--- + +### Измени `quilt.mod.json` + +Файл находится в `src/main/resources`. Пример: + +```json +{ + "schema_version": 1, + "quilt_loader": { + "group": "io.github.bingus", + "id": "bingus_mod", + "version": "${version}", + "metadata": { + "name": "Bingus Mod", + "description": "Этот мод добавляет Бингуса в Minecraft!", + "contributors": { + "Bingus": "Разработчик" + }, + "contact": { + "homepage": "https://example.org" + }, + "icon": "assets/bingus_mod/icon.png" + }, + "intermediate_mappings": "net.fabricmc:intermediary", + "entrypoints": { + "init": "io.github.bingus.bingus_mod.BingusMod" + }, + "depends": [ + // ... + ] + } +} +``` From 268106e8f1af15dc5c4db0864ff9c5c69fa979d0 Mon Sep 17 00:00:00 2001 From: Mirik9724 <145905797+Mirik9724@users.noreply.github.com> Date: Fri, 4 Apr 2025 19:25:11 +1000 Subject: [PATCH 08/28] Create ua.md --- wiki/introduction/setting-up/ua.md | 115 +++++++++++++++++++++++++++++ 1 file changed, 115 insertions(+) create mode 100644 wiki/introduction/setting-up/ua.md diff --git a/wiki/introduction/setting-up/ua.md b/wiki/introduction/setting-up/ua.md new file mode 100644 index 0000000..d1a9f1e --- /dev/null +++ b/wiki/introduction/setting-up/ua.md @@ -0,0 +1,115 @@ +# Налаштування середовища розробки + +Перед тим як почати, тобі знадобляться кілька речей. + +- **JDK для Java 17** (рекомендовано) або новіше. + Темурін Adoptium JDK легко доступний і рекомендований. + Завантажити можна тут: + +- **Будь-яке середовище розробки Java**, наприклад [IntelliJ IDEA](https://www.jetbrains.com/idea/) або [Eclipse](https://www.eclipse.org/ide/). + Також можна використовувати [Visual Studio Code](https://code.visualstudio.com/), але його потрібно додатково налаштувати. + - Ми рекомендуємо **IntelliJ IDEA**, оскільки воно має найбільшу інтеграцію та найпростіше у використанні. + +Далі потрібно вирішити, чи ти хочеш [завантажити шаблон моду у вигляді ZIP-файлу](#template-mod-download-zip-file), чи [використати шаблон з GitHub](#template-mod-download-github-template). Якщо ти не знаєш, як користуватись git, обери перший варіант. Але все ж рекомендовано створити акаунт на GitHub і швидко ознайомитися з git. + +--- + +## Завантаження шаблону моду (ZIP-файл) + +Можна завантажити шаблон моду з репозиторію [quilt-template-mod](https://github.com/QuiltMC/quilt-template-mod). + +Для цього відкрий [репозиторій на GitHub](https://github.com/QuiltMC/quilt-template-mod), +натисни кнопку `< > Code`, а потім — `Download ZIP`. + +Розпакуй вміст ZIP-файлу в будь-яку теку на своєму комп’ютері. + +--- + +## Завантаження шаблону моду (GitHub Template) + +Щоб використати [шаблон з GitHub](https://github.com/QuiltMC/quilt-template-mod), відвідай репозиторій і натисни кнопку `Use this template`. Далі виконай вказівки та клонуй репозиторій за допомогою git. Потім можна продовжувати роботу. + +--- + +## Налаштування IntelliJ IDEA + +Відкрий IntelliJ IDEA та виконай початкове налаштування. Потім відкрий свій проєкт: + +- Якщо ти завантажив ZIP-файл та розпакував його, натисни кнопку `Open` у списку проєктів і вибери теку з модом. +- Якщо ти створив репозиторій на GitHub, скористайся кнопкою `Get from VCS`. + +Якщо з’явиться вікно з питанням, чи довіряєш ти проєкту — натисни **`Trust Project`**. + +**Рекомендується встановити плагін для підтримки Minecraft-модів:** + + +--- + +## Огляд IntelliJ IDEA + +Після відкриття проєкту ти побачиш вікно з кількома панелями: + +- **Зліва вгорі** — іконка папки відкриває `Project`, де знаходяться файли проєкту. +- **Зліва внизу** — кнопки `Terminal` і `Version Control System`. +- **Справа** — кнопки `Notifications`, `Gradle`, `Run` і `Build`. + +Файли відкриваються в центральній частині вікна. Якщо хочеш перейменувати файл або змінну, клацни правою кнопкою і вибери `Refactor > Rename`. + +--- + +## Зроби мод своїм + +1. Придумай назву моду, наприклад: `Bingus Mod`. +2. Створи ID моду: лише малі літери та підкреслення. Наприклад: `bingus_mod`. +3. Вкажи **Maven-групу**: вона ідентифікує автора. Якщо маєш GitHub — можна використовувати: + `io.github.твій_нік_на_github`, замінюючи спецсимволи на підкреслення. + +### Приклад `gradle.properties`: + +```gradle +# Gradle Properties +org.gradle.jvmargs = -Xmx1G +org.gradle.parallel = true + +# Mod Properties +version = 1.0.0 +maven_group = io.github.bingus +archives_base_name = bingus-mod +``` + +> У назві `archives_base_name` потрібно використовувати **дефіси (-)** замість підкреслень. + +--- + +### Онови `quilt.mod.json` + +Файл знаходиться в `src/main/resources`. Зміні на своє: + +```json +{ + "schema_version": 1, + "quilt_loader": { + "group": "io.github.bingus", + "id": "bingus_mod", + "version": "${version}", + "metadata": { + "name": "Bingus Mod", + "description": "Цей мод додає Bingus-а до Minecraft!", + "contributors": { + "Bingus": "Розробник" + }, + "contact": { + "homepage": "https://example.org" + }, + "icon": "assets/bingus_mod/icon.png" + }, + "intermediate_mappings": "net.fabricmc:intermediary", + "entrypoints": { + "init": "io.github.bingus.bingus_mod.BingusMod" + }, + "depends": [ + // ... + ] + } +} +``` From 559735f20db1900536d53275755ae950d530aed6 Mon Sep 17 00:00:00 2001 From: Mirik9724 <145905797+Mirik9724@users.noreply.github.com> Date: Fri, 4 Apr 2025 19:30:15 +1000 Subject: [PATCH 09/28] Create ru.md --- wiki/introduction/getting-started/ru.md | 46 +++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 wiki/introduction/getting-started/ru.md diff --git a/wiki/introduction/getting-started/ru.md b/wiki/introduction/getting-started/ru.md new file mode 100644 index 0000000..19fdf5d --- /dev/null +++ b/wiki/introduction/getting-started/ru.md @@ -0,0 +1,46 @@ +# Начало работы с Quilt + +## Основные требования + +Чтобы начать создавать моды для Minecraft, тебе нужно знать несколько вещей: + +- **Базовые знания Java**. Это включает понимание синтаксиса, объектно-ориентированного программирования и некоторых основных шаблонов проектирования. +- **Базовые знания [Git](https://git-scm.com/)**. Хотя это технически необязательно, Git серьёзно упростит тебе жизнь. Нужно понимать, как клонировать репозитории и делать коммиты. Отличные ресурсы: [документация Git](https://git-scm.com/doc) и [документация GitHub](https://docs.github.com/en/get-started). + + + +## Как пользоваться этой вики + + + +Эта вики построена так, что статьи лучше читать по порядку. Многие из них, особенно в начале, указывают, какие материалы стоит изучить дальше. Большинство страниц содержат фрагменты кода, а в будущем планируется добавить полноценные примеры модов (пока не реализовано). + +В следующей статье ты настроишь свой первый мод для начала разработки. + +После этого рекомендуется прочитать [Создание первого предмета](../items/first-item). Затем можно переходить к [добавлению блоков](../blocks/first-block) или к созданию более сложных предметов, таких как [еда](../items/food), [инструменты](../items/tools) и [броня](../items/armor). + +Для более общего понимания можно перейти в раздел "Концепции": + +- В [Обзор QSL и QFAPI](../concepts/qsl-qfapi) ты получишь общее представление о Quilt Standard Libraries и Quilted Fabric API — официальных API проекта Quilt. + +Планируется ещё много статей, но они пока не написаны ([Issue #69](https://github.com/QuiltMC/developer-wiki/issues/69)). Этот раздел будет обновляться. + + + +## Как учиться моддингу для новичков + +Создание модов для Minecraft может быть сложным. Мы стараемся предоставить ресурс, который поможет тебе освоить базовые концепции моддинга. Однако есть вещи, которые ты должен изучить сам. + +Не бойся задавать вопросы — мы всегда готовы помочь и никого не осуждаем. + +Когда задаешь вопрос, старайся сразу дать нужный контекст: опиши проблему, что ты уже пробовал и почему это не сработало. Чем больше информации ты дашь — тем быстрее тебе смогут помочь. При отладке приложи файл `latest.log`, а при краше — лог краша. Также очень полезно предоставить доступ к своему исходному коду — желательно, через GitHub. + +Задавать вопросы можно на нашем [форуме](https://forum.quiltmc.org/), а также в канале [mod-dev-help](https://discord.com/channels/817576132726620200/1047429688521396325) на нашем [Discord-сервере](https://discord.quiltmc.org/) + +Многие проблемы в моддинге уже были решены ранее, и ты можешь найти готовые решения — большинство модов для Quilt с открытым исходным кодом. Мы рекомендуем смотреть, как что-то реализовано в других проектах, и "подглядывать" или даже копировать решения — открытые репозитории созданы для обучения. Не бойся их! + +Есть темы, по которым пока нет хороших туториалов. В таких случаях тебе, возможно, придётся читать код Minecraft или изучать, как похожие задачи решаются в других модах. И снова — не бойся просить помощи, если что-то непонятно! + +Если хочешь посмотреть исходный код Minecraft, запусти задачу Gradle `genSourcesWithVineflower` в категории `fabric`, либо открой любой файл Minecraft в IntelliJ IDEA и нажми кнопку "скачать исходники". + + From 68c34fc2f4fe9279a962bd157624c65c627d0a60 Mon Sep 17 00:00:00 2001 From: Mirik9724 <145905797+Mirik9724@users.noreply.github.com> Date: Fri, 4 Apr 2025 19:31:27 +1000 Subject: [PATCH 10/28] Create ua.md --- wiki/introduction/getting-started/ua.md | 46 +++++++++++++++++++++++++ 1 file changed, 46 insertions(+) create mode 100644 wiki/introduction/getting-started/ua.md diff --git a/wiki/introduction/getting-started/ua.md b/wiki/introduction/getting-started/ua.md new file mode 100644 index 0000000..c5f2c9c --- /dev/null +++ b/wiki/introduction/getting-started/ua.md @@ -0,0 +1,46 @@ +# Початок роботи з Quilt + +## Базові вимоги + +Щоб почати створювати моди для Minecraft, потрібно знати кілька речей: + +- **Базові знання Java**. Сюди входить розуміння синтаксису мови, об’єктно-орієнтованого програмування та деяких основних шаблонів проєктування. +- **Базові знання [Git](https://git-scm.com/)**. Технічно це не обов’язково, але значно полегшить тобі життя. Сюди входить розуміння того, як клонувати репозиторії та робити коміти. Чудові ресурси: [документація Git](https://git-scm.com/doc) та [документація GitHub](https://docs.github.com/en/get-started). + + + +## Як користуватися цією вікі + + + +Ця вікі складається зі сторінок, які найкраще читати послідовно. Багато статей, особливо на початку, радять подальші матеріали, які логічно прочитати наступними. Більшість сторінок містять фрагменти коду. Повні приклади планується додати у вигляді прикладових модів (ще не реалізовано). + +У наступній статті ти налаштуєш свій перший мод, щоб почати розробку. + +Після цього рекомендується прочитати [Створення вашого першого предмета](../items/first-item). Далі можна переходити до [додавання блоків](../blocks/first-block) або створення складніших предметів, наприклад: [їжа](../items/food), [інструменти](../items/tools) і [броня](../items/armor). + +Для загальнішого розуміння можна перейти до розділу "Концепції": + +- У [Огляд QSL і QFAPI](../concepts/qsl-qfapi) ти знайдеш інформацію про Quilt Standard Libraries та Quilted Fabric API — офіційні API Quilt. + +Багато інших статей плануються, але ще не написані ([Issue #69](https://github.com/QuiltMC/developer-wiki/issues/69)). Цей розділ буде оновлюватися. + + + +## Як вивчати моддинг для початківців + +Моддинг Minecraft може бути складним. Ми прагнемо створити ресурс, який допоможе тобі вивчити базові концепції моддингу. Але є речі, які ти маєш вивчити самостійно. + +Не бійся ставити запитання — ми завжди раді допомогти та не засуджуємо. + +Коли ставиш запитання, намагайся одразу вказати весь потрібний контекст: опиши проблему, що ти вже пробував і що не спрацювало. Повний контекст дозволяє швидше знайти рішення. Якщо щось не працює — додай файл `latest.log`, а в разі крашу — лог крашу. Також дуже корисно надати доступ до свого коду, бажано через GitHub. + +Ставити питання можна на нашому [форумі](https://forum.quiltmc.org/), а також у каналі [mod-dev-help](https://discord.com/channels/817576132726620200/1047429688521396325) на нашому [Discord-сервері](https://discord.quiltmc.org/) + +Більшість проблем у моддингу вже були вирішені раніше, і ти можеш побачити їх рішення у відкритому доступі — більшість модів для Quilt є відкритими. Ми радимо переглядати код інших модів і навіть "красти" зразки рішень — відкриті репозиторії створені саме для того, щоб на них вчитися. Не бійся їх! + +Є багато тем у моддингу, на які ще немає гідних туторіалів. У таких випадках тобі, можливо, доведеться заглядати в код Minecraft або переглядати, як інші моди реалізували подібні ідеї. І знову ж — не бійся просити допомогу, коли щось незрозуміло. + +Щоб переглядати вихідний код Minecraft, запусти задачу Gradle `genSourcesWithVineflower` у категорії `fabric`, або просто відкрий будь-який файл з кодом Minecraft у IntelliJ IDEA й натисни кнопку "завантажити джерела". + + From 00a5fe263807569cc3df6830393e5b01f8076f11 Mon Sep 17 00:00:00 2001 From: Mirik9724 <145905797+Mirik9724@users.noreply.github.com> Date: Sat, 5 Apr 2025 09:22:02 +1000 Subject: [PATCH 11/28] Create ua.md --- wiki/blocks/first-block/ua.md | 104 ++++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 wiki/blocks/first-block/ua.md diff --git a/wiki/blocks/first-block/ua.md b/wiki/blocks/first-block/ua.md new file mode 100644 index 0000000..6eed490 --- /dev/null +++ b/wiki/blocks/first-block/ua.md @@ -0,0 +1,104 @@ +# Додавання простого блоку + +Створення блоку дуже схоже на [створення предмета](../items/first-item), але тепер ми працюємо як з реєстрацією блоку, так і з реєстрацією предмета, а також детальніше розглядаємо процес створення моделі. + +## Створення та реєстрація блоку + +Спочатку створимо блок і збережемо його в полі: + +```java +public static final Block EXAMPLE_BLOCK = new Block(QuiltBlockSettings.create()); +``` + +Потім реєструємо його у функції `onInitialize()`: + +```java +Registry.register(Registries.BLOCK, new Identifier(mod.metadata().id(), "example_block"), EXAMPLE_BLOCK); +``` + +Замініть `example_block` на назву вашого блоку. Усі літери мають бути малими, слова розділяйте підкресленнями. + +## Додавання предмета для блоку + +Після цього ми зможемо розміщувати блок за допомогою команди `setblock`, але в творчому режимі предмет для нього не з’явиться. Щоб це виправити, потрібно зареєструвати `BlockItem` для блоку й додати його до групи предметів, наприклад `BUILDING_BLOCKS`: + +```java +Registry.register(Registries.ITEM, new Identifier(mod.metadata().id(), "example_block"), new BlockItem(EXAMPLE_BLOCK, new QuiltItemSettings())); + +ItemGroupEvents.modifyEntriesEvent(ItemGroups.BUILDING_BLOCKS).register(entries -> { + entries.addItem(EXAMPLE_BLOCK.asItem()); +}); +``` + +Назва предмета має бути така ж, як і назва блоку. + +Докладніше про це можна прочитати в статті [Створення вашого першого предмета](../items/first-item#registering-the-item). + +## Додавання моделі для блоку + +Спочатку потрібно створити файл `blockstates` для вашого блоку. Для кожної варіації блоку існує окрема **стадія блоку** (block state). Наприклад, кожен етап росту рослини — це окрема стадія. Файл `blockstates` пов’язує ці стадії з відповідними моделями. У нашому випадку блок має лише одну стадію, тому файл досить простий. + +Для прикладу складнішої конфігурації дивіться статтю [Додавання взаємодії з редстоуном](redstone-interaction). А поки що можна використати цей простий JSON: + +`assets/simple_block_mod/blockstates/example_block.json`: + +```json +{ + "variants": { + "": { + "model": "simple_block_mod:block/example_block" + } + } +} +``` + +Замініть `simple_block_mod` і `example_block` на ваш ID мода і назву блоку. Не забудьте оновити імена файлів/тек. + +--- + +Тепер можна створити модель блоку за вказаним шляхом (`assets/simple_block_mod/models/block/example_block.json`): + +```json +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "simple_block_mod:block/example_block" + } +} +``` + +Замініть `simple_block_mod` і `example_block` як раніше. + +Це використовуватиме текстуру, що розташована за шляхом `assets/simple_block_mod/textures/block/example_block.png`, для всіх сторін блоку. + +--- + +Наш предмет-блок також потребує моделі, але замість використання окремої текстури, як у [уроці про предмети](../items/first-item), ми вкажемо модель блоку як батьківську модель. Так блок у інвентарі виглядатиме так само, як і в світі гри. + +`assets/simple_block_mod/models/item/example_block.json`: + +```json +{ + "parent": "simple_block_mod:block/example_block" +} +``` + +Знову ж, замініть `simple_block_mod` і `example_block` на ваші значення. + +## Додавання перекладу назви блоку + +Нарешті, потрібно додати переклад для назви блоку. Він автоматично застосується і до предмета-блоку. + +`assets/simple_block_mod/lang/en_us.json`: + +```json +{ + "block.simple_block_mod.example_block": "Example Block" +} +``` + +Замініть `simple_block_mod` і `example_block` відповідно. + +## Що далі? + +Тепер, коли ви додали блок до Minecraft, ви можете продовжити з [Додаванням орієнтованого блоку](oriented-block), [Додаванням взаємодії з редстоуном](redstone-interaction) або створенням складніших предметів: [броні](../items/armor), [їжі](../items/food) або [інструментів](../items/tools). From 53d9ebdf8a391000d3a42d8ffe5d2a18f6afa60f Mon Sep 17 00:00:00 2001 From: Mirik9724 <145905797+Mirik9724@users.noreply.github.com> Date: Sat, 5 Apr 2025 09:22:35 +1000 Subject: [PATCH 12/28] Create ru.md --- wiki/blocks/first-block/ru.md | 104 ++++++++++++++++++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 wiki/blocks/first-block/ru.md diff --git a/wiki/blocks/first-block/ru.md b/wiki/blocks/first-block/ru.md new file mode 100644 index 0000000..57063f7 --- /dev/null +++ b/wiki/blocks/first-block/ru.md @@ -0,0 +1,104 @@ +# Добавление простого блока + +Создание блока во многом похоже на [создание предмета](../items/first-item), но теперь мы используем как реестр блоков, так и реестр предметов, а также более подробно разбираемся с созданием модели. + +## Создание и регистрация блока + +Сначала создаём блок и сохраняем его в поле: + +```java +public static final Block EXAMPLE_BLOCK = new Block(QuiltBlockSettings.create()); +``` + +Затем регистрируем его в методе `onInitialize()`: + +```java +Registry.register(Registries.BLOCK, new Identifier(mod.metadata().id(), "example_block"), EXAMPLE_BLOCK); +``` + +Замените `example_block` на имя вашего блока. Имя должно быть написано строчными буквами, слова разделяйте нижними подчёркиваниями. + +## Добавление предмета для блока + +После этого мы сможем разместить блок с помощью команды `setblock`, но предмета в творческом инвентаре всё ещё не будет. Чтобы это исправить, зарегистрируем `BlockItem` для нашего блока и добавим его в группу предметов, например `BUILDING_BLOCKS`: + +```java +Registry.register(Registries.ITEM, new Identifier(mod.metadata().id(), "example_block"), new BlockItem(EXAMPLE_BLOCK, new QuiltItemSettings())); + +ItemGroupEvents.modifyEntriesEvent(ItemGroups.BUILDING_BLOCKS).register(entries -> { + entries.addItem(EXAMPLE_BLOCK.asItem()); +}); +``` + +Имя предмета должно совпадать с именем блока. + +Подробнее о регистрации предметов читайте в [руководстве по созданию первого предмета](../items/first-item#registering-the-item). + +## Добавление модели для блока + +Сначала создадим файл `blockstates` для блока. Для каждой формы блока существует своё **состояние блока**. Например, каждая стадия роста растения — это отдельное состояние. Файл `blockstates` связывает состояния блока с их соответствующими моделями. В нашем случае у блока только одно состояние, поэтому JSON очень простой. + +Пример более сложной настройки смотрите в [добавлении редстоун-функционала](redstone-interaction). Сейчас же можно использовать такой файл: + +`assets/simple_block_mod/blockstates/example_block.json`: + +```json +{ + "variants": { + "": { + "model": "simple_block_mod:block/example_block" + } + } +} +``` + +Замените `simple_block_mod` и `example_block` на ID вашего мода и имя блока — в названии файла, папок и внутри JSON. + +--- + +Теперь создадим модель блока по указанному пути (`assets/simple_block_mod/models/block/example_block.json`): + +```json +{ + "parent": "minecraft:block/cube_all", + "textures": { + "all": "simple_block_mod:block/example_block" + } +} +``` + +Как и прежде, замените `simple_block_mod` и `example_block`. + +Эта модель будет использовать текстуру по пути `assets/simple_block_mod/textures/block/example_block.png` для всех сторон блока. + +--- + +Нам также нужна модель для предмета-блока. Вместо указания отдельной текстуры, как в [уроке про предметы](../items/first-item), мы укажем модель блока как родительскую. Тогда предмет будет отображаться точно так же, как и сам блок в мире. + +`assets/simple_block_mod/models/item/example_block.json`: + +```json +{ + "parent": "simple_block_mod:block/example_block" +} +``` + +И снова — не забудьте заменить `simple_block_mod` и `example_block`. + +## Добавление перевода названия блока + +И напоследок добавим перевод для блока. Он автоматически будет применён и к предмету-блоку. + +`assets/simple_block_mod/lang/en_us.json`: + +```json +{ + "block.simple_block_mod.example_block": "Example Block" +} +``` + +Замените `simple_block_mod` и `example_block` соответственно. + +## Что дальше? + +Теперь, когда ты добавил блок в Minecraft, можешь перейти к [добавлению направленного блока](oriented-block), [добавлению редстоун-функционала](redstone-interaction) или к созданию более продвинутых предметов, таких как [броня](../items/armor), [еда](../items/food) или [инструменты](../items/tools). From 90b5c1dff9bf5f8af9bfa15e5abe4d5fbca45658 Mon Sep 17 00:00:00 2001 From: Mirik9724 <145905797+Mirik9724@users.noreply.github.com> Date: Sat, 5 Apr 2025 09:26:38 +1000 Subject: [PATCH 13/28] Create ru.md --- wiki/configuration/advanced-configuring/ru.md | 199 ++++++++++++++++++ 1 file changed, 199 insertions(+) create mode 100644 wiki/configuration/advanced-configuring/ru.md diff --git a/wiki/configuration/advanced-configuring/ru.md b/wiki/configuration/advanced-configuring/ru.md new file mode 100644 index 0000000..260dd1a --- /dev/null +++ b/wiki/configuration/advanced-configuring/ru.md @@ -0,0 +1,199 @@ +# Расширенная настройка + +Простые значения — это хорошо, но если их становится слишком много, всё может быстро превратиться в кашу. В этом руководстве мы рассмотрим, как структурировать конфигурацию и использовать процессоры, чтобы выжать из неё максимум. + +## Использование секций + +Когда файл с десятками значений становится плоским и громоздким, навигация по нему становится трудной. К счастью, с Quilt Config мы можем организовать его в секции! Это очень просто реализовать. + +С помощью секций можно использовать отступы для визуального разграничения частей конфигурационного файла, что удобно для читающих его пользователей. Вот пример секции в формате TOML: + +```toml +# ... + +# На самом деле это не используется модом, но у меня закончились идеи, что добавить. +typesOfSoup = ["tomato", "borscht", "chicken noodle", "ramen", "STEW", "mushroom"] + +# Расширенные настройки для продвинутых пользователей. +[advanced_settings] + # Автоматически добавлять перевод строки в конец каждого сообщения. + # default: true + printNewlines = true +``` + +Чтобы это реализовать в коде, создадим секцию: + +`src/main/com/example/example_mod/ExampleModConfig`: + +```java +public class ExampleModConfig extends ReflectiveConfig { + // ... + @Comment("Расширенные настройки для продвинутых пользователей.") + @SerializedName("advanced_settings") + public final AdvancedSettings advancedSettings = new AdvancedSettings(); + + public static class AdvancedSettings extends Section { + @Comment("Автоматически добавлять перевод строки в конец каждого сообщения.") + @SerializedName("print_newlines") + public final TrackedValue printNewlines = this.value(true); + } +} +``` + +Мы создаём вложенный класс внутри нашего конфигурационного класса, который расширяет `ReflectiveConfig.Section`. Затем создаём объект этой секции в основном классе конфигурации. Обрати внимание: экземпляр секции **не** хранится в `TrackedValue`, как остальные значения — вместо этого сама секция содержит `TrackedValue`. + +Теперь в секцию можно добавлять сколько угодно значений. Но что если нам нужно сохранить что-то более сложное, чем простые типы, карты или списки? Давай посмотрим, как сериализовать собственный объект. + +## Сериализация пользовательских объектов + +В Java можно печатать в разные потоки вывода в консоли. Эти потоки не являются сериализуемыми объектами, как `String` или числа. Вот тут и приходит на помощь интерфейс `ConfigSerializableObject`. + +Этот интерфейс позволяет сериализовать и десериализовать нестандартные типы. Нужно реализовать три метода: + +- `T getRepresentation()` — преобразует объект в сериализуемую форму. +- `YourSerializableClass convertFrom(T)` — восстанавливает оригинальный объект из сериализованной формы. +- `YourSerializableClass copy()` — создаёт копию объекта (используется Quilt Config'ом внутренне). + +Вот пример: + +`src/main/com/example/example_mod/ExampleModConfig`: + +```java +public class ExampleModConfig extends ReflectiveConfig { + // ... + public static class AdvancedSettings extends Section { + // ... + @Comment("Куда печатать сообщения.") + @SerializedName("print_stream") + public final TrackedValue printStream = this.value(PrintStreamOption.SYSTEM_OUT); + + @SuppressWarnings("unused") // IDE не поймёт, что все значения enum можно использовать в конфиге + public enum PrintStreamOption implements ConfigSerializableObject { + SYSTEM_OUT(System.out), + SYSTEM_ERROR(System.err); + + private final PrintStream printStream; + + PrintStreamOption(PrintStream stream) { + this.printStream = stream; + } + + public PrintStream getStream() { + return this.printStream; + } + + @Override + public PrintStreamOption convertFrom(String representation) { + return valueOf(representation); + } + + @Override + public String getRepresentation() { + return this.name(); + } + + @Override + public PrintStreamOption copy() { + return this; + } + } + } +} +``` + +Мы использовали `Enum` для удобства — он автоматически подсказывает возможные значения в конфиге. В методах сериализации всё просто: `name()` и `valueOf()` делают всю работу. Если бы это был обычный класс, возможностей было бы ещё больше. + +А теперь пример класса, представляющего точку в 3D-пространстве: + +```java +public class Vec3i implements ConfigSerializableObject> { + public final int x; + public final int y; + public final int z; + + public Vec3i(int x, int y, int z) { + this.x = x; + this.y = y; + this.z = z; + } + + @Override + public Vec3i copy() { + return this; + } + + @Override + public Vec3i convertFrom(ValueMap representation) { + return new Vec3i(representation.get("x"), representation.get("y"), representation.get("z")); + } + + @Override + public ValueMap getRepresentation() { + return ValueMap.builder(0) + .put("x", this.x) + .put("y", this.y) + .put("z", this.z) + .build(); + } +} +``` + +Здесь используется `ValueMap` для сериализации сложной структуры. Такой подход подходит для всех классов с несколькими полями. + +## Использование процессоров + +Теперь, когда мы знаем всё о значениях, пора заняться «тёмной магией»: знакомься, `@Processor`. + +Этот аннотационный интерфейс позволяет выполнять код при загрузке конфигурации или при изменении значений. Сначала создадим простой процессор, который напечатает сообщение при загрузке: + +```java +@Processor("processConfig") +public class ExampleModConfig extends ReflectiveConfig { + public void processConfig(Config.Builder builder) { + System.out.println("Загрузка конфигурации!"); + } + + // ... +} +``` + +Метод `processConfig` вызывается при сборке конфигурации. Аргумент зависит от того, к чему применяется аннотация: + +- Для `TrackedValue`: `TrackedValue.Builder` +- Для секций: `SectionBuilder` +- Для всей конфигурации: `Config.Builder` + +Также можно указать *callback*, который выполнится при изменении значения: + +```java +@Processor("processConfig") +public class ExampleModConfig extends ReflectiveConfig { + public void processConfig(Config.Builder builder) { + System.out.println("Загрузка конфигурации!"); + builder.callback(config -> System.out.println("Обновление конфигурации!")); + } + + // ... +} +``` + +Можно использовать это для синхронизации значений. Например, сделаем переменную `activeStream`, которая всегда совпадает с выбранным потоком `printStream`, чтобы не лезть за ним глубоко: + +```java +@Processor("processConfig") +public class ExampleModConfig extends ReflectiveConfig { + // ... + public static class AdvancedSettings extends Section { + // ... + @Processor("processPrintStream") + public final TrackedValue printStream = this.value(PrintStreamOption.SYSTEM_OUT); + public transient PrintStream activeStream = printStream.value().getStream(); + + public void processPrintStream(TrackedValue.Builder builder) { + builder.callback(val -> activeStream = val.getStream()); + } + } +} +``` + +Теперь `activeStream` будет автоматически обновляться, если пользователь изменит значение в конфиге. From b9e51c63a944247c05e2b2d0eaec96be103a5408 Mon Sep 17 00:00:00 2001 From: Mirik9724 <145905797+Mirik9724@users.noreply.github.com> Date: Sat, 5 Apr 2025 09:27:18 +1000 Subject: [PATCH 14/28] Create ua.md --- wiki/configuration/advanced-configuring/ua.md | 163 ++++++++++++++++++ 1 file changed, 163 insertions(+) create mode 100644 wiki/configuration/advanced-configuring/ua.md diff --git a/wiki/configuration/advanced-configuring/ua.md b/wiki/configuration/advanced-configuring/ua.md new file mode 100644 index 0000000..5e16444 --- /dev/null +++ b/wiki/configuration/advanced-configuring/ua.md @@ -0,0 +1,163 @@ +# Розширене налаштування + +Прості значення — це добре, але коли їх багато, вони стають важкими для організації. У цьому уроці ми розглянемо, як структурувати конфігурацію та використовувати обробники (processors), щоб отримати від неї максимум користі. + +## Використання секцій + +Файл з десятками значень швидко стає важким для навігації та розуміння. На щастя, з Quilt Config ми можемо організувати його на секції! Це дуже просто реалізувати. + +Секції дозволяють використовувати відступи для візуального розділення частин конфігурації. Давайте додамо приклад секції, яка у форматі TOML виглядає так: + +```toml +# ... + +# Це насправді не використовується модом, просто ідей більше не було. +typesOfSoup = ["tomato", "borscht", "chicken noodle", "ramen", "STEW", "mushroom"] + +# Розширені налаштування для досвідчених користувачів. +[advanced_settings] + # Чи додавати новий рядок після кожного повідомлення. + # default: true + printNewlines = true +``` + +Щоб зробити це в коді: + +`src/main/com/example/example_mod/ExampleModConfig`: + +```java +public class ExampleModConfig extends ReflectiveConfig { + // ... + @Comment("Розширені налаштування для досвідчених користувачів.") + @SerializedName("advanced_settings") + public final AdvancedSettings advancedSettings = new AdvancedSettings(); + + public static class AdvancedSettings extends Section { + @Comment("Чи додавати новий рядок після кожного повідомлення.") + @SerializedName("print_newlines") + public final TrackedValue printNewlines = this.value(true); + } +} +``` + +Ми просто створюємо новий клас усередині основного конфігураційного класу, який наслідує `ReflectiveConfig.Section`. Потім створюємо об'єкт цього класу в головному конфіг-файлі. Зверніть увагу: екземпляр секції **не** зберігається у `TrackedValue`, натомість всередині секції вже зберігаються `TrackedValue`. + +Тепер ми можемо додавати будь-яку кількість значень в секцію. Але що, якщо ми хочемо зберегти не просто тип, а об'єкт? Для цього нам знадобиться серіалізація власних типів. + +## Серіалізація власних значень + +В Java ви можете виводити повідомлення у різні потоки виводу. Вони не є серіалізованими за замовчуванням, як `int` чи `String`. Тут і стає в нагоді інтерфейс `ConfigSerializableObject`. + +Він працює через дженерики: `` — це тип, в який ваш об’єкт буде серіалізовано для збереження у файлі, а потім буде відновлено назад. Щоб це реалізувати, потрібно визначити три методи: + +- `T getRepresentation()`: повертає серіалізований варіант вашого об'єкта. +- `YourSerializableClass convertFrom(T)`: перетворює серіалізований варіант назад у ваш клас. +- `YourSerializableClass copy()`: створює копію об'єкта (використовується всередині Quilt Config). + +### Приклад з Enum: + +```java +public static class AdvancedSettings extends Section { + @Comment("До якого потоку виводити повідомлення.") + @SerializedName("print_stream") + public final TrackedValue printStream = this.value(PrintStreamOption.SYSTEM_OUT); + + public enum PrintStreamOption implements ConfigSerializableObject { + SYSTEM_OUT(System.out), + SYSTEM_ERROR(System.err); + + private final PrintStream printStream; + + PrintStreamOption(PrintStream stream) { + this.printStream = stream; + } + + public PrintStream getStream() { + return this.printStream; + } + + @Override + public PrintStreamOption convertFrom(String representation) { + return valueOf(representation); + } + + @Override + public String getRepresentation() { + return this.name(); + } + + @Override + public PrintStreamOption copy() { + return this; + } + } +} +``` + +Enum дозволяє нам задати обмежений набір значень, а також Quilt Config самостійно згенерує коментар з можливими варіантами. + +### Приклад з об’єктом координат: + +```java +public class Vec3i implements ConfigSerializableObject> { + public final int x, y, z; + + public Vec3i(int x, int y, int z) { + this.x = x; this.y = y; this.z = z; + } + + @Override + public Vec3i copy() { + return this; + } + + @Override + public Vec3i convertFrom(ValueMap representation) { + return new Vec3i(representation.get("x"), representation.get("y"), representation.get("z")); + } + + @Override + public ValueMap getRepresentation() { + return ValueMap.builder(0) + .put("x", x) + .put("y", y) + .put("z", z) + .build(); + } +} +``` + +Тут ми використовуємо `ValueMap`, щоб зручно представити складний об’єкт з кількома полями. + +## Використання процесорів + +А тепер — трохи зла 😈. `@Processor` дозволяє змінювати налаштування конфігурації, а також виконувати код при зміні значень. + +```java +@Processor("processConfig") +public class ExampleModConfig extends ReflectiveConfig { + public void processConfig(Config.Builder builder) { + System.out.println("Завантаження конфігурації!"); + } +} +``` + +Метод `processConfig` буде викликано при створенні конфігу. Крім того, ми можемо додати зворотний виклик (callback), який виконується при зміні конфігурації: + +```java +builder.callback(config -> System.out.println("Конфігурацію оновлено!")); +``` + +Можна також використовувати процесори для окремих полів. Наприклад: + +```java +@Processor("processPrintStream") +public final TrackedValue printStream = this.value(PrintStreamOption.SYSTEM_OUT); +public transient PrintStream activeStream = printStream.value().getStream(); + +public void processPrintStream(TrackedValue.Builder builder) { + builder.callback(val -> activeStream = val.getStream()); +} +``` + +Це дозволяє автоматично оновлювати змінну `activeStream`, коли змінюється поле `printStream`. From abd9c2ffafcf367802004d76b902d2a30e60f657 Mon Sep 17 00:00:00 2001 From: Mirik9724 <145905797+Mirik9724@users.noreply.github.com> Date: Sat, 5 Apr 2025 09:28:10 +1000 Subject: [PATCH 15/28] Create ua.md --- wiki/configuration/config-screen/ua.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 wiki/configuration/config-screen/ua.md diff --git a/wiki/configuration/config-screen/ua.md b/wiki/configuration/config-screen/ua.md new file mode 100644 index 0000000..7b23e84 --- /dev/null +++ b/wiki/configuration/config-screen/ua.md @@ -0,0 +1 @@ +Ця сторінка буде заповнена, щойно в QSL з'явиться автоматичне створення екранів налаштувань! Якщо хтось хоче написати її для SpruceUI або чогось подібного — удачі, веселіться! From c495ad781f0f458e24ba7417587bffbd3e67beb6 Mon Sep 17 00:00:00 2001 From: Mirik9724 <145905797+Mirik9724@users.noreply.github.com> Date: Sat, 5 Apr 2025 09:29:55 +1000 Subject: [PATCH 16/28] Create ru.md --- wiki/configuration/config-screen/ru.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 wiki/configuration/config-screen/ru.md diff --git a/wiki/configuration/config-screen/ru.md b/wiki/configuration/config-screen/ru.md new file mode 100644 index 0000000..cc00d2a --- /dev/null +++ b/wiki/configuration/config-screen/ru.md @@ -0,0 +1 @@ +Эта страница будет заполнена, как только в QSL появится автоматическая генерация экранов настроек! Если кто-то хочет написать её для SpruceUI или чего-то подобного — удачи, веселитесь! From 012455649bc06e2a8c38c18be2a40bfa5016f865 Mon Sep 17 00:00:00 2001 From: Mirik9724 <145905797+Mirik9724@users.noreply.github.com> Date: Sat, 5 Apr 2025 09:35:45 +1000 Subject: [PATCH 17/28] Create ru.md --- wiki/configuration/getting-started/ru.md | 120 +++++++++++++++++++++++ 1 file changed, 120 insertions(+) create mode 100644 wiki/configuration/getting-started/ru.md diff --git a/wiki/configuration/getting-started/ru.md b/wiki/configuration/getting-started/ru.md new file mode 100644 index 0000000..5e98b17 --- /dev/null +++ b/wiki/configuration/getting-started/ru.md @@ -0,0 +1,120 @@ +# Полный перевод Quilt Config + +## Введение + +Quilt Config — это библиотека для конфигурационных файлов в Minecraft, предназначенная для простоты использования. Она помогает создавать и управлять конфигурациями, а также предоставляет удобные методы для сохранения и загрузки настроек. В этом руководстве мы рассмотрим, как использовать Quilt Config для создания конфигурационных классов и работы с различными типами данных. + +### Зависимости + +Чтобы начать использовать Quilt Config, добавь зависимость в `build.gradle`: + +```gradle +dependencies { + modCompile "org.quiltmc.config:quilt-config-api:3.0.0" +} +``` + +## Создание конфигурационного класса + +Для начала создадим класс конфигурации, который будет хранить данные, например, сообщение и настройки: + +```java +import org.quiltmc.config.api.Config; +import org.quiltmc.config.api.annotations.Comment; +import org.quiltmc.config.api.annotations.SerializedName; +import org.quiltmc.config.api.value.TrackedValue; +import org.quiltmc.config.api.value.ValueList; +import org.quiltmc.config.api.value.ValueMap; + +public class ExampleModConfig extends Config { + // Поле для строки + @Comment("Сообщение для отображения.") + @SerializedName("message") + public final TrackedValue message = this.value("Привет, мир!"); + + // Поле для целого числа + @Comment("Число попыток.") + public final TrackedValue attempts = this.value(3); + + // Поле для списка строк + @Comment("Список игнорируемых слов.") + public final TrackedValue> ignoredWords = this.list().add("a").add("the").add("and").build(); + + // Поле для карты строк + @Comment("Реплейсменты для текста.") + public final TrackedValue> replacements = this.map().put("собака", "пес").build(); +} +``` + +### Описание аннотаций + +- `@Comment` — аннотация для добавления комментариев в конфигурационный файл. +- `@SerializedName` — аннотация для задания другого имени поля в конфиге (например, если в конфиге нужно использовать другое имя, отличное от названия поля в классе). + +### Типы данных + +- `TrackedValue` — строка, которая отслеживает изменения. +- `TrackedValue` — целое число, отслеживающее изменения. +- `TrackedValue>` — список строк, отслеживающий изменения. +- `TrackedValue>` — карта строк, отслеживающая изменения. + +## Доступ к значениям и их изменению + +Теперь, когда у нас есть конфигурационный класс, мы можем получить доступ к значениям и изменять их. Это можно сделать через поля класса: + +```java +ExampleModConfig config = ExampleModConfig.INSTANCE; + +String message = config.message.value(); // Получаем текущее значение сообщения +config.message.set("Новое сообщение!"); // Устанавливаем новое значение +``` + +Метод `value()` позволяет получить текущее значение поля, а метод `set()` позволяет изменить его. Изменения автоматически сохранятся при вызове `save()`. + +## Работа с типами данных + +### Списки (ValueList) + +Списки позволяют хранить несколько значений. Пример использования: + +```java +public final TrackedValue> ignoredWords = this.list() + .add("a") + .add("the") + .add("and") + .build(); +``` + +Здесь создается список, состоящий из нескольких слов, которые будут игнорироваться. + +### Карты (ValueMap) + +Карты позволяют хранить пары ключ-значение. Пример: + +```java +public final TrackedValue> replacements = this.map() + .put("собака", "пес") + .put("кошка", "кот") + .build(); +``` + +Здесь создается карта, в которой заменяется слово "собака" на "пес", а "кошка" на "кот". + +## Сохранение и загрузка конфигурации + +Quilt Config автоматически сохраняет изменения в файл конфигурации. Чтобы сохранить или загрузить конфигурацию вручную, можно использовать следующие методы: + +```java +ExampleModConfig.INSTANCE.save(); // Сохранить текущую конфигурацию +ExampleModConfig.INSTANCE.load(); // Загрузить конфигурацию +``` + +## Рекомендуемые практики + +- Используйте комментарии (`@Comment`) для описания полей конфигурации. Это поможет пользователям понять, что делает каждое поле. +- Названия полей в классе и имена в конфигурационном файле могут отличаться. Используйте аннотацию `@SerializedName`, чтобы задать имя в конфиге, если оно должно быть другим. +- Храните данные в типах `TrackedValue`, чтобы отслеживать изменения в реальном времени. + +## Заключение + +Quilt Config — это мощная библиотека для работы с конфигурационными файлами в Minecraft. С помощью аннотаций и удобных типов данных можно легко управлять настройками мода и создавать конфиги, которые удобно редактировать и обновлять. From 1b0ee65919779f7dca4585df500cb545f9d63aa2 Mon Sep 17 00:00:00 2001 From: Mirik9724 <145905797+Mirik9724@users.noreply.github.com> Date: Sat, 5 Apr 2025 09:37:00 +1000 Subject: [PATCH 18/28] Create ua.md --- wiki/configuration/getting-started/ua.md | 120 +++++++++++++++++++++++ 1 file changed, 120 insertions(+) create mode 100644 wiki/configuration/getting-started/ua.md diff --git a/wiki/configuration/getting-started/ua.md b/wiki/configuration/getting-started/ua.md new file mode 100644 index 0000000..e67bf5a --- /dev/null +++ b/wiki/configuration/getting-started/ua.md @@ -0,0 +1,120 @@ +# Повний переклад Quilt Config + +## Вступ + +Quilt Config — це бібліотека для конфігураційних файлів у Minecraft, яка покликана полегшити їх використання. Вона дозволяє створювати та управляти конфігураціями, а також надає зручні методи для збереження та завантаження налаштувань. У цьому посібнику ми розглянемо, як використовувати Quilt Config для створення конфігураційних класів та роботи з різними типами даних. + +### Залежності + +Щоб почати використовувати Quilt Config, додайте залежність у `build.gradle`: + +```gradle +dependencies { + modCompile "org.quiltmc.config:quilt-config-api:3.0.0" +} +``` + +## Створення конфігураційного класу + +Для початку створимо клас конфігурації, який буде зберігати дані, наприклад, повідомлення та налаштування: + +```java +import org.quiltmc.config.api.Config; +import org.quiltmc.config.api.annotations.Comment; +import org.quiltmc.config.api.annotations.SerializedName; +import org.quiltmc.config.api.value.TrackedValue; +import org.quiltmc.config.api.value.ValueList; +import org.quiltmc.config.api.value.ValueMap; + +public class ExampleModConfig extends Config { + // Поле для рядка + @Comment("Повідомлення для відображення.") + @SerializedName("message") + public final TrackedValue message = this.value("Привіт, світ!"); + + // Поле для цілого числа + @Comment("Кількість спроб.") + public final TrackedValue attempts = this.value(3); + + // Поле для списку рядків + @Comment("Список ігнорованих слів.") + public final TrackedValue> ignoredWords = this.list().add("a").add("the").add("and").build(); + + // Поле для карти рядків + @Comment("Заміни для тексту.") + public final TrackedValue> replacements = this.map().put("собака", "пес").build(); +} +``` + +### Опис анотацій + +- `@Comment` — анотація для додавання коментарів у конфігураційний файл. +- `@SerializedName` — анотація для вказівки іншого імені поля в конфігурації (наприклад, якщо в конфігурації потрібно використовувати інше ім’я, відмінне від назви поля в класі). + +### Типи даних + +- `TrackedValue` — рядок, що відстежує зміни. +- `TrackedValue` — ціле число, що відстежує зміни. +- `TrackedValue>` — список рядків, що відстежує зміни. +- `TrackedValue>` — карта рядків, що відстежує зміни. + +## Доступ до значень та їх зміна + +Тепер, коли ми маємо конфігураційний клас, ми можемо отримувати доступ до значень і змінювати їх. Це можна зробити через поля класу: + +```java +ExampleModConfig config = ExampleModConfig.INSTANCE; + +String message = config.message.value(); // Отримуємо поточне значення повідомлення +config.message.set("Нове повідомлення!"); // Встановлюємо нове значення +``` + +Метод `value()` дозволяє отримати поточне значення поля, а метод `set()` дозволяє змінити його. Зміни автоматично збережуться при виклику `save()`. + +## Робота з типами даних + +### Списки (ValueList) + +Списки дозволяють зберігати кілька значень. Приклад використання: + +```java +public final TrackedValue> ignoredWords = this.list() + .add("a") + .add("the") + .add("and") + .build(); +``` + +Тут створюється список, що складається з кількох слів, які будуть ігноруватися. + +### Карти (ValueMap) + +Карти дозволяють зберігати пари ключ-значення. Приклад: + +```java +public final TrackedValue> replacements = this.map() + .put("собака", "пес") + .put("кіт", "кот") + .build(); +``` + +Тут створюється карта, в якій слово "собака" замінюється на "пес", а "кіт" на "кот". + +## Збереження та завантаження конфігурації + +Quilt Config автоматично зберігає зміни в конфігураційний файл. Щоб зберегти або завантажити конфігурацію вручну, можна використовувати наступні методи: + +```java +ExampleModConfig.INSTANCE.save(); // Зберегти поточну конфігурацію +ExampleModConfig.INSTANCE.load(); // Завантажити конфігурацію +``` + +## Рекомендовані практики + +- Використовуйте коментарі (`@Comment`) для опису полів конфігурації. Це допоможе користувачам зрозуміти, що робить кожне поле. +- Назви полів у класі та імена в конфігураційному файлі можуть відрізнятися. Використовуйте анотацію `@SerializedName`, щоб вказати ім’я в конфігурації, якщо воно має бути іншим. +- Зберігайте дані в типах `TrackedValue`, щоб відстежувати зміни в реальному часі. + +## Висновок + +Quilt Config — це потужна бібліотека для роботи з конфігураційними файлами в Minecraft. За допомогою анотацій і зручних типів даних можна легко керувати налаштуваннями мода та створювати конфіги, які зручно редагувати та оновлювати. From 26b291f00a39bbbeac74032b800d767e9ba8b8f2 Mon Sep 17 00:00:00 2001 From: Mirik9724 <145905797+Mirik9724@users.noreply.github.com> Date: Sat, 5 Apr 2025 09:38:59 +1000 Subject: [PATCH 19/28] Create ua.md --- wiki/configuration/metadata/ua.md | 64 +++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 wiki/configuration/metadata/ua.md diff --git a/wiki/configuration/metadata/ua.md b/wiki/configuration/metadata/ua.md new file mode 100644 index 0000000..4a5c536 --- /dev/null +++ b/wiki/configuration/metadata/ua.md @@ -0,0 +1,64 @@ +# Посилання на Аннотації та Метадані + +Quilt Config надзвичайно багатий на аннотації, кожна з яких дозволяє розширити функціональність вашого конфігу! Ця сторінка служить як довідник, надаючи огляд функціональності кожної аннотації. Більш детальну інформацію можна знайти у Javadoc для кожної аннотації. + +## `@Comment` + +- Можна використовувати для полів конфігурації та секцій. +- Може бути повторено нескінченно для кожного члена. + +Дозволяє додавати коментарі до ваших полів, які зберігаються як метадані. За замовчуванням ці коментарі будуть серіалізовані у конфігураційні файли в форматах `toml` та `json5`. Оскільки вони зберігаються як метадані, їх можна використовувати в будь-якому місці, де є `TrackedValue` для вашого конфігураційного поля, що дозволяє відображати їх у екранах конфігурації та інших випадках. + +## `@FloatRange` та `@IntegerRange` + +- Можна використовувати для полів конфігурації типу `Float` та `Integer` відповідно. +- Може бути застосовано лише один раз до поля. + +Під час запуску та коли відбуваються зміни в аннотованому полі, перевіряється, чи знаходиться значення поля в межах заданих `min` та `max`, включаючи їх. Якщо ні, виникає помилка з `TrackedValueException`. + +## `@Matches` + +- Можна використовувати для полів конфігурації типу `String`. +- Може бути застосовано лише один раз до поля. + +Під час запуску та коли відбуваються зміни в аннотованому полі, перевіряється, чи відповідає значення поля наданому [регулярному виразу](https://regexr.com/). Якщо ні, виникає помилка з `TrackedValueException`. + +## `@Processor` + +- Можна використовувати для класів конфігурації, полів та секцій. +- Може бути застосовано лише один раз до кожного члена. + +Дозволяє налаштувати методи, які будуть виконуватись до ініціалізації конфігурації. Приймає параметр типу `String`, що співпадає з ім'ям методу всередині вашого класу: цей метод буде виконуватись до ініціалізації конфігурації. Ви повинні передати методу один параметр, що відповідає типу, анотованому за допомогою `@Processor`: + +- Якщо анотація використовується для відстежуваного значення, метод процесора буде приймати параметр типу `TrackedValue.Builder`. +- Якщо анотація використовується для секції, метод процесора буде приймати параметр типу `SectionBuilder`. +- Якщо анотація використовується для класу конфігурації, метод процесора буде приймати параметр типу `Config.Builder`. + +Процесори дозволяють виконувати багато різних операцій, зокрема: + +- Виконувати кастомний код при редагуванні значень. +- Додавати нові значення та секції програмно. +- Динамічно оновлювати метадані. + +Приклади процесорів та більш детальний огляд їх використання можна знайти в [посібнику з розширеного налаштування](../configuration/advanced-configuring#using-processors). + +## `@SerializedName` + +- Можна використовувати для полів конфігурації та секцій. +- Може бути застосовано лише один раз до кожного члена. + +Додає метадані типу `String`, що використовується як ім'я, яке буде серіалізовано у конфігураційний файл. Ім'я за замовчуванням залишається резервним: якщо серіалізоване ім'я відсутнє в файлі під час десеріалізації, буде використано ім'я за замовчуванням. Серіалізоване ім'я завжди буде використовуватись при запису в файл. + +## `@SerializedNameConvention` + +- Можна використовувати для класів конфігурації, секцій та полів. +- Може бути застосовано лише один раз до кожного члена. + +Додає метадані щодо конвенції іменування до кожного поля всередині класу конфігурації, що визначає формат написання, який буде використовуватись під час збереження в конфігурації. Це перетворює ім'я поля за замовчуванням, застосовуючи стиль написання, зазначений у метаданих. Якщо для поля вказано серіалізоване ім'я, воно має пріоритет над перетвореним ім'ям, отриманим завдяки цій аннотації. Варіанти форматування доступні та задокументовані в `NamingSchemes`. Коли ця аннотація використовується під батьківським елементом, що має аналогічну аннотацію, вона перезаписує стиль лише для цього елементу (наприклад, якщо клас анотовано певною схемою, а поле всередині цього класу анотовано іншим стилем, поле буде використовувати стиль, зазначений у його власній аннотації). + +## `@Alias` + +- Можна використовувати для полів конфігурації та секцій. +- Може бути повторено нескінченно для кожного члена. + +Додає метадані, що вказують на попередні імена цього поля. Ці імена будуть враховуватись під час десеріалізації, але ніколи не будуть збережені у конфігураційному файлі. Це корисно для міграції конфігурацій до нових імен після зміни структури. From 322d7d6e3ea7a6d179a423b2d8d065de82bc8902 Mon Sep 17 00:00:00 2001 From: Mirik9724 <145905797+Mirik9724@users.noreply.github.com> Date: Sat, 5 Apr 2025 09:39:23 +1000 Subject: [PATCH 20/28] Create ru.md --- wiki/configuration/metadata/ru.md | 64 +++++++++++++++++++++++++++++++ 1 file changed, 64 insertions(+) create mode 100644 wiki/configuration/metadata/ru.md diff --git a/wiki/configuration/metadata/ru.md b/wiki/configuration/metadata/ru.md new file mode 100644 index 0000000..8385400 --- /dev/null +++ b/wiki/configuration/metadata/ru.md @@ -0,0 +1,64 @@ +# Ссылки на Аннотации и Метаданные + +Quilt Config невероятно богат аннотациями, каждая из которых позволяет расширить функциональность вашего конфигурационного файла! Эта страница служит справочником, предоставляя обзор функциональности каждой аннотации. Более подробную информацию можно найти в Javadoc для каждой аннотации. + +## `@Comment` + +- Может использоваться для полей конфигурации и секций. +- Может быть повторено неограниченное количество раз для каждого члена. + +Позволяет добавлять комментарии к полям, которые сохраняются как метаданные. По умолчанию они сериализуются в конфигурационные файлы в форматах `toml` и `json5`. Поскольку комментарии сохраняются как метаданные, они будут доступны везде, где присутствует `TrackedValue` для вашего конфигурационного поля, что позволяет отображать их на экранах конфигурации и других местах. + +## `@FloatRange` и `@IntegerRange` + +- Может использоваться для полей конфигурации типа `Float` и `Integer` соответственно. +- Может быть применено только один раз для каждого поля. + +При запуске и когда аннотированное поле изменяется, проверяется, находится ли его значение в пределах заданных `min` и `max`, включая их. Если нет, возникает ошибка с `TrackedValueException`. + +## `@Matches` + +- Может использоваться для полей конфигурации типа `String`. +- Может быть применено только один раз для каждого поля. + +При запуске и когда аннотированное поле изменяется, проверяется, соответствует ли его значение предоставленному [регулярному выражению](https://regexr.com/). Если нет, возникает ошибка с `TrackedValueException`. + +## `@Processor` + +- Может использоваться для классов конфигурации, полей и секций. +- Может быть применено только один раз для каждого члена. + +Позволяет настроить методы, которые будут выполняться до инициализации конфигурации. Принимает параметр типа `String`, который соответствует имени метода внутри вашего класса: этот метод будет выполнен до инициализации конфигурации. Вы должны передать методу один параметр, соответствующий типу, аннотированному с помощью `@Processor`: + +- Когда используется для отслеживаемого значения, метод процессора будет принимать параметр типа `TrackedValue.Builder`. +- Когда используется для секции, метод процессора будет принимать параметр типа `SectionBuilder`. +- Когда используется для класса конфигурации, метод процессора будет принимать параметр типа `Config.Builder`. + +Процессоры позволяют выполнять множество операций, включая: + +- Запуск собственного кода при изменении значений. +- Программное добавление новых значений и секций. +- Динамическое обновление метаданных. + +Примеры процессоров и более подробное описание их использования можно найти в [руководстве по расширенному конфигурированию](../configuration/advanced-configuring#using-processors). + +## `@SerializedName` + +- Может использоваться для полей конфигурации и секций. +- Может быть применено только один раз для каждого члена. + +Добавляет метаданные типа `String`, которые используются как имя, которое будет сериализовано в конфигурационный файл. Имя по умолчанию остается резервным: если сериализованное имя отсутствует в файле при десериализации, будет использовано имя по умолчанию. Сериализованное имя всегда будет использоваться при записи в файл. + +## `@SerializedNameConvention` + +- Может использоваться для классов конфигурации, секций и полей. +- Может быть применено только один раз для каждого члена. + +Добавляет метаданные по соглашению об именах для каждого поля внутри класса конфигурации, что определяет стиль написания, который будет использоваться при сохранении в конфигурации. Это преобразует имя поля по умолчанию, применяя стиль написания, указанный в метаданных. Если для поля указано сериализованное имя, оно будет иметь приоритет перед преобразованным именем, полученным благодаря этой аннотации. Доступные и документированные стили написания находятся в `NamingSchemes`. Когда эта аннотация используется для родительского элемента, который также имеет такую аннотацию, она перезаписывает стиль только для этого элемента (например, если класс аннотирован определенной схемой, а поле внутри класса аннотировано другой схемой, то поле будет использовать стиль, указанный в его собственной аннотации). + +## `@Alias` + +- Может использоваться для полей конфигурации и секций. +- Может быть повторено неограниченное количество раз для каждого члена. + +Добавляет метаданные, указывающие на предыдущие имена этого поля. Эти имена будут учтены при десериализации, но никогда не будут сохранены в конфигурационном файле. Это полезно для миграции конфигураций на новые имена после изменения. From 1da86b50731b9240dacfcd9c2f30262c273d50eb Mon Sep 17 00:00:00 2001 From: Mirik9724 <145905797+Mirik9724@users.noreply.github.com> Date: Sat, 5 Apr 2025 09:40:23 +1000 Subject: [PATCH 21/28] Create ru.md --- wiki/concepts/qsl-qfapi/ru.md | 43 +++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 wiki/concepts/qsl-qfapi/ru.md diff --git a/wiki/concepts/qsl-qfapi/ru.md b/wiki/concepts/qsl-qfapi/ru.md new file mode 100644 index 0000000..a3ca5e8 --- /dev/null +++ b/wiki/concepts/qsl-qfapi/ru.md @@ -0,0 +1,43 @@ +# Обзор QSL и QFAPI + +Эта статья объясняет различные стандартные библиотеки, с которыми вы можете столкнуться при создании модов с использованием Quilt. + +## Что такое API? + +API (интерфейс программирования приложений) предоставляет интерфейс для взаимодействия программ с другими программами. В контексте моддинга Minecraft, API обычно предоставляют инструменты для улучшенной совместимости между модами или другие полезные расширения. Например, многие известные моды имеют API, которое позволяет другим модам улучшать совместимость с ними. + +Кроме таких API, существуют библиотеки. Библиотеки сами по себе не добавляют контент в игру, а вместо этого реализуют API, чтобы упростить разработку определенных функций для других разработчиков. Fabric API и Quilt Standard Libraries — примеры официальных библиотек, опубликованных конкретным загрузчиком. + +Важно отметить, что API только определяет _способ_ взаимодействия с конкретной программой и _соответствующее поведение_, а не ее фактическую реализацию. **Реализации могут изменяться в любой момент, и поэтому их не следует использовать.** Реализации, как правило, содержат `impl` в названии пакета или класса, в то время как API иногда находятся в пакете `api`. + +## Fabric API + +Fabric API (сокращенно FAPI) — это API для Fabric, которое предоставляет полезные API, которых нет в Quilt Standard Libraries, такие как большинство API для рендеринга, API для групп предметов и API для привязки клавиш. Для Quilt существует альтернативная реализация, [Quilted Fabric API](#quilted-fabric-api), которая использует Quilt Standard Libraries там, где это возможно. + +## Quilt Standard Libraries + +Quilt Standard Libraries (сокращенно QSL) предоставляют множество базовых функций для модов, а также полезные API, такие как [Атрибуты записи реестра](../data/rea). + +Некоторые функции, которые предоставляет QSL: + +- [Основные точки входа](sideness#on-mod-initializers) для модов. +- Загрузка каталогов `assets` и `data` вашего мода через [загрузчик ресурсов](../data/resource-loader). +- Множество [событий](events), таких как события обновления мира. +- Расширяющие классы и интерфейсы для многих блоков, предметов, сущностей и многого другого. + +Хотя вы можете заставить свой мод работать только с помощью [mixin](mixins), QSL выполняет большую часть работы и гарантирует, что общие функции модов не будут вызывать конфликтов между ними. QSL также будет стараться поддерживать стабильность своего API между версиями Minecraft, чтобы вам было проще обновлять ваш мод. + +Однако API QSL не является достаточно полным, чтобы предоставить всю функциональность, которую обеспечивает Fabric API (аналогично, FAPI не предоставляет всего того, что предоставляет QSL), поэтому вы быстро столкнетесь с необходимостью использования Quilted Fabric API в своих проектах. + +## Quilted Fabric API + +Quilted Fabric API (сокращенно QFAPI) предоставляет Fabric API, но реализует его с использованием QSL там, где это возможно. API из FAPI с соответствующей альтернативой QSL в QFAPI считаются устаревшими, поэтому рекомендуется использовать API QSL, когда некоторые методы Fabric API устарели. + +Quilted Fabric API имеет два основных применения: + +- Оно предоставляет слой совместимости, чтобы моды Fabric могли работать на Quilt. +- Оно позволяет использовать API Fabric, когда QSL еще не предоставляет соответствующих API. Например, это касается [групп предметов](../items/first-item#adding-the-item-to-a-group). + +Поскольку QFAPI зависит от QSL и должен знать о реализации Fabric, оно всегда будет обновляться после того, как обновятся Fabric API и QSL. + +QFAPI также включает в себя QSL, что означает, что обычно вам будет достаточно использовать только QFAPI. Загрузки на [Modrinth](https://modrinth.com/mod/qsl) и [Curseforge](https://www.curseforge.com/minecraft/mc-mods/qsl) также включают QFAPI и QSL, упакованные вместе. From 8c267d69fa70ee6ecda4ace019dd8cbb18f9cec6 Mon Sep 17 00:00:00 2001 From: Mirik9724 <145905797+Mirik9724@users.noreply.github.com> Date: Sat, 5 Apr 2025 09:40:37 +1000 Subject: [PATCH 22/28] Create ua.md --- wiki/concepts/qsl-qfapi/ua.md | 43 +++++++++++++++++++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 wiki/concepts/qsl-qfapi/ua.md diff --git a/wiki/concepts/qsl-qfapi/ua.md b/wiki/concepts/qsl-qfapi/ua.md new file mode 100644 index 0000000..704cc2f --- /dev/null +++ b/wiki/concepts/qsl-qfapi/ua.md @@ -0,0 +1,43 @@ +# Огляд QSL та QFAPI + +Ця стаття пояснює різні стандартні бібліотеки, з якими ви можете зіткнутися при моддингу з використанням Quilt. + +## Що таке API? + +API (інтерфейс програмування додатків) надає інтерфейс для взаємодії програм з іншими програмами. В контексті моддингу Minecraft, API зазвичай надають інструменти для покращення сумісності між модами або надають інші корисні розширення. Наприклад, багато відомих модів мають API, яке дозволяє іншим модам покращити сумісність з ними. + +Окрім таких API існують бібліотеки. Бібліотеки самі по собі не додають контенту в гру, а замість цього реалізують API, щоб полегшити розробку певних функцій для інших розробників. Fabric API та Quilt Standard Libraries — це приклади офіційних бібліотек, опублікованих конкретним завантажувачем. + +Важливо зауважити, що API визначає лише _спосіб_ взаємодії з конкретною програмою і _відповідну поведінку_, а не її фактичну реалізацію. **Реалізації можуть змінюватися в будь-який момент, і тому їх не слід використовувати.** Реалізації зазвичай містять `impl` в назві пакету або класу, а API іноді знаходяться в пакеті `api`. + +## Fabric API + +Fabric API (скорочено FAPI) — це API для Fabric, яке надає корисні API, яких немає в Quilt Standard Libraries, такі як більшість API для рендерингу, API для груп предметів та API для прив'язки клавіш. Для Quilt існує альтернативна реалізація, [Quilted Fabric API](#quilted-fabric-api), яка використовує Quilt Standard Libraries там, де це можливо. + +## Quilt Standard Libraries + +Quilt Standard Libraries (скорочено QSL) надає безліч основних функцій для модів, а також багато корисних API, таких як [Атрибути запису реєстру](../data/rea). + +Деякі функції, які надає QSL: + +- [Основні точки входу](sideness#on-mod-initializers) для модів. +- Завантаження каталогів `assets` і `data` вашого мода через [завантажувач ресурсів](../data/resource-loader). +- Безліч [подій](events), таких як події тікання світу. +- Розширювальні класи та інтерфейси для багатьох блоків, предметів, сутностей та багато іншого. + +Хоча ви можете змусити свій мод працювати лише за допомогою [mixin](mixins), QSL виконує основну роботу і гарантує, що загальні функції модів не спричинять конфліктів між ними. QSL також намагається підтримувати стабільність свого API між версіями Minecraft, щоб вам було простіше оновлювати свій мод. + +Однак API QSL не є достатньо повним, щоб надати всю функціональність, яку забезпечує Fabric API (аналогічно, FAPI не надає всього, що надає QSL), тому ви швидко зіткнетеся з необхідністю використовувати Quilted Fabric API в своїх проектах. + +## Quilted Fabric API + +Quilted Fabric API (скорочено QFAPI) надає Fabric API, але реалізує його з використанням QSL там, де це можливо. API з FAPI з відповідною альтернативою QSL у QFAPI вважаються застарілими, тому рекомендується використовувати API QSL, коли деякі методи Fabric API застаріли. + +Quilted Fabric API має два основних призначення: + +- Воно надає шар сумісності, щоб моди Fabric могли працювати на Quilt. +- Воно дозволяє використовувати API Fabric, коли QSL ще не надає відповідних API. Наприклад, це стосується [груп предметів](../items/first-item#adding-the-item-to-a-group). + +Оскільки QFAPI залежить від QSL і має знати про реалізацію Fabric, воно завжди оновлюється після того, як будуть оновлені Fabric API та QSL. + +QFAPI також включає в себе QSL, тому зазвичай вам достатньо використовувати лише QFAPI. Завантаження на [Modrinth](https://modrinth.com/mod/qsl) та [Curseforge](https://www.curseforge.com/minecraft/mc-mods/qsl) також включають QFAPI та QSL, упаковані разом. From ca4737d529e2c78dd9552e6dfc8f04143d6a729e Mon Sep 17 00:00:00 2001 From: Mirik9724 <145905797+Mirik9724@users.noreply.github.com> Date: Sat, 5 Apr 2025 09:41:29 +1000 Subject: [PATCH 23/28] Create ua.md --- wiki/concepts/sideness/ua.md | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 wiki/concepts/sideness/ua.md diff --git a/wiki/concepts/sideness/ua.md b/wiki/concepts/sideness/ua.md new file mode 100644 index 0000000..fce860e --- /dev/null +++ b/wiki/concepts/sideness/ua.md @@ -0,0 +1,34 @@ +# Сторона сервера та клієнта + + + +## Про ініціалізатори модів + +Ініціалізатори модів є важливою частиною процесу завантаження модів у Minecraft. Вони визначають, коли і як мод буде ініціалізуватися під час запуску гри. Існують два типи ініціалізаторів: серверний та клієнтський, і вони мають різні функції та вплив на гру. + +### 1. **Серверні ініціалізатори** + +Серверні ініціалізатори використовуються для виконання коду, який пов'язаний лише з сервером Minecraft. Це може бути, наприклад, налаштування або ініціалізація певних елементів, які повинні бути доступні лише на сервері (наприклад, генерація світу, обробка даних гравців або взаємодія з іншими модами). + +#### Як працюють серверні ініціалізатори: +- Вони виконуються на сервері під час запуску або перезавантаження сервера. +- Вони можуть використовувати API для роботи з серверними аспектами гри, такими як реєстрація нових команд або налаштування механік гри, що стосуються лише сервера. +- Вони не мають доступу до клієнтських даних, тому не можна змінювати або взаємодіяти безпосередньо з UI або іншими клієнтськими елементами. + +### 2. **Клієнтські ініціалізатори** + +Клієнтські ініціалізатори використовуються для виконання коду, який пов'язаний лише з клієнтською стороною Minecraft. Це може бути ініціалізація модів, які змінюють вигляд гри, додавання нових шейдерів або взаємодія з графічними елементами. + +#### Як працюють клієнтські ініціалізатори: +- Вони виконуються тільки на клієнтській стороні, коли гравець запускає гру. +- Клієнтські ініціалізатори мають доступ до таких функцій, як зміна графіки, UI (інтерфейс користувача) і поведінка клієнтської частини гри. +- Вони можуть реєструвати нові елементи UI, обробляти події інтерфейсу та надавати графічні або візуальні модифікації. + +### 3. **Використання обох типів ініціалізаторів разом** + +Для багатьох модів, які працюють як на сервері, так і на клієнті, може бути потрібно використання як серверних, так і клієнтських ініціалізаторів. Це дозволяє модам забезпечувати потрібну функціональність як для клієнтської, так і для серверної частини гри. + +- **Змішані ініціалізатори** можуть виконуватися на обох кінцях, дозволяючи модам розширювати можливості гри у різних аспектах без впливу на стабільність гри. +- Зазвичай, для цього використовуються API, які забезпечують сумісність між сервером і клієнтом. + +Ці ініціалізатори можуть бути корисними для забезпечення гармонії між серверними та клієнтськими аспектами моддингу, тому важливо розуміти їхнє призначення та коректне використання при розробці модів для Minecraft. From f5d01c220a47d19b7fe71af7c9e8d6cb9f31943c Mon Sep 17 00:00:00 2001 From: Mirik9724 <145905797+Mirik9724@users.noreply.github.com> Date: Sat, 5 Apr 2025 09:41:45 +1000 Subject: [PATCH 24/28] Create ru.md --- wiki/concepts/sideness/ru.md | 34 ++++++++++++++++++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 wiki/concepts/sideness/ru.md diff --git a/wiki/concepts/sideness/ru.md b/wiki/concepts/sideness/ru.md new file mode 100644 index 0000000..899b3c2 --- /dev/null +++ b/wiki/concepts/sideness/ru.md @@ -0,0 +1,34 @@ +# Серверная и клиентская стороны + + + +## Об инициаторах модов + +Инициаторы модов играют важную роль в процессе загрузки модов в Minecraft. Они определяют, когда и как мод будет инициализироваться во время запуска игры. Существуют два типа инициаторов: серверный и клиентский, и они выполняют разные функции и оказывают различное влияние на игру. + +### 1. **Серверные инициаторы** + +Серверные инициаторы используются для выполнения кода, который связан только с серверной стороной Minecraft. Это может быть, например, настройка или инициализация определённых элементов, которые должны быть доступны только на сервере (например, генерация мира, обработка данных игроков или взаимодействие с другими модами). + +#### Как работают серверные инициаторы: +- Они выполняются на сервере во время запуска или перезагрузки сервера. +- Они могут использовать API для работы с серверными аспектами игры, такими как регистрация новых команд или настройка механик игры, касающихся только сервера. +- Они не имеют доступа к клиентским данным, поэтому нельзя изменять или взаимодействовать напрямую с UI или другими клиентскими элементами. + +### 2. **Клиентские инициаторы** + +Клиентские инициаторы используются для выполнения кода, который связан только с клиентской стороной Minecraft. Это может быть инициализация модов, которые изменяют внешний вид игры, добавление новых шейдеров или взаимодействие с графическими элементами. + +#### Как работают клиентские инициаторы: +- Они выполняются только на клиентской стороне, когда игрок запускает игру. +- Клиентские инициаторы имеют доступ к таким функциям, как изменение графики, UI (интерфейс пользователя) и поведения клиентской части игры. +- Они могут регистрировать новые элементы UI, обрабатывать события интерфейса и предоставлять графические или визуальные модификации. + +### 3. **Использование обоих типов инициаторов вместе** + +Для многих модов, которые работают как на сервере, так и на клиенте, может понадобиться использование как серверных, так и клиентских инициаторов. Это позволяет модам обеспечивать необходимую функциональность как для клиентской, так и для серверной части игры. + +- **Смешанные инициаторы** могут выполняться на обоих концах, позволяя модам расширять возможности игры в различных аспектах без влияния на стабильность игры. +- Обычно для этого используются API, которые обеспечивают совместимость между сервером и клиентом. + +Эти инициаторы могут быть полезны для обеспечения гармонии между серверными и клиентскими аспектами моддинга, поэтому важно понимать их назначение и правильное использование при разработке модов для Minecraft. From 5b72fc8751888c66db111eef118097fffd154f94 Mon Sep 17 00:00:00 2001 From: Mirik9724 <145905797+Mirik9724@users.noreply.github.com> Date: Sat, 5 Apr 2025 09:44:43 +1000 Subject: [PATCH 25/28] Create ua.tfl --- l10n/ua.tfl | 93 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 l10n/ua.tfl diff --git a/l10n/ua.tfl b/l10n/ua.tfl new file mode 100644 index 0000000..0ddc66a --- /dev/null +++ b/l10n/ua.tfl @@ -0,0 +1,93 @@ +application-title = Вікі розробника Quilt + +## Локалізація + +en = Англійська +fr = Французька +ua = Українська +ru = Російська + +## Бокова панель + +menu = Меню +articles = Статті + +## Випадаючий список мови + +language = Мова + +## Повідомлення + +# $wiki_source (String) - URL репозиторію вікі +dev-notice = Повідомлення: Цей сайт все ще в розробці. Будь ласка, повідомляйте про будь-які проблеми за посиланням { $wiki_source }. +translation-notice = Зверніть увагу, що оригінальна мова цієї вікі — англійська, а перекладені версії можуть бути неактуальні порівняно з англійською версією. +# $wiki_source (String) - URL репозиторію вікі +draft-notice = Ви перейшли за посиланням на статтю, яка запланована, але ще не реалізована. Якщо ви хочете допомогти у створенні цієї вікі, подивіться на { $wiki_source }. +# $current_locale (String) - Перекладена назва поточної вибраної мови +# $fallback_locale (String) - Перекладена назва вибраної резервної мови +article-not-translated-notice = Ця стаття ще не переведена на { $current_locale }, але ми знайшли версію на { $fallback_locale }. + +## Помилки + +# $error_code (String) - Код помилки +error-title = Помилка { $error_code } +# $page_path (String) - Шлях до сторінки без урахування локалі +not-found-error = Сторінка не знайдена за шляхом { $page_path }. +# $article_path (String) - Шлях до статті без урахування локалі +article-not-found-error = Стаття не знайдена за шляхом { $article_path }. +server-error = Сталася внутрішня помилка на сервері, будь ласка, спробуйте знову. + +## Вікі + +# Блоки +blocks = Блоки + .first-block = Додавання простого блоку + .oriented-block = Додавання орієнтованого блоку + .redstone-interaction = Додавання функціоналу редстоуну до блоку + +# Концепції +concepts = Концепції + .events = Події + .libraries = Список сторонніх бібліотек + .lifecycles-ticks = Життєві цикли та тики + .minecraft-code-structure = Структура коду Minecraft + .mixins = Міксини + .nbt = NBT та дані в Minecraft + .networking = Мережеве взаємодія + .qsl-qfapi = Огляд QSL та QFAPI + .registries = Реєстри + .sideness = Серверна і клієнтська частина + +# Дані +data = Дані + .adding-recipes = Додавання рецептів + .rea = Використання атрибутів запису реєстру (REA) + .recipe-api = API рецептів + .recipe-type = Додавання типу рецепту + .resource-loader = Завантажувач ресурсів + +# Вступ +introduction = Вступ + .getting-started = Початок роботи з Quilt + .setting-up = Налаштування середовища розробки + +# Предмети +items = Предмети + .armor = Додавання комплекту броні + .first-item = Створення першого предмета + .food = Додавання їжі + .tools = Додавання кастомних інструментів + +# Конфігурація +configuration = Конфігурація + .getting-started = Початок роботи з конфігурацією Quilt + .advanced-configuring = Розширене налаштування + .config-screen = Налаштування екрану конфігурації + .metadata = Анотації та довідник по метаданим + +# Різне +misc = Різне + .commands = Додавання команд + .sounds = Додавання звуків + .mappings = Кастомізація ваших відображень + .world_types = Додавання типів світів From 1ba5629252de81eb7023409f17f107c56e1bf87a Mon Sep 17 00:00:00 2001 From: Mirik9724 <145905797+Mirik9724@users.noreply.github.com> Date: Sat, 5 Apr 2025 09:45:20 +1000 Subject: [PATCH 26/28] Create ru.tfl --- l10n/ru.tfl | 93 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 93 insertions(+) create mode 100644 l10n/ru.tfl diff --git a/l10n/ru.tfl b/l10n/ru.tfl new file mode 100644 index 0000000..c8f6407 --- /dev/null +++ b/l10n/ru.tfl @@ -0,0 +1,93 @@ +application-title = Вики разработчика Quilt + +## Локализация + +en = Английский +fr = Французский +uk = Украинский +ru = Русский + +## Боковая панель + +menu = Меню +articles = Статьи + +## Выпадающий список языка + +language = Язык + +## Уведомления + +# $wiki_source (String) - URL репозитория вики +dev-notice = Уведомление: Этот сайт всё ещё в разработке. Пожалуйста, сообщайте о любых проблемах по ссылке { $wiki_source }. +translation-notice = Обратите внимание, что оригинальный язык этой вики — английский, а переведённые версии могут быть неактуальными по сравнению с английской версией. +# $wiki_source (String) - URL репозитория вики +draft-notice = Вы перешли по ссылке на статью, которая запланирована, но ещё не реализована. Если вы хотите помочь в создании этой вики, посмотрите на { $wiki_source }. +# $current_locale (String) - Переведённое название текущего выбранного языка +# $fallback_locale (String) - Переведённое название выбранного языка-запасного +article-not-translated-notice = Эта статья ещё не переведена на { $current_locale }, но мы нашли версию на { $fallback_locale }. + +## Ошибки + +# $error_code (String) - Код ошибки +error-title = Ошибка { $error_code } +# $page_path (String) - Путь к странице без учёта локали +not-found-error = Страница не найдена по пути { $page_path }. +# $article_path (String) - Путь к статье без учёта локали +article-not-found-error = Статья не найдена по пути { $article_path }. +server-error = Произошла внутренняя ошибка на сервере, пожалуйста, попробуйте снова. + +## Вики + +# Блоки +blocks = Блоки + .first-block = Добавление простого блока + .oriented-block = Добавление ориентированного блока + .redstone-interaction = Добавление функционала редстоуна в блок + +# Концепции +concepts = Концепции + .events = События + .libraries = Список сторонних библиотек + .lifecycles-ticks = Жизненные циклы и тики + .minecraft-code-structure = Структура кода Minecraft + .mixins = Миксины + .nbt = NBT и данные в Minecraft + .networking = Сетевые взаимодействия + .qsl-qfapi = Обзор QSL и QFAPI + .registries = Реестры + .sideness = Серверная и клиентская части + +# Данные +data = Данные + .adding-recipes = Добавление рецептов + .rea = Использование атрибутов записи реестра (REA) + .recipe-api = API рецептов + .recipe-type = Добавление типа рецепта + .resource-loader = Загрузчик ресурсов + +# Введение +introduction = Введение + .getting-started = Начало работы с Quilt + .setting-up = Настройка среды разработки + +# Предметы +items = Предметы + .armor = Добавление комплекта брони + .first-item = Создание первого предмета + .food = Добавление еды + .tools = Добавление кастомных инструментов + +# Конфигурация +configuration = Конфигурация + .getting-started = Начало работы с конфигурацией Quilt + .advanced-configuring = Расширенная настройка + .config-screen = Настройка экрана конфигурации + .metadata = Аннотации и справочник по метаданным + +# Разное +misc = Разное + .commands = Добавление команд + .sounds = Добавление звуков + .mappings = Кастомизация ваших отображений + .world_types = Добавление типов миров From 56423995898bd92b718787a5674e35572f2468cf Mon Sep 17 00:00:00 2001 From: Mirik9724 <145905797+Mirik9724@users.noreply.github.com> Date: Sat, 5 Apr 2025 09:47:20 +1000 Subject: [PATCH 27/28] Update fr.ftl --- l10n/fr.ftl | 2 ++ 1 file changed, 2 insertions(+) diff --git a/l10n/fr.ftl b/l10n/fr.ftl index d19774b..4996a60 100644 --- a/l10n/fr.ftl +++ b/l10n/fr.ftl @@ -4,6 +4,8 @@ application-title = Wiki pour Développeur·euse·s Quilt en = Anglais fr = Français +ru = Russe +ua = Ukrainien ## Sidebar From a1ff419cd2d242b5eaae282ce15761e7dfb27a75 Mon Sep 17 00:00:00 2001 From: Mirik9724 <145905797+Mirik9724@users.noreply.github.com> Date: Sat, 5 Apr 2025 09:47:30 +1000 Subject: [PATCH 28/28] Update en.ftl --- l10n/en.ftl | 2 ++ 1 file changed, 2 insertions(+) diff --git a/l10n/en.ftl b/l10n/en.ftl index fd21949..3275cf7 100644 --- a/l10n/en.ftl +++ b/l10n/en.ftl @@ -4,6 +4,8 @@ application-title = Quilt Developer Wiki en = English fr = French +ru = Russian +ua = Ukrainian ## Sidebar