配置项

基本信息

属性 值
配置类 com.hancinworld.fw.handler.ConfigurationHandler
实际写入的配置项 9(general 3 个 + advanced 6 个)
声明但从不加载的字段 1(_onlyRemoveDecorations)
配置界面 ModGuiConfig(经 @Mod(guiFactory = Reference.GUI_FACTORY_CLASS) 挂载)
读配置的入口 preInit → ClientProxy#subscribeEvents → ConfigurationHandler#init

配置类没有自己的配置文件路径:ModGuiConfig 构造时传入的"文件名"参数是 ConfigurationHandler.instance().toString(),而 toString() 直接 return _configuration.toString() (ConfigurationHandler.java:279-281),即整份配置的内容字符串——不是路径。 实际路径仍由 event.getSuggestedConfigurationFile() 决定,只是被当成了界面标题。

全部生效的配置项

general 分类(ConfigurationHandler.CATEGORY_GENERAL):

键 类型 默认值 作用
enableFullscreenWindowed boolean true 总开关。为 false 时完全不接管全屏
fullscreenMonitor int 0 指定用第几块显示器(1 起),0 = 自动选当前窗口所在屏
enableMaximumCompatibility boolean true 改用延迟初始化策略以兼容 OptiFine 等改 GL 的 mod

advanced 分类(CATEGORY_ADVANCED = "advanced"):

键 类型 默认值 作用
enableAdvancedFeatures boolean false 下面 5 项的总开关,默认全关
customFullscreenDimensions boolean false 是否使用自定义全屏尺寸
customFullscreenDimensionsX int 0 全屏时窗口 X 坐标
customFullscreenDimensionsY int 0 全屏时窗口 Y 坐标
customFullscreenDimensionsW int 0 全屏时窗口宽,须 > 256
customFullscreenDimensionsH int 0 全屏时窗口高,须 > 256

默认值分别回落到 Reference 里的常量(Reference.java:31-39): AUTOMATIC_MONITOR_SELECTION = 0、ADVANCED_FEATURES_ENABLED = false、 CUSTOM_FULLSCREEN_DIMENSIONS = false、ENABLE_MAXIMUM_COMPATIBILITY = true、 CUSTOM_FULLSCREEN_X/Y/W/H = 0。

每个 getter 都是"字段为 null 就返回 Reference 常量"的模式, 配合 setXxx() 里的 _commitImmediately && _configuration.hasChanged() 立即存盘。

配置变更的即时重载

@SubscribeEvent onConfigurationChangedEvent(ConfigurationHandler.java:81-89) 在 modID 匹配时重新 load(),并在非初始化阶段调用 FullscreenWindowed.proxy.registerKeyBindings()——所以在设置界面里 关掉 enableFullscreenWindowed 会立刻把原版全屏键还回去。

源码缺陷:第 10 个配置项从未写入

_onlyRemoveDecorations 在 ConfigurationHandler.java:53 被声明, isOnlyRemoveDecorations() / setOnlyRemoveDecorations() 也都实现了, 但唯一给它赋 Property 的那行被注释掉了(ConfigurationHandler.java:269-270):

// TODO: due to how LWJGL draws windows, it's not a good idea to have this... disabled until I can fix the bugs
// with X,Y being off due to decoration shadows.
// _onlyRemoveDecorations = _configuration.get(ConfigurationHandler.CATEGORY_ADVANCED, "onlyRemoveDecorations",
// Reference.ONLY_REMOVE_DECORATIONS, I18n.format("comment.fullscreenwindowed.onlyRemoveDecorations"));

后果:

  1. 字段永远是 null,isOnlyRemoveDecorations() 恒返回 Reference.ONLY_REMOVE_DECORATIONS = false;
  2. advanced.onlyRemoveDecorations 不会出现在生成的 cfg 文件里,玩家改了也没地方生效;
  3. ClientProxy.java:179 的 if (advanced && isOnlyRemoveDecorations()) 分支是死分支;
  4. setOnlyRemoveDecorations() 会直接 NPE——它对 null 调 .set();
  5. 语言文件里的 comment.fullscreenwindowed.onlyRemoveDecorations 成了无人引用的孤儿键。

⚠️ 注意行首 //——这是被注释掉的代码,不是真实生效的注册。

相关条目