Генерація рецептів 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




