合成

目前我们的物品没有办法进行合成,在生存模式下无法合成,只能靠创造拿,所以需要在游戏内加入合成配方,默认情况下,forge会读取./data/{modid}/recipes下的所有配方,一般放在resources下,配方的文件类型为json文件,下面给出一个例子用于创建多彩方块:

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
{
"type": "minecraft:crafting_shaped",
"pattern":
[
"ddd",
"dgd",
"ddd"
],
"key":
{
"d":
{
"tag": "forge:gems/diamond"
},
"g":
{
"item": "minecraft:gold_ingot"
}
},
"result":
{
"item": "examplemod:colorful_block",
"count": 8
}
}

这个配方创建了多彩方块,使用8个钻石和1个金锭,最终结果为:

image-20220305181944349

各个json名分析

  • type:分为无序和有序合成,如无序,则为minecraft:crafting_shapeless,如有序,则为minecraft:crafting_shaped 这些为默认的合成配方,你也可以自定义自己的合成配方,日后可能会介绍
  • pattern:在有序合成中为每个物品放置的位置,如果你需要2*2的,直接将行和列改成2*2即可,里面的字母在后面的key中有说明
  • key:每个key代表pattern代表的是什么物品,可能注意到有两个注释,一个为item,一个为tag,item比较好理解,就是物品,tag则为标签,在文章后面会介绍
  • result:输出结果,item为输出物品,count为多少个

下面为无序合成的标签

  • ingredients:为一个数组,里面直接写item或者tag,案例:
1
2
3
4
5
6
7
8
"ingredients": [
{
"item": "minecraft:diamond"
},
{
"item": "minecraft:glod_ingot"
}
],

标签

在上面已经看到了合成表中可以是用标签来代替item,这一章将会介绍如何创建自己的标签以及使用原版中存在的标签

创建自己的标签

./data/{modid}/tags/文件夹下新建blocks和items文件夹,分别放置方块和物品的标签,接下来在items中创建useful_items.json,对于blocks标签暂不创建,接下来在里面写入:

1
2
3
4
5
6
7
8
9
{
"replace": false,
"values": [
{
"id": "examplemod:redstone_ingot",
"required": false
}
]
}

这样就创建了一个新的标签,为useful_items(虽然并不是),里面含有我们的红石锭,json标签的意思为:

  • replace:替换之前加入的这一类标签的物体,之前注册在这一标签的都会被删除,默认为false,建议默认就好
  • values:一个数组,里面为需要加入该标签的物体,id为物体id,required为是否需要,如果找不到该物体,并且require没有写为false则会报错

使用原版标签

./data/minecraft/tags/文件夹下新建blocks和items文件夹,用于分别放置方块和物品标签,接下来在blocks中创建mineable_pickaxe.json,暂不加入items标签,接下来在里面写入

1
2
3
4
5
6
{
"replace": false,
"values": [
"examplemod:colorful_block"
]
}

这样就将我们的多彩方块加入了原版标签mineable_pickle中,所有原版标签请看这个链接,如这个文件所示,可以直接用名字代表物体id,不需要加required,但required默认为true

在游戏内按F3,对准多彩方块,在右边应该就能看到多彩方块多了一个#minecraft:mineable_pickaxe,表示标签添加成功了

image-20220305201155676

在代码中使用标签

先上代码,上面一行代表代表使用自己的标签,下面的两行代表获得该item的标签,为:

1
2
3
4
5
public static final Tag.Named<Item> USEFUL_ITEMS = ItemTags.bind("examplemod:useful_items");

// In some method
Item item = stack.getItem();
Set<ResourceLocation> tags = item.getTags();

这样即可使用自己的标签等,forge文档给出了一个方法为item.is({tag})来判断某个item在不在某个标签内,但我试的时候貌似没这个方法,只有一个getTags用于获得所有标签