Умови ресурсів 26.1.2
Дізнайтеся, як дозволити вашу моду завантажувати дані з умовами.
Під час проєктування інтеграції з іншими модами типовою потребою є спосіб визначення часу завантаження ресурсів вашого мода. З цієї причини Fabric API пропонує умови ресурсів.
Усталено, цей API можна використовувати з рецептами, досягненнями, таблицями здобичі, предикатами та модифікаторами предметів.
Умови ресурсів можна додати через генерацію даних або під час написання JSON уручну. Щоб отримати додаткові відомості про те, як додати умови ресурсів за допомогою генерації даних, перегляньте документацію щодо генерації даних.
Умови завантаження додаються в корінь файлу JSON.
Рецепт з умовою, за якою він завантажується лише тоді, коли теґ заповнюється.
json
{
"fabric:load_conditions": [
{
"condition": "fabric:tags_populated",
"registry": "minecraft:item",
"values": [
"minecraft:dirt"
]
}
],
"type": "minecraft:crafting_shapeless",
"category": "building",
"ingredients": [
"#minecraft:sand"
],
"result": {
"id": "minecraft:sand"
}
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Убудовані умови
API Fabric надає дев’ять убудованих умов для використання вашим модом.
Оператори
Це стандартні логічні оператори.
Так
Завжди виконується:
json
{
"fabric:load_conditions": [
{
"condition": "fabric:true"
}
]
}1
2
3
4
5
6
7
2
3
4
5
6
7
Хиба
Завжди не вдається:
json
{
"fabric:load_conditions": [
{
"condition": "fabric:false"
}
]
}1
2
3
4
5
6
7
2
3
4
5
6
7
Ні
Інвертує умову завантаження, указану в value. Наприклад, наступне не вдасться:
json
{
"fabric:load_conditions": [
{
"condition": "fabric:not",
"value": {
"condition": "fabric:true"
}
}
]
}1
2
3
4
5
6
7
8
9
10
2
3
4
5
6
7
8
9
10
Або
Удасться, якщо принаймні одна з умов у value виконується. Наприклад, наступне вдасться:
json
{
"fabric:load_conditions": [
{
"condition": "fabric:or",
"values": [
{
"condition": "fabric:true"
},
{
"condition": "fabric:not",
"value": {
"condition": "fabric:true"
}
}
]
}
]
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Також
Успішно виконується, якщо виконується кожна умова в value. Наприклад, наступне не вдасться:
json
{
"fabric:load_conditions": [
{
"condition": "fabric:and",
"values": [
{
"condition": "fabric:true"
},
{
"condition": "fabric:not",
"value": {
"condition": "fabric:true"
}
}
]
}
]
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Усі моди завантажені
Удасться, якщо завантажено всі моди у value. Наприклад, наступне виконується успішно, лише якщо завантажено і example-mod, і another-mod:
json
{
"fabric:load_conditions": [
{
"condition": "fabric:all_mods_loaded",
"values": [
"example-mod",
"another-mod"
]
}
]
}1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
Будь-який мод завантажено
Удасться, якщо завантажено принаймні один із модів у value. Наприклад, наступне вдасться, якщо завантажено example-mod, або another-mod, або обидва:
json
{
"fabric:load_conditions": [
{
"condition": "fabric:any_mods_loaded",
"values": [
"example-mod",
"another-mod"
]
}
]
}1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
Теґи заповнені
Удасться, якщо вказаний реєстр містить усі теґи в values. Наприклад, наступне вдаватиметься, якщо завантажено теґ предметів example-mod:smelly_items:
json
{
"fabric:load_conditions": [
{
"condition": "fabric:tags_populated",
"registry": "minecraft:item",
"values": [
"example-mod:smelly_items"
]
}
]
}1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
Увімкнено функції
Удасться, якщо всі прапорці функцій у features увімкнено. Наприклад, наступне вдаватиметься, якщо ввімкнути minecraft:vanilla та minecraft:redstone_experiments:
json
{
"fabric:load_conditions": [
{
"condition": "fabric:features_enabled",
"features": [
"minecraft:vanilla",
"minecraft:minecart_improvements"
]
}
]
}1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
Реєстр містить
Удасться, якщо реєстр містить усі ідентифікатори в values. Наприклад, наступне удаватиметься, якщо minecraft:cobblestone існує в реєстрі:
json
{
"fabric:load_conditions": [
{
"condition": "fabric:registry_contains",
"registry": "minecraft:block",
"values": [
"minecraft:cobblestone"
]
}
]
}1
2
3
4
5
6
7
8
9
10
11
2
3
4
5
6
7
8
9
10
11
Власні умови
ПЕРЕДУМОВИ
Ви повинні спочатку зрозуміти, як створити кодек, перш ніж створювати власну умову ресурсів.
Fabric API також забезпечує гнучкість створення власних умов ресурсів.
Щоб продемонструвати це, ми створимо умову, яка перевіряє поточну дату. Це можна використовувати для особливої поведінки на свята, як-от Гелловін або Перше квітня.
Підготовка вашої умови
Для простоти ми створимо допоміжний метод, який створить екземпляр вашої умови ресурсів з назвою та MapCodec. Вам слід помістити цей метод у клас під назвою ModResourceConditions (або як ви хочете його назвати).
TIP
Fabric робить те саме зі своїми вбудованими умовами; ви можете звернутися до класу DefaultResourceConditionTypes, щоб побачити це в дії.
java
public class ModResourceConditions {
private static <T extends ResourceCondition> ResourceConditionType<T> createResourceConditionType(String name, MapCodec<T> codec) {
return ResourceConditionType.create(Identifier.fromNamespaceAndPath(ExampleMod.MOD_ID, name), codec);
}
}1
2
3
4
5
2
3
4
5
Створення вашої умови
Умова ресурсів складається з трьох частин:
- Конструктор, який приймає значення.
MapCodecдля серіалізації цих значень.- Метод
test, який використовує значення, щоб визначити, чи має виконуватися умова.
Ми створимо новий клас для умови ресурсів під назвою DateMatchesResourceCondition. Спочатку створіть новий record, який приймає int для місяця та int для дня:
java
public record DateMatchesResourceCondition(int month, int day) implements ResourceCondition {
}1
2
2
Далі додайте MapCodec, який показує те, що приймає конструктор:
java
public static final MapCodec<DateMatchesResourceCondition> CODEC = RecordCodecBuilder.<DateMatchesResourceCondition>mapCodec(instance -> instance.group(
ExtraCodecs.POSITIVE_INT.fieldOf("month").forGetter(DateMatchesResourceCondition::month),
ExtraCodecs.POSITIVE_INT.fieldOf("day").forGetter(DateMatchesResourceCondition::day)
).apply(instance, DateMatchesResourceCondition::new)).validate(DateMatchesResourceCondition::validate);1
2
3
4
2
3
4
Що є validate?
Цей кодек використовує метод .validate, щоб гарантувати наявність наданої дати, використовуючи логіку допоміжного методу, який також називається validate:
java
private static DataResult<DateMatchesResourceCondition> validate(DateMatchesResourceCondition o) {
try {
MonthDay.of(o.month(), o.day());
} catch (DateTimeException e) {
return DataResult.error(e::getMessage);
}
return DataResult.success(o);
}1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
Це стосується лише цього прикладу.
Далі ми додамо метод test, який перевіряє поточну дату. Цей приклад базується на логіці самої гри, у SpecialDates.
java
@Override
public boolean test(RegistryOps.@Nullable RegistryInfoLookup registryInfo) {
var monthDay = MonthDay.of(this.month, this.day);
return SpecialDates.dayNow().equals(monthDay);
}1
2
3
4
5
2
3
4
5
Реєстрація вашої умови
Повернувшись до ModResourceConditions, тепер ми можемо зареєструвати нашу умову ресурсів:
java
public static final ResourceConditionType<DateMatchesResourceCondition> DATE_MATCHES =
createResourceConditionType("date_matches", DateMatchesResourceCondition.CODEC);
public static void register() {
ResourceConditions.register(DATE_MATCHES);
}1
2
3
4
5
6
2
3
4
5
6
На цей тип умови також можна посилатися з DateMatchesResourceCondition:
java
@Override
public ResourceConditionType<?> getType() {
return ModResourceConditions.DATE_MATCHES;
}1
2
3
4
2
3
4
Обов’язково викликайте ModResourceConditions.register у своєму ініціалізаторі мода:
java
public class ExampleModResourceConditions implements ModInitializer {
@Override
public void onInitialize() {
ModResourceConditions.register();
}
}1
2
3
4
5
6
2
3
4
5
6
Використання вашої умови
Тепер у нас є умова, яка виконується успішно, якщо системна дата збігається з датою, зазначеною в умові ресурсів. Наприклад, ця умова буде виконана лише Першого квітня:
json
{
"fabric:load_conditions": [
{
"condition": "example-mod:date_matches",
"day": 1,
"month": 4
}
]
}1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9

