Генерація досягнень
ПЕРЕДУМОВИ
Спершу переконайтеся, що ви виконали процес налаштування datagen.
Налаштування
По-перше, нам потрібно створити свого постачальника. Створіть клас, який розширює FabricAdvancementProvider та заповніть базові методи:
java
No lines matched.1
Щоб завершити налаштування, додайте цього постачальника до своєї DataGeneratorEntrypoint у методі onInitializeDataGenerator.
java
No lines matched.1
Структура досягнення
Досягнення складається з кількох різних компонентів. Разом із вимогами, які називаються «критерієм», він може мати:
DisplayInfo, який повідомляє грі, як показувати до досягнення гравцям,AdvancementRequirements, які є списками списків критеріїв, які вимагають заповнення принаймні одного критерію з кожного підсписку,AdvancementRewards, які гравець отримує за виконання досягнення.Strategy, який повідомляє досягненню, як обробляти кілька критеріїв, і- Батьківський
Advancement, який організовує ієрархію, яку ви бачите на екрані «Досягнення».
Прості досягнення
Ось просте досягнення для отримання ґрунту:
java
No lines matched.1
WARNING
Під час створення записів про досягнення пам’ятайте, що функція приймає Identifier досягнення у форматі String!
Вивід JSON
json
{
"criteria": {
"got_dirt": {
"conditions": {
"items": [
{
"items": "minecraft:dirt"
}
]
},
"trigger": "minecraft:inventory_changed"
}
},
"display": {
"background": "minecraft:textures/gui/advancements/backgrounds/adventure.png",
"description": "Now make a house from it",
"icon": {
"id": "minecraft:dirt"
},
"title": "Your First Dirt Block"
},
"requirements": [
[
"got_dirt"
]
],
"sends_telemetry_event": true
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
Ще один приклад
Щоб зрозуміти, додамо ще одне досягнення. Ми попрактикуємося додавати нагороди, використовувати кілька критеріїв і призначати батьківські досягнення:
java
No lines matched.1
Власні критерії
WARNING
У той час як datagen може бути на стороні клієнта, Criterion і Predicate знаходяться в основному вихідному наборі (обидві сторони), оскільки сервер повинен ініціювати та оцінювати їх.
Визначення
criterion (у множині: criteria) — це те, що гравець може зробити (або що може статися з гравцем), що може бути зараховано для досягнення. У грі є багато критеріїв, які можна знайти в пакеті net.minecraft.advancements.criterion. Як правило, вам знадобиться новий критерій, лише якщо ви запровадите в гру спеціальну механіку.
Умови оцінюються за критеріями. Критерій зараховується, лише якщо виконуються всі відповідні умови. Умови зазвичай виражаються присудком.
Предикат — це те, що приймає значення та повертає boolean. Наприклад, Predicate<Item> може повернути true, якщо предмет є діамантом, тоді як Predicate<LivingEntity> може повернути true, якщо сутність не є ворожою до селян.
Створення власних критеріїв
По-перше, нам знадобиться нова механіка для впровадження. Скажімо гравцеві, який інструмент він використовував щоразу, коли ламав блок.
java
No lines matched.1
Зауважте, що цей код дійсно поганий. HashMap не зберігається ніде постійно, тому він буде скидатися кожного разу, коли гра перезапускається. Це просто для того, щоб похизуватися критеріями. Почніть гру та спробуйте!
Далі створимо наш спеціальний критерій, UseToolCriterion. Йому знадобиться власний клас Conditions, тому ми створимо їх обидва одночасно:
java
No lines matched.1
Вау, це багато! Розберімо це.
UseToolCriterion– цеSimpleCriterionTrigger, до якого можуть застосовуватисяConditions.Conditionsмають полеplayerPredicate. УсіConditionsповинні мати предикат гравця (технічноLootContextPredicate).Conditionsтакож маютьCODEC. ЦейCodecє просто кодеком для його одного поля,playerPredicate, з додатковими інструкціями для перетворення між ними (xmap).
INFO
Щоб дізнатися більше про кодеки, перегляньте сторінку кодеків.
Нам знадобиться спосіб перевірити, чи виконуються умови. Нумо додаймо допоміжний метод до Conditions:
java
No lines matched.1
Тепер, коли ми маємо критерій і його умови, нам потрібен спосіб його запустити. Додайте метод запуску до UseToolCriterion:
java
No lines matched.1
Майже готово! Далі нам потрібен екземпляр нашого критерію для роботи. Помістімо його в новий клас під назвою ModCriteria.
java
No lines matched.1
Щоб переконатися, що наші критерії ініціалізуються в потрібний час, додайте порожній метод init:
java
No lines matched.1
І викличте це у своєму ініціалізаторі мода:
java
No lines matched.1
Нарешті, нам потрібно запустити наші критерії. Додайте це туди, де ми надіслали повідомлення гравцеві в головному класі мода.
java
No lines matched.1
Ваш новий блискучий критерій готовий до використання! Нумо додамо до нашого постачальника:
java
No lines matched.1
Запустіть завдання datagen ще раз, і ви отримаєте нове досягнення, з яким можна грати!
Умови з параметрами
Це все добре, але що, якщо ми хочемо надати досягнення лише після виконання певної роботи 5 разів? А чому б не ще один у 10 разів? Для цього нам потрібно надати умові параметр. Ви можете залишитися з UseToolCriterion, або ви можете слідувати разом із новим ParameterizedUseToolCriterion. На практиці ви повинні мати лише параметризований, але ми збережемо обидва для цього посібника.
Попрацюймо знизу вгору. Нам потрібно буде перевірити, чи виконуються вимоги, тому відредагуємо наш метод Conditions#requirementsMet:
java
No lines matched.1
requiredTimes не існує, тому зробіть його параметром Conditions:
java
No lines matched.1
Тепер наш кодек неправильний. Напишімо новий кодек для нових змін:
java
No lines matched.1
Рухаючись далі, тепер нам потрібно виправити наш метод trigger:
java
No lines matched.1
Якщо ви створили новий критерій, нам потрібно додати його до ModCriteria
java
No lines matched.1
І назвіть це в нашому головному класі, там, де й старий:
java
No lines matched.1
Додайте досягнення до свого постачальника:
java
No lines matched.1
Запустіть datagen ще раз, і ви нарешті закінчили!





