配方与矿物 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),但无任何代码构造它。

相关条目