Navigator 地图图层

navigator/ 包,把带坐标的任务投影到 Navigator 的地图上。整包是可选功能——只有装了 Navigator 才注册。

注册

ClientProxy.init():

if (cpw.mods.fml.common.Loader.isModLoaded("navigator")) {
    NavigatorApi.registerLayerManager(TaskLayerManager.INSTANCE);
}

Loader.isModLoaded 判断通过才触碰 Navigator 的类,所以没有 Navigator 时这个包完全不参与类加载。

4 个类

类 行数 职责
TaskLayerManager 143 图层管理器,单例 INSTANCE
TaskMapButtonManager 26 图层开关按钮(图标 + 文字)
TaskMapLocation 100 单个任务对应的地图位置,实现 IWaypointAndLocationProvider
TaskMapRenderStep 101 地图上的渲染与点击步骤,继承 UniversalInteractableStep<TaskMapLocation>

哪些任务会显示

TaskLayerManager.refreshFromCache(Collection<Task> tasks):

if (task.location != null && task.showOnMap) { locations.add(new TaskMapLocation(task)); }

两个条件都要满足——有坐标 且 showOnMap 为真。showOnMap 默认为 false,需在详情面板用 tasknh.detail.show_on_map 开关(文案 ON/OFF)。方法末尾调 clearFullCache() 强制重算。

TaskNHClientCache 在收到同步后调用它,所以任务或开关一变,地图标记立刻整体替换。

可视区域裁剪

覆写 generateVisibleLocations(minBlockX, minBlockZ, maxBlockX, maxBlockZ, dimension),手写循环过滤:维度相等且 X/Z 落在给定矩形内才加入结果。没有用 Navigator 的空间索引,是线性扫描。

渲染与路点

addLayerRenderer 构造 UniversalInteractableRenderer 并挂三样东西:

  • withClickAction(this::onClick) —— 点击地图标记 → 新建 TaskNHGuiData、selectTask(loc.getTaskId())、打开主界面,见 主界面 GUI
  • withRenderStep(loc -> new TaskMapRenderStep((TaskMapLocation) loc))
  • withMapMarker(loc -> createMapMarker((TaskMapLocation) loc))

addWaypointManager 按地图模组分派:JOURNEY_MAP → JMWaypointManager,XAEROWORLDMAP → XaeroWaypointManager,其余返回 null。所以只支持这两种地图模组的路点导出。

MARKER_IMAGES 是一个 EnumMap<TaskStatus, BufferedImage>,按状态缓存标记图;createMapMarker 设 setDisplaySize(16, 16) 与 setDisplayZoomScale(1, 2, 3, 5)。

颜色

TaskMapLocation.getColor() 按状态取 ColorUtils 中的三个 ColorResource:

状态 颜色键 默认值
OPEN mapWaypointOpen 0xFFAAAA(粉)
IN_PROGRESS mapWaypointInProgress 0xAAAAFF(蓝紫)
DONE mapWaypointDone 0xAAFFAA(浅绿)

ColorUtils 里另有一套更暗的填充色(mapFillOpen 0x888800 / mapFillInProgress 0x004488 / mapFillDone 0x228822),注释说明「darker tones, separate alpha in DrawUtils」——深色变体单独在 DrawUtils 里处理 alpha。

⚠️ 这套 ColorResource 的默认值不在任何 .cfg 里,定义在代码中,可被资源包 lang 覆盖(ColorResource.Factory("tasknh") 决定命名空间为 tasknh)。

坐标与身份

TaskMapLocation 暴露 getBlockX() / getBlockZ() / getDimensionId(),直接来自任务的 TaskLocation。toLong() 是关键实现:

return taskId.getMostSignificantBits() ^ taskId.getLeastSignificantBits();

源码注释:Navigator 要求一个稳定的 64 位身份;把任务 UUID 折叠起来可以让同坐标的多个任务保持彼此独立,不会互相覆盖。

isActiveAsWaypoint() 与 onWaypointCleared() / onWaypointUpdated(Waypoint) 一并实现,路点清除与更新都能回调到任务侧。

资源

图标在 assets/tasknh/textures/navigator/task_icon.png(全 mod 唯一的贴图文件),由 TaskMapButtonManager.getIcon(SupportedMods, String theme) 提供。