全局符号
基本信息
| 属性 | 值 |
|---|---|
| 注册位置 | 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,详见类注册机制。