配方与矿物 API
基本信息
| 属性 | 值 |
|---|---|
| 入口对象 | 全局 recipes、furnace、oreDict、vanilla(见全局符号) |
IRecipeManager |
@ZenClass("minetweaker.recipes.IRecipeManager"),8 个 @ZenMethod |
IFurnaceManager |
@ZenClass("minetweaker.recipes.IFurnaceManager"),4 个 @ZenMethod |
IOreDict |
@ZenClass("minetweaker.oredict.IOreDict"),0 个 @ZenMethod,1 个 @ZenMemberGetter + 1 个 @ZenGetter |
IVanilla |
@ZenClass("vanilla.IVanilla"),2 个方法 |
| 1.7.10 实现 | minetweaker/mc1710/recipes/MCRecipeManager.java、furnace/MCFurnaceManager.java、oredict/MCOreDict.java、vanilla/MCVanilla.java |
| 可选参数 | 依赖外部 ZenScript 的 @Optional 注解,源码见 buildSrc/src/main/java/stanhebben/zenscript/annotations/Optional.java |
IRecipeManager 的实现是 1.7.10 专用代码(MineTweakerMod.java:94 以 new MCRecipeManager() 注入 MineTweakerImplementationAPI.init),与 MC 版本绑定。
recipes —— 合成配方管理
minetweaker/api/recipes/IRecipeManager.java,8 个脚本方法:
| 方法 | 签名 | 源码行 |
|---|---|---|
getRecipesFor |
(IIngredient) → ICraftingRecipe[] |
IRecipeManager.java:32-33 |
remove |
(IIngredient, @Optional boolean nbtMatch) → int |
IRecipeManager.java:42-43 |
addShaped |
(IItemStack, IIngredient[][], @Optional IRecipeFunction, @Optional IRecipeAction) |
IRecipeManager.java:54-56 |
addShapedMirrored |
同上,镜像合成 | IRecipeManager.java:71-73 |
addShapeless |
(IItemStack, IIngredient[], @Optional IRecipeFunction, @Optional IRecipeAction) |
IRecipeManager.java:88-90 |
removeShaped |
(IIngredient, @Optional IIngredient[][]) → int |
IRecipeManager.java:106-107 |
removeShapeless |
(IIngredient, @Optional IIngredient[], @Optional boolean wildcard) → int |
IRecipeManager.java:120-121 |
craft |
(IItemStack[][]) → IItemStack(无匹配返回 null) |
IRecipeManager.java:136-137 |
关键点:
- 重载靠
@Optional折叠。每个add*在接口里另有 3 个不带注解的 Java 重载(IRecipeManager.java:58-62、:75-79、:92-96),它们没有@ZenMethod,只为 Java 侧调用服务。脚本只能看到带@Optional的那个签名,由 ZenScript 自己按实参个数补默认值。 removeShapeless的wildcard参数含义见源码注释:允许配方含有指定之外的额外材料(IRecipeManager.java:116)。add*的function与action两个尾参都是@Optional,可同时省略。- 1.7.10 实现额外支持物品转换(transformer recipes):
MCRecipeManager.hasTransformerRecipes()与applyTransformations(...)(调用点FMLEventHandler.java:56-58),在每次合成事件时套用IItemTransformer。
furnace —— 熔炉与燃料
minetweaker/api/recipes/IFurnaceManager.java,4 个脚本方法:
| 方法 | 签名 | 源码行 |
|---|---|---|
remove |
(IIngredient, @Optional IIngredient) |
IFurnaceManager.java:14-15 |
addRecipe |
(IItemStack, IIngredient, @Optional double xp) |
IFurnaceManager.java:17-18 |
setFuel |
(IIngredient, int fuel) |
IFurnaceManager.java:20-21 |
getFuel |
(IItemStack) → int |
IFurnaceManager.java:23-24 |
另有 getAll() 用 @ZenGetter("all") 暴露为属性 furnace.all(IFurnaceManager.java:31-32),返回 IFurnaceRecipe[]。注意 IFurnaceRecipe 没有 @ZenClass 注解,是 api/ 下 12 个未标注接口之一(详见类型系统与扩展)。
燃料值通过 FuelTweaker.INSTANCE.register() 写入(MineTweakerMod.java:148,实现 mc1710/furnace/FuelTweaker.java),底层用 SetFuelPattern(mc1710/furnace/SetFuelPattern.java)匹配物品与容器。
oreDict —— 矿物辞典
minetweaker/api/oredict/IOreDict.java 全文只有 3 个声明:
@ZenClass("minetweaker.oredict.IOreDict")
public interface IOreDict {
@ZenMemberGetter
IOreDictEntry get(String name);
@ZenGetter("entries")
List<IOreDictEntry> getEntries();
}
- 用的是
@ZenMemberGetter(成员形式oreDict.get(name))与@ZenGetter("entries")(属性形式oreDict.entries),不是@ZenMethod。 - 1.7.10 实现
MCOreDict另持有MCOreDictEntry(mc1710/oredict/MCOreDictEntry.java),条目对象被@ZenExpansion("minetweaker.oredict.IOreDictEntry")之外的独立类型暴露。 - 脚本里
<ore:xxx>括号语法最终走OreBracketHandler.getOre(mc1710/brackets/OreBracketHandler.java:34-36),无条件new MCOreDictEntry(name),即名称不存在也不返回 null。
vanilla —— 原版机制
minetweaker/api/vanilla/IVanilla.java:
| 方法 | 返回 | 源码行 |
|---|---|---|
getLoot |
ILootRegistry |
IVanilla.java:12 |
getSeeds |
ISeedRegistry |
IVanilla.java:15 |
1.7.10 实现为 MCVanilla(mc1710/vanilla/MCVanilla.java),下挂 MCLootRegistry 与 MCSeedRegistry(mc1710/vanilla/)。两者都是 @ZenClass("vanilla.ILootRegistry") / @ZenClass("vanilla.ISeedRegistry"),没有 minetweaker. 前缀,与其余 API 命名风格不一致。
不可用的 brewing
minetweaker.recipes.IBrewingManager(api/recipes/IBrewingManager.java:14)与 minetweaker.recipes.IBrewingRecipe(api/recipes/IBrewingRecipe.java:5)已注册为类型,但没有对应的全局变量 —— 字段声明与注册语句均被注释(MineTweakerAPI.java:62、:108),详见全局符号。BrewingRecipe(api/recipes/BrewingRecipe.java)实现了该接口且 getScriptName() 返回 "brewing.add(...)" 字符串(:19),但无任何代码构造它。