全局符号

基本信息

属性 值
注册位置 minetweaker/MineTweakerAPI.java:57-72(静态初始化块)
实际注册全局符号 11
根作用域内建函数 5(minetweaker/runtime/GlobalRegistry.java:40-46)
根作用域符号总数 16
已注释未注册 1(brewing,MineTweakerAPI.java:62)
重复名处理 抛 IllegalArgumentException(GlobalRegistry.java:55-57)

脚本里能直接写(不写 minetweaker. 前缀)的根作用域符号,就是下面这些。

11 个全局对象

由 MineTweakerAPI 静态块逐个 registerGlobalSymbol 注册:

符号 来源 类型 源码行
logger getLogger() 静态 getter ILogger MineTweakerAPI.java:60
recipes recipes 静态字段 IRecipeManager MineTweakerAPI.java:61
furnace furnace 静态字段 IFurnaceManager MineTweakerAPI.java:63
oreDict oreDict 静态字段 IOreDict MineTweakerAPI.java:64
events events 静态字段 IEventManager MineTweakerAPI.java:65
server server 静态字段 IServer MineTweakerAPI.java:66
client client 静态字段 IClient MineTweakerAPI.java:67
game game 静态字段 IGame MineTweakerAPI.java:68
loadedMods loadedMods 静态字段 ILoadedMods MineTweakerAPI.java:69
format format 静态字段 IFormatter MineTweakerAPI.java:70
vanilla vanilla 静态字段 IVanilla MineTweakerAPI.java:71

logger 走的是静态 getter(getJavaStaticGetterSymbol),其余 10 个走静态字段符号(getJavaStaticFieldSymbol)。全部 7 个可变字段由 MineTweakerMod 构造器经 MineTweakerImplementationAPI.init(...) 赋值(MineTweakerMod.java:92-99),server / client 另行在服务器启动(MineTweakerMod.java:174)与客户端建连(MineTweakerMod.java:157-159)时赋值。

5 个内建函数

GlobalRegistry 静态块直接调 registerGlobal(GlobalRegistry.java:40-46):

函数 绑定目标 签名 源码行
print GlobalFunctions.print (String) → void GlobalRegistry.java:41
isNull GlobalFunctions.isNull (Object) → boolean GlobalRegistry.java:42
max Math.max (int, int) → int GlobalRegistry.java:43
min Math.min (int, int) → int GlobalRegistry.java:44
pow Math.pow (double, double) → double GlobalRegistry.java:45

print 内部转成 MineTweakerAPI.logInfo(GlobalFunctions.java:18-20);isNull 是纯 any == null 判定(GlobalFunctions.java:22-24)。max / min 只绑定了 (int, int) 重载,脚本里传 double 不会隐式提升。

未注册的死符号

brewing —— 注释掉,全脚本不可用

MineTweakerAPI.java:62 的注册语句和 :108 的字段声明都被注释:

// registerGlobalSymbol("brewing", getJavaStaticFieldSymbol(MineTweakerAPI.class, "brewing"));
...
// public static IBrewingManager brewing = null;

全仓 brewing / Brewing 命中仅剩 4 处,全部在 api/recipes/IBrewingManager.java、api/recipes/IBrewingRecipe.java、api/recipes/BrewingRecipe.java 的类型定义与 String.format 里,没有任何赋值点或注册点(grep -rn 'brewing\|Brewing' src/main/java)。结论:brewing.add(...) 之类的脚本调用不可用,尽管 minetweaker.recipes.IBrewingManager 类型本身已注册进命名空间(只是没有全局变量能拿到实例)。

minetweaker.IMineTweaker —— 类型已注册但无实例入口

ITweaker 标注 @ZenClass("minetweaker.IMineTweaker"),7 个方法中只有 1 个是 @ZenMethod:remove(IIngredient)(ITweaker.java:41-42)。承载它的 MineTweakerAPI.tweaker 字段带 @Deprecated(MineTweakerAPI.java:82-83),且未出现在任何 registerGlobalSymbol 调用中,脚本拿不到实例。

即便从 Java 侧调用也是空操作:MTTweaker.remove 转发到 GlobalRegistry.remove(MTTweaker.java:74-76),后者遍历 removers 列表(GlobalRegistry.java:105-109),而填充该列表的 registerRemover(GlobalRegistry.java:79-81、MineTweakerAPI.java:343-345)零外部调用方(grep -rn registerRemover 只命中这两处定义本身)。三层皆空。

COLOR_NAMES 与 minetweaker 全局名

  • MineTweakerAPI.COLOR_NAMES(16 个颜色名,MineTweakerAPI.java:53-54)是 public static final,但 MineTweakerAPI 类没有 @ZenClass 注解,也未把该字段注册为符号,脚本不可访问。
  • MineTweakerAPI.java:45-46 的类注释提到会注册 “minetweaker” 全局符号,但全仓 registerGlobalSymbol 只有 :60-71 这 11 次调用,没有名为 minetweaker 的符号。该注释已过时。

MT-API 旧注册表是空壳

静态块第 58 行 registerClassRegistry(ClassRegistry.class, "MT-API") 确实执行,但 ClassRegistry.getClasses 方法体是空的(ClassRegistry.java:12-15):

public static void getClasses(List<Class> output) {
    // no longer needed. kept to not break anyone who reference this
    // seriously though, why would anyone want to look at this registry anyway
}

真正注入脚本命名空间的是构建期生成的 MineTweakerRegistry,详见类注册机制。

相关条目