NavigatorApi
公开 API 入口:图层注册、渲染器查询、排序
基本信息
| 属性 | 值 |
|---|---|
| 路径 | com.gtnewhorizons.navigator.api.NavigatorApi |
| 行数 | 151 |
| 类型 | final class,全静态 |
三个静态字段
public static final double CHUNK_WIDTH = 16; // :31
public static final KeyBinding ACTION_KEY = new KeyBinding(...); // :34-37
public static final List<LayerManager> layerManagers = new ArrayList<>(); // :40
| 字段 | 值 | 说明 |
|---|---|---|
CHUNK_WIDTH |
16.0(double) |
Minecraft 一个区块的方块数 |
ACTION_KEY |
navigator.key.action / 默认 DELETE |
见下 |
layerManagers |
ArrayList |
公开可变列表 |
⚠️ CHUNK_WIDTH 是 double 而非 int ——
为避免调用方 (x << 4) / (int) CHUNK_WIDTH 这类混算时的取整歧义。
⚠️ layerManagers 是 public 直接暴露的可变 ArrayList
(非 Collections.unmodifiableList 包装),
所以消费方可以直接 add 绕过
registerLayerManager 的 forceRefresh() 调用 ——
那种图层不会被安排初始缓存同步。
ACTION_KEY 的三个细节
new KeyBinding("navigator.key.action", Keyboard.KEY_DELETE, Navigator.MODNAME)
| 项 | 值 |
|---|---|
| 本地化 key | navigator.key.action(= modid + .key.action) |
| 默认键 | Keyboard.KEY_DELETE |
| 分类 | Navigator.MODNAME = "Navigator"(首字母大写) |
⚠️ 分类用 MODNAME 而非 MODID ——
键位设置界面里显示为 Navigator > navigator.key.action,
分类名与 modid 大小写不一致。
⚠️ 默认占用 DELETE 键。这会与
BiomeMerger(默认 DELETE)、JourneyMap 自身的删除键位冲突。
由 ClientProxy 的
ClientRegistry.registerKeyBinding(ACTION_KEY)(:21)注册。
registerLayerManager(:50-53)
public static void registerLayerManager(LayerManager layerManager) {
layerManagers.add(layerManager);
layerManager.forceRefresh();
}
| 步骤 | 说明 |
|---|---|
add |
不去重(源码注释 :45-46 明写) |
forceRefresh() |
设置 forceRefresh = true,安排初始缓存/渲染同步 |
⚠️ 不去重是 API 契约的一部分,源码注释明写
This method does not deduplicate registrations。
同一 LayerManager 注册两次 → 渲染两次。
见分类页缺陷 5。
getActiveRenderersFor(:61-67)
return layerManagers.stream()
.filter(manager -> manager.isEnabled(mod))
.filter(LayerManager::isLayerActive)
.map(manager -> manager.getLayerRenderer(mod))
.collect(Collectors.toList());
三重过滤:
| 顺序 | 条件 | 含义 |
|---|---|---|
| 1 | isEnabled(mod) |
该图层对这个地图模组启用(见 SupportedMods) |
| 2 | isLayerActive() |
图层当前激活(图层按钮状态) |
| 3 | getLayerRenderer(mod) |
取该地图模组对应的渲染器 |
⚠️ 返回新列表(Collectors.toList()),
调用方改动不影响 layerManagers。
⚠️ 过滤 1 之后 getLayerRenderer(mod) 可能返回 null
(LayerManager.getLayerRenderer 的契约是 @Nullable),
但本方法不剔除 null ——
所以返回的 List<LayerRenderer> 可能含 null 元素,
消费方遍历时需自行判空。
排序版本(:69-~90)
源码注释标明
Returns active renderers sorted by ascending {@link LayerRenderer#getRenderPriority()}
—— 按渲染优先级升序排序的版本。
⚠️ 升序 = 优先级数值小的先画(先画的在下),
即数值大 = 更靠上层。方向容易搞反,
LayerRenderer.getRenderPriority() 的契约需看该接口。
相关
- LayerManager - 被注册与查询的类型
- LayerRenderer - 返回的元素类型
- SupportedMods -
isEnabled的参数 - ClientProxy -
ACTION_KEY的注册方 - LayerRefreshEvent - 刷新事件