常见问题与限制

这里的每一条都按「现象 → 原因 → 怎么办」写。大多数看起来像 bug 的事, 其实是问道在设计上选了「如实说做不到」,而不是画一条看起来能走、实际走不通的线; 明白它在坚持什么,剩下的就好办了。本页与站点其他页面一致,描述的是已发布的 0.2.2——它是预发布测试版。

版本与入口

支持哪些 Minecraft 版本?该装 Fabric 还是 NeoForge?

0.2.2 一共 21 个构建:11 个 Fabric + 10 个 NeoForge。 Fabric 覆盖 Minecraft 1.20.1、1.20.4、1.20.6、1.21.1、1.21.4、1.21.6、1.21.8、1.21.11、26.1、26.2、26.3; NeoForge 覆盖除 1.20.1 以外的其余十个版本——1.20.1 只有 Fabric,没有 NeoForge。 不支持 Forge:它的构建工具链与现有的冲突,已从仓库移除。

下载时选与你的加载器和 Minecraft 版本对应的那一个,文件名形如 howtogo-0.2.2pre1+mc1.21.1-neoforge.jar,放进 mods/。 另外 Xaero's World Map 是必需的(0.2.2 面向 1.40.0 及以上),所有道路、线路与路线都画在它上面; XaeroLib 从 26.x 起随 World Map 以嵌套 jar 分发,不需要单独下载。

也要知道 0.2.2 是预发布测试版:21 个构建只做过编译验证与回归测试(873 项检查), 没有在真实游戏里逐个版本走查。完整的版本矩阵、前置与安装步骤见 安装与前置, 每个版本改了什么见 更新日志。

按 K 打开的那个主界面是干什么的?

那是 0.2.2 新增的入口:世界里按 K 直接打开问道的主界面,指令一个都不用记。 标题下是一张只能看的地图——拖动平移、滚轮以光标为中心缩放,点它不会选点、也不会开始导航; 它画着你的路、铁路、阡陌交通的路、地点标记、当前路线与玩家朝向。再往下是状态 (出行方式、导航目的地与剩余距离 / 时间、路网规模)和按钮: 选择目的地、结束导航、切换出行方式、地图存档、自检、浏览器地图、关闭。 按键在「控制」里可以改。

两个细节:在世界地图里按 K 不会触发(那张地图有自己的按键); 0.2.2 里导航仪物品仍然存在,K 是新增的另一个入口,不是替换。

为什么报「没有路线」

「没有路线」是四个不同的原因共用一个结果,先分清是哪一种:

原因 怎么判断 怎么办
首末接驳太远 起终点离最近的路超过接驳上限:步行越野 32 格(walk_offroad_blocks,范围 0~4096); 驾车不再越野,只允许「车还在路面上」的那点距离(最宽路面的半宽)——停在路边可以,停在田里不行。 公共交通的乘车段也只保留站台到轨道的接驳 32 格(station_snap_blocks)。 把路修到你要去的地方,或者先用 Ctrl + 左键点一个更靠路的目的地。 问道宁可不画,也不会给你一条横穿地图的直线——那条线看着像答案,走过去是悬崖。
该方式的等级在路网里不连通 换一种交通方式就通了,例如步行能走、驾车不能。 把缺的那一段补上或升级等级(驾车只走高速与公路),或者干脆换方式。
偏好在挡路 你在「选择目的地」界面里避开了某类道路,界面会写着「避开 …」。 把那一项取消,或换一条不经过它的路线。注意避让是完全不走, 不是「尽量不走」——后者是「优先大路」。
路看着连上、其实没连上 两条路交叉而过,或端点差一格没接上。 repair_road_joins 默认是开的,会自动把这类地方修好; 如果你把它关掉了,就必须自己把节点接上(在交叉处落一个点会把路段真正拆开并连起来)。

交通方式与路网

为什么驾车只走高速与公路?

因为那才是车能走的路。三种方式可走的等级本来就是分开的,这也是同一组起终点会给出不同路线的原因: 步行走高速 / 公路 / 小路 / 冰道,驾车只走高速 / 公路,公共交通走铁路 / 水路 / 冰道。 想沿小路开车,请把那段路改成公路等级,或者改用步行——问道不会假装小路能过车。

为什么步行不能直线穿过很远的野外了?

0.2.2 给步行越野加了上限:walk_offroad_blocks,默认 32 格,范围 0~4096。 超出这个距离的目的地或路尽头直接判「没有路线」,不再画一条横穿地图的直线——那条线看着像答案, 走过去可能是悬崖。近距端点的合并对步行也只在地表层 0 生效: 高架与地下的两截路想接上,请自己补一个节点;车仍按同层规则。

同一批改动里还有两条:驾车不再越野,只允许「车还在路面上」的那点距离(最宽路面的半宽), 以前允许的 64 格直线接驳没有了;公共交通的乘车段也不再越野, 只保留站台到轨道的接驳(station_snap_blocks,默认 32 格), 步行段仍按 walk_offroad_blocks,「全是接驳、没有一节在轨道上」的假乘车会被拒绝。

为什么站点必须建在路上?

站点是「上车的地方」,而公共交通过程的第一步永远是走到站。 一个没有任何路线经过的上车点,是任何行程都到不了的上车点:你能把它放进线路里, 但没人能走到它旁边的那条线上去。所以放站点时问道要求它落在道路上(或一个道路端点上), 界面会直接告诉你「站点必须建在道路上」。

路线、偏航与时间

为什么以前动不动就报「偏离路线」?

「还算在路上」的容差原来按路宽算出来,而它量的从来不是路的宽度, 是画笔那条线多远还算在路上——那条线是画在路中间的一条折线。 所以分隔式高速的对向车道、路边的行人、飘离运河中线的船,明明都在走自己那条路,却被判成偏航, 然后一路重新规划。0.2.1 把各等级的默认容差直接调大:

等级 旧默认 新默认
高速 11 格 24 格
公路 8 格 16 格
小路 5 格 8 格
铁路 6 格 16 格
水路 10 格 32 格
冰道 8 格 12 格

都在 on_road_tolerance_blocks 里,每一级都能单独调。另外, 行程停靠的站点周围 32 格(station_snap_blocks)算「就在站上」: 站台、站前广场、天桥离轨道中线几十格是常事,而换乘站是几条线路的多个站点凑成的一个地点, 每个站点周围各自生效,所以从一个站台走到另一个站台换乘也不会被判成偏离。

注意:已经写过 howtogo-client.toml 的实例不会被新默认值改动—— NeoForge 只在文件不存在时写入默认值。要享受新的默认值,就自己改那一节, 或者把 [on_road_tolerance_blocks] 删掉让游戏重写。 完整的配置说明见 配置与数据文件。

为什么时间估计曾经按步行算了一条驾车路线?

所选方式在当前路网里无解时,问道会改用步行规划——步行是唯一能离开路网的交通方式, 所以那是唯一能给出一条线的答案。问题在于:一条以步行规划出来的路线,每一段都按步行速度计时, 连那两公里汽车明明开得动的公路也一样。于是「目的地离可开的道路一百多格、最后要走一段」这种行程, 显示的时长比真正会花的时长长得多,而且是拿人的速度去算车要走的路。

现在这条线本身不动(照旧是步行者规划出来的那一条,最后那一段走走也照旧), 但会按驾车重新计时:车能走的每一段按汽车在该等级道路上的速度算, 走不了的那一段保持步行速度,读出来就是「车走的时间 + 人走的时间」。 公共交通不给这条:一条线路拉不动这趟行程时,如实给步行,时间也照旧按步行算。 另外,驾车只是更慢(而不是无解)时,那条老规矩没变:说明原因并改为按步行规划。

图层、高架与隧道

怎么让高架画在地面路之上?

关键不是画的顺序,是层。在世界地图上按 R 进入编辑模式,按 Shift 选中一条路, 再按 N 打开「道路:名称与层」,就能给整条路设一个层:正数是高架(高架1层), 负数是地下(地下1层),范围 -32 ~ +32。地图现在从低层往高层画: 高架压在自己跨过去的那条地面路之上、隧道在地面路之下——一张平面俯视图里, 这是「谁在谁上面」唯一能画出来的方式。同一层内先画的还在先,所以这一改只动了那些本来就画反的路; 网页地图本来就是这么画的,两边现在一致。

当前层一直写在左下角的读数里(道路层:高架1层)。Shift 选中一条路时, 读数还会报出它的层与全长——层是平面地图看不出来的那一半(桥还是隧道), 全长是整条路的(带弯的路在数据里是好几段,报的是它们加起来,也就是地图高亮的那一整条)。

怎么用 - / + 画一条隧道?

编辑模式里,- 把正在画的层往下调一层、+ 往上调一层, 接着画的路就都在那一层(隧道用负数):按一下 - 就是地下 1 层,再按一下是地下 2 层, 范围同样截在 -32 ~ +32。= 键与小键盘的 - + 同样有效。

它只改接下来画在哪一层,不动已经画好的路,也没有撤销记录——绘制层是一个模式,不写进存档。 要改已有的路(名称与层一起改、一起撤销)仍然用 N 面板。当前层始终写在左下角那行读数里, 按一下就能看见它变;右下角的快捷键列表里也多了一行 - / + 道路层。

为什么路看起来是平滑曲线,选中的点却还是一格一格?

因为 0.2.2 加的那条平滑折线只用来显示:每条路段额外带一份 RoadCurve,先按 0.9 格容差抽稀(把一格一格的楼梯收成斜线), 再对折角按固定 1.25 格半径做圆弧倒角,首尾钉在道路两端。 寻路、测距、选中、存档里的整数顶点一行没动——所以画面上是顺的, Shift 选中后端点仍落在原来的格子坐标上,测距也还是按那些顶点算。

道路 JSON 里多了一个可选的 curve: [[x,z], ...] 字段,写了才出现; 旧存档照常读,旧版本忽略它。Create 的贝塞尔曲线与 MTR 的小数坐标轨道保留原采样再平滑, 不会先被四舍五入到方块。

地图上看不到东西

为什么我画的路别人看不到?

因为问道是纯客户端模组:路网存在你自己的 config/howtogo/ 里, 服务器上没有它,别的玩家也没有。这是设计选择——不用求服主装模组、不用争权限、也不用担心别人改你的路。 想让朋友看到,把数据文件给他(见备份与搬家),或者用 0.2.2 的地图存档导出压缩包 (见本页地图存档能导出给别人吗)。

为什么路有名字,地图上却不显示?

  • 0.2.2 起名字的字号不超过这条路画出来的宽度:路太细(缩小的远景、小路、铁路)时先不写名字, 放大到够宽才出现。长路会沿路写好几个名字——大约每 190 像素写一个、每段最多 8 个, 而且只放在屏幕上的可见段里;可见段比名字还短时,这一段就不写。
  • 名字互不重叠:地点名、铁路名、道路名在同一张「已占位置」表上按这个顺序排,排不下就不画; 两个地点靠得近时只显示一个,放大到名字框分开才都显示。
  • 地图缩得太远时文字会被抑制,这是为了不让一屏字糊成一片。 注意被抑制的只有文字:地点标记在任何缩放下都还画着, 缩小时正是最需要它指出「那儿有个东西」的时候。
  • 也可能是名字没取上:先在编辑模式(R)里 Shift + 点击选中那条路,再按 N 命名。

只读的图层与融合的标记

机械动力的铁路为什么不能改?

因为那段几何属于机械动力:问道最多每秒重新读一次它自己的轨道图, 你在这里移动节点、拆分、删除、改等级,下一秒就会被覆盖掉。 所以问道只提供唯一一样它拿得走的东西——名字:Shift 点击选中整条铁路线, 按 N 命名,名字记在单独的文件里,重建、重载、换识别来源都不会丢。 想要一条完全属于自己的路线,就在它旁边画一条路。

MTR 的线路为什么有时「缺了几站」?

MTR 把它的世界放在自己的服务端上,最基本的一次读取只是玩家附近的那一段窗口。 不过这个窗口通常不是唯一来源:自己开图(单人存档 / 对局域网开放)时,问道会直接读 MTR 正在模拟的整张铁路(配置项 mtr_full_map,默认开); 客户端与服务器都装了 MTR Map Overlay 时,它抓回的整张网络快照也会被读进来 (mtr_map_overlay,默认开)。两者都够不着时(联机在别人的服务器、两边都没装 Map Overlay), 才只有靠近过的内容——问道会把每次读到的东西合并记住(线路、车站、轨道),所以走出同步范围时线路不会凭空消失, 但从没靠近过的车站确实读不到。 另外,剩余不足两站的线路根本不会被列出来——一条没有行程可坐的线路只会回答「没有路线」。

还有一段历史值得交代:MTR 4.1 把入口类改名成了 org.mtr.MTR (原来是 org.mtr.Init / org.mtr.mod.Init),而旧版问道的整图读取只试了后两个拼法, 于是在 4.1 上它静默失效,模组退回窗口读取——玩家看到的就是「范围外的车站又读不到了」。 0.2.1 起三个拼法都试,读取器要求 MTR 4.0.4 及以上。 详见 支持哪些 MTR 版本。

换乘站为什么变成一个大方块?为什么有的又没融合?

同一位置被两条及以上线路共用的站点会画成橙色方块(与普通站点同一个尺寸)。 融合的判定是每帧按当前缩放重算的:只有两个标记在屏幕上真的重叠时才并成一个, 拉近看就自然分开——因为「重叠」是屏幕上的事,不是地图上的事。 如果你觉得该融合却没融合,把地图缩小一点;不该融合却融合了,拉近一点。

语音与预计时间

语音为什么把英文数字读成中文?

问道调用的是 Minecraft 原版 TTS 引擎,那个引擎只支持 say 与 clear,没有选择音色的接口,最终用的是 Windows 默认语音。 所以系统默认语音是中文时,英文播报里的数字与单位会按中文读(例如 “49 m” 读成「四十九米」)。 解决办法在系统层面:设置 → 时间和语言 → 语音 → 换一个英文默认语音。 副作用是对称的——换成英文语音后,中文播报也会读得别扭。这个问题在模组内部无解。

预计时间为什么和我实际走得不一样?

ETA 用的是一张「交通方式 + 道路等级」的速度表,不是一个单一速度:

等级 估算速度
冰道 40 格/秒
公路 9 格/秒
铁路 / 水路 8 格/秒
步行 4.0 ~ 5.6 格/秒

它不读取你此刻骑的马或船的实际速度,公共交通还要加等车时间 (transit_wait_seconds,默认每次登乘 60 秒,换乘再算一次)。 所以它是「按这张表算出来的时间」,不是对你这一趟的测量——表能不能代表你的世界,取决于你修的路像不像那张表。

日志与排查

为什么日志里没有本模组自己的测试输出了?

因为 0.2.1 把它们收进了一个默认关闭的开关。以前它们混在日志里: 铁路图层每秒一行、地图每秒一行、MTR 每次读入的统计、每次规划的路由算术、 一条线路被画成直线段的几何报告……全是关于「模组自己怎么在跑」的测量,而不是关于玩家遇到了什么。 这种行值得排查时打开,不值得开一整个会话。

于是按同一把尺子处理:没人会再看的直接删掉(Xaero 地图投影的 P0 探针 RoadDebug 与打开它的系统属性 -Dhowtogo.debug),还有复用价值的收进 debug_log。 想看到它们,就在 config/howtogo-client.toml 里把 debug_log 改成 true (模组配置界面里也能改),改完即时生效,不用重开游戏;关掉时连计数都不做。

警告与错误,以及一次性的事件行不受影响:出问题一定要能看到, 而加载 / 保存 / 切换出行方式 / 到达 / 偏航重新规划这些各是一次会话的记录,每一条都能对上玩家看到的一件事。 完整的开关说明见 配置与数据文件。

地图存档与数据目录

地图存档能导出给别人吗?

能。0.2.2 起 /howtogo data 会打开「地图存档」界面:一个按钮把当前世界的道路、地点、 铁路名称、公共交通线路与附属数据打成一个 .zip 放进 config/howtogo/exports/, 另一个按钮把别人的 .zip 导入回来。指令也行:/howtogo export 直接导出, /howtogo import [压缩包] 读指定文件,压缩包还能直接拖进界面。

导入时不用改目录名:压缩包的名字和内部目录层级都会被忽略,.world 记录改写成当前世界, 数据直接写进当前世界的目录——所以收到的包,打开自己那个世界导入就行。 覆盖前会警告:写进哪个世界、来源与时间、文件数、旧数据会先备份;确认后先备份到 config/howtogo/backups/,再整目录替换。注意是替换、不合并: 包里没有的维度文件会被删掉。备份文件名带 -backup,在「可导入的压缩包」列表里单独标黄, 再导入它一次就回到导入之前。

只接受认识的文件:只读 .json;__MACOSX/、.DS_Store、.world、 *.part、*.corrupt 跳过;带 .. 或绝对路径的条目不跟随; 文件数与解压总大小有上限;没有任何可读数据的包会被拒绝,当前地图不动。 列表里的来源分三种:导入文件夹、我的导出、备份。自检里也多了一项「地图存档压缩包」(真的导出、导入、逐字节核对)。 完整说明见 迁移地图数据。

升级到 0.2.2 后,存档目录自己改名了?

是的,这是 0.2.2 的破坏性变更:中文存档的数据目录改用拼音命名, sp_新世界 从 sp____ 变成 sp_xin_shi_jie。 第一次打开某个世界时,问道会把旧目录整目录改名过去,文件跟着走, 升级不用做任何事;如果目标名字已经被别的世界占用、或改名失败,就继续用旧目录, 一条路都不会丢。

风险在降级:用 0.2.2 存过档再退回 0.2.1,旧版本按老规则(中文全是下划线)去找目录, 找不到拼音名,那个世界的路网看起来就是空的——文件还在,只是没人读。 所以别随便降级;确实要退,先在 0.2.2 里导出压缩包备份,再按 迁移地图数据 把 JSON 放到旧规则会读的目录里。

服务器与联机

能装在服务器上吗?

不需要,也不建议。问道是纯客户端模组(dist = CLIENT),服务端没有对应逻辑, 装上去也不会多出任何功能。它读取 Xaero 的世界地图来渲染、把数据存在客户端, 与服务器之间没有任何自定义通信,所以你在任何服务器里都能直接用它。

由此带来的一条推论:换一台电脑、换一个客户端实例,路网不会跟着走—— 数据在你的 config/howtogo/ 里,要带走就复制这个目录。

改了存档名、服务器地址或换了电脑,路去哪了?

数据没有丢,只是没有跟着名字走:问道按「世界名 / 服务器地址」决定读哪个目录, 改 saves/ 里的文件夹名不算改世界名,但改世界名、换服务器地址或换游戏实例以后, 它会去新目录找,于是看到一张空地图。旧目录还留在 config/howtogo/ 里, 按 迁移地图数据 把它复制到新目录即可。 另外,删掉模组 jar 不会删掉这些文件。

已知限制清单

限制 说明
语音音色由操作系统决定 原版 TTS 没有选音色的接口,用的是 Windows 默认语音,中英混读无法避免。
ETA 未接入实际载具 按「交通方式 + 道路等级」的速度表估算,不读你骑的马、开的船的实际速度。
驾车只走高速与公路 这两个等级在路网里互不连通时,驾车会如实报「没有路线」,不会退而走小路。
离路太远会报无解 步行越野上限 walk_offroad_blocks(默认 32 格,范围 0~4096); 公共交通只保留站台到轨道的接驳(station_snap_blocks,默认 32 格); 驾车不再越野,只允许停在路面上。超过就报「没有路线」,不画直线。
MTR 的数据范围取决于玩法 自己开图会读整张铁路;客户端与服务器都装了 MTR Map Overlay 时也能拿到整张快照。 只有联机在别人的服务器、两边都没装它时,从没靠近过的车站与线路才确实读不到 (读到过的会被记住)。
模组自己的诊断默认不写日志 铁路图层、地图耗时、MTR 读入统计、路由算术等由 debug_log 控制,默认关; 警告、错误与一次性事件行一直写。
MTR 与机械动力的线路 / 轨道只读 几何与站位属于那个模组,问道不改它们。想改成自己的,用线路配置界面的「复制为我的」。
MTR 里没有对应等级的类型会被忽略 列车与缆车算铁路、船算水路;飞机之类不会被硬套成铁路,而是直接不处理。
小地图路标点数据源需要 Xaero's Minimap 没装时这个数据源为空,其余功能一切正常。
时间未本地化 距离已本地化成「米 / 千米」,时间仍是 44s、1h 5m 这种拉丁写法。
大规模路网的性能尚未专门验证 目前对道路等级的查找按方块位置做了缓存,但上千条路的路网没有专门测过。

这份清单是「已知」,不是「无解」:其中每一条背后都有一个具体的原因, 大多数能在配置或路网本身里绕开。 真遇到清单之外的行为,先在配置里把 debug_log 打开(诊断默认不写), 再把日志里带 [HowToGo] 前缀的那几行一起报上来最有帮助—— 警告与错误不用打开就在。