插件加载器 TweakerPlugin
基本信息
| 属性 | 值 |
|---|---|
| 类 | modtweaker2.utils.TweakerPlugin |
| 文件 | src/main/java/modtweaker2/utils/TweakerPlugin.java(30 行) |
| 入口 | ModTweaker2.init(FMLInitializationEvent) |
| 注册点 | ModTweaker2.java:66-84(19 次 TweakerPlugin.register) |
| 门控条件 | cpw.mods.fml.common.Loader.isModLoaded(String)(TweakerPlugin.java:12) |
| 插件总数 | 19 |
功能
ModTweaker 用一张「字符串 → 类」的注册表把脚本侧功能按被桥接的模组条件注册。19 个桥接插件各自是一个只有构造函数的普通 Java 类,构造时把该模组的 Zenscript 类登记进 MineTweaker 的全局注册表。
加载判定
TweakerPlugin.register(String mod, Class<?> clazz)(TweakerPlugin.java:11-15)先问 FML 该 modid 是否已加载,只有为真才继续:
public static void register(String mod, Class<?> clazz) {
if (Loader.isModLoaded(mod)) {
load(mod, clazz);
}
}
因此每一个桥接插件都是运行时软门控——目标模组缺席时,其 Zenscript 类根本不会出现在脚本环境里,写到它们的脚本会在 MineTweaker 侧报「找不到类」而不是静默失败。
加载与状态记录
load(String, Class<?>)(TweakerPlugin.java:17-24)用 clazz.newInstance() 触发插件类构造函数,构造成功后把 modid 存入静态 ArrayList<String> isLoaded(TweakerPlugin.java:9、:20)。这个列表是后续指令注册的判据,见 指令列表。
构造函数抛异常时进入 catch (Exception e)(TweakerPlugin.java:21-22)并执行 isLoaded.remove(mod)。此处 mod 尚未被加入(add 在 :20,位于 newInstance() 之后且仅在成功时执行),所以这行 remove 在当前代码路径下不会移除任何元素;该分支的实际效果只是把异常吞掉、不让插件的类进入脚本环境。此处按代码原样记录,不据此断言缺陷。
19 个桥接插件
下表的「门控字符串」是源码里传给 Loader.isModLoaded 的字面量,逐字取自 ModTweaker2.java:66-84。它们同时也是 指令列表 里 TweakerPlugin.isLoaded(...) 的判据键。
| 门控字符串 | 插件类 | 脚本类数 | @ZenMethod |
|---|---|---|---|
appliedenergistics2-core |
AppliedEnergistics |
2 | 7 |
Botania |
Botania |
8 | 42 |
shadowfox_botany |
BotanicalAddons |
2 | 8 |
exnihilo |
ExNihilo |
4 | 16 |
extendedWorkbench |
ExtendedWorkbench |
1 | 3 |
factorization |
Factorization |
3 | 6 |
Mariculture |
Mariculture |
5 | 31 |
Mekanism |
Mekanism |
20 | 40 |
Metallurgy |
Metallurgy |
2 | 4 |
PneumaticCraft |
PneumaticCraft |
2 | 8 |
Railcraft |
Railcraft |
4 | 15 |
TConstruct |
TConstruct |
6 | 36 |
Thaumcraft |
Thaumcraft |
7 | 63 |
ThermalExpansion |
ThermalExpansion |
7 | 27 |
Forestry |
Forestry |
7 | 31 |
chisel |
Chisel |
1 | 4 |
aura |
AuraCascade |
1 | 4 |
ExtraUtilities |
ExtraUtils |
1 | 2 |
IC2 |
IC2C |
11 | 22 |
合计 94 个已注册脚本类。@ZenMethod 列合计 369,与仓库全局统计一致;其中 Thaumcraft 的 63 与 aura 的 4 各自包含了未走 registerClass 而由括号处理器暴露的接口方法,详见 括号类。
说明:上表「门控字符串」是从本仓库读出的字面量,未逐一对照各目标模组自身的
@Mod(modid = ...)核实;跨仓核对不在本次范围内。
脚本目录
插件注册完成后,init 还会接管 MineTweaker 的脚本目录(ModTweaker2.java:99-103):
File scripts = new File("scripts");
if (!scripts.exists()) {
scripts.mkdir();
}
MineTweakerImplementationAPI.setScriptProvider(new ScriptProviderDirectory(scripts));
scripts 是相对当前工作目录解析的,游戏目录下即 .minecraft/scripts。目录不存在时 ModTweaker 会主动创建它。