JourneyMap 集成

把两个 Navigator 图层以原生多边形的形式画到 JourneyMap 6 的全屏地图与小地图上。

基本信息

属性 值
依赖模组 JourneyMap 6
依赖类型 可选软依赖,compileOnly
声明方式 compileOnly('info.journeymap:journeymap-api-forge:1.7.10-2.0.0')(dependencies.gradle:5)
实现类 mcp.mobius.opis.gui.overlay.ChunkPolygonJM6
载体 依附于 Navigator 图层,不独立存在
API 导入 journeymap.api.v2.client.display.PolygonOverlay 等 6 个 v2 类型

功能

触发条件

JM6 覆盖不能独立使用,必须先满足 Navigator 集成 的全部条件(Navigator 存在且 ≥ 1.1.7,且玩家执行过 /opis)。ChunkTimeLayerManager.addLayerRenderer 与 LoadedChunkLayerManager.addLayerRenderer 中是同一段判断:

if (mod == SupportedMods.JourneyMap && Util.isJourneyMapV6Installed()) {
    renderer.withJourneyMapV6Overlays(
            location -> ChunkPolygonJM6.create(location, ((ChunkTimeLocation) location).getColor(),
                    modOpis.overlayAlphaTiming / 255f),
            true);
}

两个条件同时满足才挂 JM6 覆盖:当前地图后端是 JourneyMap(SupportedMods.JourneyMap)且 JM6 已安装(Util.isJourneyMapV6Installed())。第二个 true 参数含义在本仓不可核实(Navigator 的 API 源码不在本仓内)。

ChunkPolygonJM6 的类注释说明了它的独特定位:Chunk-sized native JourneyMap 6 overlay, the only way onto its minimap. Loaded only when JM6 is present. —— 即它是唯一能把数据画上 JM6 小地图的途径。ChunkTimeLayerManager.java:63 的注释同样强调:Native overlays are the only route onto the JM6 minimap.

多边形构造

ChunkPolygonJM6.create(ILocationProvider, int fillColor, float fillOpacity)(ChunkPolygonJM6.java:21-40):

  1. 取 Math.floor(location.getBlockX()) 与 getBlockZ() 向下取整得到区块角点
  2. 构造 ShapeProperties:填充色用图层传入的颜色,填充不透明度用图层传入的 opacity,描边固定为黑色 0x000000、不透明度 1f、线宽 1f
  3. 构造一个 16×16 的 MapPolygon,四个顶点全部固定在 y = 64: (x, 64, z) → (x+16, 64, z) → (x+16, 64, z+16) → (x, 64, z+16)
  4. 包成 new PolygonOverlay("Opis", location.getDimensionId(), shape, area)
  5. 设置 setOverlayGroupName(location.getClass().getName()) —— 用图层 Location 类的类名做分组名,两个图层因此自动分组为 ChunkTimeLocation 与 LoadedChunkLocation
  6. setActiveUIs(Context.UI.Fullscreen, Context.UI.Minimap) —— 同时对全屏地图与小地图生效
  7. 返回 Collections.singletonList(overlay),每次调用只产生 1 个多边形

数值

数值名 值
CHUNK_SIZE 16(ChunkPolygonJM6.java:17)
多边形顶点的固定 Y 坐标 64
描边颜色 0x000000
描边不透明度 1f
描边线宽 1f
覆盖层名称 "Opis"
生效的 UI Context.UI.Fullscreen + Context.UI.Minimap
每次创建的覆盖数量 1
填充不透明度 overlay.alpha.timing / 255f 或 overlay.alpha.loaded / 255f

交互

触发 行为
Navigator + JM6 同时就绪 区块数据同时画在 Navigator 与 JM6 上
仅有 Navigator 无 JM6 只画 Navigator 原生覆盖
overlay.alpha.timing 调低 JM6 上耗时图层更透明(Navigator 原生层用的是 0–255 整数,不受影响)
在 JM6 小地图上 两个图层的区块多边形均可见

透明度在两套渲染路径上语义不同:overlay.alpha.* 配的是 0–255 整数,传给 Navigator 原生渲染时直接用;传给 JM6 时要除以 255 转成 0–1 的浮点。因此同一个配置值在两条路径上表现一致,但代码里是两处独立转换(ChunkTimeRenderStep.java:35 / ChunkTimeLayerManager.java:68,LoadedChunkRenderStep.java:31 / LoadedChunkLayerManager.java:67)。

相关条目

  • navigator - JM6 覆盖依附的两个图层及其版本门禁
  • config - overlay.alpha.timing / overlay.alpha.loaded 的定义
  • swing-ui - 覆盖层双击后跳转的面板