JourneyMap 热键绑定
基本信息
| 属性 | 值 |
|---|---|
| 注册位置 | journeymap.client.Constants.initKeybindings()(Constants.java:75-86) |
| 实际注册调用 | ClientRegistry.registerKeyBinding(kb)(forge/event/KeyEventHandler.java:69) |
| 已注册按键数 | 6 |
| 设置界面分类 | JourneyMap(由 jm.common.hotkeys_keybinding_category 提供,Constants.java:78) |
| 事件入口 | InputEvent.KeyInputEvent → KeyEventHandler.onKeypress(false)(KeyEventHandler.java:182-186) |
| 注册去重 | 已存在的同名按键会被跳过并记警告(KeyEventHandler.java:67-74) |
功能
6 个按键全部在 Constants.initKeybindings() 中一次性构造并作为一个 List<KeyBinding> 返回(Constants.java:85),由 KeyEventHandler.initKeyBindings() 遍历注册。initKeyBindings() 会先扫描 minecraft.gameSettings.keyBindings 中所有已存在的按键描述,跳过重复项(:48-74),因此在别的模组也占用同一键位时不会抛异常,只会记一条警告。
事件分发逻辑在静态方法 KeyEventHandler.onKeypress(boolean minimapOnly)(:83-174)中,全部为 if / else if 链,按下表顺序判断。
数值
6 个已注册按键
| 常量 | 语言键 | 默认键位 | 显示名(en_US.lang) |
行为 |
|---|---|---|---|---|
KB_MAP |
key.journeymap.map_toggle |
J(Constants.java:79) |
Fullscreen Map | 无界面时打开全屏地图;已在全屏地图中则关闭所有界面 |
KB_MAP_ZOOMIN |
key.journeymap.zoom_in |
=(:80) |
Zoom In | 缩放小地图;配 Ctrl 则切换切片渲染档位 |
KB_MAP_ZOOMOUT |
key.journeymap.zoom_out |
-(:81) |
Zoom Out | 缩小小地图;配 Ctrl 则切换切片显示质量 |
KB_MAP_SWITCH_TYPE |
key.journeymap.minimap_type |
[(:82) |
Switch between Day/Night/Caves | 循环切换小地图类型 |
KB_MINIMAP_PRESET |
key.journeymap.minimap_preset |
\(:83) |
Switch MiniMap Preset | 在小地图预设 1 / 2 之间切换 |
KB_WAYPOINT |
key.journeymap.create_waypoint |
B(:84) |
Create Waypoint | 在当前位置创建路点;配 Ctrl 则打开路点管理器 |
(语言键显示名取自 src/main/resources/assets/journeymap/lang/en_US.lang:509-517;jm.common.hotkeys_keybinding_category=JourneyMap 在同文件 :97。)
Ctrl 组合键
Ctrl 的检测用 Keyboard.isKeyDown(29) || Keyboard.isKeyDown(157)(KeyEventHandler.java:91),源码注释说明这是为了"防止键位卡住",并指出 GuiScreen.isCtrlKeyDown() 在当时不可用。
| 组合 | 触发条件 | 行为 | 源码行 |
|---|---|---|---|
Ctrl + J |
controlDown && KB_MAP |
UIManager.toggleMinimap() — 整个小地图显示/隐藏 |
:94-98 |
Ctrl + = |
controlDown && KB_MAP_ZOOMIN |
Tile.switchTileRenderType() — 切换切片渲染算法 |
:99-103 |
Ctrl + - |
controlDown && KB_MAP_ZOOMOUT |
Tile.switchTileDisplayQuality() — 切换切片显示质量 |
:104-108 |
Ctrl + B |
controlDown && KB_WAYPOINT |
UIManager.openWaypointManager(null, null) — 打开路点管理器 |
:130-135 |
注意
Ctrl+J的判断排在最前,因此在J键被按下时Ctrl修饰优先,单独按J才开全屏地图。
行为优先级
onKeypress() 是单条 if/else 链,先匹配先生效:
- 4 个
Ctrl组合(:94-135) - 单独
KB_MAP_ZOOMIN/KB_MAP_ZOOMOUT/KB_MAP_SWITCH_TYPE/KB_MINIMAP_PRESET(:109-129) - 仅当
minimapOnly == false时才处理KB_MAP(开/关全屏地图)与KB_WAYPOINT(建路点)(:137-167)。minimapOnly = true的两个调用方是小地图快捷键帮助对话框与 Options Manager 的小地图预览,此时建路点/开全屏地图被禁用,避免在界面里误触发。
KB_MAP_SWITCH_TYPE 与 Ctrl+B 分支会额外调用 KeyBinding.unPressAllKeys()(:122、:132)以避免按键状态残留。
交互
| 触发 | 行为 |
|---|---|
| 游戏中按下已注册键 | 走 onKeypress(false),即上面全部 6 个按键 + 4 个 Ctrl 组合 |
| 小地图快捷键帮助对话框内按任意键 | MiniMapHotkeysHelp.keyTyped() → onKeypress(true)(ui/minimap/MiniMapHotkeysHelp.java:120) |
| Options Manager 预览小地图时按任意键 | OptionsManager → onKeypress(true)(ui/dialog/OptionsManager.java:592) |
已有其它界面打开时按 J |
不打开全屏地图(仅当 currentScreen == null,:141);若当前已是 Fullscreen 则 UIManager.closeAll()(:147-150) |
已有其它界面打开时按 B |
不创建路点(同样要求 currentScreen == null,:158) |
| 某个键位被别的模组占用 | 跳过注册并记 Avoided duplicate keybinding 警告(:73) |
死代码
en_US.lang 中有 2 个按键语言条目在 Java 源码里零引用,没有任何 KeyBinding 对象与之对应:
| 语言键 | 条目文本 | 源码引用数 |
|---|---|---|
key.journeymap.day |
Show Day Map | 0 |
key.journeymap.night |
Show Night Map | 0 |
核验方式:grep -rn -F 'key.journeymap.day' src/main/java 与 ... -F 'key.journeymap.night' src/main/java 均返回 0 行。日/夜地图的切换实际由 KB_MAP_SWITCH_TYPE(key.journeymap.minimap_type,“Switch between Day/Night/Caves”)一次性循环完成,这两个条目是历史遗留。
另有 1 个语言条目是活的但不对应独立按键:key.journeymap.map_toggle_alt(“Show / Hide Fullscreen Map”)在 ui/dialog/FullscreenHotkeysHelp.java:97 被用来显示 KB_MAP 的说明文字——它只是 KB_MAP 的另一种显示标签,不是一个新的 KeyBinding。
因此语言文件中 key.journeymap.* 共 9 条,实际按键只有 6 个。