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 链,先匹配先生效:

  1. 4 个 Ctrl 组合(:94-135)
  2. 单独 KB_MAP_ZOOMIN / KB_MAP_ZOOMOUT / KB_MAP_SWITCH_TYPE / KB_MINIMAP_PRESET(:109-129)
  3. 仅当 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 个。

相关条目