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() 的契约需看该接口。

相关