小地图
基本信息
| 属性 | 值 |
|---|---|
| 界面类 | 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() 实时预览 |