MapMarker

地图标记模型(320 行)

基本信息

属性 值
路径 com.gtnewhorizons.navigator.api.model.markers.MapMarker
行数 320(api/model 包最大,全 mod 第 4 大)
类型 final class

地图上的图标 + 标签标记。与 UniversalRenderStep(逐点绘制)不同, MapMarker 是地图原生标记 —— 由地图模组自己渲染, 支持缩放、缩放级别可见性等原生能力。

4 个构造器(按图片来源)

构造器 行 来源
MapMarker(BufferedImage) :54-70 java.awt 图片(运行时生成)
MapMarker(ResourceLocation, int textureWidth, int textureHeight) :72-81 整张纹理
MapMarker(ResourceLocation, TextureAtlasSprite) :83-~99 纹理图集里的 sprite
MapMarker(ResourceLocation, int textureX, int textureY, int textureWidth, int textureHeight) :101-~115 纹理子矩形

⚠️ BufferedImage 构造器在 1.7.10 客户端是合法的(java.awt 存在), 但会占用堆内存与 CPU(ImageIO 编解码)。 用于动态生成图标(如按数量画数字)。

⚠️ TextureAtlasSprite 构造器(:83)与 TextureAtlasSpriteAccessor(EARLY mixin)呼应 —— 后者放开了 sprite 的 padding 状态, 让 Navigator 能知道图集里 sprite 的实际 padding(影响 1px 缝隙)。

⚠️ 4 个构造器都要求非空 ResourceLocation(除 BufferedImage 版), 且没有无参构造器。

11 个链式 setter(全部返回 this)

方法 行 参数 用途
setDisplaySize(double, double) :117-122 宽、高 显示尺寸(double)
setDisplayZoomScale(double minScale, double maxScale, double minZoom, double maxZoom) :124-128 4 个 缩放区间
setLabel(@Nullable String) :130-140 文本 静态标签
setLabelSupplier(Supplier<String>) :142-152 Supplier 动态标签
setTooltip(@Nullable List<String>) :154-158 列表 tooltip
setLabelColor(int) :160-164 颜色 标签颜色
setLabelScale(float) :166-170 缩放 标签缩放(float)
setLabelZoomScale(double, double, double, double) :172-176 4 个 标签缩放区间
setLabelBackgroundOpacity(float) :178-182 不透明度 背景
setLabelOffsetY(int) :184-~193 偏移 标签 Y 偏移
setLabelMinZoom(int) :195-~200 最小缩放级 可见性

⚠️ setLabel 与 setLabelSupplier 二选一 (一个静态 String 一个 Supplier<String>)—— 同时设置时行为取决于实现(可能后者覆盖前者)。

⚠️ 缩放参数有 4 个(minScale, maxScale, minZoom, maxZoom) 且同时存在于 setDisplayZoomScale 与 setLabelZoomScale —— scale 与 zoom 是两套不同的量(像素缩放 vs 地图缩放级别), 参数命名极易混淆。

⚠️ setLabelScale 用 float 而 setDisplaySize 用 double —— 类型不统一。setLabelColor(int) 的打包顺序源码无注释。

⚠️ setLabelMinZoom(int)(:195)与 setLabelZoomScale(..., double minZoom, ...) 功能重叠 —— 一个用 int 缩放级别,一个用 double。

与 ILocationProvider 的关系

UniversalLayerRenderer 的 withMapMarker(Function<ILocationProvider, MapMarker>)(:65-69) 从数据点造标记,createMapMarker(ILocationProvider)(:79-87)取出。

⚠️ 每 tick 都会重新 create(若 hasMapMarker() 为真), 所以 setLabelSupplier 的 Supplier 会被高频调用 —— Supplier 里做重活会有性能问题。

相关