
BetterMapFix
[AI-generated] Patch for BetterMap: pins boss vegvisir stones (never worked - BetterMap only scans networked ZDOs, vegvisirs sit inside Location prefabs), adds missing dungeon entrances like frost caves, and renames pin labels to Chinese. Client-only.BetterMapFix
给 BetterMap 打的客户端补丁 —— 修两件事:
- Boss 指引石(Vegvisir)从来不会被标记。
- 洞穴条目不全:山脉段压根没有冰霜洞穴,黑森林还漏了半埋墓穴与希尔迪的两个地牢。
⚠️ 本模组由 AI 生成(AI-generated)。
为什么指引石标记不了(根因)
BetterMap 的自动标记(AutoPins.Sweep)只遍历 ZNetScene.instance.m_instances
—— 那是一张 Dictionary<ZDO, ZNetView>,只包含有网络对象的东西。
而指引石是烘焙进 Location 预制体里的子物体,没有自己的 ZDO;
它们也不在 ZNetScene 的名字表里(GetPrefab 实测返回 null),于是
ZNetScene.IsPrefabZDOValid 永远过不了、ZDO 永远不存在。
BetterMap 自己在日志里就把结论写出来了:
[Warning: BetterMap] AutoPins: "Vegvisirs" watches a prefab named Vegvisir_DragonQueen,
which this game has none of. Nothing will ever be pinned for it.
7 种 Boss 指引石全都是这个下场(不是龙母特有),cfg 里也没有自定义名字的选项。
这个补丁怎么做(尽量走 BetterMap 自己的路)
| 功能 | 做法 |
|---|---|
| 洞穴补全 | 在 Plugin.BindPinRules 跑之前,往 PinRules.All 里补几条规则。剩下的 BetterMap 自己全包 —— 在它自己的 cfg 里生成开关(分区 Auto Pins - <群系>、中文注释)、并进 _byLocation 地点表、进图例、按 Merge Distance 去重、"删掉的钉不会再出现"。 |
| 指引石 | 挂在它自己的 AutoPins.Sweep 之后:沿用它的扫描节奏与探索半径,找玩家附近的 Vegvisir 组件,再调它自己的 AutoPins.Place(rule, null, pos) 落钉。图钉类别 / 图标 / 标签($piece_vegvisir)/ 记账全是它那一套。 |
补的洞穴规则(开关出现在 BetterMap 自己的 cfg 里):
| 规则名 | 分区 | 位置名(ZoneLocation.m_prefabName) |
默认 |
|---|---|---|---|
Frost Caves |
Auto Pins - Mountain |
MountainCave02(实测 m_enable=True) |
开 |
Half Burried Crypt |
Auto Pins - BlackForest |
HalfBurried_ForestCrypt(实测 m_enable=**False**,原版不放置) |
关 |
Hildir Cave |
Auto Pins - Mountain |
Hildir_cave |
关 |
Hildir Crypt |
Auto Pins - BlackForest |
Hildir_crypt |
关 |
Vegvisirs |
Auto Pins - Mistlands |
Vegvisir_SeekerQueen |
开 |
位置名不是猜的:Assets/world/Locations/Mountains/MountainCave02.prefab 与 BetterMap
已经支持的 TrollCave02 / BearCave / SunkenCrypt4 / Crypt2 同表(SoftRef/manifest)
同命名法。名字如果写错,BetterMap 自己的自检会打
"watches a place named X, which this game has none of" —— 日志里没有这条就说明名字对。
本补丁自己的配置(BepInEx/config/bettermapfix.client.only.cfg)
| 键 | 默认 | 说明 |
|---|---|---|
1 - General / Enabled |
开 | 总开关 |
2 - Vegvisirs / Scan Vegvisirs |
开 | 指引石补标记 |
3 - Caves / Inject Cave Rules |
开 | 注入上面那几条洞穴规则 |
4 - Labels / Chinese Labels |
开 | 图钉名中文化 |
4 - Labels / Name Map |
33 条 | 英文=中文,逗号分隔;可自行增删 |
4 - Labels / Rename Existing Pins |
开 | 连已放在地图上的旧图钉一起改名 |
9 - Debug / Dump Location Names |
关 | 世界加载后把游戏的地点表整表打进日志,用来核对位置名 |
9 - Debug / Verbose Pin Log |
开 | 每落一个指引石图钉打一行日志 |
图钉中文化怎么实现的(只动标签这一层)
原模组落钉时用 PinNames.For(Rule, GameObject) 算图钉名;地点类规则的 NameToken 是空的、
go 传 null ⇒ 图钉名就等于英文规则名(这就是 Troll Caves / Bear Caves 的由来)。
本补丁只给这个函数的返回值做精确整串替换:
- 不改
rule.Name—— 那是原模组 cfg 的键名,改了会把你的配置项也改名; - 不动规则表、图标、图例、去重记录;
- 表里没有的名字原样放行,所以只影响你想翻的那几个。
默认翻译的是地点类图钉(洞穴 / 要塞 / 祭坛 / 遗迹,共 33 条)。
资源类(矿脉、浆果、蘑菇…)故意没放进来——想一起中文,把配置里注释给的那串粘到 Name Map 后面即可。
Name Map 里键名写错只会静默不生效,所以交付前有一条机器校验(拿 BetterMap.dll 的字符串堆逐个核)。
旧图钉:名字是落钉那一刻写进地图数据的,光改上面那个函数对它们无效, 因此另有一趟 2 秒一次的低频重命名,只动名字精确命中映射表的图钉,直接改显示文本(不重建 UI)。
指引石仍然听 BetterMap 各群系里的 Vegvisirs 开关 —— 本补丁不改它。
怎么确认它在干活
日志里出现这些就说明工作正常:
[Info : BetterMapFix] BetterMapFix 1.0.0 已加载:洞穴规则注入=True,指引石扫描=True(接口自检通过)。
[Info : BetterMapFix] +规则 [Mountain] Frost Caves → MountainCave02(默认 开)
[Info : BetterMapFix] 指引石已标记 [Mountain] 位置 1234.5,-678.9(距玩家 42.3 m)
[Info : BetterMapFix] 本轮扫到附近指引石 2 块 → 新落钉 1,跳过 1(已记过账 / 该段开关关着)。
已知的一条无害日志:BetterMap 会对 Vegvisir_SeekerQueen 打一条
"which this game has none of" 警告(因为我们把这条规则放进了它的规则表,而它的 ZDO 扫描永远够不着它)。
落钉由本补丁完成,忽略即可。
兼容性
- 面向 BetterMap 1.0.2(
xtav1m.BetterMap)编写。所有内部调用都走反射并做存在性自检, BetterMap 换版本时本补丁只会打印一条"接口自检不通过"并停用,不会拖垮游戏加载。 - 纯客户端、不声明 NetworkCompatibility(NotEnforced)⇒ 主机不装也能用、不挡联机。
- 只读场景对象与本地地图数据,不改任何网络权威数据。
卸载
删掉 BepInEx/plugins/<这个包>/BetterMapFix.dll 即可。
留在 BetterMap cfg 里的那几个键(Frost Caves 等)删不删都行,删掉下次启动会按默认值重建。

