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 扫描注解,不解析方法体内的类型),源码未对此做任何防护。
相关条目
- World Generator - 锁定时固定到的目标
- 自定义建世界界面 - 同一事件处理类中的另一个拦截