更新日志

每个版本只写玩家看得见的变化,以及为什么这么改——「为什么不那样做」往往比功能本身更值得读。 版本号按语义化版本:第二位动是新增功能,第三位动是修 bug 或只改显示。

未发布(0.2.3 开发版)

下面这些改动只存在于作者本地的 0.2.3 开发版里, 尚未发布、不可下载。它们不属于 0.2.2,请勿按这一节去使用 0.2.2。

破坏性变更

  • 导航仪物品已移除,打开本模组界面的入口只剩 K 键。 原来右键导航仪打开的就是主界面(K)里「选择目的地」那一个,物品与本模组自己的界面重复, 所以把物品、配方、进度、创造模式标签页、语言与模型一起删了——本模组现在不注册任何物品。 存档里已经拿到的导航仪会因为物品 ID howtogo:navigator 不再存在而读不出来; K 主界面、/howtogo terminal 与手机里的「问道导航」都还在。
  • Fabric 上 K 键现在真的能打开主界面了。之前 K 只在 NeoForge 上注册与读取,Fabric 的键位表里根本没有它——物品删掉之后那等于 Fabric 玩家没有任何入口, 所以两个加载器现在都注册并轮询同一个键位。

新增

  • 服务端装了本模组(和 MTR)时,MTR 的整张路网会同步给客户端。 MTR 自己的服务端只发给客户端周围两百格左右的车站与线路,所以(不联机开图、也没装 MTR Map Overlay 时)玩家没走到过的铁路,问道一概不知道,去没去过的车站也规划不了。 现在服务端在本模组里读 MTR 正在模拟的整张路网——每个维度的全部车站、线路与轨道, 在 MTR 自己的线程上读——打包压缩后按 30 kB 分片发给客户端;客户端每秒说一次 hello, 服务端只回给说过 hello 的客户端。路网十秒检查一次,只有真的变了才重新编码、重发。
  • 和 MTR Map Overlay 一起装时,优先用本模组自己的数据:overlay 的快照退为后备, 只有本模组自己没有任何读数时才用它,避免同一批车站从两个可能不一致的读取器里出现两遍。 新增配置 mtr_server_sync(默认开):关掉后客户端不再向服务端要数据。
  • 客户端自己不装 MTR 也能用服务端同步来的路网:目的地列表、地图标记、 公交线路与路线规划都直接可用;只有服务端需要 MTR 与 mtr_transit 开着。
  • 这个同步只在 1.20.6 与 1.21.1 的节点上编译并启用(MTR 4.x 在这些版本上有对应构建); 其它版本节点的代码里这段是空实现,行为与之前完全一致。

开发版里还有一批尚未写进更新日志的改动(界面主题、地点详情等),以本地构建的实际行为为准; 它们同样不属于 0.2.2。

0.2.2 — 2026-10-18

这是预发布测试版:21 个构建(11 Fabric + 10 NeoForge,覆盖 Minecraft 1.20.1 ~ 1.21.11 与 26.1 ~ 26.3)都只做过编译验证与回归测试 (873 项检查),没有在真实游戏里逐个走查过。遇到问题请附上 latest.log。

破坏性变更

  • 中文存档的数据目录改用拼音命名,升级时自动迁移,但降级会读不到。 sp_新世界 从 sp____ 变成 sp_xin_shi_jie; 第一次打开某个世界时整个目录自动改名,目录里的 .world 记录也一起走, 所以升级不用做任何事。风险在降级:0.2.1 只认 sp____, 用 0.2.2 存过档之后再退回 0.2.1,那个世界的路网会是空的。 详见 迁移地图数据。

新增

地图与显示

功能 说明
道路有了一条「画出来的线」 路段额外带一份平滑折线(RoadCurve):世界坐标,先按 0.9 格 容差抽稀——刚好把一格一格的楼梯收成它代表的那条斜线——再对折角按固定 1.25 格半径做圆弧倒角,首尾钉在道路两端。倒角半径是格数而不是比例,否则一条两百格长、 末端直角拐弯的路会一下切掉五十格,看起来像路自己抄了近道。它只用于显示: 寻路、测距、命中与存档里的整数顶点一行没动。Create 的贝塞尔曲线与 MTR 的小数坐标轨道 保留原采样再平滑,不再先四舍五入到方块。道路 JSON 多一个可选字段 curve: [[x,z], ...],写了才出现;旧存档照常读,旧版本读新存档只会忽略它。
支持阡陌交通(RoadWeaver) 它自动生成的道路会被读进来、画在世界地图上、参与寻路,它连接的村落与小屋成为目的地; 沿途缺口会自动补一条同等级直线连接段;结构别名优先;编辑时可以吸附到它的路与结构。 全反射读取,没装也不会崩。详见 阡陌交通。
机器读到的短轨道先拼成长段 MTR 一小截一小截发过来的铁路、以及 Create 的轨道,端点相接且类型相同的片段会拼成 「路口到路口」的长折线,只有岔口(三条以上轨道交汇)和没接上的地方才断开。 一条线不再碎成几百段,选中、命名、描边和寻路的边数都跟着变干净。
地图上的路按层叠放 世界地图从低层往高层画路段:高架压在自己跨过去的那条地面路之上、 隧道在地面路之下。以前按 HashMap 的枚举顺序画,一座桥画在上面还是下面 取决于两条路段谁先被枚举到。同一层内的先后不变,所以只动了那些本来就画反的路; 同一层里先画完所有描边再画填充,路口看起来是一条路从另一条上跨过去。
名字排版重做 世界地图与网页地图共用一套规则:字号不超过道路画出来的宽度(路太细先不写名字)、 长路沿路每隔约 190 像素一个名字、名字互不重叠、地点名按类型分缩放出、地点名避开道路与标记; 地点名与地点标记来自同一份目的地列表,所以 MTR 站名也会画出来。
每个道路等级的颜色可以自己定 road_colors:六项各一个颜色,#RRGGBB 或带透明度的 #AARRGGBB。世界地图、导航小地图、目的地选择界面、图例与网页地图读同一份设置, 写错的值被忽略并保留原色,改完不用重启。
公共交通线路按类型配色 transit_line_colors:铁路 / 水路 / 公路 / 冰道四类各一项。 改的是线路本身与它名下的每一个站点标记;它下面的轨道仍按 road_colors 画。
MTR Map Overlay 的两个开关会被记住 它在世界地图上的「线路 / 轨道」开关以前每次开游戏都回到「都画」,正好盖住问道的标记。 现在状态记在 config/howtogo/mtr_overlay_toggles.json,改了立刻保存、下一局恢复; 它自己的配置文件不动,删掉这个文件就不再记。

编辑

功能 说明
- / + 直接加减正在画的层 画隧道时按一下 - 就下到地下 1 层,接着画的路都在那一层,层数截在 -32 ~ +32,= 与小键盘的 - + 同样有效。 它只改接下来画在哪一层,不动已经画好的路(改已有的路仍是 N 面板,名称与层一起改、一起撤销),也没有撤销记录——绘制层是一个模式,不写进存档。 当前层一直写在左下角那行读数里,右下角快捷键列表里多了一行 - / + 道路层。
右键拖地图 编辑模式里左键被用来放点,地图就没有左键可拖。现在:地图上没有正在画的线时, 按住右键拖动就是平移地图,走的是 Xaero 自己的平移代码,手感与平时一样; 一旦放下第一个点开始画,右键还是那个「结束这条线」的老功能;右键单击不拖 照旧清除选中。
选中的路报出层与全长 Shift 选中一条路后,左下角的读数是「已选道路:等级 · 方向 · 道路层:高架1层 · 全长 320 格」。层是平面地图看不出来的那一半(桥还是隧道), 全长是整条路的(带弯的路在数据里是好几段,报的是它们加起来), 不是光标底下那一段。网页地图的状态栏同样四项。
关掉世界地图后编辑模式会自己结束 以前只要开着就一直开着:按 Escape 回世界、再打开地图,发现自己还在画路,光标一放就多出一个点。 现在地图被任何非编辑面板的界面替换时(回世界、聊天、别的模组界面)编辑模式自动关闭并写日志; 这个编辑器自己打开的命名面板、线路配置、地图存档不算——从它们返回来还是原来那张地图。

界面与存档

功能 说明
主界面(K) 在世界里按 K 打开,指令一个都不用记。标题下面是一张只能看的地图 (拖动平移、滚轮以光标为中心缩放,点它不会选点也不会开始导航),再下面是状态与按钮: 选择目的地、结束导航、切换出行方式、地图存档、自检、浏览器地图、关闭。 按键可在「控制」里改;世界地图里按 K 不会触发(地图有自己的按键)。
模组列表里的「配置」按钮真的能打开配置界面 注册了 NeoForge 自带的配置屏幕,它读的就是生成 howtogo-client.toml 的同一份声明, 所以列出的项、默认值、范围、注释与文件一致;改完保存即时生效(配色也在这里改最方便), 中英文界面都有每一项的标题。
地图存档可以导出、导入了 /howtogo data 打开「地图存档」界面:一个按钮把当前世界的道路、 地点、铁路名称、公共交通线路与附属数据打成一个 .zip 放到 config/howtogo/exports/,另一个把别人的包导回来;/howtogo export 直接导出,/howtogo import [压缩包] 读指定文件,包也可以直接拖进界面。 导入无视包名与内部目录名、覆盖前先备份到 config/howtogo/backups/ 再整目录替换 (不合并),备份文件名带 -backup、可再导入回滚。 只读 .json;路径穿越、macOS 元数据、坏包一律拒绝。详见 迁移地图数据。

浏览器地图

功能 说明
画的是游戏里那张地图 以前只送玩家手画的那一份,于是阡陌交通自动生成的道路、Create 与 MTR 自动识别的铁路 在世界地图上有、浏览器地图上一概没有。现在这几层只读图层也在客户端线程上读成快照的一部分, 画在玩家自己画的路之上,按道路等级取色;载荷里每条路段多一个可选 source (ROADWEAVER / CREATE / MTR / ADDON), 页面用它把「只读」和来源写进鼠标读数与统计(侧栏多一行「自动识别」)。 仍然是只读、只在本机、只读客户端自己手里那一份。
也画那条平滑曲线 载荷里带上 curve,页面用它描边、沿路排路名、并让地点名避开真正画出来的线; 没有 curve 的手画道路照旧用顶点。
手动启动不再弹确认框 /howtogo webmap 以前把地址发成聊天链接,点它时原版会弹出确认框; 现在手动启动时直接用系统默认浏览器打开页面(服务启动成功之后才开), 聊天栏里的地址保留为纯文本方便抄写。主界面里的「浏览器地图」按钮同样直接打开。

修复

  • 世界地图上每段路的「最后一截」只有一半宽:描边在一条路的终点用了反过来的 垂直方向,四条边拼成「蝴蝶结」,显卡只盖住一半面积——就是路口前那一截突然变细。 现在整条路统一按行进方向取偏移,过尖的折角也退回普通接头并补圆头。
  • 其它界面上的路不再一段一段的:导航小地图、目的地预览、主界面查看器、手机端选择页 共用同一个描边过程,弯道外侧不再缺三角、接缝不再有缺口;自动识别道路不再一段一个圆头、 一段深一段浅的珠子也不见了,同一条路经过路口时不再分成两笔画。
  • 自动识别道路的抖动:斜向全是台阶、转弯处又切掉太多,两处原因叠出来的。 抽稀容差从 0.45 格改成 0.9 格,倒角从按比例改成固定半径,端点补圆头。
  • 步行越野有上限了,而且只有地表能跨:新增配置 walk_offroad_blocks (默认 32,0~4096),超出的目的地/路尽头直接判「没有路线」,不再画出横穿地图的直线; 近距端点的合并对步行只在地表层 0 生效。
  • 驾车不再越野,公共交通的乘车段也不再越野:驾车只允许「车还在路面上」 的那点距离(停在路边可以、停在田里不行);公共交通只保留站台到轨道的接驳 (station_snap_blocks),「全是接驳、没有一节在轨道上」的假乘车会被拒绝。
  • 导航路线走完最后一段时颜色不再倒回去:到达后整条按「已走」处理, 不会整条重画成未走的青色,看起来像路又跑回前面去了。
  • 退出世界不再把上一局的导航带进下一局:检测到世界已卸载就结束这趟导航并写一行日志。
  • 维度文件名不再被拼音化,已有的路网不会再「消失」:拼音命名只作用于存档目录, 但当时也作用到了维度文件名上(ICU 会把 : 改写成 : ), 于是磁盘上的路网还在、模组却去找另一个名字,读到的是一张空地图。 现在维度文件名走自己的规则,纯 ASCII 文本不交给转写器;读盘时还会写一行 world data: <世界> | <目录>/<文件>。
  • 世界地图右下角的道路类型现在会跟着语言走:以前中文界面显示的是 HIGHWAY / ROAD / PATH,现在与目的地选择界面共用同一个标签。
  • 步行模式不再只有「地表那层」的路能跨过相近的路尽头:两条路端点差一两格时, 步行不再问层数(步行者本来就可以离开路网走过去);驾车仍照旧——桥就是桥,不会从引桥爬上桥面。
  • /howtogo 的帮助行不再显示成带 %s 的原文: 帮助文案有五个占位符,而代码只传了一个参数,于是格式化失败、玩家看到的是模板本身。 现在按占位符个数传参,并把 webmap 一起写进帮助。

0.2.2 还包含一批以「量出来的数字」为依据的修复与回归测试(描边几何、抽稀、路线方向、 线路连通、地图存档往返等),这里只列玩家看得见的那些;完整的技术记录在仓库的 CHANGELOG.md。

0.2.1 — 2026-10-06

修复

  • 删除一条路现在删的是整条路,而不是光标底下那一段:带弯的路在数据里是若干路段在 「直通节点」处首尾相接,所以选中它时选中的是整条链——地图高亮、改名、改等级、改层、 标单行这些操作一直作用在整条链上,只有删除是个例外,于是删完以后地图仍旧把剩下的部分画成「已选中」, 一条弯了两个弯的街得按三次删除键。现在删除和别的操作问同一个问题:「这条链是什么」, 然后整条链一起删。
  • 驾车到一个「终点还得走一段」的地方,时间不再按全程步行算:所选方式在当前路网无解时 会退回按步行规划,而一条以步行规划出来的路线每一段都按步行速度计时, 连那两公里汽车明明开得动的公路也一样。现在这条线本身不动, 但按驾车重新计时:车能走的每一段按汽车速度算,走不了的那一段保持步行速度, 也就是「车走的时间 + 人走的时间」。公共交通不给这条——一条线路拉不动这趟行程时,如实给步行,时间也照旧。
  • MTR 4.1 上「读整张地图」本来是悄悄失效的:4.1 把入口类改名成了 org.mtr.MTR(原来是 org.mtr.Init / org.mtr.mod.Init), 于是按类型找「持有 Main 的那个类」的两个旧拼法都不存在,整图读取报自己不可用, 模组安静地退回「窗口 + 记忆」——玩家看到的是范围外的车站又读不到了。现在三个拼法都试, org.mtr.MTR 排在第一个。顺带补上回归测试的另一半:以前只核对窗口读取的握手, 整图读取的一套名字从来没人查,这个 bug 才能一直存在。版本支持矩阵见 MTR 集成。
  • 日志里不再有本模组自己的测试输出:铁路图层每秒一行、地图每秒一行、MTR 每次读入的统计、 每次规划的路由算术、一条线路被画成直线段的几何报告等,收进新配置项 debug_log (默认关,改完即时生效,关掉时连计数都不做);Xaero 地图投影的 P0 探针 RoadDebug 与打开它的系统属性 -Dhowtogo.debug 直接删掉。警告、错误与一次性事件行不受影响。
  • 偏航判定不再动不动就喊「偏离路线」:各等级的「还算在路上」容差直接调大 (高速 24 / 公路 16 / 小路 8 / 铁路 16 / 水路 32 / 冰道 12,原来是按路宽算出来的 高速 11 / 公路 8 / 小路 5 / 铁路 6 / 水路 10 / 冰道 8),并新增 station_snap_blocks (默认 32 格):行程停靠的站点周围算「就在站上」,换乘站的每个站点各自生效。 注意已经写过 howtogo-client.toml 的实例不会被新默认值改动。
  • 公共交通线路里那行「与上一站不连通」不再误报:红色现在只表示真的不连通 (两站分属该线路等级道路的两个连通片段),不再受 64 格接驳上限约束,改用 256 格判定距离, 超过就不判断、标题旁改给一句橙色提示(screen.howtogo.line_unjudged); 单行方向与站序相反仍判红。顺带修好三处:修好轨道后红字不刷新(签名改取各来源自己的版本)、 MTR 线路按自己的轨道判定(编辑界面与规划器走同一个入口)、判定由「逐对站点各规划一次」 改成一次可达性查询。详见 公共交通线路。
  • 「优先大路」以前对开车完全无效:它原来只是压在「小路」上的一个 1.6 倍惩罚, 而车根本不许上小路——被罚的那一类恰好是开车永远用不到的那一类,剩下的高速与公路速度相同、代价一样, 勾了等于没勾;「最短距离」度量更是把惩罚整个丢掉。现在改成每类路一个权重、只乘在搜索代价上 (高速 1.0 / 公路 1.25 / 小路 1.8),两种度量走同一条计算,所以两边都生效。
  • 规划偏好的改动不再影响报出来的时间:原来是把惩罚折进速度(等效速度 既用来算搜索代价,又离面板的「约 X」只差一步),两者当时能对上,只是因为那个被加权过的速度 恰好没有传进路线自己的分段——这是巧合,不是不变量。现在权重只乘代价、绝不碰速度, 报出的时间结构上不可能再被偏好污染。
  • 规划时不再让高速拐超过 100 度的弯,也不许在高速上掉头:这条规矩落在搜索里, 而不是在念白里,100 度留住了高速真正会有的每个弯(直角路口、中央分隔带端头的掉头匝道、向外弯出去的匝道), 挡掉发夹弯与折返。同时补上两个漏洞:兜底搜索(findNodeRoute)以前不问这条规矩, 于是「只有一条路可走、而那条路必须在高速上折返」的行程被锚定搜索拒掉后又被原样规划了出来; 弯也以前只在路口读,现在按正在走的那一段自己的折线也问一次。

新增

  • 公共交通的「报站式」导航(配置项 transit_board_only,默认开): 在车上的那一段不再提示左转右转,改说上车、到站、还有几站与在哪换乘; 走到车站与下车之后的步行段照旧是普通转向提示。
  • /howtogo selftest:对着当前这个世界自检(联机也能用、不需要权限): 一次问完世界数据、每条线路逐段连通判定(与线路配置界面同一个入口)、每条线路的行程、 一趟 48 步的模拟乘车(把导航会说的话按顺序打出来),以及一次存档往返。 明细同时写进日志,筛 [HowToGo] selftest。
  • 三条客户端指令(/htg 是简写,联机可用、不需要服务器装本模组、不需要权限): /howtogo terminal(打开导航终端)、/howtogo stop(结束导航)、 /howtogo mode [walk|drive|transit](切换出行方式,不带参数时循环)。
  • 导航开始时和结束时各说一句(语音播报打开时):开始说「问道地图为您导航」, 到达说「已到达目的地附近,本次导航结束」。
  • tools/user-test/:真实游戏里的测试装备, 以及一份自检盖不到、只能手点的玩家清单。
  • 配置新增 mtr_full_map(默认 true)与 mtr_station_merge_blocks(默认 256):前者让自己开图时读到整张铁路, 后者把同名且相距不远的 MTR 车站合成一个地点。

改进

  • 「只报站不报转向」默认改成开(transit_board_only): 它换掉的只有在车上那一段的念白,而乘客在车上做不了转向,能做的决定就是 「哪一站下车」和在换乘站「上哪条线」,所以车上那一段给报站才是信息最多的那种。 注意已经写过 route_preferences.json 或 howtogo-client.toml 的实例不受影响:文件里的值优先,要回到新默认就在界面里把那个开关打开, 或把那一项删掉。

0.2.0 — 2026-10-03

新增

功能 说明
MTR 集成 读取 MTR 的车站与线路:列车 / 缆车算铁路,船算水路,其它类型(例如飞机)不猜; 站点取站台的中点;完全反射只读,MTR 没装或换版本都不影响本模组。 详见 MTR 集成。
MTR 轨道标记 MTR 的协议里没有「这条线路走哪段轨道」,所以问道对相邻站点对在 MTR 的轨道上规划一次, 把它实际走过的轨道标成只读的铁路 / 水路道路。每条线一个开关。
公共交通线路(L) 一屏三列建完一条线;线路有类型,接不上上一站的站点标红; 只读线路可以「复制为我的」。详见 公共交通线路。
地图显示面板 左上角可拖动、可卷起的面板,按等级 / 地点类型 / 线路逐个开关; 缩小地图时还会按等级自动取舍。详见 地图显示与缩放。
单行道(O) 双向 / 顺向单行 / 逆向单行三态,按整条街生效,地图上画箭头指出方向, 所有交通方式(含步行)都遵守。详见 画路、命名与地点。
地点类型 地点 / 资源点 / 商店 / 站点。类型影响显示与缩放取舍,不影响导航;只有「站点」必须建在道路上。
换乘站 同一处被两条及以上线路共用的站点画成橙色方块(尺寸与站点相同), 只有屏幕上真的重叠时才融合,拉近看就分开。
「修路」 repair_road_joins:两条路交叉而过、或差一格没接上时, 规划前先把这种地方修好(只在不改变「桥还是桥」的前提下)。
MCPhone 兼容 手机里多一个「问道导航」应用,等于一个打开目的地选择界面的入口。

改进

  • 名字好看多了:字号跟着缩放走,缩小时按比例变小到仍然看得清的下限,放大时增长得很慢 (约 38 倍缩放才到最大字号);线上名字顺着线的方向写、取行高一半让道路从字中间穿过; 地点名保持水平;名字宽度超过整条路时整条不画;缩小时名字自动贴近它标注的标记。
  • 步行接驳实际上没有上限了:没路的时候人本来就是直线走过去,只是按离开路面的速度计时。 一个 64 格的上限会让「明明就在眼前、但离路 65 格」的地方回答「没有路线」,那是唯一无法执行的答案。 驾车与公共交通仍是 64 格。
  • 地图面板不再被盖住:它是屏幕覆盖层,线路、标记、文字都压不到它上面,点击也不会被地图截走。
  • 平移地图不再拖影:屏幕上的一切都改用地图这一帧自己的变换来定位。

配置与数据文件

  • 新增配置:repair_road_joins、transit_wait_seconds、 mtr_transit、mtr_auto_route_marks。
  • 新增数据文件:<维度>-lines.json(公共交通线路)、 map_filter.json(显示开关与面板位置)。两个都是单独的文件, 出问题也碰不到你的路网。

0.1.0 — 2026-09-26

首个版本,把「画路」和「导航」接在了一起:

  • 画路:六个等级(高速 / 公路 / 小路 / 铁路 / 水路 / 冰道)、自动吸附、 Alt 自由放置、在路段中间落点会真正拆分路段并在交点建立节点、整条路共用一个名字、 地点标记、节点可拖动、撤销 / 重做 64 步。
  • 机械动力铁路自动识别:优先读 Create 的轨道网络(弯道是平滑曲线), 读不到时回退为扫描轨道方块;铁路只读但可整条命名;Create 的车站成为可导航的目的地。
  • 导航:步行 / 驾车 / 公共交通三种方式;最快时间 ↔ 最短距离;避开等级; 优先大路;先预览再出发;按「交通方式 + 道路等级」估算时间;HUD 与语音播报;偏航重算; 不画横穿地图的直线,接驳太远就如实报「没有路线」。
  • 导航仪物品:右键选目的地,九格配方(四角铁锭、四边纸、中心指南针)。

完整的技术性日志(含每一步「为什么不那样做」)在仓库里的 CHANGELOG.md。 数据文件的位置与每一项配置的含义见 配置与数据文件。