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())、打开主界面,见 主界面 GUIwithRenderStep(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) 提供。