
BetterMapFix
[AI-generated] Patch for BetterMap: pins the Mistlands vegvisir stones BetterMap still misses, adds the three Hildir dungeon entrances, and renames map pin labels to Chinese. Client-only. Read the notice first.BetterMapFix
⚠️ APPLICABILITY NOTICE — please read this before installing.
This patch was written for my own, heavily modded setup (30+ mods enabled in an r2modman profile — BepInEx 5.4.2350 / Valheim 1.0.15). What it adds may not be something you want.
This is not a bug.
xtavim-BetterMapis not defective — it behaves exactly as it was designed to. What this patch adds are cases the original mod deliberately leaves out (see the table below), plus a rename of pin labels that the original has no setting for. The original mod's author bears no blame — this patch has no relationship with them and was written without their consent or review.
- If you are not seeing exactly this symptom, please don't install this — it may do nothing for you.
- This patch may not apply to your setup at all — with a different mod list the symptom may never appear.
- Even with the same symptom, the root cause may be different — this is only a workaround derived from what I found on my machine.
- If you don't want these extra pins, just don't install it — this is a preference, not a right/wrong question.
- If you think the original mod misbehaves, please report it to its author first.
⚠️ 适用性声明 —— 请先读这一段,再决定装不装。
本补丁是在我自己那套环境里做出来的:r2modman 的 profile 里同时装着 30+ 个模组 (BepInEx 5.4.2350 / 游戏 1.0.15)。
这不是 bug。
xtavim-BetterMap本身没有问题,它完全按自身设计正常工作 —— 本补丁补的是它有意不做的那些情况(见下面的对照表),以及一个它本来就没有开关可调的 「图钉名中文化」。原模组作者不应被追责:本补丁与他没有任何关系, 未经其同意、也未经其审查。
- 如果你没有遇到完全相同的症状,请不要安装本补丁 —— 它可能什么都不做;
- 本补丁可能不适用于你的环境:换一套模组组合,症状也许根本不会出现;
- 就算症状一样,成因也可能不同 —— 本补丁只是我按本机情况查出来的绕行方案;
- 如果你不需要这些额外的图钉,那根本不用装 —— 这是一个取舍,不是「谁对谁错」;
- 如果你觉得原模组有问题,请先向原模组作者反馈。这只是我个人“能跑就行”的绕行方案, 不保证适用于任何人。
给 BetterMap 打的客户端补丁 —— 做三件事:
- 迷雾之地的女王指引石(Vegvisir)不会被标记 —— 上游 1.1.0 的
Vegvisirs规则仍然只有 7 个群系,没有迷雾之地。 - 希尔迪(Hildir)三个任务地牢没有条目 —— 上游有意不做(它认为原版游戏自己会在这些位置放图标), 本补丁补上,三条默认全关,想用的人自己开。
- 图钉名中文化(洞穴、要塞、祭坛那类地点图钉)—— 上游没有任何本地化开关。
⚠️ 本模组由 AI 生成(AI-generated)。
依赖:denikson-BepInExPack_Valheim-5.4.2350 + xtavim-BetterMap-1.1.0。
🔻 1.1.13 剔除了三条冗余注入(上游自己已经做了)
上游 BetterMap 连续几个版本把自己缺的东西补上了,本补丁同步收缩。 被判为冗余而删除的三条,理由都经过逐条核对(源码 + 真机日志):
| 被删的注入 | 为什么删 | 依据 |
|---|---|---|
Frost Caves(Mountain / MountainCave02) |
上游 1.0.4 起自己就有同名同群系的规则,注入必然被判重跳过 —— 纯死代码 | 真机日志一直打「规则 [Mountain] Frost Caves 已存在(原模组自己提供…),跳过。」 |
Soft Tissue(Mistlands / giant_brain) |
上游 1.0.6 新增 Giant Skulls(盯 Mistlands_Giant1,同为 Ore 分类、默认开),描述写明就是「黑大理石 + 里面的软组织」⇒ 功能完全重叠 |
上游 PINS.md:「Mistlands_Giant1 is the giant skeleton, skull and brain included. … It is pinned as a place because those pieces were never captured by name.」 |
Half Burried Crypt(BlackForest / HalfBurried_ForestCrypt) |
上游没有这条规则,但游戏地点表里它的 m_enable = False ⇒ 原版永远不会放置它,默认关 + 永不落钉 = 死配置 |
2026-09-18 用本补丁的 Dump Location Names 实测 |
重要:
Frost Caves的映射(Frost Caves=冰霜洞穴)仍然保留 —— 上游那条规则叫同一个名字,图钉名仍会落到它上面。 「删注入」≠「删映射」:映射是按图钉名生效的,与规则是谁注入的无关。另外:想要「巨骨架/软组织」的图钉,保持上游
[Auto Pins - Mistlands] Giant Skulls = true(默认开)即可。
上游已有的开关 —— 本补丁配套建议关掉一个
下面这条属于上游自己的行为,本补丁不去改它、也不去删图钉,
而是在上游自己的 cfg(BepInEx/config/xtav1m.BetterMap.cfg)里关掉:
| cfg 键 | 建议 | 原因 |
|---|---|---|
[Auto Pins - Mistlands] Giant Remains |
false |
它盯的是骨与盔甲武器(giant_ribs / giant_helmet1-2 / giant_sword1-2),会把上古之剑、上古护甲、肋骨全钉出来。不要这些就关掉它 |
[Auto Pins - Mistlands] Entrance to the Queen |
上游 1.0.6 起默认就是 false,无需手动改 |
女王洞穴入口 —— 按游戏流程它该由女王指引石标记,不该再额外出一枚入口图钉 |
关掉之后:上游不再为它们落新图钉;地图上已存在的那几枚要你自己右键删(本补丁不代为删除)。
装不装本补丁都能这么关 —— 这跟补丁无关,是上游自己的配置。
与上游的边界(2026-09-24 对 BetterMap 1.1.0 重新核对)
上游在这些版本里陆续把自己缺的补齐了,本补丁随之收缩:
| 功能 | 上游现状(1.1.0) | 本补丁 |
|---|---|---|
| Boss 指引石落钉机制 | ✅ 1.0.4 已修(Rule.Component = typeof(Vegvisir) + 挂 Location 生成事件扫内部组件) |
迷雾之地那一段交给上游;自己的扫描器留作兜底 |
| 迷雾之地的女王指引石 | ❌ 仍然没有 —— Vegvisirs 规则只有 Meadows / BlackForest / Swamp / Mountain / Plains / AshLands / DeepNorth |
✅ 补上 [Mistlands] Vegvisirs |
女王洞穴入口(Entrance to the Queen) |
✅ 有,且 1.0.6 起默认关(它的描述写着「use a vegvisir and the game pins it for you」) | 无需处理(上游已按同样思路关掉) |
冰霜洞穴 Frost Caves |
✅ 1.0.4 已有 | ❌ 1.1.13 起不再注入(纯死代码) |
| 腐疫矿区 / 腐朽之穴 | ✅ 1.0.5 已有(Infested Mines / Putrid Holes) |
❌ 更早(1.1.3)已不再注入;映射保留(Infested Mines 无 NameToken,图钉名是英文) |
| 软组织 / 巨骨架 | ✅ 1.0.6 新增 Giant Skulls(Mistlands_Giant1,Ore,默认开,描述含 "soft tissue from the brain inside") |
❌ 1.1.13 起不再注入(同分类同位置,功能重叠) |
半埋墓穴 Half Burried Crypt |
❌ 没有(且原版 m_enable=False,永不放置) |
❌ 1.1.13 起不再注入 |
| 希尔迪三个地牢 | ❌ 有意不做 —— PINS.md:「Anything vanilla already pins is out of scope … traders, Hildir's camps, the bog witch…」 |
✅ 补上(默认全关) |
| 图钉名中文化 | ❌ 没有(PinNames.For 三分支里没有任何本地化调用) |
✅ 本补丁的主要价值 |
所以:只装 BetterMap 1.1.0 而不装本补丁,迷雾之地女王指引石依旧不会出现在地图上, 希尔迪地牢与图钉中文名也仍然缺。
⚠️ 顺带一提:1.0.6 的 changelog 写着 "Entrance to the Queen is off by default. A vegvisir already pins it." —— 那里的 "a vegvisir" 指的是原版游戏的指引石机制(用指引石后地图上出现 Boss 位置图标), 不是 BetterMap 的
Vegvisirs规则。别把这两件事混起来。
⚠️ 一个容易看错的陷阱:Dvergr Town 不是腐疫矿区
上游规则表里有一条叫 Dvergr Town、描述写着 "The dvergr settlements out on the ash sea." 的规则,
光看名字很像"矮人要塞/矿区"。它实际是:
Prefabs = ['CharredTowerRuins1_dvergr'] ← 灰烬之海的矮人据点
Biome = AshLands ← 灰烬之地,不是迷雾之地
DefaultOn = false ← 默认还是关的
BetterMap 落钉要过群系过滤(Heightmap.FindBiome(位置) == 规则.Biome),
所以它永远命中不了迷雾之地的 Mistlands_DvergrTownEntrance1/2。
这就是「规则名看着像、群系一票否决」的静默失效形态 —— 核对覆盖率时必须逐条比 prefab 名 + 群系,
不能看规则名。
为什么指引石标记不了(根因)
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.
上游 1.0.4 的修法(与本补丁当初的诊断完全一致):规则改填新字段 Component = typeof(Vegvisir),
新增 AutoPins.Spawned(LocationProxy) / Inside(...),挂在 Location 生成事件上扫内部组件 ——
比本补丁「按自动钉半径扫玩家附近」更彻底(Location 一生成就能标记,不受半径限制)。
但上游只给 7 个群系加了 Vegvisirs 规则,没有迷雾之地,所以女王指引石仍然要靠本补丁。
这个补丁怎么做(尽量走 BetterMap 自己的路)
| 功能 | 做法 |
|---|---|
| 希尔迪地牢补全 | 在 Plugin.BindPinRules 跑之前,往 PinRules.All 里补三条规则。剩下的 BetterMap 自己全包 —— 在它自己的 cfg 里生成开关(分区 Auto Pins - <群系>、注释)、并进 _byLocation 地点表、进图例、按 Merge Distance 去重、"删掉的钉不会再出现"。名字与群系跟上游已有的重了会自动跳过,不会出双份;AddRule 还会再比一次 prefab 集合,上游改名也认得出。 |
| 指引石 | 把迷雾之地那条规则填成 Component=typeof(Vegvisir),交给上游自己的机制;本补丁的扫描器保留作兜底(上游落过钉的位置会被去重记录挡住,不会双钉)。上游若没有该字段(1.0.2/1.0.3),退回本补丁自己扫。 |
补的规则(开关出现在 BetterMap 自己的 cfg 里,三条都是默认关):
| 规则名 | 分区 | 位置名(ZoneLocation.m_prefabName) |
默认 | 中文图钉名 |
|---|---|---|---|---|
Hildir Cave |
Auto Pins - Mountain |
Hildir_cave |
关 | 希尔迪洞穴 |
Hildir Crypt |
Auto Pins - BlackForest |
Hildir_crypt |
关 | 希尔迪墓穴 |
Hildir Fortress |
Auto Pins - Plains |
Hildir_plainsfortress |
关 | 希尔迪平原要塞 |
Vegvisirs |
Auto Pins - Mistlands |
组件通道 Vegvisir(1.0.4+)/ Vegvisir_SeekerQueen(旧版) |
开 | 沿用游戏本地化 |
⚠️ 规则名里不能有撇号 —— 上游直接把它当 cfg 键用,而 BepInEx 禁止
= \n \t \ " ' [ ]⇒ 是Hildir Cave而不是Hildir's Cave(写错了会让上游Bind抛异常、整个配置挂掉)。
位置名不是猜的:游戏资产表 SoftRef/manifest 里
Assets/world/Locations/.../Hildir_cave.prefab 等。
名字如果写错,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 |
开 | 指引石补标记(1.0.4+ 上相当于兜底) |
3 - Caves / Inject Cave Rules |
开 | 注入上面那三条希尔迪规则(它们本身默认关) |
4 - Labels / Log Unknown Pin Names |
开 | 诊断:把映射表没命中、且像英文的图钉名打进日志(去重,最多 60 个)。看到不认识的英文名就加进 Name Map |
4 - Labels / Chinese Labels |
开 | 图钉名中文化 |
4 - Labels / Name Map |
内置表 | 内置表已覆盖 BetterMap 全部规则名 + 裸英文 NameToken 变体,正常不用动。写 英文名=你的译名 可覆盖;写 英文名=(值留空)= 删掉这一条 |
4 - Labels / Merge Default Map |
开 | 把内置默认译名表合并进上面那张表(你的条目优先)。见下节 |
4 - Labels / Rename Existing Pins |
开 | 连已放在地图上的旧图钉一起改名 |
9 - Debug / Dump Location Names |
关 | 世界加载后把游戏的地点表整表打进日志,用来核对位置名 |
9 - Debug / Dump ZNet Names |
giant |
诊断:把 ZNetScene 里名字含该关键词的预制体 / 世界里活着的实例打进日志。用来确认"规则里写的预制体名到底注册没有" |
9 - Debug / Verbose Pin Log |
开 | 每落一个指引石图钉打一行日志 |
为什么需要 Merge Default Map
BepInEx 的配置有个特性:cfg 文件里已经存在某个键时,它不会用新的默认值覆盖文件里的旧值。
于是本补丁每次升级新增的内置译名,对"cfg 里早就写过旧表"的老用户永远不会生效 ——
症状是「新补的图钉标出来了,但名字还是英文」。补丁 1.1.0 实际踩到了这个坑:
新增 Infested Mines=腐疫矿区 之后,腐疫矿区图钉能标出来,名字却仍是 Infested Mines。
所以现在会把内置表与你的表做并集(内置先铺、你的覆盖):
| 你想做的事 | 怎么做 |
|---|---|
| 什么都不管,希望自动获得新译名 | 保持 Merge Default Map = 开(默认) |
| 改某条的译名 | 在 Name Map 里写 英文名=你的译名(你的优先) |
| 删掉某条内置译名 | 在 Name Map 里写 英文名=(值留空) |
| 完全自己掌控,不要任何内置译名 | 关掉 Merge Default Map |
图钉中文化怎么实现的(只动标签这一层)
原模组落钉时用 PinNames.For(Rule, GameObject) 算图钉名,三分支:
① rule.NameToken 非空 → 返回 NameToken(若以 `$` 开头,游戏自己翻成中文)
② 否则 PinNames.For(prefab) → Piece.m_name / Pickable 掉落物名 / MineRock 掉落物名 …(多为 `$` 键)
③ 都拿不到 → 兜底返回 rule.Name(**英文规则名**)
而 AutoPins.Place 里没有任何本地化调用 ⇒ 落到 ③ 的图钉就是英文。
会落到 ③ 的两类:全部地点类规则(落钉时 go 传 null)、以及没有 Piece / Pickable / MineRock
组件的预制体(实测 Leviathans 就是这种)。
本补丁只给这个函数的返回值做精确整串替换:
- 不改
rule.Name—— 那是原模组 cfg 的键名,改了会把你的配置项也改名; - 不动规则表、图标、图例、去重记录;
- 表里没有的名字原样放行,所以只影响你想翻的那几个。
译名优先取游戏自己的本地化表,与你在游戏里看到的名词一致;游戏里没有的才自拟(
Sulfur Arches / Frozen Trolls / Ash Pots / Unstable Lava Rock)。
Leviathans 现为「甲壳素」(按需求定的译名)。
⚠️ 有一类图钉名不是规则名,而是规则的
NameToken(PinNames.For的第一分支): 若NameToken是$开头的本地化键(如$piece_vegvisir),游戏自己会翻,不用管; 但若它是裸英文,就原样显示。上游有三条这样的规则 ——Ash Pots→Ash Pot、Greydwarf Nests→Greydwarf Nest、Leviathans→Leviathan(规则名复数、钉名单数)⇒ 只写规则名(复数)永远命不中,单数写法也必须收进表里。同理,上游 1.0.6 新增的
Giant Skulls没有NameToken且是地点类 ⇒ 图钉名必然是英文, 所以内置表里有Giant Skulls=巨人头骨(1.1.13 补)。
⚠️ 替换挂在三个地方:
PinNames.For(规则路径)+Minimap.AddPin(兜底)+Minimap.Update(旧钉改名)。 全量反汇编 BetterMap 1.0.4 发现Minimap.AddPin有 6 个调用方 (AutoPins.Place/CreatureTracker.Add/NamedPins.Retag/DeathMarkers.Rebuild/VehicleTracker.Reconcile/AutoPins.Portal), 而只有AutoPins.Place走PinNames.For—— 生物、传送门、死亡标记这些路径各自算名字, 只补前者会漏(1.1.1 就漏了Leviathans)。在AddPin上兜一层后与走哪条路无关。
Name Map 里键名写错只会静默不生效,所以交付前有一条机器校验(拿 BetterMap.dll 的字符串堆逐个核)。
旧图钉:名字是落钉那一刻写进地图数据的,光改上面那个函数对它们无效, 因此另有一趟 2 秒一次的低频重命名,只动名字精确命中映射表的图钉,直接改显示文本(不重建 UI)。
指引石仍然听 BetterMap 各群系里的 Vegvisirs 开关 —— 本补丁不改它。
怎么确认它在干活
日志里出现这些就说明工作正常:
[Info : BetterMapFix] BetterMapFix 1.1.13 已加载:洞穴规则注入=True,指引石扫描=True,中文图钉名=True(接口自检通过)。
[Info : BetterMapFix] 检测到 BetterMap 支持 Rule.Component(1.0.4+):是 —— 迷雾之地 Vegvisirs 交给它自己的「Location 内部组件」通道,本补丁扫描仅兜底。
[Info : BetterMapFix] 中文名映射 = 内置 N 条 ∪ 用户表(覆盖 33 / 用户新增 0 / 显式删除 0)→ 生效 N 条
[Info : BetterMapFix] +规则 [Mountain] Hildir Cave → Hildir_cave(默认 关,地点类)
[Info : BetterMapFix] +规则 [BlackForest] Hildir Crypt → Hildir_crypt(默认 关,地点类)
[Info : BetterMapFix] +规则 [Plains] Hildir Fortress → Hildir_plainsfortress(默认 关,地点类)
[Info : BetterMapFix] +规则 [Mistlands] Vegvisirs → 组件 Vegvisir(默认 开,组件类)
[Info : BetterMapFix] 规则注入完成(洞穴 已开,含迷雾之地 Vegvisirs(走上游 Component 通道)),共 4 条。
[Info : BetterMapFix] 已有图钉改中文名 1 个(累计 1 个)。
[Info : BetterMapFix] 指引石已标记 [Mountain] 位置 1234.5,-678.9(距玩家 42.3 m)
[Info : BetterMapFix] 本轮扫到附近指引石 2 块 → 新落钉 1,跳过 1(已记过账 / 该段开关关着)。
要盯的三点:
规则注入完成 …共 4 条—— 1.1.13 起就该是 4(3 条 Hildir + 1 条迷雾之地 Vegvisirs)。 出现「Frost Caves已存在,跳过」说明补丁版本旧了(那是 1.1.12 及更早会打的)。- 「中文名映射」那行的生效条数应当 ≥ 内置条数;明显少于 ⇒
Merge Default Map被关了。 - 「本轮扫到附近指引石」这行只在真的落了钉时才打(1.1.13 起)。 以前它每轮扫描都打一次,会把日志刷爆;现在"扫到但没落钉"只写 Debug 级(默认不落盘)。
兼容性
- 面向 BetterMap 1.0.2 起的所有版本(
xtav1m.BetterMap)编写,按版本自动选择通道: 有Rule.Component(1.0.4+)就走上游的组件机制,没有就退回本补丁自己扫描。 已在 1.1.0 上逐项核对接口自检(6 个类型 + 12 个成员 + 3 个字段)全部通过。 - 所有内部调用都走反射并做存在性自检;
Rule.Component与Plugin.autoPinRadius都是可选字段, 缺了不会让自检失败(否则旧版上会把整个补丁停用)。 BetterMap 换版本时本补丁只会打印一条"接口自检不通过"并停用,不会拖垮游戏加载。 - 纯客户端、不声明 NetworkCompatibility(NotEnforced)⇒ 主机不装也能用、不挡联机。
- 只读场景对象与本地地图数据,不改任何网络权威数据。
卸载
删掉 BepInEx/plugins/<这个包>/BetterMapFix.dll 即可。
留在 BetterMap cfg 里的那三个键(Hildir Cave / Hildir Crypt / Hildir Fortress)删不删都行,
删掉下次启动会按默认值重建。
本补丁自己的 cfg 里,旧版遗留的
FixCraftingFromStorage之类不存在; 但 1.1.12 及更早写过的Name Map里可能还留着Soft Tissue=软组织/Half Burried Crypt=半埋墓穴两条 —— 1.1.13 起它们不会再命中任何图钉(无害),想清理手动删掉即可。