路点管理器与编辑器
基本信息
| 属性 | 值 |
|---|---|
| 管理器 | journeymap.client.ui.waypoint.WaypointManager(WaypointManager.java:33),继承 JmUI |
| 编辑器 | journeymap.client.ui.waypoint.WaypointEditor(WaypointEditor.java:42),继承 JmUI |
| 列表项 | journeymap.client.ui.waypoint.WaypointManagerItem(WaypointManagerItem.java:37),实现 ScrollListPane.ISlot |
| 排序按钮 | journeymap.client.ui.waypoint.SortButton(SortButton.java:19) |
| 维度按钮 | journeymap.client.ui.waypoint.DimensionsButton(DimensionsButton.java:27) |
| 数据存储 | journeymap.client.waypoint.WaypointStore(单例) |
| 路点类型 | 2(Waypoint.Type.Normal / Waypoint.Type.Death,Waypoint.java:517-520) |
| 打开热键 | Ctrl+B 开管理器,B 直接建点 |
功能
路点系统有两级界面:管理器(列表 + 排序 + 批量操作)与编辑器(单个路点的名称、颜色、图标、坐标编辑)。
打开方式
| 入口 | 方法 | 源码 |
|---|---|---|
Ctrl + B |
UIManager.openWaypointManager(null, null) |
KeyEventHandler.java:133、UIManager.java:232 |
B |
Waypoint.of(mc.thePlayer) 后 UIManager.openWaypointEditor(waypoint, true, null) |
KeyEventHandler.java:161-162、UIManager.java:248 |
| 全屏地图按钮 | buttonWaypointManager |
Fullscreen.java:404 |
WaypointManager 有 3 个构造器(:64、:69、:74):无参、带 JmUI returnDisplay、带 Waypoint focusWaypoint + JmUI。第三个用于"从地图上的某个路点打开管理器并聚焦它"。
路点数据模型
Waypoint(journeymap.client.model.Waypoint)提供两个枚举与大量访问器:
| 枚举 | 取值 | 源码 |
|---|---|---|
Waypoint.Type |
Normal、Death |
Waypoint.java:517-520 |
Waypoint.Origin |
JourneyMap、ReiMinimap、VoxelMap |
Waypoint.java:510-514 |
Origin 表明路点文件兼容读取 REI Minimap 与 VoxelMap 的数据格式。
关键访问器:
| 方法 | 语义 | 源码 |
|---|---|---|
isDeathPoint() |
是否死亡点 | :195 |
getColor() / getSafeColor() |
颜色,getSafeColor() 在无效时回退 |
:238、:250 |
getR() / getG() / getB() |
RGB 分量 | :339、:349、:359 |
getX() / getY() / getZ() |
坐标 | :304、:314、:324 |
isEnable() |
是否启用 | :369 |
isDirty() |
有未保存改动 | :408 |
isReadOnly() |
只读(不可编辑) | :418 |
isTeleportReady() / isInPlayerDimension() |
传送前置条件 | :269、:274 |
hashCode() |
仅基于 id |
:505-508) |
列表项与排序
WaypointManagerItem 实现 ScrollListPane.ISlot,每个路点一行,行内含左、右两组按钮(buttonListLeft / buttonListRight)。
排序体系是 3 层结构(WaypointManagerItem.java:387-):
abstract static class Sort implements Comparator<WaypointManagerItem> :387
├─ NameComparator :417 按路点名 compareToIgnoreCase
└─ DistanceComparator :438 按到玩家的距离
DistanceComparator 缓存距离:getDistanceTo(EntityPlayer)(:275)注释写明"Returns the squared distance to the entity. Only calculated once."(:273-274),缓存字段 distance 为 null 时才算。
SortButton(SortButton.java:19)包裹一个 Sort,toggle()(:27)切换升/降序,setActive(boolean)(:40)标记当前排序列。
DimensionsButton(DimensionsButton.java:27)用 nextValue()(:67)循环切换维度过滤。
列表渲染细节
WaypointManagerItem 的绘制有几处细节:
- 行背景色:普通
new Color(20, 20, 20),悬停new Color(40, 40, 40)(:40-41) - 标签宽度固定为
fontRenderer.getCharWidth('X') * 32个字符宽(:93),再加两列与左右按钮组宽度(:94-97) - 距离列格式为
String.format("%sm", getDistance())(:176)——固定带m(米)后缀,无小数 - 无效路点的名字加删除线
EnumChatFormatting.STRIKETHROUGH(:178) - 无效路点的颜色回退为
RGB.GRAY_RGB(:170) - 路点图标用
DrawUtil.drawColoredImage(wpTexture, 255, waypoint.getColor(), ...)绘制(:185)
管理器本身还实现 drawBackground(int layer)(:354)与 handleMouseInput()(:395)——后者用于处理拖拽(重排或跨维度移动)。removeWaypoint(WaypointManagerItem)(:673)执行删除,onGuiClosed()(:703)收尾。
编辑器
WaypointEditor(WaypointEditor.java:42)有 4 个主要方法:initGui()(:100)、drawScreen(int, int, float)(:333)、onGuiClosed()(:687)。构造器 WaypointEditor(Waypoint, boolean isNew, JmUI returnDisplay)(:84)的 isNew 区分"新建"与"编辑已有"。内部类含一个 public final int dimension 字段(:694),用于记录路点所属维度。
存储
WaypointStore(journeymap.client.waypoint.WaypointStore)是单例(instance(),:37),提供:
| 方法 | 作用 | 源码 |
|---|---|---|
getAll() |
全部路点 Collection<Waypoint> |
:59 |
add(Waypoint) |
新增 | :64 |
save(Waypoint) |
保存单个 | :72 |
bulkSave() |
批量保存 | :82 |
remove(Waypoint) |
删除 | :97 |
reset() |
重置 | :118 |
load(Collection<Waypoint>, boolean forceSave) |
载入 | :153 |
hasLoaded() |
是否已加载 | :171 |
getLoadedDimensions() |
已加载的维度 List<Integer> |
:176 |
读取由 JmReader(waypoint/JmReader.java:21)负责。
数值
| 数值名 | 值 |
|---|---|
| 路点类型数 | 2(Normal、Death) |
| 路点来源枚举值 | 3(JourneyMap、ReiMinimap、VoxelMap) |
| 排序维度数 | 2(按名、按距离) |
WaypointManager 构造器数 |
3 |
WaypointStore 公开方法数 |
9 |
| 距离显示格式 | "%sm"(整数米) |
| 行背景色 | RGB(20,20,20) / 悬停 RGB(40,40,40) |
| 标签宽度基准 | 32 个 'X' 字符宽 |
交互
| 触发 | 行为 |
|---|---|
Ctrl + B |
打开路点管理器(并 unPressAllKeys()) |
B(无界面时) |
以当前位置为初值打开编辑器创建新路点 |
| 点击列表行 | 聚焦该路点;WaypointManagerItem.clickScrollable() 处理(:210) |
| 点击排序按钮 | SortButton.toggle() 切换升/降序 |
| 点击维度按钮 | DimensionsButton.nextValue() 循环切换维度过滤 |
| 拖动列表项 | handleMouseInput() 处理 |
| 关闭管理器 | onGuiClosed() 保存未落盘改动 |
| 玩家死亡 | createDeathpoints 开启时自动建 Type.Death 路点 |
| 抵达死亡点 | 按 arrivalHorizontalRange / arrivalVerticalRange 判定,配合 deleteDeathpointOnArrival 删除 |