选择 GUI
selectionUI/VariantGuiMain.java 是 Variable Horizons 的图形化变体切换界面,挂在 Minecraft 的世界选择界面上。
定位
README 的说法是:
“Variants are easily configurable using the new gui in the singleplayer world selection screen, though, servers will unfortunately have to use either the /variants commands or change the active variants in the config.”
即:
- 单人:可在世界选择界面直接勾选变体
- 服务器:只能用
/variants命令或手改GeneralConfig.activeVariants
它与 /variants 命令是并存的第二个切换入口,最终都写 GeneralConfig.activeVariants。
提供的能力
除了勾选变体,GUI 还直接暴露了一批数值配置,源码中可见的绑定点包括:
| GUI 元素 | 对应配置 | 证据 |
|---|---|---|
| 配方时间乘数 | GeneralConfig.recipeTimeMultiplier |
— |
| 机器效率乘数 | GeneralConfig.efficiencyMultiplier |
VariantGuiMain.java:400 写入 String.valueOf(...),:403 回写 Float.parseFloat(text) |
| 4 个概率乘数 | output/input/fluidOutput/fluidInputChanceMultiplier |
— |
变更检测
VariantGuiMain.java:84 先把 GeneralConfig.efficiencyMultiplier 存进 initialEfficiencyMultiplier,:92 处用
if (initialEfficiencyMultiplier != GeneralConfig.efficiencyMultiplier) return true;
作为 hasChanged() 的一部分——即 GUI 通过快照对比判断用户是否动过配置,进而决定要不要写盘 / 触发重启提示。
⚠️ 已知问题
efficiencyMultiplier 只被这个 GUI 读写,没有任何 VariantLoader 或 mixin 消费它。也就是说在 GUI 里调整该值:
- 会触发
hasChanged()为 true - 值会被写进配置文件
- 但不会改变任何实际游戏行为
相比之下 recipeTimeMultiplier 有真实消费者(AlteredRecipeTime.applyToServer()),4 个概率乘数也有(ChancedRecipes)。
⚠️ 切换变体后多数改动需要重启游戏(16 个
MixinBuilder是Phase.EARLY)。GUI 的变更检测不覆盖这一重启需求。