插件加载器 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 会主动创建它。

相关条目