路点管理器与编辑器

基本信息

属性 值
管理器 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 删除

相关条目