Генерація рецептів 26.1.2
Посібник із налаштування генерації рецептів за допомогою генерації даних.
WARNING
Ця сторінка написана для версії 26.1.2. Документація для старіших версій може бути неповною.
ПЕРЕДУМОВИ
Спершу переконайтеся, що ви виконали процес налаштування генерації даних.
Налаштування
По-перше, нам знадобиться наш постачальник. Створіть клас, який розширює FabricRecipeProvider. Уся наша генерація рецептів відбуватиметься всередині методу buildRecipes нашого постачальника.
java
import java.util.List;
import java.util.concurrent.CompletableFuture;
import net.minecraft.core.HolderLookup;
import net.minecraft.core.registries.Registries;
import net.minecraft.data.recipes.RecipeCategory;
import net.minecraft.data.recipes.RecipeOutput;
import net.minecraft.data.recipes.RecipeProvider;
import net.minecraft.data.recipes.SimpleCookingRecipeBuilder;
import net.minecraft.resources.Identifier;
import net.minecraft.tags.ItemTags;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.Items;
import net.minecraft.world.item.crafting.CookingBookCategory;
import net.minecraft.world.item.crafting.Ingredient;
import net.fabricmc.fabric.api.datagen.v1.FabricPackOutput;
import net.fabricmc.fabric.api.datagen.v1.provider.FabricRecipeProvider;
import net.fabricmc.fabric.api.resource.conditions.v1.ResourceConditions;
import com.example.docs.ExampleMod;
import com.example.docs.item.ModItems;
public class ExampleModRecipeProvider extends FabricRecipeProvider {
public ExampleModRecipeProvider(FabricPackOutput output, CompletableFuture<HolderLookup.Provider> registriesFuture) {
super(output, registriesFuture);
}
@Override
protected RecipeProvider createRecipeProvider(HolderLookup.Provider registryLookup, RecipeOutput exporter) {
return new RecipeProvider(registryLookup, exporter) {
@Override
public void buildRecipes() {
HolderLookup.RegistryLookup<Item> itemLookup = registries.lookupOrThrow(Registries.ITEM);
}
};
}
@Override
public String getName() {
return "ExampleModRecipeProvider";
}
}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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
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
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
Щоб завершити налаштування, додайте цього постачальника до своєї DataGeneratorEntrypoint у методі onInitializeDataGenerator.
java
pack.addProvider(ExampleModRecipeProvider::new);1
Безформні рецепти
Безформні рецепти досить прості. Просто додайте їх до методу buildRecipes у вашому постачальнику:
java
shapeless(RecipeCategory.BUILDING_BLOCKS, Items.DIRT) // You can also specify an int to produce more than one
.requires(Items.COARSE_DIRT) // You can also specify an int to require more than one, or a tag to accept multiple things
// Create an advancement that gives you the recipe
.unlockedBy(getHasName(Items.COARSE_DIRT), has(Items.COARSE_DIRT))
.save(output);1
2
3
4
5
6
2
3
4
5
6
Рецепти забарвлення
Рецепти забарвлення використовуються для зміни кольору предметів в інвентарі.
java
dyedItem(ModItems.LEATHER_GLOVES, "leather_gloves");1
Формні рецепти
Для формного рецепта ви визначаєте форму за допомогою String, а потім визначаєте, що означає кожен char у String.
java
shaped(RecipeCategory.MISC, Items.CRAFTING_TABLE, 4)
.pattern("ll")
.pattern("ll")
.define('l', ItemTags.LOGS) // 'l' means "any log"
.group("multi_bench") // Put it in a group called "multi_bench" - groups are shown in one slot in the recipe book
.unlockedBy(getHasName(Items.CRAFTING_TABLE), has(Items.CRAFTING_TABLE))
.save(output);
shaped(RecipeCategory.MISC, Items.LOOM, 4)
.pattern("ww")
.pattern("ll")
.define('w', ItemTags.WOOL) // 'w' means "any wool"
.define('l', ItemTags.LOGS)
.group("multi_bench")
.unlockedBy(getHasName(Items.LOOM), has(Items.LOOM))
.save(output);
doorBuilder(Items.OAK_DOOR, Ingredient.of(Items.OAK_BUTTON)) // Using a helper method!
.unlockedBy(getHasName(Items.OAK_BUTTON), has(Items.OAK_BUTTON))
.save(output);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
TIP
Існує багато допоміжних методів для створення звичайних рецептів. Перевірте, що може запропонувати RecipeProvider! Використовуйте Alt+7 в IntelliJ, щоб відкрити структуру класу, включаючи список методів.
Інші рецепти
Інші рецепти працюють так само, але вимагають кількох додаткових параметрів. Наприклад, рецепти плавки повинні знати, скільки досвіду присудити.
java
oreSmelting(
List.of(Items.GLASS_BOTTLE), // Inputs
RecipeCategory.MISC, // Category
CookingBookCategory.MISC, // Category
Items.GLASS, // Output
0.1f, // Experience
300, // Cooking time
"glass_bottle_to_glass" // group
);1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
Копчення трохи відрізняється, воно не використовує той самий генератор рецептів, що й плавильні блоки.
java
SimpleCookingRecipeBuilder.smoking(
Ingredient.of(Items.WATER_BUCKET), // Input
RecipeCategory.MISC, // Category (MISC for smoking recipes)
Items.BUCKET, // Output
0.35f, // Experience
100 // Cooking Time
)
.unlockedBy(getHasName(Items.WATER_BUCKET), has(Items.WATER_BUCKET)) // You can specify how this recipe is unlocked here.
.save(output, Identifier.fromNamespaceAndPath(ExampleMod.MOD_ID, "water_bucket_to_bucket").toString()); // Then save the recipe with your modid and the recipe name.1
2
3
4
5
6
7
8
9
2
3
4
5
6
7
8
9
Умови ресурсів
Щоб застосувати умову ресурсів до рецепта, згенерованого на основі даних, оберніть результат за допомогою withConditions і вкажіть будь-які умови ресурсів, які ви хочете застосувати. Потім буде створено рецепт і досягнення, які мають умови ресурсів:
java
shapeless(RecipeCategory.BUILDING_BLOCKS, Items.SAND)
.requires(ItemTags.SAND)
.unlockedBy(getHasName(Items.SAND), has(Items.SAND))
.save(withConditions(output, ResourceConditions.tagsPopulated(ItemTags.DIRT))); // Instead of providing the output directly, wrap it with withConditions1
2
3
4
2
3
4




