1. 矿物字典
Forge 在原版的 JSON 合成表的基础上提供的五种扩展功能之一。说是“在原版的 JSON 合成表的基础上”,实际上它的历史可以追溯回适用于 Minecraft 1.4.6 的 Forge。那个时候 FML 和 Forge 还是两个项目,只是两者之间有密切合作。
1.1. 为什么会有这么一个东西?
屏幕前的读者应该知道,大型整合里往往有七八种铜锭。这些铜锭在设定上应该是可以互换的。但怎么做呢?有请 OreDictionary。
// 带若干重载:
// addOre(Block block, String oreName); // 相当于 addOre(Item.getItemFromBlock(block), oreName);
// addOre(Item item, String oreName); // 相当于 addOre(new ItemStack(item, 1, 0), oreName);
OreDictionary.addOre(new ItemStack(MyItems.copperOre), "oreCopper");
完。
等等怎么可能就这么完了呢,你还要把它用在某些地方啊——
1.2. 有序合成,带矿词支持
{
"type": "forge:ore_shaped",
"group": "my_mod:example",
"result": { "item": "minecraft:diamond" },
"pattern": [
"XYX",
"YXY",
"XYX"
],
"key": {
"X": { "type": "forge:ore_dict", "ore": "dyeBlue" },
"Y": { "type": "forge:ore_dict", "ore": "ingotGold" }
}
}
1.3. 无序合成,带矿词支持
{
"type": "forge:ore_shapeless",
"group": "my_mod:example",
"result": { "item": "minecraft:diamond" },
"ingredients": [
{ "type": "forge:ore_dict", "ore": "blockDirt" },
{ "type": "forge:ore_dict", "ore": "stone" },
{ "type": "forge:ore_dict", "ore": "dye" },
{ "type": "forge:ore_dict", "ore": "nuggetIron" }
]
}
1.4. 混合
自然,forge:ore_shaped
和 forge:ore_shapeless
两种类型的合成中也可以直接用某种物品。
{
"type": "forge:ore_shaped",
"group": "my_mod:example",
"result": { "item": "minecraft:beacon" },
"pattern": [
"ABC",
"DEF",
"GGG"
],
"key": {
"A": { "item": "minecraft:diamond_block" },
"B": { "item": "minecraft:gold_block" },
"C": { "item": "minecraft:iron_block" },
"D": { "type": "forge:ore_dict", "ore": "gemLapis" },
"E": { "item": "minecraft:nether_star" },
"F": { "type": "forge:ore_dict", "ore": "gemLapis" },
"G": { "item": "minecraft:obsidian" }
}
}
1.5. OreDictionary.WILDCARD_VALUE
有那么一些时候,你希望你的输入的 metadata 或者损害值不影响合成的匹配,比如原版的木棍合成使用的木板是可以混搭的,此时作为合成材料的木板的 metadata 是无所谓的(“don't care”)。
为此,Minecraft 引入了一个幻数——Short.MAX_VALUE
——来指代这一情况。你可以在 Ingredient
类的 apply
方法的实现中找到这个幻数(32767
)的身影。
Forge 在矿物词典中明确了这个字段的含义及具体值,以 OreDictionary
类下的 WILDCARD_VALUE
字段的形式呈现。
有鉴于此,你可以这样表示原版的全部六种木板:
{
"item": "minecraft:plank",
"data": 32767
}