ПЕРЕДУМОВИ
Переконайтеся, що ви завершили налаштування даних і створили свій перший предмет.
Для кожної моделі предмета, яку ми хочемо створити, ми повинні створити два окремих файли JSON:
- Модель предмета, яка визначає текстури, обертання та загальний вигляд предмета. Він знаходиться в каталозі
generated/assets/example-mod/models/item. - Клієнтський предмет, який визначає, яку модель слід використовувати на основі різних критеріїв, таких як компоненти, взаємодії тощо. Він знаходиться в каталозі
generated/assets/example-mod/items.
Налаштування
По-перше, ми повинні створити наш постачальник моделі.
TIP
Ви можете повторно використовувати FabricModelProvider, створений у генерації моделі блока.
Створіть клас, який розширює FabricModelProvider, і реалізуйте обидва абстрактні методи: generateBlockStateModels і generateItemModels. Тепер, створімо конструктор, що відповідає super.
java
public class ExampleModModelProvider extends FabricModelProvider {
public ExampleModModelProvider(FabricDataOutput output) {
super(output);
}
@Override
public void generateBlockStateModels(BlockModelGenerators blockStateModelGenerator) {
}
@Override
public void generateItemModels(ItemModelGenerators itemModelGenerator) {
}
@Override
public String getName() {
return "ExampleModModelProvider";
}
}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
Зареєструйте цей клас у своїй DataGeneratorEntrypoint в рамках методу onInitializeDataGenerator.
java
pack.addProvider(ExampleModModelProvider::new);1
Убудовані моделі предметів
Для моделей предметів ми будемо використовувати метод generateItemModels. Його параметр ItemModelGenerators itemModelGenerator відповідає за генерацію моделей предметів, а також містить методи для цього.
Ось посилання на найпоширеніші методи генерації моделі предмета.
Простий
Прості моделі предметів є типовими, і саме вони використовуються в більшості предметів Minecraft. Їхня батьківська модель — GENERATED. Вони використовують свою 2D текстуру в інвентарі та промальовуються в 3D у грі. Прикладом можуть бути човни, свічки або барвники.
java
itemModelGenerator.generateFlatItem(ModItems.RUBY, ModelTemplates.FLAT_ITEM);1
У руці
Ручні моделі предметів зазвичай використовуються як інструменти та зброя (сокири, мечі, тризубець). Вони повертаються та розташовуються трохи інакше, ніж звичайні моделі, щоб виглядати природніше в руці.
java
itemModelGenerator.generateFlatItem(ModItems.GUIDITE_AXE, ModelTemplates.FLAT_HANDHELD_ITEM);1
Перефарбовуваність
Метод для фарбувальних предметів генерує просту модель предмета та клієнтський предмет, який визначає колір відтінку. Для цього методу потрібне десяткове усталеного значення кольору, яке використовується, коли річ не пофарбована. Усталеним значенням для шкіри є 0xFFA06540.
java
itemModelGenerator.generateDyedItem(ModItems.LEATHER_GLOVES, 0xFFA06540);1
ВАЖЛИВО
Ви повинні додати свій предмет до теґу ItemTags.DYEABLE, щоб мати можливість фарбувати його у своєму інвентарі!
Умовний
Далі ми розглянемо створення моделей предмета, які змінюють свій візуальний вигляд залежно від виконання певної умови, зазначеної другим параметром BooleanProperty. Ось деякі з них:
| Властивість | Опис |
|---|---|
IsKeybindDown | Правда, коли натиснуто вказану клавішу. |
IsUsingItem | Правда, коли предмет використовується (наприклад, під час блокування щитом). |
Broken | Так, якщо предмет має 0 міцності (наприклад, елітри змінюють текстуру, коли ламаються). |
HasComponent | Так, якщо предмет містить певний компонент. |
Третій і четвертий параметри — це моделі, які будуть використовуватися, коли властивість має значення true або false відповідно.
java
itemModelGenerator.generateBooleanDispatch(
ModItems.FLASHLIGHT,
ItemModelUtils.isUsingItem(),
ItemModelUtils.plainModel(itemModelGenerator.createFlatItemModel(ModItems.FLASHLIGHT, "_lit", ModelTemplates.FLAT_ITEM)),
ItemModelUtils.plainModel(itemModelGenerator.createFlatItemModel(ModItems.FLASHLIGHT, ModelTemplates.FLAT_ITEM))
);1
2
3
4
5
6
2
3
4
5
6
ВАЖЛИВО
Щоб отримати Identifier, який передається в ItemModelUtils.plainModel(), завжди використовуйте itemModelGenerator.createFlatItemModel(), інакше будуть згенеровані лише клієнтські предмети, а не моделі!
Композит
Складені моделі предметів складаються з однієї або кількох текстур, накладених одна на одну. Для цього немає стандартних методів; вам потрібно використовувати поле itemModelOutput itemModelGenerator і викликати в ньому accept().
java
ItemModel.Unbaked hoe = ItemModelUtils.plainModel(itemModelGenerator.createFlatItemModel(ModItems.ENHANCED_HOE, ModelTemplates.FLAT_ITEM));
ItemModel.Unbaked hoePlus = ItemModelUtils.plainModel(itemModelGenerator.createFlatItemModel(ModItems.ENHANCED_HOE, "_plus", ModelTemplates.FLAT_ITEM));
itemModelGenerator.itemModelOutput.accept(
ModItems.ENHANCED_HOE,
ItemModelUtils.composite(hoe, hoePlus)
);1
2
3
4
5
6
7
2
3
4
5
6
7
Вибір
Рендерить модель предмета на основі значення певної властивості. Ось деякі з них:
| Властивість | Опис |
|---|---|
ContextDimension | Рендерить модель предмета на основі виміру, у якому знаходиться гравець (Верхній світ, Незер, Енд). |
MainHand | Рендерить модель предмета, якщо предмет знаходиться в головній руці гравця. |
DisplayContext | Рендерить моделі предмета залежно від того, де знаходиться предмет (ground, fixed, head, …). |
ContextEntityType | Рендерить модель предмета на основі сутності, яка зберігає елемент. |
У цьому прикладі предмет змінює текстуру під час подорожі між вимірами: він зелений у Верхньому світі, червоний у Незері та чорний в Енді.
java
ItemModel.Unbaked crystalOverworld = ItemModelUtils.plainModel(itemModelGenerator.createFlatItemModel(ModItems.DIMENSIONAL_CRYSTAL, "_overworld", ModelTemplates.FLAT_ITEM));
ItemModel.Unbaked crystalNether = ItemModelUtils.plainModel(itemModelGenerator.createFlatItemModel(ModItems.DIMENSIONAL_CRYSTAL, "_nether", ModelTemplates.FLAT_ITEM));
ItemModel.Unbaked crystalEnd = ItemModelUtils.plainModel(itemModelGenerator.createFlatItemModel(ModItems.DIMENSIONAL_CRYSTAL, "_end", ModelTemplates.FLAT_ITEM));
itemModelGenerator.itemModelOutput.accept(
ModItems.DIMENSIONAL_CRYSTAL,
ItemModelUtils.select(new ContextDimension(),
ItemModelUtils.when(Level.OVERWORLD, crystalOverworld),
ItemModelUtils.when(Level.NETHER, crystalNether),
ItemModelUtils.when(Level.END, crystalEnd)
)
);1
2
3
4
5
6
7
8
9
10
11
12
2
3
4
5
6
7
8
9
10
11
12
Розсилка діапазону
Рендерить модель предмета на основі значення числової властивості. Уключає предмет і список варіантів, кожен з яких поєднується зі значенням. Приклади включають компас, лук і щітку.
Існує досить багато підтримуваних властивостей, ось кілька прикладів:
| Властивість | Опис |
|---|---|
Cooldown | Рендерить модель предмета на основі залишкового часу перезарядки предмета. |
Count | Рендерить модель предмета на основі розміру стосу. |
UseDuration | Рендерить модель предмета на основі того, як довго він використовується. |
Damage | Рендерить модель предмета на основі шкоди від атаки (компонент «minecraft:damage»). |
У цьому прикладі використовується Count, змінюючи текстуру від одного ножа до трьох залежно від розміру стосу.
java
ItemModel.Unbaked knifeOne = ItemModelUtils.plainModel(itemModelGenerator.createFlatItemModel(ModItems.THROWING_KNIVES, "_one", ModelTemplates.FLAT_ITEM));
ItemModel.Unbaked knifeTwo = ItemModelUtils.plainModel(itemModelGenerator.createFlatItemModel(ModItems.THROWING_KNIVES, "_two", ModelTemplates.FLAT_ITEM));
ItemModel.Unbaked knifeThree = ItemModelUtils.plainModel(itemModelGenerator.createFlatItemModel(ModItems.THROWING_KNIVES, "_three", ModelTemplates.FLAT_ITEM));
itemModelGenerator.itemModelOutput.accept(
ModItems.THROWING_KNIVES,
ItemModelUtils.rangeSelect(
new Count(false),
List.of(
ItemModelUtils.override(knifeOne, 1.0F),
ItemModelUtils.override(knifeTwo, 2.0F),
ItemModelUtils.override(knifeThree, 3.0F)
)
)
);1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Спеціальні моделі предметів
Генерувати моделі предметів не обов’язково лише за допомогою методів; ви, звичайно, можете створити свій власний. У цьому розділі ми створимо власну модель для предмета повітряної кулі.
Усі поля та методи для цієї частини посібника оголошено у статичному внутрішньому класі під назвою CustomItemModelGenerator.
Показ CustomItemModelGenerator
java
public static class CustomItemModelGenerator {
//:::custom-item-model:::
public static final ModelTemplate SCALED2X = item("scaled2x", TextureSlot.LAYER0);
//:::custom-item-model:::
//:::custom-item-datagen-method
public static void registerScaled2x(Item item, ItemModelGenerators generator) {
Identifier itemModel = SCALED2X.create(item, TextureMapping.singleSlot(TextureSlot.LAYER0, ModelLocationUtils.getModelLocation(item)), generator.modelOutput);
generator.itemModelOutput.accept(item, ItemModelUtils.plainModel(itemModel));
}
//:::custom-item-datagen-method
@SuppressWarnings("SameParameterValue")
//:::custom-item-model:::
private static ModelTemplate item(String parent, TextureSlot requiredTextureKeys) {
return new ModelTemplate(Optional.of(Identifier.fromNamespaceAndPath(ExampleMod.MOD_ID, "item/" + parent)), Optional.empty(), requiredTextureKeys);
}
//:::custom-item-model:::
}1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Створення власної батьківської моделі
Спочатку створімо модель батьківського предмета, яка визначає, як предмет виглядає в грі. Скажімо, ми хочемо, щоб повітряна куля виглядала як прості моделі предметів, але в збільшеному масштабі.
Для цього ми створимо resources/assets/example-mod/models/item/scaled2x.json, встановимо батьківською модель item/generated, а потім перевизначимо масштабування.
json
{
"parent": "item/generated",
"display": {
"ground": {
"rotation": [0, 0, 0],
"translation": [0, 2, 0],
"scale": [1, 1, 1]
},
"head": {
"rotation": [0, 180, 0],
"translation": [0, 13, 7],
"scale": [2, 2, 2]
},
"thirdperson_righthand": {
"rotation": [0, 0, 0],
"translation": [0, 3, 1],
"scale": [1.1, 1.1, 1.1]
},
"firstperson_righthand": {
"rotation": [0, -90, 25],
"translation": [1.13, 3.2, 1.13],
"scale": [1.36, 1.36, 1.36]
}
}
}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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
Це зробить модель візуально у два рази більше простих.
Створення ModelTemplate
Далі нам потрібно створити екземпляр класу ModelTemplate. Він представлятиме фактичну [модель батьківського предмета] (#custom-parent) у нашому моді.
java
public static final ModelTemplate SCALED2X = item("scaled2x", TextureSlot.LAYER0);
private static ModelTemplate item(String parent, TextureSlot requiredTextureKeys) {
return new ModelTemplate(Optional.of(Identifier.fromNamespaceAndPath(ExampleMod.MOD_ID, "item/" + parent)), Optional.empty(), requiredTextureKeys);
}1
2
3
4
5
6
2
3
4
5
6
Метод item() створює новий екземпляр ModelTemplate, вказуючи на файл scaled2x.json, який ми створили раніше.
TextureSlot LAYER0 представляє змінну текстури #layer0, яка потім буде замінена ідентифікатором, що вказує на текстуру.
Додавання власного методу Datagen
Останнім кроком є створення спеціального методу, який буде викликаний у методі generateItemModels() і відповідатиме за створення наших моделей предметів.
java
public static void registerScaled2x(Item item, ItemModelGenerators generator) {
Identifier itemModel = SCALED2X.create(item, TextureMapping.singleSlot(TextureSlot.LAYER0, ModelLocationUtils.getModelLocation(item)), generator.modelOutput);
generator.itemModelOutput.accept(item, ItemModelUtils.plainModel(itemModel));
}1
2
3
4
5
2
3
4
5
Розберімося, для чого потрібні параметри:
Item item: предмет, для якого ми створюємо моделі.ItemModelGenerators generator: те саме, що передається в методgenerateItemModels(). Використовується для своїх полів.
Спочатку ми отримуємо Identifier предмета за допомогою SCALED2X.create(), передаючи TextureMapping і modelOutput з нашого параметра generator.
Потім ми використаємо інше його поле, itemModelOutput (яке, по суті, працює як споживач), і використаємо метод accept(), щоб моделі фактично були згенеровані.
Виклик власного методу
Тепер нам потрібно лише викликати наш метод у методі generateItemModels().
java
CustomItemModelGenerator.registerScaled2x(ModItems.BALLOON, itemModelGenerator);1
Не забудьте додати файл текстури!
Джерела та посилання
Ви можете переглянути приклади тестів у Fabric API, прикладний мод цієї документації для отримання додаткової інформації.





