小地图

基本信息

属性 值
界面类 journeymap.client.ui.minimap.MiniMap(MiniMap.java:44)—— 不是 JmUI 子类,而是自绘的普通类
绘制入口 UIManager.drawMiniMap(float partialTicks)(UIManager.java:147)
状态持有 MiniMap.state() 返回全局 MapState 单例(MiniMap.java:84,synchronized)
配置文件 journeymap.minimap.config(预设 1)/ journeymap.minimap2.config(预设 2)
预设数量 2
显示/隐藏热键 Ctrl + J(KB_MAP)
事件挂载 RenderGameOverlayEvent(见 小地图叠加层渲染)

功能

小地图绘制在游戏 HUD 层而非独立界面。MiniMap 不继承 JmUI,而是把绘制拆成两层:

  • UIManager.drawMiniMap() 负责"能不能画"的门禁(界面状态、配置开关)
  • MiniMap.drawMap(...) 负责实际绘制

绘制门禁

UIManager.drawMiniMap(float partialTicks)(UIManager.java:147-165)的两级判断:

if (miniMap.getCurrentMinimapProperties().enabled.get()) {          // :151
    final GuiScreen currentScreen = minecraft.currentScreen;
    final boolean doDraw = currentScreen == null || currentScreen instanceof GuiChat;   // :153
    if (doDraw) { miniMap.drawMap(partialTicks); }                  // :155
}

即只有在无界面、或聊天界面打开时才绘制——其它模组的物品栏、设置界面等会盖住小地图。整个方法包在 catch (Throwable) 中,异常只记 error(:157-160)。

drawMiniMap() 无参重载直接以 1f 作为 partialTicks(:142-145)。

4 个重载的 drawMap

签名 源码 说明
drawMap() :128 无参入口
drawMap(float partialTicks) :133 正常绘制
drawMap(boolean preview) :146 Options Manager 中的实时预览
drawMap(boolean preview, float partialTicks) :151 完整实现

两个预设的切换

MiniMap 持有"当前配置"的引用,通过 setMiniMapProperties(MiniMapProperties)(:114)与 getCurrentMinimapProperties()(:120)读写。切换由 UIManager.switchMiniMapPreset() / switchMiniMapPreset(int which)(UIManager.java:283、:289)驱动,内部经 JourneymapClient.getMiniMapProperties(int) 翻转 isActive() 标志(JourneymapClient.java:156-172)。

reset()(MiniMap.java:681)在游戏退出时重置小地图状态(JourneymapClient.java:503)。

缩放与图型切换

缩放与图型逻辑在 MapState(journeymap.client.model.MapState)而非 MiniMap:

操作 实现 源码
放大 zoomIn():zoomLevel < maxZoom 时 setZoom(zoomLevel + 1) MapState.java:345-352
缩小 zoomOut():zoomLevel > minZoom 时 setZoom(zoomLevel - 1) :354-362
设置缩放 setZoom(zoom):越界或无变化则直接返回,否则写入并 requireRefresh() :365-371
当前缩放 getZoom() 返回 lastMapProperties.zoomLevel.get() :376
切换图型 toggleMapType(),内部会 requireRefresh() :131、:198
请求刷新 requireRefresh() :379

缩放级别存在 mapProperties.zoomLevel(非 @Config 字段,MapProperties.java:57),因此不随配置文件持久化——每次启动回到初始值。MapState.java:293 对 zoomLevel == 0 有特殊处理。

显示变量

updateDisplayVars(boolean force) 与 updateDisplayVars(Shape, Position, boolean force)(MiniMap.java:694、:702)把配置里的 shape / position 同步到 DisplayVars(ui/minimap/DisplayVars.java)等渲染状态对象。resetInitTime()(:109)用于重置计时。

快捷键帮助

MiniMapHotkeysHelp(ui/minimap/MiniMapHotkeysHelp.java)列出 5 条绑定,逐行 drawHelpStrings(标题, 按键名, x, y += 12)(:93-97):

显示 按键 行
jm.minimap.hotkeys_toggle Ctrl + J(用 Constants.CONTROL_KEYNAME_COMBO + getKeyName(KB_MAP) 拼接,:93) :93
key.journeymap.zoom_in = :94
key.journeymap.zoom_out - :95
key.journeymap.minimap_type [ :96
key.journeymap.minimap_preset \ :97

drawHelpStrings(String title, String key, int x, int y) 定义在 :101。第 1 行是唯一带 Ctrl 前缀的一条(CONTROL_KEYNAME_COMBO = "Ctrl,",Constants.java:77)。

该对话框的 keyTyped() 会转发 KeyEventHandler.onKeypress(true)(:119-120),使对话框内按键仍能触发缩放/切图型,但禁用开全屏地图与建路点。

由 UIManager.openMiniMapHotkeyHelp(JmUI)(UIManager.java:200)打开。

数值

数值名 值
配置预设数 2
drawMap 重载数 4
MiniMapProperties 的 @Config 项 17(见 小地图选项)
形状枚举值 3(Square / Rectangle / Circle)
位置枚举值 6(TopRight / BottomRight / BottomLeft / TopLeft / TopCenter / Center)
朝向枚举值 3(North / OldNorth / PlayerHeading)
准星朝向枚举值 2(Compass / PlayerHeading)
快捷键帮助条目数 5
zoomLevel 是否持久化 否(非 @Config 字段)

交互

触发 行为
每帧 HUD 渲染 无界面或聊天界面打开时绘制小地图
Ctrl + J UIManager.toggleMinimap() 切换显示/隐藏
= / - MiniMap.state().zoomIn() / zoomOut()
[ toggleMapType() 切换日/夜/洞穴,并 unPressAllKeys()
\ 切换预设 1 / 2
打开任意 GUI 小地图自动隐藏
退出游戏 MiniMap.reset() + UIManager.reset()
在 Options Manager 中改形状/位置 updateDisplayVars() 实时预览

相关条目