Geração de Receita 26.2
Um guia para configurar geração de receita com datagen.
PRÉ-REQUISITOS
Tenha certeza que você completou o processo de configuração do datagen primeiro.
Configuração
Primeiro, nós precisamos do nosso provedor. Crie uma classe que estenda FabricRecipeProvider. Toda a nossa geração de receitas acontecerá dentro do método buildRecipes do nosso provedor.
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.data.recipes.SpecialRecipeBuilder;
import net.minecraft.tags.ItemTags;
import net.minecraft.world.item.Item;
import net.minecraft.world.item.ItemStackTemplate;
import net.minecraft.world.item.Items;
import net.minecraft.world.item.crafting.CookingBookCategory;
import net.minecraft.world.item.crafting.Ingredient;
import net.minecraft.world.item.crafting.ShieldDecorationRecipe;
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
44
45
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
44
45
Para finalizar a configuração, adicione esse provedor ao seu DataGeneratorEntrypoint dentro do método onInitializeDataGenerator.
java
pack.addProvider(ExampleModRecipeProvider::new);1
Receitas Sem Formato
Receitas sem formato são bem diretas. Apenas as adicione ao método buildRecipes dentro do seu provedor:
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
Receitas de Corante
Receitas de corante são usadas para tingir itens no seu inventário.
java
dyedItem(ModItems.LEATHER_GLOVES, "leather_gloves");1
Receitas com Formato
Para uma receita com formato, você deve definir a forma usando um String, e depois definir o que cada char dentro do String representa.
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
Existem vários métodos ajudantes para criar receitas comuns. Dê uma olhada no que RecipeProvider tem a oferecer! Use Alt+7 no IntelliJ para abrir a estrutura de uma classe, incluindo uma lista de método.
Outras Receitas
Outras receitas funcionam de forma similar, porém requerem alguns parâmetros adicionais. Por exemplo, as receitas de fundição precisam saber o quanto de experiência elas devem recompensar.
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
Defumar é um pouco diferente, ela não usa o mesmo gerador de receita dos blocos de fundição e afins.
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, ExampleMod.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
Condições de Recurso
Para aplicar uma condição de recurso a uma receita gerada por dados, envolva a saída com withConditions e forneça qualquer condição de recurso que você deseja aplicar. Isso gerará então uma receita e uma conquista que possui condições de recurso aplicadas:
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




