配置项
基本信息
| 属性 | 值 |
|---|---|
| 配置文件 | <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 集成。