Please disclose if any significant portion of your mod was created using AI tools by adding the 'AI Generated' category. Failing to do so may result in the mod being removed from Thunderstore.
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.
By s6652289
| Last updated | 2 months ago |
| Total downloads | 1414 |
| Total rating | 1 |
| Categories | Mods AI Generated |
| Dependency string | s6652289-BetterMapFix-1.1.13 |
| Dependants | 0 other packages depend on this package |
This mod requires the following mods to function
denikson-BepInExPack_Valheim
BepInEx pack for Valheim. Preconfigured with the correct entry point for mods and preferred defaults for the community.
Preferred version: 5.4.2350xtavim-BetterMap
Puts creatures, boats, carts and resources on your map. Pins what you find as you find it, keeps and clears your death markers, and names the traders. Everything can be turned on and off, biome by biome, and syncs with ServerSync.
Preferred version: 1.1.0README
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 起它们不会再命中任何图钉(无害),想清理手动删掉即可。