配置项

基本信息

属性 值
配置文件 <config>/MineTweaker3.cfg(MineTweakerMod.java:134,文件名 = MODID + ".cfg")
配置类 minetweaker/mc1710/MineTweakerConfig.java
加载时机 FMLPreInitializationEvent(MineTweakerMod.java:132-138)
配置文件版本 new Configuration(file, "1")(MineTweakerConfig.java:16)
字段总数 6
已赋值字段 6(无死字段)
分组 core 2 项、network 4 项
加载后是否 save() 是(MineTweakerConfig.java:47),保证缺失键被写回默认值

文件头 modid 取自 MineTweakerMod.MODID("MineTweaker3",MineTweakerMod.java:54),不是 jar 名 CraftTweaker。

6 个配置项

全部为 boolean。声明见 MineTweakerConfig.java:11-12,赋值见 :18-46。

键 分组 默认值 配置内注释 源码行
handleDesktopPackets network false Handle OpenBrowser and CopyClipboard packets? Insecure. :18-22
handleLoadScripts network true Proccess LoadScripts packet on client? Insecure, takes time, but update scripts on the fly… :23-27
sendLoadScripts network true Send scripts to players on logging in :29-30
sendScriptsOnReloading network true Send scripts to players on command “mt reload” :31-35
loadScriptsBeforeConnection core false Load scripts before connect to server? Save time and traffic. Requires server with disabled sendLoadScripts. :37-41
antiStuck core false Do not reload scripts when relogging, saves time. Usable when playing on one server/singleplayer… :42-46

loadScriptsBeforeConnection 与 antiStuck 的说明文本各含一个句点,handleDesktopPackets 等 4 项没有 —— 说明这 6 项是分批加的,注释风格未统一。

逐字段核实:6 项全部有消费者

对每个字段做 grep -rn "MineTweakerConfig\.<name>",确认无死字段(对应检查项 9):

字段 消费点 作用
handleDesktopPackets player/MCPlayer.java:134(openBrowser)、:141(copyToClipboard) 服务端是否向该玩家发「打开浏览器 / 写剪贴板」封包
handleLoadScripts network/MineTweakerLoadScriptsHandler.java:24 客户端是否接受并重载服务器下发的脚本
sendLoadScripts FMLEventHandler.java:43 玩家登录时是否下发脚本封包
sendScriptsOnReloading MCPlatformFunctions.java:34 /minetweaker 重载后是否 sendToAll 下发脚本
loadScriptsBeforeConnection MineTweakerMod.java:182 客户端是否在连接前就加载脚本
antiStuck MineTweakerMod.java:174、:185 重连时是否跳过脚本重载

缺陷:antiStuck 字段初始值是死代码

MineTweakerConfig.java:11-12 的字段声明把 antiStuck 初始化为 true:

public static boolean handleDesktopPackets = false, handleLoadScripts = true, sendLoadScripts = true,
        sendScriptsOnReloading = true, loadScriptsBeforeConnection = false, antiStuck = true;

但 load() 里 config.getBoolean("antiStuck", "core", **false**, ...) 的默认参数是 false(:42-46),且 load() 在预初始化期必定执行并覆写全部 6 个字段(MineTweakerMod.java:134-135)。因此:

  • 声明处的 = true 永远不生效,是死代码。
  • 实际默认行为由 getBoolean 的默认参数 false 决定。
  • cfg 文件首次生成时写入 false。

其余 5 个字段的声明初值与 getBoolean 默认参数恰好一致(handleDesktopPackets=false、handleLoadScripts=true、sendLoadScripts=true、sendScriptsOnReloading=true、loadScriptsBeforeConnection=false),只有 antiStuck 不一致。

安全相关的 3 项

handleDesktopPackets 与 handleLoadScripts 的配置注释都带 “Insecure” 字样,含义不同:

配置 风险
handleDesktopPackets 客户端会调用 java.awt.Desktop.browse(URI) 与系统剪贴板写入。服务端可通过封包让客户端打开任意 URL / 覆写剪贴板。默认 false
handleLoadScripts 客户端接受并执行服务端下发的脚本字节码(ScriptProviderMemory + reload())。默认 true,注释自承 “takes time”
loadScriptsBeforeConnection 与上一项配对使用:本地提前加载,节省流量与时间;要求服务端关闭 sendLoadScripts

注意:handleDesktopPackets 控制的两个封包在脚本侧无法触发。IPlayer.openBrowser(api/player/IPlayer.java:67-68)与 IPlayer.copyToClipboard(:70-71)都没有 @ZenMethod,且各自带注释 // not an exposed method. risks abuse 与 // not an exposed method, so far. would it be useful?。IPlayer 暴露给脚本的只有 16 个方法(getId / getName / getData / getXP / removeXP / update / sendChat ×2 / getHotbarSize / getHotbarStack / getInventorySize / getInventoryStack / getCurrentItem / isCreative / isAdventure / give)。所以脚本作者无法主动让客户端开 URL 或写剪贴板,该配置只对 Java 侧调用者有意义。

两个 Desktop 处理器的 IOException / URISyntaxException 都被静默吞掉(MineTweakerOpenBrowserHandler.java:29),且都额外要求 Desktop.isDesktopSupported()(:26)—— 无桌面的服务端环境(如容器)自动跳过。

另一个配置类:CropsConfig 不是配置

minetweaker/mods/ic2/crops/CropsConfig.java 名字像配置类,实际是 IC2 作物脚本 API(@ZenClass("mods.ic2.CropsConfig") + @ModOnly("IC2")),不含任何 Configuration 读写,不产生配置文件。见IC2 集成。

相关条目

  • 网络封包 - 3 个封包与上述 network 分组配置的对应关系
  • 重载生命周期 - antiStuck / loadScriptsBeforeConnection 对重载时机的影响
  • IC2 集成 - CropsConfig 的真实身份