Lock World Generator(锁定世界生成器)

基本信息

属性 值
配置键 S:Lock World Generator(category general)
类型 布尔
默认值 false
存储字段 ConfigGeneralSettings.generalLockWorldGenerator(ConfigGeneralSettings.java:7)
声明位置 ConfigurationFile.java:38-43
消费位置 GuiEvents.java:29-36

作用

开启后,玩家在建世界界面点击世界类型下拉按钮时该点击被吞掉, 世界生成器固定为 World Generator 配置的默认值。

判定逻辑(GuiEvents.java:29-36):

条件 结果
event.gui instanceof GuiCreateWorld 且 event.button.id == 5 进入判定
generalLockWorldGenerator == true 且 未按住 Keyboard.KEY_LMENU 播放点击音 + setCanceled(true)
其它情况 放行,正常切换

逃生阀:左 Alt 绕过

⚠️ 按住键盘左 Alt(KEY_LMENU)时锁定自动解除,可以正常打开下拉菜单。 这是源码里硬编码的绕过方式(GuiEvents.java:31),没有任何配置项能关闭它。 用途是让管理员/服务器所有者仍可临时改选。

setCanceled(true) 之前会调用 event.button.func_146113_a(...) (GuiEvents.java:32)播放按钮音效,所以被锁定时仍有「咔哒」声, 但界面不变 —— 容易让人误以为点击生效了。

事件注册

GuiEvents 以 EventPriority.HIGHEST 订阅 GuiScreenEvent.ActionPerformedEvent.Pre(GuiEvents.java:18-19), 并在 preInit 注册到 MinecraftForge.EVENT_BUS (DefaultWorldGenerator.java:28)。Pre 阶段 + HIGHEST 优先级意味着 本处理先于其它模组拿到点击事件,setCanceled 生效性最高。

已知源码问题

  • 锁定不覆盖服务端:该锁定只作用于客户端 GUI。 通过 Create New World 之外的方式(如工具/指令/API 直接建世界)不受约束。
  • 按钮 id 硬编码:event.button.id == 5 写死(GuiEvents.java:30)。 GuiCreateWorld 是原版类,id→控件的映射不在本仓库内, 若其它模组 patch 了该界面并改变按钮 id,锁定可能失效或误锁。 ⚠️ 该 id 对应的具体控件名无法从本仓库核实。
  • ⚠️ GuiEvents 是纯客户端类(导入 net.minecraft.client.*), 却在 preInit 中无条件注册到公共 MinecraftForge.EVENT_BUS (DefaultWorldGenerator.java:28),且未用 @SideOnly 或 Side.CLIENT 保护。 在专用服务器上该类缺少客户端依赖。实际是否崩溃取决于类解析时机 (Forge 用 ASM 扫描注解,不解析方法体内的类型),源码未对此做任何防护。

相关条目